package de.flower.rmt.ui.page.users; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Lists; import de.flower.common.ui.ajax.event.AjaxEventListener; import de.flower.common.ui.ajax.event.AjaxEventSender; import de.flower.common.ui.ajax.markup.html.AjaxLinkWithConfirmation; import de.flower.common.ui.markup.html.list.EntityListView; import de.flower.common.ui.tooltips.TooltipBehavior; import de.flower.rmt.model.db.entity.Player; import de.flower.rmt.model.db.entity.User; import de.flower.rmt.model.db.entity.User_; import de.flower.rmt.security.ISecurityService; import de.flower.rmt.service.IRoleManager; import de.flower.rmt.service.IUserManager; import de.flower.rmt.ui.app.Links; import de.flower.rmt.ui.model.UserModel; import de.flower.rmt.ui.page.user.manager.PlayerPage; import de.flower.rmt.ui.panel.DropDownMenuPanel; import de.flower.rmt.ui.panel.RMTBasePanel; 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.Link; 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 javax.mail.internet.InternetAddress; import java.util.HashSet; import java.util.List; /** * @author flowerrrr */ public class UserListPanel extends RMTBasePanel { @SpringBean private IUserManager userManager; @SpringBean private IRoleManager roleManager; @SpringBean private ISecurityService securityService; public UserListPanel() { WebMarkupContainer playerListContainer = new WebMarkupContainer("listContainer"); add(playerListContainer); playerListContainer.add(new EntityListView<User>("playerList", getUserListModel()) { @Override protected void populateItem(final ListItem<User> item) { User user = item.getModelObject(); Link editLink = createEditLink("editLink", item); editLink.add(new Label("fullname", user.getFullname())); editLink.setEnabled(isManagerView()); item.add(editLink); item.add(createMailLinkList(item.getModel())); // list of teams the user belongs to item.add(createTeamList(item.getModel())); item.add(DateLabel.forDatePattern("lastLogin", Model.of(user.getLastLoginAsDate()), Dates.DATE_TIME_MEDIUM_SHORT)); Component manager; item.add(manager = new WebMarkupContainer("manager")); manager.setVisible(user.isManager()); Link sendInvitiationLink = new Link("sendInvitationLink") { @Override public void onClick() { setResponsePage(new PlayerPage(new UserModel(item.getModel()))); } }; // RMT-426 sendInvitiationLink.setVisible(isManagerView() && !user.isInvitationSent() && user.hasInitialPassword()); item.add(sendInvitiationLink); sendInvitiationLink.add(new TooltipBehavior(new ResourceModel("manager.players.tooltip.invitiation.not.send"))); // now the dropdown menu DropDownMenuPanel menuPanel = new DropDownMenuPanel(); menuPanel.setVisible(isManagerView()); menuPanel.addLink(createEditLink("link", item), "button.edit"); AjaxLinkWithConfirmation deleteButton; menuPanel.addLink(deleteButton = new AjaxLinkWithConfirmation("link", new ResourceModel("manager.players.delete.confirm")) { @Override public void onClick(AjaxRequestTarget target) { userManager.delete(item.getModelObject().getId()); AjaxEventSender.entityEvent(this, User.class); } }, "button.delete"); deleteButton.setVisible(!securityService.isCurrentUser(user)); item.add(menuPanel); } }); playerListContainer.add(new AjaxEventListener(User.class)); } private ListView createMailLinkList(final IModel<User> userModel) { return new ListView<InternetAddress>("emails", ImmutableList.copyOf(userModel.getObject().getInternetAddresses())) { @Override protected void populateItem(final ListItem<InternetAddress> item) { String email = item.getModelObject().getAddress(); item.add(Links.mailLink("emailLink", email, email)); } }; } /** * @param userModel players and teams are already loaded. * @return */ private ListView createTeamList(final IModel<User> userModel) { List<String> teamList = Lists.newArrayList(); // because of pre-fetching multiple associations the list of players can contain // duplicate entries (e.g. when user has two roles assigned). // filter out duplicate entries by using a set for (Player player : new HashSet<Player>(userModel.getObject().getPlayers())) { teamList.add(player.getTeam().getName()); } // sort teamlist teamList = ImmutableSortedSet.copyOf(teamList).asList(); return new ListView<String>("teams", teamList) { @Override protected void populateItem(final ListItem<String> item) { item.add(new Label("team", item.getModelObject())); } }; } private IModel<List<User>> getUserListModel() { return new LoadableDetachableModel<List<User>>() { @Override protected List<User> load() { return userManager.findAllFetchTeams(User_.roles); } }; } private Link createEditLink(String id, final ListItem<User> item) { return new Link(id) { @Override public void onClick() { setResponsePage(new PlayerPage(new UserModel(item.getModel()))); } }; } }