]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix Grid's frozen columns not being set (#10653) (#11346)
authormlindfors <majuli@vaadin.com>
Wed, 5 Dec 2018 14:39:09 +0000 (16:39 +0200)
committerSun Zhe <31067185+ZheSun88@users.noreply.github.com>
Wed, 5 Dec 2018 14:39:09 +0000 (16:39 +0200)
In certain cases setting the frozen columns didn't produce the expected result in the client side widget state. This happened if the frozen columns value was set to be the same it was before removeAllColumns was called.

This fix removes the frozen column value from the diff state so that the value gets properly set in the client side.

Closes #10653

server/src/main/java/com/vaadin/ui/Grid.java
uitest/src/main/java/com/vaadin/tests/components/grid/GridFrozenColumnReset.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/grid/GridFrozenColumnResetTest.java [new file with mode: 0644]

index 2766f2cb88027a18fe1db8db746d0de4cca552b1..7c3467eaa3d79d0065d0f2a6d70243ac9a9ee426 100644 (file)
@@ -3082,7 +3082,21 @@ public class Grid<T> extends AbstractListing<T> implements HasComponents,
                     "count must be between -1 and the current number of columns ("
                             + columnSet.size() + "): " + numberOfColumns);
         }
-
+        int currentFrozenColumnState = getState(false).frozenColumnCount;
+        /*
+         * we remove the current value from the state so that setting frozen
+         * columns will always happen after this call. This is so that the value
+         * will be set also in the widget even if it happens to seem to be the
+         * same as this current value we're setting.
+         */
+        if (currentFrozenColumnState != numberOfColumns) {
+            final String diffStateKey = "frozenColumnCount";
+            UI ui = getUI();
+            if (ui != null) {
+                ui.getConnectorTracker().getDiffState(Grid.this)
+                        .remove(diffStateKey);
+            }
+        }
         getState().frozenColumnCount = numberOfColumns;
     }
 
diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridFrozenColumnReset.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridFrozenColumnReset.java
new file mode 100644 (file)
index 0000000..fadc896
--- /dev/null
@@ -0,0 +1,57 @@
+package com.vaadin.tests.components.grid;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.data.bean.Person;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.renderers.NumberRenderer;
+
+public class GridFrozenColumnReset extends SimpleGridUI {
+
+    private Grid<Person> grid;
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        grid = new Grid<Person>();
+        grid.setSizeFull();
+        init();
+        getLayout().addComponent(grid);
+
+        Button button = new Button("change frozen count");
+        button.addClickListener(event -> {
+            reInit();
+        });
+        getLayout().addComponent(button);
+    }
+
+    @Override
+    protected List<Person> createPersons() {
+        List<Person> persons = new ArrayList<>();
+        for (int i = 0; i < 10; ++i) {
+            Person person = new Person();
+            person.setFirstName("First " + i);
+            person.setLastName("Last" + i);
+            person.setAge(i);
+            persons.add(person);
+        }
+        return persons;
+    }
+
+    protected void init() {
+        grid.addColumn(Person::getFirstName);
+        grid.addColumn(Person::getLastName);
+        grid.addColumn(Person::getAge, new NumberRenderer());
+
+        grid.setItems(createPersons());
+        grid.setFrozenColumnCount(2);
+    }
+
+    protected void reInit() {
+        grid.removeAllColumns();
+        init();
+    }
+
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridFrozenColumnResetTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridFrozenColumnResetTest.java
new file mode 100644 (file)
index 0000000..82bcb90
--- /dev/null
@@ -0,0 +1,26 @@
+package com.vaadin.tests.components.grid;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class GridFrozenColumnResetTest extends MultiBrowserTest {
+
+    @Test
+    public void testFrozenColumnReset() {
+        openTestURL();
+        GridElement grid = $(GridElement.class).first();
+
+        assertTrue(grid.getCell(0, 1).isFrozen());
+
+        ButtonElement button = $(ButtonElement.class).first();
+        button.click();
+
+        assertTrue(grid.getCell(0, 1).isFrozen());
+    }
+
+}