diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java index a1685f6da0469f8b7cc23f3469991a30e949f249..718d8ff4e2560cdb2d5284319afe64c18b707efb 100644 --- a/src/main/java/org/olat/course/run/CourseRuntimeController.java +++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java @@ -1103,9 +1103,22 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im } else if("Reminders".equalsIgnoreCase(type) || "RemindersLogs".equalsIgnoreCase(type)) { doReminders(ureq); } else if("Lectures".equalsIgnoreCase(type)) { - doLectures(ureq); + Activateable2 lectures = doLectures(ureq); + if(lectures != null) { + List<ContextEntry> subEntries = entries.subList(1, entries.size()); + lectures.activate(ureq, subEntries, entries.get(0).getTransientState()); + } } else if("LectureBlock".equalsIgnoreCase(type)) { - doLectures(ureq).activate(ureq, entries, state); + Activateable2 lectures = doLectures(ureq); + if(lectures != null) { + lectures.activate(ureq, entries, state); + } + } else if("LecturesAdmin".equalsIgnoreCase(type)) { + Activateable2 lecturesAdmin = doLecturesAdmin(ureq); + if(lecturesAdmin != null) { + List<ContextEntry> subEntries = entries.subList(1, entries.size()); + lecturesAdmin.activate(ureq, subEntries, entries.get(0).getTransientState()); + } } else if("MembersMgmt".equalsIgnoreCase(type)) { Activateable2 members = doMembers(ureq); if(members != null) { @@ -1389,21 +1402,25 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im } } - private void doLecturesAdmin(UserRequest ureq) { + private LectureRepositoryAdminController doLecturesAdmin(UserRequest ureq) { if(delayedClose == Delayed.lecturesAdmin || requestForClose(ureq)) { if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_COURSEEDITOR)) { removeCustomCSS(); - OLATResourceable ores = OresHelper.createOLATResourceableType("lecturesAdmin"); + OLATResourceable ores = OresHelper.createOLATResourceableType("LecturesAdmin"); WindowControl swControl = addToHistory(ureq, ores, null); LectureRepositoryAdminController ctrl = new LectureRepositoryAdminController(ureq, swControl, toolbarPanel, getRepositoryEntry()); listenTo(ctrl); lecturesAdminCtrl = pushController(ureq, translate("command.options.lectures.admin"), ctrl); setActiveTool(lecturesAdminLink); currentToolCtr = lecturesAdminCtrl; + return lecturesAdminCtrl; + } else { + return null; } } else { delayedClose = Delayed.lecturesAdmin; + return null; } } diff --git a/src/main/java/org/olat/home/HomeMainController.java b/src/main/java/org/olat/home/HomeMainController.java index 9101bda2468c73135aa2a52658d7542e1dec8734..23117198f0577cf533a628e5041d4a91eb389990 100644 --- a/src/main/java/org/olat/home/HomeMainController.java +++ b/src/main/java/org/olat/home/HomeMainController.java @@ -103,12 +103,13 @@ public class HomeMainController extends MainLayoutBasicController implements Act if (entries.size() >= 1) { entries = entries.subList(1, entries.size()); } + + String actionText = gAE.getActionText(getLocale()); + stackPanel.rootController(actionText, contentCtr); + if (currentCtr instanceof Activateable2) { ((Activateable2) currentCtr).activate(ureq, entries, entry.getTransientState()); } - - String actionText = gAE.getActionText(getLocale()); - stackPanel.rootController(actionText, contentCtr); } } } diff --git a/src/main/java/org/olat/modules/lecture/ui/LectureRepositoryAdminController.java b/src/main/java/org/olat/modules/lecture/ui/LectureRepositoryAdminController.java index 6fd4df64ad1f10c2f8f2ac61b8a92fa567150682..1a2dc66150245f1d7cf713625935f6523b174bf0 100644 --- a/src/main/java/org/olat/modules/lecture/ui/LectureRepositoryAdminController.java +++ b/src/main/java/org/olat/modules/lecture/ui/LectureRepositoryAdminController.java @@ -36,6 +36,11 @@ 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.dtabs.Activateable2; +import org.olat.core.id.OLATResourceable; +import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.StateEntry; +import org.olat.core.util.resource.OresHelper; import org.olat.modules.lecture.LectureBlockAuditLog; import org.olat.modules.lecture.LectureService; import org.olat.modules.lecture.ui.export.LecturesBlocksEntryExport; @@ -49,7 +54,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ -public class LectureRepositoryAdminController extends BasicController implements TooledController { +public class LectureRepositoryAdminController extends BasicController implements TooledController, Activateable2 { private Link archiveLink, logLink; private final VelocityContainer mainVC; @@ -82,7 +87,8 @@ public class LectureRepositoryAdminController extends BasicController implements participantsLink = LinkFactory.createLink("repo.participants", mainVC, this); settingsLink = LinkFactory.createLink("repo.settings", mainVC, this); - settingsCtrl = new LectureRepositorySettingsController(ureq, getWindowControl(), entry); + WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("Settings"), null); + settingsCtrl = new LectureRepositorySettingsController(ureq, swControl, entry); listenTo(settingsCtrl); if(settingsCtrl.isLectureEnabled()) { @@ -90,7 +96,7 @@ public class LectureRepositoryAdminController extends BasicController implements segmentView.addSegment(participantsLink, false); doOpenLectures(ureq); } else { - doOpenSettings(); + doOpenSettings(ureq); } segmentView.addSegment(settingsLink, !settingsCtrl.isLectureEnabled()); @@ -123,6 +129,23 @@ public class LectureRepositoryAdminController extends BasicController implements stackPanel.addTool(logLink, Align.right); } + @Override + public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { + if(entries == null || entries.isEmpty()) return; + + String name = entries.get(0).getOLATResourceable().getResourceableTypeName(); + if("LectureBlocks".equalsIgnoreCase(name)) { + doOpenLectures(ureq); + segmentView.select(lecturesLink); + } else if("Participants".equalsIgnoreCase(name)) { + doOpenParticipants(ureq); + segmentView.select(participantsLink); + } else if("Settings".equalsIgnoreCase(name)) { + doOpenSettings(ureq); + segmentView.select(settingsLink); + } + } + @Override protected void event(UserRequest ureq, Component source, Event event) { if(source == segmentView) { @@ -133,7 +156,7 @@ public class LectureRepositoryAdminController extends BasicController implements if (clickedLink == lecturesLink) { doOpenLectures(ureq); } else if (clickedLink == settingsLink){ - doOpenSettings(); + doOpenSettings(ureq); } else if(clickedLink == participantsLink) { doOpenParticipants(ureq); } @@ -173,20 +196,29 @@ public class LectureRepositoryAdminController extends BasicController implements private void doOpenLectures(UserRequest ureq) { if(lecturesCtrl == null) { - lecturesCtrl = new LectureListRepositoryController(ureq, getWindowControl(), entry); + OLATResourceable ores = OresHelper.createOLATResourceableType("LectureBlocks"); + WindowControl swControl = addToHistory(ureq, ores, null); + lecturesCtrl = new LectureListRepositoryController(ureq, swControl, entry); listenTo(lecturesCtrl); + } else { + addToHistory(ureq, lecturesCtrl); } mainVC.put("segmentCmp", lecturesCtrl.getInitialComponent()); } - private void doOpenSettings() { + private void doOpenSettings(UserRequest ureq) { mainVC.put("segmentCmp", settingsCtrl.getInitialComponent()); + addToHistory(ureq, settingsCtrl); } private void doOpenParticipants(UserRequest ureq) { if(participantsCtrl == null) { - participantsCtrl = new ParticipantListRepositoryController(ureq, getWindowControl(), entry, false, true); + OLATResourceable ores = OresHelper.createOLATResourceableType("Participants"); + WindowControl swControl = addToHistory(ureq, ores, null); + participantsCtrl = new ParticipantListRepositoryController(ureq, swControl, entry, false, true); listenTo(participantsCtrl); + } else { + addToHistory(ureq, participantsCtrl); } mainVC.put("segmentCmp", participantsCtrl.getInitialComponent()); } diff --git a/src/main/java/org/olat/modules/lecture/ui/LecturesToolController.java b/src/main/java/org/olat/modules/lecture/ui/LecturesToolController.java index 192449d87917699a03a2d9fb4e705f283a750219..7c9a59cd1b981556e7410961d94f46e42a7f87db 100644 --- a/src/main/java/org/olat/modules/lecture/ui/LecturesToolController.java +++ b/src/main/java/org/olat/modules/lecture/ui/LecturesToolController.java @@ -19,6 +19,8 @@ */ package org.olat.modules.lecture.ui; +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; @@ -28,10 +30,15 @@ import org.olat.core.gui.components.segmentedview.SegmentViewEvent; import org.olat.core.gui.components.segmentedview.SegmentViewFactory; import org.olat.core.gui.components.stack.BreadcrumbPanel; import org.olat.core.gui.components.stack.BreadcrumbPanelAware; +import org.olat.core.gui.components.stack.PopEvent; import org.olat.core.gui.components.velocity.VelocityContainer; 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.dtabs.Activateable2; +import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.StateEntry; +import org.olat.core.util.resource.OresHelper; /** * @@ -39,8 +46,9 @@ import org.olat.core.gui.control.controller.BasicController; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ -public class LecturesToolController extends BasicController implements BreadcrumbPanelAware { +public class LecturesToolController extends BasicController implements BreadcrumbPanelAware, Activateable2 { + private BreadcrumbPanel stackPanel; private final VelocityContainer mainVC; private SegmentViewComponent segmentView; private Link teacherLink, participantLink; @@ -52,11 +60,13 @@ public class LecturesToolController extends BasicController implements Breadcrum super(ureq, wControl); mainVC = createVelocityContainer("user_tool"); - - teacherOverviewCtrl = new TeacherToolOverviewController(ureq, getWindowControl()); + + WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("coach"), null); + teacherOverviewCtrl = new TeacherToolOverviewController(ureq, swControl); listenTo(teacherOverviewCtrl); boolean withTitle = teacherOverviewCtrl.getRowCount() == 0; - participantOverviewCtrl = new ParticipantLecturesOverviewController(ureq, getWindowControl(), withTitle); + WindowControl twControl = addToHistory(ureq, OresHelper.createOLATResourceableType("attendee"), null); + participantOverviewCtrl = new ParticipantLecturesOverviewController(ureq, twControl, withTitle); listenTo(participantOverviewCtrl); if(teacherOverviewCtrl.getRowCount() > 0 && participantOverviewCtrl.getRowCount() > 0) { @@ -65,11 +75,11 @@ public class LecturesToolController extends BasicController implements Breadcrum segmentView.addSegment(teacherLink, true); participantLink = LinkFactory.createLink("tool.participant", mainVC, this); segmentView.addSegment(participantLink, false); - mainVC.put("segmentCmp", teacherOverviewCtrl.getInitialComponent()); + doOpenTeacherView(ureq); } else if(teacherOverviewCtrl.getRowCount() > 0) { - mainVC.put("teacherView", teacherOverviewCtrl.getInitialComponent()); + doOpenTeacherView(ureq); } else if(participantOverviewCtrl.getRowCount() > 0) { - mainVC.put("participantView", participantOverviewCtrl.getInitialComponent()); + doOpenParticipantView(ureq); } else { } @@ -78,8 +88,10 @@ public class LecturesToolController extends BasicController implements Breadcrum @Override public void setBreadcrumbPanel(BreadcrumbPanel stackPanel) { + this.stackPanel = stackPanel; participantOverviewCtrl.setBreadcrumbPanel(stackPanel); teacherOverviewCtrl.setBreadcrumbPanel(stackPanel); + stackPanel.addListener(this); } @Override @@ -87,6 +99,27 @@ public class LecturesToolController extends BasicController implements Breadcrum // } + @Override + public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { + if(entries == null || entries.isEmpty()) return; + + ContextEntry entry = entries.get(0); + String type = entry.getOLATResourceable().getResourceableTypeName(); + if("coach".equalsIgnoreCase(type)) { + if(segmentView != null) { + segmentView.select(teacherLink); + } + List<ContextEntry> subEntries = entries.subList(1, entries.size()); + doOpenTeacherView(ureq).activate(ureq, subEntries, entry.getTransientState()); + } else if("attendee".equalsIgnoreCase(type)) { + if(segmentView != null) { + segmentView.select(participantLink); + } + List<ContextEntry> subEntries = entries.subList(1, entries.size()); + doOpenParticipantView(ureq).activate(ureq, subEntries, entry.getTransientState()); + } + } + @Override protected void event(UserRequest ureq, Component source, Event event) { if(event instanceof SegmentViewEvent) { @@ -94,18 +127,31 @@ public class LecturesToolController extends BasicController implements Breadcrum String segmentCName = sve.getComponentName(); Component clickedLink = mainVC.getComponent(segmentCName); if (clickedLink == teacherLink) { - doOpenTeacherView(); + doOpenTeacherView(ureq); } else if (clickedLink == participantLink) { - doOpenParticipantView(); + doOpenParticipantView(ureq); + } + } else if(stackPanel == source) { + if(event instanceof PopEvent) { + PopEvent popEvent = (PopEvent)event; + if(popEvent.getController() instanceof TeacherRollCallController) { + addToHistory(ureq, teacherOverviewCtrl); + } else if(popEvent.getController() instanceof ParticipantLectureBlocksController) { + addToHistory(ureq, participantOverviewCtrl); + } } } } - private void doOpenTeacherView() { + private Activateable2 doOpenTeacherView(UserRequest ureq) { mainVC.put("segmentCmp", teacherOverviewCtrl.getInitialComponent()); + addToHistory(ureq, teacherOverviewCtrl); + return teacherOverviewCtrl; } - private void doOpenParticipantView() { + private Activateable2 doOpenParticipantView(UserRequest ureq) { mainVC.put("segmentCmp", participantOverviewCtrl.getInitialComponent()); + addToHistory(ureq, participantOverviewCtrl); + return participantOverviewCtrl; } } \ No newline at end of file diff --git a/src/main/java/org/olat/modules/lecture/ui/ParticipantLecturesOverviewController.java b/src/main/java/org/olat/modules/lecture/ui/ParticipantLecturesOverviewController.java index 46cecf4b0f473f34d521cd254fe0054d3f1b1c9c..73dd71dce8835384b8c77de164500fb7747bbffa 100644 --- a/src/main/java/org/olat/modules/lecture/ui/ParticipantLecturesOverviewController.java +++ b/src/main/java/org/olat/modules/lecture/ui/ParticipantLecturesOverviewController.java @@ -43,8 +43,12 @@ 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.creator.ControllerCreator; +import org.olat.core.gui.control.generic.dtabs.Activateable2; 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.resource.OresHelper; import org.olat.modules.lecture.LectureBlockAuditLog; import org.olat.modules.lecture.LectureModule; import org.olat.modules.lecture.LectureService; @@ -67,7 +71,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ -public class ParticipantLecturesOverviewController extends FormBasicController implements BreadcrumbPanelAware { +public class ParticipantLecturesOverviewController extends FormBasicController implements BreadcrumbPanelAware, Activateable2 { private FormLink logButton; private FlexiTableElement tableEl; @@ -179,6 +183,22 @@ public class ParticipantLecturesOverviewController extends FormBasicController i return tableModel.getRowCount() > 0; } + @Override + public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { + if(entries == null || entries.isEmpty()) return; + + String type = entries.get(0).getOLATResourceable().getResourceableTypeName(); + if("RepositoryEntry".equalsIgnoreCase(type)) { + Long repoEntryKey = entries.get(0).getOLATResourceable().getResourceableId(); + for(LectureBlockStatistics row: tableModel.getObjects()) { + if(row.getRepoKey().equals(repoEntryKey)) { + doSelect(ureq, row); + break; + } + } + } + } + @Override public void event(UserRequest ureq, Component source, Event event) { if(flc.getFormItemComponent() == source && "print".equals(event.getCommand())) { @@ -215,7 +235,8 @@ public class ParticipantLecturesOverviewController extends FormBasicController i removeAsListenerAndDispose(lectureBlocksCtrl); RepositoryEntry entry = repositoryService.loadByKey(statistics.getRepoKey()); - lectureBlocksCtrl = new ParticipantLectureBlocksController(ureq, getWindowControl(), entry, assessedIdentity); + WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableInstance("RepositoryEntry", entry.getKey()), null); + lectureBlocksCtrl = new ParticipantLectureBlocksController(ureq, swControl, entry, assessedIdentity); listenTo(lectureBlocksCtrl); stackPanel.pushController(entry.getDisplayname(), lectureBlocksCtrl); } diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherLecturesTableController.java b/src/main/java/org/olat/modules/lecture/ui/TeacherLecturesTableController.java index 4372899825f1957ec6dd916e9f551e065aba502d..f09a0a57e434904d1240a59b100ff6b3f1a74d13 100644 --- a/src/main/java/org/olat/modules/lecture/ui/TeacherLecturesTableController.java +++ b/src/main/java/org/olat/modules/lecture/ui/TeacherLecturesTableController.java @@ -56,8 +56,10 @@ import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowController; import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.id.Identity; +import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; +import org.olat.core.util.resource.OresHelper; import org.olat.modules.lecture.LectureBlock; import org.olat.modules.lecture.LectureModule; import org.olat.modules.lecture.LectureService; @@ -123,8 +125,8 @@ public class TeacherLecturesTableController extends FormBasicController implemen protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); if(withRepositoryEntry) { - columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.externalRef, "open.course")); - columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.entry, "open.course")); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.externalRef, "details")); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.entry, "details")); } columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.date, new DateFlexiCellRenderer(getLocale()))); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.startTime, new TimeFlexiCellRenderer(getLocale()))); @@ -290,7 +292,9 @@ public class TeacherLecturesTableController extends FormBasicController implemen private void doSelectLectureBlock(UserRequest ureq, LectureBlock block) { LectureBlock reloadedBlock = lectureService.getLectureBlock(block); List<Identity> participants = lectureService.startLectureBlock(getIdentity(), reloadedBlock); - rollCallCtrl = new TeacherRollCallController(ureq, getWindowControl(), reloadedBlock, participants, getRollCallSecurityCallback(reloadedBlock)); + OLATResourceable ores = OresHelper.createOLATResourceableInstance("LectureBlock", block.getKey()); + WindowControl swControl = addToHistory(ureq, ores, null); + rollCallCtrl = new TeacherRollCallController(ureq, swControl, reloadedBlock, participants, getRollCallSecurityCallback(reloadedBlock)); listenTo(rollCallCtrl); toolbarPanel.pushController(reloadedBlock.getTitle(), rollCallCtrl); } diff --git a/src/main/java/org/olat/modules/lecture/ui/_content/participant_blocks.html b/src/main/java/org/olat/modules/lecture/ui/_content/participant_blocks.html index 2b3e77a5b1fcb50e0d0d988ba3a9eecfc578aabe..89854464ae350c45e46c96d9e5d77c5bf554d3e2 100644 --- a/src/main/java/org/olat/modules/lecture/ui/_content/participant_blocks.html +++ b/src/main/java/org/olat/modules/lecture/ui/_content/participant_blocks.html @@ -24,6 +24,6 @@ $r.render("table") <li><i class="o_icon o_lectures_rollcall_ok"> </i> $r.translate("table.legend.attended")</li> <li><i class="o_icon o_lectures_rollcall_warning"> </i> $r.translate("table.legend.authorized")</li> <li><i class="o_icon o_lectures_rollcall_danger"> </i> $r.translate("table.legend.absent")</li> - <li><i class="o_icon o_lectures_rollcall_free" $r.translate("table.legend.free")</li> + <li><i class="o_icon o_lectures_rollcall_free"> </i> $r.translate("table.legend.free")</li> <li>(*) $r.translate("table.legend.free")</li> </ul> \ No newline at end of file diff --git a/src/test/java/org/olat/selenium/page/core/IMPage.java b/src/test/java/org/olat/selenium/page/core/IMPage.java index df0bd09488ce219304747837dfb955655f40eddb..645ae41495721b30428c85f8b582babb4de35f44 100644 --- a/src/test/java/org/olat/selenium/page/core/IMPage.java +++ b/src/test/java/org/olat/selenium/page/core/IMPage.java @@ -88,9 +88,9 @@ public class IMPage { Graphene.waitModel().withTimeout(10, TimeUnit.SECONDS).until(new Function<WebDriver,Boolean>(){ @Override - public Boolean apply(WebDriver browser) { + public Boolean apply(WebDriver bbrowser) { boolean found = false; - List<WebElement> history = browser.findElements(historyBy); + List<WebElement> history = bbrowser.findElements(historyBy); for(WebElement m:history) { if(m.getText().contains(message)) { found = true;