This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new a9d93d4cc8 CAUSEWAY-3725: fixes usability change detection
a9d93d4cc8 is described below

commit a9d93d4cc8d05ceb6b0d4c537185a4d06696fd70
Author: andi-huber <[email protected]>
AuthorDate: Thu Apr 25 14:55:36 2024 +0200

    CAUSEWAY-3725: fixes usability change detection
---
 .../managed/ParameterNegotiationModel.java         | 11 +++++++++--
 .../components/actions/ActionParametersForm.java   |  7 ++++---
 .../ui/components/scalars/ScalarPanelAbstract.java | 23 ++++++++++++++++++----
 3 files changed, 32 insertions(+), 9 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ParameterNegotiationModel.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ParameterNegotiationModel.java
index e626fcc542..aa3fcecfdb 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ParameterNegotiationModel.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/ParameterNegotiationModel.java
@@ -271,10 +271,17 @@ public class ParameterNegotiationModel {
      * Returns whether the pending parameter changed during reassessment.
      * @see ObjectActionParameter#reassessDefault(ParameterNegotiationModel)
      */
-    public boolean reassessVisibilityAndUsabilityAndDefaults(final int 
paramIndexForReassessment) {
+    public boolean reassessDefaults(final int paramIndexForReassessment) {
+        return 
getParamMetamodel(paramIndexForReassessment).reassessDefault(this);
+    }
+    
+    /**
+     * Invalidates any consent cached previously. 
+     * Next query for visibility or usability will be reassessed.   
+     */
+    public void invalidateVisibilityAndUsability(final int 
paramIndexForReassessment) {
         paramModels.get(paramIndexForReassessment)
             .ifPresent(ParameterModel::invalidateVisibilityAndUsability);
-        return 
getParamMetamodel(paramIndexForReassessment).reassessDefault(this);
     }
 
     /**
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actions/ActionParametersForm.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actions/ActionParametersForm.java
index 076f13be19..a85db8ff9a 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actions/ActionParametersForm.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actions/ActionParametersForm.java
@@ -141,10 +141,11 @@ extends PromptFormAbstract<ActionModel> {
         // only updates subsequent parameter panels starting from 
(paramIndexOfUpdated + 1)
         IntStream.range(paramIndexOfUpdated + 1, 
paramNegotiationModel.getParamCount())
         .forEach(paramIndexForReassessment->{
+            // potentially updates the paramNegotiationModel
+            var wasValueChanged = paramNegotiationModel
+                    .reassessDefaults(paramIndexForReassessment);
             var paramRepaint =
-                    // potentially updates the paramNegotiationModel
-                    Repaint.required(paramNegotiationModel
-                            
.reassessVisibilityAndUsabilityAndDefaults(paramIndexForReassessment));
+                    Repaint.required(wasValueChanged);
             _Xray.reassessedDefault(paramIndexForReassessment, 
paramNegotiationModel);
 
             val paramPanel = paramPanels.get(paramIndexForReassessment);
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index f55cc2a951..2dd94ef6f1 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -32,6 +32,7 @@ import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.feedback.ComponentFeedbackMessageFilter;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.model.IModel;
 
 import org.springframework.lang.Nullable;
@@ -40,6 +41,7 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.LabelPosition;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.collections.ImmutableEnumSet;
+import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.commons.internal.collections._Lists;
 import org.apache.causeway.commons.internal.debug._Probe;
@@ -662,8 +664,12 @@ implements ScalarModelChangeListener {
    public Repaint updateIfNecessary(
            final @NonNull UiParameter paramModel) {
 
+       val visibilityBefore = isVisibilityAllowed();
+       val usabilityBefore = isCurrentlyRenderedAsUsable();
+       
        val paramNegotiationModel = paramModel.getParameterNegotiationModel();
        final int paramIndex = paramModel.getParameterIndex();
+       paramNegotiationModel.invalidateVisibilityAndUsability(paramIndex);
         
        /*
         * VISIBILITY, cases to consider:
@@ -672,8 +678,6 @@ implements ScalarModelChangeListener {
         * (3) stop showing      -> Repaint.REQUIRED
         * (4) keep hiding       -> Repaint.OPTIONAL
         */
-
-       val visibilityBefore = isVisibilityAllowed();
        val visibilityConsent = 
paramNegotiationModel.getVisibilityConsent(paramIndex);
        val visibilityAfter = visibilityConsent.isAllowed();
        setVisibilityAllowed(visibilityAfter);
@@ -685,8 +689,6 @@ implements ScalarModelChangeListener {
         * (7) stop being usable     -> Repaint.REQUIRED (but only if visible)
         * (8) keep being readonly   -> Repaint.OPTIONAL
         */
-
-       val usabilityBefore = isEnabled();
        val usabilityConsent = 
paramNegotiationModel.getUsabilityConsent(paramIndex);
        val usabilityAfter = usabilityConsent.isAllowed();
        if(usabilityAfter) {
@@ -710,5 +712,18 @@ implements ScalarModelChangeListener {
 
        return Repaint.OPTIONAL;
    }
+   
+   // -- HELPER
+   
+   /**
+    * Whether the underlying UI component is currently rendered as usable. 
+    */
+   private boolean isCurrentlyRenderedAsUsable() {
+       if(!isEnabled()) return false;
+       return _Casts.castTo(ScalarPanelFormFieldAbstract.class, this)
+           .map(ScalarPanelFormFieldAbstract::getFormComponent)
+           .map(FormComponent::isEnabled)
+           .orElse(true);
+   }
 
 }

Reply via email to