package de.flower.rmt.ui.page.event.manager.invitees; import de.flower.common.ui.ajax.event.AjaxEventListener; import de.flower.common.ui.ajax.event.AjaxEventSender; import de.flower.common.ui.ajax.markup.html.form.AjaxSubmitLink; import de.flower.common.ui.markup.html.list.EntityListView; import de.flower.common.ui.panel.BasePanel; import de.flower.rmt.model.db.entity.Invitation; import de.flower.rmt.model.db.entity.Team; import de.flower.rmt.model.db.entity.User; import de.flower.rmt.model.db.entity.event.Event; import de.flower.rmt.service.IInvitationManager; import de.flower.rmt.service.ITeamManager; import de.flower.rmt.service.IUserManager; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Check; import org.apache.wicket.markup.html.form.CheckGroup; import org.apache.wicket.markup.html.form.Form; 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.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.spring.injection.annot.SpringBean; import java.util.HashSet; import java.util.List; import java.util.Set; /** * @author flowerrrr */ public class AddInviteePanel extends BasePanel<Event> { @SpringBean private IInvitationManager invitationManager; @SpringBean private IUserManager userManager; @SpringBean private ITeamManager teamManager; private Set<Long> selectedUsers = new HashSet<Long>(); public AddInviteePanel(String id, final IModel<Event> model) { super(id); final Form form = new Form("form"); add(form); // list of not-assigned players final CheckGroup group = new CheckGroup<Long>("group", selectedUsers); form.add(group); final WebMarkupContainer listContainer = new WebMarkupContainer("listContainer"); listContainer.setOutputMarkupId(true); group.add(listContainer); ListView playerList = new EntityListView<User>("list", getListModel(model)) { @Override protected void populateItem(ListItem<User> item) { User player = item.getModelObject(); item.add(new Check<Long>("checkbox", Model.of(item.getModelObject().getId()))); item.add(new Label("name", player.getFullname())); } }; listContainer.add(playerList); // displayed above checkgroup but below in code to have reference to listContainer ListView teamList = new ListView<Team>("teamList", getTeamListModel()) { @Override protected void populateItem(final ListItem<Team> item) { final IModel<Boolean> checkboxModel = Model.of(false); item.add(new AjaxCheckBox("team", checkboxModel) { @Override protected void onUpdate(final AjaxRequestTarget target) { updateSelectedPlayers(model.getObject(), item.getModelObject(), checkboxModel.getObject()); target.add(listContainer); } }); item.add(new Label("name", item.getModelObject().getName())); } }; form.add(teamList); // add and cancel buttons form.add(new AjaxSubmitLink("addButton") { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { invitationManager.addUsers(model.getObject(), selectedUsers); AjaxEventSender.entityEvent(this, Invitation.class); close(target); } }); add(new AjaxEventListener(Invitation.class)); } /** * Selects all unassigned players of a club. * * @return */ private IModel<List<User>> getListModel(final IModel<Event> model) { return new LoadableDetachableModel<List<User>>() { @Override protected List<User> load() { return userManager.findAllUninvitedPlayers(model.getObject()); } }; } private IModel<List<Team>> getTeamListModel() { return new LoadableDetachableModel<List<Team>>() { @Override protected List<Team> load() { List<Team> teams = teamManager.findAll(); // add 'all players' fake team as first element to list Team allPlayersTeam = teamManager.newInstance(); allPlayersTeam.setName(new ResourceModel("manager.event.invitee.add.all").getObject()); teams.add(0, allPlayersTeam); return teams; } }; } /** * Select/Deselect users of given team. If team is transient select/deselect all users. * * @param team * @param select */ private void updateSelectedPlayers(Event event, Team team, boolean select) { List<User> users; if (team.isNew()) { users = userManager.findAllUninvitedPlayers(event); } else { users = userManager.findAllUninvitedPlayersByTeam(event, team); } for (User user : users) { if (select) { selectedUsers.add(user.getId()); } else { selectedUsers.remove(user.getId()); } } } private void close(AjaxRequestTarget target) { selectedUsers.clear(); detach(); onClose(target); } }