package de.flower.rmt.ui.page.event.manager.invitations; import de.flower.common.ui.ajax.event.AjaxEventListener; import de.flower.common.ui.ajax.markup.html.AjaxLink; import de.flower.common.ui.markup.html.list.EntityListView; import de.flower.common.ui.modal.ModalDialogWindow; import de.flower.common.ui.panel.BasePanel; import de.flower.common.util.Check; import de.flower.rmt.model.db.entity.Invitation; 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.IInvitationManager; import de.flower.rmt.ui.app.Links; import de.flower.rmt.ui.page.event.CommentsPanel; import de.flower.rmt.ui.panel.DropDownMenuPanel; import de.flower.rmt.util.Dates; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.datetime.markup.html.basic.DateLabel; 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.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.spring.injection.annot.SpringBean; import javax.mail.internet.InternetAddress; import java.util.ArrayList; import java.util.List; /** * @author flowerrrr */ public class InvitationListPanel extends BasePanel { @SpringBean private IInvitationManager invitationManager; public InvitationListPanel(IModel<Event> model) { this(null, model); } public InvitationListPanel(String id, IModel<Event> model) { super(id); Check.notNull(model); addList(RSVPStatus.ACCEPTED, model, true); addList(RSVPStatus.UNSURE, model, false); addList(RSVPStatus.DECLINED, model, false); addList(RSVPStatus.NORESPONSE, model, false); add(new AjaxEventListener(Invitation.class)); } private void addList(RSVPStatus status, IModel<Event> model, final boolean printOrder) { final IModel<List<Invitation>> listModel = getInvitationList(model, status); add(createHead(status.name().toLowerCase() + "ListHead", status, listModel)); add(createListView(status.name().toLowerCase() + "List", status, listModel, printOrder)); } private Component createHead(String id, RSVPStatus status, final IModel<List<Invitation>> listModel) { WebMarkupContainer head = new WebMarkupContainer(id); Fragment frag = new Fragment("tHead", "fragmentHead", this); frag.add(new Label("heading", new ResourceModel("invitation." + status.name().toLowerCase()))); frag.add(new Label("num", new AbstractReadOnlyModel<String>() { @Override public String getObject() { return "(" + listModel.getObject().size() + ")"; } })); final IModel<List<InternetAddress>> emailAddressesModel = new AbstractReadOnlyModel<List<InternetAddress>>() { @Override public List<InternetAddress> getObject() { final List<InternetAddress> emailAddresses = new ArrayList<>(); for (Invitation invitation : listModel.getObject()) { if (invitation.hasEmail()) { emailAddresses.add(invitation.getInternetAddress()); } } return emailAddresses; } }; frag.add(Links.mailLink("emailLink", emailAddressesModel)); head.add(frag); return head; } private Component createListView(String id, RSVPStatus status, IModel<List<Invitation>> listModel, final boolean printOrder) { ListView list = new EntityListView<Invitation>(id, listModel) { @Override protected void populateItem(ListItem<Invitation> item) { item.add(createInvitationFragement(item, printOrder)); } }; return list; } private Component createInvitationFragement(ListItem<Invitation> item, boolean printOrder) { final Invitation invitation = item.getModelObject(); Fragment frag = new Fragment("itemPanel", "fragmentRow", this); frag.add(new Label("name", invitation.getName())); final Label label = new Label("position", (item.getIndex() + 1) + ". - "); label.setVisible(printOrder); frag.add(label); frag.add(DateLabel.forDatePattern("date", Model.of(invitation.getDate()), Dates.DATE_TIME_SHORT)); frag.add(new CommentsPanel(item.getModel())); // now the dropdown menu DropDownMenuPanel menuPanel = new DropDownMenuPanel(); menuPanel.addLink(createEditLink("link", item), "button.edit"); if (invitation.hasEmail()) { menuPanel.addLink(Links.mailLink("link", invitation.getEmail(), null), "button.email"); } frag.add(menuPanel); return frag; } private AbstractLink createEditLink(String id, ListItem<Invitation> item) { return new AjaxLink<Invitation>(id, item.getModel()) { @Override public void onClick(final AjaxRequestTarget target) { InvitationEditPanel content = new InvitationEditPanel(getModel()); ModalDialogWindow.showContent(this, content, 5); } }; } private IModel<List<Invitation>> getInvitationList(final IModel<Event> model, final RSVPStatus rsvpStatus) { return new LoadableDetachableModel<List<Invitation>>() { @Override protected List<Invitation> load() { return invitationManager.findAllByEventAndStatus(model.getObject(), rsvpStatus, Invitation_.user, Invitation_.comments); } }; } }