]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix Grid initial data when changing TabSheet Tab (#10872)
authorTeemu Suo-Anttila <tsuoanttila@users.noreply.github.com>
Fri, 4 May 2018 11:53:21 +0000 (14:53 +0300)
committerIlia Motornyi <elmot@vaadin.com>
Fri, 4 May 2018 11:53:21 +0000 (14:53 +0300)
server/src/main/java/com/vaadin/data/provider/DataCommunicator.java
uitest/src/main/java/com/vaadin/tests/components/grid/GridInTabSheet.java
uitest/src/test/java/com/vaadin/tests/components/grid/GridInTabSheetTest.java

index 99201965f1cd413cdc3cb8efb79168bfa8d5043d..574ed99045b79e8cce19bf9a491d9fbdbf80f076 100644 (file)
@@ -220,6 +220,11 @@ public class DataCommunicator<T> extends AbstractExtension {
     public void attach() {
         super.attach();
         attachDataProviderListener();
+
+        if (getPushRows().isEmpty()) {
+            // Make sure rows are pushed when component is attached.
+            setPushRows(Range.withLength(0, getMinPushSize()));
+        }
     }
 
     @Override
index e04f25262e31e041368e28d863bcc851ee88b1d6..e50aa9759b376f0b090112070210f4cb6ddb9b2d 100644 (file)
@@ -5,25 +5,46 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
+import com.vaadin.annotations.Widgetset;
 import com.vaadin.data.ValueProvider;
 import com.vaadin.data.provider.DataProvider;
 import com.vaadin.data.provider.ListDataProvider;
 import com.vaadin.server.VaadinRequest;
-import com.vaadin.tests.components.AbstractReindeerTestUI;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
 import com.vaadin.ui.Button;
-import com.vaadin.ui.Grid;
 import com.vaadin.ui.Grid.SelectionMode;
 import com.vaadin.ui.Label;
 import com.vaadin.ui.TabSheet;
 import com.vaadin.ui.renderers.NumberRenderer;
 
-public class GridInTabSheet extends AbstractReindeerTestUI {
+@Widgetset("com.vaadin.DefaultWidgetSet")
+public class GridInTabSheet extends AbstractTestUIWithLog {
+
+    public class DataCommunicator<T>
+            extends com.vaadin.data.provider.DataCommunicator<T> {
+        @Override
+        protected void onRequestRows(int firstRowIndex, int numberOfRows,
+                int firstCachedRowIndex, int cacheSize) {
+            log("RequestRows: [" + firstRowIndex + "," + numberOfRows + ","
+                    + firstCachedRowIndex + "," + cacheSize + "]");
+            super.onRequestRows(firstRowIndex, numberOfRows,
+                    firstCachedRowIndex, cacheSize);
+        }
+    }
+
+    public class Grid<T> extends com.vaadin.ui.Grid<T> {
+
+        public Grid() {
+            super(new DataCommunicator<>());
+        }
+    }
 
     private AtomicInteger index = new AtomicInteger(0);
 
     @Override
     protected void setup(VaadinRequest request) {
         TabSheet sheet = new TabSheet();
+
         final Grid<Integer> grid = new Grid<>();
         grid.setSelectionMode(SelectionMode.MULTI);
         grid.addColumn(ValueProvider.identity(), new NumberRenderer())
index e20ec622c7cb6f490491ac35f1fdb89537c3af77..785bda8261fc5e849a60376bc34d5e2d077f0998 100644 (file)
@@ -2,6 +2,8 @@ package com.vaadin.tests.components.grid;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
 
@@ -68,6 +70,21 @@ public class GridInTabSheetTest extends MultiBrowserTest {
         assertNoNotification();
     }
 
+    @Test
+    public void testNoDataRequestFromClientWhenSwitchingTab() {
+        setDebug(true);
+        openTestURL();
+
+        TabSheetElement tabsheet = $(TabSheetElement.class).first();
+        tabsheet.openTab("Label");
+        tabsheet.openTab("Grid");
+
+        getLogs().forEach(logText -> assertTrue(
+                "There should be no logged requests, was: " + logText,
+                logText.trim().isEmpty()));
+        assertNoNotification();
+    }
+
     private void removeGridRow() {
         $(ButtonElement.class).caption("Remove row from Grid").first().click();
     }