diff options
author | Teemu Suo-Anttila <teemusa@vaadin.com> | 2015-07-01 14:27:30 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2015-07-02 12:19:42 +0000 |
commit | 22ea8caf78f6690ed4414bd0085af7c5bfc21e46 (patch) | |
tree | e3db86722c01d1eac9abac8331bb54504775636a | |
parent | bab0975e1288af9079780a030c439b0c2be832ac (diff) | |
download | vaadin-framework-22ea8caf78f6690ed4414bd0085af7c5bfc21e46.tar.gz vaadin-framework-22ea8caf78f6690ed4414bd0085af7c5bfc21e46.zip |
Fix Grid details on sort to display them on correct rows (#18224)
Due to the nature of Container this is only achieved by removing any
existing details and reopening those after the sort is done.
Change-Id: Ic42186ed85981d5dad4ff0948aa22f7a0404480d
3 files changed, 39 insertions, 0 deletions
diff --git a/client/src/com/vaadin/client/widgets/Grid.java b/client/src/com/vaadin/client/widgets/Grid.java index fef6a01640..56b081f6b3 100644 --- a/client/src/com/vaadin/client/widgets/Grid.java +++ b/client/src/com/vaadin/client/widgets/Grid.java @@ -5972,6 +5972,12 @@ public class Grid<T> extends ResizeComposite implements RowContainer body = escalator.getBody(); int oldSize = body.getRowCount(); + // Hide all details. + Set<Integer> oldDetails = new HashSet<Integer>(visibleDetails); + for (int i : oldDetails) { + setDetailsVisible(i, false); + } + if (newSize > oldSize) { body.insertRows(oldSize, newSize - oldSize); cellFocusHandler.rowsAddedToBody(Range.withLength(oldSize, diff --git a/server/src/com/vaadin/data/RpcDataProviderExtension.java b/server/src/com/vaadin/data/RpcDataProviderExtension.java index 9d18736ba8..d291d509b2 100644 --- a/server/src/com/vaadin/data/RpcDataProviderExtension.java +++ b/server/src/com/vaadin/data/RpcDataProviderExtension.java @@ -927,6 +927,14 @@ public class RpcDataProviderExtension extends AbstractExtension { listener.removeListener(); } + // Wipe clean all details. + HashSet<Object> detailItemIds = new HashSet<Object>( + detailComponentManager.visibleDetailsComponents + .keySet()); + for (Object itemId : detailItemIds) { + detailComponentManager.destroyDetails(itemId); + } + listeners.clear(); activeRowHandler.activeRange = Range.withLength(0, 0); diff --git a/uitest/src/com/vaadin/tests/components/grid/GridDetailsWidthTest.java b/uitest/src/com/vaadin/tests/components/grid/GridDetailsWidthTest.java index 0a6f53820e..2def2d0279 100644 --- a/uitest/src/com/vaadin/tests/components/grid/GridDetailsWidthTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/GridDetailsWidthTest.java @@ -23,8 +23,11 @@ import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import com.vaadin.testbench.elements.GridElement; +import com.vaadin.testbench.elements.GridElement.GridCellElement; +import com.vaadin.testbench.parallel.TestCategory; import com.vaadin.tests.tb3.SingleBrowserTest; +@TestCategory("grid") public class GridDetailsWidthTest extends SingleBrowserTest { @Test @@ -64,4 +67,26 @@ public class GridDetailsWidthTest extends SingleBrowserTest { } } + @Test + public void testDetailsOnSort() { + openTestURL(); + GridElement grid = $(GridElement.class).first(); + + // Open a details rows + grid.getCell(0, 0).click(); + + GridCellElement cell = grid.getHeaderCell(0, 0); + cell.click(); + cell.click(); + + cell = grid.getCell(2, 0); + WebElement spacer = findElement(By.className("v-grid-spacer")); + Assert.assertEquals("Grid was not sorted correctly", "Hello 0", + cell.getText()); + Assert.assertEquals("Details row was not in correct location", cell + .getLocation().getY() + cell.getSize().getHeight(), spacer + .getLocation().getY()); + + } + } |