package de.flower.rmt.ui.markup.html.form;
import de.flower.common.ui.ajax.markup.html.form.AjaxSubmitLink;
import de.flower.common.util.Check;
import de.flower.rmt.ui.markup.html.panel.FormFeedbackPanel;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
/**
* Form for editing domain objects.
* Assumes:
* - model containing domain object is a LoadableDetachableModel. Needed to avoid
* serializing domain objects to the page store.
*
* @author flowerrrr
*/
public abstract class EntityForm<T> extends Form<T> {
private AjaxSubmitLink ajaxSubmitLink;
public EntityForm(String id, T entity) {
super(id, new CompoundPropertyModel<T>(entity));
Check.notNull(entity);
init();
}
public EntityForm(String id, IModel<T> model) {
super(id, new CompoundPropertyModel<T>(model));
Check.notNull(model);
init();
}
private void init() {
add(new FormFeedbackPanel(this) {
@Override
public boolean isShowSuccessFeedbackPanel() {
return EntityForm.this.isShowSuccessFeedbackPanel();
}
});
ajaxSubmitLink = new AjaxSubmitLink("submitButton") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
onBeforeValidation((T) form.getModelObject());
if (!new org.wicketstuff.jsr303.validator.BeanValidator(form).isValid(form.getModelObject())) {
onError(target, form);
target.add(EntityForm.this);
} else {
EntityForm.this.onSubmit(target, (Form<T>) form);
target.add(EntityForm.this);
}
}
};
add(ajaxSubmitLink);
}
/**
* Override this method to hide feedback panel after submit.
*
* @return
*/
protected boolean isShowSuccessFeedbackPanel() {
return true;
}
@SuppressWarnings("EmptyMethod")
protected void onBeforeValidation(T entity) {
}
public AjaxSubmitLink getAjaxSubmitLink() {
return ajaxSubmitLink;
}
protected abstract void onSubmit(AjaxRequestTarget target, Form<T> form);
}