Index: lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/dto/SessionDTO.java =================================================================== diff -u -r90e5fd15f6474eb56d0b497d1b73e14bda75e262 -r1139c442d6bf00d3b8eb86f1a0c09d481c3169f1 --- lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/dto/SessionDTO.java (.../SessionDTO.java) (revision 90e5fd15f6474eb56d0b497d1b73e14bda75e262) +++ lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/dto/SessionDTO.java (.../SessionDTO.java) (revision 1139c442d6bf00d3b8eb86f1a0c09d481c3169f1) @@ -28,9 +28,11 @@ private Long sessionId; private String sessionName; + private String wid; - private String readOnlyWid; - private boolean sessionFaulty; + private String accessToken; + private String copyAccessToken; + private ItemRatingDTO itemRatingDto; private int numberOfLearners; private boolean sessionFinished; @@ -59,20 +61,20 @@ this.wid = padId; } - public String getReadOnlyWid() { - return readOnlyWid; + public String getAccessToken() { + return accessToken; } - public void setReadOnlyWid(String readOnlyPadId) { - this.readOnlyWid = readOnlyPadId; + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; } - public boolean isSessionFaulty() { - return sessionFaulty; + public String getCopyAccessToken() { + return copyAccessToken; } - public void setSessionFaulty(boolean sessionFaulty) { - this.sessionFaulty = sessionFaulty; + public void setCopyAccessToken(String copyAccessToken) { + this.copyAccessToken = copyAccessToken; } public ItemRatingDTO getItemRatingDto() { @@ -84,18 +86,18 @@ } public int getNumberOfLearners() { - return numberOfLearners; + return numberOfLearners; } public void setNumberOfLearners(int numberOfLearners) { - this.numberOfLearners = numberOfLearners; + this.numberOfLearners = numberOfLearners; } public boolean isSessionFinished() { - return sessionFinished; + return sessionFinished; } public void setSessionFinished(boolean sesssionFinished) { - this.sessionFinished = sesssionFinished; + this.sessionFinished = sesssionFinished; } } \ No newline at end of file Index: lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/IWhiteboardService.java =================================================================== diff -u -re9d22ce99dd49f9fd9495c9e78a3306ee07a74b0 -r1139c442d6bf00d3b8eb86f1a0c09d481c3169f1 --- lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/IWhiteboardService.java (.../IWhiteboardService.java) (revision e9d22ce99dd49f9fd9495c9e78a3306ee07a74b0) +++ lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/IWhiteboardService.java (.../IWhiteboardService.java) (revision 1139c442d6bf00d3b8eb86f1a0c09d481c3169f1) @@ -31,6 +31,7 @@ import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.tool.service.ICommonToolService; import org.lamsfoundation.lams.tool.whiteboard.dto.ReflectDTO; +import org.lamsfoundation.lams.tool.whiteboard.dto.SessionDTO; import org.lamsfoundation.lams.tool.whiteboard.model.Whiteboard; import org.lamsfoundation.lams.tool.whiteboard.model.WhiteboardConfigItem; import org.lamsfoundation.lams.tool.whiteboard.model.WhiteboardSession; @@ -114,6 +115,8 @@ */ List getReflectList(Long contentId); + List getSummary(Long contentId, Long ratingUserId); + /** * Get user by UID */ @@ -136,4 +139,5 @@ String getWhiteboardAccessTokenHash(String wid, String sourceWid); String getWhiteboardReadOnlyWid(String wid) throws WhiteboardApplicationException; + } \ No newline at end of file Index: lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/WhiteboardService.java =================================================================== diff -u -rf4597fed13599ea6eb50d0c03a3d1ada415bdc2b -r1139c442d6bf00d3b8eb86f1a0c09d481c3169f1 --- lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/WhiteboardService.java (.../WhiteboardService.java) (revision f4597fed13599ea6eb50d0c03a3d1ada415bdc2b) +++ lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/WhiteboardService.java (.../WhiteboardService.java) (revision 1139c442d6bf00d3b8eb86f1a0c09d481c3169f1) @@ -36,8 +36,10 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.SortedMap; +import java.util.function.Function; import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; @@ -56,6 +58,7 @@ import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; import org.lamsfoundation.lams.notebook.service.ICoreNotebookService; +import org.lamsfoundation.lams.rating.dto.ItemRatingDTO; import org.lamsfoundation.lams.rating.model.RatingCriteria; import org.lamsfoundation.lams.rating.model.ToolActivityRatingCriteria; import org.lamsfoundation.lams.rating.service.IRatingService; @@ -74,6 +77,7 @@ import org.lamsfoundation.lams.tool.whiteboard.dao.WhiteboardSessionDAO; import org.lamsfoundation.lams.tool.whiteboard.dao.WhiteboardUserDAO; import org.lamsfoundation.lams.tool.whiteboard.dto.ReflectDTO; +import org.lamsfoundation.lams.tool.whiteboard.dto.SessionDTO; import org.lamsfoundation.lams.tool.whiteboard.model.Whiteboard; import org.lamsfoundation.lams.tool.whiteboard.model.WhiteboardConfigItem; import org.lamsfoundation.lams.tool.whiteboard.model.WhiteboardSession; @@ -280,6 +284,64 @@ } @Override + public List getSummary(Long contentId, Long ratingUserId) { + List sessionList = whiteboardSessionDao.getByContentId(contentId); + Whiteboard whiteboard = whiteboardDao.getByContentId(contentId); + + Map itemRatingDtoMap = null; + if (whiteboard.isGalleryWalkStarted()) { + if (!whiteboard.isGalleryWalkReadOnly()) { + // it should have been created on lesson create, + // but in case Live Edit added Gallery Walk, we need to add it now, but just once + try { + createGalleryWalkRatingCriterion(whiteboard.getContentId()); + } catch (Exception e) { + log.warn("Ignoring error while processing Whiteboard Gallery Walk criteria for tool content ID " + + whiteboard.getContentId()); + } + } + + // Item IDs are WhiteboardSession session IDs, i.e. a single Whiteboard + Set itemIds = sessionList.stream() + .collect(Collectors.mapping(WhiteboardSession::getSessionId, Collectors.toSet())); + + List itemRatingDtos = ratingService.getRatingCriteriaDtos(contentId, null, itemIds, false, + ratingUserId); + // Mapping of Item ID -> DTO + itemRatingDtoMap = itemRatingDtos.stream() + .collect(Collectors.toMap(ItemRatingDTO::getItemId, Function.identity())); + } + + List groupList = new ArrayList<>(); + for (WhiteboardSession session : sessionList) { + // one new group for one session. + SessionDTO group = new SessionDTO(); + group.setSessionId(session.getSessionId()); + group.setSessionName(session.getSessionName()); + group.setNumberOfLearners(getUsersBySession(session.getSessionId()).size()); + group.setSessionFinished(WhiteboardConstants.COMPLETED == session.getStatus()); + + group.setWid(whiteboard.getContentId() + "-" + session.getSessionId()); + group.setAccessToken(getWhiteboardAccessTokenHash(group.getWid(), null)); + + if (StringUtils.isNotBlank(whiteboard.getSourceWid())) { + String whiteboardCopyAccessToken = getWhiteboardAccessTokenHash(group.getWid(), + whiteboard.getSourceWid()); + // since each wid is different for a different session, copy access token is also different + group.setCopyAccessToken(whiteboardCopyAccessToken); + } + + if (itemRatingDtoMap != null) { + group.setItemRatingDto(itemRatingDtoMap.get(session.getSessionId())); + } + + groupList.add(group); + } + + return groupList; + } + + @Override public String finishToolSession(Long toolSessionId, Long userId) throws WhiteboardApplicationException { WhiteboardUser user = whiteboardUserDao.getUserByUserIDAndSessionID(userId, toolSessionId); user.setSessionFinished(true); Index: lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/web/controller/MonitoringController.java =================================================================== diff -u -r90e5fd15f6474eb56d0b497d1b73e14bda75e262 -r1139c442d6bf00d3b8eb86f1a0c09d481c3169f1 --- lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 90e5fd15f6474eb56d0b497d1b73e14bda75e262) +++ lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 1139c442d6bf00d3b8eb86f1a0c09d481c3169f1) @@ -24,6 +24,7 @@ package org.lamsfoundation.lams.tool.whiteboard.web.controller; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.security.InvalidParameterException; import java.time.LocalDateTime; import java.time.OffsetDateTime; @@ -51,9 +52,13 @@ import org.lamsfoundation.lams.tool.ToolSession; import org.lamsfoundation.lams.tool.service.ILamsCoreToolService; import org.lamsfoundation.lams.tool.whiteboard.WhiteboardConstants; +import org.lamsfoundation.lams.tool.whiteboard.dto.ReflectDTO; +import org.lamsfoundation.lams.tool.whiteboard.dto.SessionDTO; import org.lamsfoundation.lams.tool.whiteboard.model.Whiteboard; import org.lamsfoundation.lams.tool.whiteboard.model.WhiteboardUser; import org.lamsfoundation.lams.tool.whiteboard.service.IWhiteboardService; +import org.lamsfoundation.lams.tool.whiteboard.service.WhiteboardApplicationException; +import org.lamsfoundation.lams.tool.whiteboard.service.WhiteboardService; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; @@ -63,6 +68,7 @@ import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; +import org.lamsfoundation.lams.web.util.SessionMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpStatus; @@ -111,66 +117,51 @@ @Qualifier("whiteboardMessageService") private MessageService messageService; - /* - * @RequestMapping("/summary") - * private String summary(HttpServletRequest request, HttpServletResponse response) throws EtherpadException { - * // initial Session Map - * SessionMap sessionMap = new SessionMap<>(); - * request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); - * request.setAttribute(WhiteboardConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); - * // save contentFolderID into session - * sessionMap.put(AttributeNames.PARAM_CONTENT_FOLDER_ID, - * WebUtil.readStrParam(request, AttributeNames.PARAM_CONTENT_FOLDER_ID, true)); - * - * Long contentId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); - * List groupList = whiteboardService.getSummary(contentId, null); - * boolean hasFaultySession = false; - * int attemptedLearnersNumber = 0; - * for (SessionDTO group : groupList) { - * hasFaultySession |= group.isSessionFaulty(); - * attemptedLearnersNumber += group.getNumberOfLearners(); - * } - * - * Whiteboard whiteboard = whiteboardService.getWhiteboardByContentId(contentId); - * - * // Create reflectList if reflection is enabled. - * if (whiteboard.isReflectOnActivity()) { - * List relectList = whiteboardService.getReflectList(contentId); - * sessionMap.put(WhiteboardConstants.ATTR_REFLECT_LIST, relectList); - * } - * - * // cache into sessionMap - * sessionMap.put(WhiteboardConstants.ATTR_SUMMARY_LIST, groupList); - * sessionMap.put(WhiteboardConstants.ATTR_HAS_FAULTY_SESSION, hasFaultySession); - * sessionMap.put(WhiteboardConstants.PAGE_EDITABLE, whiteboard.isContentInUse()); - * sessionMap.put(WhiteboardConstants.ATTR_WHITEBOARD, whiteboard); - * sessionMap.put(WhiteboardConstants.ATTR_TOOL_CONTENT_ID, contentId); - * sessionMap.put(WhiteboardConstants.ATTR_IS_GROUPED_ACTIVITY, whiteboardService.isGroupedActivity(contentId)); - * request.setAttribute("attemptedLearnersNumber", attemptedLearnersNumber); - * - * // get the API key from the config table and add it to the session - * String etherpadServerUrl = Configuration.get(ConfigurationKeys.ETHERPAD_SERVER_URL); - * String etherpadApiKey = Configuration.get(ConfigurationKeys.ETHERPAD_API_KEY); - * if (StringUtils.isBlank(etherpadServerUrl) || StringUtils.isBlank(etherpadApiKey)) { - * return "pages/learning/notconfigured"; - * } - * request.setAttribute(WhiteboardConstants.KEY_ETHERPAD_SERVER_URL, etherpadServerUrl); - * - * HttpSession ss = SessionManager.getSession(); - * // get back login user DTO - * UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); - * - * //no need to store cookie if there are no sessions created yet - * if (!groupList.isEmpty()) { - * // add new sessionID cookie in order to access pad - * Cookie etherpadSessionCookie = whiteboardService.createEtherpadCookieForMonitor(user, contentId); - * response.addCookie(etherpadSessionCookie); - * } - * - * return "pages/monitoring/monitoring"; - * } - */ + @RequestMapping("/summary") + private String summary(HttpServletRequest request, HttpServletResponse response) + throws WhiteboardApplicationException, UnsupportedEncodingException { + // initial Session Map + SessionMap sessionMap = new SessionMap<>(); + request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); + request.setAttribute(WhiteboardConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + // save contentFolderID into session + sessionMap.put(AttributeNames.PARAM_CONTENT_FOLDER_ID, + WebUtil.readStrParam(request, AttributeNames.PARAM_CONTENT_FOLDER_ID, true)); + Long contentId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); + List groupList = whiteboardService.getSummary(contentId, null); + int attemptedLearnersNumber = 0; + for (SessionDTO group : groupList) { + attemptedLearnersNumber += group.getNumberOfLearners(); + } + + Whiteboard whiteboard = whiteboardService.getWhiteboardByContentId(contentId); + + // Create reflectList if reflection is enabled. + if (whiteboard.isReflectOnActivity()) { + List relectList = whiteboardService.getReflectList(contentId); + sessionMap.put(WhiteboardConstants.ATTR_REFLECT_LIST, relectList); + } + + // cache into sessionMap + sessionMap.put(WhiteboardConstants.ATTR_SUMMARY_LIST, groupList); + sessionMap.put(WhiteboardConstants.PAGE_EDITABLE, whiteboard.isContentInUse()); + sessionMap.put(WhiteboardConstants.ATTR_WHITEBOARD, whiteboard); + sessionMap.put(WhiteboardConstants.ATTR_TOOL_CONTENT_ID, contentId); + sessionMap.put(WhiteboardConstants.ATTR_IS_GROUPED_ACTIVITY, whiteboardService.isGroupedActivity(contentId)); + request.setAttribute("attemptedLearnersNumber", attemptedLearnersNumber); + + String whiteboardServerUrl = whiteboardService.getWhiteboardServerUrl(); + request.setAttribute("whiteboardServerUrl", whiteboardServerUrl); + + HttpSession ss = SessionManager.getSession(); + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + String authorName = WhiteboardService.getWhiteboardAuthorName(user); + request.setAttribute("whiteboardAuthorName", authorName); + + return "pages/monitoring/monitoring"; + } + @RequestMapping("/getLearnerMarks") @ResponseBody private String getLearnerMarks(HttpServletRequest request, HttpServletResponse response) Index: lams_tool_whiteboard/web/pages/monitoring/monitoring.jsp =================================================================== diff -u -r90e5fd15f6474eb56d0b497d1b73e14bda75e262 -r1139c442d6bf00d3b8eb86f1a0c09d481c3169f1 --- lams_tool_whiteboard/web/pages/monitoring/monitoring.jsp (.../monitoring.jsp) (revision 90e5fd15f6474eb56d0b497d1b73e14bda75e262) +++ lams_tool_whiteboard/web/pages/monitoring/monitoring.jsp (.../monitoring.jsp) (revision 1139c442d6bf00d3b8eb86f1a0c09d481c3169f1) @@ -4,7 +4,7 @@ - <%@ include file="/common/tabbedheader.jsp" %> + <%@ include file="/common/header.jsp" %> @@ -106,13 +113,12 @@ ALLOW_RERATE = false; $(document).ready(function(){ - // show etherpads only on Group expand - $('#whiteboard-monitoring-summary-${sessionMap.toolContentID} .etherpad-collapse').on('show.bs.collapse', function(){ - var etherpad = $('.etherpad-container', this); - if (!etherpad.hasClass('initialised')) { - var id = etherpad.attr('id'), - groupId = id.substring('etherpad-container-'.length); - etherpadInitMethods[groupId](); + // show Whiteboards only on Group expand + $('#whiteboard-monitoring-summary-${sessionMap.toolContentID} .whiteboard-collapse').on('show.bs.collapse', function(){ + var whiteboard = $('.whiteboard-frame', this); + if (whiteboard.data('src')) { + whiteboard.attr('src', whiteboard.data('src')); + whiteboard.data('src', null); } }); @@ -732,8 +738,6 @@

- - @@ -815,7 +819,7 @@ -
@@ -828,38 +832,11 @@ - - - -
- - - - - -
- -
- - - - - -
- - "> - - - -
- - -
-
- + <%-- If there is no grouping, data is loaded immediately. + If there is grouping, data is loaded on panel expand. --%> +