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 d39a70fb11 ISIS-3215: proof of concept, that we can listen on 
select2:select
d39a70fb11 is described below

commit d39a70fb11bebcb652d0c2688a081746c9e5bab9
Author: Andi Huber <[email protected]>
AuthorDate: Mon Sep 19 17:05:48 2022 +0200

    ISIS-3215: proof of concept, that we can listen on select2:select
    
    - yet only logging to console (client-side)
---
 .../isis/commons/internal/base/_NullSafe.java      |  5 +--
 .../core/metamodel/facets/ParameterSupport.java    | 30 ++++++++--------
 .../ActionParameterAutoCompleteFacet.java          |  2 ++
 .../ActionParameterAutoCompleteFacetViaMethod.java | 15 +++++---
 ...ParameterAutoCompleteFacetViaMethodFactory.java |  4 +--
 .../ActionParameterChoicesFacetViaMethod.java      | 12 ++++---
 ...ctionParameterChoicesFacetViaMethodFactory.java |  4 +--
 .../specimpl/ObjectActionParameterAbstract.java    | 10 ++++--
 .../ui/components/scalars/ScalarPanelAbstract.java |  3 +-
 .../scalars/ScalarPanelSelectAbstract.java         | 10 +++++-
 .../scalars/reference/ReferencePanel.java          | 41 ++++++++++++++++------
 .../valuechoices/ValueChoicesSelect2Panel.java     | 38 +++++++++++---------
 .../ui/components/widgets/select2/Select2.java     | 33 +++++++++++++++++
 .../common/viewer/js/jquery.isis.wicket.viewer.js  | 16 ++++-----
 .../org/apache/isis/viewer/wicket/ui/util/Wkt.java |  2 +-
 15 files changed, 156 insertions(+), 69 deletions(-)

