diff options
author | Leif Åstrand <leif@vaadin.com> | 2016-11-22 09:33:11 +0200 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2016-11-29 10:18:54 +0000 |
commit | 0d57c15577f5d5e15453024ce90144120948eae9 (patch) | |
tree | 2c15be36daeaf87e379ac73101a2c631888a9496 /server | |
parent | f2d8f812efa067b4baa7e27c0ea76f7596b291e6 (diff) | |
download | vaadin-framework-0d57c15577f5d5e15453024ce90144120948eae9.tar.gz vaadin-framework-0d57c15577f5d5e15453024ce90144120948eae9.zip |
Make it possible to reset single select values
Change-Id: I60c5d9f183d1955fbbd3341e3ac9f93aae755f80
Diffstat (limited to 'server')
-rw-r--r-- | server/src/main/java/com/vaadin/ui/AbstractSingleSelect.java | 8 | ||||
-rw-r--r-- | server/src/main/java/com/vaadin/ui/ComboBox.java | 18 | ||||
-rw-r--r-- | server/src/test/java/com/vaadin/ui/ComboBoxTest.java | 48 |
3 files changed, 74 insertions, 0 deletions
diff --git a/server/src/main/java/com/vaadin/ui/AbstractSingleSelect.java b/server/src/main/java/com/vaadin/ui/AbstractSingleSelect.java index 6510b5305a..81126f3189 100644 --- a/server/src/main/java/com/vaadin/ui/AbstractSingleSelect.java +++ b/server/src/main/java/com/vaadin/ui/AbstractSingleSelect.java @@ -39,6 +39,8 @@ import com.vaadin.ui.declarative.DesignContext; import com.vaadin.ui.declarative.DesignException; import com.vaadin.util.ReflectTools; +import elemental.json.Json; + /** * An abstract base class for listing components that only support single * selection and no lazy loading of data items. @@ -241,6 +243,12 @@ public abstract class AbstractSingleSelect<T> extends AbstractListing<T> } doSetSelectedKey(key); + + // Update diffstate so that a change will be sent to the client if the + // selection is changed to its original value + updateDiffstate("selectedItemKey", + key == null ? Json.createNull() : Json.create(key)); + fireEvent(new SingleSelectionEvent<>(AbstractSingleSelect.this, true)); } diff --git a/server/src/main/java/com/vaadin/ui/ComboBox.java b/server/src/main/java/com/vaadin/ui/ComboBox.java index 22e6a698eb..b958ca9c32 100644 --- a/server/src/main/java/com/vaadin/ui/ComboBox.java +++ b/server/src/main/java/com/vaadin/ui/ComboBox.java @@ -52,6 +52,7 @@ import com.vaadin.ui.declarative.DesignAttributeHandler; import com.vaadin.ui.declarative.DesignContext; import com.vaadin.ui.declarative.DesignFormatter; +import elemental.json.Json; import elemental.json.JsonObject; /** @@ -670,4 +671,21 @@ public class ComboBox<T> extends AbstractSingleSelect<T> // ComboBox. return (DataCommunicator<T, String>) super.getDataCommunicator(); } + + @Override + protected void setSelectedFromClient(String key) { + super.setSelectedFromClient(key); + + /* + * The client side for combo box always expects a state change for + * selectedItemKey after it has sent a selection change. This means that + * we must store a value in the diffstate that guarantees that a new + * value will be sent, regardless of what the value actually is at the + * time when changes are sent. + * + * Keys are always strings (or null), so using a non-string type will + * always trigger a diff mismatch and a resend. + */ + updateDiffstate("selectedItemKey", Json.create(0)); + } } diff --git a/server/src/test/java/com/vaadin/ui/ComboBoxTest.java b/server/src/test/java/com/vaadin/ui/ComboBoxTest.java new file mode 100644 index 0000000000..36b29fdd7a --- /dev/null +++ b/server/src/test/java/com/vaadin/ui/ComboBoxTest.java @@ -0,0 +1,48 @@ +/* + * Copyright 2000-2016 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.ui; + +import org.junit.Test; + +import com.vaadin.shared.data.selection.SelectionServerRpc; +import com.vaadin.tests.util.MockUI; + +public class ComboBoxTest { + + @Test + public void testResetValue() { + ComboBox<String> comboBox = new ComboBox<>(); + comboBox.setItems("one", "two"); + + // Reset value whenever it changes (in a real case, this listener would + // do something with the selected value before discarding it) + comboBox.addValueChangeListener(e -> comboBox.setValue(null)); + + // "Attach" the component and initialize diffstate + new MockUI().setContent(comboBox); + ComponentTest.syncToClient(comboBox); + + // Emulate selection of "one" + String oneKey = comboBox.getDataCommunicator().getKeyMapper() + .key("one"); + ComponentTest.getRpcProxy(comboBox, SelectionServerRpc.class) + .select(oneKey); + + ComponentTest.assertEncodedStateProperties(comboBox, + "Selection change done by the listener should be sent to the client", + "selectedItemKey"); + } +} |