Index: lams_central/conf/scss/_lams_variables.scss =================================================================== diff -u -r71efef7fa4504462320f228cbe093f3688003947 -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_central/conf/scss/_lams_variables.scss (.../_lams_variables.scss) (revision 71efef7fa4504462320f228cbe093f3688003947) +++ lams_central/conf/scss/_lams_variables.scss (.../_lams_variables.scss) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -7,7 +7,7 @@ $gray-lightest: lighten($gray-base, 96%); // #f5f5f5 or whitesmoke // Primary colour shades -$brand-primary-darkest: #072B57; // used for main page offcanvas course list +$brand-primary-darkest: #5d5d5d; // used for main page offcanvas course list $brand-primary-darker: #164276; // used for main page offcanvas course list $brand-primary-mid: lighten($brand-primary, 12%); // #5798d0 $brand-primary-light: lighten($brand-primary, 45%); // #dbe9f5 @@ -63,7 +63,7 @@ $main_offcanvas_background: $brand-primary-darker; $main_offcanvas_color: $gray-lighter; $main_offcanvas_logo_background: $brand-primary-darkest; -$main_offcanvas_search_background: $brand-primary-darkest; +$main_offcanvas_search_background: #adadad; $main_dropdown_border: #D9DEE4; $main_navbar_link: #515356; $main_singlelesson_hover_border: #9be0f9; Index: lams_central/conf/scss/_lams_variables_purple.scss =================================================================== diff -u -re2956cb8a072cc5ac9ceabaa9dac30c5750bf10b -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_central/conf/scss/_lams_variables_purple.scss (.../_lams_variables_purple.scss) (revision e2956cb8a072cc5ac9ceabaa9dac30c5750bf10b) +++ lams_central/conf/scss/_lams_variables_purple.scss (.../_lams_variables_purple.scss) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -67,7 +67,7 @@ $main_offcanvas_background: $brand-primary-darker; $main_offcanvas_color: $gray-lighter; $main_offcanvas_logo_background: $brand-primary-darkest; -$main_offcanvas_search_background: $brand-primary-darkest; +$main_offcanvas_search_background: #adadad; $main_dropdown_border: #D9DEE4; $main_navbar_link: #515356; $main_singlelesson_hover_border: #dabdd8; Index: lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupController.java =================================================================== diff -u -r9c400fc4bde12823825e7983912637b7833a0128 -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupController.java (.../DisplayGroupController.java) (revision 9c400fc4bde12823825e7983912637b7833a0128) +++ lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupController.java (.../DisplayGroupController.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -309,6 +309,7 @@ } } + List learnerProgresses = lessonService.getUserProgressByOrgAndLearner(userId, orgId); for (IndexLessonBean bean : map.values()) { LinkedList lessonLinks = new LinkedList<>(); String url = null; @@ -318,50 +319,18 @@ if (roles.contains(Role.ROLE_LEARNER) && (lessonStateId.equals(Lesson.STARTED_STATE) || lessonStateId.equals(Lesson.FINISHED_STATE))) { url = "javascript:openLearner(" + lessonId + ")"; - + //calculate learner progress. for all other lesson states, progress will be displayed as 0 - LearnerProgress learnerProgress = lessonService.getUserProgressForLesson(userId, lessonId); - if (learnerProgress != null) { - int progressAsLearner = learnerProgress.isComplete() ? 100 - : learnerProgress.getCompletedActivities().size() * 100 - / learnerProgress.getLesson().getLearningDesign().getActivities().size(); - bean.setProgressAsLearner(progressAsLearner); + for (LearnerProgress learnerProgress : learnerProgresses) { + if (lessonId.equals(learnerProgress.getLesson().getLessonId())) { + int progressAsLearner = learnerProgress.isComplete() ? 100 + : learnerProgress.getCompletedActivities().size() * 100 + / learnerProgress.getLesson().getLearningDesign().getActivities().size(); + bean.setProgressAsLearner(progressAsLearner); + } } } - -// public sdtatic final Integer CREATED = 1; -// /** The state for lessons that have been scheduled. */ -// public static final Integer NOT_STARTED_STATE = 2; -// /** The state for started lesson */ -// public static final Integer STARTED_STATE = 3; -// /** -// * The state for lessons that have been suspended by the teacher. The lesson can be seen on the staff interface but -// * not on the learning interface -// */ -// public static final Integer SUSPENDED_STATE = 4; -// /** -// * The state for lessons that have been finished. A finished lesson is shown as inactive on the staff interface, and -// * is shown on the learner interface but the learner is to only see the overall progress and be able to export data -// * - they should not be able to iteract with the tools -// */ -// public static final Integer FINISHED_STATE = 5; -// /** -// * The state for lesssons that are shown as inactive on the staff interface but no longer visible to the learners. -// */ -// public static final Integer ARCHIVED_STATE = 6; -// /** The state for lesssons that are removed and never can be accessed again */ -// public static final Integer REMOVED_STATE = 7; - - - if (roles.contains(Role.ROLE_LEARNER)) { - int progressAsLearner = 0; - if (Lesson.STARTED_STATE.equals(lessonStateId)) { - - } - - } - if ((lessonLinks.size() > 0) || (url != null)) { bean.setUrl(url); bean.setLinks(lessonLinks); @@ -425,9 +394,8 @@ lessonLinks.addFirst(new IndexLinkBean("index.monitor", showMonitor, "fa fa-fw fa-heartbeat", null)); - //check whether there are any required tasks for this lesson - int contributeActivitiesCounter = monitoringService.getCountContributeActivities(lessonId); - if (contributeActivitiesCounter != 0) { + //in case there are required tasks for this lesson, show monitor URL + if (bean.hasContributeActivities()) { bean.setRequiredTasksUrl(showMonitor); } } Index: lams_central/web/css/_main_base.scss =================================================================== diff -u -r9c400fc4bde12823825e7983912637b7833a0128 -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_central/web/css/_main_base.scss (.../_main_base.scss) (revision 9c400fc4bde12823825e7983912637b7833a0128) +++ lams_central/web/css/_main_base.scss (.../_main_base.scss) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -42,6 +42,9 @@ #offcanvas { width: 100%; } + body:not(.offcanvas-hidden) .navbar-nav2 { + display:none; + } } @media (max-width: 870px) { body.offcanvas-hidden .xs-hidden { @@ -76,9 +79,8 @@ border-bottom: 1px solid #efefef; } #favorite-organisations > li > a, .tablesorter a { - color: $main_fav_org_link; font-weight: 400; - padding: 14px 20px 14px 25px; + padding: 14px 10px 14px 15px; } #favorite-organisations > li > a:hover, #favorite-organisations > li > a:focus, @@ -92,6 +94,7 @@ display:block; text-decoration:none; font-size: 13px; + word-break:break-all; } /*#offcanvas .active > a,*/ #offcanvas .active > a:hover, @@ -101,13 +104,15 @@ } #offcanvas .active > a,#offcanvas a.active { color: $main_offcanvas_link_color; + display: flex; + justify-content: space-between; } #offcanvas td.active { border-right: 10px solid #8c8c8c; background: $main_offcanvas_link; } .offcanvas-search { - padding: 15px 19px 15px; + padding: 15px 12px 15px; margin-bottom: 0; } .offcanvas-search .form-control { @@ -134,25 +139,23 @@ .ts-pager { text-align: center; padding: 0 10px 10px; - color: darken($main_fav_org_link, 30%); + color: dimgrey; + border-top: 1px solid #efefef; } .ts-pager .btn{ - color: darken($main_fav_org_link, 10%); - background-color: $brand-primary-darkest; padding: 2px 5px; line-height: 1; } .tablesorter tfoot i { font-size: 11px; } .tablesorter tfoot th { - background-color: $brand-primary-darkest !important; - padding: 10px 0; + background-color: #adadad !important; + padding: 10px 0 !important; } .pagesize { border: 1px solid rgba(221, 226, 232, 0.49); - background: $brand-primary-darker; cursor: pointer; } @@ -232,17 +235,15 @@ font-weight: normal; line-height: 13px; padding: 2px 5px; - position: absolute; - left: 25px; - top: 10px; border-style: solid; border-width: 1px; display: inline-block; min-width: 10px; text-align: center; white-space: nowrap; - vertical-align: middle; + vertical-align: top; border-radius: 10px; + margin-left: -9px; } #notificationsPendingCount.btn-light { background-color: $gray-light-mid; @@ -370,4 +371,4 @@ .modal-dialog { max-width: initial !important; -} \ No newline at end of file +} Index: lams_central/web/includes/javascript/main.js =================================================================== diff -u -r9c400fc4bde12823825e7983912637b7833a0128 -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_central/web/includes/javascript/main.js (.../main.js) (revision 9c400fc4bde12823825e7983912637b7833a0128) +++ lams_central/web/includes/javascript/main.js (.../main.js) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -9,6 +9,7 @@ var $tablesorter = $(".tablesorter").tablesorter({ theme: 'bootstrap', + widthFixed: true, headerTemplate : '{content} {icon}', widgets: ["filter"], widgetOptions : { @@ -148,7 +149,11 @@ } -function loadOrganisation() { +function loadOrganisation() { + //display loading animation + $("#page-wrapper>footer").hide(); + $("#org-container").html('
'); + $("#org-container").load( "displayGroup.do", { @@ -161,6 +166,9 @@ return; } + //display footer back + $("#page-wrapper>footer").show(); + initDataTables(); // if screen is smaller than 768px (i.e. offcanvas occupies 100%) and offcanvas is shown - then hide it on user selecting an organisation Index: lams_central/web/main.jsp =================================================================== diff -u -r9c400fc4bde12823825e7983912637b7833a0128 -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_central/web/main.jsp (.../main.jsp) (revision 9c400fc4bde12823825e7983912637b7833a0128) +++ lams_central/web/main.jsp (.../main.jsp) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -10,7 +10,7 @@ - + @@ -25,8 +25,7 @@ display: inline-block; width: 23rem; height: auto; - margin: 0.5rem; - border: 0.0625rem solid rgba(0, 0, 0, .125); + margin: 0.7rem; border-radius: .3rem; box-shadow: 0.25rem 0.25rem 0.5rem rgba(0, 0, 0, 0.25); } Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20200316.sql =================================================================== diff -u -re2956cb8a072cc5ac9ceabaa9dac30c5750bf10b -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20200316.sql (.../patch20200316.sql) (revision e2956cb8a072cc5ac9ceabaa9dac30c5750bf10b) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20200316.sql (.../patch20200316.sql) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -1,7 +1,7 @@ SET AUTOCOMMIT = 0; set FOREIGN_KEY_CHECKS = 0; --- LDEV- Introduce Favorite Lesson +-- LDEV-4995 Introduce Favorite Lesson CREATE TABLE `lams_favorite_lesson` ( `favorite_lesson_id` bigint(20) NOT NULL AUTO_INCREMENT, @@ -13,6 +13,9 @@ CONSTRAINT `FK_lams_favorite_lesson_1` FOREIGN KEY (`lesson_id`) REFERENCES `lams_lesson` (`lesson_id`), CONSTRAINT `FK_lams_favorite_lesson_2` FOREIGN KEY (`user_id`) REFERENCES `lams_user` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- add hasContributeActivities flag to Lesson +ALTER TABLE lams_lesson ADD COLUMN has_contribute_activities TINYINT(1) DEFAULT '0'; COMMIT; SET AUTOCOMMIT = 1; Index: lams_common/src/java/org/lamsfoundation/lams/index/IndexLessonBean.java =================================================================== diff -u -re2956cb8a072cc5ac9ceabaa9dac30c5750bf10b -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_common/src/java/org/lamsfoundation/lams/index/IndexLessonBean.java (.../IndexLessonBean.java) (revision e2956cb8a072cc5ac9ceabaa9dac30c5750bf10b) +++ lams_common/src/java/org/lamsfoundation/lams/index/IndexLessonBean.java (.../IndexLessonBean.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -24,7 +24,6 @@ import java.util.Date; import java.util.List; -import java.util.Map; /** *

