Using Form Fragments

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Using Form Fragments

mr nobody
Hi,

I'm currently working on a component which use a loop to render a list of
fields dynamically. Following this is the structure of the component:

componentA.tml

<t:container
  xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
  xmlns:p="tapestry:parameter">
  <div style="height: 500px; overflow: scroll; overflow-x: hidden">

    <t:loop t:source="properties" value="property" encoder="encoder" >
      <t:if test="case">

        <t:delegate to="case" />

        <!-- TEXT -->
        <t:block t:id="text">
          <t:formfragment visible="printable">
            <div class="form-group">
              <t:label for="textField" class="col-sm-4 control-label" />
              <div class="col-sm-8">
                <input t:type="TextField" t:id="textField"
                  value="property.second.defaultValue.rawValue"
                  label="${label}" />
              </div>
            </div>
          </t:formfragment>
        </t:block>
    </t:loop>

  </div>
</t:container>

ComponentA.java

public class ComponentAextends  {


  @Parameter(name = "properties", required = true)
  @Property
  protected List<ObjectPair<ObjectA, ObjectB>>> properties;

  @Property
  private ObjectPair<ObjectA, ObjectB> property;

@Property
  private final ValueEncoder<ObjectPair<ObjectA, ObjectB>> encoder =
 new ValueEncoder<ObjectPair<ObjectA, ObjectB>>() {
    public String toClient(
        ObjectPair<ObjectA, ObjectB> namedKeyObject) {

      String clientValue = "-1";

      if (namedKeyObject != null) {
        clientValue = String.valueOf(namedKeyObject.getFirst().getKey());
      }
      return clientValue;

    }

    public ObjectPair<ObjectA,ObjectB> toValue(
        String key) {

      if (!Misc.isEmptyString(key) && !"-1".equals(key)) {
        long filterKey = Long.valueOf(key).longValue();

        for (int i = 0; i < properties.size(); i++) {

          if (properties.get(i).getFirst().getKey() == filterKey) {
            return properties.get(i);
          }
        }
      }

      return null;
    }
  };

...

My problem is when I click in the button to send the values only the last
field is coming filled, the other fields are coming null. I thought could
be a problem with my encoder but I have seen that the encoder is working
fine. Someone has any idea about this?


Thank you,

Robson Pires
Reply | Threaded
Open this post in threaded view
|

Re: Using Form Fragments

George Christman
I'm not entirely sure this will resolve your issue, but have you tried
setting the formstate? Perhaps formsate="iterator" on the loop. Like I
said, I'm not entirely sure this will resolve your issue.

On Thu, Jan 15, 2015 at 11:40 AM, Robson Pires <[hidden email]> wrote:

> Hi,
>
> I'm currently working on a component which use a loop to render a list of
> fields dynamically. Following this is the structure of the component:
>
> componentA.tml
>
> <t:container
>   xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
>   xmlns:p="tapestry:parameter">
>   <div style="height: 500px; overflow: scroll; overflow-x: hidden">
>
>     <t:loop t:source="properties" value="property" encoder="encoder" >
>       <t:if test="case">
>
>         <t:delegate to="case" />
>
>         <!-- TEXT -->
>         <t:block t:id="text">
>           <t:formfragment visible="printable">
>             <div class="form-group">
>               <t:label for="textField" class="col-sm-4 control-label" />
>               <div class="col-sm-8">
>                 <input t:type="TextField" t:id="textField"
>                   value="property.second.defaultValue.rawValue"
>                   label="${label}" />
>               </div>
>             </div>
>           </t:formfragment>
>         </t:block>
>     </t:loop>
>
>   </div>
> </t:container>
>
> ComponentA.java
>
> public class ComponentAextends  {
>
>
>   @Parameter(name = "properties", required = true)
>   @Property
>   protected List<ObjectPair<ObjectA, ObjectB>>> properties;
>
>   @Property
>   private ObjectPair<ObjectA, ObjectB> property;
>
> @Property
>   private final ValueEncoder<ObjectPair<ObjectA, ObjectB>> encoder =
>  new ValueEncoder<ObjectPair<ObjectA, ObjectB>>() {
>     public String toClient(
>         ObjectPair<ObjectA, ObjectB> namedKeyObject) {
>
>       String clientValue = "-1";
>
>       if (namedKeyObject != null) {
>         clientValue = String.valueOf(namedKeyObject.getFirst().getKey());
>       }
>       return clientValue;
>
>     }
>
>     public ObjectPair<ObjectA,ObjectB> toValue(
>         String key) {
>
>       if (!Misc.isEmptyString(key) && !"-1".equals(key)) {
>         long filterKey = Long.valueOf(key).longValue();
>
>         for (int i = 0; i < properties.size(); i++) {
>
>           if (properties.get(i).getFirst().getKey() == filterKey) {
>             return properties.get(i);
>           }
>         }
>       }
>
>       return null;
>     }
>   };
>
> ...
>
> My problem is when I click in the button to send the values only the last
> field is coming filled, the other fields are coming null. I thought could
> be a problem with my encoder but I have seen that the encoder is working
> fine. Someone has any idea about this?
>
>
> Thank you,
>
> Robson Pires



--
George Christman
CEO
www.CarDaddy.com
P.O. Box 735
Johnstown, New York

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Using Form Fragments

George Christman
Sorry it's t:formstate="ITERATION"

On Fri, Jan 16, 2015 at 12:16 PM, George Christman
<[hidden email]> wrote:

> I'm not entirely sure this will resolve your issue, but have you tried
> setting the formstate? Perhaps formsate="iterator" on the loop. Like I
> said, I'm not entirely sure this will resolve your issue.
>
> On Thu, Jan 15, 2015 at 11:40 AM, Robson Pires <[hidden email]> wrote:
>> Hi,
>>
>> I'm currently working on a component which use a loop to render a list of
>> fields dynamically. Following this is the structure of the component:
>>
>> componentA.tml
>>
>> <t:container
>>   xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
>>   xmlns:p="tapestry:parameter">
>>   <div style="height: 500px; overflow: scroll; overflow-x: hidden">
>>
>>     <t:loop t:source="properties" value="property" encoder="encoder" >
>>       <t:if test="case">
>>
>>         <t:delegate to="case" />
>>
>>         <!-- TEXT -->
>>         <t:block t:id="text">
>>           <t:formfragment visible="printable">
>>             <div class="form-group">
>>               <t:label for="textField" class="col-sm-4 control-label" />
>>               <div class="col-sm-8">
>>                 <input t:type="TextField" t:id="textField"
>>                   value="property.second.defaultValue.rawValue"
>>                   label="${label}" />
>>               </div>
>>             </div>
>>           </t:formfragment>
>>         </t:block>
>>     </t:loop>
>>
>>   </div>
>> </t:container>
>>
>> ComponentA.java
>>
>> public class ComponentAextends  {
>>
>>
>>   @Parameter(name = "properties", required = true)
>>   @Property
>>   protected List<ObjectPair<ObjectA, ObjectB>>> properties;
>>
>>   @Property
>>   private ObjectPair<ObjectA, ObjectB> property;
>>
>> @Property
>>   private final ValueEncoder<ObjectPair<ObjectA, ObjectB>> encoder =
>>  new ValueEncoder<ObjectPair<ObjectA, ObjectB>>() {
>>     public String toClient(
>>         ObjectPair<ObjectA, ObjectB> namedKeyObject) {
>>
>>       String clientValue = "-1";
>>
>>       if (namedKeyObject != null) {
>>         clientValue = String.valueOf(namedKeyObject.getFirst().getKey());
>>       }
>>       return clientValue;
>>
>>     }
>>
>>     public ObjectPair<ObjectA,ObjectB> toValue(
>>         String key) {
>>
>>       if (!Misc.isEmptyString(key) && !"-1".equals(key)) {
>>         long filterKey = Long.valueOf(key).longValue();
>>
>>         for (int i = 0; i < properties.size(); i++) {
>>
>>           if (properties.get(i).getFirst().getKey() == filterKey) {
>>             return properties.get(i);
>>           }
>>         }
>>       }
>>
>>       return null;
>>     }
>>   };
>>
>> ...
>>
>> My problem is when I click in the button to send the values only the last
>> field is coming filled, the other fields are coming null. I thought could
>> be a problem with my encoder but I have seen that the encoder is working
>> fine. Someone has any idea about this?
>>
>>
>> Thank you,
>>
>> Robson Pires
>
>
>
> --
> George Christman
> CEO
> www.CarDaddy.com
> P.O. Box 735
> Johnstown, New York



--
George Christman
CEO
www.CarDaddy.com
P.O. Box 735
Johnstown, New York

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]