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"); } /**
