diff options
-rw-r--r-- | server/src/main/java/com/vaadin/data/Binder.java | 55 | ||||
-rw-r--r-- | server/src/test/java/com/vaadin/data/BinderTest.java | 9 |
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 |