package fr.openwide.core.wicket.more.markup.html.bootstrap.popover.component;
import static fr.openwide.core.commons.util.functional.Predicates2.hasText;
import static fr.openwide.core.commons.util.functional.Predicates2.isTrue;
import static fr.openwide.core.wicket.more.condition.Condition.anyChildVisible;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import fr.openwide.core.wicket.markup.html.basic.CoreLabel;
import fr.openwide.core.wicket.markup.html.panel.GenericPanel;
import fr.openwide.core.wicket.more.condition.Condition;
import fr.openwide.core.wicket.more.markup.html.basic.EnclosureContainer;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.popover.BootstrapPopoverBehavior;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.popover.BootstrapPopoverOptions;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.popover.PopoverPlacement;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.popover.PopoverTrigger;
public abstract class AbstractPopoverLinkPanel<T> extends GenericPanel<T> {
private static final long serialVersionUID = 8844418022863220927L;
private final IModel<Boolean> showLabelModel = Model.of(Boolean.TRUE);
private final IModel<String> iconCssClassModel = Model.of();
private final IModel<String> linkCssClassModel = Model.of();
private final BootstrapPopoverOptions options;
@Override
protected void onDetach() {
super.onDetach();
showLabelModel.detach();
iconCssClassModel.detach();
linkCssClassModel.detach();
}
public AbstractPopoverLinkPanel(String id, IModel<T> model) {
super(id, model);
Component titleComponent = getTitleComponent("titleComponent");
Component contentComponent = getContentComponent("contentComponent");
options = new BootstrapPopoverOptions();
options.setTitleComponent(titleComponent);
options.setAddCloseButton(true);
options.setContentComponent(contentComponent);
options.setPlacement(PopoverPlacement.RIGHT);
options.setTrigger(PopoverTrigger.CLICK);
options.setContainer("body");
options.setHtml(true);
// Ne PAS utiliser BlankLink ici, on ne veut pas de href qui entraƮnerait un retour en haut de page
WebMarkupContainer link = new WebMarkupContainer("link");
add(
titleComponent,
contentComponent,
link
.add(
new EnclosureContainer("icon").condition(Condition.predicate(iconCssClassModel, hasText()))
.add(new AttributeModifier("class", iconCssClassModel)),
new CoreLabel("label", getModel())
.hideIfEmpty()
.add(Condition.predicate(showLabelModel, isTrue()).thenShow())
)
.add(
anyChildVisible(link).thenShowInternal(),
new AttributeModifier("class", linkCssClassModel),
new BootstrapPopoverBehavior(options)
)
);
add(
Condition.componentVisible(contentComponent).thenShowInternal()
);
}
protected abstract Component getTitleComponent(String wicketId);
protected abstract Component getContentComponent(String wicketId);
public AbstractPopoverLinkPanel<T> hideLabel() {
showLabelModel.setObject(false);
return this;
}
public AbstractPopoverLinkPanel<T> iconCssClass(String iconCssClass) {
iconCssClassModel.setObject(iconCssClass);
return this;
}
public AbstractPopoverLinkPanel<T> linkCssClass(String linkCssClass) {
linkCssClassModel.setObject(linkCssClass);
return this;
}
public AbstractPopoverLinkPanel<T> popoverTrigger(PopoverTrigger trigger) {
options.setTrigger(trigger);
return this;
}
public AbstractPopoverLinkPanel<T> popoverPlacement(PopoverPlacement placement) {
options.setPlacement(placement);
return this;
}
}