Repository: wicket Updated Branches: refs/heads/wicket-6.x ffdefe28e -> 1d9c6b955
WICKET-6050 Wicket Ajax (Wicket.From.serializeElement) causes 400 bad request WICKET-5948 wicket-ajax.js probably doesn't traverse the children of <div> or <span> WICKET-6006 ModalWindow.closeCurrent() causes 414 status error Introduce AjaxRequestAttributes#serializeRecursively with default value 'false'. This is a flag indicating whether to collect (submit) the name/value pairs for all HTML form elements children of the HTML element with the JavaScript listener Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/1d9c6b95 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/1d9c6b95 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/1d9c6b95 Branch: refs/heads/wicket-6.x Commit: 1d9c6b955553d72e36b029e44bc07e3206fa4e88 Parents: ffdefe2 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Thu Dec 24 14:05:39 2015 +0100 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Thu Dec 24 14:13:59 2015 +0100 ---------------------------------------------------------------------- .../ajax/AbstractDefaultAjaxBehavior.java | 5 ++++ .../ajax/attributes/AjaxAttributeName.java | 11 +++++-- .../ajax/attributes/AjaxRequestAttributes.java | 23 +++++++++++++++ .../wicket/ajax/res/js/wicket-ajax-jquery.js | 31 +++++++++++++------- .../ajax/attributes/AjaxAttributeNameTest.java | 2 +- wicket-core/src/test/js/form.js | 11 ++++++- .../ajax/markup/html/modal/ModalWindow.java | 22 -------------- 7 files changed, 67 insertions(+), 38 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/1d9c6b95/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 06d52cd..bdab547 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 @@ -266,6 +266,11 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior attributesJson.put(AjaxAttributeName.CHILD_SELECTOR.jsonName(), childSelector); } + if (attributes.isSerializeRecursively()) + { + attributesJson.put(AjaxAttributeName.SERIALIZE_RECURSIVELY.jsonName(), true); + } + String indicatorId = findIndicatorId(); if (Strings.isEmpty(indicatorId) == false) { http://git-wip-us.apache.org/repos/asf/wicket/blob/1d9c6b95/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxAttributeName.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxAttributeName.java b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxAttributeName.java index bea715d..8aef140 100644 --- a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxAttributeName.java +++ b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxAttributeName.java @@ -235,13 +235,18 @@ public enum AjaxAttributeName { URL("u"), /** - * @see org.apache.wicket.ajax.attributes.AjaxRequestAttributes#childSelector + * @see AjaxRequestAttributes#childSelector */ - CHILD_SELECTOR("sel"); + CHILD_SELECTOR("sel"), + + /** + * @see AjaxRequestAttributes#serializeRecursively + */ + SERIALIZE_RECURSIVELY("sr"); private final String jsonName; - private AjaxAttributeName(String jsonName) + AjaxAttributeName(String jsonName) { this.jsonName = Args.notNull(jsonName, "jsonName"); } http://git-wip-us.apache.org/repos/asf/wicket/blob/1d9c6b95/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 b7feb1b..dfcc162 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 @@ -142,6 +142,12 @@ public final class AjaxRequestAttributes private CharSequence childSelector; /** + * A flag indicating whether to collect (submit) the name/value pairs for all HTML form elements + * children of the HTML element with the JavaScript listener + */ + private boolean serializeRecursively; + + /** * @see #childSelector * @return The selector string that filters the descendants */ @@ -530,4 +536,21 @@ public final class AjaxRequestAttributes return this; } + /** + * @return whether to collect (submit) the name/value pairs for all HTML form elements + * children of the HTML element with the JavaScript listener + */ + public boolean isSerializeRecursively() { + return serializeRecursively; + } + + /** + * @param serializeRecursively + * a flag indicating whether to collect (submit) the name/value pairs for all HTML form elements + * children of the HTML element with the JavaScript listener + */ + public AjaxRequestAttributes setSerializeRecursively(final boolean serializeRecursively) { + this.serializeRecursively = serializeRecursively; + return this; + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/1d9c6b95/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 033dac3..0ca428c 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 @@ -435,6 +435,10 @@ if (!attrs.sp) { attrs.sp = "stop"; } + + if (!attrs.sr) { + attrs.sr = false; + } }, /** @@ -653,7 +657,7 @@ } else if (attrs.c && !jQuery.isWindow(attrs.c)) { // serialize just the form component with id == attrs.c var el = Wicket.$(attrs.c); - data = data.concat(Wicket.Form.serializeElement(el)); + data = data.concat(Wicket.Form.serializeElement(el, attrs.sr)); } // convert to URL encoded string @@ -1527,9 +1531,12 @@ * <em>Wicket.Form.excludeFromAjaxSerialization</em> * * @param element {HTMLFormElement} - the form element to serialize. E.g. HTMLInputElement + * @param serializeRecursively {Boolean} - a flag indicating whether to collect (submit) the + * name/value pairs for all HTML form elements children of the HTML element with + * the JavaScript listener * @return An array with a single element - an object with two keys - <em>name</em> and <em>value</em>. */ - serializeElement: function(element) { + serializeElement: function(element, serializeRecursively) { if (!element) { return []; @@ -1548,15 +1555,17 @@ } else if (tag === "input" || tag === "textarea") { return Wicket.Form.serializeInput(element); } else { - var elements = nodeListToArray(element.getElementsByTagName("input")); - elements = elements.concat(nodeListToArray(element.getElementsByTagName("select"))); - elements = elements.concat(nodeListToArray(element.getElementsByTagName("textarea"))); - var result = []; - for (var i = 0; i < elements.length; ++i) { - var el = elements[i]; - if (el.name && el.name !== "") { - result = result.concat(Wicket.Form.serializeElement(el)); + if (serializeRecursively) { + var elements = nodeListToArray(element.getElementsByTagName("input")); + elements = elements.concat(nodeListToArray(element.getElementsByTagName("select"))); + elements = elements.concat(nodeListToArray(element.getElementsByTagName("textarea"))); + + for (var i = 0; i < elements.length; ++i) { + var el = elements[i]; + if (el.name && el.name !== "") { + result = result.concat(Wicket.Form.serializeElement(el, serializeRecursively)); + } } } return result; @@ -1584,7 +1593,7 @@ for (var i = 0; i < elements.length; ++i) { var el = elements[i]; if (el.name && el.name !== "") { - result = result.concat(Wicket.Form.serializeElement(el)); + result = result.concat(Wicket.Form.serializeElement(el, false)); } } return result; http://git-wip-us.apache.org/repos/asf/wicket/blob/1d9c6b95/wicket-core/src/test/java/org/apache/wicket/ajax/attributes/AjaxAttributeNameTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/attributes/AjaxAttributeNameTest.java b/wicket-core/src/test/java/org/apache/wicket/ajax/attributes/AjaxAttributeNameTest.java index 1c9398b..4d13808 100644 --- a/wicket-core/src/test/java/org/apache/wicket/ajax/attributes/AjaxAttributeNameTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/ajax/attributes/AjaxAttributeNameTest.java @@ -58,6 +58,6 @@ public class AjaxAttributeNameTest } Assert.assertEquals("all known json parameter names", - "tr|p|d|id|dt|wr|rt|ad|sp|ch|e|async|dep|ep|pre|coh|fh|sh|ah|bsh|bh|ih|dh|i|sc|mp|f|c|m|u|sel|", sb.toString()); + "tr|p|d|id|dt|wr|rt|ad|sp|ch|e|async|dep|ep|pre|coh|fh|sh|ah|bsh|bh|ih|dh|i|sc|mp|f|c|m|u|sel|sr|", sb.toString()); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/1d9c6b95/wicket-core/src/test/js/form.js ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/js/form.js b/wicket-core/src/test/js/form.js index 7e309a3..ab80e02 100644 --- a/wicket-core/src/test/js/form.js +++ b/wicket-core/src/test/js/form.js @@ -137,7 +137,7 @@ jQuery(document).ready(function() { test("Wicket.Form.serializeElement should serialize the HTMLFormElement's which a children of a non-HTMLFormElement", function() { expect(1); - var actual = Wicket.Form.serializeElement('nonHtmlFormElement'); + var actual = Wicket.Form.serializeElement('nonHtmlFormElement', true); var expected = [ { name: "textInput", value: "textValue" }, @@ -159,6 +159,15 @@ jQuery(document).ready(function() { deepEqual(actual, expected); }); + test("Wicket.Form.serializeElement should serialize the HTMLFormElement's which a children of a non-HTMLFormElement", function() { + expect(1); + + var actual = Wicket.Form.serializeElement('nonHtmlFormElement', false); + + var expected = []; + deepEqual(actual, expected); + }); + module('Wicket.Form.serializeForm'); test('Wicket.Form.serialize - form element WITHOUT searching for the parent form', function() { http://git-wip-us.apache.org/repos/asf/wicket/blob/1d9c6b95/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java index ed0d339..4831872 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java @@ -21,8 +21,6 @@ import org.apache.wicket.Page; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.ajax.attributes.AjaxCallListener; -import org.apache.wicket.ajax.attributes.AjaxRequestAttributes; import org.apache.wicket.core.request.handler.PageProvider; import org.apache.wicket.core.request.handler.RenderPageRequestHandler; import org.apache.wicket.markup.ComponentTag; @@ -975,16 +973,6 @@ public class ModalWindow extends Panel { return super.getCallbackScript(); } - - @Override - protected void updateAjaxAttributes(AjaxRequestAttributes attributes) - { - super.updateAjaxAttributes(attributes); - AjaxCallListener listener = new AjaxCallListener(); - // disable all form elements inside the modal window to avoid serializing them in the url - listener.onBefore("$('#'+attrs.c+' :input').prop('disabled', true);"); - attributes.getAjaxCallListeners().add(listener); - } } /** @@ -1016,16 +1004,6 @@ public class ModalWindow extends Panel { return super.getCallbackScript(); } - - @Override - protected void updateAjaxAttributes(AjaxRequestAttributes attributes) - { - super.updateAjaxAttributes(attributes); - AjaxCallListener listener = new AjaxCallListener(); - // disable all form elements inside the modal window to avoid serializing them in the url - listener.onBefore("$('#'+attrs.c+' :input').prop('disabled', true);"); - attributes.getAjaxCallListeners().add(listener); - } } /**
