package de.flower.rmt.ui.site; import de.flower.common.ui.ajax.event.AjaxEventListener; import de.flower.rmt.model.db.entity.event.Event; import de.flower.rmt.model.db.entity.event.QEvent; import de.flower.rmt.service.IBlogManager; import de.flower.rmt.service.IEventManager; import de.flower.rmt.ui.app.Links; import de.flower.rmt.ui.app.View; import de.flower.rmt.ui.markup.html.form.renderer.EventRenderer; import de.flower.rmt.ui.page.Pages; import de.flower.rmt.ui.page.about.AboutPage; import de.flower.rmt.ui.page.account.AccountPage; import de.flower.rmt.ui.page.base.INavigationPanelAware; import de.flower.rmt.ui.page.blog.BlogPage; import de.flower.rmt.ui.page.calendar.CalendarPage; import de.flower.rmt.ui.page.event.manager.EventPage; import de.flower.rmt.ui.page.event.manager.EventTabPanel; import de.flower.rmt.ui.page.events.manager.EventsPage; import de.flower.rmt.ui.page.opponents.manager.OpponentsPage; import de.flower.rmt.ui.page.teams.manager.TeamsPage; import de.flower.rmt.ui.page.users.UsersPage; import de.flower.rmt.ui.page.venues.manager.VenuesPage; import de.flower.rmt.ui.panel.RMTBasePanel; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Page; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; 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.LoadableDetachableModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.joda.time.DateTime; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * @author flowerrrr */ public class NavigationPanel extends RMTBasePanel { @SpringBean private IEventManager eventManager; @SpringBean private IBlogManager blogManager; public NavigationPanel(INavigationPanelAware page) { setRenderBodyOnly(true); add(new BookmarkablePageLink("about", AboutPage.class)); WebMarkupContainer events = new WebMarkupContainer("events"); if (isManagerView()) { addMenuItem(events, Pages.EVENTS.name(), EventsPage.class, page, true); } else { addMenuItem(events, Pages.EVENTS.name(), de.flower.rmt.ui.page.events.player.EventsPage.class, page, true); } add(events); events.add(new AjaxEventListener(Event.class)); final IModel<List<Event>> upcomingEventsModel = getEventListModel(); events.add(new ListView<Event>("eventList", upcomingEventsModel) { @Override protected void populateItem(final ListItem<Event> item) { Link link; if (isManagerView()) { link = new BookmarkablePageLink("link", EventPage.class, EventPage.getPageParams(item.getModelObject().getId(), EventTabPanel.INVITATIONS_PANEL_INDEX)); } else { link = new BookmarkablePageLink("link", de.flower.rmt.ui.page.event.player.EventPage.class, EventPage.getPageParams(item.getModelObject().getId())); } link.add(new Label("label", EventRenderer.getDateTeamTypeSummary(item.getModelObject(), false))); item.add(link); } }); events.add(new WebMarkupContainer("noUpcomingEvents") { @Override public boolean isVisible() { return upcomingEventsModel.getObject().isEmpty(); } }); WebMarkupContainer blog = new WebMarkupContainer("blog"); Link link = addMenuItem(blog, Pages.BLOG.name(), BlogPage.class, page, true); link.add(new WebMarkupContainer("unreadBadge") { @Override public boolean isVisible() { return blogManager.hasUnreadArticleOrComment(getUser()); } }); add(blog); List<MenuItem> menuItems = new ArrayList<>(); // menuItems.add(new MenuItem(BLOG, BlogPage.class, page, true)); menuItems.add(new MenuItem(Pages.CALENDAR.name(), CalendarPage.class, page, true)); menuItems.add(new MenuItem(Pages.TEAMS.name(), TeamsPage.class, page, getView() == View.MANAGER)); menuItems.add(new MenuItem(Pages.USERS.name(), UsersPage.class, page, true)); menuItems.add(new MenuItem(Pages.OPPONENTS.name(), OpponentsPage.class, page, getView() == View.MANAGER)); // TODO (flowerrrr - 24.06.12) unify both pages menuItems.add(new MenuItem(Pages.VENUES.name(), VenuesPage.class, page, getView() == View.MANAGER)); menuItems.add(new MenuItem(Pages.VENUES.name(), de.flower.rmt.ui.page.venues.player.VenuesPage.class, page, getView() != View.MANAGER)); ListView<MenuItem> menuList = new ListView<MenuItem>("menuList", menuItems) { @Override protected void populateItem(final ListItem<MenuItem> item) { MenuItem menuItem = item.getModelObject(); addMenuItem(item, menuItem.pageName, menuItem.targetPageClass, menuItem.currentPage, menuItem.visible); } }; add(menuList); add(new BookmarkablePageLink("account", AccountPage.class)); add(createSwitchViewLink("switchView", getView())); add(Links.logoutLink("logoutLink")); add(new Label("user", getUser().getFullname())); } private IModel<List<Event>> getEventListModel() { return new LoadableDetachableModel<List<Event>>() { @Override protected List<Event> load() { // from yesterday to next three month. if (isManagerView()) { return eventManager.findAllByDateRangeAndUser(new DateTime().minusDays(1), new DateTime().plusMonths(3), null, QEvent.event.team, QEvent.event.opponent); } else { return eventManager.findAllByDateRangeAndUser(new DateTime().minusDays(1), new DateTime().plusMonths(3), getUser(), QEvent.event.team, QEvent.event.opponent); } } }; } /** * Depending on user role (manager or player) a link is generated that * allows the user to switch between both views. * * @return */ private Link createSwitchViewLink(String id, View view) { Link link; if (view == View.MANAGER) { // manager can always switch to player view. link = new BookmarkablePageLink(id, de.flower.rmt.ui.page.events.player.EventsPage.class); link.add(new Label("label", new ResourceModel("navigation.switch.player").getObject())); } else { // player can only switch to manager mode if he has MANAGER role link = new BookmarkablePageLink(id, EventsPage.class); link.setVisible(getUser().isManager()); link.add(new Label("label", new ResourceModel("navigation.switch.manager").getObject())); } return link; } public Link addMenuItem(final WebMarkupContainer item, String pageName, Class<?> pageClass, final INavigationPanelAware page, boolean visible) { BookmarkablePageLink link = new BookmarkablePageLink("link", pageClass); link.add(new Label("label", new ResourceModel("navigation." + pageName.toLowerCase()))); item.add(link); if (page != null && page.getActiveTopBarItem().equals(pageName)) { item.add(AttributeModifier.append("class", "active")); } item.setVisible(visible); return link; } public static WebMarkupContainer createDropDownMenuItem(String pageName, final INavigationPanelAware page) { WebMarkupContainer li = new WebMarkupContainer(pageName); li.add(new ExternalLink(pageName, "#")); if (page != null && page.getActiveTopBarItem().equals(pageName)) { li.add(AttributeModifier.append("class", "active")); } return li; } public static class MenuItem implements Serializable { public String pageName; public Class<? extends Page> targetPageClass; public INavigationPanelAware currentPage; public boolean visible; public MenuItem(final String pageName, final Class<? extends Page> targetPageClass, final INavigationPanelAware currentPage, boolean visible) { this.pageName = pageName; this.targetPageClass = targetPageClass; this.currentPage = currentPage; this.visible = visible; } } }