From 7c666980c0dabcf6f3dbcd0e395b5cbdec024dc7 Mon Sep 17 00:00:00 2001 From: Anna Koskinen Date: Fri, 20 Aug 2021 14:27:18 +0300 Subject: [PATCH] Updates to TreeGrid's ensureAvailability handling. (#12374) - Always update the availability request range when more or less data becomes available. Otherwise e.g. programmatically expanding a TreeGrid row can lead to discarding a lot of the new data right after receiving it. Fixes #12372 --- .../client/ui/treegrid/TreeGridConnector.java | 24 +++++----- .../treegrid/TreeGridProgrammaticExpand.java | 45 +++++++++++++++++++ .../TreeGridProgrammaticExpandTest.java | 22 +++++++++ 3 files changed, 78 insertions(+), 13 deletions(-) create mode 100644 uitest/src/main/java/com/vaadin/tests/components/treegrid/TreeGridProgrammaticExpand.java create mode 100644 uitest/src/test/java/com/vaadin/tests/components/treegrid/TreeGridProgrammaticExpandTest.java diff --git a/client/src/main/java/com/vaadin/client/ui/treegrid/TreeGridConnector.java b/client/src/main/java/com/vaadin/client/ui/treegrid/TreeGridConnector.java index 7c2475dd09..2172ee1d0f 100644 --- a/client/src/main/java/com/vaadin/client/ui/treegrid/TreeGridConnector.java +++ b/client/src/main/java/com/vaadin/client/ui/treegrid/TreeGridConnector.java @@ -207,13 +207,12 @@ public class TreeGridConnector extends GridConnector { public void dataRemoved(int firstRowIndex, int numberOfRows) { if (awaitingRowsState == AwaitingRowsState.COLLAPSE) { awaitingRowsState = AwaitingRowsState.NONE; - // make sure the cache stays up to date with the collapsing - Range visibleRowRange = getWidget().getEscalator() - .getVisibleRowRange(); - getDataSource().ensureAvailability( - visibleRowRange.getStart(), - visibleRowRange.length()); } + // make sure the cache stays up to date + Range visibleRowRange = getWidget().getEscalator() + .getVisibleRowRange(); + getDataSource().ensureAvailability(visibleRowRange.getStart(), + visibleRowRange.length()); checkExpand(); } @@ -221,13 +220,12 @@ public class TreeGridConnector extends GridConnector { public void dataAdded(int firstRowIndex, int numberOfRows) { if (awaitingRowsState == AwaitingRowsState.EXPAND) { awaitingRowsState = AwaitingRowsState.NONE; - // make sure the cache stays up to date with the expanding - Range visibleRowRange = getWidget().getEscalator() - .getVisibleRowRange(); - getDataSource().ensureAvailability( - visibleRowRange.getStart(), - visibleRowRange.length()); } + // make sure the cache stays up to date + Range visibleRowRange = getWidget().getEscalator() + .getVisibleRowRange(); + getDataSource().ensureAvailability(visibleRowRange.getStart(), + visibleRowRange.length()); checkExpand(); } @@ -252,7 +250,7 @@ public class TreeGridConnector extends GridConnector { GridEventHandler eventHandler) /*-{ var browserEventHandlers = grid.@com.vaadin.client.widgets.Grid::browserEventHandlers; - + // FocusEventHandler is initially 5th in the list of browser event handlers browserEventHandlers.@java.util.List::set(*)(5, eventHandler); }-*/; diff --git a/uitest/src/main/java/com/vaadin/tests/components/treegrid/TreeGridProgrammaticExpand.java b/uitest/src/main/java/com/vaadin/tests/components/treegrid/TreeGridProgrammaticExpand.java new file mode 100644 index 0000000000..f6c5a6b8c1 --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/treegrid/TreeGridProgrammaticExpand.java @@ -0,0 +1,45 @@ +package com.vaadin.tests.components.treegrid; + +import com.vaadin.data.TreeData; +import com.vaadin.data.provider.TreeDataProvider; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Button; +import com.vaadin.ui.TreeGrid; + +public class TreeGridProgrammaticExpand extends AbstractTestUI { + + @Override + protected void setup(VaadinRequest request) { + TreeData data = new TreeData<>(); + String root = "Root"; + data.addItem(null, root); + for (int i = 0; i < 15; i++) { + String leaf = "Leaf " + i; + data.addItem(root, leaf); + } + + TreeDataProvider treeDataProvider = new TreeDataProvider<>( + data); + TreeGrid treeGrid = new TreeGrid<>(); + treeGrid.setDataProvider(treeDataProvider); + treeGrid.addColumn(String::toString).setCaption("String") + .setId("string"); + treeGrid.addColumn(i -> "--").setCaption("Nothing"); + + Button button = new Button("Expand", e -> treeGrid.expand(root)); + + addComponents(button, treeGrid); + } + + @Override + protected String getTestDescription() { + return "There should be no client-side exception when clicking Leaf 4 " + + "or lower before scrolling."; + } + + @Override + protected Integer getTicketNumber() { + return 12372; + } +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/treegrid/TreeGridProgrammaticExpandTest.java b/uitest/src/test/java/com/vaadin/tests/components/treegrid/TreeGridProgrammaticExpandTest.java new file mode 100644 index 0000000000..65d8f2f680 --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/treegrid/TreeGridProgrammaticExpandTest.java @@ -0,0 +1,22 @@ +package com.vaadin.tests.components.treegrid; + +import org.junit.Test; +import org.openqa.selenium.By; + +import com.vaadin.testbench.elements.ButtonElement; +import com.vaadin.testbench.elements.TreeGridElement; +import com.vaadin.tests.tb3.MultiBrowserTest; + +public class TreeGridProgrammaticExpandTest extends MultiBrowserTest { + + @Test + public void expandAndClick() { + openTestURL("debug"); + TreeGridElement treeGrid = $(TreeGridElement.class).first(); + $(ButtonElement.class).first().click(); + waitUntilLoadingIndicatorNotVisible(); + treeGrid.getCell(5, 0).click(); + waitUntilLoadingIndicatorNotVisible(); + assertElementNotPresent(By.className("v-Notification-error")); + } +} -- 2.39.5