aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Hyvönen <pekka@vaadin.com>2017-11-22 12:36:07 +0200
committerTeemu Suo-Anttila <tsuoanttila@users.noreply.github.com>2017-11-27 10:43:45 +0200
commit8c94bd5825d06fd602436d9908d56a8729b514df (patch)
tree3c6a1f7b71ceb535203269fe74623243b9d3c25b
parentc75bca44962893fba9c767e5d216ac6e59cc03a9 (diff)
downloadvaadin-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
-rw-r--r--client/src/main/java/com/vaadin/client/ui/VCheckBoxGroup.java4
-rw-r--r--client/src/main/java/com/vaadin/client/ui/VRadioButtonGroup.java12
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/checkbox/CheckBoxGroupTestUI.java19
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/radiobutton/RadioButtonGroupTestUI.java16
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/checkboxgroup/CheckBoxGroupTest.java95
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/radiobuttongroup/RadioButtonGroupTest.java89
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"));
+ }
}