package fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.component;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.visit.IVisit;
import org.apache.wicket.util.visit.IVisitor;
import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils;
public abstract class AbstractAjaxModalPopupPanel<O> extends AbstractModalPopupPanel<O> implements IAjaxModalPopupPanel {
private static final long serialVersionUID = 2483564542384270295L;
private final boolean resetInputOnShow;
private boolean shown = false;
/**
* Le fonctionnement par défaut provoque le vidage des saisies utilisateur lors du show. Utiliser le constructeur
* avec le paramètre {@link AbstractAjaxModalPopupPanel#resetInputOnShow} si vous désirez conserver les saisies
* utilisateur après ouverture / fermeture du popup.
*/
public AbstractAjaxModalPopupPanel(String id, IModel<? extends O> model) {
this(id, model, true);
}
/**
*
*
* @param id identifiant wicket du composant
* @param model modèle du composant
* @param resetInputOnShow indique si le ou les formulaires doivent être réinitialisée lors du show (ouverture). La
* réinitialisation consiste à ne pas prendre en compte les saisies utilisateur précédentes
* et à se baser intégralement sur le modèle. Ce fonctionnement implique un parcours du
* composant pour chercher les éléments de type {@link Form}
*/
public AbstractAjaxModalPopupPanel(String id, IModel<? extends O> model, boolean resetInputOnShow) {
super(id, model);
this.resetInputOnShow = resetInputOnShow;
}
@Override
protected void onConfigure() {
super.onConfigure();
getBody().setVisible(shown);
getHeader().setVisible(shown);
getFooter().setVisible(shown);
}
@Override
public final void show(AjaxRequestTarget target) {
shown = true;
getBody().setVisible(shown);
getHeader().setVisible(shown);
getFooter().setVisible(shown);
target.add(getContainer());
onShow(target);
if (resetInputOnShow) {
visitChildren(Form.class, new IVisitor<Form<?>, Void>() {
@Override
public void component(Form<?> component, IVisit<Void> visit) {
component.clearInput();
}
});
}
visitChildren(IAjaxModalShowListener.class, new OnShowVisitor<>(target));
FeedbackUtils.refreshFeedback(target, getPage());
}
private class OnShowVisitor<T extends Component & IAjaxModalShowListener> implements IVisitor<T, Void> {
private final AjaxRequestTarget target;
public OnShowVisitor(AjaxRequestTarget target) {
super();
this.target = target;
}
@Override
public void component(T object, IVisit<Void> visit) {
object.onShow(AbstractAjaxModalPopupPanel.this, target);
}
}
protected final void closePopup(AjaxRequestTarget target) {
target.prependJavaScript(closeStatement().render(true));
}
protected void onShow(AjaxRequestTarget target) {
}
}