Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringController.java =================================================================== diff -u -rf9f3f3fababd3ccbc84765f36d73be67c7655b46 -rfd7c55b02c1430bad3c5e057f7a2a25db97db1f3 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringController.java (.../MonitoringController.java) (revision f9f3f3fababd3ccbc84765f36d73be67c7655b46) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringController.java (.../MonitoringController.java) (revision fd7c55b02c1430bad3c5e057f7a2a25db97db1f3) @@ -55,6 +55,7 @@ import org.lamsfoundation.lams.flux.FluxRegistry; import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ActivityOrderComparator; import org.lamsfoundation.lams.learningdesign.BranchingActivity; import org.lamsfoundation.lams.learningdesign.ChosenBranchingActivity; import org.lamsfoundation.lams.learningdesign.ComplexActivity; @@ -66,6 +67,7 @@ import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.Transition; +import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; import org.lamsfoundation.lams.learningdesign.exception.LearningDesignException; import org.lamsfoundation.lams.learningdesign.service.ILearningDesignService; import org.lamsfoundation.lams.lesson.LearnerProgress; @@ -140,6 +142,8 @@ @Autowired private ISecurityService securityService; @Autowired + private IActivityDAO activityDAO; + @Autowired private IMonitoringFullService monitoringService; @Autowired private IUserManagementService userManagementService; @@ -1008,9 +1012,14 @@ && userManagementService.isUserInRole(user.getUserID(), organisation.getOrganisationId(), Role.AUTHOR); request.setAttribute("enableLiveEdit", enableLiveEdit); request.setAttribute("lesson", lessonDTO); - request.setAttribute("isTBLSequence", learningDesignService.isTBLSequence(lessonDTO.getLearningDesignID())); - + boolean isTBLSequence = learningDesignService.isTBLSequence(lessonDTO.getLearningDesignID()); + request.setAttribute("isTBLSequence", isTBLSequence); boolean useNewUI = WebUtil.readBooleanParam(request, "newUI", true); + if (isTBLSequence && useNewUI) { + List lessonActivities = getLessonActivities(lessonService.getLesson(lessonId)); + TblMonitoringController.setupAvailableActivityTypes(request, lessonActivities); + } + return "monitor" + (useNewUI ? "5" : ""); } @@ -1679,4 +1688,66 @@ } return updatedLatestLearners; } -} + + private List getLessonActivities(Lesson lesson) { + /* + * Hibernate CGLIB is failing to load the first activity in the sequence as a ToolActivity for some mysterious + * reason Causes a ClassCastException when you try to cast it, even if it is a ToolActivity. + * + * THIS IS A HACK to retrieve the first tool activity manually so it can be cast as a ToolActivity - if it is + * one + */ + Activity firstActivity = activityDAO + .getActivityByActivityId(lesson.getLearningDesign().getFirstActivity().getActivityId()); + List activities = new ArrayList<>(); + sortActivitiesByLearningDesignOrder(firstActivity, activities); + + return activities; + } + + @SuppressWarnings("unchecked") + private void sortActivitiesByLearningDesignOrder(Activity activity, List sortedActivities) { + sortedActivities.add(activity); + + //in case of branching activity - add all activities based on their orderId + if (activity.isBranchingActivity()) { + BranchingActivity branchingActivity = (BranchingActivity) activity; + Set sequenceActivities = new TreeSet<>(new ActivityOrderComparator()); + sequenceActivities.addAll((Set) (Set) branchingActivity.getActivities()); + for (Activity sequenceActivityNotInitialized : sequenceActivities) { + SequenceActivity sequenceActivity = (SequenceActivity) monitoringService + .getActivityById(sequenceActivityNotInitialized.getActivityId()); + Set childActivities = new TreeSet<>(new ActivityOrderComparator()); + childActivities.addAll(sequenceActivity.getActivities()); + + //add one by one in order to initialize all activities + for (Activity childActivity : childActivities) { + Activity activityInit = monitoringService.getActivityById(childActivity.getActivityId()); + sortedActivities.add(activityInit); + } + } + + // In case of complex activity (parallel, help or optional activity) add all its children activities. + // They will be sorted by orderId + } else if (activity.isComplexActivity()) { + ComplexActivity complexActivity = (ComplexActivity) activity; + Set childActivities = new TreeSet<>(new ActivityOrderComparator()); + childActivities.addAll(complexActivity.getActivities()); + + // add one by one in order to initialize all activities + for (Activity childActivity : childActivities) { + Activity activityInit = monitoringService.getActivityById(childActivity.getActivityId()); + sortedActivities.add(activityInit); + } + } + + Transition transitionFrom = activity.getTransitionFrom(); + if (transitionFrom != null) { + // query activity from DB as transition holds only proxied activity object + Long nextActivityId = transitionFrom.getToActivity().getActivityId(); + Activity nextActivity = monitoringService.getActivityById(nextActivityId); + + sortActivitiesByLearningDesignOrder(nextActivity, sortedActivities); + } + } +} \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java =================================================================== diff -u -re9e7042e16de3421b8c0cd6b1cf6c59dede544b4 -rfd7c55b02c1430bad3c5e057f7a2a25db97db1f3 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java (.../TblMonitoringController.java) (revision e9e7042e16de3421b8c0cd6b1cf6c59dede544b4) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java (.../TblMonitoringController.java) (revision fd7c55b02c1430bad3c5e057f7a2a25db97db1f3) @@ -92,7 +92,7 @@ request.setAttribute("totalLearnersNumber", lesson.getAllLearners().size()); List lessonActivities = getLessonActivities(lesson); - setupAvailableActivityTypes(request, lessonActivities); + TblMonitoringController.setupAvailableActivityTypes(request, lessonActivities); return "tblmonitor/tblmonitor"; } @@ -105,7 +105,7 @@ Lesson lesson = lessonService.getLesson(lessonId); List lessonActivities = getLessonActivities(lesson); - setupAvailableActivityTypes(request, lessonActivities); + TblMonitoringController.setupAvailableActivityTypes(request, lessonActivities); boolean isTraAvailable = (request.getAttribute("isScratchieAvailable") != null) && ((Boolean) request.getAttribute("isScratchieAvailable")); boolean isIraAssesmentAvailable = request.getAttribute("isIraAssessmentAvailable") != null @@ -484,7 +484,7 @@ return null; } - private void setupAvailableActivityTypes(HttpServletRequest request, List activities) { + public static void setupAvailableActivityTypes(HttpServletRequest request, List activities) { //check if there is Scratchie activity. It's used only in case of LKC TBL monitoring, when all assessment are treated as AEs boolean isScratchieAvailable = false; for (Activity activity : activities) { Index: lams_monitoring/web/css/components-monitoring.css =================================================================== diff -u -rf932b797330099220514e4c2acef885899567207 -rfd7c55b02c1430bad3c5e057f7a2a25db97db1f3 --- lams_monitoring/web/css/components-monitoring.css (.../components-monitoring.css) (revision f932b797330099220514e4c2acef885899567207) +++ lams_monitoring/web/css/components-monitoring.css (.../components-monitoring.css) (revision fd7c55b02c1430bad3c5e057f7a2a25db97db1f3) @@ -16,6 +16,7 @@ .toast { border-color: var(--bs-yellow); border-width: 3px; + font-size: 1rem; } #confirmationDialog { @@ -25,6 +26,7 @@ .monitoring-page-wrapper { position: relative; font-family: mont-regular, sans-serif; + border-radius: 0; } .monitoring-page-wrapper ul, .monitoring-page-wrapper ol { @@ -62,6 +64,8 @@ .component-sidebar { align-items: center; padding-top: 2rem; + padding-bottom: 0; + border-radius: 0 0 1.2rem 1.2rem; } .component-sidebar .lams-logo { @@ -86,16 +90,23 @@ .component-sidebar .component-menu-btn { width: 3.6rem; height: 100%; - padding-left: 3px; } -.component-sidebar #edit-lesson-btn { - margin-bottom: 1.5rem; +.component-sidebar .component-menu-btn .navigate-btn-container { + margin-bottom: 10px; } +.component-sidebar .component-menu-btn a { + margin-bottom: 0; +} + +.component-sidebar .component-menu-btn label { + display: block; + font-size: 15px; +} + .component-sidebar .lesson-properties { visibility: hidden; - height: 100%; padding-left: 2rem; text-align: left; } @@ -117,15 +128,9 @@ .component-sidebar .lesson-properties #lessonDetails .btn, .component-sidebar .lesson-properties #lessonDetails select, .component-sidebar .lesson-properties #lessonDetails input[type="text"] { - width: 75%; + width: 90%; } -.component-sidebar .lesson-properties #lessonDetails #lessonStateLabel { - font-size: 1rem; - font-weight: normal; - cursor: pointer; -} - .component-sidebar .lesson-properties #gradebookOnCompleteButton { margin-top: 1rem; } Index: lams_monitoring/web/includes/javascript/monitorLesson5.js =================================================================== diff -u -r1af0f74bf1b8d1e7dc2ee250022019478e6bb748 -rfd7c55b02c1430bad3c5e057f7a2a25db97db1f3 --- lams_monitoring/web/includes/javascript/monitorLesson5.js (.../monitorLesson5.js) (revision 1af0f74bf1b8d1e7dc2ee250022019478e6bb748) +++ lams_monitoring/web/includes/javascript/monitorLesson5.js (.../monitorLesson5.js) (revision fd7c55b02c1430bad3c5e057f7a2a25db97db1f3) @@ -155,7 +155,27 @@ loadTab('gradebook', this); }); + $('#load-other-nvg-btn').click(function(){ + let switchButton = $(this), + tblButtons = $('#tbl-navigate-btn-group'), + regularButtons = $('#navigate-btn-group'), + tblButtonsShown = tblButtons.hasClass('shown'); + tblButtons.toggleClass('shown'); + + if (tblButtonsShown) { + tblButtons.slideUp(function(){ + regularButtons.slideDown(); + }); + } else { + regularButtons.slideUp(function(){ + tblButtons.slideDown(); + }); + } + + $('i', switchButton).toggleClass('fa-angles-up fa-angles-down') + }); + initLessonTab(); } @@ -525,7 +545,7 @@ labelColour = 'danger'; break; } - $('#lessonStateLabel').attr('class', 'badge btn-' + labelColour).html(label + ' '); + $('#lessonStateLabel').attr('class', 'btn btn-sm btn-' + labelColour).html(label + ' '); // update available options in change state dropdown menu var selectField = $('#lessonStateField');