You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/12/17 22:39:06 UTC

[isis] branch master updated: ISIS-2226: fixes dependend args not cleared when using autoComplete

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/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 5fcec11  ISIS-2226: fixes dependend args not cleared when using autoComplete
5fcec11 is described below

commit 5fcec112198b3e7d1be12f5b47db5caf6a85d8aa
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Dec 17 23:38:56 2019 +0100

    ISIS-2226: fixes dependend args not cleared when using autoComplete
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2226
---
 .../apache/isis/metamodel/spec/ManagedObject.java  | 10 ++++
 .../components/actions/ActionParametersForm.java   |  4 +-
 .../components/scalars/ScalarPanelAbstract2.java   | 70 +++++++++++-----------
 .../scalars/ScalarPanelSelect2Abstract.java        | 15 ++---
 .../scalars/reference/ReferencePanel.java          |  4 +-
 .../valuechoices/ValueChoicesSelect2Panel.java     |  9 +--
 .../java/demoapp/dom/actions/depargs/DemoItem.java |  2 +
 7 files changed, 59 insertions(+), 55 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
index ddac7c5..bb85691 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
@@ -24,6 +24,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
@@ -284,6 +285,15 @@ public interface ManagedObject {
                 .map(ManagedObject::unwrapPojo)
                 .collect(Collectors.toList());
     }
