]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix problem with re-opening the popup (#8446) (#8454)
authorcaalador <mikael.grankvist@gmail.com>
Tue, 7 Feb 2017 07:16:07 +0000 (09:16 +0200)
committerGitHub <noreply@github.com>
Tue, 7 Feb 2017 07:16:07 +0000 (09:16 +0200)
Fixed problem that disables opening of popup
after closing it by clicking the datefield-button.

client/src/main/java/com/vaadin/client/ui/VPopupCalendar.java
uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateField.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/datefield/PopupDateFieldTest.java [new file with mode: 0644]

index bba1045b89f108a1348e6960d5fded02a142d076..c3e369f39c5f8b0d5993294485dededef4245041 100644 (file)
@@ -267,9 +267,9 @@ public class VPopupCalendar extends VTextualDate
      * Sets the state of the text field of this component. By default the text
      * field is enabled. Disabling it causes only the button for date selection
      * to be active, thus preventing the user from entering invalid dates. See
-     * {@link http://dev.vaadin.com/ticket/6790}.
+     * <a href="http://dev.vaadin.com/ticket/6790">6790</a>.
      *
-     * @param state
+     * @param textFieldEnabled
      */
     public void setTextFieldEnabled(boolean textFieldEnabled) {
         this.textFieldEnabled = textFieldEnabled;
@@ -426,7 +426,9 @@ public class VPopupCalendar extends VTextualDate
     @Override
     public void onClick(ClickEvent event) {
         if (event.getSource() == calendarToggle && isEnabled()) {
-            if (!preventOpenPopupCalendar) {
+            if (open) {
+                closeCalendarPanel();
+            } else if (!preventOpenPopupCalendar) {
                 openCalendarPanel();
             }
             preventOpenPopupCalendar = false;
@@ -612,7 +614,7 @@ public class VPopupCalendar extends VTextualDate
      * and it depends on the current resolution, what is considered inside the
      * range.
      *
-     * @param startDate
+     * @param rangeStart
      *            - the allowed range's start date
      */
     public void setRangeStart(Date rangeStart) {
@@ -623,7 +625,7 @@ public class VPopupCalendar extends VTextualDate
      * Sets the end range for this component. The end range is inclusive, and it
      * depends on the current resolution, what is considered inside the range.
      *
-     * @param endDate
+     * @param rangeEnd
      *            - the allowed range's end date
      */
     public void setRangeEnd(Date rangeEnd) {
diff --git a/uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateField.java b/uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateField.java
new file mode 100644 (file)
index 0000000..56e4b0c
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * 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.datefield;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+
+@Theme("valo")
+public class PopupDateField extends AbstractTestUI {
+    @Override
+    protected void setup(VaadinRequest request) {
+        com.vaadin.ui.PopupDateField date = new com.vaadin.ui.PopupDateField();
+        addComponent(date);
+    }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/datefield/PopupDateFieldTest.java b/uitest/src/test/java/com/vaadin/tests/components/datefield/PopupDateFieldTest.java
new file mode 100644 (file)
index 0000000..cc50da6
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * 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.datefield;
+
+import org.junit.Test;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.PopupDateFieldElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class PopupDateFieldTest extends MultiBrowserTest {
+
+    @Test
+    public void testOpenCloseOpen_popupShouldBeOpen() throws Exception {
+        openTestURL();
+
+        WebElement toggleButton = $(PopupDateFieldElement.class).first()
+                .findElement(By.className("v-datefield-button"));
+
+        toggleButton.click();
+
+        assertThatPopupIsVisible();
+
+        toggleButton.click();
+
+        assertThatPopupIsInvisible();
+
+        // We should be able to immediately open the popup from the popup after
+        // clicking the button to close it. (#8446)
+        toggleButton.click();
+
+        assertThatPopupIsVisible();
+    }
+
+    private void assertThatPopupIsVisible() {
+        waitUntil(ExpectedConditions.visibilityOfElementLocated(
+                org.openqa.selenium.By.className("v-datefield-popup")));
+    }
+
+    private void assertThatPopupIsInvisible() {
+        // ExpectedConditions.invisibilityOfElementLocated doesn't work
+        // with PhantomJS when running with a hub:
+        // https://code.google.com/p/selenium/issues/detail?id=5000
+        // so we need to make our own.
+
+        waitUntil(new ExpectedCondition<Boolean>() {
+            @Override
+            public Boolean apply(WebDriver input) {
+                try {
+                    return !(findElement(By.className("v-datefield-popup"))
+                            .isDisplayed());
+                } catch (Exception e) {
+                    return true;
+                }
+            }
+
+            @Override
+            public String toString() {
+                // Timed out after 10 seconds waiting for ...
+                return "popup to not be visible";
+            }
+        });
+    }
+
+}