package fr.openwide.core.wicket.more.markup.html.feedback;
import static fr.openwide.core.wicket.more.property.WicketMorePropertyIds.GLOBAL_FEEDBACK_AUTOHIDE_DELAY_UNIT;
import static fr.openwide.core.wicket.more.property.WicketMorePropertyIds.GLOBAL_FEEDBACK_AUTOHIDE_DELAY_VALUE;
import java.util.concurrent.TimeUnit;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.lang.Args;
import org.wicketstuff.wiquery.core.events.Event;
import org.wicketstuff.wiquery.core.events.MouseEvent;
import org.wicketstuff.wiquery.core.javascript.JsQuery;
import org.wicketstuff.wiquery.core.javascript.JsScope;
import org.wicketstuff.wiquery.core.javascript.JsScopeEvent;
import org.wicketstuff.wiquery.core.javascript.JsStatement;
import fr.openwide.core.spring.property.service.IPropertyService;
import fr.openwide.core.wicket.behavior.ClassAttributeAppender;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.alert.AlertJavascriptResourceReference;
public class AnimatedGlobalFeedbackPanel extends GlobalFeedbackPanel {
private static final long serialVersionUID = 2213180445046166086L;
@SpringBean
private IPropertyService propertyService;
private Integer autohideDelayValue;
private TimeUnit autohideDelayUnit;
public AnimatedGlobalFeedbackPanel(String id) {
this(id, null, null);
}
/**
* @param id Id wicket.
* @param autohideDelay Délai de fermeture automatique, en secondes.
* Si < 0 : le feedback ne se cache pas automatiquement
*/
public AnimatedGlobalFeedbackPanel(String id, Integer autohideDelayValue, TimeUnit autohideDelayUnit) {
super(id);
setOutputMarkupId(true);
this.autohideDelayValue = autohideDelayValue != null ? autohideDelayValue : propertyService.get(GLOBAL_FEEDBACK_AUTOHIDE_DELAY_VALUE);
this.autohideDelayUnit = autohideDelayUnit != null ? autohideDelayUnit : propertyService.get(GLOBAL_FEEDBACK_AUTOHIDE_DELAY_UNIT);
Args.notNull(this.autohideDelayValue, "autohideDelayValue");
Args.notNull(this.autohideDelayUnit, "autohideDelayUnit");
WebMarkupContainer closeTrigger = new WebMarkupContainer("closeTrigger");
add(closeTrigger);
closeTrigger.add(new CloseAlertBehavior());
// To retrieve main panel on close event.
add(new ClassAttributeAppender(new Model<String>("animated-global-feedback")));
}
@Override
public void renderHead(IHeaderResponse response) {
response.render(JavaScriptHeaderItem.forReference(AlertJavascriptResourceReference.get()));
response.render(OnDomReadyHeaderItem.forScript(new JsStatement().append("$.fn.alert.reset('#")
.append(getMarkupId())
.append("', ")
.append(String.valueOf(autohideDelayUnit.toMillis(autohideDelayValue)))
.append(")").render()));
super.renderHead(response);
}
private static class CloseAlertBehavior extends Behavior {
private static final long serialVersionUID = -5585291224997829649L;
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
Event event = new Event(MouseEvent.CLICK) {
private static final long serialVersionUID = 2160875652552472051L;
@Override
public JsScope callback() {
return JsScopeEvent.quickScope("$.fn.alert.close(event);");
}
};
response.render(OnDomReadyHeaderItem.forScript(new JsQuery(component).$().chain(event).render()));
}
}
@Override
public FeedbackPanel getFeedbackPanel(String id, int level, MarkupContainer component) {
return new ErrorLevelFeedbackPanel(id, level) {
private static final long serialVersionUID = 4843857703266180362L;
private boolean visible = false;
@Override
public boolean isVisible() {
return visible;
}
@Override
protected void onConfigure() {
// cf WICKET-4536 : ceci dit, même après mise à jour, on a encore eu des cas avec le problème
// du coup, on laisse comme ça
super.onConfigure();
visible = anyMessage(level);
}
};
}
}