I don't have the time now to dive into this, but it sounds like the select thinks it has a value when it's time to validate. Have you set a breakpoint in the Select component to see what it thinks that value is?
Josh On Wed, Apr 20, 2011 at 1:36 PM, Adam Zimowski <zimowsk...@gmail.com> wrote: > 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 > > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org