From 948b14bd93064e30481ccb23a6197f557a880d5a Mon Sep 17 00:00:00 2001 From: Pekka Hyvönen Date: Tue, 21 Feb 2017 14:26:30 +0200 Subject: Fix null caption for NativeSelect and ComboBox (#8633) * Fix null caption for NativeSelect and ComboBox Unified the null caption converting to empty string, as it was with other selects supporting item caption generator. Fixes #8630 --- server/src/main/java/com/vaadin/ui/ComboBox.java | 7 +- .../java/com/vaadin/ui/ItemCaptionGenerator.java | 3 +- .../src/main/java/com/vaadin/ui/NativeSelect.java | 10 ++- .../server/component/ItemCaptionGeneratorTest.java | 85 ++++++++++++++++++++++ 4 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 server/src/test/java/com/vaadin/tests/server/component/ItemCaptionGeneratorTest.java (limited to 'server/src') diff --git a/server/src/main/java/com/vaadin/ui/ComboBox.java b/server/src/main/java/com/vaadin/ui/ComboBox.java index 54a3eea430..62e7ef7751 100644 --- a/server/src/main/java/com/vaadin/ui/ComboBox.java +++ b/server/src/main/java/com/vaadin/ui/ComboBox.java @@ -240,8 +240,11 @@ public class ComboBox extends AbstractSingleSelect registerRpc(new FocusAndBlurServerRpcDecorator(this, this::fireEvent)); addDataGenerator((T data, JsonObject jsonObject) -> { - jsonObject.put(DataCommunicatorConstants.NAME, - getItemCaptionGenerator().apply(data)); + String caption = getItemCaptionGenerator().apply(data); + if (caption == null) { + caption = ""; + } + jsonObject.put(DataCommunicatorConstants.NAME, caption); String style = itemStyleGenerator.apply(data); if (style != null) { jsonObject.put(ComboBoxConstants.STYLE, style); diff --git a/server/src/main/java/com/vaadin/ui/ItemCaptionGenerator.java b/server/src/main/java/com/vaadin/ui/ItemCaptionGenerator.java index d4117c195b..13de27cdd6 100644 --- a/server/src/main/java/com/vaadin/ui/ItemCaptionGenerator.java +++ b/server/src/main/java/com/vaadin/ui/ItemCaptionGenerator.java @@ -36,7 +36,8 @@ public interface ItemCaptionGenerator * * @param item * the item to get caption for - * @return the caption of the item; not {@code null} + * @return the caption of the item; {@code null} will be shown as an empty + * string */ @Override String apply(T item); diff --git a/server/src/main/java/com/vaadin/ui/NativeSelect.java b/server/src/main/java/com/vaadin/ui/NativeSelect.java index 2c994b8384..4d08aacd12 100644 --- a/server/src/main/java/com/vaadin/ui/NativeSelect.java +++ b/server/src/main/java/com/vaadin/ui/NativeSelect.java @@ -52,9 +52,13 @@ public class NativeSelect extends AbstractSingleSelect */ public NativeSelect() { registerRpc(new FocusAndBlurServerRpcDecorator(this, this::fireEvent)); - addDataGenerator( - (item, json) -> json.put(DataCommunicatorConstants.DATA, - getItemCaptionGenerator().apply(item))); + addDataGenerator((item, json) -> { + String caption = getItemCaptionGenerator().apply(item); + if (caption == null) { + caption = ""; + } + json.put(DataCommunicatorConstants.DATA, caption); + }); setItemCaptionGenerator(String::valueOf); } diff --git a/server/src/test/java/com/vaadin/tests/server/component/ItemCaptionGeneratorTest.java b/server/src/test/java/com/vaadin/tests/server/component/ItemCaptionGeneratorTest.java new file mode 100644 index 0000000000..1f80e46476 --- /dev/null +++ b/server/src/test/java/com/vaadin/tests/server/component/ItemCaptionGeneratorTest.java @@ -0,0 +1,85 @@ +package com.vaadin.tests.server.component; + +import java.util.ArrayList; +import java.util.Collection; + +import org.junit.Assert; +import org.junit.Test; + +import com.vaadin.data.provider.DataGenerator; +import com.vaadin.shared.data.DataCommunicatorConstants; +import com.vaadin.shared.ui.ListingJsonConstants; +import com.vaadin.ui.AbstractListing; +import com.vaadin.ui.CheckBoxGroup; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.ListSelect; +import com.vaadin.ui.NativeSelect; +import com.vaadin.ui.RadioButtonGroup; +import com.vaadin.ui.TwinColSelect; + +import elemental.json.JsonObject; + +public class ItemCaptionGeneratorTest { + + private static class TestDataGenerator implements DataGenerator { + JsonObject generated = null; + + @Override + public void generateData(Object item, JsonObject jsonObject) { + generated = jsonObject; + } + + } + + @Test + public void testItemCaptionGenerator_nullCaptionGiven_convertedToEmptyString() { + Collection> listings = new ArrayList<>(); + + ComboBox comboBox = new ComboBox<>(); + comboBox.setData(DataCommunicatorConstants.NAME); + comboBox.setItemCaptionGenerator(item -> null); + listings.add(comboBox); + + CheckBoxGroup cbg = new CheckBoxGroup<>(); + cbg.setData(ListingJsonConstants.JSONKEY_ITEM_VALUE); + cbg.setItemCaptionGenerator(item -> null); + listings.add(cbg); + + ListSelect listSelect = new ListSelect<>(); + listSelect.setData(ListingJsonConstants.JSONKEY_ITEM_VALUE); + listSelect.setItemCaptionGenerator(item -> null); + listings.add(listSelect); + + NativeSelect nativeSelect = new NativeSelect<>(); + nativeSelect.setData(DataCommunicatorConstants.DATA); + nativeSelect.setItemCaptionGenerator(item -> null); + listings.add(nativeSelect); + + RadioButtonGroup rbg = new RadioButtonGroup<>(); + rbg.setData(ListingJsonConstants.JSONKEY_ITEM_VALUE); + rbg.setItemCaptionGenerator(item -> null); + listings.add(rbg); + + TwinColSelect tc = new TwinColSelect<>(); + tc.setData(ListingJsonConstants.JSONKEY_ITEM_VALUE); + tc.setItemCaptionGenerator(item -> null); + listings.add(tc); + + for (AbstractListing listing : listings) { + listing.setItems("Uno"); + TestDataGenerator dataGenerator = new TestDataGenerator(); + listing.getDataCommunicator().addDataGenerator(dataGenerator); + listing.getDataCommunicator().beforeClientResponse(true); + + Assert.assertEquals( + listing.getClass().getName() + + " does not convert null caption from generator to empty string", + "", + dataGenerator.generated.hasKey((String) listing.getData()) + ? dataGenerator.generated.getString( + (String) listing.getData()) + : null); + } + } + +} -- cgit v1.2.3