Browse Source

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
tags/7.4.0.beta1
Anna Miroshnik 9 years ago
parent
commit
98fa0cce8d

+ 285
- 209
server/src/com/vaadin/ui/Table.java
File diff suppressed because it is too large
View File


+ 73
- 0
uitest/src/com/vaadin/tests/components/table/TableRepairsScrollPositionOnReAddingAllRows.java View File

@@ -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<TableItem> cont = new BeanItemContainer<TableItem>(
TableItem.class);
final List<TableItem> itemList = new ArrayList<TableItem>();

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.";
}
}

+ 73
- 0
uitest/src/com/vaadin/tests/components/table/TableRepairsScrollPositionOnReAddingAllRowsTest.java View File

@@ -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<Boolean>() {
@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);
}
}

Loading…
Cancel
Save