Index: lams_central/conf/security/Owasp.CsrfGuard.properties =================================================================== diff -u -rec9b0ffc2e88f3504fd7505ee8474f86d89a2458 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_central/conf/security/Owasp.CsrfGuard.properties (.../Owasp.CsrfGuard.properties) (revision ec9b0ffc2e88f3504fd7505ee8474f86d89a2458) +++ lams_central/conf/security/Owasp.CsrfGuard.properties (.../Owasp.CsrfGuard.properties) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -127,6 +127,7 @@ org.owasp.csrfguard.protected.assessmentMonitoringExportExcel=/lams/tool/laasse10/monitoring/exportSummary.do org.owasp.csrfguard.protected.assessmentMonitoringAllocateUserAnswer=/lams/tool/laasse10/monitoring/allocateUserAnswer.do org.owasp.csrfguard.protected.assessmentMonitoringSetActivityEvaluation=/lams/tool/laasse10/monitoring/setActivityEvaluation.do +org.owasp.csrfguard.protected.assessmentMonitoringChangeLeader=/lams/tool/laasse10/monitoring/changeLeaderForGroup.do org.owasp.csrfguard.protected.assessmentSaveUserGrade=/lams/tool/laasse10/monitoring/saveUserGrade.do org.owasp.csrfguard.protected.assessmentUpdateTimeLimit=/lams/tool/laasse10/monitoring/updateTimeLimit.do org.owasp.csrfguard.protected.assessmentUpdateIndividualTimeLimit=/lams/tool/laasse10/monitoring/updateIndividualTimeLimit.do @@ -170,7 +171,7 @@ org.owasp.csrfguard.protected.leaderAuthoringSave=/lams/tool/lalead11/authoring/updateContent.do org.owasp.csrfguard.protected.leaderAuthoringDefineLater=/lams/tool/lalead11/authoring/definelater.do org.owasp.csrfguard.protected.leaderSaveLeaders=/lams/tool/lalead11/monitoring/saveLeaders.do -org.owasp.csrfguard.protected.leaderTblmonitoringChangeLeader=/lams/tool/lalead11/monitoring/changeLeader.do +org.owasp.csrfguard.protected.leaderMonitoringChangeLeader=/lams/tool/lalead11/monitoring/changeLeader.do org.owasp.csrfguard.protected.laqaAuthoringSave=/lams/tool/laqa11/authoring/submitAllContent.do org.owasp.csrfguard.protected.laqaAuthoringDefineLater=/lams/tool/laqa11/authoring/definelater.do @@ -179,6 +180,7 @@ org.owasp.csrfguard.protected.laqaAuthoringSaveOrUpdateCondition=/lams/tool/laqa11/authoringConditions/saveOrUpdateCondition.do org.owasp.csrfguard.protected.laqaAuthoringRemoveCondition=/lams/tool/laqa11/authoringConditions/removeCondition.do org.owasp.csrfguard.protected.laqaMonitoringSubmissionDeadline=/lams/tool/laqa11/monitoring/setSubmissionDeadline.do +org.owasp.csrfguard.protected.laqaMonitoringChangeLeader=/lams/tool/laqa11/monitoring/changeLeaderForGroup.do org.owasp.csrfguard.protected.larsrcAuthoringSave=/lams/tool/larsrc11/authoring/update.do org.owasp.csrfguard.protected.larsrcAuthoringDefineLater=/lams/tool/larsrc11/authoring/definelater.do @@ -210,6 +212,7 @@ org.owasp.csrfguard.protected.sbmtAuthoringSave=/lams/tool/lasbmt11/authoring/updateContent.do org.owasp.csrfguard.protected.sbmtAuthoringDefineLater=/lams/tool/lasbmt11/authoring/definelater.do org.owasp.csrfguard.protected.sbmtMonitoringSubmissionDeadline=/lams/tool/lasbmt11/monitoring/setSubmissionDeadline.do +org.owasp.csrfguard.protected.sbmtMonitoringChangeLeader=/lams/tool/lasbmt11/monitoring/changeLeaderForGroup.do org.owasp.csrfguard.protected.sbmtUpdateMark=/lams/tool/lasbmt11/mark/updateMark.do org.owasp.csrfguard.protected.sbmtReleaseMarks=/lams/tool/lasbmt11/monitoring/releaseMarks.do org.owasp.csrfguard.protected.sbmtDownloadMarks=/lams/tool/lasbmt11/monitoring/downloadMarks.do @@ -224,6 +227,7 @@ org.owasp.csrfguard.protected.scratchieAuthoringRemoveItem=/lams/tool/lascrt11/authoring/removeItem.do org.owasp.csrfguard.protected.scratchieMonitoringExportExcel=/lams/tool/lascrt11/monitoring/exportExcel.do org.owasp.csrfguard.protected.scratchieMonitoringSubmissionDeadline=/lams/tool/lascrt11/monitoring/setSubmissionDeadline.do +org.owasp.csrfguard.protected.scratchieMonitoringChangeLeader=/lams/tool/lascrt11/monitoring/changeLeaderForGroup.do org.owasp.csrfguard.protected.scratchieTblMonitoringExportExcel=/lams/tool/lascrt11/tblmonitoring/exportExcel.do org.owasp.csrfguard.protected.scratchieSaveUserMark=/lams/tool/lascrt11/monitoring/saveUserMark.do @@ -246,6 +250,7 @@ org.owasp.csrfguard.protected.voteAuthoringAddNomination=/lams/tool/lavote11/authoring/addSingleNomination.do org.owasp.csrfguard.protected.voteAuthoringRemoveNomination=/lams/tool/lavote11/authoring/removeNomination.do org.owasp.csrfguard.protected.voteMonitoringSubmissionDeadline=/lams/tool/lavote11/monitoring/setSubmissionDeadline.do +org.owasp.csrfguard.protected.voteMonitoringChangeLeader=/lams/tool/lavote11/monitoring/changeLeaderForGroup.do org.owasp.csrfguard.protected.voteHideOpenVote=/lams/tool/lavote11/monitoring/hideOpenVote.do org.owasp.csrfguard.protected.voteShowOpenVote=/lams/tool/lavote11/monitoring/showOpenVote.do Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/assessmentApplicationContext.xml =================================================================== diff -u -rbfad24196397ef8759dd17934284e5dfdbc45ff6 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/assessmentApplicationContext.xml (.../assessmentApplicationContext.xml) (revision bfad24196397ef8759dd17934284e5dfdbc45ff6) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/assessmentApplicationContext.xml (.../assessmentApplicationContext.xml) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -150,6 +150,7 @@ PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,+java.lang.Exception + PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,+java.lang.Exception PROPAGATION_REQUIRED,+java.lang.Exception Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rea8629a2ce87bf6bf4b91e1b1d47b908a3dd2e74 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision ea8629a2ce87bf6bf4b91e1b1d47b908a3dd2e74) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -4015,6 +4015,10 @@ @Override public void changeLeaderForGroup(long toolSessionId, long leaderUserId) { AssessmentSession session = getSessionBySessionId(toolSessionId); + if (AssessmentConstants.COMPLETED == session.getStatus()) { + throw new InvalidParameterException("Attempting to assing a new leader with user ID " + leaderUserId + + " to a finished session wtih ID " + toolSessionId); + } AssessmentUser existingLeader = session.getGroupLeader(); if (existingLeader == null || existingLeader.getUserId().equals(leaderUserId)) { @@ -4029,27 +4033,28 @@ throw new InvalidParameterException("User with ID " + leaderUserId + " belongs to session with ID " + newLeader.getSession().getSessionId() + " and not to session with ID " + toolSessionId); } - AssessmentResult existingLeaderResult = getLastAssessmentResult(assessment.getUid(), - existingLeader.getUserId()); - if (existingLeaderResult == null) { - return; - } - if (existingLeaderResult.getFinishDate() != null) { - throw new InvalidParameterException( - "Attempting to assing a finished result of leader with user ID " + existingLeader.getUserId() - + " to a new leader with user ID " + leaderUserId + " in session wtih ID " + toolSessionId); - } + AssessmentResult newLeaderResult = getLastAssessmentResult(assessment.getUid(), leaderUserId); if (newLeaderResult != null) { assessmentDao.delete(newLeaderResult); } - + + AssessmentResult existingLeaderResult = getLastAssessmentResult(assessment.getUid(), + existingLeader.getUserId()); + if (existingLeaderResult != null) { + if (existingLeaderResult.getFinishDate() != null) { + throw new InvalidParameterException("Attempting to assing a finished result of leader with user ID " + + existingLeader.getUserId() + " to a new leader with user ID " + leaderUserId + + " in session wtih ID " + toolSessionId); + } + + existingLeaderResult.setUser(newLeader); + assessmentDao.update(existingLeaderResult); + } + session.setGroupLeader(newLeader); assessmentDao.update(session); - existingLeaderResult.setUser(newLeader); - assessmentDao.update(existingLeaderResult); - Set userIds = session.getAssessmentUsers().stream().collect( Collectors.mapping(assessmentUser -> assessmentUser.getUserId().intValue(), Collectors.toSet())); Index: lams_tool_assessment/web/pages/monitoring/summary.jsp =================================================================== diff -u -rea8629a2ce87bf6bf4b91e1b1d47b908a3dd2e74 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision ea8629a2ce87bf6bf4b91e1b1d47b908a3dd2e74) +++ lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -663,6 +663,7 @@ }); } + // END OF TIME LIMIT function showChangeLeaderModal(toolSessionId) { $('#change-leader-modals').empty() @@ -695,7 +696,6 @@ } } - // END OF TIME LIMIT Index: lams_tool_laqa/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r0b845931db55d90f0dcabc0b33cce5c7df688153 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_laqa/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 0b845931db55d90f0dcabc0b33cce5c7df688153) +++ lams_tool_laqa/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -224,3 +224,6 @@ label.title = Question title label.title.required = Title is required label.save.question.new.version = Save as new version +label.monitoring.change.leader = Change leader +label.monitoring.leader.successfully.changed = Leader changed +label.monitoring.leader.not.changed = Leader was not changed \ No newline at end of file Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dto/GroupDTO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dto/GroupDTO.java (.../GroupDTO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/dto/GroupDTO.java (.../GroupDTO.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -21,11 +21,8 @@ * **************************************************************** */ - package org.lamsfoundation.lams.tool.qa.dto; -import java.util.List; - import org.apache.commons.lang.builder.ToStringBuilder; /** @@ -41,12 +38,13 @@ private String sessionName; - private List groupData; + private int numberOfLearners; + private boolean sessionFinished; + @Override public String toString() { - return new ToStringBuilder(this).append("sessionId:", sessionId).append("sessionName:", sessionName) - .append("groupData: ", groupData).toString(); + return new ToStringBuilder(this).append("sessionId:", sessionId).append("sessionName:", sessionName).toString(); } @Override @@ -61,21 +59,6 @@ } /** - * @return Returns the groupData. - */ - public List getGroupData() { - return groupData; - } - - /** - * @param groupData - * The groupData to set. - */ - public void setGroupData(List groupData) { - this.groupData = groupData; - } - - /** * @return Returns the sessionName. */ public String getSessionName() { @@ -104,4 +87,20 @@ public void setSessionId(String sessionId) { this.sessionId = sessionId; } + + public int getNumberOfLearners() { + return numberOfLearners; + } + + public void setNumberOfLearners(int numberOfLearners) { + this.numberOfLearners = numberOfLearners; + } + + public boolean isSessionFinished() { + return sessionFinished; + } + + public void setSessionFinished(boolean sessionFinished) { + this.sessionFinished = sessionFinished; + } } Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/qaApplicationContext.xml =================================================================== diff -u -r646ad3f8f14c7577e5a1e863f31dacca0c38e860 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/qaApplicationContext.xml (.../qaApplicationContext.xml) (revision 646ad3f8f14c7577e5a1e863f31dacca0c38e860) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/qaApplicationContext.xml (.../qaApplicationContext.xml) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -80,6 +80,7 @@ + @@ -88,6 +89,7 @@ PROPAGATION_REQUIRED + PROPAGATION_REQUIRED,-QaApplicationException PROPAGATION_REQUIRED,-QaApplicationException PROPAGATION_REQUIRED,-QaApplicationException PROPAGATION_REQUIRED,-QaApplicationException Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java =================================================================== diff -u -r02ce40b60524aa33d326fbda824dcd43f566ab94 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java (.../IQaService.java) (revision 02ce40b60524aa33d326fbda824dcd43f566ab94) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java (.../IQaService.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -91,7 +91,7 @@ QaContent getQaContent(long toolContentId); void saveOrUpdateQaContent(QaContent qa); - + void releaseFromCache(Object object); void updateUser(QaQueUsr qaQueUsr); @@ -199,7 +199,7 @@ Long createNotebookEntry(Long id, Integer idType, String signature, Integer userID, String entry); NotebookEntry getEntry(Long id, Integer idType, String signature, Integer userID); - + String finishToolSession(Long toolSessionID, Long userID); /** @@ -256,10 +256,7 @@ int getCountUsersBySessionWithSearch(Long toolSessionId, String searchString); - /** - * notifyTeachersOnResponseSubmit - * - * @param sessionId - */ void notifyTeachersOnResponseSubmit(Long sessionId); + + void changeLeaderForGroup(long toolSessionId, long leaderUserId); } \ No newline at end of file Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaService.java =================================================================== diff -u -r0b845931db55d90f0dcabc0b33cce5c7df688153 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaService.java (.../QaService.java) (revision 0b845931db55d90f0dcabc0b33cce5c7df688153) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaService.java (.../QaService.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -23,6 +23,7 @@ package org.lamsfoundation.lams.tool.qa.service; +import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -31,6 +32,7 @@ import java.util.Set; import java.util.SortedMap; import java.util.TreeSet; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -39,6 +41,7 @@ import org.lamsfoundation.lams.confidencelevel.ConfidenceLevelDTO; import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; import org.lamsfoundation.lams.events.IEventNotificationService; +import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learningdesign.service.ExportToolContentException; import org.lamsfoundation.lams.learningdesign.service.IExportToolContentService; import org.lamsfoundation.lams.learningdesign.service.ImportToolContentException; @@ -88,6 +91,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; /** @@ -107,6 +111,7 @@ private IToolContentHandler qaToolContentHandler = null; private IUserManagementService userManagementService; + private ILearnerService learnerService; private ILamsToolService toolService; private ILogEventService logEventService; private IExportToolContentService exportContentService; @@ -543,6 +548,47 @@ } @Override + public void changeLeaderForGroup(long toolSessionId, long leaderUserId) { + QaSession session = getSessionById(toolSessionId); + if (QaAppConstants.COMPLETED.equals(session.getSession_status())) { + throw new InvalidParameterException("Attempting to assing a new leader with user ID " + leaderUserId + + " to a finished session wtih ID " + toolSessionId); + } + + QaQueUsr existingLeader = session.getGroupLeader(); + if (existingLeader == null || existingLeader.getQueUsrId().equals(leaderUserId)) { + return; + } + + QaQueUsr newLeader = getUserByIdAndSession(leaderUserId, toolSessionId); + if (newLeader == null) { + return; + } + + session.setGroupLeader(newLeader); + qaSessionDAO.UpdateQaSession(session); + + List newLeaderResponses = getResponsesByUserUid(newLeader.getUid()); + for (QaUsrResp response : newLeaderResponses) { + qaUsrRespDAO.removeUserResponse(response); + } + + List existingLeaderResponses = getResponsesByUserUid(existingLeader.getUid()); + for (QaUsrResp response : existingLeaderResponses) { + response.setQaQueUser(newLeader); + qaUsrRespDAO.updateUserResponse(response); + } + + Set userIds = session.getQaQueUsers().stream() + .collect(Collectors.mapping(qaQueUsr -> qaQueUsr.getQueUsrId().intValue(), Collectors.toSet())); + + ObjectNode jsonCommand = JsonNodeFactory.instance.objectNode(); + jsonCommand.put("hookTrigger", "qa-leader-change-refresh-" + toolSessionId); + learnerService.createCommandForLearners(session.getQaContent().getQaContentId(), userIds, + jsonCommand.toString()); + } + + @Override public void exportToolContent(Long toolContentID, String rootPath) { QaContent toolContentObj = qaDAO.getQaByContentId(toolContentID); if (toolContentObj == null) { @@ -963,6 +1009,10 @@ this.userManagementService = userManagementService; } + public void setLearnerService(ILearnerService learnerService) { + this.learnerService = learnerService; + } + public void setToolService(ILamsToolService toolService) { this.toolService = toolService; } Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/MonitoringController.java =================================================================== diff -u -rf7937adfea85b6a6976eaa98df8c68db93f9f060 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/MonitoringController.java (.../MonitoringController.java) (revision f7937adfea85b6a6976eaa98df8c68db93f9f060) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/MonitoringController.java (.../MonitoringController.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -60,11 +60,14 @@ import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.util.HtmlUtils; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -125,6 +128,8 @@ GroupDTO groupDTO = new GroupDTO(); groupDTO.setSessionName(sessionName); groupDTO.setSessionId(sessionId); + groupDTO.setNumberOfLearners(session.getQaQueUsers().size()); + groupDTO.setSessionFinished(QaAppConstants.COMPLETED.equals(session.getSession_status())); groupDTOs.add(groupDTO); } request.setAttribute(LIST_ALL_GROUPS_DTO, groupDTOs); @@ -279,7 +284,8 @@ */ @RequestMapping(path = "/getReflectionsJSON") @ResponseBody - public String getReflectionsJSON(HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException, ToolException { + public String getReflectionsJSON(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException, ToolException { Long toolSessionId = WebUtil.readLongParam(request, QaAppConstants.TOOL_SESSION_ID); @@ -396,4 +402,11 @@ return "monitoring/PrintAnswers"; } + @RequestMapping(path = "/changeLeaderForGroup", method = RequestMethod.POST) + @ResponseBody + @ResponseStatus(HttpStatus.OK) + public void changeLeaderForGroup(@RequestParam(name = AttributeNames.PARAM_TOOL_SESSION_ID) long toolSessionId, + @RequestParam long leaderUserId) { + qaService.changeLeaderForGroup(toolSessionId, leaderUserId); + } } \ No newline at end of file Index: lams_tool_laqa/web/learning/AnswersContent.jsp =================================================================== diff -u -r3f64433c4c8241c2ecccac71a380267db16b7ea9 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_laqa/web/learning/AnswersContent.jsp (.../AnswersContent.jsp) (revision 3f64433c4c8241c2ecccac71a380267db16b7ea9) +++ lams_tool_laqa/web/learning/AnswersContent.jsp (.../AnswersContent.jsp) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -189,6 +189,16 @@ }); + <%-- Connect to command websocket only if it is learner UI --%> + + // command websocket stuff for refreshing + // trigger is an unique ID of page and action that command websocket code in Page.tag recognises + commandWebsocketHookTrigger = 'qa-leader-change-refresh-${generalLearnerFlowDTO.toolSessionID}'; + // if the trigger is recognised, the following action occurs + commandWebsocketHook = function() { + location.reload(); + }; + }); Index: lams_tool_laqa/web/learning/LearnerRep.jsp =================================================================== diff -u -r36d2b202c46c01cb52641a06cf62f4325b288188 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_laqa/web/learning/LearnerRep.jsp (.../LearnerRep.jsp) (revision 36d2b202c46c01cb52641a06cf62f4325b288188) +++ lams_tool_laqa/web/learning/LearnerRep.jsp (.../LearnerRep.jsp) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -264,6 +264,7 @@ jQuery("time.timeago").timeago(); }); }); + }); function refreshPage(reload) { Index: lams_tool_laqa/web/monitoring/MonitoringMaincontent.jsp =================================================================== diff -u -re6dc4db4137cfd6b07a4aa79711b9d12b39fb78e -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_laqa/web/monitoring/MonitoringMaincontent.jsp (.../MonitoringMaincontent.jsp) (revision e6dc4db4137cfd6b07a4aa79711b9d12b39fb78e) +++ lams_tool_laqa/web/monitoring/MonitoringMaincontent.jsp (.../MonitoringMaincontent.jsp) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -319,6 +319,38 @@ function doSelectTab(tabId) { selectTab(tabId); } + + + function showChangeLeaderModal(toolSessionId) { + $('#change-leader-modals').empty() + .load('tool/lalead11/monitoring/displayChangeLeaderForGroupDialogFromActivity.do',{ + toolSessionId : toolSessionId + }); + } + + function onChangeLeaderCallback(response, leaderUserId, toolSessionId){ + if (response.isSuccessful) { + $.ajax({ + 'url' : '', + 'type': 'post', + 'cache' : 'false', + 'data': { + 'toolSessionID' : toolSessionId, + 'leaderUserId' : leaderUserId, + '' : '' + }, + success : function(){ + alert(""); + }, + error : function(){ + alert(""); + } + }); + + } else { + alert(""); + } + } Index: lams_tool_laqa/web/monitoring/SummaryContent.jsp =================================================================== diff -u -rf0997a08e6b5eeae233351103cfe619432f88016 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_laqa/web/monitoring/SummaryContent.jsp (.../SummaryContent.jsp) (revision f0997a08e6b5eeae233351103cfe619432f88016) +++ lams_tool_laqa/web/monitoring/SummaryContent.jsp (.../SummaryContent.jsp) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -32,6 +32,12 @@ : + + +
-<%@include file="dateRestriction.jsp"%> \ No newline at end of file +<%@include file="dateRestriction.jsp"%> + +
\ No newline at end of file Index: lams_tool_sbmt/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r0b845931db55d90f0dcabc0b33cce5c7df688153 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_sbmt/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 0b845931db55d90f0dcabc0b33cce5c7df688153) +++ lams_tool_sbmt/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -163,3 +163,6 @@ label.enable.min.limit = Set minimum number of files to upload label.should.upload.another = Minimum number of files to be uploaded: {0} outcome.authoring.create.new = [create new] +label.monitoring.change.leader = Change leader +label.monitoring.leader.successfully.changed = Leader changed +label.monitoring.leader.not.changed = Leader was not changed \ No newline at end of file Index: lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/dto/SessionDTO.java =================================================================== diff -u -r62aaf160878735888d077bf28fac3c1989bb8fbd -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/dto/SessionDTO.java (.../SessionDTO.java) (revision 62aaf160878735888d077bf28fac3c1989bb8fbd) +++ lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/dto/SessionDTO.java (.../SessionDTO.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -32,9 +32,13 @@ private Long sessionID; private String sessionName; - + private boolean marksReleased; + private int numberOfLearners; + + private boolean sessionFinished; + public Long getSessionID() { return sessionID; } @@ -50,7 +54,7 @@ public void setSessionName(String sessionName) { this.sessionName = sessionName; } - + public boolean isMarksReleased() { return marksReleased; } @@ -59,4 +63,19 @@ this.marksReleased = marksReleased; } -} + public int getNumberOfLearners() { + return numberOfLearners; + } + + public void setNumberOfLearners(int numberOfLearners) { + this.numberOfLearners = numberOfLearners; + } + + public boolean isSessionFinished() { + return sessionFinished; + } + + public void setSessionFinished(boolean sessionFinished) { + this.sessionFinished = sessionFinished; + } +} \ No newline at end of file Index: lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/service/ISubmitFilesService.java =================================================================== diff -u -r5c1bac8c09133d94e7134da9b42e6652a51c15bd -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/service/ISubmitFilesService.java (.../ISubmitFilesService.java) (revision 5c1bac8c09133d94e7134da9b42e6652a51c15bd) +++ lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/service/ISubmitFilesService.java (.../ISubmitFilesService.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -348,9 +348,6 @@ /** * Set specified user as a leader. Also the previous leader (if any) is marked as non-leader. - * - * @param userId - * @param toolSessionID */ SubmitUser checkLeaderSelectToolForSessionLeader(SubmitUser user, Long toolSessionID); @@ -359,13 +356,9 @@ */ void createUser(SubmitUser submitUser); - /** - * @param userId - * @param toolSessionId - * @return - */ boolean isUserGroupLeader(Long userId, Long toolSessionId); void copyLearnerContent(SubmitUser fromUser, SubmitUser toUser); + void changeLeaderForGroup(long toolSessionId, int leaderUserId); } Index: lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/service/SubmitFilesService.java =================================================================== diff -u -r0b845931db55d90f0dcabc0b33cce5c7df688153 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/service/SubmitFilesService.java (.../SubmitFilesService.java) (revision 0b845931db55d90f0dcabc0b33cce5c7df688153) +++ lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/service/SubmitFilesService.java (.../SubmitFilesService.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -40,6 +40,7 @@ import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; +import java.util.stream.Collectors; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -49,6 +50,7 @@ import org.lamsfoundation.lams.contentrepository.exception.InvalidParameterException; import org.lamsfoundation.lams.contentrepository.exception.RepositoryCheckedException; import org.lamsfoundation.lams.events.IEventNotificationService; +import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learningdesign.service.ExportToolContentException; import org.lamsfoundation.lams.learningdesign.service.IExportToolContentService; import org.lamsfoundation.lams.learningdesign.service.ImportToolContentException; @@ -92,6 +94,7 @@ import org.springframework.dao.DataAccessException; import org.springframework.web.multipart.MultipartFile; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; /** @@ -122,6 +125,8 @@ private IUserManagementService userManagementService; + private ILearnerService learnerService; + private IEventNotificationService eventNotificationService; private MessageService messageService; @@ -1238,6 +1243,10 @@ this.userManagementService = userManagementService; } + public void setLearnerService(ILearnerService learnerService) { + this.learnerService = learnerService; + } + @Override public IEventNotificationService getEventNotificationService() { return eventNotificationService; @@ -1374,6 +1383,49 @@ } @Override + public void changeLeaderForGroup(long toolSessionId, int leaderUserId) { + SubmitFilesSession session = getSessionById(toolSessionId); + if (session.getStatus() != null && session.getStatus().equals(SubmitFilesSession.COMPLETED)) { + throw new java.security.InvalidParameterException("Attempting to assing a new leader with user ID " + + leaderUserId + " to a finished session wtih ID " + toolSessionId); + } + + SubmitUser existingLeader = session.getGroupLeader(); + if (existingLeader == null || existingLeader.getUserID().equals(leaderUserId)) { + return; + } + + SubmitUser newLeader = getSessionUser(toolSessionId, leaderUserId); + if (newLeader == null) { + return; + } + + session.setGroupLeader(newLeader); + submitFilesSessionDAO.update(session); + + List newLeaderSubmissions = submissionDetailsDAO.getBySessionAndLearner(toolSessionId, + leaderUserId); + for (SubmissionDetails submission : newLeaderSubmissions) { + submissionDetailsDAO.delete(submission); + } + + List existingLeaderSubmissions = submissionDetailsDAO.getBySessionAndLearner(toolSessionId, + existingLeader.getUserID()); + + for (SubmissionDetails submission : existingLeaderSubmissions) { + submission.setLearner(newLeader); + submissionDetailsDAO.update(submission); + } + + Set userIds = getUsersBySession(toolSessionId).stream() + .collect(Collectors.mapping(submitUser -> submitUser.getUserID(), Collectors.toSet())); + + ObjectNode jsonCommand = JsonNodeFactory.instance.objectNode(); + jsonCommand.put("hookTrigger", "submit-files-leader-change-refresh-" + toolSessionId); + learnerService.createCommandForLearners(session.getContent().getContentID(), userIds, jsonCommand.toString()); + } + + @Override public void createUser(SubmitUser submitUser) { // make sure the user was not created in the meantime SubmitUser user = submitUserDAO.getLearner(submitUser.getSessionID(), submitUser.getUserID()); Index: lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/submitFilesApplicationContext.xml =================================================================== diff -u -r01c2a55767c613282c319ed8b38a0c78712e3661 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/submitFilesApplicationContext.xml (.../submitFilesApplicationContext.xml) (revision 01c2a55767c613282c319ed8b38a0c78712e3661) +++ lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/submitFilesApplicationContext.xml (.../submitFilesApplicationContext.xml) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -53,6 +53,7 @@ + @@ -75,6 +76,7 @@ PROPAGATION_REQUIRED + PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED Index: lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/web/controller/MonitoringController.java =================================================================== diff -u -rf387f22d1d29e552262b9b538a3b46c1b766a3c7 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/web/controller/MonitoringController.java (.../MonitoringController.java) (revision f387f22d1d29e552262b9b538a3b46c1b766a3c7) +++ lams_tool_sbmt/src/java/org/lamsfoundation/lams/tool/sbmt/web/controller/MonitoringController.java (.../MonitoringController.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -64,13 +64,16 @@ import org.lamsfoundation.lams.web.util.AttributeNames; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.util.HtmlUtils; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -555,6 +558,14 @@ } } + @RequestMapping(path = "/changeLeaderForGroup", method = RequestMethod.POST) + @ResponseBody + @ResponseStatus(HttpStatus.OK) + public void changeLeaderForGroup(@RequestParam(name = AttributeNames.PARAM_TOOL_SESSION_ID) long toolSessionId, + @RequestParam int leaderUserId) { + submitFilesService.changeLeaderForGroup(toolSessionId, leaderUserId); + } + // ********************************************************** // Private methods // ********************************************************** @@ -575,6 +586,9 @@ sessionDto.setSessionID(sessionID); sessionDto.setSessionName(sfs.getSessionName()); sessionDto.setMarksReleased(sfs.isMarksReleased()); + sessionDto.setNumberOfLearners(submitFilesService.getCountUsersBySession(sessionID, null)); + sessionDto.setSessionFinished( + sfs.getStatus() != null && sfs.getStatus().equals(SubmitFilesSession.COMPLETED)); sessions.add(sessionDto); } Index: lams_tool_sbmt/web/learner/sbmtlearner.jsp =================================================================== diff -u -r80f23aae24a17df9dfcd1770f396aaba0d0650c3 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_sbmt/web/learner/sbmtlearner.jsp (.../sbmtlearner.jsp) (revision 80f23aae24a17df9dfcd1770f396aaba0d0650c3) +++ lams_tool_sbmt/web/learner/sbmtlearner.jsp (.../sbmtlearner.jsp) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -43,6 +43,17 @@ if ($('#file-upload-area').length == 1) { initFileUpload('${learnerForm.tmpFileUploadId}', ''); } + + <%-- Connect to command websocket only if it is learner UI --%> + + // command websocket stuff for refreshing + // trigger is an unique ID of page and action that command websocket code in Page.tag recognises + commandWebsocketHookTrigger = 'submit-files-leader-change-refresh-${sessionMap.toolSessionID}'; + // if the trigger is recognised, the following action occurs + commandWebsocketHook = function() { + location.reload(); + }; + }); /** Index: lams_tool_sbmt/web/learner/waitforleader.jsp =================================================================== diff -u -rea8629a2ce87bf6bf4b91e1b1d47b908a3dd2e74 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_sbmt/web/learner/waitforleader.jsp (.../waitforleader.jsp) (revision ea8629a2ce87bf6bf4b91e1b1d47b908a3dd2e74) +++ lams_tool_sbmt/web/learner/waitforleader.jsp (.../waitforleader.jsp) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -16,6 +16,19 @@ //refresh page every 30 sec setTimeout("refresh();",30000); + + $(document).ready(function(){ + <%-- Connect to command websocket only if it is learner UI --%> + + // command websocket stuff for refreshing + // trigger is an unique ID of page and action that command websocket code in Page.tag recognises + commandWebsocketHookTrigger = 'submit-files-leader-change-refresh-${sessionMap.toolSessionID}'; + // if the trigger is recognised, the following action occurs + commandWebsocketHook = function() { + location.reload(); + }; + + }); Index: lams_tool_sbmt/web/monitoring/parts/summary.jsp =================================================================== diff -u -r5f9e583fc8e476f6a5f9e1826332ba3788d7c68c -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_sbmt/web/monitoring/parts/summary.jsp (.../summary.jsp) (revision 5f9e583fc8e476f6a5f9e1826332ba3788d7c68c) +++ lams_tool_sbmt/web/monitoring/parts/summary.jsp (.../summary.jsp) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -141,6 +141,38 @@ } }); } + + + function showChangeLeaderModal(toolSessionId) { + $('#change-leader-modals').empty() + .load('tool/lalead11/monitoring/displayChangeLeaderForGroupDialogFromActivity.do',{ + toolSessionId : toolSessionId + }); + } + + function onChangeLeaderCallback(response, leaderUserId, toolSessionId){ + if (response.isSuccessful) { + $.ajax({ + 'url' : '', + 'type': 'post', + 'cache' : 'false', + 'data': { + 'toolSessionID' : toolSessionId, + 'leaderUserId' : leaderUserId, + '' : '' + }, + success : function(){ + alert(""); + }, + error : function(){ + alert(""); + } + }); + + } else { + alert(""); + } + }
@@ -172,6 +204,12 @@ aria-expanded="${status.first ? 'false' : 'true'}" aria-controls="collapse${sessionDto.sessionID}" > : + + +
@@ -223,3 +261,5 @@ <%@ include file="advanceoptions.jsp"%> <%@include file="daterestriction.jsp"%> + +
\ No newline at end of file Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/scratchieApplicationContext.xml =================================================================== diff -u -rd9a9f033cd1e6050279d05ef7cbca24f243ecf6a -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/scratchieApplicationContext.xml (.../scratchieApplicationContext.xml) (revision d9a9f033cd1e6050279d05ef7cbca24f243ecf6a) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/scratchieApplicationContext.xml (.../scratchieApplicationContext.xml) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -144,6 +144,7 @@ PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED PROPAGATION_REQUIRED,-java.lang.Exception + PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception Index: lams_tool_vote/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r0b845931db55d90f0dcabc0b33cce5c7df688153 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_vote/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 0b845931db55d90f0dcabc0b33cce5c7df688153) +++ lams_tool_vote/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -157,3 +157,6 @@ outcome.authoring.existing.none = none outcome.authoring.remove.confirm = Are you sure you want to remove this learning outcome? outcome.authoring.create.new = [create new] +label.monitoring.change.leader = Change leader +label.monitoring.leader.successfully.changed = Leader changed +label.monitoring.leader.not.changed = Leader was not changed \ No newline at end of file Index: lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/dto/SessionDTO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/dto/SessionDTO.java (.../SessionDTO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/dto/SessionDTO.java (.../SessionDTO.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -243,4 +243,4 @@ public void setSessionName(String sessionName) { this.sessionName = sessionName; } -} +} \ No newline at end of file Index: lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/dto/SummarySessionDTO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/dto/SummarySessionDTO.java (.../SummarySessionDTO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/dto/SummarySessionDTO.java (.../SummarySessionDTO.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -33,6 +33,8 @@ private Long sessionUid; private Long toolSessionId; private String sessionName; + private int sessionUserCount; + private boolean sessionFinished; private SortedSet nominations; private Integer openTextNumberOfVotes; private Double openTextPercentageOfVotes; @@ -85,6 +87,22 @@ this.toolSessionId = toolSessionId; } + public int getSessionUserCount() { + return sessionUserCount; + } + + public void setSessionUserCount(int sessionUserCount) { + this.sessionUserCount = sessionUserCount; + } + + public boolean isSessionFinished() { + return sessionFinished; + } + + public void setSessionFinished(boolean sessionFinished) { + this.sessionFinished = sessionFinished; + } + public SortedSet getNominations() { return nominations; } Index: lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/service/IVoteService.java =================================================================== diff -u -r713a4d2055ba7766354709db2ae65dacfb5d2b1a -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/service/IVoteService.java (.../IVoteService.java) (revision 713a4d2055ba7766354709db2ae65dacfb5d2b1a) +++ lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/service/IVoteService.java (.../IVoteService.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -277,4 +277,6 @@ int getCountUsersForOpenTextEntries(Long sessionUid, Long contentUid, String searchStringVote, String searchStringUsername); + + void changeLeaderForGroup(long toolSessionId, long leaderUserId); } \ No newline at end of file Index: lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/service/VoteService.java =================================================================== diff -u -r0b845931db55d90f0dcabc0b33cce5c7df688153 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/service/VoteService.java (.../VoteService.java) (revision 0b845931db55d90f0dcabc0b33cce5c7df688153) +++ lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/service/VoteService.java (.../VoteService.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -22,6 +22,7 @@ package org.lamsfoundation.lams.tool.vote.service; +import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -37,6 +38,7 @@ import java.util.TimeZone; import java.util.TreeMap; import java.util.TreeSet; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -45,6 +47,7 @@ import org.apache.log4j.Logger; import org.lamsfoundation.lams.confidencelevel.ConfidenceLevelDTO; import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; +import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learningdesign.DataFlowObject; import org.lamsfoundation.lams.learningdesign.dao.IDataFlowDAO; import org.lamsfoundation.lams.learningdesign.service.ExportToolContentException; @@ -102,6 +105,7 @@ import org.springframework.dao.DataAccessException; import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; /** @@ -120,6 +124,7 @@ private IVoteUserDAO voteUserDAO; private IVoteUsrAttemptDAO voteUsrAttemptDAO; private IUserManagementService userManagementService; + private ILearnerService learnerService; private ILogEventService logEventService; private ILamsToolService toolService; private IExportToolContentService exportContentService; @@ -224,6 +229,44 @@ } @Override + public void changeLeaderForGroup(long toolSessionId, long leaderUserId) { + VoteSession session = getSessionBySessionId(toolSessionId); + if (VoteAppConstants.COMPLETED.equals(session.getSessionStatus())) { + throw new InvalidParameterException("Attempting to assing a new leader with user ID " + leaderUserId + + " to a finished session wtih ID " + toolSessionId); + } + + VoteQueUsr existingLeader = session.getGroupLeader(); + if (existingLeader == null || existingLeader.getQueUsrId().equals(leaderUserId)) { + return; + } + + VoteQueUsr newLeader = getVoteUserBySession(leaderUserId, session.getUid()); + if (newLeader == null) { + return; + } + + session.setGroupLeader(newLeader); + voteSessionDAO.updateVoteSession(session); + + voteUsrAttemptDAO.removeAttemptsForUserandSession(existingLeader.getQueUsrId(), toolSessionId); + + for (VoteUsrAttempt vote : existingLeader.getVoteUsrAttempts()) { + vote.setVoteQueUsr(newLeader); + voteUsrAttemptDAO.updateVoteUsrAttempt(vote); + + } + + Set userIds = session.getVoteQueUsers().stream() + .collect(Collectors.mapping(voteUser -> voteUser.getQueUsrId().intValue(), Collectors.toSet())); + + ObjectNode jsonCommand = JsonNodeFactory.instance.objectNode(); + jsonCommand.put("hookTrigger", "vote-leader-change-refresh-" + toolSessionId); + learnerService.createCommandForLearners(session.getVoteContent().getVoteContentId(), userIds, + jsonCommand.toString()); + } + + @Override public VoteGeneralLearnerFlowDTO prepareChartData(HttpServletRequest request, Long toolContentID, Long toolSessionUid, VoteGeneralLearnerFlowDTO voteGeneralLearnerFlowDTO) { @@ -467,6 +510,8 @@ sessionDTO.setSessionUid(session.getUid()); sessionDTO.setToolSessionId(session.getVoteSessionId()); sessionDTO.setNominations(new TreeSet()); + sessionDTO.setSessionUserCount(session.getVoteQueUsers().size()); + sessionDTO.setSessionFinished(VoteAppConstants.COMPLETED.equals(session.getSessionStatus())); int entriesCount = voteUsrAttemptDAO.getSessionEntriesCount(session.getUid()); @@ -1740,6 +1785,10 @@ this.userManagementService = userManagementService; } + public void setLearnerService(ILearnerService learnerService) { + this.learnerService = learnerService; + } + public void setToolService(ILamsToolService toolService) { this.toolService = toolService; } Index: lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/voteApplicationContext.xml =================================================================== diff -u -r01c2a55767c613282c319ed8b38a0c78712e3661 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/voteApplicationContext.xml (.../voteApplicationContext.xml) (revision 01c2a55767c613282c319ed8b38a0c78712e3661) +++ lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/voteApplicationContext.xml (.../voteApplicationContext.xml) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -79,12 +79,14 @@ + PROPAGATION_REQUIRED PROPAGATION_REQUIRED + PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED Index: lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/web/controller/MonitoringController.java =================================================================== diff -u -r0e7d403e91b0916fd3842d8d3098b1c466d28ece -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 0e7d403e91b0916fd3842d8d3098b1c466d28ece) +++ lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/web/controller/MonitoringController.java (.../MonitoringController.java) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -55,11 +55,14 @@ import org.lamsfoundation.lams.web.util.AttributeNames; import org.lamsfoundation.lams.web.util.SessionMap; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.util.HtmlUtils; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -427,6 +430,14 @@ return "/monitoring/MonitoringMaincontent"; } + @RequestMapping(path = "/changeLeaderForGroup", method = RequestMethod.POST) + @ResponseBody + @ResponseStatus(HttpStatus.OK) + public void changeLeaderForGroup(@RequestParam(name = AttributeNames.PARAM_TOOL_SESSION_ID) long toolSessionId, + @RequestParam long leaderUserId) { + voteService.changeLeaderForGroup(toolSessionId, leaderUserId); + } + public static Map convertToVoteMonitoredUserDTOMap(List list) { Map map = new TreeMap<>(new VoteComparator()); Index: lams_tool_vote/web/learning/AnswersContent.jsp =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_vote/web/learning/AnswersContent.jsp (.../AnswersContent.jsp) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_vote/web/learning/AnswersContent.jsp (.../AnswersContent.jsp) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -88,33 +88,42 @@ }); } - $(document) - .ready( - function() { + $(document).ready(function() { - var mode = "${voteGeneralLearnerFlowDTO.learningMode}"; - var isUserLeader = ($('[name="userLeader"]').val() === "true"); - var isLeadershipEnabled = ($( - '[name="useSelectLeaderToolOuput"]').val() === "true"); - var hasEditRight = !isLeadershipEnabled - || isLeadershipEnabled && isUserLeader; + var mode = "${voteGeneralLearnerFlowDTO.learningMode}"; + var isUserLeader = ($('[name="userLeader"]').val() === "true"); + var isLeadershipEnabled = ($( + '[name="useSelectLeaderToolOuput"]').val() === "true"); + var hasEditRight = !isLeadershipEnabled + || isLeadershipEnabled && isUserLeader; - if (!hasEditRight && (mode != "teacher")) { - setInterval("checkLeaderProgress();", 60000);// Auto-Refresh every 1 minute for non-leaders - } + if (!hasEditRight && (mode != "teacher")) { + setInterval("checkLeaderProgress();", 60000);// Auto-Refresh every 1 minute for non-leaders + } - if (!hasEditRight) { - $('[name="userEntry"]').prop('disabled', true); - $('[name="checkedVotes"]').prop('disabled', - true); - $('[name="continueOptionsCombined"]').hide(); - } - }); + if (!hasEditRight) { + $('[name="userEntry"]').prop('disabled', true); + $('[name="checkedVotes"]').prop('disabled', + true); + $('[name="continueOptionsCombined"]').hide(); + } + + + <%-- Connect to command websocket only if it is learner UI --%> + + // command websocket stuff for refreshing + // trigger is an unique ID of page and action that command websocket code in Page.tag recognises + commandWebsocketHookTrigger = 'vote-leader-change-refresh-${voteLearningForm.toolSessionID}'; + // if the trigger is recognised, the following action occurs + commandWebsocketHook = function() { + location.reload(); + }; + + }); - Index: lams_tool_vote/web/monitoring/AllSessionsSummary.jsp =================================================================== diff -u -r0263eb24aa95e83aaeeb06521453c968def01fbf -rf86004309489cb81f283d1962b481b4bbb3facd6 --- lams_tool_vote/web/monitoring/AllSessionsSummary.jsp (.../AllSessionsSummary.jsp) (revision 0263eb24aa95e83aaeeb06521453c968def01fbf) +++ lams_tool_vote/web/monitoring/AllSessionsSummary.jsp (.../AllSessionsSummary.jsp) (revision f86004309489cb81f283d1962b481b4bbb3facd6) @@ -16,6 +16,12 @@