]> source.dussan.org Git - vaadin-framework.git/commitdiff
Apply offset to column index depending on presense of selection column (#11667)
authorTatu Lund <tatu@vaadin.com>
Tue, 30 Jul 2019 06:42:20 +0000 (09:42 +0300)
committerZhe Sun <31067185+ZheSun88@users.noreply.github.com>
Thu, 8 Aug 2019 07:16:07 +0000 (10:16 +0300)
* Apply offset to column index depending on presense of selection column

After testing this manually I noticed that offset correction needs to be negative

* Add the testing UI

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

index 4c88879ad10cc0a9246f102e9a074738e887b0e8..ec2e028000b756593d36fa3a2f630fd902244d88 100755 (executable)
@@ -7934,7 +7934,11 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>,
             if (!event.getCell().isHeader()) {
                 return;
             }
-            if (event.getCell().getColumnIndex() < getFrozenColumnCount()) {
+            int offset = 0; // apply offset depending on selection column, see #10546
+            if (getSelectionColumn().isPresent()) {
+                offset = -1;
+            }
+            if (event.getCell().getColumnIndex()+offset < getFrozenColumnCount()) {
                 return;
             }
 
diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridColumnFrozenColumn.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridColumnFrozenColumn.java
new file mode 100644 (file)
index 0000000..057fbaa
--- /dev/null
@@ -0,0 +1,67 @@
+package com.vaadin.tests.components.grid;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.ContentMode;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.VerticalLayout;
+
+public class GridColumnFrozenColumn extends AbstractTestUI {
+    @Override
+    protected void setup(VaadinRequest request) {
+        final VerticalLayout layout = new VerticalLayout();
+        layout.addComponent(new Label(
+                "Frozen columns can be reordered with unhidden columns with: "
+                        + com.vaadin.shared.Version.getFullVersion()));
+        Label issueLabel = new Label(
+                "Demonstrate problem in <a href=\"https://github.com/vaadin/framework/issues/10546\">grid column frozen column reorder issue with SelectionMode.MULTI</a>");
+        issueLabel.setContentMode(ContentMode.HTML);
+        layout.addComponent(issueLabel);
+
+        // Create new Grid
+        Grid<HashMap<String, String>> grid = new Grid<>(
+                "My test grid to reorder columns");
+
+        // Fill the grid with data to sort
+        List<HashMap<String, String>> rows = new ArrayList<>();
+        String FIRST = "Frozen Column (Should not be reordered)";
+        String LAST = "Last Name Column";
+
+        // Grid for Vaadin 8 without bean class from
+        // https://vaadin.com/forum/#!/thread/16038356/16816582
+        for (int i = 0; i < 20; i++) {
+            HashMap<String, String> fakeBean = new HashMap<>();
+            fakeBean.put(FIRST, "first" + i);
+            fakeBean.put(LAST, "last" + i);
+            rows.add(fakeBean);
+        }
+
+        grid.setItems(rows);
+
+        // Add the columns based on the first row
+        HashMap<String, String> s = rows.get(0);
+        for (Map.Entry<String, String> entry : s.entrySet()) {
+            grid.addColumn(h -> h.get(entry.getKey()))
+                    .setCaption(entry.getKey()).setId(entry.getKey());
+        }
+        grid.getColumn(LAST).setHidable(true);
+        grid.setSelectionMode(Grid.SelectionMode.MULTI);
+        // without the selector column the issue cannot be observed
+        // grid.setSelectionMode(SelectionMode.NONE);
+        grid.setFrozenColumnCount(1);
+        grid.setColumnReorderingAllowed(true);
+        grid.setSizeFull();
+
+        layout.addComponent(grid);
+        layout.setMargin(true);
+        layout.setSpacing(true);
+
+        addComponent(layout);
+    }
+}