diff --git 
a/commons/src/main/java/org/apache/isis/commons/internal/base/_NullSafe.java 
b/commons/src/main/java/org/apache/isis/commons/internal/base/_NullSafe.java
index 37550f6a83..65b3d90c16 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/base/_NullSafe.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/base/_NullSafe.java
@@ -36,6 +36,7 @@ import java.util.stream.StreamSupport;
 import org.springframework.lang.Nullable;
 
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.collections.ImmutableCollection;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
 
 /**
@@ -190,8 +191,8 @@ public final class _NullSafe {
         if(pojo instanceof Collection) {
             return ((Collection<?>)pojo).stream();
         }
-        if(pojo instanceof Can) {
-            return ((Can<?>)pojo).stream();
+        if(pojo instanceof ImmutableCollection) {
+            return ((ImmutableCollection<?>)pojo).stream();
         }
         if(pojo.getClass().isArray()) {
             if(Array.getLength(pojo)==0) return Stream.empty();
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
index c53629e8f1..451349d0e6 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
@@ -33,6 +33,7 @@ import 
org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ReturnTyp
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderPAT;
 import 
org.apache.isis.core.metamodel.methods.MethodFinderPAT.MethodAndPatConstructor;
+import org.apache.isis.core.metamodel.spec.TypeOfAnyCardinality;
 
 import lombok.Builder;
 import lombok.Getter;
@@ -74,8 +75,8 @@ public final class ParameterSupport {
         int paramIndex;
         Class<?> paramType;
         Method supportingMethod;
-        Class<?> returnType;
         Optional<Constructor<?>> patConstructor;
+        TypeOfAnyCardinality paramSupportReturnType;
     }
 
     @FunctionalInterface
@@ -141,19 +142,21 @@ public final class ParameterSupport {
                 
.withReturnTypeAnyOf(searchRequest.getReturnTypePattern().matchingTypes(paramType)),
                 paramTypes,
                 searchRequest.getAdditionalParamTypes())
-        .map(methodAndPatConstructor->toSearchResult(paramIndex, paramType, 
methodAndPatConstructor))
+        .map(methodAndPatConstructor->toSearchResult(type, paramIndex, 
paramType, methodAndPatConstructor))
         .forEach(onMethodFound);
     }
 
     private static ParamSupportingMethodSearchResult toSearchResult(
+            final Class<?> declaringClass,
             final int paramIndex,
             final Class<?> paramType,
             final MethodAndPatConstructor supportingMethodAndPatConstructor) {
         return ParamSupportingMethodSearchResult
                 .of(paramIndex, paramType,
-                        
supportingMethodAndPatConstructor.getSupportingMethod(),
-                        
supportingMethodAndPatConstructor.getSupportingMethod().getReturnType(),
-                        
Optional.of(supportingMethodAndPatConstructor.getPatConstructor()));
+                    supportingMethodAndPatConstructor.getSupportingMethod(),
+                    
Optional.of(supportingMethodAndPatConstructor.getPatConstructor()),
+                    TypeOfAnyCardinality.forMethodReturn(
+                            declaringClass, 
supportingMethodAndPatConstructor.getSupportingMethod()));
     }
 
     private static void singleArgBeingParamType(
@@ -172,7 +175,7 @@ public final class ParameterSupport {
         .memberSupport(type, methodNames, 
processMethodContext.getIntrospectionPolicy())
         
.withReturnTypeAnyOf(searchRequest.getReturnTypePattern().matchingTypes(paramType))
         .streamMethodsMatchingSignature(signature)
-        .map(supportingMethod->toSearchResult(paramIndex, paramType, 
supportingMethod))
+        .map(supportingMethod->toSearchResult(type, paramIndex, paramType, 
supportingMethod))
         .forEach(onMethodFound);
     }
 
@@ -193,9 +196,7 @@ public final class ParameterSupport {
 
         //limit: [0 .. paramIndex + 1]
         for(int limit = paramIndex + 1; limit>=0; --limit) {
-
             val signature = concat(paramTypes, limit, additionalParamTypes);
-
             val supportingMethod =
                     MethodFinder
                     .memberSupport(type, methodNames, 
processMethodContext.getIntrospectionPolicy())
@@ -203,25 +204,24 @@ public final class ParameterSupport {
                     .streamMethodsMatchingSignature(signature)
                     .findFirst()
                     .orElse(null);
-
             if(supportingMethod != null) {
-                onMethodFound.accept(toSearchResult(paramIndex, paramType, 
supportingMethod));
+                onMethodFound.accept(toSearchResult(type, paramIndex, 
paramType, supportingMethod));
                 return;
             }
-
         }
-
     }
 
     private static ParamSupportingMethodSearchResult toSearchResult(
+            final Class<?> declaringClass,
             final int paramIndex,
             final Class<?> paramType,
             final Method supportingMethod) {
         return ParamSupportingMethodSearchResult
                 .of(paramIndex, paramType,
-                        supportingMethod,
-                        supportingMethod.getReturnType(),
-                        Optional.empty());
+                    supportingMethod,
+                    Optional.empty(),
+                    TypeOfAnyCardinality.forMethodReturn(
+                            declaringClass, supportingMethod));
     }
 
     /**
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacet.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacet.java
index c60f8bee3e..70aae52852 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacet.java
@@ -22,6 +22,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.object.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 /**
  * Obtain auto-completion for each of the parameters of the action.
@@ -34,6 +35,7 @@ import org.apache.isis.core.metamodel.object.ManagedObject;
 public interface ActionParameterAutoCompleteFacet extends Facet {
 
     public Can<ManagedObject> autoComplete(
+            ObjectSpecification requiredSpec,
             ManagedObject inObject,
             Can<ManagedObject> pendingArgs,
             String searchArg,
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
index 09fc8d62ad..fa3b09aef1 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
@@ -25,6 +25,7 @@ import java.util.Optional;
 import java.util.function.BiConsumer;
 
 import org.apache.isis.commons.collections.Can;
+import 
org.apache.isis.core.config.progmodel.ProgrammingModelConstants.CollectionSemantics;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
@@ -33,6 +34,8 @@ import 
org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
 import org.apache.isis.core.metamodel.object.MmInvokeUtil;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.TypeOfAnyCardinality;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -43,19 +46,19 @@ extends ActionParameterAutoCompleteFacetAbstract
 implements ImperativeFacet {
 
     @Getter(onMethod_ = {@Override}) private final @NonNull Can<Method> 
methods;
-    private final Class<?> choicesType;
+    private final TypeOfAnyCardinality paramSupportReturnType;
     private final int minLength;
     private final Optional<Constructor<?>> patConstructor;
 
     public ActionParameterAutoCompleteFacetViaMethod(
             final Method method,
-            final Class<?> choicesType,
+            final TypeOfAnyCardinality paramSupportReturnType,
             final Optional<Constructor<?>> patConstructor,
             final FacetHolder holder) {
 
         super(holder);
         this.methods = ImperativeFacet.singleMethod(method);
-        this.choicesType = choicesType;
+        this.paramSupportReturnType = paramSupportReturnType;
         this.minLength = MinLengthUtil.determineMinLength(method);
         this.patConstructor = patConstructor;
     }
@@ -72,6 +75,7 @@ implements ImperativeFacet {
 
     @Override
     public Can<ManagedObject> autoComplete(
+            final ObjectSpecification elementSpec,
             final ManagedObject owningAdapter,
             final Can<ManagedObject> pendingArgs,
             final String searchArg,
@@ -87,7 +91,6 @@ implements ImperativeFacet {
         if (collectionOrArray == null) {
             return Can.empty();
         }
-        val elementSpec = specForTypeElseFail(choicesType);
         val visibleChoices = ManagedObjects
                 .adaptMultipleOfTypeThenFilterByVisibility(
                         elementSpec, collectionOrArray, 
interactionInitiatedBy);
@@ -99,7 +102,9 @@ implements ImperativeFacet {
     public void visitAttributes(final BiConsumer<String, Object> visitor) {
         super.visitAttributes(visitor);
         ImperativeFacet.visitAttributes(this, visitor);
-        visitor.accept("choicesType", choicesType);
+        visitor.accept("choicesType", 
paramSupportReturnType.getCollectionSemantics()
+                .map(CollectionSemantics::name)
+                .orElse("NONE"));
         visitor.accept("minLength", minLength);
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
index 8e0f782475..e9f2e894a6 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
@@ -44,11 +44,11 @@ extends ActionParameterSupportFacetFactoryAbstract {
             final FacetedMethodParameter paramAsHolder,
             final ParamSupportingMethodSearchResult searchResult) {
         val autoCompleteMethod = searchResult.getSupportingMethod();
-        val paramType = searchResult.getParamType();
         val patConstructor = searchResult.getPatConstructor();
+        val paramSupportReturnType = searchResult.getParamSupportReturnType();
         addFacet(
                 new ActionParameterAutoCompleteFacetViaMethod(
-                        autoCompleteMethod, paramType, patConstructor, 
paramAsHolder));
+                        autoCompleteMethod, paramSupportReturnType, 
patConstructor, paramAsHolder));
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
index 5da09ccd5e..d46a070bd0 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
@@ -24,6 +24,7 @@ import java.util.Optional;
 import java.util.function.BiConsumer;
 
 import org.apache.isis.commons.collections.Can;
+import 
org.apache.isis.core.config.progmodel.ProgrammingModelConstants.CollectionSemantics;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
@@ -33,6 +34,7 @@ import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
 import org.apache.isis.core.metamodel.object.MmInvokeUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.TypeOfAnyCardinality;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -43,18 +45,18 @@ extends ActionParameterChoicesFacetAbstract
 implements ImperativeFacet {
 
     @Getter(onMethod_ = {@Override}) private final @NonNull Can<Method> 
methods;
-    private final Class<?> choicesType;
+    private final TypeOfAnyCardinality paramSupportReturnType;
     private final Optional<Constructor<?>> patConstructor;
 
     public ActionParameterChoicesFacetViaMethod(
             final Method method,
-            final Class<?> choicesType,
+            final TypeOfAnyCardinality paramSupportReturnType,
             final Optional<Constructor<?>> patConstructor,
             final FacetHolder holder) {
 
         super(holder);
         this.methods = ImperativeFacet.singleMethod(method);
-        this.choicesType = choicesType;
+        this.paramSupportReturnType = paramSupportReturnType;
         this.patConstructor = patConstructor;
     }
 
@@ -89,7 +91,9 @@ implements ImperativeFacet {
     public void visitAttributes(final BiConsumer<String, Object> visitor) {
         super.visitAttributes(visitor);
         ImperativeFacet.visitAttributes(this, visitor);
-        visitor.accept("choicesType", choicesType);
+        visitor.accept("choicesType", 
paramSupportReturnType.getCollectionSemantics()
+                .map(CollectionSemantics::name)
+                .orElse("NONE"));
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
index 480f190f5b..ad35c37cef 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
@@ -41,11 +41,11 @@ extends ActionParameterSupportFacetFactoryAbstract {
             final FacetedMethodParameter paramAsHolder,
             final ParamSupportingMethodSearchResult searchResult) {
         val choicesMethod = searchResult.getSupportingMethod();
-        val returnType = searchResult.getReturnType();
         val patConstructor = searchResult.getPatConstructor();
+        val paramSupportReturnType = searchResult.getParamSupportReturnType();
         addFacet(
                 new ActionParameterChoicesFacetViaMethod(
-                        choicesMethod, returnType, patConstructor, 
paramAsHolder));
+                        choicesMethod, paramSupportReturnType, patConstructor, 
paramAsHolder));
     }
 
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index ad45cb72a9..6d33abbb53 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -186,9 +186,15 @@ implements
             return Can.empty();
         }
 
+        val paramSpec = getElementType();
+
         val visibleChoices = autoCompleteFacet
-                .autoComplete(pendingArgs.getActionTarget(), 
pendingArgs.getParamValues(), searchArg, interactionInitiatedBy);
-        checkChoicesOrAutoCompleteType(getSpecificationLoader(), 
visibleChoices, getElementType());
+                .autoComplete(paramSpec,
+                        pendingArgs.getActionTarget(),
+                        pendingArgs.getParamValues(),
+                        searchArg,
+                        interactionInitiatedBy);
+        checkChoicesOrAutoCompleteType(getSpecificationLoader(), 
visibleChoices, paramSpec);
 
         return visibleChoices;
     }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index 9963592a18..720254b970 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -65,12 +65,13 @@ import org.apache.isis.viewer.wicket.ui.util.WktComponents;
 import org.apache.isis.viewer.wicket.ui.util.WktDecorators;
 import org.apache.isis.viewer.wicket.ui.util.WktTooltips;
 
-import 
de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.val;
 
+import 
de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+
 public abstract class ScalarPanelAbstract
 extends PanelAbstract<ManagedObject, ScalarModel>
 implements ScalarModelSubscriber {
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
index 79aa55330d..f4d721da62 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars;
 
+import java.io.Serializable;
 import java.util.Optional;
 import java.util.function.Function;
 
@@ -44,9 +45,16 @@ extends ScalarPanelFormFieldAbstract<ManagedObject> {
 
     private static final long serialVersionUID = 1L;
 
+    public static interface ChoiceTitleHandler extends Serializable {
+        void clearTitleAttribute();
+        void setTitleAttribute(@Nullable String titleAttribute);
+    }
+
     protected Select2 select2;
 
-    public ScalarPanelSelectAbstract(final String id, final ScalarModel 
scalarModel) {
+    public ScalarPanelSelectAbstract(
+            final String id,
+            final ScalarModel scalarModel) {
         super(id, scalarModel, ManagedObject.class);
         setOutputMarkupId(true);
     }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 3e96ccb307..2b98c4fc46 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -30,17 +30,17 @@ import org.apache.wicket.util.convert.ConversionException;
 import org.apache.wicket.util.convert.IConverter;
 
 import 
org.apache.isis.applib.services.placeholder.PlaceholderRenderService.PlaceholderLiteral;
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.viewer.commons.model.components.UiComponentType;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import 
org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.CompactFragment;
 import 
org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.FieldFrame;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
 import 
org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelSelectAbstract;
+import 
org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelSelectAbstract.ChoiceTitleHandler;
 import 
org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanel;
 import 
org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ChoiceProviderForReferences;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
-import org.apache.isis.viewer.wicket.ui.util.Wkt.EventTopic;
 import org.apache.isis.viewer.wicket.ui.util.WktComponents;
 
 import lombok.val;
@@ -49,7 +49,9 @@ import lombok.val;
  * Panel for rendering scalars which of are of reference type (as opposed to
  * value types).
  */
