@@ -0,0 +1,68 @@
|
|||||||
|
package info.bukova.isspst.ui;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
|
import org.apache.commons.beanutils.BeanUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.zkoss.bind.SimpleForm;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Třída middle objektu pro validaci formuláře. Umožňuje uložit formulář do datového objektu bez volání validace.
|
||||||
|
* Do definice formuláře v ZUL souboru je potřeba uvést: {@code @init(vm.dataForm) }.
|
||||||
|
*
|
||||||
|
* @author pepa
|
||||||
|
*
|
||||||
|
* @param <T> Třída datového objektu
|
||||||
|
*/
|
||||||
|
public class BindingForm<T> extends SimpleForm {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = -9052402254058071780L;
|
||||||
|
private T dataBean;
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(BindingForm.class);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uloží formulář do předaného objektu.
|
||||||
|
*
|
||||||
|
* @param object Datový objekt
|
||||||
|
*/
|
||||||
|
public void bindTo(T object) {
|
||||||
|
for (String key : getFieldNames()) {
|
||||||
|
try {
|
||||||
|
BeanUtils.setProperty(object, key, getField(key));
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
logger.warn("Cannot bind value", e);
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
logger.warn("Cannot bind value", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uloží formulář do členského datového objektu.
|
||||||
|
*/
|
||||||
|
public void bind() {
|
||||||
|
bindTo(dataBean);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getDataBean() {
|
||||||
|
return dataBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Nastaví datový objekt této instance {@link BindingForm}
|
||||||
|
*
|
||||||
|
* @param dataBean Datový objekt
|
||||||
|
*/
|
||||||
|
public void setDataBean(T dataBean) {
|
||||||
|
this.dataBean = dataBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -28,6 +28,7 @@ public class FormViewModel<T extends DataModel> extends DocumentViewModel
|
|||||||
private Service<T> service;
|
private Service<T> service;
|
||||||
private boolean newRec;
|
private boolean newRec;
|
||||||
private ServiceConstraint<T> constraint;
|
private ServiceConstraint<T> constraint;
|
||||||
|
private BindingForm<T> dataForm;
|
||||||
|
|
||||||
@Init
|
@Init
|
||||||
public void initFormViewModel(@ExecutionArgParam("selected") T selected, @ExecutionArgParam("service") Service<T> service)
|
public void initFormViewModel(@ExecutionArgParam("selected") T selected, @ExecutionArgParam("service") Service<T> service)
|
||||||
@@ -39,6 +40,9 @@ public class FormViewModel<T extends DataModel> extends DocumentViewModel
|
|||||||
constraint = new ServiceConstraint<T>();
|
constraint = new ServiceConstraint<T>();
|
||||||
constraint.setDataBean(selected);
|
constraint.setDataBean(selected);
|
||||||
constraint.setService(service);
|
constraint.setService(service);
|
||||||
|
dataForm = new BindingForm<T>();
|
||||||
|
dataForm.setDataBean(selected);
|
||||||
|
|
||||||
if (selected.getId() == 0 && selected.getCreated() == null)
|
if (selected.getId() == 0 && selected.getCreated() == null)
|
||||||
{
|
{
|
||||||
newRec = true;
|
newRec = true;
|
||||||
@@ -183,4 +187,8 @@ public class FormViewModel<T extends DataModel> extends DocumentViewModel
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BindingForm<T> getDataForm() {
|
||||||
|
return dataForm;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import info.bukova.isspst.services.IsspstException;
|
|||||||
import info.bukova.isspst.services.addressbook.AdbService;
|
import info.bukova.isspst.services.addressbook.AdbService;
|
||||||
import info.bukova.isspst.services.addressbook.AddressFinder;
|
import info.bukova.isspst.services.addressbook.AddressFinder;
|
||||||
import info.bukova.isspst.ui.FormViewModel;
|
import info.bukova.isspst.ui.FormViewModel;
|
||||||
|
import info.bukova.isspst.validators.AddressValidator;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -28,15 +29,18 @@ public class AddressForm extends FormViewModel<Address> {
|
|||||||
private AddressFinder addressFinderAres;
|
private AddressFinder addressFinderAres;
|
||||||
@WireVariable
|
@WireVariable
|
||||||
private AddressFinder addressFinderTaxID;
|
private AddressFinder addressFinderTaxID;
|
||||||
|
private AddressValidator validator;
|
||||||
|
|
||||||
@Init(superclass = true)
|
@Init(superclass = true)
|
||||||
public void init() {
|
public void init() {
|
||||||
|
validator = new AddressValidator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command
|
@Command
|
||||||
@NotifyChange("dataBean")
|
@NotifyChange("dataBean")
|
||||||
public void searchAres() {
|
public void searchAres() {
|
||||||
|
getDataForm().bind();
|
||||||
|
|
||||||
if (getDataBean().getIc() != 0) {
|
if (getDataBean().getIc() != 0) {
|
||||||
try {
|
try {
|
||||||
adbService.fillFoundData(addressFinderTaxID, getDataBean());
|
adbService.fillFoundData(addressFinderTaxID, getDataBean());
|
||||||
@@ -74,4 +78,8 @@ public class AddressForm extends FormViewModel<Address> {
|
|||||||
window.detach();
|
window.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AddressValidator getValidator() {
|
||||||
|
return validator;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package info.bukova.isspst.validators;
|
||||||
|
|
||||||
|
import org.zkoss.bind.ValidationContext;
|
||||||
|
|
||||||
|
public class AddressValidator extends BaseValidator {
|
||||||
|
|
||||||
|
private static final String EMAIL_PATTERN =
|
||||||
|
"^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
|
||||||
|
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
|
||||||
|
private static final String URL_PATTERN = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void validate(ValidationContext ctx) {
|
||||||
|
if (!validateIsNotNullOrNotEmpty(ctx, "company", "CompanyIsEmpty", "company")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!validateIsNotNullOrNotEmpty(ctx, "city", "CityIsEmpty", "city")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!validateRegExp(ctx, "email", "EmailFormatIncorrect", "email", EMAIL_PATTERN)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!validateRegExp(ctx, "web", "WebUrlFormatIncorrect", "web", URL_PATTERN)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
package info.bukova.isspst.validators;
|
package info.bukova.isspst.validators;
|
||||||
|
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import info.bukova.isspst.StringUtils;
|
import info.bukova.isspst.StringUtils;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -94,4 +97,31 @@ public abstract class BaseValidator extends AbstractValidator
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected boolean validateRegExp(ValidationContext ctx, String property, String errMessage, String componentId, String regExpPattern) {
|
||||||
|
String value = getStringValue(ctx, property);
|
||||||
|
|
||||||
|
if (value != null && !value.isEmpty()) {
|
||||||
|
Pattern pattern = Pattern.compile(regExpPattern);
|
||||||
|
Matcher matcher = pattern.matcher(value);
|
||||||
|
|
||||||
|
if (!matcher.matches()) {
|
||||||
|
errorMsg(ctx, StringUtils.localize(errMessage), componentId);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getStringValue(ValidationContext ctx, String property) {
|
||||||
|
Property prop = ctx.getProperties(property)[0];
|
||||||
|
Object value = prop.getValue();
|
||||||
|
|
||||||
|
if (value == null || !(value instanceof String)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (String)value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,15 @@ DataTypeErr=Chybný datový typ...
|
|||||||
|
|
||||||
UserPasswordIsEmpty=Uživatelské heslo musí být zadané...
|
UserPasswordIsEmpty=Uživatelské heslo musí být zadané...
|
||||||
UserPasswordsAreNotSame=Znovu zadané heslo není stejné...
|
UserPasswordsAreNotSame=Znovu zadané heslo není stejné...
|
||||||
|
|
||||||
RequirementCenterIsEmpty=Musíte zadat středisko...
|
RequirementCenterIsEmpty=Musíte zadat středisko...
|
||||||
TripDateIsEmpty=Musíte zadat datum cesty...
|
TripDateIsEmpty=Musíte zadat datum cesty...
|
||||||
EndDateIsEmpty=Musíte zadat datum konce cesty...
|
EndDateIsEmpty=Musíte zadat datum konce cesty...
|
||||||
FromIsEmpty=Musíte zadat místo začátku cesty...
|
FromIsEmpty=Musíte zadat místo začátku cesty...
|
||||||
ToIsEmpty=Musíte zadat cíl cesty...
|
ToIsEmpty=Musíte zadat cíl cesty...
|
||||||
VehicleIsEmpty=Musíte zadat dopravní prostředek...
|
VehicleIsEmpty=Musíte zadat dopravní prostředek...
|
||||||
|
|
||||||
|
CompanyIsEmpty=Název firmy musí být zadaný...
|
||||||
|
CityIsEmpty=Město musí být zadané...
|
||||||
|
EmailFormatIncorrect=E-mailová adresa musí být správně zadaná...
|
||||||
|
WebUrlFormatIncorrect=Adresa webu musí být správně zadaná...
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
|
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
|
||||||
<window id="editWin" border="normal" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('info.bukova.isspst.ui.addressbook.AddressForm')" closable="true" width="600px">
|
<window id="editWin" border="normal" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('info.bukova.isspst.ui.addressbook.AddressForm')" closable="true" width="600px">
|
||||||
<caption zclass="form-caption" label="${labels.SuppliersFormTitle}" />
|
<caption zclass="form-caption" label="${labels.SuppliersFormTitle}" />
|
||||||
<grid width="580px">
|
<grid form="@id('fx') @init(vm.dataForm) @load(vm.dataBean) @save(vm.dataBean, before='save') @validator(vm.validator)" width="580px">
|
||||||
<columns>
|
<columns>
|
||||||
<column label="" hflex="min" />
|
<column label="" hflex="min" />
|
||||||
<column label="" hflex="min" />
|
<column label="" hflex="min" />
|
||||||
@@ -12,52 +12,52 @@
|
|||||||
<rows>
|
<rows>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormCompany}" />
|
<label value="${labels.SuppliersFormCompany}" />
|
||||||
<textbox id="company" constraint="@load(vm.constriant)" value="@bind(vm.dataBean.company)" instant="true" width="320px" />
|
<textbox id="company" value="@bind(fx.company)" instant="true" width="320px" />
|
||||||
<button image="/img/search.png" label="${labels.SuppliersFormFindInARES}" onClick="@command('searchAres')" sclass="nicebutton" disabled="@load((vm.dataBean.ic == 0) && (empty vm.dataBean.company))" />
|
<button image="/img/search.png" label="${labels.SuppliersFormFindInARES}" onClick="@command('searchAres')" sclass="nicebutton" disabled="@load((vm.dataBean.ic == 0) && (empty vm.dataBean.company))" />
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormIC}" />
|
<label value="${labels.SuppliersFormIC}" />
|
||||||
<textbox value="@bind(vm.dataBean.ic)" />
|
<textbox value="@bind(fx.ic)" instant="true" />
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormDIC}" />
|
<label value="${labels.SuppliersFormDIC}" />
|
||||||
<textbox value="@bind(vm.dataBean.dic)" />
|
<textbox value="@bind(fx.dic)" />
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormDepartment}" />
|
<label value="${labels.SuppliersFormDepartment}" />
|
||||||
<textbox value="@bind(vm.dataBean.department)" />
|
<textbox value="@bind(fx.department)" />
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormContact}" />
|
<label value="${labels.SuppliersFormContact}" />
|
||||||
<textbox value="@bind(vm.dataBean.contactName)" />
|
<textbox value="@bind(fx.contactName)" />
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormStreet}" />
|
<label value="${labels.SuppliersFormStreet}" />
|
||||||
<textbox value="@bind(vm.dataBean.street)" width="320px" />
|
<textbox value="@bind(fx.street)" width="320px" />
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormNo}" />
|
<label value="${labels.SuppliersFormNo}" />
|
||||||
<textbox value="@bind(vm.dataBean.houseNumber)" width="80px" />
|
<textbox value="@bind(fx.houseNumber)" width="80px" />
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormCity}" />
|
<label value="${labels.SuppliersFormCity}" />
|
||||||
<textbox id="city" constraint="@load(vm.constriant)" value="@bind(vm.dataBean.city)" width="320px" />
|
<textbox id="city" value="@bind(fx.city)" width="320px" />
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormZIP}" />
|
<label value="${labels.SuppliersFormZIP}" />
|
||||||
<textbox value="@bind(vm.dataBean.zipCode)" />
|
<textbox value="@bind(fx.zipCode)" />
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormPhone}" />
|
<label value="${labels.SuppliersFormPhone}" />
|
||||||
<textbox value="@bind(vm.dataBean.phone)" />
|
<textbox value="@bind(fx.phone)" />
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormEmail}" />
|
<label value="${labels.SuppliersFormEmail}" />
|
||||||
<textbox id="email" constraint="@load(vm.constriant)" value="@bind(vm.dataBean.email)" width="320px" />
|
<textbox id="email" value="@bind(fx.email)" width="320px" />
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<label value="${labels.SuppliersFormWWW}" />
|
<label value="${labels.SuppliersFormWWW}" />
|
||||||
<textbox id="web" constraint="@load(vm.constriant)" value="@bind(vm.dataBean.web)" width="320px" />
|
<textbox id="web" value="@bind(fx.web)" width="320px" />
|
||||||
</row>
|
</row>
|
||||||
</rows>
|
</rows>
|
||||||
</grid>
|
</grid>
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
</panel>
|
</panel>
|
||||||
<panel>
|
<panel>
|
||||||
<panelchildren>
|
<panelchildren>
|
||||||
<ckeditor height="65px" width="100%" toolbar="Basic" value="@bind(vm.dataBean.description)" />
|
<ckeditor height="65px" width="100%" toolbar="Basic" value="@bind(fx.description)" />
|
||||||
</panelchildren>
|
</panelchildren>
|
||||||
</panel>
|
</panel>
|
||||||
</vlayout>
|
</vlayout>
|
||||||
|
|||||||
Reference in New Issue
Block a user