/**
* <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.edit;
import java.util.List;
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.stack.TooledStackedPanel;
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.wizard.Step;
import org.olat.core.gui.control.generic.wizard.StepRunnerCallback;
import org.olat.core.gui.control.generic.wizard.StepsMainRunController;
import org.olat.core.gui.control.generic.wizard.StepsRunContext;
import org.olat.core.id.Identity;
import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
import org.olat.core.util.mail.MailHelper;
import org.olat.core.util.mail.MailPackage;
import org.olat.core.util.mail.MailTemplate;
import org.olat.course.member.wizard.ImportMember_1a_LoginListStep;
import org.olat.course.member.wizard.ImportMember_1b_ChooseMemberStep;
import org.olat.group.BusinessGroup;
import org.olat.group.BusinessGroupManagedFlag;
import org.olat.group.BusinessGroupService;
import org.olat.group.GroupLoggingAction;
import org.olat.group.model.BusinessGroupMembershipChange;
import org.olat.group.ui.main.MemberPermissionChangeEvent;
import org.olat.group.ui.main.SearchMembersParams;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class BusinessGroupMembersController extends BasicController {
private final VelocityContainer mainVC;
private final DisplayMemberSwitchForm dmsForm;
private final MembershipConfigurationForm configForm;
private MemberListController membersController;
private final Link importMemberLink, addMemberLink;
private StepsMainRunController importMembersWizard;
private BusinessGroup businessGroup;
@Autowired
private BusinessGroupService businessGroupService;
public BusinessGroupMembersController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel,
BusinessGroup businessGroup) {
super(ureq, wControl);
this.businessGroup = businessGroup;
mainVC = createVelocityContainer("tab_bgGrpMngmnt");
putInitialPanel(mainVC);
boolean hasWaitingList = businessGroup.getWaitingListEnabled().booleanValue();
// Member Display Form, allows to enable/disable that others partips see
// partips and/or owners
// configure the form with checkboxes for owners and/or partips according
// the booleans
dmsForm = new DisplayMemberSwitchForm(ureq, getWindowControl(), true, true, hasWaitingList);
dmsForm.setEnabled(!BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.display));
listenTo(dmsForm);
// set if the checkboxes are checked or not.
dmsForm.setDisplayMembers(businessGroup);
mainVC.put("displayMembers", dmsForm.getInitialComponent());
boolean managed = BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.membersmanagement);
configForm = new MembershipConfigurationForm(ureq, getWindowControl(), managed);
listenTo(configForm);
configForm.setMembershipConfiguration(businessGroup);
mainVC.put("configMembers", configForm.getInitialComponent());
SearchMembersParams searchParams = new SearchMembersParams(false, false, false, true, true, true, true);
membersController = new MemberListController(ureq, getWindowControl(), toolbarPanel, businessGroup, searchParams);
listenTo(membersController);
membersController.reloadModel();
mainVC.put("members", membersController.getInitialComponent());
addMemberLink = LinkFactory.createButton("add.member", mainVC, this);
addMemberLink.setIconLeftCSS("o_icon o_icon-fw o_icon_add_member");
addMemberLink.setElementCssClass("o_sel_group_add_member");
addMemberLink.setVisible(!managed);
mainVC.put("addMembers", addMemberLink);
importMemberLink = LinkFactory.createButton("import.member", mainVC, this);
importMemberLink.setIconLeftCSS("o_icon o_icon-fw o_icon_import");
importMemberLink.setElementCssClass("o_sel_group_import_members");
importMemberLink.setVisible(!managed);
mainVC.put("importMembers", importMemberLink);
}
public BusinessGroup getGroup() {
return businessGroup;
}
@Override
protected void doDispose() {
//
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if (source == addMemberLink) {
doChooseMembers(ureq);
} else if (source == importMemberLink) {
doImportMembers(ureq);
}
}
protected void updateBusinessGroup(BusinessGroup bGroup) {
this.businessGroup = bGroup;
boolean hasWaitingList = businessGroup.getWaitingListEnabled().booleanValue();
Boolean waitingFlag = (Boolean)mainVC.getContext().get("hasWaitingGrp");
if(waitingFlag == null || waitingFlag.booleanValue() != hasWaitingList) {
mainVC.contextPut("hasWaitingGrp", new Boolean(hasWaitingList));
dmsForm.setWaitingListVisible(hasWaitingList);
}
membersController.reloadModel();
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if (source == dmsForm) {
if(event == Event.CHANGED_EVENT) {
boolean ownersIntern = dmsForm.isDisplayOwnersIntern();
boolean participantsIntern = dmsForm.isDisplayParticipantsIntern();
boolean waitingIntern = dmsForm.isDisplayWaitingListIntern();
boolean ownersPublic = dmsForm.isDisplayOwnersPublic();
boolean participantsPublic = dmsForm.isDisplayParticipantsPublic();
boolean waitingPublic = dmsForm.isDisplayWaitingListPublic();
boolean download = dmsForm.isDownloadList();
//changes are committed by the service
businessGroup = businessGroupService.updateDisplayMembers(businessGroup,
ownersIntern, participantsIntern, waitingIntern,
ownersPublic, participantsPublic, waitingPublic,
download);
fireEvent(ureq, event);
// notify current active users of this business group
BusinessGroupModifiedEvent.fireModifiedGroupEvents(BusinessGroupModifiedEvent.CONFIGURATION_MODIFIED_EVENT, businessGroup, null);
// do loggin
ThreadLocalUserActivityLogger.log(GroupLoggingAction.GROUP_CONFIGURATION_CHANGED, getClass());
}
} else if (source == configForm) {
if(event == Event.CHANGED_EVENT) {
boolean allow = configForm.isAllowToLeaveBusinessGroup();
businessGroup = businessGroupService.updateAllowToLeaveBusinessGroup(businessGroup, allow);
fireEvent(ureq, event);
// notify current active users of this business group
BusinessGroupModifiedEvent.fireModifiedGroupEvents(BusinessGroupModifiedEvent.CONFIGURATION_MODIFIED_EVENT, businessGroup, null);
// do loggin
ThreadLocalUserActivityLogger.log(GroupLoggingAction.GROUP_CONFIGURATION_CHANGED, getClass());
}
} else if(source == importMembersWizard) {
if(event == Event.CANCELLED_EVENT || event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) {
getWindowControl().pop();
removeAsListenerAndDispose(importMembersWizard);
importMembersWizard = null;
if(event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) {
membersController.reloadModel();
}
}
}
super.event(ureq, source, event);
}
private void doChooseMembers(UserRequest ureq) {
removeAsListenerAndDispose(importMembersWizard);
Step start = new ImportMember_1b_ChooseMemberStep(ureq, null, businessGroup, false);
StepRunnerCallback finish = new StepRunnerCallback() {
@Override
public Step execute(UserRequest uureq, WindowControl wControl, StepsRunContext runContext) {
addMembers(runContext);
return StepsMainRunController.DONE_MODIFIED;
}
};
importMembersWizard = new StepsMainRunController(ureq, getWindowControl(), start, finish, null,
translate("add.member"), "o_sel_group_import_1_wizard");
listenTo(importMembersWizard);
getWindowControl().pushAsModalDialog(importMembersWizard.getInitialComponent());
}
private void doImportMembers(UserRequest ureq) {
removeAsListenerAndDispose(importMembersWizard);
Step start = new ImportMember_1a_LoginListStep(ureq, null, businessGroup, false);
StepRunnerCallback finish = new StepRunnerCallback() {
@Override
public Step execute(UserRequest uureq, WindowControl wControl, StepsRunContext runContext) {
addMembers(runContext);
if(runContext.containsKey("notFounds")) {
showWarning("user.notfound", runContext.get("notFounds").toString());
}
return StepsMainRunController.DONE_MODIFIED;
}
};
importMembersWizard = new StepsMainRunController(ureq, getWindowControl(), start, finish, null,
translate("import.member"), "o_sel_group_import_logins_wizard");
listenTo(importMembersWizard);
getWindowControl().pushAsModalDialog(importMembersWizard.getInitialComponent());
}
private void addMembers(StepsRunContext runContext) {
@SuppressWarnings("unchecked")
List<Identity> members = (List<Identity>)runContext.get("members");
MemberPermissionChangeEvent changes = (MemberPermissionChangeEvent)runContext.get("permissions");
//commit all changes to the group memberships
List<BusinessGroupMembershipChange> allModifications = changes.generateBusinessGroupMembershipChange(members);
MailTemplate template = (MailTemplate)runContext.get("mailTemplate");
MailPackage mailing = new MailPackage(template, getWindowControl().getBusinessControl().getAsString(), template != null);
businessGroupService.updateMemberships(getIdentity(), allModifications, mailing);
MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), getLocale());
}
}