-public class ReferencePanel extends ScalarPanelSelectAbstract {
+public class ReferencePanel
+extends ScalarPanelSelectAbstract
+implements ChoiceTitleHandler {
 
     private static final long serialVersionUID = 1L;
 
@@ -118,16 +120,14 @@ public class ReferencePanel extends 
ScalarPanelSelectAbstract {
     protected void onNotEditable(final String disableReason, final 
Optional<AjaxRequestTarget> target) {
         super.onNotEditable(disableReason, target);
         if(isCompactFormat) return;
-        entityLink.setEnabled(false);
-        Wkt.attributeReplace(entityLink, "title", disableReason);
+        setTitleAttribute(disableReason);
     }
 
     @Override
     protected void onEditable(final Optional<AjaxRequestTarget> target) {
         super.onEditable(target);
         if(isCompactFormat) return;
-        entityLink.setEnabled(true);
-        Wkt.attributeReplace(entityLink, "title", "");
+        clearTitleAttribute();
     }
 
     private Optional<MarkupContainer> lookupScalarValueContainer() {
@@ -137,6 +137,9 @@ public class ReferencePanel extends 
ScalarPanelSelectAbstract {
     }
 
     private void syncWithInput() {
+
+        System.err.printf("syncWithInput %s%n", scalarModel().getObject());
+
         if(isCompactFormat) return;
 
         val scalarModel = scalarModel();
@@ -246,10 +249,28 @@ public class ReferencePanel extends 
ScalarPanelSelectAbstract {
 
     // --
 
+//    @Override
+//    public void onUpdate(final AjaxRequestTarget target, final 
ScalarPanelAbstract scalarPanel) {
+//        super.onUpdate(target, scalarPanel);
+//        Wkt.javaScriptAdd(target, EventTopic.CLOSE_SELECT2, getMarkupId());
+//    }
+
+    // -- CHOICE TITLE HANDLER
+
     @Override
-    public void onUpdate(final AjaxRequestTarget target, final 
ScalarPanelAbstract scalarPanel) {
-        super.onUpdate(target, scalarPanel);
-        Wkt.javaScriptAdd(target, EventTopic.CLOSE_SELECT2, getMarkupId());
+    public void clearTitleAttribute() {
+        entityLink.setEnabled(true);
+        Wkt.attributeReplace(entityLink, "title", "");
+    }
+
+    @Override
+    public void setTitleAttribute(final String titleAttribute) {
+        if(_Strings.isNullOrEmpty(titleAttribute)) {
+            clearTitleAttribute();
+            return;
+        }
+        entityLink.setEnabled(false);
+        Wkt.attributeReplace(entityLink, "title", titleAttribute);
     }
 
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
index 02948a09f5..9a83fbe88e 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -28,6 +28,7 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import 
org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelSelectAbstract;
+import 
org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelSelectAbstract.ChoiceTitleHandler;
 import 
org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ChoiceProviderForValues;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
 import org.apache.isis.viewer.wicket.ui.util.WktTooltips;
@@ -35,7 +36,8 @@ import org.apache.isis.viewer.wicket.ui.util.WktTooltips;
 import lombok.val;
 
 public class ValueChoicesSelect2Panel
-extends ScalarPanelSelectAbstract {
+extends ScalarPanelSelectAbstract
+implements ChoiceTitleHandler {
 
     private static final long serialVersionUID = 1L;
 
@@ -91,20 +93,6 @@ extends ScalarPanelSelectAbstract {
         select2.setEnabled(false);
     }
 
-    private void clearTitleAttribute() {
-        val target = getRegularFrame();
-        WktTooltips.clearTooltip(target);
-    }
-
-    private void setTitleAttribute(final String titleAttribute) {
-        if(_Strings.isNullOrEmpty(titleAttribute)) {
-            clearTitleAttribute();
-            return;
-        }
-        val target = getRegularFrame();
-        WktTooltips.addTooltip(target, titleAttribute);
-    }
-
     @Override
     protected void onNotEditable(final String disableReason, final 
Optional<AjaxRequestTarget> target) {
         super.onNotEditable(disableReason, target);
@@ -117,8 +105,26 @@ extends ScalarPanelSelectAbstract {
     protected void onEditable(final Optional<AjaxRequestTarget> target) {
         super.onEditable(target);
         if(isCompactFormat) return;
-        setTitleAttribute("");
+        clearTitleAttribute();
         select2.setEnabled(true);
     }
 
+    // -- CHOICE TITLE HANDLER
+
+    @Override
+    public void clearTitleAttribute() {
+        val target = getRegularFrame();
+        WktTooltips.clearTooltip(target);
+    }
+
+    @Override
+    public void setTitleAttribute(final String titleAttribute) {
+        if(_Strings.isNullOrEmpty(titleAttribute)) {
+            clearTitleAttribute();
+            return;
+        }
+        val target = getRegularFrame();
+        WktTooltips.addTooltip(target, titleAttribute);
+    }
+
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
index 258089212d..b440c4ee95 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
@@ -21,12 +21,16 @@ package 
org.apache.isis.viewer.wicket.ui.components.widgets.select2;
 import java.io.Serializable;
 import java.util.List;
 
+import org.apache.wicket.Component;
 import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.LambdaModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.validation.IValidator;
 import org.wicketstuff.select2.AbstractSelect2Choice;
+import org.wicketstuff.select2.JQuery;
 import org.wicketstuff.select2.Select2Choice;
 import org.wicketstuff.select2.Select2MultiChoice;
 
@@ -77,6 +81,9 @@ implements
         select2.setLabel(Model.of(scalarModel.getFriendlyName()));
         select2.getSettings().setWidth("100%");
 
+        // listen on select2:select events (client-side)
+        select2.add(new Select2OnSelect());
+
         return select2;
     }
 
@@ -180,6 +187,32 @@ implements
         });
     }
 
+    /**
+     * Listen on select2:select events so that we then can send an AJAX 
request with the selected object(.id),
+     * while still doing parameter negotiation; that is, not submitting the 
form yet.
+     * @see 
"https://select2.org/programmatic-control/events#listening-for-events";
+     * @since 2.0
+     */
+    static class Select2OnSelect extends Behavior {
+        private static final long serialVersionUID = 1L;
+        @Override public void renderHead(final Component component, final 
IHeaderResponse response) {
+
+            /* DEBUG
+            $('#sel-sample2').on('select2:select', function (e) {
+                var data = e.params.data;
+                console.log(data);
+                alert("selection-event: " + data.id);
+            });*/
+
+            
response.render(OnDomReadyHeaderItem.forScript(JQuery.execute("$('#%s')"
+                    + ".on('select2:select', function (e) {"
+                    + "var data = e.params.data;"
+                    + "console.log(data);"
+                    + "});",
+                    component.getMarkupId())));
+        }
+    }
+
     // -- HELPER
 
     private ObjectMemento memento() {
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/viewer/js/jquery.isis.wicket.viewer.js
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/viewer/js/jquery.isis.wicket.viewer.js
index ae3bdefe2d..73147e0d3b 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/viewer/js/jquery.isis.wicket.viewer.js
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/viewer/js/jquery.isis.wicket.viewer.js
@@ -94,14 +94,14 @@ $(function() {
         }, 0);
     });
 
-    Wicket.Event.subscribe(Isis.Topic.CLOSE_SELECT2, function(jqEvent, 
panelId) {
-        setTimeout(function() {
-            var $panel = $('#'+panelId);
-            //console.log('Isis.Topic.CLOSE_SELECT2: panelId=' + panelId);
-            //$($panel).find('select').select2('close');
-            //$($panel).find('select').filter(':visible:first').focus();
-        }, 0);
-    });
+//    Wicket.Event.subscribe(Isis.Topic.CLOSE_SELECT2, function(jqEvent, 
panelId) {
+//        setTimeout(function() {
+//            var $panel = $('#'+panelId);
+//            //console.log('Isis.Topic.CLOSE_SELECT2: panelId=' + panelId);
+//            //$($panel).find('select').select2('close');
+//            //$($panel).find('select').filter(':visible:first').focus();
+//        }, 0);
+//    });
 
     Wicket.Event.subscribe(Isis.Topic.FOCUS_FIRST_PARAMETER, function(jqEvent, 
elementId) {
         setTimeout(function() {
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java
index 37f240f9a0..5bcd4cf87b 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java
@@ -1008,7 +1008,7 @@ public class Wkt {
         FOCUS_FIRST_PROPERTY,
         FOCUS_FIRST_PARAMETER,
         OPEN_SELECT2,
-        CLOSE_SELECT2,
+        //CLOSE_SELECT2,
     }
 
     public void javaScriptAdd(final AjaxRequestTarget target, final EventTopic 
topic, final String containerId) {

Reply via email to