You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/01/02 17:16:24 UTC
[3/4] git commit: WICKET-3367 Rewrite all JavaScript inline event
handlers to be proper attached event handlers
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 <mg...@apache.org>
Authored: Mon Jan 2 18:15:18 2012 +0200
Committer: martin-g <mg...@apache.org>
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");
}
/**