This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch ISIS-3193 in repository https://gitbox.apache.org/repos/asf/isis.git
commit 646916c30e3b10bc0da04999ad5a32458e6a6c49 Author: Dan Haywood <[email protected]> AuthorDate: Mon Aug 29 13:32:46 2022 +0100 ISIS-3193: introduces isDirty flag to Bindable, so that calculating dependent defaults don't overwrite --- .../java/org/apache/isis/commons/binding/Bindable.java | 3 +++ .../commons/internal/binding/_BindableAbstract.java | 7 +++++++ .../isis/commons/internal/binding/_Bindables.java | 2 ++ .../ui/components/actions/ActionParametersForm.java | 18 ++++++++++++------ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/commons/src/main/java/org/apache/isis/commons/binding/Bindable.java b/commons/src/main/java/org/apache/isis/commons/binding/Bindable.java index 86f8f85222..4b638a06b1 100644 --- a/commons/src/main/java/org/apache/isis/commons/binding/Bindable.java +++ b/commons/src/main/java/org/apache/isis/commons/binding/Bindable.java @@ -37,4 +37,7 @@ public interface Bindable<T> extends Observable<T>, Writable<T> { <R> Bindable<R> mapToBindable(Function<T, R> forwardMapper, Function<R, T> reverseMapper); + boolean isDirty(); + + void clearDirty(); } diff --git a/commons/src/main/java/org/apache/isis/commons/internal/binding/_BindableAbstract.java b/commons/src/main/java/org/apache/isis/commons/internal/binding/_BindableAbstract.java index 45334960f2..23c794465e 100644 --- a/commons/src/main/java/org/apache/isis/commons/internal/binding/_BindableAbstract.java +++ b/commons/src/main/java/org/apache/isis/commons/internal/binding/_BindableAbstract.java @@ -29,6 +29,7 @@ import org.apache.isis.commons.binding.InvalidationListener; import org.apache.isis.commons.binding.Observable; import org.apache.isis.commons.internal.exceptions._Exceptions; +import lombok.Getter; import lombok.NonNull; import lombok.Setter; import lombok.val; @@ -50,6 +51,7 @@ public abstract class _BindableAbstract<T> implements Bindable<T> { private Observable<? extends T> observable = null;; private InvalidationListener invalidationListener = null; private boolean valid = true; + @Getter private boolean dirty = false; private InternalUtil<T> util = null; /** @@ -120,6 +122,7 @@ public abstract class _BindableAbstract<T> implements Bindable<T> { val newValue = valueGuard.apply(proposedNewValue); if (value != newValue) { value = newValue; + dirty = true; markInvalid(); } } @@ -206,6 +209,10 @@ public abstract class _BindableAbstract<T> implements Bindable<T> { return newBindable; } + @Override public void clearDirty() { + dirty = false; + } + // -- HELPER private void markInvalid() { diff --git a/commons/src/main/java/org/apache/isis/commons/internal/binding/_Bindables.java b/commons/src/main/java/org/apache/isis/commons/internal/binding/_Bindables.java index 21a0405cc2..f2e57ab668 100644 --- a/commons/src/main/java/org/apache/isis/commons/internal/binding/_Bindables.java +++ b/commons/src/main/java/org/apache/isis/commons/internal/binding/_Bindables.java @@ -48,12 +48,14 @@ public class _Bindables { public static <T> _BindableAbstract<T> forValue(final T initialValue) { val bindable = new SimpleBindable<T>(); bindable.setValue(initialValue); + bindable.clearDirty(); return bindable; } public static BooleanBindable forBoolean(final boolean initialValue) { val bindable = new BooleanBindable(); bindable.setValue(initialValue); + bindable.clearDirty(); return bindable; } diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java index f1178501ad..f465225fe5 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java +++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java @@ -27,11 +27,13 @@ import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.repeater.RepeatingView; +import org.apache.isis.commons.binding.Bindable; import org.apache.isis.commons.functional.Either; import org.apache.isis.commons.internal.base._Casts; import org.apache.isis.commons.internal.debug._Debug; import org.apache.isis.commons.internal.debug.xray.XrayUi; import org.apache.isis.commons.internal.exceptions._Exceptions; +import org.apache.isis.core.metamodel.object.ManagedObject; import org.apache.isis.core.metamodel.object.ManagedObjects; import org.apache.isis.viewer.commons.model.PlacementDirection; import org.apache.isis.viewer.commons.model.components.ComponentType; @@ -151,13 +153,17 @@ extends PromptFormAbstract<ActionModel> { val pendingArgs = paramModel.getParameterNegotiationModel(); val actionParameter = paramModel.getMetaModel(); - // reassess defaults - val paramDefaultValue = actionParameter.getDefault(pendingArgs); - if (ManagedObjects.isNullOrUnspecifiedOrEmpty(paramDefaultValue)) { - pendingArgs.clearParamValue(paramIndex); - } else { - pendingArgs.setParamValue(paramIndex, paramDefaultValue); + val bindableParamValue = pendingArgs.getBindableParamValue(paramIndex); + if(! bindableParamValue.isDirty()) { + // reassess defaults + val paramDefaultValue = actionParameter.getDefault(pendingArgs); + if (ManagedObjects.isNullOrUnspecifiedOrEmpty(paramDefaultValue)) { + pendingArgs.clearParamValue(paramIndex); + } else { + pendingArgs.setParamValue(paramIndex, paramDefaultValue); + } + bindableParamValue.clearDirty(); } val paramPanel = paramPanels.get(paramIndex);
