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