/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.group.ui.wizard;
import java.util.Collections;
import java.util.List;
import org.olat.admin.securitygroup.gui.IdentitiesOfGroupTableDataModel;
import org.olat.admin.user.UserSearchController;
import org.olat.basesecurity.GroupRoles;
import org.olat.basesecurity.events.MultiIdentityChosenEvent;
import org.olat.basesecurity.events.SingleIdentityChosenEvent;
import org.olat.core.CoreSpringFactory;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.table.ColumnDescriptor;
import org.olat.core.gui.components.table.CustomCellRenderer;
import org.olat.core.gui.components.table.CustomRenderColumnDescriptor;
import org.olat.core.gui.components.table.Table;
import org.olat.core.gui.components.table.TableController;
import org.olat.core.gui.components.table.TableGuiConfiguration;
import org.olat.core.gui.components.table.TableMultiSelectEvent;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.translator.Translator;
import org.olat.core.id.Identity;
import org.olat.group.BusinessGroup;
import org.olat.group.BusinessGroupService;
import org.olat.group.model.BGMembership;
import org.olat.group.model.MembershipModification;
import org.olat.group.ui.main.BGRoleCellRenderer;
import org.olat.group.ui.main.BusinessGroupMembershipComparator;
import org.olat.user.UserManager;
import org.olat.user.propertyhandlers.UserPropertyHandler;
/**
*
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class BGUserManagementController extends BasicController {
protected static final String usageIdentifyer = IdentitiesOfGroupTableDataModel.class.getCanonicalName();
protected static final String COMMAND_REMOVEUSER = "removesubjectofgroup";
protected static final String COMMAND_VCARD = "show.vcard";
protected static final String COMMAND_SELECTUSER = "select.user";
protected static final BusinessGroupMembershipComparator MEMBERSHIP_COMPARATOR = new BusinessGroupMembershipComparator();
private VelocityContainer mainVC;
private Link addOwner, addParticipant, addToWaitingList;
private Link okLink, cancelLink;
private TableController usersCtrl;
private UserSearchController addCtrl;
private CloseableModalController cmc;
private BGUserManagementGroupTableDataModel userTableModel;
private final List<UserPropertyHandler> userPropertyHandlers;
private final List<BusinessGroup> groups;
private final BusinessGroupService businessGroupService;
public BGUserManagementController(UserRequest ureq, WindowControl wControl, List<BusinessGroup> groups) {
super(ureq, wControl);
this.groups = groups;
businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class);
userPropertyHandlers = UserManager.getInstance().getUserPropertyHandlersFor(usageIdentifyer, true);
mainVC = createVelocityContainer("users");
addOwner = LinkFactory.createButton("users.addowner", mainVC, this);
addParticipant = LinkFactory.createButton("users.addparticipant", mainVC, this);
addToWaitingList = LinkFactory.createButton("users.addwaiting", mainVC, this);
Translator userTrans = UserManager.getInstance().getPropertyHandlerTranslator(getTranslator());;
TableGuiConfiguration tableConfig = new TableGuiConfiguration();
tableConfig.setTableEmptyMessage(translate("resources.nomembers"));
usersCtrl = new TableController(tableConfig, ureq, getWindowControl(), userTrans);
listenTo(usersCtrl);
userTableModel = new BGUserManagementGroupTableDataModel(getLocale(), userPropertyHandlers);
CustomCellRenderer statusRenderer = new BGUserStatusCellRenderer();
usersCtrl.addColumnDescriptor(new CustomRenderColumnDescriptor("table.status", 0, null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, statusRenderer));
CustomCellRenderer roleRenderer = new BGRoleCellRenderer(getLocale());
usersCtrl.addColumnDescriptor(new CustomRenderColumnDescriptor("table.role", 1, null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer));
for (int i = 0; i < userPropertyHandlers.size(); i++) {
UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(i);
boolean visible = UserManager.getInstance().isMandatoryUserProperty(usageIdentifyer , userPropertyHandler);
usersCtrl.addColumnDescriptor(visible, userPropertyHandler.getColumnDescriptor(i+2, null, getLocale()));
}
usersCtrl.addMultiSelectAction("remove", COMMAND_REMOVEUSER);
usersCtrl.setMultiSelect(true);
usersCtrl.setTableDataModel(userTableModel);
mainVC.put("users", usersCtrl.getInitialComponent());
okLink = LinkFactory.createButton("ok", mainVC, this);
cancelLink = LinkFactory.createButton("cancel", mainVC, this);
putInitialPanel(mainVC);
loadModel();
}
private void loadModel() {
List<Identity> owners = businessGroupService.getMembers(groups, GroupRoles.coach.name());
List<Identity> participants = businessGroupService.getMembers(groups, GroupRoles.participant.name());
List<Identity> waitingList = businessGroupService.getMembers(groups, GroupRoles.waiting.name());;
userTableModel.setMembers(owners, participants, waitingList);
usersCtrl.modelChanged();
}
@Override
protected void doDispose() {
//
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(source == cmc) {
cleanupPopup();
} else if (source == addCtrl) {
List<Identity> identitiesToAdd = extractIdentities(event);
BGMembership type = (BGMembership)addCtrl.getUserObject();
switch(type) {
case owner: userTableModel.addOwners(identitiesToAdd); break;
case participant: userTableModel.addParticipants(identitiesToAdd); break;
case waiting: userTableModel.addToWaitingList(identitiesToAdd); break;
}
usersCtrl.modelChanged();
cmc.deactivate();
cleanupPopup();
} else if (source == usersCtrl) {
if (event.getCommand().equals(Table.COMMAND_MULTISELECT)) {
TableMultiSelectEvent tmse = (TableMultiSelectEvent) event;
if (tmse.getAction().equals(COMMAND_REMOVEUSER)) {
List<Identity> toRemove = userTableModel.getObjects(tmse.getSelection());
removeIdentities(toRemove);
}
}
}
super.event(ureq, source, event);
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if(source == addOwner) {
addMembership(ureq, BGMembership.owner);
} else if (source == addParticipant) {
addMembership(ureq, BGMembership.participant);
} else if (source == addToWaitingList) {
addMembership(ureq, BGMembership.waiting);
} else if (source == okLink) {
fireEvent(ureq, Event.DONE_EVENT);
} else if (source == cancelLink) {
fireEvent(ureq, Event.CANCELLED_EVENT);
}
}
private void addMembership(UserRequest ureq, BGMembership type) {
removeAsListenerAndDispose(cmc);
removeAsListenerAndDispose(addCtrl);
addCtrl = new UserSearchController(ureq, getWindowControl(), true, true, false);
addCtrl.setUserObject(type);
listenTo(addCtrl);
String title;
switch(type) {
case owner: title = translate("users.addowner"); break;
case participant: title = translate("users.addparticipant"); break;
case waiting: title = translate("users.addwaiting"); break;
default: title = "";
}
cmc = new CloseableModalController(getWindowControl(), translate("close"), addCtrl.getInitialComponent(), true, title);
listenTo(cmc);
cmc.activate();
}
public List<BusinessGroup> getGroups() {
return groups;
}
public MembershipModification getModifications() {
MembershipModification mod = new MembershipModification();
mod.setAddOwners(userTableModel.getAddOwnerIdentities());
mod.setAddParticipants(userTableModel.getAddParticipantIdentities());
mod.setAddToWaitingList(userTableModel.getAddToWaitingList());
mod.setRemovedIdentities(userTableModel.getRemovedIdentities());
return mod;
}
private void removeIdentities(List<Identity> toRemove) {
userTableModel.remove(toRemove);
usersCtrl.modelChanged();
}
private List<Identity> extractIdentities(Event event) {
if(event instanceof SingleIdentityChosenEvent) {
SingleIdentityChosenEvent chosenEvent = (SingleIdentityChosenEvent)event;
Identity identity = chosenEvent.getChosenIdentity();
return Collections.singletonList(identity);
}
if (event instanceof MultiIdentityChosenEvent) {
MultiIdentityChosenEvent chosenEvent = (MultiIdentityChosenEvent)event;
List<Identity> identities = chosenEvent.getChosenIdentities();
return identities;
}
return Collections.emptyList();
}
private void cleanupPopup() {
removeAsListenerAndDispose(cmc);
removeAsListenerAndDispose(addCtrl);
cmc = null;
addCtrl = null;
}
}