]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix ComboBox cleared suggestion popup on ItemSetChange (#13635)
authorTeemu Suo-Anttila <teemusa@vaadin.com>
Mon, 28 Apr 2014 11:26:26 +0000 (14:26 +0300)
committerVaadin Code Review <review@vaadin.com>
Mon, 28 Apr 2014 12:53:27 +0000 (12:53 +0000)
Change-Id: I77285e17819daf1b8328a8aea6d62a6b6b53510c

client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java
uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListener.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListenerTest.java [new file with mode: 0644]

index 8dec26cf90ae2bba70163caf3a7361320702eb45..bc28a01c0c618cbc185b5aae46cf2fe6c2d78186 100644 (file)
@@ -121,6 +121,10 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
         boolean suggestionsChanged = !getWidget().initDone
                 || !newSuggestions.equals(getWidget().currentSuggestions);
 
+        // An ItemSetChangeEvent on server side clears the current suggestion
+        // popup. Popup needs to be repopulated with suggestions from UIDL.
+        boolean popupOpenAndCleared = false;
+
         oldSuggestionTextMatchTheOldSelection = false;
 
         if (suggestionsChanged) {
@@ -141,6 +145,7 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
                  * menu might not necessary exist in select at all anymore.
                  */
                 getWidget().suggestionPopup.menu.clearItems();
+                popupOpenAndCleared = getWidget().suggestionPopup.isAttached();
 
             }
 
@@ -159,9 +164,9 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
             }
         }
 
-        if (getWidget().waitingForFilteringResponse
-                && getWidget().lastFilter.toLowerCase().equals(
-                        uidl.getStringVariable("filter"))) {
+        if ((getWidget().waitingForFilteringResponse && getWidget().lastFilter
+                .toLowerCase().equals(uidl.getStringVariable("filter")))
+                || popupOpenAndCleared) {
             getWidget().suggestionPopup.showSuggestions(
                     getWidget().currentSuggestions, getWidget().currentPage,
                     getWidget().totalMatches);
diff --git a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListener.java b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListener.java
new file mode 100644 (file)
index 0000000..8242eb9
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2000-2013 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.combobox;
+
+import com.vaadin.event.FieldEvents.FocusEvent;
+import com.vaadin.event.FieldEvents.FocusListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.ComboBox;
+
+/**
+ * Test UI to verify that focus event actually update the ComboBox suggestion
+ * popup
+ * 
+ * @author Vaadin Ltd
+ */
+public class ComboBoxItemAddingWithFocusListener extends AbstractTestUI {
+
+    private ComboBox cBox;
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        cBox = new ComboBox();
+        addComponent(cBox);
+        cBox.setImmediate(true);
+        cBox.addItem("Foo");
+        cBox.addItem("Bar");
+        cBox.addFocusListener(new FocusListener() {
+
+            int x = 0;
+
+            @Override
+            public void focus(FocusEvent event) {
+                cBox.addItem("Focus" + (x++));
+            }
+
+        });
+        addComponent(new Button("Focus Target"));
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "Item adding in focus listener causes popup to clear";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 13635;
+    }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListenerTest.java b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListenerTest.java
new file mode 100644 (file)
index 0000000..66173db
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2000-2013 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.combobox;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.TestBenchElement;
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.ComboBoxElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class ComboBoxItemAddingWithFocusListenerTest extends MultiBrowserTest {
+
+    @Test
+    public void testPopupViewContainsAddedItem() {
+        openTestURL();
+        ComboBoxElement cBox = $(ComboBoxElement.class).first();
+        ButtonElement focusTarget = $(ButtonElement.class).first();
+        cBox.openPopup();
+        int i = 0;
+        while (i < 3) {
+            assertTrue("No item added on focus", cBox.getPopupSuggestions()
+                    .contains("Focus" + i++));
+            focusTarget.focus();
+            ((TestBenchElement) cBox.findElement(By.vaadin("#textbox")))
+                    .focus();
+        }
+        assertTrue("No item added on focus", cBox.getPopupSuggestions()
+                .contains("Focus" + i));
+    }
+}