I'm sorry, I am on Tapestry 5.2.5 :-) On Thu, Apr 21, 2011 at 10:19 AM, Adam Zimowski <zimowsk...@gmail.com> wrote: > @Josh - When I debug Select in 5.2.4 (break on processSubmission(), > line 166), selectedValue is blank which is expected. So select > correctly submits without a value, it's just it seems that the > validator does not recognize that select state was repopulated via > zone and consequently no value was submitted the 2nd time. It seems to > me like the form validator somehow things that select has the value > from the prior submission, but it really doesn't since it was reset > via zone update. > > @Mark - by validation kicks in, I meant that form was submitted and > validated. I have a debug on state code passed from the state select > component when form activates, and AddressUiBean comes back with the > correct value. That is, when I select the state from the dropdown, > AddressUiBean carries the state as expected. Even when form is in > error, as I change the country thereby causing state dropdown get > repopulated, and resubmit the form with blank option for state (did > not select the state), AddressUiBean shows null state code (as > expected). Yet the form does not report the error on the required > state field. > > Adam > > On Wed, Apr 20, 2011 at 10:25 PM, Mark <mark-li...@xeric.net> wrote: >> When you say "Validation kicks in" does this occur after a submit? If so, >> is it possible that AddressUIBean is remembering the value that was present >> when the submit occurred and then on the second submit it is getting set to >> null again? >> >> At the point when you would expect an error to occur, what is the value of >> the state field? That should give you a good clue as to what is happening. >> >> Mark >> >> 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