Index: lams_common/src/java/org/lamsfoundation/lams/learning/service/ILearnerService.java =================================================================== diff -u -r0e9494974eaff0acd6ae466566653dd2a2e7e8ba -r58f8a894e785390508199bfb43acefd77ee63d0a --- lams_common/src/java/org/lamsfoundation/lams/learning/service/ILearnerService.java (.../ILearnerService.java) (revision 0e9494974eaff0acd6ae466566653dd2a2e7e8ba) +++ lams_common/src/java/org/lamsfoundation/lams/learning/service/ILearnerService.java (.../ILearnerService.java) (revision 58f8a894e785390508199bfb43acefd77ee63d0a) @@ -184,9 +184,9 @@ */ GateActivityDTO knockGate(GateActivity gateActivity, User knocker, boolean forceGate, Object key); - boolean isNextGateActivityOpenByToolSessionId(int learnerId, long toolSessionId); + GateActivityDTO isNextGateActivityOpenByToolSessionId(int learnerId, long toolSessionId); - boolean isNextGateActivityOpenByLessonId(int learnerId, long lessonId); + GateActivityDTO isNextGateActivityOpenByLessonId(int learnerId, long lessonId); Set getGroupsForGate(GateActivity gate); Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ConditionGateActivity.java =================================================================== diff -u -r0e9494974eaff0acd6ae466566653dd2a2e7e8ba -r58f8a894e785390508199bfb43acefd77ee63d0a --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ConditionGateActivity.java (.../ConditionGateActivity.java) (revision 0e9494974eaff0acd6ae466566653dd2a2e7e8ba) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ConditionGateActivity.java (.../ConditionGateActivity.java) (revision 58f8a894e785390508199bfb43acefd77ee63d0a) @@ -62,7 +62,7 @@ copyToNewActivity(newConditionGateActivity, uiidOffset); newConditionGateActivity.setGateOpen(false); newConditionGateActivity.setGateActivityLevelId(this.getGateActivityLevelId()); - newConditionGateActivity.setGateStopAtPrecedingActivity(this.isGateStopAtPrecedingActivity()); + newConditionGateActivity.setGateStopAtPrecedingActivity(this.getGateStopAtPrecedingActivity()); if ((this.getBranchActivityEntries() != null) && (this.getBranchActivityEntries().size() > 0)) { Iterator iter = this.getBranchActivityEntries().iterator(); Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/GateActivity.java =================================================================== diff -u -r73b16b1e6ae040974e8ba89abf3497abceb9420f -r58f8a894e785390508199bfb43acefd77ee63d0a --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/GateActivity.java (.../GateActivity.java) (revision 73b16b1e6ae040974e8ba89abf3497abceb9420f) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/GateActivity.java (.../GateActivity.java) (revision 58f8a894e785390508199bfb43acefd77ee63d0a) @@ -191,7 +191,7 @@ this.allowedToPassLearners = allowedToPassLearners; } - public boolean isGateStopAtPrecedingActivity() { + public boolean getGateStopAtPrecedingActivity() { return gateStopAtPrecedingActivity; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/PermissionGateActivity.java =================================================================== diff -u -r0e9494974eaff0acd6ae466566653dd2a2e7e8ba -r58f8a894e785390508199bfb43acefd77ee63d0a --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/PermissionGateActivity.java (.../PermissionGateActivity.java) (revision 0e9494974eaff0acd6ae466566653dd2a2e7e8ba) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/PermissionGateActivity.java (.../PermissionGateActivity.java) (revision 58f8a894e785390508199bfb43acefd77ee63d0a) @@ -84,7 +84,7 @@ copyToNewActivity(newPermissionGateActivity, uiidOffset); newPermissionGateActivity.setGateOpen(false); newPermissionGateActivity.setGateActivityLevelId(this.getGateActivityLevelId()); - newPermissionGateActivity.setGateStopAtPrecedingActivity(this.isGateStopAtPrecedingActivity()); + newPermissionGateActivity.setGateStopAtPrecedingActivity(this.getGateStopAtPrecedingActivity()); return newPermissionGateActivity; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ScheduleGateActivity.java =================================================================== diff -u -r0e9494974eaff0acd6ae466566653dd2a2e7e8ba -r58f8a894e785390508199bfb43acefd77ee63d0a --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ScheduleGateActivity.java (.../ScheduleGateActivity.java) (revision 0e9494974eaff0acd6ae466566653dd2a2e7e8ba) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ScheduleGateActivity.java (.../ScheduleGateActivity.java) (revision 58f8a894e785390508199bfb43acefd77ee63d0a) @@ -99,7 +99,7 @@ newScheduleGateActivity.setGateEndTimeOffset(this.getGateEndTimeOffset()); newScheduleGateActivity.setGateStartTimeOffset(this.getGateStartTimeOffset()); newScheduleGateActivity.setGateActivityCompletionBased(this.getGateActivityCompletionBased()); - newScheduleGateActivity.setGateStopAtPrecedingActivity(this.isGateStopAtPrecedingActivity()); + newScheduleGateActivity.setGateStopAtPrecedingActivity(this.getGateStopAtPrecedingActivity()); return newScheduleGateActivity; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/AuthoringActivityDTO.java =================================================================== diff -u -r73b16b1e6ae040974e8ba89abf3497abceb9420f -r58f8a894e785390508199bfb43acefd77ee63d0a --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/AuthoringActivityDTO.java (.../AuthoringActivityDTO.java) (revision 73b16b1e6ae040974e8ba89abf3497abceb9420f) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/AuthoringActivityDTO.java (.../AuthoringActivityDTO.java) (revision 58f8a894e785390508199bfb43acefd77ee63d0a) @@ -453,7 +453,7 @@ GateActivity gateActivity = (GateActivity) activity; gateActivityLevelID = gateActivity.getGateActivityLevelId(); gateOpen = gateActivity.getGateOpen(); - gateStopAtPrecedingActivity = gateActivity.isGateStopAtPrecedingActivity(); + gateStopAtPrecedingActivity = gateActivity.getGateStopAtPrecedingActivity(); adminURL = gateActivity.getSystemTool().getAdminUrl(); } Index: lams_learning/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r2ffcb06f1f75e94f4687f5afc81a959523ee6fd9 -r58f8a894e785390508199bfb43acefd77ee63d0a --- lams_learning/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 2ffcb06f1f75e94f4687f5afc81a959523ee6fd9) +++ lams_learning/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 58f8a894e785390508199bfb43acefd77ee63d0a) @@ -187,6 +187,9 @@ label.password.gate.message = Enter password label.password.gate.incorrect.password = You provided an incorrect password. Retry again? label.password.gate.title = Password Gate +label.gate.closed.preceding.activity = You may not continue to next activity yet. Wait for the teacher to open the gate. +label.gate.closed.preceding.activity.schedule = You may not continue to next activity yet. Wait until {0} or for the teacher to open the gate. +label.gate.closed.preceding.activity.condition = You may not continue to next activity yet. A condition needs to be met or the teacher needs to open the gate. label.discussion.header = Discussion label.discussion.stay.header = Stay here label.discussion.move.header = Move on Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== diff -u -r0e9494974eaff0acd6ae466566653dd2a2e7e8ba -r58f8a894e785390508199bfb43acefd77ee63d0a --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 0e9494974eaff0acd6ae466566653dd2a2e7e8ba) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 58f8a894e785390508199bfb43acefd77ee63d0a) @@ -890,18 +890,16 @@ } @Override - public boolean isNextGateActivityOpenByToolSessionId(int learnerId, long toolSessionId) { + public GateActivityDTO isNextGateActivityOpenByToolSessionId(int learnerId, long toolSessionId) { ToolSession toolSession = lamsCoreToolService.getToolSessionById(toolSessionId); return isNextGateActivityOpenByLessonId(learnerId, toolSession.getLesson().getLessonId()); } @Override - public boolean isNextGateActivityOpenByLessonId(int learnerId, long lessonId) { + public GateActivityDTO isNextGateActivityOpenByLessonId(int learnerId, long lessonId) { LearnerProgress learnerProgress = getProgress(learnerId, lessonId); - return isNextGateActivityOpen(learnerId, learnerProgress.getCurrentActivity()); - } + Activity currentActivity = learnerProgress.getCurrentActivity(); - private boolean isNextGateActivityOpen(int learnerId, Activity currentActivity) { Activity nextActivity = null; Transition transition = currentActivity.getTransitionFrom(); if (transition != null) { @@ -915,18 +913,18 @@ } if (nextActivity == null || !nextActivity.isGateActivity()) { - return true; + return null; } GateActivity gateActivity = (GateActivity) activityDAO.getActivityByActivityId(nextActivity.getActivityId(), GateActivity.class); - if (!gateActivity.isGateStopAtPrecedingActivity()) { - return true; + if (!gateActivity.getGateStopAtPrecedingActivity()) { + return null; } User learner = userManagementService.getUserById(learnerId); GateActivityDTO gateDto = knockGate(gateActivity, learner, false, null); - return gateDto.getAllowToPass(); + return gateDto.getAllowToPass() ? null : gateDto; } /** Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/controller/LearnerController.java =================================================================== diff -u -r0e9494974eaff0acd6ae466566653dd2a2e7e8ba -r58f8a894e785390508199bfb43acefd77ee63d0a --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/controller/LearnerController.java (.../LearnerController.java) (revision 0e9494974eaff0acd6ae466566653dd2a2e7e8ba) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/controller/LearnerController.java (.../LearnerController.java) (revision 58f8a894e785390508199bfb43acefd77ee63d0a) @@ -24,11 +24,15 @@ package org.lamsfoundation.lams.learning.web.controller; import java.io.IOException; +import java.util.Calendar; import java.util.Date; +import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; +import java.util.TimeZone; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -42,7 +46,10 @@ import org.lamsfoundation.lams.learning.web.util.ActivityMapping; import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.GateActivity; +import org.lamsfoundation.lams.learningdesign.ScheduleGateActivity; import org.lamsfoundation.lams.learningdesign.dto.ActivityURL; +import org.lamsfoundation.lams.learningdesign.dto.GateActivityDTO; import org.lamsfoundation.lams.lesson.CompletedActivityProgress; import org.lamsfoundation.lams.lesson.CompletedActivityProgressArchive; import org.lamsfoundation.lams.lesson.LearnerProgress; @@ -57,6 +64,7 @@ import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.Configuration; import org.lamsfoundation.lams.util.ConfigurationKeys; +import org.lamsfoundation.lams.util.DateUtil; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.session.SessionManager; @@ -453,16 +461,52 @@ @RequestMapping("/isNextGateActivityOpen") @ResponseBody public String isNextGateActivityOpen(@RequestParam int userId, @RequestParam(required = false) Long toolSessionId, - @RequestParam(required = false) Long lessonId) { - Boolean isOpen = true; + @RequestParam(required = false) Long lessonId, Locale locale) { + GateActivityDTO gateDto = null; + if (toolSessionId != null) { - isOpen = learnerService.isNextGateActivityOpenByToolSessionId(userId, toolSessionId); + gateDto = learnerService.isNextGateActivityOpenByToolSessionId(userId, toolSessionId); } else if (lessonId != null) { - isOpen = learnerService.isNextGateActivityOpenByLessonId(userId, lessonId); + gateDto = learnerService.isNextGateActivityOpenByLessonId(userId, lessonId); } else { throw new IllegalArgumentException("Either tool session ID or lesson ID has to be provided"); } - return isOpen.toString(); + ObjectNode responseJSON = JsonNodeFactory.instance.objectNode(); + if (gateDto == null) { + responseJSON.put("status", "open"); + } else { + responseJSON.put("status", "closed"); + + String message = null; + GateActivity gate = gateDto.getGate(); + if (gate.isScheduleGate()) { + ScheduleGateActivity scheduleGate = (ScheduleGateActivity) gate; + if (!Boolean.TRUE.equals(scheduleGate.getGateActivityCompletionBased())) { + Lesson lesson = gate.getLearningDesign().getLessons().iterator().next(); + User user = userManagementService.getUserById(userId); + TimeZone userTimeZone = TimeZone.getTimeZone(user.getTimeZone()); + + Calendar openTime = new GregorianCalendar(userTimeZone); + Date lessonStartTime = DateUtil.convertToTimeZoneFromDefault(userTimeZone, + lesson.getStartDateTime()); + openTime.setTime(lessonStartTime); + openTime.add(Calendar.MINUTE, scheduleGate.getGateStartTimeOffset().intValue()); + String openDateString = DateUtil.convertToStringForJSON(openTime.getTime(), locale); + message = messageService.getMessage("label.gate.closed.preceding.activity.schedule", + new Object[] { openDateString }); + } + } else if (gate.isConditionGate()) { + message = messageService.getMessage("label.gate.closed.preceding.activity.condition"); + } + + if (message == null) { + message = messageService.getMessage("label.gate.closed.preceding.activity"); + } + + responseJSON.put("message", message); + } + + return responseJSON.toString(); } } \ No newline at end of file Index: lams_tool_assessment/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r0e9494974eaff0acd6ae466566653dd2a2e7e8ba -r58f8a894e785390508199bfb43acefd77ee63d0a --- lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 0e9494974eaff0acd6ae466566653dd2a2e7e8ba) +++ lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 58f8a894e785390508199bfb43acefd77ee63d0a) @@ -440,5 +440,4 @@ label.monitoring.discussion.start = Start discussion label.authoring.advance.discussion = Enable discussion sentiment voting label.authoring.advance.discussion.tooltip = When enabled, in TBL monitoring, teachers are able to start instant polls for each question to assess the students' understanding. -label.learning.draft.autosave.error = It seems that you have lost connection to the server. Check your internet connection and click OK. If this keeps happening, please inform your teacher. -label.learning.gate.closed = You may not continue to next activity yet. Wait for the teacher to open the gate. \ No newline at end of file +label.learning.draft.autosave.error = It seems that you have lost connection to the server. Check your internet connection and click OK. If this keeps happening, please inform your teacher. \ No newline at end of file Index: lams_tool_assessment/web/pages/learning/results.jsp =================================================================== diff -u -r0e9494974eaff0acd6ae466566653dd2a2e7e8ba -r58f8a894e785390508199bfb43acefd77ee63d0a --- lams_tool_assessment/web/pages/learning/results.jsp (.../results.jsp) (revision 0e9494974eaff0acd6ae466566653dd2a2e7e8ba) +++ lams_tool_assessment/web/pages/learning/results.jsp (.../results.jsp) (revision 58f8a894e785390508199bfb43acefd77ee63d0a) @@ -66,10 +66,7 @@ $(document).ready(function() { $('#finishButton').bootstrapTooltip({ - 'trigger' : 'manual', - 'title' : function(){ - return $(this).data('gateClosedTooltip'); - } + 'trigger' : 'manual' }); }); @@ -83,18 +80,32 @@ $.ajax({ 'url' : 'learning/learner/isNextGateActivityOpen.do?userId=${sessionMap.user.userId}&toolSessionId=${toolSessionID}', 'cache' : false, - 'dataType' : 'text', + 'dataType' : 'json', 'success' : function(response) { - if (response == 'true') { + if (response.status == 'open') { document.location.href ='?sessionMapID=${sessionMapID}&mode=${mode}&toolSessionID=${toolSessionID}'; return; } + + if (response.status == 'closed') { + let timeoutFunction = null; + if (response.message) { + let finishButton = $('#finishButton').attr({ + 'title' : response.message, + 'data-original-title' : response.message + }).bootstrapTooltip('show'); + timeoutFunction = function(){ + finishButton.bootstrapTooltip('hide'); + $('.btn').prop('disabled', false); + }; + } else { + timeoutFunction = function(){ + $('.btn').prop('disabled', false); + }; + } - let finishButton = $('#finishButton').bootstrapTooltip('show'); - setTimeout(function(){ - finishButton.bootstrapTooltip('hide'); - $('.btn').prop('disabled', false); - }, 5000); + setTimeout(timeoutFunction, 5000); + } } }); @@ -221,8 +232,7 @@