Index: lams_monitoring/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r76aaa4283f0c9c4b95cae2104bdf453c02ee7721 -rc26bfcb6f8502515eef2c55bba123cb39ce1ccb7 --- lams_monitoring/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 76aaa4283f0c9c4b95cae2104bdf453c02ee7721) +++ lams_monitoring/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision c26bfcb6f8502515eef2c55bba123cb39ce1ccb7) @@ -211,19 +211,71 @@ force.complete.activity.confirm =Are you sure you want to force complete learner "[0]" to activity "[1]"? force.complete.drop.fail =You have dropped the learner "[0]" on either its current or on its completed activity "[1]". force.complete.end.lesson.tooltip =To force complete a learner to the end of lesson, drag the learner icon over to this bar. -button.force.complete =Force complete -button.view.learner =View learner -button.close =Close learner.group.list.title =Learners: learner.group.count = learners in total. learner.group.show =Double-click to see the full list. learner.finished.count =Finished Learners: [0] of [1] learner.finished.dialog.title =End of lesson learner.group.sort.button =Sort +button.force.complete =Force complete +button.view.learner =View learner +button.close =Close button.help =Help button.help.tooltip =Open page with help on this tab button.refresh =Refresh button.refresh.tooltip =Reload the latest progress data for the learners button.export =Export Portfolio button.export.tooltip =Export the class portfolio and save it on your computer for future reference + +lesson.name =Name: +lesson.description =Description: +lesson.state =Status: +lesson.learners =Learners: +lesson.class =Class: +lesson.manage =Manage Lesson +button.view.learners =View Learners +button.view.learners.tooltip =Shows all the learners assigned to this lesson +button.edit.class =Edit Class +button.edit.class.tooltip =Edit the list of learners and monitors assigned to this lesson +button.open.im =Open IM +lesson.change.state =Change Status: +lesson.select.state =Select status +button.apply =Apply +lesson.change.state.tooltip =Change the status of this lesson based on the drop down selection +lesson.start =Start: +button.schedule =Schedule +button.schedule.tooltip =Schedule lesson to start in a future time +button.start.now =Start Now +button.start.now.tooltip =Start the lesson immediatelly +lesson.enable.portfolio =Enable export portfolio for learner +lesson.enable.presence =Allow learners to see who is online +lesson.enable.presence.alert =Now learners can see who is online +lesson.disable.presence.alert =Now learners can not see who is online +lesson.enable.im =Enable Instant Messaging +lesson.enable.im.alert =Instant Messaging is now enabled +lesson.disable.im.alert =Instant Messaging is now disabled +lesson.required.tasks =Required tasks +lesson.task.define.later =Define Later +lesson.task.gate =Permission Gate +lesson.task.grouping =Choose Grouping +lesson.task.branching =Instructor Chosen Branching +button.task.go =Go +button.task.go.tooltip =Complete this task now +lesson.learners =Learners +lesson.monitors =Monitors +lesson.remove.alert =You have selected to remove this lesson. Removed lessons can not be retrieved again. Continue? +lesson.remove.doublecheck.alert =WARNING: This lesson is about to be removed! +lesson.state.created =Created but not started +lesson.state.scheduled =Scheduled +lesson.state.started =Started +lesson.state.suspended =Suspended +lesson.state.finished =Finished +lesson.state.archived =Archived +lesson.state.removed =Removed +lesson.state.action.disable =Disable +lesson.state.action.activate =Activate +lesson.state.action.remove =Remove +lesson.state.action.archive =Archive +error.lesson.schedule.date =No date was selected. Please select a date and time. +lesson.group.dialog.class =Class #======= End labels: Exported 196 labels for en AU ===== Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/ContributeActivityDTO.java =================================================================== diff -u -r1af4378c901cea902392d4ef17f9d990f25e16f3 -rc26bfcb6f8502515eef2c55bba123cb39ce1ccb7 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/ContributeActivityDTO.java (.../ContributeActivityDTO.java) (revision 1af4378c901cea902392d4ef17f9d990f25e16f3) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/ContributeActivityDTO.java (.../ContributeActivityDTO.java) (revision c26bfcb6f8502515eef2c55bba123cb39ce1ccb7) @@ -116,7 +116,7 @@ contributeEntries.add(entry); } - class ContributeEntry { + public class ContributeEntry { private Boolean isRequired; private Integer contributionType; private String url; Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -r8f41081e2335cb612bb70ce0d2b2923a7c65e914 -rc26bfcb6f8502515eef2c55bba123cb39ce1ccb7 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 8f41081e2335cb612bb70ce0d2b2923a7c65e914) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision c26bfcb6f8502515eef2c55bba123cb39ce1ccb7) @@ -40,6 +40,7 @@ import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.service.LessonServiceException; +import org.lamsfoundation.lams.monitoring.dto.ContributeActivityDTO; import org.lamsfoundation.lams.tool.exception.LamsToolServiceException; import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.User; @@ -555,7 +556,9 @@ * @throws IOException */ public String getAllContributeActivities(Long lessonID) throws IOException, LearningDesignProcessorException; - + + public List getAllContributeActivityDTO(Long lessonID); + /** * This method returns the url associated with the activity in the * monitoring enviornment. This is the URL that opens up when the Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r8f41081e2335cb612bb70ce0d2b2923a7c65e914 -rc26bfcb6f8502515eef2c55bba123cb39ce1ccb7 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 8f41081e2335cb612bb70ce0d2b2923a7c65e914) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision c26bfcb6f8502515eef2c55bba123cb39ce1ccb7) @@ -86,6 +86,7 @@ import org.lamsfoundation.lams.logevent.LogEvent; import org.lamsfoundation.lams.logevent.service.ILogEventService; import org.lamsfoundation.lams.monitoring.MonitoringConstants; +import org.lamsfoundation.lams.monitoring.dto.ContributeActivityDTO; import org.lamsfoundation.lams.monitoring.dto.LearnerProgressBatchDTO; import org.lamsfoundation.lams.tool.ToolSession; import org.lamsfoundation.lams.tool.exception.LamsToolServiceException; @@ -1958,6 +1959,18 @@ return flashMessage.serializeMessage(); } + public List getAllContributeActivityDTO(Long lessonID) { + List result = null; + Lesson lesson = lessonDAO.getLesson(lessonID); + if (lesson != null) { + ContributeActivitiesProcessor processor = new ContributeActivitiesProcessor(lesson.getLearningDesign(), + lessonID, activityDAO, lamsCoreToolService); + processor.parseLearningDesign(); + result = processor.getMainActivityList(); + } + return result; + } + /** * (non-Javadoc) * Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java =================================================================== diff -u -r76aaa4283f0c9c4b95cae2104bdf453c02ee7721 -rc26bfcb6f8502515eef2c55bba123cb39ce1ccb7 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision 76aaa4283f0c9c4b95cae2104bdf453c02ee7721) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision c26bfcb6f8502515eef2c55bba123cb39ce1ccb7) @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -50,26 +51,30 @@ import org.apache.tomcat.util.json.JSONException; import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ContributionTypes; import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.lesson.dto.LessonDetailsDTO; import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.lesson.util.LessonComparator; import org.lamsfoundation.lams.monitoring.MonitoringConstants; +import org.lamsfoundation.lams.monitoring.dto.ContributeActivityDTO; import org.lamsfoundation.lams.monitoring.service.IMonitoringService; import org.lamsfoundation.lams.monitoring.service.MonitoringServiceProxy; import org.lamsfoundation.lams.timezone.service.ITimezoneService; import org.lamsfoundation.lams.tool.exception.LamsToolServiceException; import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; -import org.lamsfoundation.lams.util.CentralConstants; import org.lamsfoundation.lams.util.DateUtil; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.util.audit.IAuditService; import org.lamsfoundation.lams.util.wddx.FlashMessage; +import org.lamsfoundation.lams.util.wddx.WDDXTAGS; import org.lamsfoundation.lams.web.action.LamsDispatchAction; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; @@ -241,31 +246,15 @@ Organisation organisation = (Organisation) userManagementService.findById(Organisation.class, organisationId); Integer userId = getUserId(); - User user = (User) userManagementService.findById(User.class, userId); + User creator = (User) userManagementService.findById(User.class, userId); - // parse comma delimited learner list and get the real users objects - String learnersParam = request.getParameter("learners"); - List learners = new ArrayList(); - for (String learnerID : learnersParam.split(",")) { - // last one will be blank - if (!StringUtils.isBlank(learnerID)) { - User learner = (User) userManagementService.findById(User.class, Integer.valueOf(learnerID)); - learners.add(learner); - } - } + List learners = parseUserList(request, "learners"); String learnerGroupName = organisation.getName() + " learners"; - String staffParam = request.getParameter("monitors"); - List staff = new ArrayList(); - for (String staffMemberID : staffParam.split(",")) { - if (!StringUtils.isBlank(staffMemberID)) { - User staffMemeber = (User) userManagementService.findById(User.class, Integer.valueOf(staffMemberID)); - staff.add(staffMemeber); - } - } + List staff = parseUserList(request, "monitors"); // add the creator as staff, if not already done - if (!staff.contains(user)) { - staff.add(user); + if (!staff.contains(creator)) { + staff.add(creator); } String staffGroupName = organisation.getName() + " staff"; @@ -362,6 +351,17 @@ return null; } + public ActionForward startOnScheduleLessonJSON(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws ParseException { + IMonitoringService monitoringService = MonitoringServiceProxy.getMonitoringService(getServlet() + .getServletContext()); + long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + String dateStr = WebUtil.readStrParam(request, MonitoringConstants.PARAM_LESSON_START_DATE); + Date startDate = MonitoringAction.LESSON_SCHEDULING_DATETIME_FORMAT.parse(dateStr); + monitoringService.startLessonOnSchedule(lessonId, startDate, getUserId()); + return null; + } + /** * The Struts dispatch method to archive a lesson. A wddx acknowledgement message will be serialized and sent back * to the flash component. @@ -680,6 +680,78 @@ return null; } + /** + * Gets learners or monitors of either the lesson only or the lesson and organisation containing it. + */ + @SuppressWarnings("unchecked") + public ActionForward getClassMembers(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException, JSONException { + long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + String role = WebUtil.readStrParam(request, AttributeNames.PARAM_ROLE); + boolean getMonitors = Role.MONITOR.equalsIgnoreCase(role); + boolean classOnly = WebUtil.readBooleanParam(request, "classOnly", true); + Lesson lesson = getLessonService().getLesson(lessonId); + Set classUsers = (Set) (getMonitors ? lesson.getLessonClass().getStaffGroup().getUsers() : lesson + .getLessonClass().getLearners()); + JSONArray responseJSON = new JSONArray(); + + // get class members + for (User user : classUsers) { + JSONObject userJSON = MonitoringAction.userToJSON(user); + if (!classOnly) { + // mark that this user is a class member + userJSON.put("classMember", true); + if (lesson.getUser().equals(user)) { + // mark this user is lesson author + userJSON.put("lessonCreator", true); + } + } + responseJSON.put(userJSON); + } + + // add non-class, organisation members, if requested + if (!classOnly) { + IUserManagementService userManagementService = MonitoringServiceProxy.getUserManagementService(getServlet() + .getServletContext()); + List orgUsers = userManagementService.getUsersFromOrganisationByRole(lesson.getOrganisation() + .getOrganisationId(), getMonitors ? Role.MONITOR : Role.LEARNER, false, true); + for (User user : orgUsers) { + if (!classUsers.contains(user)) { + JSONObject userJSON = MonitoringAction.userToJSON(user); + userJSON.put("classMember", false); + responseJSON.put(userJSON); + } + } + } + + response.getWriter().write(responseJSON.toString()); + return null; + } + + /** + * Adds/removes learners and monitors to/from lesson class. + */ + public ActionForward updateLessonClass(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException, JSONException { + long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + Lesson lesson = getLessonService().getLesson(lessonId); + Organisation organisation = lesson.getOrganisation(); + + List learners = parseUserList(request, "learners"); + String learnerGroupName = organisation.getName() + " learners"; + + List staff = parseUserList(request, "monitors"); + // add the creator as staff, if not already done + String staffGroupName = organisation.getName() + " staff"; + + IMonitoringService monitoringService = MonitoringServiceProxy.getMonitoringService(getServlet() + .getServletContext()); + monitoringService.createLessonClassForLesson(lessonId, organisation, learnerGroupName, learners, + staffGroupName, staff, getUserId()); + + return null; + } + public ActionForward getLessonStaff(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException { String wddxPacket; @@ -730,6 +802,7 @@ return null; } + @SuppressWarnings("unchecked") public ActionForward getDictionaryXML(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException { @@ -1015,24 +1088,73 @@ public ActionForward monitorLesson(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { Long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); - Lesson lesson = getLessonService().getLesson(lessonId); - request.setAttribute(CentralConstants.PARAM_LEARNING_DESIGN_ID, lesson.getLearningDesign() - .getLearningDesignId()); + LessonDetailsDTO lessonDTO = getLessonService().getLessonDetails(lessonId); + HttpSession ss = SessionManager.getSession(); + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + Locale userLocale = new Locale(user.getLocaleLanguage(), user.getLocaleCountry()); + if ((lessonDTO.getCreateDateTime() != null) && (lessonDTO.getCreateDateTime() != WDDXTAGS.DATE_NULL_VALUE)) { + DateFormat sfm = new SimpleDateFormat("yyyyMMdd_HHmmss"); + lessonDTO.setCreateDateTimeStr(sfm.format(lessonDTO.getCreateDateTime())); + } + + IMonitoringService monitoringService = MonitoringServiceProxy.getMonitoringService(getServlet() + .getServletContext()); + List contributeActivities = monitoringService.getAllContributeActivityDTO(lessonId); + + if (contributeActivities != null) { + List requiredContributeActivities = new ArrayList(); + for (ContributeActivityDTO contributeActivity : contributeActivities) { + if (contributeActivity.getContributeEntries() != null) { + for (ContributeActivityDTO.ContributeEntry contributeEntry : contributeActivity + .getContributeEntries()) { + if (contributeEntry.getIsRequired()) { + requiredContributeActivities.add(contributeActivity); + if (ContributionTypes.DEFINE_LATER.equals(contributeEntry.getContributionType())) { + String url = WebUtil.appendParameterToURL(contributeEntry.getURL(), + AttributeNames.PARAM_CONTENT_FOLDER_ID, lessonDTO.getContentFolderID()); + contributeEntry.setURL(url); + } + } + } + } + } + if (!requiredContributeActivities.isEmpty()) { + request.setAttribute("contributeActivities", requiredContributeActivities); + } + } + + request.setAttribute("lesson", lessonDTO); return mapping.findForward("monitorLesson"); } @SuppressWarnings("unchecked") public ActionForward getLessonProgressJSON(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws JSONException, IOException { - Long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); Lesson lesson = getLessonService().getLesson(lessonId); - String contentFolderId = lesson.getLessonDetails().getContentFolderID(); + LessonDetailsDTO lessonDetails = lesson.getLessonDetails(); + String contentFolderId = lessonDetails.getContentFolderID(); IMonitoringService monitoringService = MonitoringServiceProxy.getMonitoringService(getServlet() .getServletContext()); Integer monitorUserId = getUserId(); + HttpSession ss = SessionManager.getSession(); + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + Locale userLocale = new Locale(user.getLocaleLanguage(), user.getLocaleCountry()); + JSONObject responseJSON = new JSONObject(); + responseJSON.put("numberPossibleLearners", lessonDetails.getNumberPossibleLearners()); + responseJSON.put("lessonStateID", lessonDetails.getLessonStateID()); + Date startOrScheduleDate = lesson.getStartDateTime() == null ? lesson.getScheduleStartDate() : lesson + .getStartDateTime(); + 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)); + } + // few details for each activity Map activitiesMap = new TreeMap(); for (Activity activity : (Set) lesson.getLearningDesign().getActivities()) { @@ -1041,19 +1163,15 @@ activityJSON.put("id", activityId); String monitorUrl = monitoringService.getActivityMonitorURL(lessonId, activityId, contentFolderId, monitorUserId); - if (monitorUrl != null) { + if (monitorUrl != null) { activityJSON.put("url", monitorUrl); } activitiesMap.put(activityId, activityJSON); } for (LearnerProgress learnerProgress : (Set) lesson.getLearnerProgresses()) { - JSONObject learnerJSON = new JSONObject(); User learner = learnerProgress.getUser(); - learnerJSON.put("id", learner.getUserId()); - learnerJSON.put("firstName", learner.getFirstName()); - learnerJSON.put("lastName", learner.getLastName()); - learnerJSON.put("login", learner.getLogin()); + JSONObject learnerJSON = MonitoringAction.userToJSON(learner); if (learnerProgress.isComplete()) { // no more details are needed for learners who completed the lesson responseJSON.append("completedLearners", learnerJSON); @@ -1357,4 +1475,34 @@ return mapping.findForward(MonitoringAction.TIME_CHART_SCREEN); } -} + + /** + * Produces JSON object with basic user details. + */ + private static JSONObject userToJSON(User user) throws JSONException { + JSONObject userJSON = new JSONObject(); + userJSON.put("id", user.getUserId()); + userJSON.put("firstName", user.getFirstName()); + userJSON.put("lastName", user.getLastName()); + userJSON.put("login", user.getLogin()); + return userJSON; + } + + /** + * Creates a list of users out of string with comma-delimited user IDs. + */ + private List parseUserList(HttpServletRequest request, String paramName) { + IUserManagementService userManagementService = MonitoringServiceProxy.getUserManagementService(getServlet() + .getServletContext()); + String userIdList = request.getParameter(paramName); + String[] userIdArray = userIdList.split(","); + List result = new ArrayList(userIdArray.length); + for (String userId : userIdArray) { + if (!StringUtils.isBlank(userId)) { + User user = (User) userManagementService.findById(User.class, Integer.valueOf(userId)); + result.add(user); + } + } + return result; + } +} \ No newline at end of file Index: lams_monitoring/web/css/monitorLesson.css =================================================================== diff -u -r76aaa4283f0c9c4b95cae2104bdf453c02ee7721 -rc26bfcb6f8502515eef2c55bba123cb39ce1ccb7 --- lams_monitoring/web/css/monitorLesson.css (.../monitorLesson.css) (revision 76aaa4283f0c9c4b95cae2104bdf453c02ee7721) +++ lams_monitoring/web/css/monitorLesson.css (.../monitorLesson.css) (revision c26bfcb6f8502515eef2c55bba123cb39ce1ccb7) @@ -1,13 +1,16 @@ +/********** GENERAL/DIALOG STYLES **********/ + div#tabs { width: 768px; height: 574px; + overflow: hidden; } .ui-tabs .ui-tabs-panel { padding: 0px; } -div#tabs ul li a, a#closeButton { +div#tabs ul li a,a#closeButton { border-bottom: none; } @@ -23,13 +26,6 @@ background-color: #D0E5F5; } -div.tabTitle { - padding: 5px 0px 5px 0px; - font-size: small; - font-weight: bold; - text-align: center; -} - .errorMessage { font-weight: bold; color: red; @@ -48,18 +44,122 @@ display: none; } -div.topButtonsContainer { +.dialogList { + overflow: auto; + border: thin solid black; + padding: 5px; +} + +div.dialogListItem { + padding: 3px 0px 3px 0px; + cursor: pointer; +} + +div.dialogListItemSelected { + background-color: #5c9ccc !important; + color: white !important; +} + +div.dialogListItemDisabled { + color: grey !important; +} + +.dialogTitle { + padding: 0px 0px 5px 0px; + height: 15px; + font-size: small; + font-weight: bold; + text-align: center; +} + +.dialogListSortButton { + text-align: right; + padding-right: 3px; + float: right; + cursor: pointer; +} + + +/********** LESSON TAB STYLES **********/ + +div#tabLesson { + height: 540px; + overflow: auto; +} + +table#tabLessonTable { + table-layout: fixed; +} + +table#tabLessonTable td { + padding: 7px; +} + +td.fieldLabel { + font-weight: bold; + width: 150px; +} + +td.sectionHeader { + font-weight: bold; + background-color: #D0E5F5; +} + +.topButtonsContainer { height: 30px; + padding: 0px !important; } -div.topButtonsContainer a { +.topButtonsContainer a { float: right; - margin: 5px 5px 0 0; + margin: 5px 5px 5px 0; } +.lessonManageField { + margin-right: 5px; +} + +#lessonStateField { + width: 114px; +} + +#lessonStartDateCell * { + display: none; +} + +table#tabLessonTable td.contributeActivityCell { + padding: 0 0 0 5px; + font-weight: bold; +} + +table#tabLessonTable td.contributeEntryCell { + padding: 0 5px 0 15px; +} + +td.contributeEntryCell a { + float: right; +} + +#classDialogTable { + border-spacing: 5px 0; +} + +#classDialogTable td { + width: 50%; + vertical-align: top; +} + +#classDialogTable input[type="checkbox"] { + margin: 0 5px 0px 0px; + border: none; +} + + +/********** SEQUENCE TAB STYLES **********/ + div#sequenceCanvas { text-align: center; - height: 483px; + height: 478px; width: 768px; overflow: auto; } @@ -80,35 +180,4 @@ cursor: default; vertical-align: top; margin-right: 5px; -} - -div#learnerGroupList { - overflow: auto; - border: thin solid black; - padding : 5px; -} - -div.learnerGroupListItem { - padding: 3px 0px 3px 0px; - cursor: pointer; -} - -div.learnerGroupListItemSelected { - background-color: #5c9ccc !important; - color: white !important; -} - -#learnerGroupListTitle { - padding: 0px 0px 5px 0px; - height: 15px; - font-size: small; - font-weight: bold; - text-align: center; -} - -#sortLearnerGroupListButton { - text-align: right; - padding-right: 3px; - float: right; - cursor: pointer; } \ No newline at end of file Index: lams_monitoring/web/includes/javascript/monitorLesson.js =================================================================== diff -u -r5cf28b5fbc194ed54b04fe73e52e47bede16376b -rc26bfcb6f8502515eef2c55bba123cb39ce1ccb7 --- lams_monitoring/web/includes/javascript/monitorLesson.js (.../monitorLesson.js) (revision 5cf28b5fbc194ed54b04fe73e52e47bede16376b) +++ lams_monitoring/web/includes/javascript/monitorLesson.js (.../monitorLesson.js) (revision c26bfcb6f8502515eef2c55bba123cb39ce1ccb7) @@ -1,14 +1,369 @@ -// ********** MAIN FUNCTIONS ********** -// copy of lesson SVG so it does no need to be fetched every t +// ********** GLOBAL VARIABLES ********** +// copy of lesson SVG so it does no need to be fetched every time var originalSequenceCanvas = null; -// DIV container for lesson SVG +// DIV container for lesson SVG; it gets accessed so many times it's worth to cache it here var sequenceCanvas = null; -// how learners in pop up are currently sorted -var learnerGroupListAscending = false; +// how learners in pop up lists are currently sorted +var sortOrderAsc = { + learnerGroup : false, + classLearner : false, + classMonitor : false +}; +//********** LESSON TAB FUNCTIONS ********** + +/** + * Sets up lesson tab. + */ function initLessonTab(){ - refreshSequenceCanvas(); + // sets export portfolio availability + $('#exportAvailableField').change(function(){ + var checked = $(this).is(':checked'); + $.ajax({ + dataType : 'xml', + url : LAMS_URL + 'monitoring/monitoring.do', + cache : false, + data : { + 'method' : 'learnerExportPortfolioAvailable', + 'learnerExportPortfolio' : checked, + 'lessonID' : lessonId + } + }); + }); + // sets presence availability + $('#presenceAvailableField').change(function(){ + var checked = $(this).is(':checked'); + $.ajax({ + dataType : 'xml', + url : LAMS_URL + 'monitoring/monitoring.do', + cache : false, + data : { + 'method' : 'presenceAvailable', + 'presenceAvailable' : checked, + 'lessonID' : lessonId + }, + success : function() { + if (checked) { + $('#imAvailableField').attr('disabled', null); + alert(LESSON_PRESENCE_ENABLE_ALERT_LABEL); + } else { + $('#imAvailableField').attr({ + 'checked' : null, + 'disabled' : 'disabled' + }); + alert(LESSON_PRESENCE_DISABLE_ALERT_LABEL); + } + } + }); + }); + + // sets instant messaging availability + $('#imAvailableField').change(function(){ + var checked = $(this).is(':checked'); + $.ajax({ + dataType : 'xml', + url : LAMS_URL + 'monitoring/monitoring.do', + cache : false, + data : { + 'method' : 'presenceImAvailable', + 'presenceImAvailable' : checked, + 'lessonID' : lessonId + }, + success : function() { + if (checked) { + $('#openImButton').css('display', 'inline'); + alert(LESSON_IM_ENABLE_ALERT_LABEL); + } else { + $('#openImButton').css('display', 'none'); + alert(LESSON_IM_DISABLE_ALERT_LABEL); + } + } + }); + }); + + // sets up calendar for schedule date choice + $('#scheduleDatetimeField').datetimepicker({ + 'minDate' : 0 + }); + + // sets up dialog for editing class + $('#classDialog').dialog({ + 'autoOpen' : false, + 'height' : 360, + 'width' : 700, + 'minWidth' : 700, + 'modal' : true, + 'resizable' : true, + 'show' : 'fold', + 'hide' : 'fold', + 'open' : function(){ + // reset sort order + sortOrderAsc['classLearner'] = false; + sortOrderAsc['classMonitor'] = false; + sortDialogList('classLearner'); + sortDialogList('classMonitor'); + colorDialogList('classLearner'); + colorDialogList('classMonitor'); + }, + 'buttons' : [ + { + 'text' : 'Save', + 'id' : 'classDialogSaveButton', + 'click' : function() { + var dialog = $(this); + var learners = getSelectedClassUserList('classLearnerList'); + var monitors = getSelectedClassUserList('classMonitorList'); + $.ajax({ + url : LAMS_URL + 'monitoring/monitoring.do', + cache : false, + data : { + 'method' : 'updateLessonClass', + 'lessonID' : lessonId, + 'learners' : learners, + 'monitors' : monitors + }, + success : function() { + dialog.dialog('close'); + refreshMonitor(); + } + }); + } + }, + { + 'text' : 'Cancel', + 'id' : 'classDialogCancelButton', + 'click' : function() { + $(this).dialog('close'); + } + } + ] + }); + + $('#classLearnerSortButton').click(function(){ + sortDialogList('classLearner'); + }); + $('#classMonitorSortButton').click(function(){ + sortDialogList('classMonitor'); + }); +} + + +/** + * Shows all learners in the lesson class. + */ +function showLessonLearnersDialog() { + $.ajax({ + dataType : 'json', + url : LAMS_URL + 'monitoring/monitoring.do', + cache : false, + data : { + 'method' : 'getClassMembers', + 'lessonID' : lessonId, + 'role' : 'LEARNER', + 'classOnly' : true + }, + success : function(response) { + showLearnerGroupDialog(null, LESSON_GROUP_DIALOG_CLASS_LABEL, response); + } + }); +} + + +/** + * Changes lesson state and updates widgets. + */ +function changeLessonState(){ + var method = null; + var state = +$('#lessonStateField').val(); + switch (state) { + case 3: //STARTED + switch (lessonStateId) { + case 4: //SUSPENDED + method = "unsuspendLesson"; + break; + case 6: //ARCHIVED + method = "unarchiveLesson"; + break; + } + break; + case 4: + method = "suspendLesson"; + break; + case 6: + method = "archiveLesson"; + break; + case 7: //FINISHED + if (confirm(LESSON_REMOVE_ALERT_LABEL)){ + if (confirm(LESSON_REMOVE_DOUBLECHECK_ALERT_LABEL)) { + method = "removeLesson"; + } + } + break; + } + + if (method) { + $.ajax({ + dataType : 'xml', + 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 + window.parent.closeMonitorLessonDialog(true); + } else { + refreshMonitor(); + } + } + }); + } +} + + +/** + * Updates widgets in lesson tab according to respose sent to refreshMonitor() + */ +function updateLessonTab(refreshResponse){ + // update lesson state label + lessonStateId = +refreshResponse.lessonStateID; + var label = null; + switch (lessonStateId) { + case 1: + label = LESSON_STATE_CREATED_LABEL; + break; + case 2: + label = LESSON_STATE_SCHEDULED_LABEL; + break; + case 3: + label = LESSON_STATE_STARTED_LABEL; + break; + case 4: + label = LESSON_STATE_SUSPENDED_LABEL; + break; + case 5: + label = LESSON_STATE_FINISHED_LABEL; + break; + case 6: + label = LESSON_STATE_ARCHIVED_LABEL; + break; + case 7: + label = LESSON_STATE_REMOVED_LABEL; + break; + } + $('#lessonStateLabel').text(label); + + // update available options in change state dropdown menu + var selectField = $('#lessonStateField'); + // remove all except "Select status" option + selectField.children('option:not([value="-1"])').remove(); + switch (lessonStateId) { + case 3: + $('