+    
+    public static Set<Object> unwrapPojoSetElseEmpty(Collection<? extends ManagedObject> adapters) {
+        if (adapters == null) {
+            return Collections.emptySet();
+        }
+        return adapters.stream()
+                .map(ManagedObject::unwrapPojo)
+                .collect(Collectors.toSet());
+    }
 
     // -- SHORTCUTS
 
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
index 3abb51e..7bb807e 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
@@ -171,8 +171,8 @@ class ActionParametersForm extends PromptFormAbstract<ActionModel> {
             val paramPanel = paramPanels.get(paramNumToUpdate);
             val repaint = paramPanel
                     .updateIfNecessary(actionModel, paramNumberUpdated, paramNumToUpdate, target);
-
-            final boolean multiPart = isMultiPart(); //TODO keep side-effects(?) or remove
+            
+            //final boolean multiPart = isMultiPart(); // side-effects(?) or remove
 
             switch (repaint) {
             case ENTIRE_FORM:
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
index 3c4a139..53a536b 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@ -54,7 +54,6 @@ import org.apache.isis.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
-import org.apache.isis.viewer.wicket.model.models.ActionArgumentModel;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
@@ -174,47 +173,41 @@ implements ScalarModelSubscriber2 {
                 .getDefault(scalarModel, pendingArguments, paramNumUpdated,
                         commonContext.getAuthenticationSession());
 
-        final ActionParameterMemento apm = new ActionParameterMemento(actionParameter);
-        final ActionArgumentModel actionArgumentModel = actionModel.getArgumentModel(apm);
+        val actionParameterMemento = new ActionParameterMemento(actionParameter);
+        val actionArgumentModel = actionModel.getArgumentModel(actionParameterMemento);
 
         val pendingArg = pendingArgumentArray[paramNumToPossiblyUpdate];
-
+        
         if (defaultIfAny != null) {
             scalarModel.setObject(defaultIfAny);
-
             scalarModel.setPendingAdapter(defaultIfAny);
             actionArgumentModel.setObject(defaultIfAny);
         } else {
 
-            if(pendingArg != null & scalarModel.hasChoices()) {
-                // make sure the object is one of the choices, else blank it out.
-                val choices = scalarModel
-                        .getChoices(pendingArguments, commonContext.getAuthenticationSession());
-
-                if(ManagedObject.isValue(pendingArg)) {
-                    // we have to do this if the ObjectAdapters are value type (eg a string)
-                    //  because we can end up with a different ObjectAdapter for the same underlying value
-                    //  (values have no intrinsic identity)
-
-                    // it might not be necessary to have this special casing; we could probably use this code
-                    // even for reference types
-                    final Object pendingValue = pendingArg.getPojo();
-                    final List<Object> choiceValues = ManagedObject.unwrapPojoListElseEmpty(choices);
-                    if(!choiceValues.contains(pendingValue)) {
-                        scalarModel.setObject(null);
-                        scalarModel.setPending(null);
-                        actionArgumentModel.setObject(null);
-                    }
-                } else {
-                    if(!choices.contains(pendingArg)) {
-                        scalarModel.setObject(null);
-                        scalarModel.setPending(null);
-                        actionArgumentModel.setObject(null);
-                    }
-
+            boolean shouldBlankout = false;
+            
+            if(pendingArg != null) {
+                if(scalarModel.hasChoices()) {
+                    // make sure the object is one of the choices, else blank it out.
+                    val choices = scalarModel
+                            .getChoices(pendingArguments, commonContext.getAuthenticationSession());
+                    
+                    shouldBlankout = 
+                            ! isPartOfChoicesConsideringDependentArgs(scalarModel, pendingArg, choices);
+                    
+                } else if(scalarModel.hasAutoComplete()) {
+                    
+                    // poor man's implementation: blank-out in any case 
+                    shouldBlankout = true;
                 }
-
             }
+            
+            if(shouldBlankout) {
+                scalarModel.setObject(null);
+                scalarModel.setPending(null);
+                actionArgumentModel.setObject(null);
+            }
+            
         }
 
         // repaint the entire form if visibility has changed
@@ -233,7 +226,16 @@ implements ScalarModelSubscriber2 {
                         : Repaint.NOTHING;
     }
 
-
+    // blank out the parameter n based on dependent params 0 .. n-1
+    private boolean isPartOfChoicesConsideringDependentArgs(
+            ScalarModel scalarModel, 
+            ManagedObject pendingArg, 
+            List<ManagedObject> choices) {
+        
+        val choiceValues = ManagedObject.unwrapPojoSetElseEmpty(choices);
+        val pendingValue = pendingArg.getPojo();
+        return choiceValues.contains(pendingValue);
+    }
 
     public static class InlinePromptConfig {
         private final boolean supported;
@@ -303,8 +305,6 @@ implements ScalarModelSubscriber2 {
 
     private void buildGuiAndCallHooks() {
 
-        val commonContext = super.getCommonContext();
-        
         buildGui();
 
         final ScalarModel scalarModel = getModel();
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
index e9a609d..1ddd7c4 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
@@ -38,7 +38,6 @@ import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForChoices;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 import org.apache.isis.viewer.wicket.ui.util.Tooltips;
 import org.apache.isis.webapp.context.memento.ObjectMemento;
@@ -120,10 +119,13 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
         select2.setProvider(choiceProvider);
         getModel().clearPending();
 
-        if(choiceProvider instanceof ObjectAdapterMementoProviderForChoices) {
-            val providerForChoices = (ObjectAdapterMementoProviderForChoices) choiceProvider;
-            syncIfNull(select2, providerForChoices.getChoiceMementos());
-        }
+        syncIfNull(select2);
+        
+//legacy of        
+//        if(choiceProvider instanceof ObjectAdapterMementoProviderForChoices) {
+//            val providerForChoices = (ObjectAdapterMementoProviderForChoices) choiceProvider;
+//            syncIfNull(select2, providerForChoices.getChoiceMementos());
+//        }
     }
 
     /**
@@ -134,8 +136,7 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
     /**
      * Mandatory hook (is called by {@link #setProviderAndCurrAndPending(Select2, Can<ManagedObject>)})
      */
-    protected abstract void syncIfNull(Select2 select2, List<ObjectMemento> choicesMementos);
-
+    protected abstract void syncIfNull(Select2 select2);
 
     // //////////////////////////////////////
 
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 2182da8..f00260a 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -20,7 +20,6 @@
 package org.apache.isis.viewer.wicket.ui.components.scalars.reference;
 
 import java.util.ArrayList;
-import java.util.List;
 import java.util.stream.Collectors;
 
 import org.apache.wicket.AttributeModifier;
@@ -36,7 +35,6 @@ import org.wicketstuff.select2.ChoiceProvider;
 import org.wicketstuff.select2.Settings;
 
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.metamodel.spec.ManagedObject;
@@ -365,7 +363,7 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract {
 
     // called by setProviderAndCurrAndPending
     @Override
-    protected void syncIfNull(final Select2 select2, final List<ObjectMemento> choiceMementos) {
+    protected void syncIfNull(final Select2 select2) {
         final ObjectMemento curr = select2.getModelObject();
 
         if(!getModel().isCollection()) {
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
index 15f09de..4443c32 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -20,8 +20,6 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices;
 
 import java.util.List;
 
-import javax.inject.Inject;
-
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -35,7 +33,6 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.metamodel.spec.ManagedObject;
-import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelSelect2Abstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
@@ -174,7 +171,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract {
     }
 
     @Override
-    protected void syncIfNull(final Select2 select2, final List<ObjectMemento> choicesMementos) {
+    protected void syncIfNull(final Select2 select2) {
         final ObjectMemento curr = getModel().getObjectAdapterMemento();
 
         if(curr == null) {
@@ -182,14 +179,10 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract {
         }
     }
 
-
     public ScalarModel getScalarModel() {
         return scalarModel;
     }
 
-    @Inject
-    WicketViewerSettings wicketViewerSettings;
-
     @Override
     protected String getScalarPanelType() {
         return "valueChoicesSelect2Panel";
diff --git a/examples/demo/src/main/java/demoapp/dom/actions/depargs/DemoItem.java b/examples/demo/src/main/java/demoapp/dom/actions/depargs/DemoItem.java
index 386fc48..836a5ae 100644
--- a/examples/demo/src/main/java/demoapp/dom/actions/depargs/DemoItem.java
+++ b/examples/demo/src/main/java/demoapp/dom/actions/depargs/DemoItem.java
@@ -27,6 +27,7 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 
 import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -35,6 +36,7 @@ import lombok.Setter;
 @Named("depargs.DemoItem")
 @NoArgsConstructor 
 @AllArgsConstructor(staticName="of")
+@EqualsAndHashCode
 public class DemoItem {
 
     public String title() {