From 8910a3131544c2cd48aac0dc981b179d37055adc Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Fri, 28 Sep 2012 09:32:04 +0200 Subject: [PATCH] OO-291: implement back button in members management --- .../components/stack/StackedController.java | 6 ++ .../stack/StackedControllerImpl.java | 8 ++- .../generic/layout/GenericMainController.java | 21 +++++++ .../member/AbstractMemberListController.java | 10 +++- .../MembersManagementMainController.java | 58 +++++++++++++------ .../member/MembersOverviewController.java | 45 +++++++++++--- .../olat/course/run/RunMainController.java | 26 +++++++-- 7 files changed, 139 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/olat/core/gui/components/stack/StackedController.java b/src/main/java/org/olat/core/gui/components/stack/StackedController.java index a1b2fb0d6d2..f348389f339 100644 --- a/src/main/java/org/olat/core/gui/components/stack/StackedController.java +++ b/src/main/java/org/olat/core/gui/components/stack/StackedController.java @@ -19,6 +19,7 @@ */ package org.olat.core.gui.components.stack; +import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; /** @@ -27,6 +28,11 @@ import org.olat.core.gui.control.Controller; */ public interface StackedController extends Controller { + /** + * Dissmiss all controllers but the root + */ + public void popUpToRootController(UserRequest ureq); + public void pushController(String displayName, Controller controller); } \ No newline at end of file diff --git a/src/main/java/org/olat/core/gui/components/stack/StackedControllerImpl.java b/src/main/java/org/olat/core/gui/components/stack/StackedControllerImpl.java index 02465320023..fc32bffa744 100644 --- a/src/main/java/org/olat/core/gui/components/stack/StackedControllerImpl.java +++ b/src/main/java/org/olat/core/gui/components/stack/StackedControllerImpl.java @@ -64,7 +64,8 @@ public class StackedControllerImpl extends DefaultController implements StackedC } } - public void popControllers(UserRequest ureq) { + @Override + public void popUpToRootController(UserRequest ureq) { if(stack.size() > 1) { Controller popedCtrl = null; for(int i=stack.size(); i-->1; ) { @@ -72,6 +73,11 @@ public class StackedControllerImpl extends DefaultController implements StackedC popedCtrl = (Controller)link.getUserObject(); popedCtrl.dispose(); } + + //set the root controller + Link rootLink = stack.get(0); + Controller rootController = (Controller)rootLink.getUserObject(); + setContent(rootController); fireEvent(ureq, new PopEvent(popedCtrl)); } } diff --git a/src/main/java/org/olat/core/gui/control/generic/layout/GenericMainController.java b/src/main/java/org/olat/core/gui/control/generic/layout/GenericMainController.java index 90a1481004c..9a4b1b1278f 100644 --- a/src/main/java/org/olat/core/gui/control/generic/layout/GenericMainController.java +++ b/src/main/java/org/olat/core/gui/control/generic/layout/GenericMainController.java @@ -286,6 +286,27 @@ public abstract class GenericMainController extends MainLayoutBasicController im return gtm; } + @Override + public void popUpToRootController(UserRequest ureq) { + if(stack.size() > 1) { + Controller popedCtrl = null; + for(int i=stack.size(); i-->1; ) { + Link link = stack.remove(i); + popedCtrl = (Controller)link.getUserObject(); + popedCtrl.dispose(); + } + + //set the root controller + Link rootLink = stack.get(0); + Controller rootController = (Controller)rootLink.getUserObject(); + if(rootController == this) { + content.setContent(contentCtr.getInitialComponent()); + } else { + content.setContent(rootController.getInitialComponent()); + } + } + } + @Override public void pushController(String displayName, Controller controller) { Link link = LinkFactory.createLink("gcrumb_" + stack.size(), stackVC, this); diff --git a/src/main/java/org/olat/course/member/AbstractMemberListController.java b/src/main/java/org/olat/course/member/AbstractMemberListController.java index 6a0c65ed144..02ee30a8016 100644 --- a/src/main/java/org/olat/course/member/AbstractMemberListController.java +++ b/src/main/java/org/olat/course/member/AbstractMemberListController.java @@ -50,9 +50,12 @@ 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.control.generic.dtabs.Activateable2; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.id.Identity; +import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.StateEntry; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.mail.ContactList; @@ -80,7 +83,7 @@ import org.olat.user.propertyhandlers.UserPropertyHandler; * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ -public abstract class AbstractMemberListController extends BasicController { +public abstract class AbstractMemberListController extends BasicController implements Activateable2 { protected static final String USER_PROPS_ID = MemberListController.class.getCanonicalName(); @@ -161,6 +164,11 @@ public abstract class AbstractMemberListController extends BasicController { memberListCtr.addColumnDescriptor(new StaticColumnDescriptor(TABLE_ACTION_REMOVE, "table.header.remove", translate("table.header.remove"))); } + @Override + public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { + // + } + @Override protected void event(UserRequest ureq, Component source, Event event) { // diff --git a/src/main/java/org/olat/course/member/MembersManagementMainController.java b/src/main/java/org/olat/course/member/MembersManagementMainController.java index a3ef70a4cd8..105e6b87651 100644 --- a/src/main/java/org/olat/course/member/MembersManagementMainController.java +++ b/src/main/java/org/olat/course/member/MembersManagementMainController.java @@ -30,13 +30,18 @@ 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; @@ -52,10 +57,10 @@ import org.olat.util.logging.activity.LoggingResourceable; */ public class MembersManagementMainController extends MainLayoutBasicController implements Activateable2 { - private static final String CMD_MEMBERS = "cmd.members"; - private static final String CMD_GROUPS = "cmd.groups"; - private static final String CMD_BOOKING = "cmd.booking"; - private static final String CMD_RIGHTS = "cmd.rights"; + 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; @@ -131,52 +136,67 @@ public class MembersManagementMainController extends MainLayoutBasicController if (source == menuTree) { if (event.getCommand().equals(MenuTree.COMMAND_TREENODE_CLICKED)) { TreeNode selTreeNode = menuTree.getSelectedNode(); - Object cmd = selTreeNode.getUserObject(); + String cmd = (String)selTreeNode.getUserObject(); selectMenuItem(ureq, cmd); } } } - private void selectMenuItem(UserRequest ureq, Object cmd) { + @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(membersOverviewCtrl == null) { - membersOverviewCtrl = new MembersOverviewController(ureq, getWindowControl(), repoEntry); + membersOverviewCtrl = new MembersOverviewController(ureq, bwControl, repoEntry); listenTo(membersOverviewCtrl); } mainVC.put("content", membersOverviewCtrl.getInitialComponent()); + selectedCtrl = membersOverviewCtrl; } else if(CMD_GROUPS.equals(cmd)) { if(groupsCtrl == null) { - groupsCtrl = new CourseBusinessGroupListController(ureq, getWindowControl(), repoEntry); + groupsCtrl = new CourseBusinessGroupListController(ureq, bwControl, repoEntry); listenTo(groupsCtrl); } groupsCtrl.reloadModel(); mainVC.put("content", groupsCtrl.getInitialComponent()); + selectedCtrl = groupsCtrl; } else if(CMD_BOOKING.equals(cmd)) { if(ordersController == null) { - ordersController = new OrdersAdminController(ureq, getWindowControl(), repoEntry.getOlatResource()); + ordersController = new OrdersAdminController(ureq, bwControl, repoEntry.getOlatResource()); listenTo(ordersController); } mainVC.put("content", ordersController.getInitialComponent()); + selectedCtrl = ordersController; } else if(CMD_RIGHTS.equals(cmd)) { if(rightsController == null) { - rightsController = new GroupsAndRightsController(ureq, getWindowControl(), repoEntry.getOlatResource()); + rightsController = new GroupsAndRightsController(ureq, bwControl, repoEntry.getOlatResource()); 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; } - - - - @Override - public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { - - } - - } diff --git a/src/main/java/org/olat/course/member/MembersOverviewController.java b/src/main/java/org/olat/course/member/MembersOverviewController.java index c2c1ad17778..7f358c9834b 100644 --- a/src/main/java/org/olat/course/member/MembersOverviewController.java +++ b/src/main/java/org/olat/course/member/MembersOverviewController.java @@ -69,6 +69,13 @@ import org.olat.util.logging.activity.LoggingResourceable; */ public class MembersOverviewController extends BasicController implements Activateable2 { + private static final String SEG_ALL_MEMBERS = "All"; + private static final String SEG_OWNERS_MEMBERS = "Owners"; + private static final String SEG_TUTORS_MEMBERS = "Coaches"; + private static final String SEG_PARTICIPANTS_MEMBERS = "Participants"; + private static final String SEG_WAITING_MEMBERS = "Waiting"; + private static final String SEG_SEARCH_MEMBERS = "Search"; + private final Link allMembersLink, ownersLink, tutorsLink, participantsLink, waitingListLink, searchLink; private final SegmentViewComponent segmentView; private final VelocityContainer mainVC; @@ -117,7 +124,6 @@ public class MembersOverviewController extends BasicController implements Activa importMemberLink = LinkFactory.createButton("import.member", mainVC, this); mainVC.put("importMembers", importMemberLink); - putInitialPanel(mainVC); } @@ -128,7 +134,30 @@ public class MembersOverviewController extends BasicController implements Activa @Override public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { - // + if(entries == null || entries.isEmpty()) return; + + ContextEntry currentEntry = entries.get(0); + String segment = currentEntry.getOLATResourceable().getResourceableTypeName(); + List<ContextEntry> subEntries = entries.subList(1, entries.size()); + if(SEG_ALL_MEMBERS.equals(segment)) { + updateAllMembers(ureq).activate(ureq, subEntries, currentEntry.getTransientState()); + segmentView.select(allMembersLink); + } else if(SEG_OWNERS_MEMBERS.equals(segment)) { + updateOwners(ureq).activate(ureq, subEntries, currentEntry.getTransientState()); + segmentView.select(ownersLink); + } else if(SEG_TUTORS_MEMBERS.equals(segment)) { + updateTutors(ureq).activate(ureq, subEntries, currentEntry.getTransientState()); + segmentView.select(tutorsLink); + } else if(SEG_PARTICIPANTS_MEMBERS.equals(segment)) { + updateParticipants(ureq).activate(ureq, subEntries, currentEntry.getTransientState()); + segmentView.select(participantsLink); + } else if(SEG_WAITING_MEMBERS.equals(segment)) { + updateWaitingList(ureq).activate(ureq, subEntries, currentEntry.getTransientState()); + segmentView.select(waitingListLink); + } else if(SEG_SEARCH_MEMBERS.equals(segment)) { + updateSearch(ureq).activate(ureq, subEntries, currentEntry.getTransientState()); + segmentView.select(searchLink); + } } @Override @@ -245,7 +274,7 @@ public class MembersOverviewController extends BasicController implements Activa private AbstractMemberListController updateAllMembers(UserRequest ureq) { if(allMemberListCtrl == null) { - OLATResourceable ores = OresHelper.createOLATResourceableInstance("AllMembers", 0l); + OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_ALL_MEMBERS, 0l); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); SearchMembersParams searchParams = new SearchMembersParams(true, true, true, true, true, false); @@ -261,7 +290,7 @@ public class MembersOverviewController extends BasicController implements Activa private AbstractMemberListController updateOwners(UserRequest ureq) { if(ownersCtrl == null) { - OLATResourceable ores = OresHelper.createOLATResourceableInstance("Owners", 0l); + OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_OWNERS_MEMBERS, 0l); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); SearchMembersParams searchParams = new SearchMembersParams(true, false, false, false, false, false); @@ -278,7 +307,7 @@ public class MembersOverviewController extends BasicController implements Activa private AbstractMemberListController updateTutors(UserRequest ureq) { if(tutorsCtrl == null) { - OLATResourceable ores = OresHelper.createOLATResourceableInstance("Tutors", 0l); + OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_TUTORS_MEMBERS, 0l); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); SearchMembersParams searchParams = new SearchMembersParams(false, true, false, true, false, false); @@ -295,7 +324,7 @@ public class MembersOverviewController extends BasicController implements Activa private AbstractMemberListController updateParticipants(UserRequest ureq) { if(participantsCtrl == null) { - OLATResourceable ores = OresHelper.createOLATResourceableInstance("Tutors", 0l); + OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_PARTICIPANTS_MEMBERS, 0l); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); SearchMembersParams searchParams = new SearchMembersParams(false, false, true, false, true, false); @@ -312,7 +341,7 @@ public class MembersOverviewController extends BasicController implements Activa private AbstractMemberListController updateWaitingList(UserRequest ureq) { if(waitingCtrl == null) { - OLATResourceable ores = OresHelper.createOLATResourceableInstance("WaitingList", 0l); + OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_WAITING_MEMBERS, 0l); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); SearchMembersParams searchParams = new SearchMembersParams(false, false, false, false, false, true); @@ -329,7 +358,7 @@ public class MembersOverviewController extends BasicController implements Activa private AbstractMemberListController updateSearch(UserRequest ureq) { if(searchCtrl == null) { - OLATResourceable ores = OresHelper.createOLATResourceableInstance("Search", 0l); + OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_SEARCH_MEMBERS, 0l); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); searchCtrl = new MemberSearchController(ureq, bwControl, repoEntry); diff --git a/src/main/java/org/olat/course/run/RunMainController.java b/src/main/java/org/olat/course/run/RunMainController.java index e6e9ad45586..1f8e6e06388 100644 --- a/src/main/java/org/olat/course/run/RunMainController.java +++ b/src/main/java/org/olat/course/run/RunMainController.java @@ -720,11 +720,7 @@ public class RunMainController extends MainLayoutBasicController implements Gene } else throw new OLATSecurityException("wanted to activate editor, but no according right"); } else if (cmd.equals("unifiedusermngt")) { - if (hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT) || isCourseAdmin) { - currentToolCtr = new MembersManagementMainController(ureq, getWindowControl(), courseRepositoryEntry); - listenTo(currentToolCtr); - all.pushController(translate("command.opensimplegroupmngt"), currentToolCtr); - } else throw new OLATSecurityException("clicked groupmanagement, but no according right"); + launchMembersManagement(ureq); } else if (cmd.equals("statistic")) { if (hasCourseRight(CourseRights.RIGHT_STATISTICS) || isCourseAdmin) { @@ -786,7 +782,6 @@ public class RunMainController extends MainLayoutBasicController implements Gene } else if (cmd.equals("assessment")) { launchAssessmentTool(ureq, null); - } else if (cmd.equals("efficiencystatement")) { // will not be disposed on course run dispose, popus up as new // browserwindow @@ -850,6 +845,22 @@ public class RunMainController extends MainLayoutBasicController implements Gene // } } + + private MembersManagementMainController launchMembersManagement(UserRequest ureq) { + if (hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT) || isCourseAdmin) { + if(!(currentToolCtr instanceof MembersManagementMainController)) { + OLATResourceable ores = OresHelper.createOLATResourceableInstance("MembersMgmt", 0l); + ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); + currentToolCtr = new MembersManagementMainController(ureq, addToHistory(ureq, bwControl), courseRepositoryEntry); + listenTo(currentToolCtr); + + all.popUpToRootController(ureq); + all.pushController(translate("command.opensimplegroupmngt"), currentToolCtr); + } + return (MembersManagementMainController)currentToolCtr; + } else throw new OLATSecurityException("clicked groupmanagement, but no according right"); + } private Activateable2 launchAssessmentTool(UserRequest ureq, List<ContextEntry> entries) { OLATResourceable ores = OresHelper.createOLATResourceableType("assessmentTool"); @@ -1264,6 +1275,9 @@ public class RunMainController extends MainLayoutBasicController implements Gene //the wrong link to the wrong person } } + } else if("MembersMgmt".equals(type)) { + List<ContextEntry> subEntries = entries.subList(1, entries.size()); + launchMembersManagement(ureq).activate(ureq, subEntries, firstEntry.getTransientState()); } } -- GitLab