package de.flower.rmt.ui.page.event.player; import de.flower.common.ui.ajax.event.AjaxEventSender; import de.flower.common.ui.ajax.panel.AjaxSlideTogglePanel; import de.flower.common.ui.panel.BasePanel; import de.flower.rmt.model.db.entity.Invitation; import de.flower.rmt.model.db.entity.event.Event; import de.flower.rmt.model.db.type.RSVPStatus; import de.flower.rmt.service.IEventManager; import de.flower.rmt.service.IInvitationManager; import de.flower.rmt.ui.app.Links; import de.flower.rmt.ui.page.event.EventCanceledPanel; import de.flower.rmt.ui.page.event.EventDetailsPanel; import de.flower.rmt.ui.panel.DownloadIcsLink; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.spring.injection.annot.SpringBean; import javax.mail.internet.InternetAddress; import java.util.List; /** * @author flowerrrr */ public class EventSecondaryPanel extends BasePanel { @SpringBean private IInvitationManager invitationManager; public EventSecondaryPanel(final IModel<Event> model, final IModel<Invitation> invitationModel) { // treat subpanels as top level secondary panels to have spacer between them setRenderBodyOnly(true); add(new EventCanceledPanel(model)); add(new SlideableInvitationFormPanel(invitationModel)); add(new EventDetailsPanel(model)); add(Links.mailLink("allMailLink", new LoadableDetachableModel<List<InternetAddress>>() { @Override protected List<InternetAddress> load() { return invitationManager.getAddressesForfAllInvitees(model.getObject()); } } )); add(Links.mailLink("managerMailLink", getManagerEmailAddress(model.getObject()), null)); add(new DownloadIcsLink("icsLink", model, "event.ics")); } private static String getManagerEmailAddress(final Event event) { return event.getCreatedBy().getEmail(); } public static class SlideableInvitationFormPanel extends BasePanel<Invitation> { @SpringBean private IInvitationManager invitationManager; @SpringBean private IEventManager eventManager; public SlideableInvitationFormPanel(final IModel<Invitation> invitationModel) { super(invitationModel); IModel<Boolean> eventClosedModel = new AbstractReadOnlyModel<Boolean>() { @Override public Boolean getObject() { return eventManager.isEventClosed(invitationModel.getObject().getEvent()); } }; InvitationFormPanel invitationFormPanel = new InvitationFormPanel(AjaxSlideTogglePanel.WRAPPED_PANEL_ID, invitationModel, eventClosedModel) { @Override protected void onSubmit(final Invitation invitation, final AjaxRequestTarget target) { // save invitation and update invitationlistpanel invitationManager.save(invitation, invitation.getComment()); AjaxEventSender.entityEvent(this, Invitation.class); } }; add(new AjaxSlideTogglePanel("invitationFormPanel", "player.event.invitationform.heading", invitationFormPanel)); // make form visible if user hasn't responded yet // must be called after adding to AjaxSlideTogglePanel invitationFormPanel.setVisible(invitationModel.getObject() != null && invitationModel.getObject().getStatus() == RSVPStatus.NORESPONSE); } @Override public boolean isVisible() { // completely hide panel if user is not invitee of this event. return getModel().getObject() != null; } @Override public String getPanelMarkup() { return "<div wicket:id='invitationFormPanel'/>"; } } }