package de.flower.rmt.ui.page.event.manager.notification; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import de.flower.common.ui.ajax.markup.html.AjaxLink; import de.flower.common.ui.modal.ModalDialogWindow; import de.flower.common.ui.panel.BasePanel; import de.flower.common.util.Collections; 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 org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; 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.spring.injection.annot.SpringBean; import javax.mail.internet.InternetAddress; import java.util.List; /** * @author flowerrrr */ public class RecipientListPanel extends BasePanel<List<InternetAddress>> { @SpringBean private IInvitationManager invitationManager; public RecipientListPanel(final IModel<List<InternetAddress>> model, final IModel<Event> eventModel) { super(model); final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer"); listContainer.setOutputMarkupId(true); add(listContainer); ListView<InternetAddress> list = new ListView<InternetAddress>("list", model) { @Override protected void populateItem(final ListItem<InternetAddress> item) { item.add(new Label("name", item.getModelObject().getPersonal())); item.add(new Label("email", item.getModelObject().getAddress())); item.add(new AjaxLink.NoIndicatingAjaxLink<InternetAddress>("deleteButton", item.getModel()) { @Override public void onClick(final AjaxRequestTarget target) { model.getObject().remove(getModelObject()); onChange(target); target.add(listContainer); } }); } }; listContainer.add(list); add(new AjaxLink<Event>("addButton", eventModel) { @Override public void onClick(final AjaxRequestTarget target) { SelectRecipientPanel content = new SelectRecipientPanel(getModel(), getInvitationListModel(getModel())) { @Override protected void onSubmit(final AjaxRequestTarget target, final List<InternetAddress[]> recipients) { updateList(target, recipients); target.add(listContainer); } }; ModalDialogWindow.showContent(this, content, 5); } }); // shortcut to add all invitees without opening modal dialog add(new AjaxLink<Event>("addAllButton", eventModel) { @Override public void onClick(final AjaxRequestTarget target) { updateList(target, convert(getInvitationListModel(getModel()).getObject())); target.add(listContainer); } }); add(new AjaxLink<Event>("addUninvitedButton", eventModel) { @Override public void onClick(final AjaxRequestTarget target) { updateList(target, convert(getUninvitedListModel(getModel()).getObject())); target.add(listContainer); } }); add(new AjaxLink<Event>("addNoResponseAndUnsureButton", eventModel) { @Override public void onClick(final AjaxRequestTarget target) { updateList(target, convert(getNoResponseOrUnsureListModel(getModel()).getObject())); target.add(listContainer); } }); } /** * @param target * @param recipients array of addresses (user might have two email addresses) */ private void updateList(AjaxRequestTarget target, List<InternetAddress[]> recipients) { boolean changed = false; IModel<List<InternetAddress>> model = getModel(); for (InternetAddress ia : Collections.flattenArray(recipients)) { if (!model.getObject().contains(ia)) { model.getObject().add(ia); changed = true; } } if (changed) { onChange(target); } } private List<InternetAddress[]> convert(List<Invitation> invitations) { return Collections.convert(invitations, new Collections.IElementConverter<Invitation, InternetAddress[]>() { @Override public InternetAddress[] convert(final Invitation element) { return element.getInternetAddresses(); } }); } protected IModel<List<Invitation>> getInvitationListModel(final IModel<Event> model) { return new LoadableDetachableModel<List<Invitation>>() { @Override protected List<Invitation> load() { return invitationManager.findAllForNotificationByEventSortedByName(model.getObject()); } }; } private IModel<List<Invitation>> getUninvitedListModel(final IModel<Event> model) { return new LoadableDetachableModel<List<Invitation>>() { @Override protected List<Invitation> load() { List<Invitation> list = invitationManager.findAllForNotificationByEventSortedByName(model.getObject()); return Lists.newArrayList(Collections2.filter(list, new Predicate<Invitation>() { @Override public boolean apply(final Invitation invitation) { return !invitation.isInvitationSent(); } })); } }; } private IModel<List<Invitation>> getNoResponseOrUnsureListModel(final IModel<Event> model) { return new LoadableDetachableModel<List<Invitation>>() { @Override protected List<Invitation> load() { List<Invitation> list = invitationManager.findAllForNotificationByEventSortedByName(model.getObject()); return Lists.newArrayList(Collections2.filter(list, new Predicate<Invitation>() { @Override public boolean apply(final Invitation invitation) { return invitation.getStatus() == RSVPStatus.NORESPONSE || invitation.getStatus() == RSVPStatus.UNSURE; } })); } }; } /** * Called whenever the selection changes. * * @param target */ protected void onChange(AjaxRequestTarget target) { ; } }