You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2023/06/13 10:16:12 UTC

[causeway] branch master updated: CAUSEWAY-3463: fixes dynamic parameter visibility

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 2b0da87d2c CAUSEWAY-3463: fixes dynamic parameter visibility
2b0da87d2c is described below

commit 2b0da87d2cd337fda503798520a4bb3c857a97f2
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Jun 13 12:16:05 2023 +0200

    CAUSEWAY-3463: fixes dynamic parameter visibility
---
 .../spec/feature/ObjectActionParameter.java        |  3 --
 .../components/actions/ActionParametersForm.java   |  8 ++++-
 .../ui/components/scalars/ScalarPanelAbstract.java | 42 ++++++++++++++++------
 3 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectActionParameter.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectActionParameter.java
index ec64604d77..4ef68dd986 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectActionParameter.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectActionParameter.java
@@ -269,7 +269,4 @@ extends ObjectFeature, CurrentHolder {
     default ActionParameterMemento getMemento() {
         return ActionParameterMemento.forActionParameter(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 0afc025ea4..3763acf784 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
@@ -152,8 +152,14 @@ extends PromptFormAbstract<ActionModel> {
             paramRepaint = paramRepaint.max(
                     paramPanel.updateIfNecessary(paramModel));
 
-            if(paramRepaint.isRequired()) {
+            switch (paramRepaint) {
+            case REQUIRED:
                 target.add(paramPanel);
+                break;
+            case REQUIRED_ON_PARENT:
+                target.add(paramPanel.getParent());
+                break;
+            default:
             }
         });
 
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 0ee3ac206d..b10413bfd1 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
@@ -167,12 +167,15 @@ implements ScalarModelChangeListener {
      */
     public enum Repaint {
         OPTIONAL,
-        REQUIRED;
+        REQUIRED,
+        /** if a previously hidden component becomes visible, its parent must be added to the AJAX request target */
+        REQUIRED_ON_PARENT;
         public static Repaint required(final boolean needsRepainting) {
             return needsRepainting ? Repaint.REQUIRED : Repaint.OPTIONAL;
         }
         public boolean isOptional() { return this == OPTIONAL; }
         public boolean isRequired() { return this == REQUIRED; }
+        public boolean isRequiredOnParent() { return this == REQUIRED_ON_PARENT; }
         public Repaint max(final @NonNull Repaint other) {
             return this.ordinal()>=other.ordinal()
                     ? this
@@ -660,16 +663,29 @@ implements ScalarModelChangeListener {
    public Repaint updateIfNecessary(
            final @NonNull UiParameter paramModel) {
 
-       // visibility
-       val visibilityBefore = isVisible() && isVisibilityAllowed();
+       /*
+        * VISIBILITY, cases to consider:
+        * (1) start showing     -> Repaint.REQUIRED_ON_PARENT
+        * (2) keep showing      -> Repaint.OPTIONAL
+        * (3) stop showing      -> Repaint.REQUIRED
+        * (4) keep hiding       -> Repaint.OPTIONAL
+        */
+
+       val visibilityBefore = isVisibilityAllowed();
        val visibilityConsent = paramModel.getParameterNegotiationModel().getVisibilityConsent(paramModel.getParameterIndex());
        val visibilityAfter = visibilityConsent.isAllowed();
        setVisibilityAllowed(visibilityAfter);
-       setVisible(visibilityAfter);
 
-       // usability
-       val usabilityConsent = paramModel.getParameterNegotiationModel().getUsabilityConsent(paramModel.getParameterIndex());
+       /*
+        * USABILITY, cases to consider:
+        * (5) start being usable    -> Repaint.REQUIRED (but only if visible)
+        * (6) keep being usable     -> Repaint.OPTIONAL
+        * (7) stop being usable     -> Repaint.REQUIRED (but only if visible)
+        * (8) keep being readonly   -> Repaint.OPTIONAL
+        */
+
        val usabilityBefore = isEnabled();
+       val usabilityConsent = paramModel.getParameterNegotiationModel().getUsabilityConsent(paramModel.getParameterIndex());
        val usabilityAfter = usabilityConsent.isAllowed();
        if(usabilityAfter) {
            onMakeEditable();
@@ -677,12 +693,16 @@ implements ScalarModelChangeListener {
            onMakeNotEditable(usabilityConsent.getReasonAsString().orElse(null));
        }
 
-       // repaint the param panel if visibility has changed
-       if (!visibilityBefore || !visibilityAfter) {
-           return Repaint.REQUIRED;
+       if (visibilityBefore != visibilityAfter) {
+           // repaint the param panel if visibility has changed
+           return visibilityAfter
+                   ? Repaint.REQUIRED_ON_PARENT
+                   : Repaint.REQUIRED;
        }
-       // repaint the param panel if usability has changed
-       if (!usabilityAfter || !usabilityBefore) {
+
+       if (usabilityBefore != usabilityAfter
+               && visibilityAfter) {
+           // repaint the param panel if usability has changed, but only if visible
            return Repaint.REQUIRED;
        }