Index: lams_monitoring/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r092ede3b8b3828ffa688c4db18c5d535e3364b98 -r621f712588dcf37f4bc18add622143483cdfc267 --- lams_monitoring/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 092ede3b8b3828ffa688c4db18c5d535e3364b98) +++ lams_monitoring/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 621f712588dcf37f4bc18add622143483cdfc267) @@ -417,5 +417,10 @@ tour.gradebook.show.weight =Show Weights tour.gradebook.show.weight.content =Show/hide the activity weights used for marking this lesson. label.no.learners=No learners in group. +label.lesson.finishes=Lesson finishes {0} +label.lesson.starts=Lesson starts {0} +button.schedule.disable.tooltip =Schedule lesson to be disabled at a future time +button.disable.now =Disable now +button.disable.now.tooltip =Disable the lesson immediately #======= End labels: Exported 401 labels for en AU ===== Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/MonitoringConstants.java =================================================================== diff -u -r3399163940c61c9132223c758d274486e57ff9b7 -r621f712588dcf37f4bc18add622143483cdfc267 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/MonitoringConstants.java (.../MonitoringConstants.java) (revision 3399163940c61c9132223c758d274486e57ff9b7) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/MonitoringConstants.java (.../MonitoringConstants.java) (revision 621f712588dcf37f4bc18add622143483cdfc267) @@ -37,6 +37,7 @@ public static final String KEY_STAFF = "staff"; public static final String KEY_LEARNER = "learners"; public static final String PARAM_LESSON_START_DATE = "lessonStartDate"; + public static final String PARAM_LESSON_END_DATE = "lessonEndDate"; public static final String PARAM_SCHEDULED_NUMBER_DAYS_TO_LESSON_FINISH = "scheduledNumberDaysToLessonFinish"; public static final String PARAM_LEARNER_ID = "learnerID"; public static final String PARAM_REMOVE_LEARNER_CONTENT = "removeContent"; Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/quartz/job/FinishScheduleLessonJob.java =================================================================== diff -u -r3399163940c61c9132223c758d274486e57ff9b7 -r621f712588dcf37f4bc18add622143483cdfc267 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/quartz/job/FinishScheduleLessonJob.java (.../FinishScheduleLessonJob.java) (revision 3399163940c61c9132223c758d274486e57ff9b7) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/quartz/job/FinishScheduleLessonJob.java (.../FinishScheduleLessonJob.java) (revision 621f712588dcf37f4bc18add622143483cdfc267) @@ -50,7 +50,7 @@ log.debug("Lesson [" + lessonId + "] is suspending..."); } - monitoringService.suspendLesson(lessonId, userId); + monitoringService.suspendLesson(lessonId, userId, false); if (log.isDebugEnabled()) { log.debug("Lesson [" + lessonId + "] suspended"); Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -r1aff6aeac19473c0089c0f3ff578a183beb92555 -r621f712588dcf37f4bc18add622143483cdfc267 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 1aff6aeac19473c0089c0f3ff578a183beb92555) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 621f712588dcf37f4bc18add622143483cdfc267) @@ -204,7 +204,7 @@ void startLessonOnSchedule(long lessonId, Date startDate, Integer userId) throws UserAccessDeniedException; /** - * Finish a lesson on scheduled datetime. + * Finish a lesson on scheduled datetime based on days in the lesson runs for * * @param lessonId * @param endDate @@ -216,6 +216,18 @@ throws UserAccessDeniedException; /** + * Finish a lesson on scheduled datetime. + * + * @param lessonId + * @param endDate + * number of days since lesson start when the lesson should be closed. + * @param userId + * checks that the user is a staff member for this lesson + */ + void finishLessonOnSchedule(long lessonId, Date endDate, Integer userId) + throws UserAccessDeniedException; + + /** * Finish a lesson.A Finished lesson can be viewed on the monitoring interface. It should be an "inactive" lesson. A * Finished lesson is listed on the learner interface but all the learner can do is view the progress - they cannot * access any of the tool screens. @@ -286,16 +298,20 @@ void unarchiveLesson(long lessonId, Integer userId); /** - * A lesson can only be suspended if it is started. The purpose of suspending is to hide the lesson from learners + * Suspend lesson now! A lesson can only be suspended if it is started. The purpose of suspending is to hide the lesson from learners * temporarily. * * @param lessonId * the lesson ID which will be suspended. * @param userId * checks that the user is a staff member for this lesson + * @param clearScheduleDetails + * should it remove any triggers set up to suspend the lesson and clear the schedule date field. true if user suspending right now, + * false if this is being called by the trigger */ - void suspendLesson(long lessonId, Integer userId) throws UserAccessDeniedException; + void suspendLesson(long lessonId, Integer userId, boolean removeTriggers) throws UserAccessDeniedException; + /** * Unsuspend a lesson, which state must be Lesson.SUSPEND_STATE. Returns the lesson back to its previous state. * Otherwise an exception will be thrown. Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r755c19831e5aeb51fec70ec9e200b47e43ee62e5 -r621f712588dcf37f4bc18add622143483cdfc267 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 755c19831e5aeb51fec70ec9e200b47e43ee62e5) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 621f712588dcf37f4bc18add622143483cdfc267) @@ -525,11 +525,22 @@ User user = (User) baseDAO.find(User.class, userId); TimeZone userTimeZone = TimeZone.getTimeZone(user.getTimeZone()); Date tzStartLessonDate = DateUtil.convertFromTimeZoneToDefault(userTimeZone, startDate); - String triggerKey = "startLessonOnScheduleTrigger:" + lessonId; - + String triggerName = "startLessonOnScheduleTrigger:" + lessonId; + + Trigger startLessonTrigger = null; + boolean alreadyScheduled = false; + + try { + startLessonTrigger = scheduler.getTrigger(TriggerKey.triggerKey(triggerName)); + alreadyScheduled = startLessonTrigger != null; + } catch (SchedulerException e) { + MonitoringService.log.error("Error while fetching Quartz trigger \"" + triggerName + "\"", e); + } + // start the scheduling job try { - if (requestedLesson.getScheduleStartDate() == null) { + + if ( ! alreadyScheduled ) { // setup the message for scheduling job JobDetail startLessonJob = JobBuilder.newJob(StartScheduleLessonJob.class) .withIdentity("startLessonOnSchedule:" + lessonId) @@ -539,17 +550,15 @@ .usingJobData(MonitoringConstants.KEY_USER_ID, new Integer(userId)).build(); // create customized triggers - Trigger startLessonTrigger = TriggerBuilder.newTrigger() - .withIdentity(triggerKey).startAt(tzStartLessonDate).build(); + startLessonTrigger = TriggerBuilder.newTrigger() + .withIdentity(triggerName).startAt(tzStartLessonDate).build(); scheduler.scheduleJob(startLessonJob, startLessonTrigger); } else { - // update existing lesson trigger - Trigger oldTrigger = scheduler.getTrigger(new TriggerKey(triggerKey)); - TriggerBuilder tb = oldTrigger.getTriggerBuilder(); - Trigger newTrigger = tb.startAt(tzStartLessonDate).build(); - scheduler.rescheduleJob(oldTrigger.getKey(), newTrigger); + + startLessonTrigger = startLessonTrigger.getTriggerBuilder().startAt(tzStartLessonDate).build(); + scheduler.rescheduleJob(startLessonTrigger.getKey(), startLessonTrigger); } @@ -566,12 +575,31 @@ } @Override - public void finishLessonOnSchedule(long lessonId, int scheduledNumberDaysToLessonFinish, Integer userId) { + public void finishLessonOnSchedule(long lessonId, Date userEnteredEndDate, Integer userId) { securityService.isLessonMonitor(lessonId, userId, "finish lesson on schedule", true); + Lesson requestedLesson = lessonDAO.getLesson(new Long(lessonId)); + if (requestedLesson == null) { + String error = "Unable to schedule lesson end as lesson is missing. Lesson Id " + lessonId; + MonitoringService.log.error(error); + throw new IllegalArgumentException("Error occurred at [finishLessonOnSchedule]- " + error); + } + // Change client/users schedule date to server's timezone. + User user = (User) baseDAO.find(User.class, userId); + TimeZone userTimeZone = TimeZone.getTimeZone(user.getTimeZone()); + Date tzEndLessonDate = DateUtil.convertFromTimeZoneToDefault(userTimeZone, userEnteredEndDate); + finishLessonOnScheduleAsServerDate(requestedLesson, tzEndLessonDate, userId); + } + + /** + * Set up the job to end the lesson on endDate. EndDate is assumed to be converted to the LAMS's default + * timezone. If endDate == null then remove any existing scheduling. + */ + private void finishLessonOnScheduleAsServerDate(Lesson requestedLesson, Date endDate, Integer userId) { + // we get the lesson want to finish - Lesson requestedLesson = lessonDAO.getLesson(new Long(lessonId)); - String triggerName = "finishLessonOnScheduleTrigger:" + lessonId; + long lessonId = requestedLesson.getLessonId(); + String triggerName = getFinishLesssonTriggerName(lessonId); Trigger finishLessonTrigger = null; JobDetail finishLessonJob = null; boolean alreadyScheduled = false; @@ -582,6 +610,69 @@ MonitoringService.log.error("Error while fetching Quartz trigger \"" + triggerName + "\"", e); } + // start the scheduling job + try { + if (endDate != null) { + if (alreadyScheduled) { + finishLessonTrigger = finishLessonTrigger.getTriggerBuilder().startAt(endDate).build(); + } else { + // setup the message for scheduling job + finishLessonJob = JobBuilder.newJob(FinishScheduleLessonJob.class) + .withIdentity("finishLessonOnSchedule:" + lessonId) + .withDescription(requestedLesson.getLessonName() + ":" + + (requestedLesson.getUser() == null ? "" + : requestedLesson.getUser().getFullName())) + .usingJobData(MonitoringConstants.KEY_LESSON_ID, new Long(lessonId)) + .usingJobData(MonitoringConstants.KEY_USER_ID, new Integer(userId)).build(); + + finishLessonTrigger = TriggerBuilder.newTrigger().withIdentity(triggerName).startAt(endDate) + .build(); + } + + requestedLesson.setScheduleEndDate(endDate); + lessonDAO.updateLesson(requestedLesson); + if (alreadyScheduled) { + scheduler.rescheduleJob(finishLessonTrigger.getKey(), finishLessonTrigger); + if (MonitoringService.log.isDebugEnabled()) { + MonitoringService.log + .debug("Finish lesson [" + lessonId + "] job has been rescheduled to " + endDate); + } + } else { + scheduler.scheduleJob(finishLessonJob, finishLessonTrigger); + if (MonitoringService.log.isDebugEnabled()) { + MonitoringService.log + .debug("Finish lesson [" + lessonId + "] job has been scheduled to " + endDate); + } + } + } else { + if (alreadyScheduled) { + scheduler.deleteJob(finishLessonTrigger.getJobKey()); + if (MonitoringService.log.isDebugEnabled()) { + MonitoringService.log.debug("Finish lesson [" + lessonId + "] job has been removed"); + } + } + } + } catch (SchedulerException e) { + throw new MonitoringServiceException( + "Error occurred at " + "[finishLessonOnSchedule]- fail to start scheduling", e); + } + } + + private String getFinishLesssonTriggerName(long lessonId) { + return "finishLessonOnScheduleTrigger:" + lessonId; + } + + @Override + public void finishLessonOnSchedule(long lessonId, int scheduledNumberDaysToLessonFinish, Integer userId) { + securityService.isLessonMonitor(lessonId, userId, "finish lesson on schedule", true); + + Lesson requestedLesson = lessonDAO.getLesson(new Long(lessonId)); + if (requestedLesson == null) { + String error = "Unable to schedule lesson end as lesson is missing. Lesson Id " + lessonId; + MonitoringService.log.error(error); + throw new IllegalArgumentException("Error occurred at [finishLessonOnSchedule]- " + error); + } + Date endDate = null; if (scheduledNumberDaysToLessonFinish > 0) { // calculate finish date @@ -600,49 +691,11 @@ throw new IllegalArgumentException("Lesson scheduled finish date is already in the past"); } - if (alreadyScheduled) { - finishLessonTrigger = finishLessonTrigger.getTriggerBuilder().startAt(endDate).build(); - } else { - // setup the message for scheduling job - finishLessonJob = JobBuilder.newJob(FinishScheduleLessonJob.class) - .withIdentity("finishLessonOnSchedule:" + lessonId) - .withDescription(requestedLesson.getLessonName() + ":" - + (requestedLesson.getUser() == null ? "" : requestedLesson.getUser().getFullName())) - .usingJobData(MonitoringConstants.KEY_LESSON_ID, new Long(lessonId)) - .usingJobData(MonitoringConstants.KEY_USER_ID, new Integer(userId)).build(); - - finishLessonTrigger = TriggerBuilder.newTrigger().withIdentity(triggerName).startAt(endDate).build(); - } + finishLessonOnScheduleAsServerDate(requestedLesson, endDate, userId); + } else { + // remove any existing schedule jobs + finishLessonOnScheduleAsServerDate(requestedLesson, null, userId); } - - // start the scheduling job - try { - requestedLesson.setScheduleEndDate(endDate); - lessonDAO.updateLesson(requestedLesson); - if (alreadyScheduled) { - if (scheduledNumberDaysToLessonFinish > 0) { - scheduler.rescheduleJob(finishLessonTrigger.getKey(), finishLessonTrigger); - if (MonitoringService.log.isDebugEnabled()) { - MonitoringService.log - .debug("Finish lesson [" + lessonId + "] job has been rescheduled to " + endDate); - } - } else { - scheduler.deleteJob(finishLessonTrigger.getJobKey()); - if (MonitoringService.log.isDebugEnabled()) { - MonitoringService.log.debug("Finish lesson [" + lessonId + "] job has been removed"); - } - } - } else if (scheduledNumberDaysToLessonFinish > 0) { - scheduler.scheduleJob(finishLessonJob, finishLessonTrigger); - if (MonitoringService.log.isDebugEnabled()) { - MonitoringService.log - .debug("Finish lesson [" + lessonId + "] job has been scheduled to " + endDate); - } - } - } catch (SchedulerException e) { - throw new MonitoringServiceException( - "Error occurred at " + "[finishLessonOnSchedule]- fail to start scheduling", e); - } } @Override @@ -811,13 +864,22 @@ } @Override - public void suspendLesson(long lessonId, Integer userId) { + public void suspendLesson(long lessonId, Integer userId, boolean clearScheduleDetails) { securityService.isLessonMonitor(lessonId, userId, "suspend lesson", true); Lesson lesson = lessonDAO.getLesson(new Long(lessonId)); if (!Lesson.SUSPENDED_STATE.equals(lesson.getLessonStateId()) && !Lesson.REMOVED_STATE.equals(lesson.getLessonStateId())) { setLessonState(lesson, Lesson.SUSPENDED_STATE); } + if (clearScheduleDetails) { + String triggerName = getFinishLesssonTriggerName(lessonId); + try { + scheduler.unscheduleJob(TriggerKey.triggerKey(triggerName)); + lesson.setScheduleEndDate(null); + } catch (SchedulerException e) { + MonitoringService.log.error("Error while removing lesson suspend trigger \"" + triggerName + "\"", e); + } + } } @Override Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java =================================================================== diff -u -r81d937bb6b9380b64f53e9feb482514c6b6a42b1 -r621f712588dcf37f4bc18add622143483cdfc267 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision 81d937bb6b9380b64f53e9feb482514c6b6a42b1) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision 621f712588dcf37f4bc18add622143483cdfc267) @@ -458,20 +458,17 @@ * The purpose of suspending is to hide the lesson from learners temporarily. It doesn't make any sense to suspend a * created or a not started (ie scheduled) lesson as they will not be shown on the learner interface anyway! If the * teacher tries to suspend a lesson that is not in the STARTED_STATE, then an error should be returned to UI. - * - * @param mapping - * @param form - * @param request - * @param response - * @return - * @throws IOException - * @throws ServletException */ public ActionForward suspendLesson(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) throws IOException, ServletException { + HttpServletResponse response) throws IOException, ServletException, ParseException { long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + String dateStr = WebUtil.readStrParam(request, MonitoringConstants.PARAM_LESSON_END_DATE, true); try { - getMonitoringService().suspendLesson(lessonId, getUserId()); + if (dateStr == null || dateStr.length() == 0) + getMonitoringService().suspendLesson(lessonId, getUserId(), true); + else + getMonitoringService().finishLessonOnSchedule(lessonId, + MonitoringAction.LESSON_SCHEDULING_DATETIME_FORMAT.parse(dateStr), getUserId()); } catch (SecurityException e) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson"); } @@ -1002,13 +999,24 @@ Date startOrScheduleDate = lesson.getStartDateTime() == null ? lesson.getScheduleStartDate() : lesson.getStartDateTime(); + Date finishDate = lesson.getScheduleEndDate(); + DateFormat indfm = null; + + if ( startOrScheduleDate != null || finishDate != null ) + indfm = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss", userLocale); + if (startOrScheduleDate != null) { - DateFormat indfm = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss", userLocale); Date tzStartDate = DateUtil.convertToTimeZoneFromDefault(user.getTimeZone(), startOrScheduleDate); responseJSON.put("startDate", indfm.format(tzStartDate) + " " + user.getTimeZone().getDisplayName(userLocale)); } + if ( finishDate != null ) { + Date tzFinishDate = DateUtil.convertToTimeZoneFromDefault(user.getTimeZone(), finishDate); + responseJSON.put("finishDate", + indfm.format(tzFinishDate) + " " + user.getTimeZone().getDisplayName(userLocale)); + } + List contributeActivities = getContributeActivities(lessonId, false); if (contributeActivities != null) { Gson gson = new GsonBuilder().create(); Index: lams_monitoring/web/css/_monitorLesson_base.scss =================================================================== diff -u -r755c19831e5aeb51fec70ec9e200b47e43ee62e5 -r621f712588dcf37f4bc18add622143483cdfc267 --- lams_monitoring/web/css/_monitorLesson_base.scss (.../_monitorLesson_base.scss) (revision 755c19831e5aeb51fec70ec9e200b47e43ee62e5) +++ lams_monitoring/web/css/_monitorLesson_base.scss (.../_monitorLesson_base.scss) (revision 621f712588dcf37f4bc18add622143483cdfc267) @@ -179,7 +179,6 @@ #lessonStateLabel{ font-size:13px; // Larger than buttons but smaller than the date text next to it. - vertical-align: inherit; } #lessonStateField { Index: lams_monitoring/web/includes/javascript/monitorLesson.js =================================================================== diff -u -r755c19831e5aeb51fec70ec9e200b47e43ee62e5 -r621f712588dcf37f4bc18add622143483cdfc267 --- lams_monitoring/web/includes/javascript/monitorLesson.js (.../monitorLesson.js) (revision 755c19831e5aeb51fec70ec9e200b47e43ee62e5) +++ lams_monitoring/web/includes/javascript/monitorLesson.js (.../monitorLesson.js) (revision 621f712588dcf37f4bc18add622143483cdfc267) @@ -98,6 +98,10 @@ $('#scheduleDatetimeField').datetimepicker({ 'minDate' : 0 }); + // sets up calendar for schedule date choice + $('#disableDatetimeField').datetimepicker({ + 'minDate' : 0 + }); // sets up dialog for editing class var classDialog = showDialog('classDialog',{ @@ -183,8 +187,28 @@ showLearnerGroupDialog(ajaxProperties, LABELS.LESSON_GROUP_DIALOG_CLASS, true, false, false, true); } +/** + * Lesson state field changed but the apply button not yet pressed + */ +function lessonStateFieldChanged() { + + //state chosen in the dropdown menu + var state = +$('#lessonStateField').val(); + switch (state) { + //'disable' is chosen + case 4: + $('#lessonDisableApply').show(); + $('#lessonStateApply').hide(); + break; + default: + $('#lessonDisableApply').hide(); + $('#lessonStateApply').show(); + break; + } +} + /** - * Changes lesson state and updates widgets. + * Apply the lesson state change and update widgets. */ function changeLessonState(){ var method = null; @@ -205,11 +229,10 @@ } break; - //'disable' is chosen - case 4: - method = "suspendLesson"; - break; + //'disable' is handled by scheduleDisableLesson, disableLesson + // case 4: + //'archive' is chosen case 6: method = "archiveLesson"; @@ -226,26 +249,47 @@ } if (method) { - $.ajax({ - url : LAMS_URL + 'monitoring/monitoring.do', - cache : false, - data : { - 'method' : method, - 'lessonID' : lessonId - }, - success : function() { - if (state == 7) { - // user chose to finish the lesson, close monitoring and refresh the lesson list - closeMonitorLessonDialog(true); - } else { - refreshMonitor('lesson'); - } - } - }); + applyStateChange(state, method) } } +function scheduleDisableLesson() { + var date = $('#disableDatetimeField').val(); + if (date) { + applyStateChange(4, "suspendLesson", date); + } else { + alert(LABELS.LESSON_ERROR_SCHEDULE_DATE); + } +} +function disableLesson() { + applyStateChange(4, "suspendLesson"); +} + +function applyStateChange(state, method, lessonEndDate) { + var params = { + 'method' : method, + 'lessonID' : lessonId, + }; + if ( lessonEndDate ) { + params.lessonEndDate = lessonEndDate; + } + + $.ajax({ + url : LAMS_URL + 'monitoring/monitoring.do', + cache : false, + data : params, + success : function() { + if (state == 7) { + // user chose to finish the lesson, close monitoring and refresh the lesson list + closeMonitorLessonDialog(true); + } else { + refreshMonitor('lesson'); + } + } + }); +} + /** * Updates widgets in lesson tab according to response sent to refreshMonitor() */ @@ -322,25 +366,35 @@ // show/remove widgets for lesson scheduling var scheduleControls = $('#scheduleDatetimeField, #scheduleLessonButton, #startLessonButton, #lessonScheduler'), startDateField = $('#lessonStartDateSpan'), + lessonFinishDateSpan = $('#lessonFinishDateSpan'), + disableDateSpan = $('#lessonDisableApply'), lessonStateChanger = $('#lessonStateChanger'), stateLabel = $('#lessonStateLabel'); switch (lessonStateId) { //created but not started lesson case 1: scheduleControls.css('display','inline'); startDateField.hide(); + lessonFinishDateSpan.hide(); lessonStateChanger.hide(); break; //scheduled lesson case 2: scheduleControls.css('display','inline'); - startDateField.text(response.startDate).add('#startLessonButton').css('display','inline'); + startDateField.text(LABELS.LESSON_START.replace("%0",response.startDate)).add('#startLessonButton').css('display','inline'); + lessonFinishDateSpan.hide(); lessonStateChanger.hide(); break; //started lesson default: scheduleControls.hide(); startDateField.text(response.startDate).hide(); + if ( response.finishDate ) { + lessonFinishDateSpan.text(LABELS.LESSON_FINISH.replace("%0",response.finishDate)).css('display','inline'); + } else { + lessonFinishDateSpan.text("").css('display','none'); + } + disableDateSpan.hide(); lessonStateChanger.css('display','inline'); stateLabel.attr('title',response.startDate); break; Index: lams_monitoring/web/monitor.jsp =================================================================== diff -u -r755c19831e5aeb51fec70ec9e200b47e43ee62e5 -r621f712588dcf37f4bc18add622143483cdfc267 --- lams_monitoring/web/monitor.jsp (.../monitor.jsp) (revision 755c19831e5aeb51fec70ec9e200b47e43ee62e5) +++ lams_monitoring/web/monitor.jsp (.../monitor.jsp) (revision 621f712588dcf37f4bc18add622143483cdfc267) @@ -197,7 +197,11 @@ PROGRESS_EMAIL_TITLE : '', - ERROR_DATE_IN_PAST : '' + ERROR_DATE_IN_PAST : '', + + LESSON_START : '', + + LESSON_FINISH : '' } $(document).ready(function(){ @@ -298,8 +302,9 @@
- - + + +
@@ -325,16 +330,31 @@
- - -
+ + + + + + + + + + + +