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);

Reply via email to