]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix Grid reordering when there are hidden columns
authorcuong-phan <39257573+cuong-phan@users.noreply.github.com>
Mon, 20 May 2019 12:00:38 +0000 (15:00 +0300)
committerZhe Sun <31067185+ZheSun88@users.noreply.github.com>
Wed, 22 May 2019 13:31:31 +0000 (16:31 +0300)
* Fix grid column reordering

Fix grid column reordering when there are hidden columns and footerRow.join

* Add test

client/src/main/java/com/vaadin/client/widgets/Grid.java
uitest/src/main/java/com/vaadin/tests/components/grid/GridReorderHiddenColumnsJoinedFooter.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/grid/GridReorderHiddenColumnsJoinedFooterTest.java [new file with mode: 0644]

index cb43bdd7d1992f42c898f11de53ce660b7c3e741..ae63749c5f2aa50e9dc43c43adf098186b9a3ca2 100755 (executable)
@@ -639,6 +639,16 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>,
                 return null;
             }
 
+            protected int getSizeOfCellGroup(Column<?, ?> column) {
+                for (Entry<CELLTYPE, Set<Column<?, ?>>> entry : cellGroups
+                        .entrySet()) {
+                    if (entry.getValue().contains(column)) {
+                        return entry.getValue().size();
+                    }
+                }
+                return 0;
+            }
+
             void calculateColspans() {
                 // Reset all cells
                 for (CELLTYPE cell : this.cells.values()) {
@@ -4697,7 +4707,8 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>,
                     if (colspan <= 1) {
                         continue;
                     }
-                    final int cellColumnRightIndex = cellColumnIndex + colspan;
+                    final int cellColumnRightIndex = cellColumnIndex + row
+                            .getSizeOfCellGroup(getColumn(cellColumnIndex));
                     final Range cellRange = Range.between(cellColumnIndex,
                             cellColumnRightIndex);
                     final boolean intersects = draggedCellRange
diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridReorderHiddenColumnsJoinedFooter.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridReorderHiddenColumnsJoinedFooter.java
new file mode 100644 (file)
index 0000000..5d3527e
--- /dev/null
@@ -0,0 +1,76 @@
+package com.vaadin.tests.components.grid;
+
+import com.vaadin.data.provider.DataProvider;
+import com.vaadin.data.provider.ListDataProvider;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.components.grid.FooterCell;
+import com.vaadin.ui.components.grid.FooterRow;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class GridReorderHiddenColumnsJoinedFooter extends AbstractTestUI {
+    @Override
+    protected void setup(VaadinRequest request) {
+        getLayout().setSpacing(true);
+
+        Grid<String> grid = createGrid();
+
+        addComponents(grid);
+    }
+
+    private Grid<String> createGrid() {
+        Grid<String> grid = new Grid<>();
+        grid.addColumn(t -> t + "1").setId("col1").setCaption("caption1")
+                .setHidable(true);
+        grid.addColumn(t -> t + "2").setId("col2").setCaption("caption2")
+                .setHidable(true);
+        grid.addColumn(t -> t + "3").setId("col3").setCaption("caption3")
+                .setHidable(true);
+        grid.addColumn(t -> t + "4").setId("col4").setCaption("caption4")
+                .setHidable(true);
+        grid.addColumn(t -> t + "5").setId("col5").setCaption("caption5")
+                .setHidable(true);
+        grid.addColumn(t -> t + "6").setId("col6").setCaption("caption6")
+                .setHidable(true);
+        grid.addColumn(t -> t + "7").setId("col7").setCaption("caption7")
+                .setHidable(true);
+        grid.addColumn(t -> t + "8").setId("col8").setCaption("caption8")
+                .setHidable(true);
+
+        grid.setColumnReorderingAllowed(true);
+        grid.setSizeFull();
+
+        // join FooterRow together
+        FooterRow footerRow = grid.appendFooterRow();
+        Grid.Column[] columns = grid.getColumns().toArray(new Grid.Column[0]);
+        FooterCell footerCell = footerRow.join(columns);
+        footerCell.setText("test");
+
+        // hide columns
+        grid.getColumn("col2").setHidden(true);
+        grid.getColumn("col4").setHidden(true);
+        grid.getColumn("col5").setHidden(true);
+        grid.getColumn("col6").setHidden(true);
+
+        List<String> items = new ArrayList<>();
+        items.add("content");
+        ListDataProvider<String> dataProvider = DataProvider
+                .ofCollection(items);
+        grid.setDataProvider(dataProvider);
+        return grid;
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 11478;
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "Column reordering with hidden columns and joined footer should not "
+                + "be blocked by hidden columns.";
+    }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridReorderHiddenColumnsJoinedFooterTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridReorderHiddenColumnsJoinedFooterTest.java
new file mode 100644 (file)
index 0000000..bae0808
--- /dev/null
@@ -0,0 +1,34 @@
+package com.vaadin.tests.components.grid;
+
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.interactions.Actions;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertThat;
+
+public class GridReorderHiddenColumnsJoinedFooterTest extends MultiBrowserTest {
+    @Test
+    public void test() {
+        openTestURL();
+
+        GridElement grid = $(GridElement.class).get(0);
+        GridElement.GridCellElement headerCell1 = grid
+                .getHeaderCellByCaption("caption1");
+        GridElement.GridCellElement headerCell8 = grid
+                .getHeaderCellByCaption("caption8");
+
+        assertThat(grid.getHeaderCell(0, 0), is(headerCell1));
+
+        new Actions(getDriver()).clickAndHold(headerCell1)
+                .moveToElement(headerCell8, 2, 0).release().perform();
+
+        waitForElementNotPresent(By.className("dragged-column-header"));
+
+        assertThat(grid.getHeaderCell(0, 0), not(is(headerCell1)));
+        assertThat(grid.getHeaderCell(0, 0).getText(), is("caption3"));
+    }
+}