Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r1aff6aeac19473c0089c0f3ff578a183beb92555 -r755c19831e5aeb51fec70ec9e200b47e43ee62e5 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 1aff6aeac19473c0089c0f3ff578a183beb92555) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 755c19831e5aeb51fec70ec9e200b47e43ee62e5) @@ -520,42 +520,48 @@ return; } - if (requestedLesson.getScheduleStartDate() != null) { - // can't reschedule! - MonitoringService.log - .error("Lesson for id=" + lessonId + " is already scheduled and cannot be rescheduled."); - return; - } - + // Change client/users schedule date to server's timezone. User user = (User) baseDAO.find(User.class, userId); TimeZone userTimeZone = TimeZone.getTimeZone(user.getTimeZone()); Date tzStartLessonDate = DateUtil.convertFromTimeZoneToDefault(userTimeZone, startDate); + String triggerKey = "startLessonOnScheduleTrigger:" + lessonId; + + // start the scheduling job + try { + if (requestedLesson.getScheduleStartDate() == null) { + // setup the message for scheduling job + JobDetail startLessonJob = JobBuilder.newJob(StartScheduleLessonJob.class) + .withIdentity("startLessonOnSchedule:" + 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(); - // setup the message for scheduling job - JobDetail startLessonJob = JobBuilder.newJob(StartScheduleLessonJob.class) - .withIdentity("startLessonOnSchedule:" + 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(); + // create customized triggers + Trigger startLessonTrigger = TriggerBuilder.newTrigger() + .withIdentity(triggerKey).startAt(tzStartLessonDate).build(); - // create customized triggers - Trigger startLessonTrigger = TriggerBuilder.newTrigger() - .withIdentity("startLessonOnScheduleTrigger:" + lessonId).startAt(tzStartLessonDate).build(); + scheduler.scheduleJob(startLessonJob, startLessonTrigger); - // start the scheduling job - try { + } 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); + + } + requestedLesson.setScheduleStartDate(tzStartLessonDate); - scheduler.scheduleJob(startLessonJob, startLessonTrigger); setLessonState(requestedLesson, Lesson.NOT_STARTED_STATE); } catch (SchedulerException e) { throw new MonitoringServiceException( "Error occurred at " + "[startLessonOnSchedule]- fail to start scheduling", e); } if (MonitoringService.log.isDebugEnabled()) { - MonitoringService.log.debug("Start lesson [" + lessonId + "] on schedule is configured"); + MonitoringService.log.debug("Start lesson [" + lessonId + "] on schedule is configured to start at " + DateUtil.convertToStringForTimeagoJSON(tzStartLessonDate)); } } Index: lams_monitoring/web/css/_monitorLesson_base.scss =================================================================== diff -u -r092ede3b8b3828ffa688c4db18c5d535e3364b98 -r755c19831e5aeb51fec70ec9e200b47e43ee62e5 --- lams_monitoring/web/css/_monitorLesson_base.scss (.../_monitorLesson_base.scss) (revision 092ede3b8b3828ffa688c4db18c5d535e3364b98) +++ lams_monitoring/web/css/_monitorLesson_base.scss (.../_monitorLesson_base.scss) (revision 755c19831e5aeb51fec70ec9e200b47e43ee62e5) @@ -177,6 +177,11 @@ margin-right: 5px; } +#lessonStateLabel{ + font-size:13px; // Larger than buttons but smaller than the date text next to it. + vertical-align: inherit; +} + #lessonStateField { width: 114px; } Index: lams_monitoring/web/includes/javascript/monitorLesson.js =================================================================== diff -u -ra9f62e22a4fe8d5adcf84322fbd833c217028fde -r755c19831e5aeb51fec70ec9e200b47e43ee62e5 --- lams_monitoring/web/includes/javascript/monitorLesson.js (.../monitorLesson.js) (revision a9f62e22a4fe8d5adcf84322fbd833c217028fde) +++ lams_monitoring/web/includes/javascript/monitorLesson.js (.../monitorLesson.js) (revision 755c19831e5aeb51fec70ec9e200b47e43ee62e5) @@ -331,11 +331,9 @@ startDateField.hide(); lessonStateChanger.hide(); break; - //schedules lesson + //scheduled lesson case 2: scheduleControls.css('display','inline'); - $("#scheduleDatetimeField").hide(); - $("#scheduleLessonButton").hide(); startDateField.text(response.startDate).add('#startLessonButton').css('display','inline'); lessonStateChanger.hide(); break; Index: lams_monitoring/web/monitor.jsp =================================================================== diff -u -re6b3b4b473ebb151c10733808c40d4276b4f81ab -r755c19831e5aeb51fec70ec9e200b47e43ee62e5 --- lams_monitoring/web/monitor.jsp (.../monitor.jsp) (revision e6b3b4b473ebb151c10733808c40d4276b4f81ab) +++ lams_monitoring/web/monitor.jsp (.../monitor.jsp) (revision 755c19831e5aeb51fec70ec9e200b47e43ee62e5) @@ -283,7 +283,7 @@