diff options
author | Markus Koivisto <markus@vaadin.com> | 2014-06-12 17:38:44 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2014-06-17 07:56:59 +0000 |
commit | d076dc7317b4f211e95ef560442793cb1200cfc9 (patch) | |
tree | 42a20ba8cf4b90b3ab9551e9ae7bbf0c7f0a3aba | |
parent | 545b3a43bf8953c8976de518bfc618cae0564b9a (diff) | |
download | vaadin-framework-d076dc7317b4f211e95ef560442793cb1200cfc9.tar.gz vaadin-framework-d076dc7317b4f211e95ef560442793cb1200cfc9.zip |
Prevent table from scrolling on selectionChange when in Multiselect mode (#13341)
Change-Id: Ie3df61fab6d76dce3e2027cd732d0e6e7dd299e9
3 files changed, 170 insertions, 3 deletions
diff --git a/client/src/com/vaadin/client/ui/VScrollTable.java b/client/src/com/vaadin/client/ui/VScrollTable.java index d3317abd4d..f8b1ff8d83 100644 --- a/client/src/com/vaadin/client/ui/VScrollTable.java +++ b/client/src/com/vaadin/client/ui/VScrollTable.java @@ -1082,12 +1082,20 @@ public class VScrollTable extends FlowPanel implements HasWidgets, selected = true; keyboardSelectionOverRowFetchInProgress = true; } - if (selected) { + if (isSingleSelectMode() && selected) { + if (focusedRow == null || !selectedRowKeys.contains(focusedRow .getKey())) { - // The focus is no longer on a selected row, - // move focus to first selected row + /* + * The focus is no longer on a selected row. If we + * are in single select mode, move focus to the + * selected row. (#10522) + * + * Don't modify the focused row when in multiselect + * mode. (#13341) + */ + setRowFocus(row); } } diff --git a/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewport.java b/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewport.java new file mode 100644 index 0000000000..5a406eac48 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewport.java @@ -0,0 +1,98 @@ +/* + * 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 com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUIWithLog; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.CssLayout; +import com.vaadin.ui.Table; + +/** + * + * @since + * @author Vaadin Ltd + */ +public class SelectAllConstantViewport extends AbstractTestUIWithLog { + + /* + * (non-Javadoc) + * + * @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server. + * VaadinRequest) + */ + @Override + protected void setup(VaadinRequest request) { + + final Table table = new Table(); + table.addContainerProperty("", Integer.class, null); + table.setSizeFull(); + table.setMultiSelect(true); + table.setNullSelectionAllowed(true); + table.setSelectable(true); + + CheckBox selectAllCheckbox = new CheckBox("Select All"); + selectAllCheckbox.addValueChangeListener(new ValueChangeListener() { + @Override + public void valueChange( + com.vaadin.data.Property.ValueChangeEvent event) { + Object checked = event.getProperty().getValue(); + if (checked instanceof Boolean) { + if (((Boolean) checked).booleanValue()) { + table.setValue(table.getItemIds()); + } else { + table.setValue(null); + } + } + } + }); + + for (int i = 0; i < 200; i++) { + table.addItem(new Object[] { new Integer(i) }, new Integer(i)); + } + + table.setCurrentPageFirstItemIndex(185); + + final CssLayout layout = new CssLayout(); + layout.addComponent(selectAllCheckbox); + layout.addComponent(table); + layout.setSizeFull(); + addComponent(layout); + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.tests.components.AbstractTestUI#getTestDescription() + */ + @Override + protected String getTestDescription() { + + return "The scroll position of a table with many items should remain constant if all items are selected."; + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber() + */ + @Override + protected Integer getTicketNumber() { + return 13341; + } + +} diff --git a/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewportTest.java b/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewportTest.java new file mode 100644 index 0000000000..0e7a7c08a4 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewportTest.java @@ -0,0 +1,61 @@ +/* + * 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 java.io.IOException; + +import org.junit.Test; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedCondition; + +import com.vaadin.testbench.By; +import com.vaadin.testbench.elements.CheckBoxElement; +import com.vaadin.testbench.elements.TableElement; +import com.vaadin.tests.tb3.MultiBrowserTest; + +public class SelectAllConstantViewportTest extends MultiBrowserTest { + + @Test + public void testViewportUnchanged() throws IOException { + openTestURL(); + + CheckBoxElement checkbox = $(CheckBoxElement.class).first(); + + WebElement row = $(TableElement.class).first().getCell(190, 0); + final WebElement scrollPositionDisplay = getDriver().findElement( + By.className("v-table-scrollposition")); + waitUntilNot(new ExpectedCondition<Boolean>() { + + @Override + public Boolean apply(WebDriver input) { + return scrollPositionDisplay.isDisplayed(); + } + }, 10); + + int rowLocation = row.getLocation().getY(); + + // use click x,y with non-zero offset to actually toggle the checkbox. (#13763) + checkbox.click(5, 5); + int newRowLocation = row.getLocation().getY(); + + assertThat(newRowLocation, is(rowLocation)); + + } +} |