WICKET-3367
Rewrite all JavaScript inline event handlers to be proper attached event 
handlers

* Allow Ajax behaviors to listen on more than one event types.
* Improve AjaxEditable components by using properly the new 
AjaxRequestAttributes.
Now keyboard bindings (ESC, ENTER) also work.


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/b15163ed
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/b15163ed
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/b15163ed

Branch: refs/heads/master
Commit: b15163edefa88d83e4cb54fe6b233e4c65bb255e
Parents: 9f89761
Author: martin-g <[email protected]>
Authored: Mon Jan 2 18:15:18 2012 +0200
Committer: martin-g <[email protected]>
Committed: Mon Jan 2 18:15:18 2012 +0200

----------------------------------------------------------------------
 .../wicket/ajax/AbstractDefaultAjaxBehavior.java   |    6 +-
 .../org/apache/wicket/ajax/AjaxEventBehavior.java  |    2 +-
 .../ajax/attributes/AjaxRequestAttributes.java     |   17 ++--
 .../wicket/ajax/res/js/wicket-ajax-jquery.js       |   16 ++--
 .../ajax/markup/html/AjaxEditableChoiceLabel.java  |   36 ++------
 .../ajax/markup/html/AjaxEditableLabel.java        |   73 ++++++++------
 .../markup/html/AjaxEditableMultiLineLabel.java    |   70 ++++++--------
 .../ajax/markup/html/AjaxLazyLoadPanel.java        |    2 +-
 8 files changed, 102 insertions(+), 120 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/b15163ed/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
 
b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
index 488e9d7..15eb352 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
@@ -335,10 +335,10 @@ public abstract class AbstractDefaultAjaxBehavior extends 
AbstractAjaxBehavior
                                attributesJson.put("async", false);
                        }
 
-                       String eventName = attributes.getEventName();
-                       if (Strings.isEmpty(eventName) == false)
+                       String[] eventNames = attributes.getEventNames();
+                       for (String eventName : eventNames)
                        {
-                               attributesJson.put("e", eventName);
+                               attributesJson.append("e", eventName);
                        }
 
                        AjaxChannel channel = attributes.getChannel();

