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 f6f73ade2f CAUSEWAY-3484: caches usability and visibility within param 
neg. model
f6f73ade2f is described below

commit f6f73ade2ff749cd7c4115fba4caeeb79b402593
Author: andi-huber <[email protected]>
AuthorDate: Thu Apr 25 13:11:05 2024 +0200

    CAUSEWAY-3484: caches usability and visibility within param neg. model
---
 .../managed/ParameterNegotiationModel.java         | 45 +++++++++++++++-------
 .../components/actions/ActionParametersForm.java   |  3 +-
 .../ui/components/scalars/ScalarPanelAbstract.java |  7 +++-
 3 files changed, 39 insertions(+), 16 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 2867d87b43..e626fcc542 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
@@ -169,22 +169,22 @@ public class ParameterNegotiationModel {
     @NonNull public Bindable<String> getBindableParamSearchArgument(final int 
paramNr) {
         return 
paramModels.getElseFail(paramNr).getBindableParamSearchArgument();
     }
+    
+    @NonNull public Observable<Consent> getObservableVisibilityConsent(final 
int paramNr) {
+        return 
paramModels.getElseFail(paramNr).getObservableVisibilityConsent();
+    }
+    
+    @NonNull public Observable<Consent> getObservableUsabilityConsent(final 
int paramNr) {
+        return 
paramModels.getElseFail(paramNr).getObservableUsabilityConsent();
+    }
 
     @NonNull public Consent getVisibilityConsent(final int paramNr) {
-        val pendingArgValues = getParamValues();
-        val paramMeta = getParamMetamodel(paramNr);
-        val isVisible = paramMeta
-                .isVisible(getHead(), pendingArgValues, 
InteractionInitiatedBy.USER);
-        return isVisible;
+        return getObservableVisibilityConsent(paramNr).getValue();
     }
     @NonNull public Consent getUsabilityConsent(final int paramNr) {
-        val pendingArgValues = getParamValues();
-        val paramMeta = getParamMetamodel(paramNr);
-        val isUsable = paramMeta
-                .isUsable(getHead(), pendingArgValues, 
InteractionInitiatedBy.USER);
-        return isUsable;
+        return getObservableUsabilityConsent(paramNr).getValue();
     }
-
+    
     // -- MULTI SELECT
 
     public MultiselectChoices getMultiselectChoices() {
@@ -271,7 +271,9 @@ public class ParameterNegotiationModel {
      * Returns whether the pending parameter changed during reassessment.
      * @see ObjectActionParameter#reassessDefault(ParameterNegotiationModel)
      */
-    public boolean reassessDefaults(final int paramIndexForReassessment) {
+    public boolean reassessVisibilityAndUsabilityAndDefaults(final int 
paramIndexForReassessment) {
+        paramModels.get(paramIndexForReassessment)
+            .ifPresent(ParameterModel::invalidateVisibilityAndUsability);
         return 
getParamMetamodel(paramIndexForReassessment).reassessDefault(this);
     }
 
@@ -317,6 +319,8 @@ public class ParameterNegotiationModel {
         @Getter @NonNull private final LazyObservable<String> 
observableParamValidation;
         @Getter @NonNull private final _BindableAbstract<String> 
bindableParamSearchArgument;
         @Getter @NonNull private final LazyObservable<Can<ManagedObject>> 
observableParamChoices;
+        @Getter @NonNull private final LazyObservable<Consent> 
observableVisibilityConsent;
+        @Getter @NonNull private final LazyObservable<Consent> 
observableUsabilityConsent;
         private Observable<String> bindableParamAsTitle;
         private Observable<String> bindableParamAsHtml;
         private Bindable<String> bindableParamAsParsableText;
@@ -374,13 +378,28 @@ public class ParameterNegotiationModel {
                         .isValid(getNegotiationModel().getHead(), 
getNegotiationModel().getParamValues(), InteractionInitiatedBy.USER)
                         .getReasonAsString().orElse(null)
                 : (String)null);
-
+            
+            observableVisibilityConsent = _Observables.lazy(()->
+                metaModel.isVisible(
+                        negotiationModel.getHead(), 
+                        negotiationModel.getParamValues(), 
+                        InteractionInitiatedBy.USER));
+            observableUsabilityConsent = _Observables.lazy(()->
+                metaModel.isUsable(
+                        negotiationModel.getHead(), 
+                        negotiationModel.getParamValues(), 
+                        InteractionInitiatedBy.USER));
         }
 
         public void invalidateChoicesAndValidation() {
             observableParamChoices.invalidate();
             observableParamValidation.invalidate();
         }
+        
+        public void invalidateVisibilityAndUsability() {
+            observableVisibilityConsent.invalidate();
+            observableUsabilityConsent.invalidate();
+        }
 
         private boolean isValidationFeedbackActive() {
             return 
getNegotiationModel().getObservableValidationFeedbackActive().getValue();
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 4a386113d7..076f13be19 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
@@ -143,7 +143,8 @@ extends PromptFormAbstract<ActionModel> {
         .forEach(paramIndexForReassessment->{
             var paramRepaint =
                     // potentially updates the paramNegotiationModel
-                    
Repaint.required(paramNegotiationModel.reassessDefaults(paramIndexForReassessment));
+                    Repaint.required(paramNegotiationModel
+                            
.reassessVisibilityAndUsabilityAndDefaults(paramIndexForReassessment));
             _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 507def362e..f55cc2a951 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
@@ -662,6 +662,9 @@ implements ScalarModelChangeListener {
    public Repaint updateIfNecessary(
            final @NonNull UiParameter paramModel) {
 
+       val paramNegotiationModel = paramModel.getParameterNegotiationModel();
+       final int paramIndex = paramModel.getParameterIndex();
+        
        /*
         * VISIBILITY, cases to consider:
         * (1) start showing     -> Repaint.REQUIRED_ON_PARENT
@@ -671,7 +674,7 @@ implements ScalarModelChangeListener {
         */
 
        val visibilityBefore = isVisibilityAllowed();
-       val visibilityConsent = 
paramModel.getParameterNegotiationModel().getVisibilityConsent(paramModel.getParameterIndex());
+       val visibilityConsent = 
paramNegotiationModel.getVisibilityConsent(paramIndex);
        val visibilityAfter = visibilityConsent.isAllowed();
        setVisibilityAllowed(visibilityAfter);
 
@@ -684,7 +687,7 @@ implements ScalarModelChangeListener {
         */
 
        val usabilityBefore = isEnabled();
-       val usabilityConsent = 
paramModel.getParameterNegotiationModel().getUsabilityConsent(paramModel.getParameterIndex());
+       val usabilityConsent = 
paramNegotiationModel.getUsabilityConsent(paramIndex);
        val usabilityAfter = usabilityConsent.isAllowed();
        if(usabilityAfter) {
            onMakeEditable();

Reply via email to