]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix Grid Editor closing and disabling at same time (#11078)
authorMehdi Javan <mehdi@vaadin.com>
Fri, 20 Jul 2018 07:57:03 +0000 (10:57 +0300)
committerTeemu Suo-Anttila <tsuoanttila@users.noreply.github.com>
Mon, 30 Jul 2018 13:45:46 +0000 (16:45 +0300)
Fixes #10688

(cherry picked from commit a089371)

client/src/main/java/com/vaadin/client/connectors/grid/EditorConnector.java
uitest/src/main/java/com/vaadin/tests/components/grid/GridEditorEnableDisable.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/grid/GridEditorEnableDisableTest.java [new file with mode: 0644]

index 76a79693cafe6b8b310fdc13306d6d9108ebf70c..05aa8fe392b0804f3be990777456108f10a3d085 100644 (file)
@@ -197,7 +197,17 @@ public class EditorConnector extends AbstractExtensionConnector {
 
     @OnStateChange("enabled")
     void updateEnabled() {
-        getParent().getWidget().getEditor().setEnabled(getState().enabled);
+        boolean enabled = getState().enabled;
+
+        Scheduler.ScheduledCommand setEnabledCommand = () -> {
+            getParent().getWidget().getEditor().setEnabled(enabled);
+        };
+
+        if (!enabled) {
+            Scheduler.get().scheduleFinally(setEnabledCommand);
+        } else {
+            setEnabledCommand.execute();
+        }
     }
 
     @OnStateChange("saveCaption")
diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridEditorEnableDisable.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridEditorEnableDisable.java
new file mode 100644 (file)
index 0000000..ecaae43
--- /dev/null
@@ -0,0 +1,68 @@
+package com.vaadin.tests.components.grid;
+
+import com.vaadin.data.Binder;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.tests.data.bean.Person;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.TextField;
+
+public class GridEditorEnableDisable extends AbstractTestUI {
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        final Grid<Person> grid = new Grid<>();
+        Person person1 = new Person();
+        person1.setFirstName("Foo");
+
+        Person person2 = new Person();
+        person2.setFirstName("Bar");
+
+        grid.setItems(person1, person2);
+        Grid.Column<Person, String> column = grid
+                .addColumn(Person::getFirstName);
+
+        Binder<Person> binder = grid.getEditor().getBinder();
+        grid.getEditor().setEnabled(true);
+
+        TextField field = new TextField();
+        Binder.Binding<Person, String> binding = binder.bind(field,
+                Person::getFirstName, Person::setFirstName);
+        column.setEditorBinding(binding);
+
+        addComponent(grid);
+
+        final Button disableButton = new Button("Disable");
+        disableButton.addClickListener((event) -> {
+            grid.getEditor().setEnabled(false);
+        });
+
+        addComponent(disableButton);
+
+        final Button cancelAndDisableButton = new Button("Cancel & Disable");
+        cancelAndDisableButton.addClickListener((event) -> {
+            if (grid.getEditor().isOpen())
+                grid.getEditor().cancel();
+            grid.getEditor().setEnabled(false);
+        });
+
+        addComponent(cancelAndDisableButton);
+
+        final Button enableButton = new Button("Enable");
+        enableButton.addClickListener((event) -> {
+            grid.getEditor().setEnabled(true);
+        });
+
+        addComponent(enableButton);
+
+        final Button enableAndEditRowButton = new Button("Enable & Edit Row");
+        enableAndEditRowButton.addClickListener((event) -> {
+            grid.getEditor().setEnabled(true);
+            grid.getEditor().editRow(0);
+        });
+
+        addComponent(enableAndEditRowButton);
+    }
+
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridEditorEnableDisableTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridEditorEnableDisableTest.java
new file mode 100644 (file)
index 0000000..cf37db9
--- /dev/null
@@ -0,0 +1,113 @@
+package com.vaadin.tests.components.grid;
+
+import com.vaadin.testbench.annotations.RunLocally;
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.testbench.elements.TextFieldElement;
+import com.vaadin.testbench.parallel.Browser;
+import com.vaadin.testbench.parallel.TestCategory;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+import org.junit.Test;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.interactions.Actions;
+
+import static org.junit.Assert.assertTrue;
+
+@TestCategory("grid")
+public class GridEditorEnableDisableTest extends SingleBrowserTest {
+    @Override
+    public void setup() throws Exception {
+        super.setup();
+
+        openTestURL();
+    }
+
+    @Test
+    public void testEnabledEditor() {
+        GridElement grid = $(GridElement.class).first();
+        grid.getCell(0, 0).doubleClick();
+
+        assertTrue("Editor must work when it is enabled!",
+                isElementPresent(TextFieldElement.class));
+    }
+
+    @Test
+    public void testDisabledEditor() {
+        GridElement grid = $(GridElement.class).first();
+        ButtonElement disableButton = $(ButtonElement.class).caption("Disable")
+                .first();
+
+        disableButton.click();
+        grid.getCell(0, 0).doubleClick();
+
+        assertTrue("Editor must not work when it is disabled!",
+                !isElementPresent(TextFieldElement.class));
+    }
+
+    @Test
+    public void testCancelAndDisableEditorWhenEditing() {
+        GridElement grid = $(GridElement.class).first();
+        ButtonElement cancelAndDisableButton = $(ButtonElement.class)
+                .caption("Cancel & Disable").first();
+
+        grid.getCell(0, 0).doubleClick();
+        cancelAndDisableButton.click();
+
+        assertTrue("Editing must be canceled after calling cancel method!",
+                !isElementPresent(TextFieldElement.class));
+
+        grid.getCell(0, 0).doubleClick();
+        assertTrue("Editor must not work when it is disabled!",
+                !isElementPresent(TextFieldElement.class));
+    }
+
+    @Test
+    public void testDisableEditorAfterCancelEditing() {
+        GridElement grid = $(GridElement.class).first();
+        ButtonElement disableButton = $(ButtonElement.class).caption("Disable")
+                .first();
+
+        grid.getCell(0, 0).doubleClick();
+        new Actions(getDriver()).sendKeys(Keys.ESCAPE).perform();
+
+        assertTrue("Editing must be canceled after pressing Escape key!",
+                !isElementPresent(TextFieldElement.class));
+
+        disableButton.click();
+        grid.getCell(0, 0).doubleClick();
+
+        assertTrue("Editor must not work when it is disabled!",
+                !isElementPresent(TextFieldElement.class));
+    }
+
+    @Test
+    public void testReenableEditorAfterCancelEditing() {
+        GridElement grid = $(GridElement.class).first();
+        ButtonElement cancelAndDisableButton = $(ButtonElement.class)
+                .caption("Cancel & Disable").first();
+        ButtonElement enableButton = $(ButtonElement.class).caption("Enable")
+                .first();
+
+        grid.getCell(0, 0).doubleClick();
+        cancelAndDisableButton.click();
+        enableButton.click();
+        grid.getCell(0, 0).doubleClick();
+
+        assertTrue("Editor must work after re-enabling!",
+                isElementPresent(TextFieldElement.class));
+    }
+
+    @Test
+    public void testEnableAndEditRow() {
+        ButtonElement disableButton = $(ButtonElement.class).caption("Disable")
+                .first();
+        ButtonElement enableAndEditRowButton = $(ButtonElement.class)
+                .caption("Enable & Edit Row").first();
+
+        disableButton.click();
+        enableAndEditRowButton.click();
+
+        assertTrue("Editor must be open after calling editRow method!",
+                isElementPresent(TextFieldElement.class));
+    }
+}