diff --git a/flow-data/src/main/java/com/vaadin/flow/data/binder/Binder.java b/flow-data/src/main/java/com/vaadin/flow/data/binder/Binder.java index ede4025b425..ed6dc3a130a 100644 --- a/flow-data/src/main/java/com/vaadin/flow/data/binder/Binder.java +++ b/flow-data/src/main/java/com/vaadin/flow/data/binder/Binder.java @@ -1227,7 +1227,8 @@ public BindingImpl(BindingBuilderImpl builder, onValueChange = getField().addValueChangeListener( event -> handleFieldValueChange(event)); - if (getField() instanceof HasValidator) { + if (getBinder().isFieldsValidationStatusChangeListenerEnabled() + && getField() instanceof HasValidator) { HasValidator hasValidatorField = (HasValidator) getField(); onValidationStatusChange = hasValidatorField .addValidationStatusChangeListener( @@ -1685,6 +1686,8 @@ void setIdentity() { private boolean validatorsDisabled = false; + private boolean fieldsValidationStatusChangeListenerEnabled = true; + /** * Creates a binder using a custom {@link PropertySet} implementation for * finding and resolving property names for @@ -3527,6 +3530,30 @@ public boolean isValidatorsDisabled() { return validatorsDisabled; } + /** + * Control whether bound fields implementing {@link HasValidator} subscribe + * for field's {@code ValidationStatusChangeEvent}s and will + * {@code validate} upon receiving them. + * + * @param fieldsValidationStatusChangeListenerEnabled + * Boolean value. + */ + public void setFieldsValidationStatusChangeListenerEnabled( + boolean fieldsValidationStatusChangeListenerEnabled) { + this.fieldsValidationStatusChangeListenerEnabled = fieldsValidationStatusChangeListenerEnabled; + } + + /** + * Returns if the bound fields implementing {@link HasValidator} subscribe + * for field's {@code ValidationStatusChangeEvent}s and will + * {@code validate} upon receiving them. + * + * @return Boolean value + */ + public boolean isFieldsValidationStatusChangeListenerEnabled() { + return fieldsValidationStatusChangeListenerEnabled; + } + /** * Sets a {@code handler} to customize the {@link RuntimeException} thrown * by delegates (like {@link Setter}, {@link ValueProvider}, diff --git a/flow-data/src/test/java/com/vaadin/flow/data/binder/BinderValidationStatusChangeListenerTest.java b/flow-data/src/test/java/com/vaadin/flow/data/binder/BinderValidationStatusChangeListenerTest.java index 92511bb6d21..0ba93d4747a 100644 --- a/flow-data/src/test/java/com/vaadin/flow/data/binder/BinderValidationStatusChangeListenerTest.java +++ b/flow-data/src/test/java/com/vaadin/flow/data/binder/BinderValidationStatusChangeListenerTest.java @@ -64,6 +64,16 @@ public void fieldWithHasValidatorDefaults_bindIsCalled_addValidationStatusListen .addValidationStatusChangeListener(Mockito.any()); } + @Test + public void binderWithFieldsValidationStatusChangeListenerDisabled_bindIsCalled_noValidationStatusListenerIsCalled() { + binder.setFieldsValidationStatusChangeListenerEnabled(false); + var field = Mockito.spy( + TestHasValidatorDatePicker.DatePickerHasValidatorDefaults.class); + binder.bind(field, BIRTH_DATE_PROPERTY); + Mockito.verify(field, Mockito.never()) + .addValidationStatusChangeListener(Mockito.any()); + } + @Test public void fieldWithHasValidatorOnlyGetDefaultValidatorOverridden_bindIsCalled_addValidationStatusListenerIsCalled() { var field = Mockito.spy( @@ -102,6 +112,17 @@ public void fieldWithHasValidatorFullyOverridden_fieldValidationStatusChangesToF Assert.assertEquals(INVALID_DATE_FORMAT, componentErrors.get(field)); } + @Test + public void binderWithFieldsValidationStatusChangeListenerDisabled_fieldValidationStatusChangesToFalse_binderHandleErrorIsNotCalled() { + binder.setFieldsValidationStatusChangeListenerEnabled(false); + var field = new TestHasValidatorDatePicker.DataPickerHasValidatorOverridden(); + binder.bind(field, BIRTH_DATE_PROPERTY); + Assert.assertEquals(0, componentErrors.size()); + + field.fireValidationStatusChangeEvent(false); + Assert.assertEquals(0, componentErrors.size()); + } + @Test public void fieldWithHasValidatorFullyOverridden_fieldValidationStatusChangesToTrue_binderClearErrorIsCalled() { var field = new TestHasValidatorDatePicker.DataPickerHasValidatorOverridden();