From 46878a5f5e39bf70e37f83df2563a4c23f38b7ac Mon Sep 17 00:00:00 2001 From: Anna Miroshnik Date: Mon, 15 Sep 2014 17:11:56 +0400 Subject: Re-adding all rows in Table causes table to loose scroll position (#14581) Fix: if to remove (container.removeAllItems()) and then to re-add(container.addAll(..)) the same collection in table container - > scroll position is not loosed now. The hash code and scroll position of the old container is stored when a new container is added. If the new container has the same hash code, we restore the scroll position. The scroll position is not restored if another items added to the container. Change-Id: I52a22c3c1c7b71f1b3447b9d592ab8fececd67b8 --- ...ableRepairsScrollPositionOnReAddingAllRows.java | 73 ++++++++++++++++++++++ ...RepairsScrollPositionOnReAddingAllRowsTest.java | 73 ++++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 uitest/src/com/vaadin/tests/components/table/TableRepairsScrollPositionOnReAddingAllRows.java create mode 100644 uitest/src/com/vaadin/tests/components/table/TableRepairsScrollPositionOnReAddingAllRowsTest.java (limited to 'uitest') diff --git a/uitest/src/com/vaadin/tests/components/table/TableRepairsScrollPositionOnReAddingAllRows.java b/uitest/src/com/vaadin/tests/components/table/TableRepairsScrollPositionOnReAddingAllRows.java new file mode 100644 index 0000000000..d9cbf007df --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/table/TableRepairsScrollPositionOnReAddingAllRows.java @@ -0,0 +1,73 @@ +package com.vaadin.tests.components.table; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Table; + +public class TableRepairsScrollPositionOnReAddingAllRows extends AbstractTestUI { + + private static final long serialVersionUID = 1L; + + @Override + protected void setup(VaadinRequest request) { + final BeanItemContainer cont = new BeanItemContainer( + TableItem.class); + final List itemList = new ArrayList(); + + Button button1 = new Button("ReAdd rows"); + button1.setId("button1"); + button1.addClickListener(new ClickListener() { + + @Override + public void buttonClick(com.vaadin.ui.Button.ClickEvent event) { + cont.removeAllItems(); + cont.addAll(itemList); + } + }); + + for (int i = 0; i < 80; i++) { + TableItem ti = new TableItem(); + ti.setName("Name_" + i); + itemList.add(ti); + cont.addBean(ti); + } + + final Table table = new Table(); + table.setPageLength(-1); + table.setContainerDataSource(cont); + table.setSelectable(true); + + getLayout().addComponent(button1); + getLayout().addComponent(table); + } + + public class TableItem implements Serializable { + private static final long serialVersionUID = -745849615488792221L; + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } + + @Override + protected Integer getTicketNumber() { + return 14581; + } + + @Override + protected String getTestDescription() { + return "The scroll position should not be changed if removing and re-adding all rows in Table."; + } +} diff --git a/uitest/src/com/vaadin/tests/components/table/TableRepairsScrollPositionOnReAddingAllRowsTest.java b/uitest/src/com/vaadin/tests/components/table/TableRepairsScrollPositionOnReAddingAllRowsTest.java new file mode 100644 index 0000000000..807a80d182 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/table/TableRepairsScrollPositionOnReAddingAllRowsTest.java @@ -0,0 +1,73 @@ +/* + * 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 + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.components.table; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedCondition; + +import com.vaadin.testbench.commands.TestBenchCommandExecutor; +import com.vaadin.testbench.elements.TableElement; +import com.vaadin.testbench.screenshot.ImageComparison; +import com.vaadin.testbench.screenshot.ReferenceNameGenerator; +import com.vaadin.tests.tb3.MultiBrowserTest; + +public class TableRepairsScrollPositionOnReAddingAllRowsTest extends + MultiBrowserTest { + + @Test + public void testScrollRepairsAfterReAddingAllRows() + throws InterruptedException { + openTestURL(); + + WebElement buttonReAddRows = findElement(By.id("button1")); + + scrollUp(); + + waitUntilNot(new ExpectedCondition() { + @Override + public Boolean apply(WebDriver input) { + return $(TableElement.class).first().getCell(49, 0) == null; + } + }, 10); + + WebElement row = $(TableElement.class).first().getCell(49, 0); + int rowLocation = row.getLocation().getY(); + + buttonReAddRows.click(); + + row = $(TableElement.class).first().getCell(49, 0); + int newRowLocation = row.getLocation().getY(); + + assertThat( + "Scroll position should be the same as before Re-Adding all rows", + rowLocation == newRowLocation, is(true)); + } + + private void scrollUp() { + WebElement actualElement = getDriver().findElement( + By.className("v-table-body-wrapper")); + JavascriptExecutor js = new TestBenchCommandExecutor(getDriver(), + new ImageComparison(), new ReferenceNameGenerator()); + js.executeScript("arguments[0].scrollTop = " + 1200, actualElement); + } +} -- cgit v1.2.3