package de.flower.rmt.ui.page.event.manager.lineup; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import de.flower.common.ui.panel.BasePanel; 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.page.event.manager.lineup.dragndrop.DraggableEntityLabel; import org.apache.wicket.Component; 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.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.spring.injection.annot.SpringBean; import java.util.List; /** * Lists all invitees as drag-able labels. * * @author flowerrrr */ public abstract class DraggableInviteeListPanel extends BasePanel { @SpringBean private IInvitationManager invitationManager; public DraggableInviteeListPanel(final IModel<Event> model) { add(createListView("acceptedList", RSVPStatus.ACCEPTED, model)); add(createListView("unsureList", RSVPStatus.UNSURE, model)); add(createListView("declinedList", RSVPStatus.DECLINED, model)); add(createListView("noresponseList", RSVPStatus.NORESPONSE, model)); } private Component createListView(String id, RSVPStatus status, IModel<Event> model) { final IModel<List<Invitation>> listModel = getInvitationList(model, status); ListView<Invitation> list = new ListView<Invitation>(id, listModel) { @Override protected void populateItem(final ListItem<Invitation> item) { item.add(createInvitationFragement(item)); } }; return list; } private Component createInvitationFragement(ListItem<Invitation> item) { final Invitation invitation = item.getModelObject(); Fragment frag = new Fragment("itemPanel", "itemFragment", this); frag.add(new Label("placeholder", invitation.getName())); DraggableEntityLabel draggablePlayer = new DraggableEntityLabel(invitation.getId(), invitation.getName(), false); draggablePlayer.setVisible(isDraggablePlayerVisible(invitation)); frag.add(draggablePlayer); return frag; } private IModel<List<Invitation>> getInvitationList(final IModel<Event> model, final RSVPStatus status) { return new LoadableDetachableModel<List<Invitation>>() { @Override protected List<Invitation> load() { List<Invitation> invitations = invitationManager.findAllByEventAndStatusSortedByName(model.getObject(), status, Invitation_.user); return Lists.newArrayList(Collections2.filter(invitations, new Predicate<Invitation>() { @Override public boolean apply(final Invitation input) { return isDraggablePlayerVisible(input); } })); } }; } protected abstract boolean isDraggablePlayerVisible(Invitation invitation); }