]> source.dussan.org Git - vaadin-framework.git/commitdiff
Update DOM and update escalator row count in the correct order (#19442)
authorArtur Signell <artur@vaadin.com>
Fri, 2 Sep 2016 05:19:35 +0000 (08:19 +0300)
committerJohannes Dahlström <johannesd@vaadin.com>
Mon, 5 Sep 2016 09:55:59 +0000 (09:55 +0000)
If you show a column when Grid has no horizontal scrollbar, and is scrolled
all the way down, and the number of visible rows is slightly more than N then
Escalator will adjust the row count when the scrollbar is shown so that N-1
rows are visible. During this operation, the DOM must be updated for the new
column.

Change-Id: I0b6c845f96a57be1d64ef4e735aa2f77efbe589a

client/src/main/java/com/vaadin/client/widgets/Escalator.java
uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/server/GridColumnVisibilityTest.java

index 52f981fe6362427a69751d759700e02ceb8a6cc9..d867907996e7bd03aaec73197fa0813738d6673e 100644 (file)
@@ -4166,6 +4166,11 @@ public class Escalator extends Widget implements RequiresResize,
                 frozenColumns += numberOfColumns;
             }
 
+            // Add to DOM
+            header.paintInsertColumns(index, numberOfColumns, frozen);
+            body.paintInsertColumns(index, numberOfColumns, frozen);
+            footer.paintInsertColumns(index, numberOfColumns, frozen);
+
             // this needs to be before the scrollbar adjustment.
             boolean scrollbarWasNeeded = horizontalScrollbar.getOffsetSize() < horizontalScrollbar
                     .getScrollSize();
@@ -4173,14 +4178,12 @@ public class Escalator extends Widget implements RequiresResize,
             boolean scrollbarIsNowNeeded = horizontalScrollbar.getOffsetSize() < horizontalScrollbar
                     .getScrollSize();
             if (!scrollbarWasNeeded && scrollbarIsNowNeeded) {
+                // This might as a side effect move rows around (when scrolled
+                // all the way down) and require the DOM to be up to date, i.e.
+                // the column to be added
                 body.verifyEscalatorCount();
             }
 
-            // Add to DOM
-            header.paintInsertColumns(index, numberOfColumns, frozen);
-            body.paintInsertColumns(index, numberOfColumns, frozen);
-            footer.paintInsertColumns(index, numberOfColumns, frozen);
-
             // fix initial width
             if (header.getRowCount() > 0 || body.getRowCount() > 0
                     || footer.getRowCount() > 0) {
index 6e0d7cc87ac961a533bc18b5340fa4b5284fa071..11a6dcf4b388c4cc2408003284bd371f16cca8b8 100644 (file)
@@ -1,12 +1,12 @@
 /*
  * Copyright 2000-2014 Vaadin Ltd.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,9 +21,11 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.vaadin.testbench.elements.GridElement;
 import com.vaadin.testbench.parallel.TestCategory;
 import com.vaadin.tests.components.grid.basicfeatures.GridBasicFeaturesTest;
 
@@ -295,6 +297,33 @@ public class GridColumnVisibilityTest extends GridBasicFeaturesTest {
         verifyColumnNotFrozen(2);
     }
 
+    @Test
+    public void showColumnAndScrollbarWhenScrolledDownAndVisibleRowsChange() throws Exception {
+        // Set a (un)suitable height
+        selectMenuPath("Component", "Size", "HeightMode Row");
+        selectMenuPath("Component", "Size", "Height by Rows", "4.33 rows");
+
+        toggleAllColumnsHidable();
+
+        // Hide all but the first 3
+        getSidebarOpenButton().click();
+        for (int i=3; i < 12; i++) {
+            getColumnHidingToggle(i).click();
+        }
+
+        getSidebarOpenButton().click();
+
+        // Scroll all the way to the end
+        $(GridElement.class).first().scrollToRow(999);
+
+        // Show the fourth column
+        getSidebarOpenButton().click();
+        getColumnHidingToggle(3).click();
+
+        // Make sure that the new column contains the data it should
+        Assert.assertEquals("(999, 3)", getGridElement().getCell(999, 3).getText());
+    }
+
     private void verifyColumnFrozen(int index) {
         assertTrue(getGridElement().getHeaderCell(0, index).isFrozen());
     }
@@ -306,6 +335,9 @@ public class GridColumnVisibilityTest extends GridBasicFeaturesTest {
     private void toggleColumnHidable(int index) {
         selectMenuPath("Component", "Columns", "Column " + index, "Hidable");
     }
+    private void toggleAllColumnsHidable() {
+        selectMenuPath("Component", "Columns", "All columns hidable");
+    }
 
     private void addRemoveColumn(int index) {
         selectMenuPath("Component", "Columns", "Column " + index,