aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnna Koskinen <Ansku@users.noreply.github.com>2021-10-14 08:20:07 +0300
committerGitHub <noreply@github.com>2021-10-14 08:20:07 +0300
commit4a824f48655ba7ebfe1dd78c89e1a7c1fbd1c183 (patch)
tree3f7a1035974f544e890281d7f0773b1bca0b3458
parent2cbaa342d34c0bee63a43ba51c21896e134dae87 (diff)
downloadvaadin-framework-4a824f48655ba7ebfe1dd78c89e1a7c1fbd1c183.tar.gz
vaadin-framework-4a824f48655ba7ebfe1dd78c89e1a7c1fbd1c183.zip
Fix Grid column reorder with partially hidden joined header cells. (#12429)
-rwxr-xr-xclient/src/main/java/com/vaadin/client/widgets/Grid.java15
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/grid/GridReorderMerged.java43
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/grid/GridReorderMergedTest.java44
3 files changed, 95 insertions, 7 deletions
diff --git a/client/src/main/java/com/vaadin/client/widgets/Grid.java b/client/src/main/java/com/vaadin/client/widgets/Grid.java
index 14bf795e2e..bb12a71c7c 100755
--- a/client/src/main/java/com/vaadin/client/widgets/Grid.java
+++ b/client/src/main/java/com/vaadin/client/widgets/Grid.java
@@ -175,7 +175,6 @@ import com.vaadin.client.widget.grid.sort.SortOrder;
import com.vaadin.client.widgets.Escalator.AbstractRowContainer;
import com.vaadin.client.widgets.Escalator.SubPartArguments;
import com.vaadin.client.widgets.Grid.Editor.State;
-import com.vaadin.client.widgets.Grid.StaticSection.StaticCell;
import com.vaadin.client.widgets.Grid.StaticSection.StaticRow;
import com.vaadin.shared.Range;
import com.vaadin.shared.Registration;
@@ -5123,8 +5122,11 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>,
@Override
public void onDrop() {
final int draggedColumnIndex = eventCell.getColumnIndex();
- final int colspan = header.getRow(eventCell.getRowIndex())
- .getCell(eventCell.getColumn()).getColspan();
+ final StaticRow<?> draggedCellRow = header
+ .getRow(eventCell.getRowIndex());
+ int colspan = draggedCellRow
+ .getSizeOfCellGroup(getColumn(draggedColumnIndex));
+ colspan = colspan == 0 ? 1 : colspan;
if (latestColumnDropIndex != draggedColumnIndex
&& latestColumnDropIndex != draggedColumnIndex + colspan) {
List<Column<?, T>> columns = getColumns();
@@ -5261,13 +5263,12 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>,
}
final boolean isDraggedCellRow = row.equals(draggedCellRow);
for (int cellColumnIndex = frozenColumns; cellColumnIndex < getColumnCount(); cellColumnIndex++) {
- StaticCell cell = row.getCell(getColumn(cellColumnIndex));
- int colspan = cell.getColspan();
+ int colspan = row
+ .getSizeOfCellGroup(getColumn(cellColumnIndex));
if (colspan <= 1) {
continue;
}
- final int cellColumnRightIndex = cellColumnIndex + row
- .getSizeOfCellGroup(getColumn(cellColumnIndex));
+ final int cellColumnRightIndex = cellColumnIndex + colspan;
final Range cellRange = Range.between(cellColumnIndex,
cellColumnRightIndex);
final boolean intersects = draggedCellRange
diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridReorderMerged.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridReorderMerged.java
new file mode 100644
index 0000000000..62ddef2c97
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/components/grid/GridReorderMerged.java
@@ -0,0 +1,43 @@
+package com.vaadin.tests.components.grid;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.Grid.Column;
+import com.vaadin.ui.components.grid.HeaderRow;
+
+public class GridReorderMerged extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ Grid<String> grid = new Grid<>();
+ List<String> items = new ArrayList<>();
+ HeaderRow headerRow = grid.prependHeaderRow();
+ for (int i = 1; i < 10; ++i) {
+ String propertyId = "" + i;
+ Column<String, ?> column = grid
+ .addColumn(item -> propertyId.equals(item) ? item : "")
+ .setId(propertyId).setCaption(propertyId);
+ column.setHidable(true);
+ if (i == 5) {
+ column.setHidden(true);
+ }
+ items.add(propertyId);
+ }
+ grid.setItems(items);
+ headerRow.join("1", "2", "3").setText("1");
+ headerRow.join("4", "5", "6").setText("2"); // middle column hidden
+ headerRow.join("7", "8", "9").setText("3");
+ grid.setColumnReorderingAllowed(true);
+ addComponent(grid);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Reordering columns should respect joined cells "
+ + "even when some columns are hidden.";
+ }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridReorderMergedTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridReorderMergedTest.java
new file mode 100644
index 0000000000..80be6353c2
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/components/grid/GridReorderMergedTest.java
@@ -0,0 +1,44 @@
+package com.vaadin.tests.components.grid;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.testbench.elements.GridElement.GridCellElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class GridReorderMergedTest extends MultiBrowserTest {
+
+ @Test
+ public void dragMerged() {
+ openTestURL();
+ GridElement grid = $(GridElement.class).first();
+ GridCellElement headerCell0_0 = grid.getHeaderCell(0, 0);
+ GridCellElement headerCell0_4 = grid.getHeaderCell(0, 4);
+ new Actions(driver).dragAndDrop(headerCell0_0, headerCell0_4).perform();
+
+ // ensure the first merged block got dragged over the entire second
+ // merged block
+ assertEquals("Unexpected column order,", "6",
+ grid.getHeaderCell(1, 1).getText());
+ }
+
+ @Test
+ public void dragMergedReverse() {
+ openTestURL();
+ GridElement grid = $(GridElement.class).first();
+ GridCellElement headerCell0_0 = grid.getHeaderCell(0, 0);
+ GridCellElement headerCell0_4 = grid.getHeaderCell(0, 4);
+ new Actions(driver).clickAndHold(headerCell0_4)
+ .moveByOffset(-headerCell0_0.getSize().getWidth(),
+ headerCell0_0.getSize().getHeight() / 2)
+ .release().perform();
+
+ // ensure the second merged block got dragged over the first merged
+ // block entirely
+ assertEquals("Unexpected column order,", "6",
+ grid.getHeaderCell(1, 1).getText());
+ }
+}