package org.orienteer.core.web; import com.orientechnologies.orient.core.record.impl.ODocument; import org.apache.wicket.Component; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.lang.Objects; import org.orienteer.core.OrienteerWebSession; import org.orienteer.core.component.DefaultPageHeader; import org.orienteer.core.component.FAIcon; import org.orienteer.core.component.ODocumentPageLink; import org.orienteer.core.component.OrienteerFeedbackPanel; import org.orienteer.core.model.ODocumentNameModel; import org.orienteer.core.module.PerspectivesModule; import ru.ydn.wicket.wicketorientdb.OrientDbWebSession; import ru.ydn.wicket.wicketorientdb.model.ODocumentPropertyModel; import ru.ydn.wicket.wicketorientdb.model.OQueryModel; import java.util.List; /** * Root page for pages which require Orienteers highlevel UI: top navigation bar and left menu * * @param <T> type of a main object for this page */ public abstract class OrienteerBasePage<T> extends BasePage<T> { private static final long serialVersionUID = 1L; private OrienteerFeedbackPanel feedbacks; public OrienteerBasePage() { super(); } public OrienteerBasePage(IModel<T> model) { super(model); } public OrienteerBasePage(PageParameters parameters) { super(parameters); } @Override public void initialize() { super.initialize(); add(new BookmarkablePageLink<T>("home", getApplication().getHomePage())); final AttributeAppender highlightActivePerspective = new AttributeAppender("class", "active") { @Override public boolean isEnabled(Component component) { return Objects.isEqual(getPerspective(), component.getDefaultModelObject()); } }; add(new ListView<ODocument>("perspectives", new OQueryModel<ODocument>("select from "+PerspectivesModule.OCLASS_PERSPECTIVE)) { @Override protected void populateItem(ListItem<ODocument> item) { IModel<ODocument> itemModel = item.getModel(); Link<ODocument> link = new Link<ODocument>("link", itemModel) { @Override public void onClick() { OrienteerWebSession.get().setPerspecive(getModelObject()); OrienteerBasePage.this.info( getLocalizer().getString("info.perspectivechanged", this, new ODocumentNameModel(getModel())) ); } }; link.add(new FAIcon("icon", new ODocumentPropertyModel<String>(itemModel, "icon")), new Label("name", new ODocumentNameModel(item.getModel())).setRenderBodyOnly(true)); item.add(link); item.add(highlightActivePerspective); } }); boolean signedIn = OrientDbWebSession.get().isSignedIn(); add(new BookmarkablePageLink<Object>("login", LoginPage.class).setVisible(!signedIn)); add(new BookmarkablePageLink<Object>("logout", LogoutPage.class).setVisible(signedIn)); IModel<ODocument> perspectiveModel = new PropertyModel<ODocument>(this, "perspective"); add(new RecursiveMenuPanel("perspectiveItems", perspectiveModel)); add(feedbacks = new OrienteerFeedbackPanel("feedbacks")); add(new ODocumentPageLink("myProfile", new PropertyModel<ODocument>(this, "session.user.document"))); final IModel<String> queryModel = Model.of(); Form<String> searchForm = new Form<String>("searchForm", queryModel) { @Override protected void onSubmit() { setResponsePage(new SearchPage(queryModel)); } }; searchForm.add(new TextField<String>("query", queryModel, String.class)); searchForm.add(new AjaxButton("search"){}); add(searchForm); } @Override protected void onInitialize() { super.onInitialize(); add(newPageHeaderComponent("pageHeader")); } protected Component newPageHeaderComponent(String componentId) { return new DefaultPageHeader(componentId, getTitleModel()); } public OrienteerFeedbackPanel getFeedbacks() { return feedbacks; } }