[prev in list] [next in list] [prev in thread] [next in thread] 

List:       tapestry-user
Subject:    Re: AjaxFormLoop Implementation
From:       George Christman <gchristman () cardaddy ! com>
Date:       2014-01-28 14:11:57
Message-ID: CADYqYfnWeUVykFdg6_Wyd1v=k79kTM9H4UUhi4RMtdk08djYbQ () mail ! gmail ! com
[Download RAW message or body]


I wasn't aware you could fix the js error in chrome. I'm still using
firebug, perhaps it's time to make the switch.


On Fri, Jan 24, 2014 at 12:28 PM, Luke Wilson-Mawer <
lukewilsonmawer@gmail.com> wrote:

> I suspect it could be that it's just breaking javascript but I'm not using
> client side validation and my form updates a zone
> 
> Why not just fix the error in your chrome browser tools and see if your
> validation woes go away?
> 
> On Fri, Jan 24, 2014 at 3:38 PM, George Christman
> <gchristman@cardaddy.com>wrote:
> 
> > You do make an interesting point, I do remember seeing that JS error when
> > adding new rows. I'm wondering if that JS error is breaking clientside
> > validation? I do believe there are still other bugs in this component
> > unrelated to the JS error.
> > 
> > Luke, since you appear to be using this component, would you mind telling
> > me if my configuration is similar to yours? I'm not sure that I'm using
> the
> > encoder properly etc. Thank you.
> > 
> > 
> > On Fri, Jan 24, 2014 at 7:15 AM, Luke Wilson-Mawer <
> > lukewilsonmawer@gmail.com> wrote:
> > 
> > > Yes, I noticed a bug in Tap 5.4-beta-2 but it may not be related to
> > yours.
> > > 
> > > The events.zone.didUpdate event isn't triggered when a row is added
> > because
> > > of a javascript error.
> > > 
> > > From memory the  click event for adding a new element returns
> > > something like newElement.trigger... when it should be
> > > $(newElement).trigger(....
> > > 
> > > On Thu, Jan 23, 2014 at 8:15 PM, George Christman
> > > <gchristman@cardaddy.com>wrote:
> > > 
> > > > Does anybody else use the AjaxFormLoop? Either I am using it
> > incorrectly,
> > > > or it is very buggy. I'd like to point out I'm using Tap 5.4-beta-2.
> > > > 
> > > > Another interesting bug seems to happen when you add a new row and
> > > provide
> > > > a null toValue from the encoder. The row adds without issue, but if
> you
> > > > attempt to remove the row before saving, you get an exception. This
> > > > behavior worked without issue in 5.3.7. I can provide a temp id if
> > that's
> > > > whats required to make it work properly.
> > > > 
> > > > Issue 2, when I have textfield number
> validate="min-length=10,required"
> > > and
> > > > I submit the form on a new row with a validation error, the page
> > reloads
> > > > with a serverside error without highlighting the field, "clienside
> > > > validation on", the url ends in form rather than the original person
> > id.
> > > > Now when I fixed the validation error and resubmit it, that's when I
> > > > discover the phone has somehow been persisted with a pk despite
> > hibernate
> > > > save never being called. I am not sure how it's getting it's ID.
> When I
> > > > remove the cascade all, it does no persist the phone record. I
> > discovered
> > > > this issue when I noticed my toValue was failing do to the fact it
> was
> > > > trying to do a query against the database for a record that does not
> > yet
> > > > exist.
> > > > 
> > > > If the data is correct on a save, the save works perfectly and as
> long
> > as
> > > > the data has a pk, the remove works perfectly.
> > > > 
> > > > 
> > > > On Wed, Jan 22, 2014 at 11:23 PM, George Christman
> > > > <gchristman@cardaddy.com>wrote:
> > > > 
> > > > > Hello, I'm having some difficulties with the AjaxFormLoop component
> > and
> > > > > I'm hoping one of you guys could help me out.
> > > > > 
> > > > > 
> > > > > For the most part, I've followed the following example
> > > > > 
> > > > 
> > > 
> > 
> http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/AjaxFormLoop.htmlhowever
> 
> > > ,
> > > > my implementation needs to be slightly different from the
> > > > > example.
> > > > > 
> > > > > I need to be able to instantiate a new Person() object and before
> > ever
> > > > > persisting the object be able to add new Phone objects to the
> > arraylist
> > > > > with the ajaxformloop. Once the user finishes inputting the data,
> > then
> > > > save
> > > > > the changes by submitting the form and commit them all to the
> > database.
> > > > > 
> > > > > Now I'm aware you need to use a value encoder to do this, but I'm
> > > running
> > > > > into an issue where hibernate is trying to save the phone object
> > > before I
> > > > > ever call session.save() which is resulting exceptions.
> > > > > 
> > > > > I'm hoping someone can provide me with a little help or an example
> of
> > > how
> > > > > to accomplish this task.
> > > > > 
> > > > > Example code
> > > > > 
> > > > > <div t:type="ajaxformloop" t:id="phones" source="person.phones"
> > > > value="phone" encoder="encoder">
> > > > > <t:textfield t:id="number" value="phone.number"/>
> > > > > <t:removerowlink>remove</t:removerowlink>
> > > > > </div>
> > > > > 
> > > > > public class Edit {
> > > > > 
> > > > > @PageActivationContext
> > > > > @Property
> > > > > private Person person;
> > > > > 
> > > > > @Property
> > > > > private Phone phone;
> > > > > 
> > > > > @Inject
> > > > > private Session session;
> > > > > 
> > > > > public void onPrepare() {
> > > > > if(person == null) {
> > > > > person = new Person();
> > > > > }
> > > > > }
> > > > > 
> > > > > @CommitAfter
> > > > > public Object onSuccess() {
> > > > > session.saveOrUpdate(person);
> > > > > return Index.class;
> > > > > }
> > > > > 
> > > > > Object onAddRowFromPhones() {
> > > > > return new Phone();
> > > > > }
> > > > > 
> > > > > @CommitAfter
> > > > > void onRemoveRowFromPhones(Phone phone) {
> > > > > if(phone.getId() != null) {
> > > > > session.delete(phone);
> > > > > }
> > > > > }
> > > > > 
> > > > > @SuppressWarnings("unchecked")
> > > > > public ValueEncoder getEncoder() {
> > > > > 
> > > > > return new ValueEncoder<AccessPoint>() {
> > > > > 
> > > > > @Override
> > > > > public String toClient(Phone value) {
> > > > > Long id = value.getId();
> > > > > return id != null ? id.toString() : null;
> > > > > 
> > > > > }
> > > > > 
> > > > > @Override
> > > > > public Phone toValue(String toValue) {
> > > > > if(toValue != null) {
> > > > > System.out.println(toValue);
> > > > > Long id = Long.parseLong(toValue);
> > > > > 
> > > > > phone = session.createCritera(Phone.class, id);
> > > > > } else {
> > > > > person.getPhones().add(phone);
> > > > > phone = new Phone(person);
> > > > > 
> > > > > }
> > > > > return phone;
> > > > > }
> > > > > };
> > > > > }
> > > > > }
> > > > > 
> > > > > @Entity
> > > > > public class Person {
> > > > > 
> > > > > @Id
> > > > > @GeneratedValue(strategy = GenerationType.auto)
> > > > > @NonVisual
> > > > > private long id;
> > > > > 
> > > > > @OneToMany(mappedBy = "person", cascade = CascadeType.ALL,
> > > > orphanRemoval = true)
> > > > > private List<Phone> phones;
> > > > > 
> > > > > public List<Phone> getPhones() {
> > > > > if(phones == null) {
> > > > > phones = new ArrayList<>();
> > > > > }
> > > > > return phones;
> > > > > }
> > > > > 
> > > > > public void setPhones(List<Phone> phones) {
> > > > > this.phones = phones;
> > > > > }
> > > > > 
> > > > > }
> > > > > 
> > > > > @Entity
> > > > > public class Phone {
> > > > > 
> > > > > @Id
> > > > > @GeneratedValue(strategy = GenerationType.auto)
> > > > > @NonVisual
> > > > > private long id;
> > > > > 
> > > > > @ManyToOne(optional = false)
> > > > > private Person person;
> > > > > 
> > > > > @Column(nullable = true, length = 20)
> > > > > @Width(20)
> > > > > @Validate("required,maxlength=20")
> > > > > private String number;
> > > > > 
> > > > > public Phone(Person person) {
> > > > > this.person = person;
> > > > > }
> > > > > 
> > > > > //getters and setters
> > > > > 
> > > > > }
> > > > > 
> > > > > Thanks in advance.
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > > --
> > > > George Christman
> > > > www.CarDaddy.com
> > > > P.O. Box 735
> > > > Johnstown, New York
> > > > 
> > > 
> > 
> > 
> > 
> > --
> > George Christman
> > www.CarDaddy.com
> > P.O. Box 735
> > Johnstown, New York
> > 
> 



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



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic