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