Updated Branches:
  refs/heads/5.4-js-rewrite b927ceb14 -> 64f4d9a3c

Support informal parameters on the AjaxFormLoop
- informals are added to each row, including the "tail" row
- make a distinction between the element to insert before (on the client), and 
the element which triggers the insert
- trigger a zone update on the inserted row, to support components such as 
DateField that scan newly added content


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/64f4d9a3
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/64f4d9a3
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/64f4d9a3

Branch: refs/heads/5.4-js-rewrite
Commit: 64f4d9a3c371d91d9e68dd0d2fd3e5c497e2ef60
Parents: e9e07c9
Author: Howard M. Lewis Ship <[email protected]>
Authored: Tue Nov 20 07:12:58 2012 -0800
Committer: Howard M. Lewis Ship <[email protected]>
Committed: Tue Nov 20 07:12:58 2012 -0800

----------------------------------------------------------------------
 .../META-INF/modules/core/ajaxformloop.coffee      |   16 +++++-----
 .../META-INF/modules/core/events.coffee            |    7 ++++-
 .../tapestry5/corelib/components/AddRowLink.java   |   17 +---------
 .../tapestry5/corelib/components/AjaxFormLoop.java |   23 ++++++++++----
 .../tapestry5/corelib/components/AjaxFormLoop.tml  |   18 +++++++----
 5 files changed, 43 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/64f4d9a3/tapestry-core/src/main/coffeescript/META-INF/modules/core/ajaxformloop.coffee
----------------------------------------------------------------------
diff --git 
a/tapestry-core/src/main/coffeescript/META-INF/modules/core/ajaxformloop.coffee 
b/tapestry-core/src/main/coffeescript/META-INF/modules/core/ajaxformloop.coffee
index 6ec63d7..6dc0adf 100644
--- 
a/tapestry-core/src/main/coffeescript/META-INF/modules/core/ajaxformloop.coffee
+++ 
b/tapestry-core/src/main/coffeescript/META-INF/modules/core/ajaxformloop.coffee
@@ -20,7 +20,7 @@ define ["core/dom", "core/events", "core/console", 
"core/ajax", "core/builder"],
   (dom, events, console, ajax, builder) ->
 
     # "afl" is short for "AjaxFormLoop".
-    AFL_SELECTOR = "[data-container-type=core/ajaxformloop]"
+    AFL_SELECTOR = "[data-container-type=core/AjaxFormLoop]"
     FRAGMENT_TYPE = "core/ajaxformloop-fragment"
 
     dom.onDocument "click", "#{AFL_SELECTOR} [data-afl-behavior=remove]", ->
@@ -50,13 +50,11 @@ define ["core/dom", "core/events", "core/console", 
"core/ajax", "core/builder"],
 
       return false
 
-    dom.onDocument "click", "#{AFL_SELECTOR} 
[data-afl-behavior=insert-before]", ->
+    dom.onDocument "click", "#{AFL_SELECTOR} [data-afl-behavior=insert-before] 
[data-afl-trigger=add]", ->
 
       afl = this.findContainer AFL_SELECTOR
 
-      unless afl
-        console.error "Enclosing element for AjaxFormLoop inject row link not 
found."
-        return false
+      insertionPoint = this.findContainer "[data-afl-behavior=insert-before]"
 
       url = afl.attribute "data-inject-row-url"
 
@@ -64,18 +62,20 @@ define ["core/dom", "core/events", "core/console", 
"core/ajax", "core/builder"],
         onsuccess: (response) =>
           content = response.responseJSON?.content
 
-          insertionPoint = this.findContainer 
"[data-container-type=#{FRAGMENT_TYPE}]"
-
           # Create a new element with the same type (usually "div") and class 
as this element.
           # It will contain the new content.
           newElement = builder insertionPoint.element.tagName,
-              class: insertionPoint.element.class,
+              class: insertionPoint.element.className,
               "data-container-type": FRAGMENT_TYPE
 
           newElement.update content
 
           insertionPoint.insertBefore newElement
 
+          # Trigger this event, to inform the world that the zone-like new 
element has been updated
+          # with content.
+          newElement.trigger events.zone.didUpdate,
+
       return false
 
     # This module is all event handlers, and no exported functions.

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/64f4d9a3/tapestry-core/src/main/coffeescript/META-INF/modules/core/events.coffee
----------------------------------------------------------------------
diff --git 
a/tapestry-core/src/main/coffeescript/META-INF/modules/core/events.coffee 
b/tapestry-core/src/main/coffeescript/META-INF/modules/core/events.coffee
index bb874b6..b252ca7 100644
--- a/tapestry-core/src/main/coffeescript/META-INF/modules/core/events.coffee
+++ b/tapestry-core/src/main/coffeescript/META-INF/modules/core/events.coffee
@@ -122,7 +122,12 @@ define
     willUpdate: "t5:zone:will-update"
 
     # Triggered (by the standard hanndler) just after the content in a Zone 
has updated. If the zone was not visible, it
-    # is made visible after its content is changed, and before this event is 
triggered.
+    # is made visible after its content is changed, and before this event is 
triggered. Some number of other components that
+    # also perform Ajax updates of the page also trigger this event.
+    #
+    # Certain components bind this event to scan new additions to the page to 
see if certain structures exist and
+    # create client-side support in the form of controllers and event 
handlers. DateField is one such example
+    # (see `core/datefield` module).
     didUpdate: "t5:zone:did-update"
 
     # Triggered on a zone element, the default handler will peform an Ajax 
