diff options
author | duffrohde <rohde@duff.dk> | 2019-04-02 08:16:27 +0200 |
---|---|---|
committer | Olli Tietäväinen <ollit@vaadin.com> | 2019-04-02 09:16:27 +0300 |
commit | df19d2a4a5e5e44b0231fd4bc1119ad11f1c71ac (patch) | |
tree | d4be3ec448b07b35b30460fe3cb7a88e44f761fa | |
parent | a0de6289f8b6e4ef0d95658f7b6d758174025f36 (diff) | |
download | vaadin-framework-df19d2a4a5e5e44b0231fd4bc1119ad11f1c71ac.tar.gz vaadin-framework-df19d2a4a5e5e44b0231fd4bc1119ad11f1c71ac.zip |
Fixes a Grid issue that breaks sorting. (#10999)
* Fixes a Grid issue that breaks sorting.
When multi-select has been enabled and disabled a number of times, sorting on the first column in a Grid is broken.
Unregistering a click handler on the header solves the problem.
* Added a test checking that sorting of a grid column still works after having enabled and then disabled multi select mode.
The grid is configured with an extra header row containing a text box since it triggers an exception if the header click handler for the multi select column is not removed.
* Remove an unused import that was added by mistake
3 files changed, 37 insertions, 1 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 06565e13f2..7ef61eff5b 100755 --- a/client/src/main/java/com/vaadin/client/widgets/Grid.java +++ b/client/src/main/java/com/vaadin/client/widgets/Grid.java @@ -2937,6 +2937,7 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>, private CheckBox selectAllCheckBox; private boolean userSelectionAllowed = true; private boolean enabled = true; + private HandlerRegistration headerClickHandler; SelectionColumn(final Renderer<Boolean> selectColumnRenderer) { super(selectColumnRenderer); @@ -2990,7 +2991,7 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>, }); selectAllCheckBox.setValue(selected); - addHeaderClickHandler(new HeaderClickHandler() { + headerClickHandler = addHeaderClickHandler(new HeaderClickHandler() { @Override public void onClick(GridClickEvent event) { if (!userSelectionAllowed) { @@ -3146,6 +3147,13 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>, getEscalator().getBody().refreshRows(0, getEscalator().getBody().getRowCount()); } + + public void cleanup() { + if (headerClickHandler != null) { + headerClickHandler.removeHandler(); + headerClickHandler = null; + } + } } /** @@ -7927,6 +7935,10 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>, return; } + if (this.selectionColumn != null) { + selectionColumn.cleanup(); + } + if (this.selectColumnRenderer != null) { if (this.selectColumnRenderer instanceof ComplexRenderer) { // End of Life for the old selection column renderer. diff --git a/uitest/src/main/java/com/vaadin/tests/widgetset/client/grid/GridBasicClientFeaturesWidget.java b/uitest/src/main/java/com/vaadin/tests/widgetset/client/grid/GridBasicClientFeaturesWidget.java index cc8fa9e39f..ada9e66ef4 100644 --- a/uitest/src/main/java/com/vaadin/tests/widgetset/client/grid/GridBasicClientFeaturesWidget.java +++ b/uitest/src/main/java/com/vaadin/tests/widgetset/client/grid/GridBasicClientFeaturesWidget.java @@ -1138,6 +1138,13 @@ public class GridBasicClientFeaturesWidget } }, menuPath); + + addMenuCommand("Set widget", new ScheduledCommand() { + @Override + public void execute() { + row.getCell(grid.getColumn(0)).setWidget(new TextBox()); + } + }, menuPath); } private void createFooterMenu() { diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/client/GridHeaderTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/client/GridHeaderTest.java index 8806a35043..31c107d524 100644 --- a/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/client/GridHeaderTest.java +++ b/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/client/GridHeaderTest.java @@ -256,6 +256,23 @@ public class GridHeaderTest extends GridStaticSectionTest { assertEquals("clicked", button.getText().toLowerCase()); } + @Test + public void testSortAfterMultiSelect() throws Exception { + openTestURL(); + + selectMenuPath("Component", "Columns", "Column 0", "Sortable"); + selectMenuPath("Component", "Header", "Append row"); + selectMenuPath("Component", "Header", "Row 2", "Set widget"); + selectMenuPath("Component", "State", "Selection mode", "multi"); + selectMenuPath("Component", "State", "Selection mode", "single"); + + GridCellElement headerCell = getGridElement().getHeaderCell(0, 0); + + headerCell.click(); + + assertTrue(hasClassName(headerCell, "sort-asc")); + } + private void assertHeaderCount(int count) { assertEquals("header count", count, getGridElement().getHeaderCount()); } |