@@ -52,6 +51,7 @@ private int countTotalLearners; private int countAttemptedLearners; private int countCompletedLearners; + private boolean hasContributeActivities = false; private int progressAsLearner; @@ -65,8 +65,9 @@ this.url = url; } - public IndexLessonBean(Long id, String name, String description, Integer state, Date startDate, boolean started, boolean completed, - boolean enableLessonNotifications, boolean dependent, boolean scheduledFinish) { + public IndexLessonBean(Long id, String name, String description, Integer state, Date startDate, boolean started, + boolean completed, boolean enableLessonNotifications, boolean hasContributeActivities, boolean dependent, + boolean scheduledFinish) { this.id = id; this.name = name; this.description = description; @@ -75,6 +76,7 @@ this.started = started; this.completed = completed; this.enableLessonNotifications = enableLessonNotifications; + this.hasContributeActivities = hasContributeActivities; this.dependent = dependent; this.scheduledFinish = scheduledFinish; } @@ -267,4 +269,12 @@ public void setCountCompletedLearners(int countCompletedLearners) { this.countCompletedLearners = countCompletedLearners; } + + public boolean hasContributeActivities() { + return hasContributeActivities; + } + + public void setHasContributeActivities(boolean hasContributeActivities) { + this.hasContributeActivities = hasContributeActivities; + } } Index: lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java =================================================================== diff -u -re2956cb8a072cc5ac9ceabaa9dac30c5750bf10b -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java (.../Lesson.java) (revision e2956cb8a072cc5ac9ceabaa9dac30c5750bf10b) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java (.../Lesson.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -77,7 +77,7 @@ + " JOIN lams_group AS g ON ging.grouping_id = g.grouping_id AND g.group_id != ging.staff_group_id" + " JOIN lams_user_group AS ug ON ug.user_id = :userId AND g.group_id = ug.group_id"), @NamedNativeQuery(name = "learnerLessonsByOrgAndUserWithCompletedFlag", resultSetMapping = "lessonsByOrgAndUserWithCompletedFlag", query = "SELECT l.lesson_id, l.name, l.description, l.lesson_state_id, l.start_date_time," - + " NOT ISNULL(lp.learner_progress_id) AS lesson_started_flag, lp.lesson_completed_flag, l.enable_lesson_notifications," + + " NOT ISNULL(lp.learner_progress_id) AS lesson_started_flag, lp.lesson_completed_flag, l.enable_lesson_notifications, l.has_contribute_activities," + " (SELECT TRUE FROM lams_lesson_dependency ld WHERE ld.lesson_id = l.lesson_id LIMIT 1) AS dependent," + " l.schedule_end_date_time IS NOT NULL OR l.scheduled_number_days_to_lesson_finish IS NOT NULL AS scheduledFinish" + " FROM lams_lesson AS l JOIN lams_learning_design AS ld ON l.organisation_id = :orgId" @@ -90,7 +90,7 @@ + " LEFT JOIN lams_learner_progress AS lp ON lp.user_id = ug.user_id" + " AND lp.lesson_id = l.lesson_id"), @NamedNativeQuery(name = "staffLessonsByOrgAndUserWithCompletedFlag", resultSetMapping = "lessonsByOrgAndUserWithCompletedFlag", query = "SELECT l.lesson_id, l.name, l.description, l.lesson_state_id, l.start_date_time," - + " NOT ISNULL(lp.learner_progress_id) AS lesson_started_flag, lp.lesson_completed_flag, l.enable_lesson_notifications," + + " NOT ISNULL(lp.learner_progress_id) AS lesson_started_flag, lp.lesson_completed_flag, l.enable_lesson_notifications, l.has_contribute_activities," + " (SELECT TRUE FROM lams_lesson_dependency ld WHERE ld.lesson_id = l.lesson_id LIMIT 1) AS dependent," + " l.schedule_end_date_time IS NOT NULL OR l.scheduled_number_days_to_lesson_finish IS NOT NULL AS scheduledFinish" + " FROM lams_lesson AS l JOIN lams_learning_design AS ld ON l.organisation_id = :orgId" @@ -102,7 +102,7 @@ + " LEFT JOIN lams_learner_progress AS lp ON lp.user_id = ug.user_id" + " AND lp.lesson_id = l.lesson_id"), @NamedNativeQuery(name = "allLessonsByOrgAndUserWithCompletedFlag", resultSetMapping = "lessonsByOrgAndUserWithCompletedFlag", query = "SELECT l.lesson_id, l.name, l.description, l.lesson_state_id, l.start_date_time," - + " NOT ISNULL(lp.learner_progress_id) AS lesson_started_flag, lp.lesson_completed_flag, l.enable_lesson_notifications," + + " NOT ISNULL(lp.learner_progress_id) AS lesson_started_flag, lp.lesson_completed_flag, l.enable_lesson_notifications, l.has_contribute_activities," + " (SELECT TRUE FROM lams_lesson_dependency ld WHERE ld.lesson_id = l.lesson_id LIMIT 1) AS dependent," + " l.schedule_end_date_time IS NOT NULL OR l.scheduled_number_days_to_lesson_finish IS NOT NULL AS scheduledFinish" + " FROM lams_lesson AS l JOIN lams_learning_design AS ld ON ld.copy_type_id != 3" @@ -124,6 +124,7 @@ @ColumnResult(name = "lesson_started_flag", type = Boolean.class), @ColumnResult(name = "lesson_completed_flag", type = Boolean.class), @ColumnResult(name = "enable_lesson_notifications", type = Boolean.class), + @ColumnResult(name = "has_contribute_activities", type = Boolean.class), @ColumnResult(name = "dependent", type = Boolean.class), @ColumnResult(name = "scheduledFinish", type = Boolean.class) })) @Entity @@ -262,6 +263,12 @@ */ @Column(name = "gradebook_on_complete") private boolean gradebookOnComplete = false; + + /** + * Whether lesson has any contribute activities requiring teacher action. + */ + @Column(name = "has_contribute_activities") + private boolean hasContributeActivities = false; /** * For lesson conditional release @@ -703,4 +710,12 @@ public void setGradebookOnComplete(boolean gradebookOnComplete) { this.gradebookOnComplete = gradebookOnComplete; } + + public boolean hasContributeActivities() { + return hasContributeActivities; + } + + public void setHasContributeActivities(boolean hasContributeActivities) { + this.hasContributeActivities = hasContributeActivities; + } } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILearnerProgressDAO.java =================================================================== diff -u -re2956cb8a072cc5ac9ceabaa9dac30c5750bf10b -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILearnerProgressDAO.java (.../ILearnerProgressDAO.java) (revision e2956cb8a072cc5ac9ceabaa9dac30c5750bf10b) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILearnerProgressDAO.java (.../ILearnerProgressDAO.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -58,6 +58,17 @@ * @return the user's progress data */ LearnerProgress getLearnerProgressByLearner(Integer learnerId, Long lessonId); + + /** + * Retrieves the learner progress object for user in all lessons in specified organisation. + * + * @param learnerId + * the user who owns the learner progress data. + * @param organisationId + * lessons belong to this organisation + * @return the user's progress datas + */ + List getLearnerProgressByOrgAndLearner(Integer learnerId, Integer organisationId); /** * Saves or Updates learner progress data. Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LearnerProgressDAO.java =================================================================== diff -u -re2956cb8a072cc5ac9ceabaa9dac30c5750bf10b -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LearnerProgressDAO.java (.../LearnerProgressDAO.java) (revision e2956cb8a072cc5ac9ceabaa9dac30c5750bf10b) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LearnerProgressDAO.java (.../LearnerProgressDAO.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -141,10 +141,18 @@ @Override public LearnerProgress getLearnerProgressByLearner(Integer learnerId, Long lessonId) { - return (LearnerProgress) getSession().createQuery(LearnerProgressDAO.LOAD_PROGRESS_BY_LEARNER) - .setInteger("learnerId", learnerId).setLong("lessonId", lessonId).uniqueResult(); + .setParameter("learnerId", learnerId).setParameter("lessonId", lessonId).uniqueResult(); } + + @Override + public List getLearnerProgressByOrgAndLearner(Integer learnerId, Integer organisationId) { + final String LOAD_PROGRESS_BY_ORG_AND_LEARNER = "from LearnerProgress p where p.user.id = :learnerId " + + "and p.lesson.organisation.organisationId = :organisationId"; + + return getSession().createQuery(LOAD_PROGRESS_BY_ORG_AND_LEARNER, LearnerProgress.class) + .setParameter("learnerId", learnerId).setParameter("organisationId", organisationId).list(); + } @Override public void updateLearnerProgress(LearnerProgress learnerProgress) { Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java =================================================================== diff -u -re2956cb8a072cc5ac9ceabaa9dac30c5750bf10b -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java (.../ILessonService.java) (revision e2956cb8a072cc5ac9ceabaa9dac30c5750bf10b) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java (.../ILessonService.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -390,6 +390,16 @@ * @return learner's progress or null */ LearnerProgress getUserProgressForLesson(Integer learnerId, Long lessonId); + + /** + * Gets the learner's progress details for all lessons in organisation. + * + * @param learnerId + * user's id + * @param organisationId + * organisation's id + */ + List getUserProgressByOrgAndLearner(Integer learnerId, Integer organisationId); /** * Gets the progresses for learners in a particular lesson. Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java =================================================================== diff -u -re2956cb8a072cc5ac9ceabaa9dac30c5750bf10b -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision e2956cb8a072cc5ac9ceabaa9dac30c5750bf10b) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -644,12 +644,14 @@ Boolean enableLessonNotifications = (Boolean) tuple[tupleIndex++]; enableLessonNotifications = enableLessonNotifications == null ? false : enableLessonNotifications.booleanValue(); + Boolean hasContributeActivities = (Boolean) tuple[tupleIndex++]; Boolean dependent = (Boolean) tuple[tupleIndex++]; dependent = dependent == null ? false : dependent.booleanValue(); Boolean scheduledFinish = (Boolean) tuple[tupleIndex++]; + IndexLessonBean bean = new IndexLessonBean(lessonId, lessonName, lessonDescription, lessonState, - lessonStartDate, lessonStarted, lessonCompleted, enableLessonNotifications, dependent, - scheduledFinish); + lessonStartDate, lessonStarted, lessonCompleted, enableLessonNotifications, + hasContributeActivities, dependent, scheduledFinish); map.put(new Long(lessonId), bean); } } @@ -672,6 +674,11 @@ public LearnerProgress getUserProgressForLesson(Integer learnerId, Long lessonId) { return learnerProgressDAO.getLearnerProgressByLearner(learnerId, lessonId); } + + @Override + public List getUserProgressByOrgAndLearner(Integer learnerId, Integer organisationId) { + return learnerProgressDAO.getLearnerProgressByOrgAndLearner(learnerId, organisationId); + } @Override public List getUserProgressForLesson(Long lessonId) { Index: lams_common/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -re2956cb8a072cc5ac9ceabaa9dac30c5750bf10b -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_common/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision e2956cb8a072cc5ac9ceabaa9dac30c5750bf10b) +++ lams_common/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -351,6 +351,4 @@ * Get list of users who completed the given lesson. */ List getUsersCompletedLesson(Long lessonId, Integer limit, Integer offset, boolean orderAscending); - - int getCountContributeActivities(Long lessonId); } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml =================================================================== diff -u -r713a4d2055ba7766354709db2ae65dacfb5d2b1a -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml (.../monitoringApplicationContext.xml) (revision 713a4d2055ba7766354709db2ae65dacfb5d2b1a) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml (.../monitoringApplicationContext.xml) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -63,6 +63,7 @@ PROPAGATION_REQUIRED PROPAGATION_REQUIRED + PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly PROPAGATION_REQUIRED PROPAGATION_REQUIRED Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/ContributeDTOFactory.java =================================================================== diff -u -r62aaf160878735888d077bf28fac3c1989bb8fbd -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/ContributeDTOFactory.java (.../ContributeDTOFactory.java) (revision 62aaf160878735888d077bf28fac3c1989bb8fbd) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/ContributeDTOFactory.java (.../ContributeDTOFactory.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -83,7 +83,7 @@ if (!contributionType.isEmpty()) { dto = new ContributeActivityDTO(activity); for (Integer contributionTypeEntry : contributionType) { - String url = ContributeDTOFactory.getURL(lessonID, activity, contributionTypeEntry, toolService); + String url = "";// ContributeDTOFactory.getURL(lessonID, activity, contributionTypeEntry, toolService); if (ContributionTypes.CONTRIBUTION.equals(contributionTypeEntry) && url == null) { continue; } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringFullService.java =================================================================== diff -u -rd471fb4d4ad60b6568b9f3cb4ec9cd82c6fbe495 -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringFullService.java (.../IMonitoringFullService.java) (revision d471fb4d4ad60b6568b9f3cb4ec9cd82c6fbe495) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringFullService.java (.../IMonitoringFullService.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -336,6 +336,14 @@ /** Get the record of the learner's progress for a particular lesson */ LearnerProgress getLearnerProgress(Integer learnerId, Long lessonId); - List getAllContributeActivityDTO(Long lessonID); + /** + * Returns list of contributed activities, and null if none available. Besides, it also updates lesson's + * hasContributeActivities flag. + * + * @param lessonId + * @param skipCompletedBranching + * @return + */ + List calculateContributeActivities(Long lessonId, boolean skipCompletedBranching); } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -re2956cb8a072cc5ac9ceabaa9dac30c5750bf10b -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision e2956cb8a072cc5ac9ceabaa9dac30c5750bf10b) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -57,8 +57,10 @@ import org.lamsfoundation.lams.learningdesign.BranchActivityEntry; import org.lamsfoundation.lams.learningdesign.BranchCondition; import org.lamsfoundation.lams.learningdesign.BranchingActivity; +import org.lamsfoundation.lams.learningdesign.ChosenBranchingActivity; import org.lamsfoundation.lams.learningdesign.ChosenGrouping; import org.lamsfoundation.lams.learningdesign.ComplexActivity; +import org.lamsfoundation.lams.learningdesign.ContributionTypes; import org.lamsfoundation.lams.learningdesign.GateActivity; import org.lamsfoundation.lams.learningdesign.Group; import org.lamsfoundation.lams.learningdesign.Grouping; @@ -395,6 +397,9 @@ learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, gradebookOnComplete, scheduledNumberDaysToLessonFinish, precedingLesson); + + //updates lesson's hasContributeActivities flag + calculateContributeActivities(initializedLesson.getLessonId(), false); logLessonStateChange(LogEvent.TYPE_TEACHER_LESSON_CREATE, initializedLesson, userID, null, initializedLesson.getLessonStateId()); @@ -2023,48 +2028,75 @@ return (GroupingActivity) activity; } - + @Override - public List getAllContributeActivityDTO(Long lessonID) { - List result = null; - Lesson lesson = lessonDAO.getLesson(lessonID); + @SuppressWarnings("unchecked") + public List calculateContributeActivities(Long lessonId, boolean skipCompletedBranching) { + Lesson lesson = lessonDAO.getLesson(lessonId); + + List resultContributeActivities = new ArrayList<>(); if (lesson != null) { ContributeActivitiesProcessor processor = new ContributeActivitiesProcessor(lesson.getLearningDesign(), - lessonID, activityDAO, lamsCoreToolService); + lessonId, activityDAO, lamsCoreToolService); processor.parseLearningDesign(); - result = processor.getMainActivityList(); - } - return result; - } - - @Override - public int getCountContributeActivities(Long lessonId) { - int contributeActivitiesCounter = 0; - List contributeActivities = getAllContributeActivityDTO(lessonId); - if (contributeActivities != null) { - for (ContributeActivityDTO contributeActivity : contributeActivities) { - if (contributeActivity.getContributeEntries() != null - && !contributeActivity.getContributeEntries().isEmpty()) { - contributeActivitiesCounter++; + List contributeActivities = processor.getMainActivityList(); + + if (contributeActivities != null) { + for (ContributeActivityDTO contributeActivity : contributeActivities) { + if (contributeActivity.getContributeEntries() != null) { + Iterator entryIterator = contributeActivity + .getContributeEntries().iterator(); + while (entryIterator.hasNext()) { + ContributeActivityDTO.ContributeEntry contributeEntry = entryIterator.next(); + + // extra filtering for chosen branching: do not show in Sequence tab if all users were assigned + if (skipCompletedBranching && ContributionTypes.CHOSEN_BRANCHING + .equals(contributeEntry.getContributionType())) { + Set learners = new HashSet<>(lesson.getLessonClass().getLearners()); + ChosenBranchingActivity branching = (ChosenBranchingActivity) getActivityById( + contributeActivity.getActivityID()); + for (SequenceActivity branch : (Set) (Set) branching + .getActivities()) { + Group group = branch.getSoleGroupForBranch(); + if (group != null) { + learners.removeAll(group.getUsers()); + } + } + contributeEntry.setIsComplete(learners.isEmpty()); + } + + if (!contributeEntry.getIsRequired() || contributeEntry.getIsComplete()) { + entryIterator.remove(); + } + } + + if (!contributeActivity.getContributeEntries().isEmpty()) { + resultContributeActivities.add(contributeActivity); + } + } } } + + //updates lesson's hasContributeActivities flag + lesson.setHasContributeActivities(!resultContributeActivities.isEmpty()); + lessonDAO.saveLesson(lesson); } - return contributeActivitiesCounter; + + return resultContributeActivities.isEmpty() ? null : resultContributeActivities; } @Override public String getLearnerActivityURL(Long lessonID, Long activityID, Integer learnerUserID, Integer requestingUserId) throws IOException, LamsToolServiceException { securityService.isLessonMonitor(lessonID, requestingUserId, "get learner activity URL", true); - Lesson lesson = lessonDAO.getLesson(lessonID); Activity activity = activityDAO.getActivityByActivityId(activityID); User learner = (User) baseDAO.find(User.class, learnerUserID); String url = null; if ((activity == null) || (learner == null)) { - MonitoringService.log.error("getLearnerActivityURL activity or user missing. Activity ID " + activityID - + " activity " + activity + " userID " + learnerUserID + " user " + learner); + log.error("getLearnerActivityURL activity or user missing. Activity ID " + activityID + " activity " + + activity + " userID " + learnerUserID + " user " + learner); } else if (activity.isToolActivity()) { url = lamsCoreToolService.getToolLearnerProgressURL(lessonID, activity, learner); } else if (activity.isOptionsActivity() || activity.isParallelActivity()) { @@ -2074,7 +2106,7 @@ } else if (activity.isSystemToolActivity()) { url = lamsCoreToolService.getToolLearnerProgressURL(lessonID, activity, learner); } - MonitoringService.log.debug("url: " + url); + log.debug("url: " + url); return url; } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringController.java =================================================================== diff -u -rb5d2a6851ee4797e641081bd5e6a1f28f78c30a6 -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringController.java (.../MonitoringController.java) (revision b5d2a6851ee4797e641081bd5e6a1f28f78c30a6) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringController.java (.../MonitoringController.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -1133,7 +1133,7 @@ indfm.format(tzFinishDate) + " " + user.getTimeZone().getDisplayName(userLocale)); } - List contributeActivities = getContributeActivities(lessonId, false); + List contributeActivities = monitoringService.calculateContributeActivities(lessonId, false); if (contributeActivities != null) { responseJSON.set("contributeActivities", JsonUtil.readArray(contributeActivities)); } @@ -1203,7 +1203,7 @@ } ObjectNode responseJSON = JsonNodeFactory.instance.objectNode(); - List contributeActivities = getContributeActivities(lessonId, true); + List contributeActivities = monitoringService.calculateContributeActivities(lessonId, true); if (contributeActivities != null) { responseJSON.set("contributeActivities", JsonUtil.readArray(contributeActivities)); } @@ -1629,50 +1629,6 @@ return result; } - @SuppressWarnings("unchecked") - private List getContributeActivities(Long lessonId, boolean skipCompletedBranching) { - List contributeActivities = monitoringService.getAllContributeActivityDTO(lessonId); - Lesson lesson = lessonService.getLesson(lessonId); - - if (contributeActivities != null) { - List resultContributeActivities = new ArrayList<>(); - for (ContributeActivityDTO contributeActivity : contributeActivities) { - if (contributeActivity.getContributeEntries() != null) { - Iterator entryIterator = contributeActivity - .getContributeEntries().iterator(); - while (entryIterator.hasNext()) { - ContributeActivityDTO.ContributeEntry contributeEntry = entryIterator.next(); - - // extra filtering for chosen branching: do not show in Sequence tab if all users were assigned - if (skipCompletedBranching - && ContributionTypes.CHOSEN_BRANCHING.equals(contributeEntry.getContributionType())) { - Set learners = new HashSet<>(lesson.getLessonClass().getLearners()); - ChosenBranchingActivity branching = (ChosenBranchingActivity) monitoringService - .getActivityById(contributeActivity.getActivityID()); - for (SequenceActivity branch : (Set) (Set) branching.getActivities()) { - Group group = branch.getSoleGroupForBranch(); - if (group != null) { - learners.removeAll(group.getUsers()); - } - } - contributeEntry.setIsComplete(learners.isEmpty()); - } - - if (!contributeEntry.getIsRequired() || contributeEntry.getIsComplete()) { - entryIterator.remove(); - } - } - - if (!contributeActivity.getContributeEntries().isEmpty()) { - resultContributeActivities.add(contributeActivity); - } - } - } - return resultContributeActivities; - } - return null; - } - private static int getActivityCoordinate(Integer coord) { return (coord == null) || (coord < 0) ? CommonConstants.DEFAULT_COORD : coord; } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java =================================================================== diff -u -rb5d2a6851ee4797e641081bd5e6a1f28f78c30a6 -r81a68a722a832bb9c94d9a73e66d27ad0c3d48bb --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java (.../TblMonitoringController.java) (revision b5d2a6851ee4797e641081bd5e6a1f28f78c30a6) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java (.../TblMonitoringController.java) (revision 81a68a722a832bb9c94d9a73e66d27ad0c3d48bb) @@ -172,7 +172,7 @@ List permissionGates = new ArrayList<>(); - List contributeActivities = monitoringService.getAllContributeActivityDTO(lessonId); + List contributeActivities = monitoringService.calculateContributeActivities(lessonId, true); if (contributeActivities != null) { for (ContributeActivityDTO contributeActivity : contributeActivities) {