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