From 3a7112895e3a54af7ba0346fc3d0cb3f99262156 Mon Sep 17 00:00:00 2001 From: mlindfors Date: Wed, 5 Dec 2018 16:39:09 +0200 Subject: [PATCH] Fix Grid's frozen columns not being set (#10653) (#11346) 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 | 16 +++++- .../grid/GridFrozenColumnReset.java | 57 +++++++++++++++++++ .../grid/GridFrozenColumnResetTest.java | 26 +++++++++ 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 uitest/src/main/java/com/vaadin/tests/components/grid/GridFrozenColumnReset.java create mode 100644 uitest/src/test/java/com/vaadin/tests/components/grid/GridFrozenColumnResetTest.java diff --git a/server/src/main/java/com/vaadin/ui/Grid.java b/server/src/main/java/com/vaadin/ui/Grid.java index 2766f2cb88..7c3467eaa3 100644 --- a/server/src/main/java/com/vaadin/ui/Grid.java +++ b/server/src/main/java/com/vaadin/ui/Grid.java @@ -3082,7 +3082,21 @@ public class Grid extends AbstractListing 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 index 0000000000..fadc8967bd --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/grid/GridFrozenColumnReset.java @@ -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 grid; + + @Override + protected void setup(VaadinRequest request) { + grid = new Grid(); + grid.setSizeFull(); + init(); + getLayout().addComponent(grid); + + Button button = new Button("change frozen count"); + button.addClickListener(event -> { + reInit(); + }); + getLayout().addComponent(button); + } + + @Override + protected List createPersons() { + List 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 index 0000000000..82bcb90f56 --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/grid/GridFrozenColumnResetTest.java @@ -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()); + } + +} -- 2.39.5