package fr.openwide.core.wicket.more.console.template;
import static fr.openwide.core.spring.property.SpringPropertyIds.VERSION;
import static fr.openwide.core.wicket.more.property.WicketMorePropertyIds.CONSOLE_GLOBAL_FEEDBACK_AUTOHIDE_DELAY_UNIT;
import static fr.openwide.core.wicket.more.property.WicketMorePropertyIds.CONSOLE_GLOBAL_FEEDBACK_AUTOHIDE_DELAY_VALUE;
import java.util.List;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.ResourceReference;
import org.apache.wicket.spring.injection.annot.SpringBean;
import com.google.common.collect.Lists;
import fr.openwide.core.jpa.more.business.upgrade.service.IAbstractDataUpgradeService;
import fr.openwide.core.jpa.security.business.person.model.GenericUser;
import fr.openwide.core.spring.property.service.IPropertyService;
import fr.openwide.core.wicket.behavior.ClassAttributeAppender;
import fr.openwide.core.wicket.markup.html.basic.CoreLabel;
import fr.openwide.core.wicket.more.AbstractCoreSession;
import fr.openwide.core.wicket.more.console.common.model.ConsoleMenuItem;
import fr.openwide.core.wicket.more.console.common.model.ConsoleMenuSection;
import fr.openwide.core.wicket.more.console.maintenance.upgrade.page.ConsoleMaintenanceDonneesPage;
import fr.openwide.core.wicket.more.markup.html.CoreWebPage;
import fr.openwide.core.wicket.more.markup.html.feedback.AnimatedGlobalFeedbackPanel;
import fr.openwide.core.wicket.more.markup.html.template.AbstractWebPageTemplate;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.collapse.BootstrapCollapseJavaScriptResourceReference;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.dropdown.BootstrapDropDownJavaScriptResourceReference;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.tooltip.BootstrapTooltip;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.tooltip.BootstrapTooltipDocumentBehavior;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.scrolltotop.ScrollToTopBehavior;
import fr.openwide.core.wicket.more.model.ApplicationPropertyModel;
import fr.openwide.core.wicket.more.security.page.LogoutPage;
public abstract class ConsoleTemplate extends CoreWebPage {
private static final long serialVersionUID = -477123413708677528L;
private static final String HEAD_PAGE_TITLE_SEPARATOR = " ‹ ";
@SpringBean
protected IPropertyService propertyService;
@SpringBean(required = false)
protected IAbstractDataUpgradeService dataUpgradeService;
private List<String> headPageTitleKeys = Lists.newArrayList();
public ConsoleTemplate(PageParameters parameters) {
super(parameters);
ConsoleConfiguration configuration = ConsoleConfiguration.get();
// Page title
addHeadPageTitleKey(configuration.getConsolePageTitleKey());
add(new ListView<String>("headPageTitle", headPageTitleKeys) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(final ListItem<String> item) {
item.add(new Label("headPageTitleSeparator", HEAD_PAGE_TITLE_SEPARATOR) {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(item.getIndex() > 0);
}
});
item.add(new Label("headPageTitleElement", new ResourceModel(item.getModelObject())));
}
});
add(new AnimatedGlobalFeedbackPanel("animatedGlobalFeedbackPanel",
propertyService.get(CONSOLE_GLOBAL_FEEDBACK_AUTOHIDE_DELAY_VALUE),
propertyService.get(CONSOLE_GLOBAL_FEEDBACK_AUTOHIDE_DELAY_UNIT))
);
// Menu sections
ListView<ConsoleMenuSection> menuSectionsListView = new ListView<ConsoleMenuSection>("menuSectionListView",
ConsoleConfiguration.get().getMenuSections()) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<ConsoleMenuSection> item) {
if (item.getModelObject().getMenuItems().size() > 0) {
item.add(new MenuSectionWithDropDownFragment("menuSectionFragment", "menuSectionWithDropDown", item.getModel()));
} else {
item.add(new MenuSectionWithoutDropDownFragment("menuSectionFragment", "menuSectionWithoutDropDown", item.getModel()));
}
}
};
add(menuSectionsListView);
// User menu
add(new CoreLabel("userFullName", new LoadableDetachableModel<String>() {
private static final long serialVersionUID = 1L;
@Override
protected String load() {
String userFullName = null;
GenericUser<?, ?> user = AbstractCoreSession.get().getUser();
if (user != null) {
userFullName = user.getFullName();
}
return userFullName;
}
}).hideIfEmpty());
add(new BookmarkablePageLink<Void>("logoutLink", LogoutPage.class));
// Version
add(new Label("version", ApplicationPropertyModel.of(VERSION)));
add(new BootstrapTooltipDocumentBehavior(getBootstrapTooltip()));
// Scroll to top
add(new WebMarkupContainer("scrollToTop").add(new ScrollToTopBehavior()));
}
private BootstrapTooltip getBootstrapTooltip() {
BootstrapTooltip bootstrapTooltip = new BootstrapTooltip();
bootstrapTooltip.setSelector("[title],[data-original-title]");
bootstrapTooltip.setAnimation(true);
bootstrapTooltip.setContainer("body");
return bootstrapTooltip;
}
protected abstract Class<? extends ConsoleTemplate> getMenuSectionPageClass();
protected abstract Class<? extends ConsoleTemplate> getMenuItemPageClass();
protected void addHeadPageTitleKey(String titleElementKey) {
headPageTitleKeys.add(0, titleElementKey);
}
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
for (ResourceReference cssResourceReference : ConsoleConfiguration.get().getCssResourcesReferences()) {
response.render(CssHeaderItem.forReference(cssResourceReference));
}
response.render(JavaScriptHeaderItem.forReference(BootstrapCollapseJavaScriptResourceReference.get()));
response.render(JavaScriptHeaderItem.forReference(BootstrapDropDownJavaScriptResourceReference.get()));
}
private class MenuSectionWithoutDropDownFragment extends Fragment {
private static final long serialVersionUID = 8410165897953003122L;
public MenuSectionWithoutDropDownFragment(String id, String markupId, IModel<ConsoleMenuSection> menuSectionModel) {
super(id, markupId, ConsoleTemplate.this, menuSectionModel);
ConsoleMenuSection menuSection = menuSectionModel.getObject();
WebMarkupContainer menuSectionContainer = new WebMarkupContainer("menuSection");
add(menuSectionContainer);
AbstractLink menuSectionLink = new BookmarkablePageLink<Void>("menuSectionLink", menuSection.getPageClass())
.setBody(new ResourceModel(menuSection.getDisplayStringKey()));
menuSectionContainer.add(menuSectionLink);
if (menuSection.getPageClass() != null && menuSection.getPageClass().equals(getMenuSectionPageClass())) {
menuSectionContainer.add(new ClassAttributeAppender("active"));
}
}
}
private class MenuSectionWithDropDownFragment extends Fragment {
private static final long serialVersionUID = -7869292249062558408L;
public MenuSectionWithDropDownFragment(String id, String markupId, IModel<ConsoleMenuSection> menuSectionModel) {
super(id, markupId, ConsoleTemplate.this, menuSectionModel);
ConsoleMenuSection menuSection = menuSectionModel.getObject();
WebMarkupContainer menuSectionContainer = new WebMarkupContainer("menuSection");
add(menuSectionContainer);
if (menuSection.getPageClass() != null && menuSection.getPageClass().equals(getMenuSectionPageClass())) {
menuSectionContainer.add(new ClassAttributeAppender("active"));
}
menuSectionContainer.add(new Label("menuSectionLabel", new ResourceModel(menuSection.getDisplayStringKey())));
menuSectionContainer.add(new ListView<ConsoleMenuItem>("subMenuListView", menuSection.getMenuItems()) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<ConsoleMenuItem> item) {
ConsoleMenuItem menuItem = item.getModelObject();
AbstractLink menuItemLink = new BookmarkablePageLink<Void>("subMenuLink", menuItem.getPageClass())
.setBody(new ResourceModel(menuItem.getDisplayStringKey()));
// On ajoute la page des DataUpgrade seulement si un
// DataUpgradeService existe
if (ConsoleMaintenanceDonneesPage.class.isAssignableFrom(menuItem.getPageClass())) {
menuItemLink.setVisible(dataUpgradeService != null);
}
item.add(menuItemLink);
if (menuItem.getPageClass() != null && menuItem.getPageClass().equals(getMenuItemPageClass())) {
item.add(new ClassAttributeAppender("active"));
}
}
});
}
}
@Override
public String getVariation() {
// La console en BS3 quoi qu'il arrive, il ne faut pas laisser l'application
// qui l'utilise choisir si on utilise BS2 ou BS3.
return AbstractWebPageTemplate.BOOTSTRAP3_VARIATION;
}
}