package de.flower.rmt.ui.page.event.manager.lineup.teams; import com.google.common.collect.Lists; import de.flower.common.ui.ajax.dragndrop.DraggableDto; import de.flower.common.ui.ajax.dragndrop.DroppableBehavior; import de.flower.common.ui.ajax.event.AjaxEventListener; import de.flower.common.ui.ajax.event.AjaxEventSender; import de.flower.rmt.model.db.entity.EventTeam; import de.flower.rmt.model.db.entity.EventTeamPlayer; import de.flower.rmt.model.db.entity.Invitation; import de.flower.rmt.model.db.entity.QEventTeamPlayer; import de.flower.rmt.service.IEventTeamManager; import de.flower.rmt.ui.page.event.manager.lineup.dragndrop.DraggableEntityLabel; import de.flower.rmt.ui.page.event.manager.lineup.dragndrop.EntityLabel; import de.flower.rmt.ui.page.event.manager.lineup.teams.TeamsSecondaryPanel.EventTeamInviteeListPanel; import de.flower.rmt.ui.panel.RMTBasePanel; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; 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 java.util.List; /** * Panel serves for manager and player view. * @author flowerrrr */ public class EventTeamPanel extends RMTBasePanel<EventTeam> { @SpringBean private IEventTeamManager eventTeamManager; public EventTeamPanel(final IModel<EventTeam> model) { super(model); final WebMarkupContainer grid = new WebMarkupContainer("grid"); add(grid); final WebMarkupContainer itemContainer = new WebMarkupContainer("itemContainer"); grid.add(itemContainer); itemContainer.add(new AjaxEventListener(model, EventTeam.class)); // render existing player items ListView<EventTeamPlayer> items = new ListView<EventTeamPlayer>("items", getListModel(model)) { @Override protected void populateItem(final ListItem<EventTeamPlayer> item) { Invitation invitation = item.getModelObject().getInvitation(); EntityLabel entityLabel = new DraggableEntityLabel(invitation.getId(), invitation.getName(), EventTeamPanel.this.isManagerView()) { @Override protected void onRemove(final AjaxRequestTarget target, final Long invitationId) { // remove player eventTeamManager.removeInvitation(invitationId); // to avoid updating all EventTeamPanels on the page use the this object as event type. AjaxEventSender.send(this, model); AjaxEventSender.send(this, EventTeamInviteeListPanel.class); } }; item.add(entityLabel); if (EventTeamPanel.this.isManagerView()) { item.add(new DroppableBehavior(true) { @Override protected void onDrop(final AjaxRequestTarget target, final DraggableDto dto) { eventTeamManager.addPlayer(model.getObject().getId(), dto.entityId, item.getModelObject().getId()); AjaxEventSender.send(grid, model); // must update other teams if player was moved from one team to another AjaxEventSender.entityEvent(grid, EventTeam.class); AjaxEventSender.send(grid, EventTeamInviteeListPanel.class); } }); } } }; itemContainer.add(items); // render placerholders as droppable containers for appending items to end of list ListView<Object> placeholders = new ListView<Object>("placeholders", getPlaceholdersModel(items.getModel())) { @Override protected void populateItem(final ListItem<Object> item) { item.add(new DroppableBehavior(true) { @Override protected void onDrop(final AjaxRequestTarget target, final DraggableDto dto) { eventTeamManager.addPlayer(model.getObject().getId(), dto.entityId, null); AjaxEventSender.send(grid, model); // must update other teams if player was moved from one team to another AjaxEventSender.entityEvent(grid, EventTeam.class); AjaxEventSender.send(grid, EventTeamInviteeListPanel.class); } }); } }; placeholders.setVisible(isManagerView()); itemContainer.add(placeholders); } private IModel<? extends List<?>> getPlaceholdersModel(final IModel<? extends List<EventTeamPlayer>> model) { return new AbstractReadOnlyModel<List<?>>() { @Override public List<?> getObject() { // return list so that at least one placeholder and combined size of players and placeholders is minimum 3. int size = Math.max(1, 3 - model.getObject().size()); return newList(size, null); } }; } private static <T> List<T> newList(int size, T defaultElement) { List<T> list = Lists.newArrayList(); for (int i = 0; i < size; i++) { list.add(defaultElement); } return list; } private IModel<List<EventTeamPlayer>> getListModel(final IModel<EventTeam> model) { return new LoadableDetachableModel<List<EventTeamPlayer>>() { @Override protected List<EventTeamPlayer> load() { return eventTeamManager.findEventTeamPlayers(model.getObject(), QEventTeamPlayer.eventTeamPlayer.invitation); } }; } }