http://git-wip-us.apache.org/repos/asf/wicket/blob/b15163ed/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxEventBehavior.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxEventBehavior.java 
b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxEventBehavior.java
index 3a39d97..2a7c4ff 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxEventBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxEventBehavior.java
@@ -105,7 +105,7 @@ public abstract class AjaxEventBehavior extends 
AbstractDefaultAjaxBehavior
        {
                super.updateAjaxAttributes(attributes);
 
-               attributes.setEventName(event);
+               attributes.setEventNames(event);
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/b15163ed/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java
 
b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java
index 4dd0b21..3422f37 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java
@@ -59,9 +59,9 @@ public final class AjaxRequestAttributes
        private boolean allowDefault = false;
 
        /**
-        * The name of the event that will trigger the Ajax call
+        * The names of the events which will trigger the Ajax call
         */
-       private String eventName = null;
+       private String[] eventNames = new String[0];
 
        /**
         * The id of the for that should be submitted
@@ -468,19 +468,20 @@ public final class AjaxRequestAttributes
        /**
         * @return the name of the event that will trigger the Ajax call
         */
-       public String getEventName()
+       public String[] getEventNames()
        {
-               return eventName;
+               return eventNames;
        }
 
        /**
-        * @param eventName
-        *            the name of the event that will trigger the Ajax call
+        * @param eventNames
+        *            the names of the events which will trigger the Ajax call
         * @return this object
         */
-       public AjaxRequestAttributes setEventName(String eventName)
+       public AjaxRequestAttributes setEventNames(String... eventNames)
        {
-               this.eventName = eventName;
+               Args.notNull(eventNames, "eventNames");
+               this.eventNames = eventNames;
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/b15163ed/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js 
b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
index f91ff9a..23f06a3 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
+++ 
b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
@@ -409,7 +409,7 @@
                                        if (jQuery.isFunction(dep)) {
                                                extraParam = dep();
                                        } else {
-                                               extraParam = new 
Function(dep)();
+                                               extraParam = new 
Function('attrs', dep)(attrs);
                                        }
                                        data = jQuery.extend({}, data, 
extraParam);
                                }
@@ -457,7 +457,7 @@
                                                        if 
(jQuery.isFunction(precondition)) {
                                                                result = 
precondition();
                                                        } else {
-                                                               result = new 
Function(precondition)();
+                                                               result = new 
Function('attrs', precondition)(attrs);
                                                        }
                                                        if (result === false) {
                                                                
Wicket.Log.info("Ajax request stopped because of precondition check, url: " + 
attrs.u);
@@ -1423,13 +1423,15 @@
                        ajax: function(attrs) {
 
                                var target      = attrs.c || window;
-                               var evt         = attrs.e || 'domready';
+                               var events      = attrs.e || [ 'domready' ];
 
-                               Wicket.Event.add(target, evt, function (event) {
-                                       var call = new Wicket.Ajax.Call();
-                                       attrs.event = event;
+                               jQuery.each(events, function (idx, evt) {
+                                       Wicket.Event.add(target, evt, function 
(jqEvent) {
+                                               var call = new 
Wicket.Ajax.Call();
+                                               attrs.event = jqEvent;
 
-                                       return call.ajax(attrs);
+                                               return call.ajax(attrs);
+                                       });
                                });
                        }
                },

http://git-wip-us.apache.org/repos/asf/wicket/blob/b15163ed/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableChoiceLabel.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableChoiceLabel.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableChoiceLabel.java
index f18c46f..1895620 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableChoiceLabel.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableChoiceLabel.java
@@ -16,16 +16,10 @@
  */
 package org.apache.wicket.extensions.ajax.markup.html;
 
-import java.util.List;
-
-import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
-import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupStream;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
-import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.html.WebComponent;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.DropDownChoice;
@@ -38,6 +32,8 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.string.Strings;
 
+import java.util.List;
+
 
 /**
  * An inplace editor much like {@link AjaxEditableLabel}, but instead of a 
{@link TextField} a
@@ -209,30 +205,14 @@ public class AjaxEditableChoiceLabel<T> extends 
AjaxEditableLabel<T>
                        private static final long serialVersionUID = 1L;
 
                        @Override
-                       public void renderHead(final Component component, final 
IHeaderResponse response)
+                       protected void 
updateAjaxAttributes(AjaxRequestAttributes attributes)
                        {
-                               super.renderHead(component, response);
-
-                               AjaxRequestAttributes saveAttributes = 
getAttributes();
-                               saveAttributes.getExtraParameters().put("save", 
"true");
-                               saveAttributes.getDynamicExtraParameters().add(
-                                       
"this.name+'='+Wicket.Form.encode(this.value)");
-                               saveAttributes.setEventName("change");
-
-                               CharSequence saveAttributesJson = 
renderAjaxAttributes(component, saveAttributes);
-                               String saveCall = "Wicket.Ajax.ajax(" + 
saveAttributesJson + ")";
-
-                               AjaxRequestTarget target = 
AjaxRequestTarget.get();
-                               if (target != null)
-                               {
-                                       target.appendJavaScript(saveCall);
-                               }
-                               else
-                               {
-                                       
response.render(JavaScriptHeaderItem.forScript(saveCall, "editable-blur-" + 
component.getMarkupId()));
-                               }
+                               super.updateAjaxAttributes(attributes);
+                               attributes.setEventNames("change");
+                               attributes.getExtraParameters().put("save", 
"true");
+                               List<CharSequence> dynamicParameters = 
attributes.getDynamicExtraParameters();
+                               dynamicParameters.add("return 
Wicket.Form.serializeElement(attrs.c)");
                        }
-
                });
                return editor;
        }

http://git-wip-us.apache.org/repos/asf/wicket/blob/b15163ed/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabel.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabel.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabel.java
index 7030f4e..2e51233 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabel.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableLabel.java
@@ -16,18 +16,16 @@
  */
 package org.apache.wicket.extensions.ajax.markup.html;
 
-import java.io.Serializable;
-
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxEventBehavior;
-import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
+import org.apache.wicket.ajax.attributes.JavaScriptPrecondition;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.markup.html.form.TextField;
@@ -39,6 +37,7 @@ import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.string.JavaScriptUtils;
 import org.apache.wicket.validation.IValidator;
 
+import java.io.Serializable;
 
 /**
  * An implementation of ajaxified edit-in-place component using a {@link 
TextField} as it's editor.
@@ -95,35 +94,15 @@ public class AjaxEditableLabel<T> extends Panel
                {
                        super.renderHead(component, response);
 
-                       AjaxRequestAttributes saveAttributes = getAttributes();
-                       saveAttributes.getExtraParameters().put("save", "true");
-                       saveAttributes.getDynamicExtraParameters().add(
-                               "this.name+'='+Wicket.Form.encode(this.value)");
-                       saveAttributes.setEventName("blur");
-
-                       AjaxRequestAttributes cancelAttributes = 
getAttributes();
-                       cancelAttributes.getExtraParameters().put("save", 
"false");
-                       cancelAttributes.setEventName("keyup");
-
-                       CharSequence saveAttributesJson = 
renderAjaxAttributes(component, saveAttributes);
-                       String saveCall = "Wicket.Ajax.ajax(" + 
saveAttributesJson + ");";
-
-                       CharSequence cancelAttributesJson = 
renderAjaxAttributes(component, cancelAttributes);
-                       String cancelCall = "Wicket.Ajax.ajax(" + 
cancelAttributesJson + ");";
-
-                       final String keyup = "var 
kc=Wicket.Event.keyCode(attrs.event); if (kc===27) " +
-                               cancelCall + " else if (kc===13) " + saveCall;
-
                        AjaxRequestTarget target = AjaxRequestTarget.get();
                        if (target != null)
                        {
-                               target.appendJavaScript(saveCall);
-                               target.appendJavaScript(keyup);
-                       }
-                       else
-                       {
-                               
response.render(JavaScriptHeaderItem.forScript(saveCall, "editable-blur-" + 
component.getMarkupId()));
-                               
response.render(JavaScriptHeaderItem.forScript(keyup, "editable-keydown-" + 
component.getMarkupId()));
+                               AjaxRequestAttributes attributes = 
getAttributes();
+
+                               CharSequence attributesJson = 
renderAjaxAttributes(component, attributes);
+                               String jsCall = "Wicket.Ajax.ajax(" + 
attributesJson + ");";
+
+                               target.appendJavaScript(jsCall);
                        }
                }
 
@@ -326,7 +305,39 @@ public class AjaxEditableLabel<T> extends Panel
                };
                editor.setOutputMarkupId(true);
                editor.setVisible(false);
-               editor.add(new EditorAjaxBehavior());
+               editor.add(new EditorAjaxBehavior() {
+                       @Override
+                       protected void 
updateAjaxAttributes(AjaxRequestAttributes attributes)
+                       {
+                               super.updateAjaxAttributes(attributes);
+                               attributes.setEventNames("blur", "keyup");
+
+                               CharSequence dynamicExtraParameters =
+                                               "var result = {}, " +
+                                                               
"kc=Wicket.Event.keyCode(attrs.event)," +
+                                                               
"evtType=attrs.event.type;" +
+                                                               "if (evtType 
=== 'keyup') {" +
+                                                               // ESCAPE key
+                                                               "if (kc===27) { 
result.save = false }" +
+
+                                                               // ENTER key
+                                                               "else if 
(kc===13) { result = Wicket.Form.serializeElement(attrs.c); result.save = true; 
}" +
+                                                               "}" +
+                                                               "else if 
(evtType==='blur') { result = Wicket.Form.serializeElement(attrs.c); 
result.save = true; }" +
+                                                               "return 
result;";
+                               
attributes.getDynamicExtraParameters().add(dynamicExtraParameters);
+
+                               CharSequence precondition =
+                                               "var 
kc=Wicket.Event.keyCode(attrs.event),"+
+                                                               
"evtType=attrs.event.type,"+
+                                                               "ret=false;"+
+                                                               
"if(evtType==='blur' || (evtType==='keyup' && (kc===27 || kc===13))) ret = 
true;"+
+                                                               "return ret;";
+                               JavaScriptPrecondition javaScriptPrecondition = 
new JavaScriptPrecondition(precondition);
+                               
attributes.getPreconditions().add(javaScriptPrecondition);
+
+                       }
+               });
                return editor;
        }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/b15163ed/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableMultiLineLabel.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableMultiLineLabel.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableMultiLineLabel.java
index 56a8b69..5b8654e 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableMultiLineLabel.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableMultiLineLabel.java
@@ -17,21 +17,20 @@
 package org.apache.wicket.extensions.ajax.markup.html;
 
 import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
 import org.apache.wicket.ajax.attributes.AjaxRequestAttributes.Method;
-import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.attributes.JavaScriptPrecondition;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupStream;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.html.basic.MultiLineLabel;
 import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.markup.html.form.TextArea;
 import org.apache.wicket.model.AbstractReadOnlyModel;
 import org.apache.wicket.model.IModel;
 
+import java.util.List;
+
 /**
  * An inplace editor much like {@link AjaxEditableLabel}, but now with support 
for multi line
  * content and a {@link TextArea text area} as its editor.
@@ -177,45 +176,34 @@ public class AjaxEditableMultiLineLabel<T> extends 
AjaxEditableLabel<T>
                        private static final long serialVersionUID = 1L;
 
                        @Override
-                       public void renderHead(final Component component, final 
IHeaderResponse response)
+                       protected void 
updateAjaxAttributes(AjaxRequestAttributes attributes)
                        {
-                               super.renderHead(component, response);
-
-                               AjaxRequestAttributes saveAttributes = 
getAttributes();
-                               saveAttributes.getExtraParameters().put("save", 
"true");
-                               saveAttributes.setMethod(Method.POST);
-                               saveAttributes.getDynamicExtraParameters().add(
-                                       
"this.name+'='+Wicket.Form.encode(this.value)");
-                               saveAttributes.setEventName("blur");
-
-                               AjaxRequestAttributes cancelAttributes = 
getAttributes();
-                               
cancelAttributes.getExtraParameters().put("save", "false");
-                               cancelAttributes.setEventName("keydown");
-
-                               CharSequence saveAttributesJson = 
renderAjaxAttributes(component, saveAttributes);
-                               String saveCall = "Wicket.Ajax.ajax(" + 
saveAttributesJson + ")";
-
-                               CharSequence cancelAttributesJson = 
renderAjaxAttributes(component,
-                                       cancelAttributes);
-                               String cancelCall = "Wicket.Ajax.ajax(" + 
cancelAttributesJson + ")";
-
-                               final String keydown = "var 
kc=Wicket.Event.keyCode(attrs.event); if (kc===27) " +
-                                       cancelCall + " else if (kc===13) " + 
saveCall;
+                               super.updateAjaxAttributes(attributes);
+                               attributes.setMethod(Method.POST);
+                               attributes.setEventNames("blur", "keyup");
+                               CharSequence dynamicExtraParameters =
+                                               "var result = {}, " +
+                                                               
"kc=Wicket.Event.keyCode(attrs.event)," +
+                                                               
"evtType=attrs.event.type;" +
+                                                               "if (evtType 
=== 'keyup') {" +
+                                                                       // 
ESCAPE key
+                                                                       "if 
(kc===27) { result.save = false }" +
+                                                               "}" +
+                                                               "else if 
(evtType==='blur') { result = Wicket.Form.serializeElement(attrs.c); 
result.save = true; }" +
+                                                               "return 
result;";
+                               List<CharSequence> dynamicParameters = 
attributes.getDynamicExtraParameters();
+                               dynamicParameters.add(dynamicExtraParameters);
 
-                               AjaxRequestTarget target = 
AjaxRequestTarget.get();
-                               if (target != null)
-                               {
-                                       target.appendJavaScript(saveCall);
-                                       target.appendJavaScript(keydown);
-                               }
-                               else
-                               {
-                                       
response.render(JavaScriptHeaderItem.forScript(saveCall, "editable-blur-" + 
component.getMarkupId()));
-                                       
response.render(JavaScriptHeaderItem.forScript(keydown,
-                                               "editable-keydown-" + 
component.getMarkupId()));
-                               }
+                               CharSequence precondition =
+                                               "var 
kc=Wicket.Event.keyCode(attrs.event),"+
+                                                               
"evtType=attrs.event.type,"+
+                                                               "ret=false;"+
+                                                               
"if(evtType==='blur' || (evtType==='keyup' && (kc===27))) ret = true;"+
+                                                               "return ret;";
+                               JavaScriptPrecondition javaScriptPrecondition = 
new JavaScriptPrecondition(precondition);
+                               List<JavaScriptPrecondition> preconditions = 
attributes.getPreconditions();
+                               preconditions.add(javaScriptPrecondition);
                        }
-
                });
                return editor;
        }

http://git-wip-us.apache.org/repos/asf/wicket/blob/b15163ed/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxLazyLoadPanel.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxLazyLoadPanel.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxLazyLoadPanel.java
index e2a3886..75f5bce 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxLazyLoadPanel.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxLazyLoadPanel.java
@@ -115,7 +115,7 @@ public abstract class AjaxLazyLoadPanel extends Panel
 
        protected void updateAjaxAttributes(AjaxRequestAttributes attributes)
        {
-               attributes.setEventName("domready");
+               attributes.setEventNames("domready");
        }
 
        /**

Reply via email to