request and, when the response is available,

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/64f4d9a3/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AddRowLink.java
----------------------------------------------------------------------
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AddRowLink.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AddRowLink.java
index b9ef3c5..394d377 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AddRowLink.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AddRowLink.java
@@ -1,4 +1,4 @@
-// Copyright 2008, 2010, 2011 The Apache Software Foundation
+// Copyright 2008, 2010, 2011, 2012 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,11 +16,8 @@ package org.apache.tapestry5.corelib.components;
 
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.MarkupWriter;
-import org.apache.tapestry5.annotations.Environmental;
 import org.apache.tapestry5.annotations.SupportsInformalParameters;
-import org.apache.tapestry5.corelib.internal.AjaxFormLoopContext;
 import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.services.javascript.JavaScriptSupport;
 
 /**
  * Used inside an {@link org.apache.tapestry5.corelib.components.AjaxFormLoop} 
component to spur the addition of a new
@@ -33,24 +30,14 @@ import 
org.apache.tapestry5.services.javascript.JavaScriptSupport;
 @SupportsInformalParameters
 public class AddRowLink
 {
-    @Environmental
-    private AjaxFormLoopContext context;
-
-    @Inject
-    private JavaScriptSupport jsSupport;
-
     @Inject
     private ComponentResources resources;
 
     void beginRender(MarkupWriter writer)
     {
-        writer.element("a",
-                "href", "#",
-                "data-afl-behavior", "insert-before");
+        writer.element("a", "href", "#", "data-afl-trigger", "add");
 
         resources.renderInformalParameters(writer);
-
-
     }
 
     void afterRender(MarkupWriter writer)

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/64f4d9a3/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java
----------------------------------------------------------------------
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java
index 3db5c7e..fdebe11 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java
@@ -57,6 +57,7 @@ import java.util.Iterator;
 @Events(
         {EventConstants.ADD_ROW, EventConstants.REMOVE_ROW})
 @Import(module = "core/ajaxformloop")
+@SupportsInformalParameters
 public class AjaxFormLoop
 {
     /**
@@ -151,7 +152,6 @@ public class AjaxFormLoop
     @Inject
     private ComponentDefaultProvider defaultProvider;
 
-
     @Inject
     private AjaxResponseRenderer ajaxResponseRenderer;
 
@@ -319,7 +319,7 @@ public class AjaxFormLoop
         
injectRowLink.addParameter(RequestConstants.FORM_COMPONENTID_PARAMETER, 
formSupport.getFormComponentId());
 
         writer.element("div",
-                "data-container-type", "core/ajaxformloop",
+                "data-container-type", "core/AjaxFormLoop",
                 "data-remove-row-url", removeRowLink,
                 "data-inject-row-url", injectRowLink);
     }
@@ -331,20 +331,20 @@ public class AjaxFormLoop
 
     boolean beginRender(MarkupWriter writer)
     {
-        writer.element("div", "data-container-type", 
"core/ajaxformloop-fragment");
-
         if (!iterator.hasNext())
+        {
             return false;
+        }
 
         value = iterator.next();
 
-        return true; // Render body, etc.
+        // Return true: render the body for this value; that ends up being a 
form-fragment.
+
+        return true;
     }
 
     Object afterRender(MarkupWriter writer)
     {
-        writer.end();
-
         // When out of source items to render, switch over to the addRow block 
(either the default,
         // or from the addRow parameter) before proceeding to cleanup render.
 
@@ -358,6 +358,15 @@ public class AjaxFormLoop
         return false;
     }
 
+    // Capture BeginRender event from the formfragment or the addRowWrapper, 
and render the informal parameters
+    // into the row.
+    boolean onBeginRender(MarkupWriter writer)
+    {
+        resources.renderInformalParameters(writer);
+
+        return true;
+    }
+
     void cleanupRender(MarkupWriter writer)
     {
         writer.end();

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/64f4d9a3/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/AjaxFormLoop.tml
----------------------------------------------------------------------
diff --git 
a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/AjaxFormLoop.tml
 
b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/AjaxFormLoop.tml
index bad4199..7f08c26 100644
--- 
a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/AjaxFormLoop.tml
+++ 
b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/components/AjaxFormLoop.tml
@@ -1,19 +1,23 @@
 <t:container xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd";>
 
-    <t:formfragment t:id="fragment" element="prop:element" visible="true">
+    <t:formfragment t:id="fragment" element="prop:element" visible="true" 
t:mixins="rendernotification"
+                    data-container-type="core/ajaxformloop-fragment">
         <t:delegate to="block:ajaxResponse"/>
     </t:formfragment>
 
     <t:block id="tail">
-        <div data-container-type="core/ajaxformloop-fragment">
-            <t:any element="prop:element" data-afl-behavior="insert-before">
-                <t:delegate to="prop:addRow"/>
-            </t:any>
-        </div>
+        <t:any t:id="addRowWrapper"
+               t:mixins="rendernotification"
+               element="prop:element" data-afl-behavior="insert-before"
+               data-container-type="core/ajaxformloop-fragment">
+            <t:delegate to="prop:addRow"/>
+        </t:any>
     </t:block>
 
     <t:block id="defaultAddRow">
-        <t:addrowlink class="btn"><i class="icon-add"/> Add row</t:addrowlink>
+        <div class="controls">
+            <t:addrowlink class="btn"><i class="icon-plus-sign"/> Add 
row</t:addrowlink>
+        </div>
     </t:block>
 
     <t:block id="ajaxResponse">

Reply via email to