aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorTatu Lund <tatu@vaadin.com>2019-12-02 11:08:01 +0200
committerAnna Koskinen <Ansku@users.noreply.github.com>2019-12-02 11:08:01 +0200
commit252ef116342a6b0363b48d157de33a932d44752f (patch)
treef774cbb0be756ee6cd38e5c02c5c6238f456e2f8 /server
parentdda9b052604967b8d8cfec5c20d06e72f6f78d33 (diff)
downloadvaadin-framework-252ef116342a6b0363b48d157de33a932d44752f.tar.gz
vaadin-framework-252ef116342a6b0363b48d157de33a932d44752f.zip
Make asRequired conditional on binding.setAsRequiredEnabled(..) (#11834)
It is a very common use case in complex form that whether a field is required or not, it depends on input on other fields. Hypothetical use case sample could be that we have form for a Product and price of the product is needed except in case the Product's type is Sample. So in that kind of scenarios it would be needed to turn off asRequired() validation easily. The purpose of this enhancement and new binding.setAsRequiredEnabled(..) API is to help implementation of this kind of use cases more easily. https://github.com/vaadin/framework/issues/10709
Diffstat (limited to 'server')
-rw-r--r--server/src/main/java/com/vaadin/data/Binder.java55
-rw-r--r--server/src/test/java/com/vaadin/data/BinderTest.java9
2 files changed, 60 insertions, 4 deletions
diff --git a/server/src/main/java/com/vaadin/data/Binder.java b/server/src/main/java/com/vaadin/data/Binder.java
index 747983bfa5..cd7b834571 100644
--- a/server/src/main/java/com/vaadin/data/Binder.java
+++ b/server/src/main/java/com/vaadin/data/Binder.java
@@ -226,6 +226,30 @@ public class Binder<BEAN> implements Serializable {
* @since 8.4
*/
public Setter<BEAN, TARGET> getSetter();
+
+ /**
+ * Enable or disable asRequired validator.
+ * The validator is enabled by default.
+ *
+ * @see #asRequired(String)
+ * @see #asRequired(ErrorMessageProvider)
+ *
+ * @param asRequiredEnabled
+ * {@code false} if asRequired validator should
+ * be disabled, {@code true} otherwise (default)
+ */
+ public void setAsRequiredEnabled(boolean asRequiredEnabled);
+
+ /**
+ * Returns whether asRequired validator is currently enabled or not
+ *
+ * @see #asRequired(String)
+ * @see #asRequired(ErrorMessageProvider)
+ *
+ * @return {@code false} if asRequired validator is disabled
+ * {@code true} otherwise (default)
+ */
+ public boolean isAsRequiredEnabled();
}
/**
@@ -781,6 +805,8 @@ public class Binder<BEAN> implements Serializable {
*/
private Converter<FIELDVALUE, ?> converterValidatorChain;
+ private boolean asRequiredSet;
+
/**
* Creates a new binding builder associated with the given field.
* Initializes the builder with the given converter chain and status
@@ -917,8 +943,14 @@ public class Binder<BEAN> implements Serializable {
public BindingBuilder<BEAN, TARGET> asRequired(
Validator<TARGET> customRequiredValidator) {
checkUnbound();
+ this.asRequiredSet = true;
field.setRequiredIndicatorVisible(true);
- return withValidator(customRequiredValidator);
+ return withValidator((value, context) -> {
+ if (!field.isRequiredIndicatorVisible())
+ return ValidationResult.ok();
+ else
+ return customRequiredValidator.apply(value, context);
+ });
}
/**
@@ -1020,12 +1052,15 @@ public class Binder<BEAN> implements Serializable {
*/
private final Converter<FIELDVALUE, TARGET> converterValidatorChain;
+ private boolean asRequiredSet;
+
public BindingImpl(BindingBuilderImpl<BEAN, FIELDVALUE, TARGET> builder,
ValueProvider<BEAN, TARGET> getter,
Setter<BEAN, TARGET> setter) {
this.binder = builder.getBinder();
this.field = builder.field;
this.statusHandler = builder.statusHandler;
+ this.asRequiredSet = builder.asRequiredSet;
converterValidatorChain = ((Converter<FIELDVALUE, TARGET>) builder.converterValidatorChain);
onValueChange = getField()
@@ -1282,6 +1317,24 @@ public class Binder<BEAN> implements Serializable {
public Setter<BEAN, TARGET> getSetter() {
return setter;
}
+
+ @Override
+ public void setAsRequiredEnabled(boolean asRequiredEnabled) {
+ if (!asRequiredSet) {
+ throw new IllegalStateException(
+ "Unable to toggle asRequired validation since "
+ + "asRequired has not been set.");
+ }
+ if (asRequiredEnabled != isAsRequiredEnabled()) {
+ field.setRequiredIndicatorVisible(asRequiredEnabled);
+ validate();
+ }
+ }
+
+ @Override
+ public boolean isAsRequiredEnabled() {
+ return field.isRequiredIndicatorVisible();
+ }
}
/**
diff --git a/server/src/test/java/com/vaadin/data/BinderTest.java b/server/src/test/java/com/vaadin/data/BinderTest.java
index 401cc07017..b3fe5a8194 100644
--- a/server/src/test/java/com/vaadin/data/BinderTest.java
+++ b/server/src/test/java/com/vaadin/data/BinderTest.java
@@ -473,13 +473,13 @@ public class BinderTest extends BinderTestBase<Binder<Person>, Person> {
TextField textField = new TextField();
assertFalse(textField.isRequiredIndicatorVisible());
- BindingBuilder<Person, String> binding = binder.forField(textField);
+ BindingBuilder<Person, String> bindingBuilder = binder.forField(textField);
assertFalse(textField.isRequiredIndicatorVisible());
- binding.asRequired("foobar");
+ bindingBuilder.asRequired("foobar");
assertTrue(textField.isRequiredIndicatorVisible());
- binding.bind(Person::getFirstName, Person::setFirstName);
+ Binding<Person, String> binding = bindingBuilder.bind(Person::getFirstName, Person::setFirstName);
binder.setBean(item);
assertNull(textField.getErrorMessage());
@@ -491,6 +491,9 @@ public class BinderTest extends BinderTestBase<Binder<Person>, Person> {
textField.setValue("value");
assertNull(textField.getErrorMessage());
assertTrue(textField.isRequiredIndicatorVisible());
+
+ binding.setAsRequiredEnabled(false);
+ assertFalse(textField.isRequiredIndicatorVisible());
}
@Test