]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix client and server filter state mismatch in Combobox (#10630)
authorAnna Koskinen <Ansku@users.noreply.github.com>
Tue, 27 Feb 2018 15:05:22 +0000 (17:05 +0200)
committerTeemu Suo-Anttila <tsuoanttila@users.noreply.github.com>
Tue, 27 Feb 2018 15:05:22 +0000 (17:05 +0200)
Fixes #10624

client/src/main/java/com/vaadin/client/ui/combobox/ComboBoxConnector.java
server/src/main/java/com/vaadin/ui/ComboBox.java
shared/src/main/java/com/vaadin/shared/ui/combobox/ComboBoxState.java
uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxFilterClear.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxFilterClearTest.java [new file with mode: 0644]

index 334b6307249caeb3e3a61b23bb97b79967fe546d..544f0417703e14cc7434f8aca6ca20e431cdc831 100644 (file)
@@ -196,7 +196,7 @@ public class ComboBoxConnector extends AbstractListingConnector
      *            the current filter string
      */
     protected void setFilter(String filter) {
-        if (!Objects.equals(filter, getWidget().lastFilter)) {
+        if (!Objects.equals(filter, getState().currentFilterText)) {
             getDataReceivedHandler().clearPendingNavigation();
 
             rpc.setFilter(filter);
@@ -243,10 +243,9 @@ public class ComboBoxConnector extends AbstractListingConnector
             page = 0;
         }
         VComboBox widget = getWidget();
-        int adjustment = widget.nullSelectionAllowed && filter.isEmpty()
-                ? 1 : 0;
-        int startIndex = Math.max(0,
-                page * widget.pageLength - adjustment);
+        int adjustment = widget.nullSelectionAllowed && filter.isEmpty() ? 1
+                : 0;
+        int startIndex = Math.max(0, page * widget.pageLength - adjustment);
         int pageLength = widget.pageLength > 0 ? widget.pageLength
                 : getDataSource().size();
         getDataSource().ensureAvailability(startIndex, pageLength);
index 9500d08c962812fcce54a551a357cb7fda450e33..50665fd8772eab945afe3bdf59c1ea0ad2102432 100644 (file)
@@ -206,7 +206,7 @@ public class ComboBox<T> extends AbstractSingleSelect<T>
 
         @Override
         public void setFilter(String filterText) {
-            currentFilterText = filterText;
+            getState().currentFilterText = filterText;
             filterSlot.accept(filterText);
         }
     };
@@ -224,8 +224,6 @@ public class ComboBox<T> extends AbstractSingleSelect<T>
 
     private StyleGenerator<T> itemStyleGenerator = item -> null;
 
-    private String currentFilterText;
-
     private SerializableConsumer<String> filterSlot = filter -> {
         // Just ignore when neither setDataProvider nor setItems has been called
     };
@@ -890,7 +888,8 @@ public class ComboBox<T> extends AbstractSingleSelect<T>
         };
 
         SerializableConsumer<C> providerFilterSlot = internalSetDataProvider(
-                dataProvider, convertOrNull.apply(currentFilterText));
+                dataProvider,
+                convertOrNull.apply(getState(false).currentFilterText));
 
         filterSlot = filter -> providerFilterSlot
                 .accept(convertOrNull.apply(filter));
index 666fff1e5891c583a00032224e80789781321e08..95500af2fde6ae951c7e6c6b50a41c17c87bcbb0 100644 (file)
@@ -100,4 +100,11 @@ public class ComboBoxState extends AbstractSingleSelectState {
      */
     public String selectedItemIcon;
 
+    /**
+     * Filter string that is currently in use in the suggestion listing.
+     *
+     * @since
+     */
+    public String currentFilterText;
+
 }
diff --git a/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxFilterClear.java b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxFilterClear.java
new file mode 100644 (file)
index 0000000..6223961
--- /dev/null
@@ -0,0 +1,32 @@
+package com.vaadin.tests.components.combobox;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.Button;
+
+public class ComboBoxFilterClear extends ComboBoxSelecting {
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        super.setup(request);
+
+        Button toggleVisibility = new Button("Toggle visibility",
+                e -> comboBox.setVisible(!comboBox.isVisible()));
+        toggleVisibility.setId("toggleVisibility");
+
+        Button setNull = new Button("Set null", e -> comboBox.setValue(null));
+        setNull.setId("setNull");
+
+        addComponents(toggleVisibility, setNull);
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "Clearing selection while ComboBox is not visible should not "
+                + "leave the suggestion items stuck on the previous filter";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 10624;
+    }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxFilterClearTest.java b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxFilterClearTest.java
new file mode 100644 (file)
index 0000000..29beb29
--- /dev/null
@@ -0,0 +1,52 @@
+package com.vaadin.tests.components.combobox;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.ComboBoxElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class ComboBoxFilterClearTest extends MultiBrowserTest {
+    ComboBoxElement comboBox;
+
+    @Test
+    public void testFilterCleared() {
+        openTestURL();
+        comboBox = $(ComboBoxElement.class).first();
+        ButtonElement toggleVisibility = $(ButtonElement.class)
+                .id("toggleVisibility");
+        ButtonElement setNull = $(ButtonElement.class).id("setNull");
+
+        sendKeysToInput("b0", Keys.TAB);
+        assertEquals("b0", comboBox.getText());
+
+        toggleVisibility.click();
+        waitForElementNotPresent(By.className("v-filterselect"));
+
+        setNull.click();
+
+        toggleVisibility.click();
+        waitForElementPresent(By.className("v-filterselect"));
+        comboBox = $(ComboBoxElement.class).first();
+
+        WebElement suggestionPopup = comboBox.getSuggestionPopup();
+
+        List<WebElement> menuItems = suggestionPopup
+                .findElements(By.className("gwt-MenuItem"));
+        assertEquals("a0", menuItems.get(1).getText());
+    }
+
+    private void sendKeysToInput(CharSequence... keys) {
+        // ensure mouse is located over the ComboBox to avoid hover issues
+        new Actions(getDriver()).moveToElement(comboBox).perform();
+        comboBox.sendKeys(keys);
+    }
+}