/** * <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.course.member; import java.util.List; import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.tree.GenericTreeModel; import org.olat.core.gui.components.tree.GenericTreeNode; import org.olat.core.gui.components.tree.MenuTree; import org.olat.core.gui.components.tree.TreeNode; 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.MainLayoutBasicController; import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.logging.activity.ActionType; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.tree.TreeHelper; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.groupsandrights.GroupsAndRightsController; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.resource.accesscontrol.ACService; import org.olat.resource.accesscontrol.AccessControlModule; import org.olat.resource.accesscontrol.ui.OrdersAdminController; import org.olat.util.logging.activity.LoggingResourceable; import org.springframework.beans.factory.annotation.Autowired; /** * This is the members management view. The controller is made for the course administrator * and doesn't make any security check. Especially, the course authors can access the business groups * without being members of these groups. * * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ public class MembersManagementMainController extends MainLayoutBasicController implements Activateable2 { private static final String CMD_MEMBERS = "Members"; private static final String CMD_GROUPS = "Groups"; private static final String CMD_BOOKING = "Booking"; private static final String CMD_RIGHTS = "Rights"; private final MenuTree menuTree; private final VelocityContainer mainVC; private final TooledStackedPanel toolbarPanel; private final LayoutMain3ColsController columnLayoutCtr; private OrdersAdminController ordersController; private CourseBusinessGroupListController groupsCtrl; private MembersOverviewController membersOverviewCtrl; private GroupsAndRightsController rightsController; private boolean membersDirty; private RepositoryEntry repoEntry; private final UserCourseEnvironment coachCourseEnv; private final boolean entryAdmin, groupManagementRight, memberManagementRight; @Autowired private ACService acService; @Autowired private AccessControlModule acModule; public MembersManagementMainController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, RepositoryEntry re, UserCourseEnvironment coachCourseEnv, boolean entryAdmin, boolean groupManagementRight, boolean memberManagementRight) { super(ureq, wControl); this.repoEntry = re; this.toolbarPanel = toolbarPanel; this.entryAdmin = entryAdmin; this.groupManagementRight = groupManagementRight; this.memberManagementRight = memberManagementRight; this.coachCourseEnv = coachCourseEnv; //logging getUserActivityLogger().setStickyActionType(ActionType.admin); ICourse course = CourseFactory.loadCourse(re); addLoggingResourceable(LoggingResourceable.wrap(course)); //ui stuff menuTree = new MenuTree("menuTree"); menuTree.setTreeModel(buildTreeModel()); menuTree.setRootVisible(false); menuTree.addListener(this); mainVC = createVelocityContainer("main_members"); columnLayoutCtr = new LayoutMain3ColsController(ureq, getWindowControl(), menuTree, mainVC, "members-" + repoEntry.getKey()); listenTo(columnLayoutCtr); putInitialPanel(columnLayoutCtr.getInitialComponent()); if(entryAdmin || memberManagementRight) { selectMenuItem(ureq, CMD_MEMBERS); } else if(groupManagementRight) { selectMenuItem(ureq, CMD_GROUPS); } } private GenericTreeModel buildTreeModel() { GenericTreeModel gtm = new GenericTreeModel(); GenericTreeNode root = new GenericTreeNode(); root.setTitle(translate("menu.members")); root.setAltText(translate("menu.members.alt")); gtm.setRootNode(root); if(entryAdmin || memberManagementRight) { GenericTreeNode node = new GenericTreeNode(translate("menu.members"), CMD_MEMBERS); node.setAltText(translate("menu.members.alt")); node.setCssClass("o_sel_membersmgt_members"); root.addChild(node); } if(entryAdmin || memberManagementRight || groupManagementRight) { GenericTreeNode node = new GenericTreeNode(translate("menu.groups"), CMD_GROUPS); node.setAltText(translate("menu.groups.alt")); node.setCssClass("o_sel_membersmgt_groups"); root.addChild(node); } if(acModule.isEnabled() && (entryAdmin || memberManagementRight)) { //check if the course is managed and/or has offers if(!RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.bookings) || acService.isResourceAccessControled(repoEntry.getOlatResource(), null)) { GenericTreeNode node = new GenericTreeNode(translate("menu.orders"), CMD_BOOKING); node.setAltText(translate("menu.orders.alt")); node.setCssClass("o_sel_membersmgt_orders"); root.addChild(node); } } if(entryAdmin) { GenericTreeNode node = new GenericTreeNode(translate("menu.rights"), CMD_RIGHTS); node.setAltText(translate("menu.rights.alt")); node.setCssClass("o_sel_membersmgt_rights"); root.addChild(node); } return gtm; } @Override protected void doDispose() { // } @Override protected void event(UserRequest ureq, Component source, Event event) { if (source == menuTree) { if (event.getCommand().equals(MenuTree.COMMAND_TREENODE_CLICKED)) { TreeNode selTreeNode = menuTree.getSelectedNode(); String cmd = (String)selTreeNode.getUserObject(); selectMenuItem(ureq, cmd); } } } @Override protected void event(UserRequest ureq, Controller source, Event event) { if(groupsCtrl == source) { if(event == Event.CHANGED_EVENT) { membersDirty = true; } } super.event(ureq, source, event); } @Override public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(entries == null || entries.isEmpty()) return; ContextEntry currentEntry = entries.get(0); String cmd = currentEntry.getOLATResourceable().getResourceableTypeName(); Controller selectedCtrl = selectMenuItem(ureq, cmd); if(selectedCtrl instanceof Activateable2) { List<ContextEntry> subEntries = entries.subList(1, entries.size()); ((Activateable2)selectedCtrl).activate(ureq, subEntries, currentEntry.getTransientState()); } } private Controller selectMenuItem(UserRequest ureq, String cmd) { OLATResourceable ores = OresHelper.createOLATResourceableInstance(cmd, 0l); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); addToHistory(ureq, bwControl); Controller selectedCtrl = null; if(CMD_MEMBERS.equals(cmd)) { if(entryAdmin || memberManagementRight) { if(membersOverviewCtrl == null) { membersOverviewCtrl = new MembersOverviewController(ureq, bwControl, toolbarPanel, repoEntry, coachCourseEnv); listenTo(membersOverviewCtrl); } else if(membersDirty) { membersOverviewCtrl.reloadMembers(); } mainVC.put("content", membersOverviewCtrl.getInitialComponent()); selectedCtrl = membersOverviewCtrl; } } else if(CMD_GROUPS.equals(cmd)) { if(entryAdmin || memberManagementRight || groupManagementRight) { if(groupsCtrl == null) { groupsCtrl = new CourseBusinessGroupListController(ureq, bwControl, repoEntry, entryAdmin || groupManagementRight, coachCourseEnv.isCourseReadOnly()); listenTo(groupsCtrl); } groupsCtrl.reloadModel(); mainVC.put("content", groupsCtrl.getInitialComponent()); selectedCtrl = groupsCtrl; } } else if(CMD_BOOKING.equals(cmd)) { if(acModule.isEnabled() && (entryAdmin || memberManagementRight)) { if(ordersController == null) { ordersController = new OrdersAdminController(ureq, bwControl, toolbarPanel, repoEntry.getOlatResource()); listenTo(ordersController); } mainVC.put("content", ordersController.getInitialComponent()); selectedCtrl = ordersController; } } else if(CMD_RIGHTS.equals(cmd)) { if(entryAdmin) { if(rightsController == null) { rightsController = new GroupsAndRightsController(ureq, bwControl, repoEntry, coachCourseEnv.isCourseReadOnly()); listenTo(rightsController); } mainVC.put("content", rightsController.getInitialComponent()); selectedCtrl = rightsController; } } TreeNode selTreeNode = TreeHelper.findNodeByUserObject(cmd, menuTree.getTreeModel().getRootNode()); if (selTreeNode != null && !selTreeNode.getIdent().equals(menuTree.getSelectedNodeId())) { menuTree.setSelectedNodeId(selTreeNode.getIdent()); } return selectedCtrl; } }