From 062caa5b844dd6540b101dd04c612bc8e5948ad4 Mon Sep 17 00:00:00 2001 From: Anna Koskinen Date: Mon, 13 Aug 2018 15:41:23 +0300 Subject: [PATCH] Compensate for Grid editor moving out of sync horizontally. (#11092) Fixes #10998 --- .../java/com/vaadin/client/widgets/Grid.java | 16 +++++- .../components/grid/GridEditorScrollSync.java | 49 +++++++++++++++++++ .../grid/GridEditorScrollSyncTest.java | 47 ++++++++++++++++++ 3 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 uitest/src/main/java/com/vaadin/tests/components/grid/GridEditorScrollSync.java create mode 100644 uitest/src/test/java/com/vaadin/tests/components/grid/GridEditorScrollSyncTest.java diff --git a/client/src/main/java/com/vaadin/client/widgets/Grid.java b/client/src/main/java/com/vaadin/client/widgets/Grid.java index 021be95e9a..b0bb391050 100755 --- a/client/src/main/java/com/vaadin/client/widgets/Grid.java +++ b/client/src/main/java/com/vaadin/client/widgets/Grid.java @@ -2136,8 +2136,20 @@ public class Grid extends ResizeComposite implements HasSelectionHandlers, private void updateHorizontalScrollPosition() { double scrollLeft = grid.getScrollLeft(); - cellWrapper.getStyle().setLeft( - frozenCellWrapper.getOffsetWidth() - scrollLeft, Unit.PX); + int frozenWidth = frozenCellWrapper.getOffsetWidth(); + double newLeft = frozenWidth - scrollLeft; + cellWrapper.getStyle().setLeft(newLeft, Unit.PX); + + // sometimes focus handling twists the editor row out of alignment + // with the grid itself and the position needs to be compensated for + TableRowElement rowElement = grid.getEscalator().getBody() + .getRowElement(grid.getEditor().getRow()); + int rowLeft = rowElement.getAbsoluteLeft(); + int editorLeft = cellWrapper.getAbsoluteLeft(); + if (editorLeft != rowLeft + frozenWidth) { + cellWrapper.getStyle().setLeft(newLeft + rowLeft - editorLeft, + Unit.PX); + } } /** diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridEditorScrollSync.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridEditorScrollSync.java new file mode 100644 index 0000000000..85398d400b --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/grid/GridEditorScrollSync.java @@ -0,0 +1,49 @@ +package com.vaadin.tests.components.grid; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Grid; + +public class GridEditorScrollSync extends AbstractTestUI { + + @Override + protected void setup(VaadinRequest request) { + // Create a grid + Grid grid = new Grid(); + grid.setEditorEnabled(true); + grid.setEditorBuffered(false); + + // Define some columns + grid.addColumn("name", String.class); + grid.addColumn("born", Integer.class); + + grid.addColumn("name1", String.class); + grid.addColumn("born1", Integer.class); + + grid.addColumn("name2", String.class); + grid.addColumn("born2", Integer.class); + + grid.addColumn("name3", String.class); + grid.addColumn("born3", Integer.class); + + grid.addColumn("name4", String.class); + grid.addColumn("born4", Integer.class); + + grid.setWidth("450px"); + + // Add some data rows + grid.addRow("Nicolaus Copernicus", 1543, "Nicolaus Copernicus", 1543, + "Nicolaus Copernicus", 1543, "Nicolaus Copernicus", 1543, + "Nicolaus Copernicus", 1543); + + grid.addRow("Galileo Galilei", 1564, "Galileo Galilei", 1564, + "Galileo Galilei", 1564, "s", 55, "Nicolaus Copernicus", 1543); + + grid.addRow("Johannes Kepler", 1571, "Johannes Kepler", 1571, + "Johannes Kepler", 1571, "Nicolaus Copernicus", 1543, + "Nicolaus Copernicus", 1543); + + getLayout().addComponent(grid); + } + +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridEditorScrollSyncTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridEditorScrollSyncTest.java new file mode 100644 index 0000000000..50ac9b5afe --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/grid/GridEditorScrollSyncTest.java @@ -0,0 +1,47 @@ +package com.vaadin.tests.components.grid; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.number.IsCloseTo.closeTo; + +import org.junit.Assert; +import org.junit.Test; +import org.openqa.selenium.By; + +import com.vaadin.testbench.TestBenchElement; +import com.vaadin.testbench.elements.GridElement; +import com.vaadin.testbench.elements.GridElement.GridCellElement; +import com.vaadin.tests.tb3.MultiBrowserTest; + +public class GridEditorScrollSyncTest extends MultiBrowserTest { + + private GridElement grid; + + @Test + public void testScrollAndEdit() { + openTestURL(); + grid = $(GridElement.class).first(); + + ((TestBenchElement) grid + .findElement(By.className("v-grid-scroller-horizontal"))) + .scrollLeft(300); + openEditor(); + + GridCellElement rowCell = grid.getCell(1, 6); + TestBenchElement editorField = grid.getEditor().getField(6); + assertPosition(rowCell.getLocation().getX(), + editorField.getWrappedElement().getLocation().getX()); + } + + private GridElement openEditor() { + grid.getCell(0, 6).doubleClick(); + Assert.assertTrue("Grid editor should be displayed.", + grid.getEditor().isDisplayed()); + return grid; + } + + private void assertPosition(double expected, double actual) { + // 1px leeway for calculations + assertThat("Unexpected position.", expected, closeTo(actual, 1d)); + } + +} -- 2.39.5