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 <gchrist...@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 < > lukewilsonma...@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 > > <gchrist...@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 > > > <gchrist...@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 >