diff options
author | Anna Koskinen <Ansku@users.noreply.github.com> | 2021-10-14 08:20:07 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-14 08:20:07 +0300 |
commit | 4a824f48655ba7ebfe1dd78c89e1a7c1fbd1c183 (patch) | |
tree | 3f7a1035974f544e890281d7f0773b1bca0b3458 | |
parent | 2cbaa342d34c0bee63a43ba51c21896e134dae87 (diff) | |
download | vaadin-framework-4a824f48655ba7ebfe1dd78c89e1a7c1fbd1c183.tar.gz vaadin-framework-4a824f48655ba7ebfe1dd78c89e1a7c1fbd1c183.zip |
Fix Grid column reorder with partially hidden joined header cells. (#12429)
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()); + } +} |