Index: lams_tool_scratchie/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r0b845931db55d90f0dcabc0b33cce5c7df688153 -r281e19ba98aa6bf38fc1f25507a9098304d668fb --- lams_tool_scratchie/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 0b845931db55d90f0dcabc0b33cce5c7df688153) +++ lams_tool_scratchie/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 281e19ba98aa6bf38fc1f25507a9098304d668fb) @@ -61,6 +61,9 @@ label.monitoring.summary.date = Date label.monitoring.summary.report.for = Report for {0} label.monitoring.summary.choose = Choose... +label.monitoring.change.leader = Change leader +label.monitoring.leader.successfully.changed = Leader changed +label.monitoring.leader.not.changed = Leader was not changed label.monitoring.item.summary.group = Group: output.desc.learner.mark = Total mark scored by learner warning.msg.authoring.do.you.want.to.delete = Do you really want to delete this question? Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/GroupSummary.java =================================================================== diff -u -r3a4e0fbc4b00ff567f1dc7561cf9596fedab7c8e -r281e19ba98aa6bf38fc1f25507a9098304d668fb --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/GroupSummary.java (.../GroupSummary.java) (revision 3a4e0fbc4b00ff567f1dc7561cf9596fedab7c8e) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/GroupSummary.java (.../GroupSummary.java) (revision 281e19ba98aa6bf38fc1f25507a9098304d668fb) @@ -35,6 +35,7 @@ private int totalAttempts; private String totalPercentage; private Long leaderUid; + private boolean scratchingFinished; //used for itemSummary page private int numberColumns; @@ -118,6 +119,14 @@ this.leaderUid = leaderUid; } + public boolean isScratchingFinished() { + return scratchingFinished; + } + + public void setScratchingFinished(boolean scratchingFinished) { + this.scratchingFinished = scratchingFinished; + } + public Collection getUsers() { return users; } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java =================================================================== diff -u -r5aabc63ac1eb20bb16e7b586981129b3208323e3 -r281e19ba98aa6bf38fc1f25507a9098304d668fb --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision 5aabc63ac1eb20bb16e7b586981129b3208323e3) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision 281e19ba98aa6bf38fc1f25507a9098304d668fb) @@ -455,4 +455,6 @@ Map prepareStudentChoicesData(Scratchie scratchie); boolean isLearnerEligibleForMark(long learnerId, long toolContentId); + + void changeLeaderForGroup(long toolSessionId, long leaderUserId); } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -r0b845931db55d90f0dcabc0b33cce5c7df688153 -r281e19ba98aa6bf38fc1f25507a9098304d668fb --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 0b845931db55d90f0dcabc0b33cce5c7df688153) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 281e19ba98aa6bf38fc1f25507a9098304d668fb) @@ -24,6 +24,7 @@ package org.lamsfoundation.lams.tool.scratchie.service; import java.io.IOException; +import java.security.InvalidParameterException; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -118,6 +119,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; /** @@ -722,6 +724,8 @@ // one new summary for one session. GroupSummary groupSummary = new GroupSummary(session); + groupSummary.setScratchingFinished(session.isScratchingFinished()); + int totalAttempts = scratchieAnswerVisitDao.getLogCountTotal(sessionId); groupSummary.setTotalAttempts(totalAttempts); @@ -2216,6 +2220,38 @@ } } + @Override + public void changeLeaderForGroup(long toolSessionId, long leaderUserId) { + ScratchieSession session = getScratchieSessionBySessionId(toolSessionId); + if (session.isScratchingFinished()) { + throw new InvalidParameterException("Attempting to assing a new leader with user ID " + leaderUserId + + " to a finished session wtih ID " + toolSessionId); + } + + ScratchieUser existingLeader = session.getGroupLeader(); + if (existingLeader == null || existingLeader.getUserId().equals(leaderUserId)) { + return; + } + Scratchie scratchie = session.getScratchie(); + ScratchieUser newLeader = getUserByUserIDAndContentID(leaderUserId, scratchie.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); + } + + session.setGroupLeader(newLeader); + scratchieSessionDao.update(session); + + Set userIds = getUsersBySession(toolSessionId).stream() + .collect(Collectors.mapping(scratchieUser -> scratchieUser.getUserId().intValue(), Collectors.toSet())); + + ObjectNode jsonCommand = JsonNodeFactory.instance.objectNode(); + jsonCommand.put("hookTrigger", "scratchie-leader-change-refresh-" + toolSessionId); + learnerService.createCommandForLearners(scratchie.getContentId(), userIds, jsonCommand.toString()); + } // ***************************************************************************** // set methods for Spring Bean // ***************************************************************************** Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/MonitoringController.java =================================================================== diff -u -re743566518bd5c53d6574987565cfb8581a92c66 -r281e19ba98aa6bf38fc1f25507a9098304d668fb --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/MonitoringController.java (.../MonitoringController.java) (revision e743566518bd5c53d6574987565cfb8581a92c66) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 281e19ba98aa6bf38fc1f25507a9098304d668fb) @@ -73,6 +73,7 @@ import org.springframework.ui.Model; 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; @@ -296,6 +297,14 @@ return "pages/monitoring/parts/statisticpart"; } + @RequestMapping(path = "/changeLeaderForGroup", method = RequestMethod.POST) + @ResponseBody + @ResponseStatus(HttpStatus.OK) + private void changeLeaderForGroup(@RequestParam(name = AttributeNames.PARAM_TOOL_SESSION_ID) long toolSessionId, + @RequestParam long leaderUserId) { + scratchieService.changeLeaderForGroup(toolSessionId, leaderUserId); + } + @SuppressWarnings("unchecked") private SessionMap getSessionMap(HttpServletRequest request) { String sessionMapID = request.getParameter(ScratchieConstants.ATTR_SESSION_MAP_ID); Index: lams_tool_scratchie/web/pages/learning/learning.jsp =================================================================== diff -u -r31c0a35b614dd390e386a617cc85827c4d00de47 -r281e19ba98aa6bf38fc1f25507a9098304d668fb --- lams_tool_scratchie/web/pages/learning/learning.jsp (.../learning.jsp) (revision 31c0a35b614dd390e386a617cc85827c4d00de47) +++ lams_tool_scratchie/web/pages/learning/learning.jsp (.../learning.jsp) (revision 281e19ba98aa6bf38fc1f25507a9098304d668fb) @@ -82,6 +82,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 = 'scratchie-leader-change-refresh-${toolSessionID}'; + // if the trigger is recognised, the following action occurs + commandWebsocketHook = function() { + location.reload(); + }; + }); //scratch image (used by both scratchMcq() and scratchVsa()) Index: lams_tool_scratchie/web/pages/monitoring/summary.jsp =================================================================== diff -u -re743566518bd5c53d6574987565cfb8581a92c66 -r281e19ba98aa6bf38fc1f25507a9098304d668fb --- lams_tool_scratchie/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision e743566518bd5c53d6574987565cfb8581a92c66) +++ lams_tool_scratchie/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 281e19ba98aa6bf38fc1f25507a9098304d668fb) @@ -285,6 +285,37 @@ var url = "?&sessionMapID=${sessionMapID}&reqID=" + (new Date()).getTime(); return downloadFile(url, 'messageArea_Busy', '', 'messageArea', 'btn-disable-on-submit'); }; + + 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(""); + } + } // pass settings to monitorToolSummaryAdvanced.js var submissionDeadlineSettings = { @@ -360,6 +391,12 @@ aria-expanded="${status.first ? 'false' : 'true'}" aria-controls="collapse${summary.sessionId}" > ${summaryTitle} + + +
@@ -430,3 +467,5 @@ <%@ include file="parts/advanceOptions.jsp"%> <%@ include file="parts/dateRestriction.jsp"%> + +
\ No newline at end of file