You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2008/10/30 18:13:25 UTC
svn commit: r709213 - in /tapestry/tapestry5/trunk/tapestry-core/src:
main/java/org/apache/tapestry5/ main/java/org/apache/tapestry5/corelib/base/
main/java/org/apache/tapestry5/corelib/components/
main/java/org/apache/tapestry5/internal/structure/ tes...
Author: hlship
Date: Thu Oct 30 10:13:24 2008
New Revision: 709213
URL: http://svn.apache.org/viewvc?rev=709213&view=rev
Log:
TAP5-124: DateField does not work correctly inside AjaxFormLoop
Added:
tapestry/tapestry5/trunk/tapestry-core/src/test/app1/DateFieldAjaxFormLoop.tml
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/DateHolder.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/DateFieldAjaxFormLoop.java
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/PrimaryKeyEncoder.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ActionLink.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AddRowLink.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/EventLink.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormInjector.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/PageLink.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/RemoveRowLink.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Start.java
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/EventConstants.java Thu Oct 30 10:13:24 2008
@@ -1,3 +1,17 @@
+// Copyright 2008 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.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
package org.apache.tapestry5;
/**
@@ -96,4 +110,17 @@
* Event triggered by form-related components to validate user input.
*/
public static final String VALIDATE = "validate";
+
+ /**
+ * Event triggered by {@link org.apache.tapestry5.corelib.components.AjaxFormLoop} to inform the container about the
+ * row removed on the client side. The event context is the object that was removed.
+ */
+ public static final String REMOVE_ROW = "removeRow";
+
+ /**
+ * Event triggered by {@link org.apache.tapestry5.corelib.components.AjaxFormLoop} to inform the container that a
+ * new row has been requested. The return value from the event handler must be the newly created object, which must
+ * also be visible in the {@link org.apache.tapestry5.PrimaryKeyEncoder encoder parameter}.
+ */
+ public static final String ADD_ROW = "addRow";
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/PrimaryKeyEncoder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/PrimaryKeyEncoder.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/PrimaryKeyEncoder.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/PrimaryKeyEncoder.java Thu Oct 30 10:13:24 2008
@@ -1,4 +1,4 @@
-// Copyright 2007 The Apache Software Foundation
+// Copyright 2007, 2008 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.
@@ -14,18 +14,19 @@
package org.apache.tapestry5;
-import org.apache.tapestry5.corelib.components.Loop;
-
import java.io.Serializable;
import java.util.List;
/**
- * Used by {@link Loop} and similar components to extract out an identifier, here termed a "primary key", that can be
- * stored on the client and later used to recover the same, or equivalent, server side object.
+ * Used by {@link org.apache.tapestry5.corelib.components.Loop}, {@link org.apache.tapestry5.corelib.components.AjaxFormLoop}
+ * and similar components to extract out an identifier, here termed a "primary key", that can be stored on the client
+ * and later used to recover the same, or equivalent, server side object.
+ * <p/>
+ * The {@link org.apache.tapestry5.util.DefaultPrimaryKeyEncoder} implementation is used in most circumstances.
*
* @param <K> the type of the primary key, used to identify the value (which must be serializable)
* @param <V> the type of value identified by the key
- * @see ValueEncoder
+ * @see org.apache.tapestry5.ValueEncoder
*/
public interface PrimaryKeyEncoder<K extends Serializable, V>
{
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java Thu Oct 30 10:13:24 2008
@@ -21,8 +21,6 @@
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.internal.services.ClientBehaviorSupport;
-import java.util.List;
-
/**
* Base class for link-generating components that are based on a component event request. Such events have an event
* context and may also update a {@link org.apache.tapestry5.corelib.components.Zone}.
@@ -35,7 +33,7 @@
* methods.
*/
@Parameter
- private List<?> context;
+ private Object[] context;
/**
* Binding the zone parameter turns the link into a an Ajax control that causes the related zone to be updated.
@@ -50,9 +48,7 @@
{
if (isDisabled()) return;
- Object[] contextArray = context == null ? new Object[0] : context.toArray();
-
- Link link = createLink(contextArray);
+ Link link = createLink(context);
writeLink(writer, link);
@@ -61,6 +57,8 @@
/**
* Invoked to create the Link that will become the href attribute of the output.
+ *
+ * @param eventContext the context as an object array, possibly null
*/
protected abstract Link createLink(Object[] eventContext);
@@ -70,5 +68,4 @@
writer.end(); // <a>
}
-
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ActionLink.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ActionLink.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ActionLink.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/ActionLink.java Thu Oct 30 10:13:24 2008
@@ -28,9 +28,9 @@
@Inject
private ComponentResources resources;
+ @Override
protected Link createLink(Object[] contextArray)
{
return resources.createEventLink(EventConstants.ACTION, contextArray);
}
-
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AddRowLink.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AddRowLink.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AddRowLink.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AddRowLink.java Thu Oct 30 10:13:24 2008
@@ -24,7 +24,9 @@
/**
* Used inside an {@link org.apache.tapestry5.corelib.components.AjaxFormLoop} component to spur the addition of a new
- * row. Triggers a server-side "addRow" event which must return a Block (or component) to render the new row.
+ * row. Triggers a server-side {@linkplain org.apache.tapestry5.EventConstants#ADD_ROW addRow} event on the
+ * AjaxFormLoop, which must return the newly added object, which will be rendered in the body of the AjaxFormLoop and
+ * sent to the client web browser.
*/
@SupportsInformalParameters
public class AddRowLink
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/AjaxFormLoop.java Thu Oct 30 10:13:24 2008
@@ -29,12 +29,17 @@
import java.io.Serializable;
import java.util.Collections;
import java.util.Iterator;
-import java.util.List;
/**
* A special form of the {@link org.apache.tapestry5.corelib.components.Loop} component that adds a lot of Ajax support
* to handle adding new rows and removing existing rows dynamically. Expects that the values being iterated over are
* entities that can be identified via a {@link org.apache.tapestry5.PrimaryKeyEncoder}.
+ * <p/>
+ * Works with {@link org.apache.tapestry5.corelib.components.AddRowLink} and {@link
+ * org.apache.tapestry5.corelib.components.RemoveRowLink} components.
+ *
+ * @see org.apache.tapestry5.EventConstants#ADD_ROW
+ * @see org.apache.tapestry5.EventConstants#REMOVE_ROW
*/
public class AjaxFormLoop
{
@@ -65,7 +70,7 @@
* handler methods.
*/
@Parameter
- private List<?> context;
+ private Object[] context;
/**
@@ -379,7 +384,7 @@
}
};
- resources.triggerContextEvent("addRow", context, callback);
+ resources.triggerContextEvent(EventConstants.ADD_ROW, context, callback);
if (value == null)
throw new IllegalArgumentException(
@@ -414,7 +419,7 @@
Object value = encoder.toValue(coerced);
- resources.triggerEvent("removeRow", new Object[] {value}, null);
+ resources.triggerEvent(EventConstants.REMOVE_ROW, new Object[] {value}, null);
return new JSONObject();
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/EventLink.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/EventLink.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/EventLink.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/EventLink.java Thu Oct 30 10:13:24 2008
@@ -49,6 +49,7 @@
return resources.getId();
}
+ @Override
protected Link createLink(Object[] eventContext)
{
ComponentResources containerResources = resources.getContainerResources();
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java Thu Oct 30 10:13:24 2008
@@ -42,7 +42,6 @@
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
-import java.util.List;
/**
* An HTML form, which will enclose other components to render out the various types of fields.
@@ -111,7 +110,7 @@
* methods.
*/
@Parameter
- private List<?> context;
+ private Object[] context;
/**
* The object which will record user input and validation errors. The object must be persistent between requests
@@ -250,13 +249,11 @@
// Now that the environment is setup, inform the component or other listeners that the form
// is about to render.
- Object[] contextArray = context == null ? new Object[0] : context.toArray();
+ resources.triggerEvent(EventConstants.PREPARE_FOR_RENDER, context, null);
- resources.triggerEvent(EventConstants.PREPARE_FOR_RENDER, contextArray, null);
+ resources.triggerEvent(EventConstants.PREPARE, context, null);
- resources.triggerEvent(EventConstants.PREPARE, contextArray, null);
-
- Link link = resources.createFormEventLink(EventConstants.ACTION, contextArray);
+ Link link = resources.createFormEventLink(EventConstants.ACTION, context);
// Save the form element for later, in case we want to write an encoding type attribute.
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormInjector.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormInjector.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormInjector.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/FormInjector.java Thu Oct 30 10:13:24 2008
@@ -35,7 +35,6 @@
import org.slf4j.Logger;
import java.io.IOException;
-import java.util.List;
/**
* A way to add new content to an existing Form. The FormInjector emulates its tag from the template (or uses a
@@ -61,7 +60,7 @@
* methods.
*/
@Parameter
- private List<?> context;
+ private Object[] context;
@Parameter(defaultPrefix = BindingConstants.LITERAL, value = "above")
private InsertPosition position;
@@ -129,16 +128,13 @@
{
clientId = renderSupport.allocateClientId(resources);
- clientElement = writer.element(element,
-
- "id", clientId);
+ clientElement = writer.element(element, "id", clientId);
resources.renderInformalParameters(writer);
// Now work on the JavaScript side of things.
- Link link = resources.createEventLink(INJECT_EVENT,
- context == null ? new Object[0] : context.toArray());
+ Link link = resources.createEventLink(INJECT_EVENT, context);
link.addParameter(FORM_CLIENTID_PARAMETER, formSupport.getClientId());
link.addParameter(FORM_COMPONENTID_PARAMETER, formSupport.getFormComponentId());
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/PageLink.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/PageLink.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/PageLink.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/PageLink.java Thu Oct 30 10:13:24 2008
@@ -22,8 +22,6 @@
import org.apache.tapestry5.corelib.base.AbstractLink;
import org.apache.tapestry5.ioc.annotations.Inject;
-import java.util.List;
-
/**
* Generates a render request link to some other page in the application. If an activation context is supplied (as the
* context parameter), then the context values will be encoded into the URL. If no context is supplied, then the target
@@ -48,17 +46,13 @@
* If not provided, then the target page will provide its own activation context.
*/
@Parameter
- private List context;
-
- private final Object[] emptyContext = new Object[0];
+ private Object[] context;
void beginRender(MarkupWriter writer)
{
if (isDisabled()) return;
- Object[] activationContext = context != null ? context.toArray() : emptyContext;
-
- Link link = resources.createPageLink(page, resources.isBound("context"), activationContext);
+ Link link = resources.createPageLink(page, resources.isBound("context"), context);
writeLink(writer, link);
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/RemoveRowLink.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/RemoveRowLink.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/RemoveRowLink.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/RemoveRowLink.java Thu Oct 30 10:13:24 2008
@@ -24,8 +24,8 @@
/**
* Used inside a {@link org.apache.tapestry5.corelib.components.AjaxFormLoop} to remove the current row from the loop.
- * This fires a server-side "removeRow" event (from the AjaxFormLoop component). On the client-side, the element for the
- * row is hidden, then removed altogether.
+ * This fires a server-side event (from the AjaxFormLoop component); the event context is the object to be removed. On
+ * the client-side, the element for the row is hidden, then removed altogether.
*/
@SupportsInformalParameters
public class RemoveRowLink
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java Thu Oct 30 10:13:24 2008
@@ -67,6 +67,8 @@
// Case insensitive
private Map<String, Object> renderVariables;
+ private static final Object[] EMPTY = new Object[0];
+
public InternalComponentResourcesImpl(Page page, ComponentPageElement element,
ComponentResources containerResources, PageResources pageResources,
String completeId, String nestedId, Instantiator componentInstantiator
@@ -127,27 +129,27 @@
*/
public Link createActionLink(String eventType, boolean forForm, Object... context)
{
- return page.createComponentEventLink(element.getNestedId(), eventType, forForm, context);
+ return page.createComponentEventLink(element.getNestedId(), eventType, forForm, defaulted(context));
}
public Link createEventLink(String eventType, Object... context)
{
- return page.createComponentEventLink(element.getNestedId(), eventType, false, context);
+ return page.createComponentEventLink(element.getNestedId(), eventType, false, defaulted(context));
}
public Link createFormEventLink(String eventType, Object... context)
{
- return page.createComponentEventLink(element.getNestedId(), eventType, true, context);
+ return page.createComponentEventLink(element.getNestedId(), eventType, true, defaulted(context));
}
public Link createPageLink(String pageName, boolean override, Object... context)
{
- return page.createPageRenderLink(pageName, override, context);
+ return page.createPageRenderLink(pageName, override, defaulted(context));
}
public Link createPageLink(Class pageClass, boolean override, Object... context)
{
- return page.createPageRenderLink(pageClass, override, context);
+ return page.createPageRenderLink(pageClass, override, defaulted(context));
}
public void discardPersistentFieldChanges()
@@ -213,7 +215,12 @@
public boolean triggerEvent(String eventType, Object[] context, ComponentEventCallback handler)
{
- return element.triggerEvent(eventType, context, handler);
+ return element.triggerEvent(eventType, defaulted(context), handler);
+ }
+
+ private Object[] defaulted(Object[] input)
+ {
+ return input == null ? EMPTY : input;
}
public boolean triggerContextEvent(String eventType, EventContext context, ComponentEventCallback callback)
Added: tapestry/tapestry5/trunk/tapestry-core/src/test/app1/DateFieldAjaxFormLoop.tml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/DateFieldAjaxFormLoop.tml?rev=709213&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/app1/DateFieldAjaxFormLoop.tml (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/app1/DateFieldAjaxFormLoop.tml Thu Oct 30 10:13:24 2008
@@ -0,0 +1,20 @@
+<html t:type="border" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
+
+ <h1>DateField in AjaxFormLoop</h1>
+
+ <t:form>
+
+ <div t:type="ajaxformloop" t:id="loop" source="dateHolders" value="current" encoder="dateHolderConverter">
+
+ <t:datefield value="current.date"/>
+ <t:removerowlink>remove</t:removerowlink>
+
+ </div>
+
+ <p>
+ <input type="submit" value="Go"/>
+ </p>
+ </t:form>
+
+
+</html>
\ No newline at end of file
Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/DateHolder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/DateHolder.java?rev=709213&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/DateHolder.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/data/DateHolder.java Thu Oct 30 10:13:24 2008
@@ -0,0 +1,47 @@
+// Copyright 2008 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.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.integration.app1.data;
+
+import org.apache.tapestry5.beaneditor.NonVisual;
+
+import java.util.Date;
+
+public class DateHolder
+{
+ @NonVisual
+ private int id;
+
+ private Date date;
+
+ public int getId()
+ {
+ return id;
+ }
+
+ public void setId(int id)
+ {
+ this.id = id;
+ }
+
+ public Date getDate()
+ {
+ return date;
+ }
+
+ public void setDate(Date date)
+ {
+ this.date = date;
+ }
+}
Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/DateFieldAjaxFormLoop.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/DateFieldAjaxFormLoop.java?rev=709213&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/DateFieldAjaxFormLoop.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/DateFieldAjaxFormLoop.java Thu Oct 30 10:13:24 2008
@@ -0,0 +1,87 @@
+// Copyright 2008 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.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.integration.app1.pages;
+
+import org.apache.tapestry5.PrimaryKeyEncoder;
+import org.apache.tapestry5.annotations.Persist;
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.integration.app1.data.DateHolder;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.util.DefaultPrimaryKeyEncoder;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+public class DateFieldAjaxFormLoop
+{
+ @Persist
+ private Map<Integer, DateHolder> database;
+
+ @Property
+ private DateHolder current;
+
+ void beginRender()
+ {
+ if (database == null)
+ database = CollectionFactory.newMap();
+ }
+
+
+ public List<DateHolder> getDateHolders()
+ {
+ List<DateHolder> result = CollectionFactory.newList(database.values());
+
+
+ Collections.sort(result, new Comparator<DateHolder>()
+ {
+ public int compare(DateHolder o1, DateHolder o2)
+ {
+ return o1.getId() - o2.getId();
+ }
+ });
+
+ return result;
+ }
+
+ public PrimaryKeyEncoder<Integer, DateHolder> getDateHolderConverter()
+ {
+ DefaultPrimaryKeyEncoder<Integer, DateHolder> result = new DefaultPrimaryKeyEncoder<Integer, DateHolder>();
+
+ for (DateHolder dh : getDateHolders())
+ {
+ result.add(dh.getId(), dh);
+ }
+
+ return result;
+ }
+
+ DateHolder onAddRowFromLoop()
+ {
+ DateHolder dh = new DateHolder();
+
+ dh.setId(database.size() + 1);
+
+ database.put(dh.getId(), dh);
+
+ return dh;
+ }
+
+ void onRemoveRowFromLoop(DateHolder holder)
+ {
+ database.remove(holder.getId());
+ }
+}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Start.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Start.java?rev=709213&r1=709212&r2=709213&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Start.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Start.java Thu Oct 30 10:13:24 2008
@@ -65,6 +65,9 @@
private static final List<Item> ITEMS = CollectionFactory.newList(
+ new Item("DateFieldAjaxFormLoop", "DateField inside AjaxFormLoop",
+ "Show that DateField component works correctly inside AjaxFormLoop"),
+
new Item("NestedForm", "Nested Form Demo", "Error when a Form is nested inside another Form."),
new Item("UnhandledEventDemo", "Unhandled Event Demo",