From: Aleksi Hietanen Date: Fri, 3 Feb 2017 11:40:54 +0000 (+0200) Subject: Add isValid to Binder (#8274) X-Git-Tag: 8.0.0.rc1~38 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=560d1615408b0ff85439f891c0bb32c84807bd3e;p=vaadin-framework.git Add isValid to Binder (#8274) * Add isValid to Binder isValid enables you to check the current validation status of a given Binder, without firing events or invoking handlers. This patch also clarifies the javadocs of StatusChangeEvents' hasValidationErrors. * Throw in Binder.isValid if no bean is set and bean validators exist * Add test cases to BinderTest --- diff --git a/documentation/datamodel/datamodel-forms.asciidoc b/documentation/datamodel/datamodel-forms.asciidoc index 1fd79dd9b9..0218140425 100644 --- a/documentation/datamodel/datamodel-forms.asciidoc +++ b/documentation/datamodel/datamodel-forms.asciidoc @@ -375,8 +375,8 @@ We can use that event to make the save and reset buttons of our forms become ena [source, java] ---- binder.addStatusChangeListener(event -> { - boolean isValid = !event.hasValidationErrors(); - boolean hasChanges = binder.hasChanges(); + boolean isValid = event.getBinder().isValid(); + boolean hasChanges = event.getBinder().hasChanges(); saveButton.setEnabled(hasChanges && isValid); resetButton.setEnabled(hasChanges); diff --git a/server/src/main/java/com/vaadin/data/Binder.java b/server/src/main/java/com/vaadin/data/Binder.java index d36c9996fd..5fa486319a 100644 --- a/server/src/main/java/com/vaadin/data/Binder.java +++ b/server/src/main/java/com/vaadin/data/Binder.java @@ -1579,6 +1579,35 @@ public class Binder implements Serializable { fireStatusChangeEvent(validationStatus.hasErrors()); return validationStatus; } + + /** + * Runs all currently configured field level validators, as well as all bean + * level validators if a bean is currently set with + * {@link #setBean(Object)}, and returns whether any of the validators + * failed. + * + * @return whether this binder is in a valid state + * @throws IllegalStateException + * if bean level validators have been configured and no bean is + * currently set + */ + public boolean isValid() { + if (getBean() == null && !validators.isEmpty()) { + throw new IllegalStateException( + "Cannot validate binder: " + + "bean level validators have been configured " + + "but no bean is currently set"); + } + if (validateBindings().stream().filter(BindingValidationStatus::isError) + .findAny().isPresent()) { + return false; + } + if (getBean() != null && validateBean(getBean()).stream() + .filter(ValidationResult::isError).findAny().isPresent()) { + return false; + } + return true; + } /** * Validates the bindings and returns the result of the validation as a list diff --git a/server/src/main/java/com/vaadin/data/StatusChangeEvent.java b/server/src/main/java/com/vaadin/data/StatusChangeEvent.java index e4db2b8868..acef1bac75 100644 --- a/server/src/main/java/com/vaadin/data/StatusChangeEvent.java +++ b/server/src/main/java/com/vaadin/data/StatusChangeEvent.java @@ -26,7 +26,7 @@ import com.vaadin.server.Setter; *

* The {@link Binder} status is changed whenever any of the following happens: *