Index: lams_tool_assessment/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r0b845931db55d90f0dcabc0b33cce5c7df688153 -r30b838c2ace64169f440c86a9756fd0959cf2323 --- lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 0b845931db55d90f0dcabc0b33cce5c7df688153) +++ lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 30b838c2ace64169f440c86a9756fd0959cf2323) @@ -419,6 +419,9 @@ label.authoring.basic.import.word = MS Word label.monitoring.summary.answered.questions.y.axis.groups = Groups label.monitoring.summary.answered.questions.groups = Groups Progress +label.monotoring.change.leader = Change leader +label.monitoring.leader.successfully.changed = Leader changed +label.monitoring.leader.not.changed = Leader was not changed label.authoring.basic.question.version = Version label.authoring.basic.question.version.newer.tooltip = There is a newer version of this question label.authoring.basic.question.version.change.tooltip = Change to this version Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/SessionDTO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r30b838c2ace64169f440c86a9756fd0959cf2323 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/SessionDTO.java (.../SessionDTO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/SessionDTO.java (.../SessionDTO.java) (revision 30b838c2ace64169f440c86a9756fd0959cf2323) @@ -21,7 +21,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.tool.assessment.dto; import java.util.List; @@ -40,8 +39,10 @@ private int numberLearners; private String minMark; private String maxMark; - private String avgMark; + private String avgMark; + private boolean leaderFinished; + //used for export purposes only private List assessmentResults; @@ -118,4 +119,11 @@ this.maxMark = maxMark; } -} + public boolean isLeaderFinished() { + return leaderFinished; + } + + public void setLeaderFinished(boolean leaderFinished) { + this.leaderFinished = leaderFinished; + } +} \ No newline at end of file Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r0b845931db55d90f0dcabc0b33cce5c7df688153 -r30b838c2ace64169f440c86a9756fd0959cf2323 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 0b845931db55d90f0dcabc0b33cce5c7df688153) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 30b838c2ace64169f440c86a9756fd0959cf2323) @@ -25,6 +25,7 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.security.InvalidParameterException; import java.sql.Timestamp; import java.time.LocalDateTime; import java.util.ArrayList; @@ -1225,6 +1226,21 @@ ? NumberUtil.formatLocalisedNumber((Float) markStats[2], (Locale) null, 2) : "0.00"); } + } else if (session.getAssessment().isUseSelectLeaderToolOuput()) { + sessionDto.setNumberLearners(session.getAssessmentUsers().size()); + + AssessmentUser leader = session.getGroupLeader(); + if (leader != null) { + if (leader.isSessionFinished()) { + sessionDto.setLeaderFinished(true); + } else { + AssessmentResult result = getLastAssessmentResult(session.getAssessment().getUid(), + leader.getUserId()); + if (result != null && result.getFinishDate() != null) { + leader.setSessionFinished(true); + } + } + } } sessionDtos.add(sessionDto); @@ -3995,4 +4011,50 @@ result.putAll(answeredQuestions); return result; } + + @Override + public void changeLeaderForGroup(long toolSessionId, long leaderUserId) { + AssessmentSession session = getSessionBySessionId(toolSessionId); + + AssessmentUser existingLeader = session.getGroupLeader(); + if (existingLeader != null && existingLeader.getUserId().equals(leaderUserId)) { + return; + } + Assessment assessment = session.getAssessment(); + AssessmentUser newLeader = getUserByIdAndContent(leaderUserId, assessment.getContentId()); + if (newLeader == null) { + return; + } + if (!newLeader.getSession().getSessionId().equals(toolSessionId)) { + 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); + } + + 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())); + + ObjectNode jsonCommand = JsonNodeFactory.instance.objectNode(); + jsonCommand.put("hookTrigger", "assessment-leader-change-refresh-" + toolSessionId); + learnerService.createCommandForLearners(assessment.getContentId(), userIds, jsonCommand.toString()); + } } \ No newline at end of file Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -rd295cb9148c3c8cbe2e98de79ae41f7eba704fe9 -r30b838c2ace64169f440c86a9756fd0959cf2323 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision d295cb9148c3c8cbe2e98de79ae41f7eba704fe9) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 30b838c2ace64169f440c86a9756fd0959cf2323) @@ -553,4 +553,6 @@ List getPossibleIndividualTimeLimitUsers(long toolContentId, String searchString); Map getCountAnsweredQuestionsByUsers(long toolContentId); + + void changeLeaderForGroup(long toolSessionId, long leaderUserId); } \ No newline at end of file Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java =================================================================== diff -u -r2db58f73e88ecef930d486c60cc53fb3fa483415 -r30b838c2ace64169f440c86a9756fd0959cf2323 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 2db58f73e88ecef930d486c60cc53fb3fa483415) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 30b838c2ace64169f440c86a9756fd0959cf2323) @@ -1060,6 +1060,14 @@ service.saveOrUpdateAssessment(assessment); } + @RequestMapping(path = "/changeLeaderForGroup", method = RequestMethod.POST) + @ResponseBody + @ResponseStatus(HttpStatus.OK) + public void changeLeaderForGroup(@RequestParam(name = AssessmentConstants.PARAM_TOOL_SESSION_ID) long toolSessionId, + @RequestParam long leaderUserId) { + service.changeLeaderForGroup(toolSessionId, leaderUserId); + } + @SuppressWarnings("unchecked") private SessionMap getSessionMap(HttpServletRequest request) { String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); Index: lams_tool_assessment/web/pages/learning/learning.jsp =================================================================== diff -u -r292df3a6fb3cce2b31c9d9ee33c61bbe931e58ab -r30b838c2ace64169f440c86a9756fd0959cf2323 --- lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 292df3a6fb3cce2b31c9d9ee33c61bbe931e58ab) +++ lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 30b838c2ace64169f440c86a9756fd0959cf2323) @@ -125,6 +125,17 @@ etherpadInitMethods[groupId](); } }); + + <%-- 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 = 'assessment-leader-change-refresh-${toolSessionID}'; + // if the trigger is recognised, the following action occurs + commandWebsocketHook = function() { + location.reload(); + }; + }); function countHedgeQuestionSelectTotal(questionIndex) { Index: lams_tool_assessment/web/pages/monitoring/summary.jsp =================================================================== diff -u -ra8acfcc470265c2243ccba63e9b38cab20d306bd -r30b838c2ace64169f440c86a9756fd0959cf2323 --- lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision a8acfcc470265c2243ccba63e9b38cab20d306bd) +++ lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 30b838c2ace64169f440c86a9756fd0959cf2323) @@ -662,6 +662,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(""); + } + } // END OF TIME LIMIT @@ -744,6 +776,12 @@ : + + +
<%@ include file="parts/dateRestriction.jsp"%> + +
\ No newline at end of file Index: lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/controller/MonitoringController.java =================================================================== diff -u -rec9b0ffc2e88f3504fd7505ee8474f86d89a2458 -r30b838c2ace64169f440c86a9756fd0959cf2323 --- lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/controller/MonitoringController.java (.../MonitoringController.java) (revision ec9b0ffc2e88f3504fd7505ee8474f86d89a2458) +++ lams_tool_leader/src/java/org/lamsfoundation/lams/tool/leaderselection/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 30b838c2ace64169f440c86a9756fd0959cf2323) @@ -149,8 +149,15 @@ @RequestMapping("/displayChangeLeaderForGroupDialogFromActivity") public String displayChangeLeaderForGroupDialog(@RequestParam long toolSessionId, Model model) { - long leaderSelectionToolContentId = toolService.getNearestLeaderSelectionToolContentId(toolSessionId); + Long leaderSelectionToolContentId = toolService.getNearestLeaderSelectionToolContentId(toolSessionId); + if (leaderSelectionToolContentId == null) { + throw new InvalidParameterException( + "No matching Leader Selection found for activity with tool session ID " + toolSessionId); + } Group group = toolService.getGroup(toolSessionId); + if (group == null) { + throw new InvalidParameterException("No group found for tool session ID " + toolSessionId); + } model.addAttribute("toolSessionId", toolSessionId);