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

Reply via email to