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: [email protected]
For additional commands, e-mail: [email protected]