diff options
author | Pekka Hyvönen <pekka@vaadin.com> | 2017-11-22 12:36:07 +0200 |
---|---|---|
committer | Teemu Suo-Anttila <tsuoanttila@users.noreply.github.com> | 2017-11-27 10:43:45 +0200 |
commit | 8c94bd5825d06fd602436d9908d56a8729b514df (patch) | |
tree | 3c6a1f7b71ceb535203269fe74623243b9d3c25b | |
parent | c75bca44962893fba9c767e5d216ac6e59cc03a9 (diff) | |
download | vaadin-framework-8c94bd5825d06fd602436d9908d56a8729b514df.tar.gz vaadin-framework-8c94bd5825d06fd602436d9908d56a8729b514df.zip |
Fix missing v-disabled for RadioButtonGroup and CheckBoxGroup options (#10332)
* Fix missing v-disabled for RadioButtonGroup
* Fix missing v-disabled for CheckBoxGroup
Resolves #9258
6 files changed, 233 insertions, 2 deletions
diff --git a/client/src/main/java/com/vaadin/client/ui/VCheckBoxGroup.java b/client/src/main/java/com/vaadin/client/ui/VCheckBoxGroup.java index ee1d83ee2c..9131dec622 100644 --- a/client/src/main/java/com/vaadin/client/ui/VCheckBoxGroup.java +++ b/client/src/main/java/com/vaadin/client/ui/VCheckBoxGroup.java @@ -30,6 +30,7 @@ import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.Widget; import com.vaadin.client.ApplicationConnection; import com.vaadin.client.BrowserInfo; +import com.vaadin.client.StyleConstants; import com.vaadin.client.WidgetUtil; import com.vaadin.client.widgets.FocusableFlowPanelComposite; import com.vaadin.shared.Registration; @@ -171,6 +172,9 @@ public class VCheckBoxGroup extends FocusableFlowPanelComposite .getBoolean(ListingJsonConstants.JSONKEY_ITEM_DISABLED); boolean enabled = optionEnabled && !isReadonly() && isEnabled(); checkBox.setEnabled(enabled); + // #9258 apply the v-disabled class when disabled for UX + checkBox.setStyleName(StyleConstants.DISABLED, + !isEnabled() || !optionEnabled); } public boolean isHtmlContentAllowed() { diff --git a/client/src/main/java/com/vaadin/client/ui/VRadioButtonGroup.java b/client/src/main/java/com/vaadin/client/ui/VRadioButtonGroup.java index 1386005351..76deeb5b55 100644 --- a/client/src/main/java/com/vaadin/client/ui/VRadioButtonGroup.java +++ b/client/src/main/java/com/vaadin/client/ui/VRadioButtonGroup.java @@ -32,6 +32,7 @@ import com.google.gwt.user.client.ui.RadioButton; import com.google.gwt.user.client.ui.Widget; import com.vaadin.client.ApplicationConnection; import com.vaadin.client.BrowserInfo; +import com.vaadin.client.StyleConstants; import com.vaadin.client.WidgetUtil; import com.vaadin.client.widgets.FocusableFlowPanelComposite; import com.vaadin.shared.Registration; @@ -131,6 +132,10 @@ public class VRadioButtonGroup extends FocusableFlowPanelComposite .getBoolean(ListingJsonConstants.JSONKEY_ITEM_DISABLED); boolean enabled = optionEnabled && !isReadonly() && isEnabled(); button.setEnabled(enabled); + // #9258 apply the v-disabled class when disabled for UX + button.setStyleName(StyleConstants.DISABLED, + !isEnabled() || !optionEnabled); + String key = item.getString(DataCommunicatorConstants.KEY); if (requireInitialization) { @@ -181,9 +186,12 @@ public class VRadioButtonGroup extends FocusableFlowPanelComposite .entrySet()) { RadioButton radioButton = entry.getKey(); JsonObject value = entry.getValue(); - Boolean isOptionEnabled = !value + boolean optionEnabled = !value .getBoolean(ListingJsonConstants.JSONKEY_ITEM_DISABLED); - radioButton.setEnabled(radioButtonEnabled && isOptionEnabled); + radioButton.setEnabled(radioButtonEnabled && optionEnabled); + // #9258 apply the v-disabled class when disabled for UX + radioButton.setStyleName(StyleConstants.DISABLED, + !isEnabled() || !optionEnabled); } } diff --git a/uitest/src/main/java/com/vaadin/tests/components/checkbox/CheckBoxGroupTestUI.java b/uitest/src/main/java/com/vaadin/tests/components/checkbox/CheckBoxGroupTestUI.java index 88006fd68a..6bfdb6c414 100644 --- a/uitest/src/main/java/com/vaadin/tests/components/checkbox/CheckBoxGroupTestUI.java +++ b/uitest/src/main/java/com/vaadin/tests/components/checkbox/CheckBoxGroupTestUI.java @@ -15,7 +15,12 @@ */ package com.vaadin.tests.components.checkbox; + +import java.util.LinkedHashMap; +import java.util.Objects; + import com.vaadin.icons.VaadinIcons; +import com.vaadin.server.SerializablePredicate; import com.vaadin.tests.components.abstractlisting.AbstractMultiSelectTestUI; import com.vaadin.ui.CheckBoxGroup; import com.vaadin.ui.IconGenerator; @@ -49,6 +54,7 @@ public class CheckBoxGroupTestUI protected void createActions() { super.createActions(); createItemIconGenerator(); + createItemEnabledProviderMenu(); } private void createItemIconGenerator() { @@ -56,6 +62,19 @@ public class CheckBoxGroupTestUI this::useItemIconProvider); } + private void createItemEnabledProviderMenu() { + LinkedHashMap<String, SerializablePredicate<Object>> options = new LinkedHashMap<>(); + options.put("Disable Item 0", o -> !Objects.equals(o, "Item 0")); + options.put("Disable Item 3", o -> !Objects.equals(o, "Item 3")); + options.put("Disable Item 5", o -> !Objects.equals(o, "Item 5")); + + createSelectAction("Item Enabled Provider", "Item Enabled Provider", + options, "None", (checkBoxGroup, generator, data) -> { + checkBoxGroup.setItemEnabledProvider(generator); + checkBoxGroup.getDataProvider().refreshAll(); + }, true); + } + private void useItemIconProvider(CheckBoxGroup<Object> group, boolean activate, Object data) { if (activate) { diff --git a/uitest/src/main/java/com/vaadin/tests/components/radiobutton/RadioButtonGroupTestUI.java b/uitest/src/main/java/com/vaadin/tests/components/radiobutton/RadioButtonGroupTestUI.java index 20314fd347..58da9add1b 100644 --- a/uitest/src/main/java/com/vaadin/tests/components/radiobutton/RadioButtonGroupTestUI.java +++ b/uitest/src/main/java/com/vaadin/tests/components/radiobutton/RadioButtonGroupTestUI.java @@ -16,9 +16,11 @@ package com.vaadin.tests.components.radiobutton; import java.util.LinkedHashMap; +import java.util.Objects; import java.util.stream.IntStream; import com.vaadin.icons.VaadinIcons; +import com.vaadin.server.SerializablePredicate; import com.vaadin.tests.components.abstractlisting.AbstractListingTestUI; import com.vaadin.ui.ItemCaptionGenerator; import com.vaadin.ui.RadioButtonGroup; @@ -46,6 +48,7 @@ public class RadioButtonGroupTestUI createSelectionMenu(); createItemIconGeneratorMenu(); createItemCaptionGeneratorMenu(); + createItemEnabledProviderMenu(); } protected void createSelectionMenu() { @@ -92,6 +95,19 @@ public class RadioButtonGroupTestUI }, true); } + private void createItemEnabledProviderMenu() { + LinkedHashMap<String, SerializablePredicate<Object>> options = new LinkedHashMap<>(); + options.put("Disable Item 0", o -> !Objects.equals(o, "Item 0")); + options.put("Disable Item 3", o -> !Objects.equals(o, "Item 3")); + options.put("Disable Item 5", o -> !Objects.equals(o, "Item 5")); + + createSelectAction("Item Enabled Provider", "Item Enabled Provider", + options, "None", (radioButtonGroup, generator, data) -> { + radioButtonGroup.setItemEnabledProvider(generator); + radioButtonGroup.getDataProvider().refreshAll(); + }, true); + } + private void toggleSelection(String item) { if (getComponent().isSelected(item)) { getComponent().setValue(null); diff --git a/uitest/src/test/java/com/vaadin/tests/components/checkboxgroup/CheckBoxGroupTest.java b/uitest/src/test/java/com/vaadin/tests/components/checkboxgroup/CheckBoxGroupTest.java index 5d7c37c754..bed3d24f09 100644 --- a/uitest/src/test/java/com/vaadin/tests/components/checkboxgroup/CheckBoxGroupTest.java +++ b/uitest/src/test/java/com/vaadin/tests/components/checkboxgroup/CheckBoxGroupTest.java @@ -269,4 +269,99 @@ public class CheckBoxGroupTest extends MultiBrowserTest { } } + @Test // #9258 + public void disabled_correctClassNamesApplied() { + openTestURL("theme=valo"); + selectMenuPath("Component", "State", "Enabled"); + + List<WebElement> options = getSelect().findElements(By.tagName("span")); + Assert.assertTrue(options.size() > 0); + options.stream().map(element -> element.getAttribute("className")) + .forEach(className -> verifyCheckboxDisabledClassNames( + className, true)); + + selectMenuPath("Component", "State", "Enabled"); + + options = getSelect().findElements(By.tagName("span")); + Assert.assertTrue(options.size() > 0); + verifyCheckboxDisabledClassNames( + options.remove(10).getAttribute("className"), true); + + options.stream().map(element -> element.getAttribute("className")) + .forEach(className -> verifyCheckboxDisabledClassNames( + className, false)); + } + + @Test // #9258 + public void itemDisabledWithEnabledProvider_correctClassNamesApplied() { + openTestURL("theme=valo"); + + List<WebElement> options = getSelect().findElements(By.tagName("span")); + + Assert.assertTrue(options.size() > 0); + verifyCheckboxDisabledClassNames( + options.remove(10).getAttribute("className"), true); + options.stream().map(element -> element.getAttribute("className")) + .forEach(cs -> verifyCheckboxDisabledClassNames(cs, false)); + + selectMenuPath("Component", "Item Enabled Provider", + "Item Enabled Provider", "Disable Item 0"); + + options = getSelect().findElements(By.tagName("span")); + String className = options.get(0).getAttribute("className"); + verifyCheckboxDisabledClassNames(className, true); + verifyCheckboxDisabledClassNames( + options.remove(10).getAttribute("className"), false); + + selectMenuPath("Component", "Item Enabled Provider", + "Item Enabled Provider", "Disable Item 3"); + + className = getSelect().findElements(By.tagName("span")).get(0) + .getAttribute("className"); + verifyCheckboxDisabledClassNames(className, false); + + className = getSelect().findElements(By.tagName("span")).get(3) + .getAttribute("className"); + verifyCheckboxDisabledClassNames(className, true); + + selectMenuPath("Component", "State", "Enabled"); + + options = getSelect().findElements(By.tagName("span")); + + Assert.assertTrue(options.size() > 0); + options.stream().map(element -> element.getAttribute("className")) + .forEach(cs -> verifyCheckboxDisabledClassNames(cs, true)); + + selectMenuPath("Component", "Item Enabled Provider", + "Item Enabled Provider", "Disable Item 5"); + + options = getSelect().findElements(By.tagName("span")); + + Assert.assertTrue(options.size() > 0); + options.stream().map(element -> element.getAttribute("className")) + .forEach(cs -> verifyCheckboxDisabledClassNames(cs, true)); + + selectMenuPath("Component", "State", "Enabled"); + + options = getSelect().findElements(By.tagName("span")); + className = options.remove(5).getAttribute("className"); + + Assert.assertTrue(options.size() > 0); + options.stream().map(element -> element.getAttribute("className")) + .forEach(cs -> verifyCheckboxDisabledClassNames(cs, false)); + verifyCheckboxDisabledClassNames(className, true); + } + + private static void verifyCheckboxDisabledClassNames(String className, + boolean disabled) { + Assert.assertEquals( + disabled ? "No" + : "Extra" + " v-checkbox-disabled class, was " + + className, + disabled, className.contains("v-checkbox-disabled")); + Assert.assertEquals( + disabled ? "No" + : "Extra" + " v-disabled class, was " + className, + disabled, className.contains("v-disabled")); + } } diff --git a/uitest/src/test/java/com/vaadin/tests/components/radiobuttongroup/RadioButtonGroupTest.java b/uitest/src/test/java/com/vaadin/tests/components/radiobuttongroup/RadioButtonGroupTest.java index 2c53903d29..f85d7569e1 100644 --- a/uitest/src/test/java/com/vaadin/tests/components/radiobuttongroup/RadioButtonGroupTest.java +++ b/uitest/src/test/java/com/vaadin/tests/components/radiobuttongroup/RadioButtonGroupTest.java @@ -119,6 +119,82 @@ public class RadioButtonGroupTest extends MultiBrowserTest { Assert.assertEquals(lastLogRow, getLogRow(0)); } + @Test // #9258 + public void disabled_correctClassNamesApplied() { + openTestURL("theme=valo"); + selectMenuPath("Component", "State", "Enabled"); + + List<WebElement> options = getSelect().findElements(By.tagName("span")); + Assert.assertTrue(options.size() > 0); + options.stream().map(element -> element.getAttribute("className")) + .forEach(className -> verifyRadioButtonDisabledClassNames( + className, true)); + + selectMenuPath("Component", "State", "Enabled"); + + options = getSelect().findElements(By.tagName("span")); + Assert.assertTrue(options.size() > 0); + options.stream().map(element -> element.getAttribute("className")) + .forEach(className -> verifyRadioButtonDisabledClassNames( + className, false)); + } + + @Test // #9258 + public void itemDisabledWithEnabledProvider_correctClassNamesApplied() { + openTestURL("theme=valo"); + + List<WebElement> options = getSelect().findElements(By.tagName("span")); + + Assert.assertTrue(options.size() > 0); + options.stream().map(element -> element.getAttribute("className")) + .forEach(cs -> verifyRadioButtonDisabledClassNames(cs, false)); + + selectMenuPath("Component", "Item Enabled Provider", + "Item Enabled Provider", "Disable Item 0"); + + String className = getSelect().findElements(By.tagName("span")).get(0) + .getAttribute("className"); + verifyRadioButtonDisabledClassNames(className, true); + + selectMenuPath("Component", "Item Enabled Provider", + "Item Enabled Provider", "Disable Item 3"); + + className = getSelect().findElements(By.tagName("span")).get(0) + .getAttribute("className"); + verifyRadioButtonDisabledClassNames(className, false); + + className = getSelect().findElements(By.tagName("span")).get(3) + .getAttribute("className"); + verifyRadioButtonDisabledClassNames(className, true); + + selectMenuPath("Component", "State", "Enabled"); + + options = getSelect().findElements(By.tagName("span")); + + Assert.assertTrue(options.size() > 0); + options.stream().map(element -> element.getAttribute("className")) + .forEach(cs -> verifyRadioButtonDisabledClassNames(cs, true)); + + selectMenuPath("Component", "Item Enabled Provider", + "Item Enabled Provider", "Disable Item 5"); + + options = getSelect().findElements(By.tagName("span")); + + Assert.assertTrue(options.size() > 0); + options.stream().map(element -> element.getAttribute("className")) + .forEach(cs -> verifyRadioButtonDisabledClassNames(cs, true)); + + selectMenuPath("Component", "State", "Enabled"); + + options = getSelect().findElements(By.tagName("span")); + className = options.remove(5).getAttribute("className"); + + Assert.assertTrue(options.size() > 0); + options.stream().map(element -> element.getAttribute("className")) + .forEach(cs -> verifyRadioButtonDisabledClassNames(cs, false)); + verifyRadioButtonDisabledClassNames(className, true); + } + @Test public void itemIconGenerator() { selectMenuPath("Component", "Item Icon Generator", @@ -223,4 +299,17 @@ public class RadioButtonGroupTest extends MultiBrowserTest { } assertEquals("Number of items", count, i); } + + private static void verifyRadioButtonDisabledClassNames(String className, + boolean disabled) { + Assert.assertEquals( + disabled ? "No" + : "Extra" + " v-radiobutton-disabled class, was " + + className, + disabled, className.contains("v-radiobutton-disabled")); + Assert.assertEquals( + disabled ? "No" + : "Extra" + " v-disabled class, was " + className, + disabled, className.contains("v-disabled")); + } } |