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 2022/09/20 06:13:00 UTC

[isis] branch master updated: ISIS-3215: proof of concept: tell server-side that select2 selection has changed

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 072eeffad7 ISIS-3215: proof of concept: tell server-side that select2 selection has changed
072eeffad7 is described below

commit 072eeffad78557566e8499346ef3477fa23c5b41
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 20 08:12:51 2022 +0200

    ISIS-3215: proof of concept: tell server-side that select2 selection has
    changed
---
 .../ui/components/widgets/select2/Select2.java     | 56 ++++++++++++++++------
 1 file changed, 41 insertions(+), 15 deletions(-)

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 b440c4ee95..aab59cdf9e 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
@@ -20,14 +20,17 @@ package org.apache.isis.viewer.wicket.ui.components.widgets.select2;
 
 import java.io.Serializable;
 import java.util.List;
+import java.util.Optional;
 
 import org.apache.wicket.Component;
+import org.apache.wicket.behavior.AbstractAjaxBehavior;
 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.request.mapper.parameter.INamedParameters.NamedPair;
 import org.apache.wicket.validation.IValidator;
 import org.wicketstuff.select2.AbstractSelect2Choice;
 import org.wicketstuff.select2.JQuery;
@@ -42,6 +45,7 @@ import org.apache.isis.viewer.wicket.model.models.HasCommonContext;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModelWithMultiChoice;
 import org.apache.isis.viewer.wicket.model.models.ScalarModelWithSingleChoice;
+import org.apache.isis.viewer.wicket.model.util.PageParameterUtils;
 import org.apache.isis.viewer.wicket.model.util.WktContext;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ChoiceProviderAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ChoiceProviderAbstractForScalarModel;
@@ -188,28 +192,50 @@ implements
     }
 
     /**
-     * Listen on select2:select events so that we then can send an AJAX request with the selected object(.id),
+     * Listen on select2:select events so that we then can send an AJAX request with all selected object(.id)s,
      * 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 {
+    static class Select2OnSelect extends AbstractAjaxBehavior {
         private static final long serialVersionUID = 1L;
+        private static enum Event {
+            SELECT, UNSELECT, CLEAR;
+            String key() { return name().toLowerCase(); }
+            static Optional<Event> valueOf(final NamedPair pair) {
+                for(val event : Event.values()) {
+                    if(event.name().equalsIgnoreCase(pair.getKey())) {
+                        return Optional.of(event);
+                    }
+                }
+                return Optional.empty();
+            }
+        };
         @Override public void renderHead(final Component component, final IHeaderResponse response) {
+            for(val event : Event.values()) {
+                response.render(OnDomReadyHeaderItem.forScript(JQuery.execute("$('#%s')"
+                        + ".on('select2:%s', function (e) {"
+                        + "var data = e.params.data;"
+                        //debug + "console.log(e);"
+                        + "Wicket.Ajax.get({'u': '%s&%s=' + data.id});"
+                        + "});",
+                        component.getMarkupId(),
+                        event.key(),
+                        getCallbackUrl(),
+                        event.key()
+                        )));
+            }
+        }
 
-            /* 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())));
+        @Override public void onRequest() {
+            PageParameterUtils.streamCurrentRequestParameters()
+            .forEach(pair->
+                Event.valueOf(pair).ifPresent(event->{
+                    val itemId = ObjectMemento.destringFromUrlBase64(pair.getValue());
+                    //TODO update the param negotiation model
+                    //System.err.printf("onRequest %s->%s%n", event, itemId.getTitle());
+                })
+            );
         }
     }