diff options
author | Tatu Lund <tatu@vaadin.com> | 2021-03-18 18:12:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-18 18:12:37 +0200 |
commit | 01c72e9e6c0678980bc39112f4b97454de6916c7 (patch) | |
tree | 535e5f7f01b48a0e3a3befe0eeaa2b18824b2917 /server/src | |
parent | 49ea04a13c0d9a19c1d9ca041ff34574f910bb67 (diff) | |
download | vaadin-framework-01c72e9e6c0678980bc39112f4b97454de6916c7.tar.gz vaadin-framework-01c72e9e6c0678980bc39112f4b97454de6916c7.zip |
feat: Add API to control whether Binder converts back to presentation (#12246)
#12132 fixed an old bug, conversion was not done back, which was a regression from Vaadin 7. However since the bug has been present long time, it has become established behavior, thus there may be need to disable conversion back to presentation sometimes, thus this API as added.
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/main/java/com/vaadin/data/Binder.java | 43 | ||||
-rw-r--r-- | server/src/test/java/com/vaadin/data/BinderTest.java | 15 |
2 files changed, 55 insertions, 3 deletions
diff --git a/server/src/main/java/com/vaadin/data/Binder.java b/server/src/main/java/com/vaadin/data/Binder.java index 8a11cc36ee..1fb64c837f 100644 --- a/server/src/main/java/com/vaadin/data/Binder.java +++ b/server/src/main/java/com/vaadin/data/Binder.java @@ -273,6 +273,28 @@ public class Binder<BEAN> implements Serializable { * @since 8.11 */ public boolean isValidatorsDisabled(); + + /** + * Define whether the value should be converted back to the presentation + * in the field when a converter is used in binding. + * + * @param convertBackToPresentation + * A boolean value + * + * @since 8.13 + */ + public void setConvertBackToPresentation( + boolean convertBackToPresentation); + + /** + * Returns whether the value is converted back to the presentation in + * the field when a converter is used in binding. + * + * @return A boolean value + * + * @since 8.13 + */ + public boolean isConvertBackToPresentation(); } /** @@ -1092,6 +1114,8 @@ public class Binder<BEAN> implements Serializable { private boolean validatorsDisabled = false; + private boolean convertBackToPresentation = true; + public BindingImpl(BindingBuilderImpl<BEAN, FIELDVALUE, TARGET> builder, ValueProvider<BEAN, TARGET> getter, Setter<BEAN, TARGET> setter) { @@ -1272,10 +1296,12 @@ public class Binder<BEAN> implements Serializable { /** * Write the field value by invoking the setter function on the given - * bean, if the value passes all registered validators. + * bean, if the value passes all registered validators. Write value back + * to the field as well if {@code isConvertBackToPresentation()} is + * true. * * @param bean - * the bean to set the property value to + * the bean to set the property value to, not null */ private BindingValidationStatus<TARGET> writeFieldValue(BEAN bean) { assert bean != null; @@ -1284,7 +1310,7 @@ public class Binder<BEAN> implements Serializable { if (!isReadOnly()) { result.ifOk(value -> { setter.accept(bean, value); - if (value != null) { + if (convertBackToPresentation && value != null) { FIELDVALUE converted = convertToFieldType(value); if (!Objects.equals(field.getValue(), converted)) { getField().setValue(converted); @@ -1392,6 +1418,17 @@ public class Binder<BEAN> implements Serializable { public boolean isValidatorsDisabled() { return validatorsDisabled; } + + @Override + public void setConvertBackToPresentation( + boolean convertBackToPresentation) { + this.convertBackToPresentation = convertBackToPresentation; + } + + @Override + public boolean isConvertBackToPresentation() { + return convertBackToPresentation; + } } /** diff --git a/server/src/test/java/com/vaadin/data/BinderTest.java b/server/src/test/java/com/vaadin/data/BinderTest.java index 0332572203..98f72e1197 100644 --- a/server/src/test/java/com/vaadin/data/BinderTest.java +++ b/server/src/test/java/com/vaadin/data/BinderTest.java @@ -518,6 +518,21 @@ public class BinderTest extends BinderTestBase<Binder<Person>, Person> { } @Test + public void withConverter_writeBackValueDisabled() { + TextField rentField = new TextField(); + rentField.setValue(""); + Binding<Person, BigDecimal> binding = binder.forField(rentField) + .withConverter(new EuroConverter("")) + .withNullRepresentation(BigDecimal.valueOf(0d)) + .bind(Person::getRent, Person::setRent); + binder.setBean(item); + binding.setConvertBackToPresentation(false); + rentField.setValue("10"); + + assertNotEquals("€ 10.00", rentField.getValue()); + } + + @Test public void beanBinder_nullRepresentationIsNotDisabled() { Binder<Person> binder = new Binder<>(Person.class); binder.forField(nameField).bind("firstName"); |