Nobody ran into this? I have a feeling that I'm doing something wrong, but then, I'm not sure either if Tapestry is just not working as expected.
If I make the stateUpdateZone wrap entire form, then form is aware of state value change. But I do not want to refresh entire form, all I want to update is my little zone which I want to wrap state select in. Adam On Tue, Apr 19, 2011 at 5:11 PM, Adam Zimowski <zimowsk...@gmail.com> wrote: > I have a typical address form with street, city zip textfields and two > dropdowns: country and state. The state dropdown is wrapped in a zone > so that when country is selected, states are populated: > > <div class="kk-field" t:type="zone" t:id="stateModelZone"><t:select > t:id="a_state" model="stateModel" validate="required" > value="stateKode" blankOption="ALWAYS" blankLabel="literal:--Please > Select"/></div> > > All works okay, except for a test case my business analyst found which > I can't figure out. > > You fill out a form, pick a country then pick a state and suppose you > leave city field empty which is required. Validation kicks in. While > correcting a city error, you decide to switch a country causing state > list to get repopulated and state be not selected again. Suppose you > submit the form, I expect the error that state is required, but error > is not thrown. Only if I resubmit the form a second time, state will > be flagged in error. > > I am resetting state to null on country change. I have even tried > setting form state field in error, none of which works. > > ---------- TML -------------- > > <t:form t:id="registrationForm"> > <div class="kk-hdr">Address Information</div> > <div class="kk-row"> > <div class="kk-label"><t:label for="a_line1"/> :</div> > <div class="kk-field"><t:textfield t:id="a_line1" > value="address.line1"/></div> > <t:error class="literal:kk-error" for="a_line1"/> > </div> > <div class="kk-row"> > <div class="kk-label"><t:label for="a_line2"/> :</div> > <div class="kk-field"><t:textfield t:id="a_line2" > value="address.line2"/></div> > <t:error class="literal:kk-error" for="a_line2"/> > </div> > <div class="kk-row"> > <div class="kk-label"><t:label for="a_line3"/> :</div> > <div class="kk-field"><t:textfield t:id="a_line3" > value="address.line3"/></div> > <t:error class="literal:kk-error" for="a_line3"/> > </div> > <div class="kk-row"> > <div class="kk-label"><t:label for="a_city"/> :</div> > <div class="kk-field"><t:textfield t:id="a_city" value="address.city"/></div> > <t:error class="literal:kk-error" for="a_city"/> > </div> > <div class="kk-row"> > <div class="kk-label"><t:label for="a_zip"/> :</div> > <div class="kk-field"><t:textfield t:id="a_zip" > value="address.zipCode"/></div> > <t:error class="literal:kk-error" for="a_zip"/> > </div> > <div class="kk-row"> > <div class="kk-label"><t:label for="a_state"/> :</div> > <div class="kk-field" t:type="zone" t:id="stateModelZone"><t:select > t:id="a_state" model="stateModel" validate="required" > value="address.stateCode" blankOption="ALWAYS" > blankLabel="literal:--Please Select"/></div> > <t:error class="literal:kk-error" for="a_state"/> > </div> > <div class="kk-row"> > <div class="kk-label"><t:label for="a_country"/> :</div> > <div class="kk-field"><t:select t:id="a_country" model="countryModel" > value="address.countryCode" blankOption="NEVER" > zone="stateModelZone"/></div> > </div> > <p> > <input t:type="submit" value="message:submit-label"/> > </p> > </t:form> > > ---------------- Page class ------------------------- > > public class Register extends BasePage { > > @Inject > private Logger log; > > @Inject > private UtilityServiceRemote utilityService; > > @Persist > @Property > private AddressUiBean address; > > @OnEvent(value=EventConstants.PREPARE) > void initialize() { > if(address == null) address = new AddressUiBean(); > if(contact == null) contact = new ContactUiBean(); > if(registration == null) registration = new RegisterUiBean(); > > String countryCode = address.getCountryCode(); > if(countryCode == null) { > Locale locale = getLocale(); > countryCode = locale.getCountry(); > address.setCountryCode(countryCode); > } > > log.debug("address state code {}", address.getStateCode()); > } > > @Cached > public Map<String, String> getCountryModel() { > Map<String, String> model = new LinkedHashMap<String, > String>(); > List<CountryBean> countries = > utilityService.getAllCountries(getLocale()); > for(CountryBean country : countries) { > String code = country.getCodeIsoAlpha2(); > String description = country.getShortName(); > log.debug("code: {}, description: {}", code, > description); > model.put(code, description); > } > return model; > } > > @OnEvent(value=EventConstants.VALUE_CHANGED, component="a_country") > public Object onCountrySelected(String aCountryCode) { > log.debug("selected country: {}", aCountryCode); > address.setStateCode(null); > return stateModelZone.getBody(); > } > > @Cached > public Map<String, String> getStateModel() { > Map<String, String> model = new LinkedHashMap<String, > String>(); > String countryCode = address.getCountryCode(); > List<StateProvinceBean> states = > > utilityService.getAllStateProvincesForCountry(countryCode, getLocale()); > for(StateProvinceBean state : states) { > String code = state.getLookupCode(); > String name = state.getLongName(); > log.debug("code: {}, name {}", code, name); > model.put(code, name); > } > return model; > } > } > > Adam > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org