Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/VsaController.java =================================================================== diff -u -r6f0f844e82f555e8dc0df6916226fac35a2a7c36 -rb074034d65483c22c90989799ad534947078bd98 --- lams_central/src/java/org/lamsfoundation/lams/web/qb/VsaController.java (.../VsaController.java) (revision 6f0f844e82f555e8dc0df6916226fac35a2a7c36) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/VsaController.java (.../VsaController.java) (revision b074034d65483c22c90989799ad534947078bd98) @@ -33,7 +33,7 @@ @RequestMapping("/displayVsaAllocate") public String displayVsaAllocate(@RequestParam(name = AttributeNames.PARAM_TOOL_CONTENT_ID) long toolContentId, Model model) { - + // the mapping is tool question -> unallocated answer -> user ID Map> toolQuestionToUnallocatedAnswersMap = toolService .getUnallocatedVSAnswers(toolContentId); @@ -72,7 +72,7 @@ answer); } - // recalculate marks for all lessons in all cases except for reshuffling inside the same container + // recalculate marks for *all lessons* in all cases except for reshuffling inside the same container answerFoundInResults = toolService.recalculateMarksForVsaQuestion(toolQuestionUid, answer); } Index: lams_common/src/java/org/lamsfoundation/lams/qb/QbUtils.java =================================================================== diff -u -r6f0f844e82f555e8dc0df6916226fac35a2a7c36 -rb074034d65483c22c90989799ad534947078bd98 --- lams_common/src/java/org/lamsfoundation/lams/qb/QbUtils.java (.../QbUtils.java) (revision 6f0f844e82f555e8dc0df6916226fac35a2a7c36) +++ lams_common/src/java/org/lamsfoundation/lams/qb/QbUtils.java (.../QbUtils.java) (revision b074034d65483c22c90989799ad534947078bd98) @@ -108,6 +108,12 @@ .anyMatch(s -> isCaseSensitive ? s.equals(answer) : s.equalsIgnoreCase(answer)); } + /** + * Check is given answer is present in any of VSA question's options. + * + * @param notAllocatedAnswers + * is an accumulator for unallocated answers so they do not appear in VSA allocation UI twice + */ public static boolean isVSAnswerAllocated(QbQuestion qbQuestion, String answer, Set notAllocatedAnswers) { if (StringUtils.isBlank(answer)) { return false; Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java =================================================================== diff -u -r6f0f844e82f555e8dc0df6916226fac35a2a7c36 -rb074034d65483c22c90989799ad534947078bd98 --- lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision 6f0f844e82f555e8dc0df6916226fac35a2a7c36) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision b074034d65483c22c90989799ad534947078bd98) @@ -105,6 +105,7 @@ return result.isEmpty() ? null : result.get(0); } + @Override public List getToolQuestionForToolContentId(Class clazz, long toolContentId, long otherToolQuestionUid) { return qbDAO.getToolQuestionForToolContentId(clazz, toolContentId, otherToolQuestionUid); } @@ -792,10 +793,6 @@ /** * Allocate learner's answer into one of the available answer groups. * - * @param qbQuestionUid - * @param targetOptionUid - * @param previousOptionUid - * @param answer * @return if present, it contains optionUid of the option group containing duplicate (added there presumably by * another teacher working in parallel) */ Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java =================================================================== diff -u -r6f0f844e82f555e8dc0df6916226fac35a2a7c36 -rb074034d65483c22c90989799ad534947078bd98 --- lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java (.../LamsToolService.java) (revision 6f0f844e82f555e8dc0df6916226fac35a2a7c36) +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java (.../LamsToolService.java) (revision b074034d65483c22c90989799ad534947078bd98) @@ -531,6 +531,9 @@ return lamsCoreToolService.getVsaAnswersByToolSession(assessmentSession); } + /** + * Get answers for VSA questions which are not already assigned to any of question's options. + */ @Override public Map> getUnallocatedVSAnswers(long toolContentId) { ToolActivity specifiedActivity = activityDAO.getToolActivityByToolContentId(toolContentId); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -reff233243475ad0693dd5bf2c3b441712bd0d4db -rb074034d65483c22c90989799ad534947078bd98 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision eff233243475ad0693dd5bf2c3b441712bd0d4db) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision b074034d65483c22c90989799ad534947078bd98) @@ -597,6 +597,12 @@ // recalculate marks if it's required for (Long sessionId : sessionIds) { recalculateMarkForSession(sessionId, true); + try { + // tell learners that their answers have changed so they not need to keep guessing + LearningWebsocketServer.getInstance().sendPageRefreshRequest(null, sessionId); + } catch (IOException e) { + log.error("Could not refresh learner page after VSA allocation for session ID " + sessionId, e); + } } return !sessionIds.isEmpty(); } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java =================================================================== diff -u -r804dca72fa2ac638a9d3e2e66054d82688951c31 -rb074034d65483c22c90989799ad534947078bd98 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision 804dca72fa2ac638a9d3e2e66054d82688951c31) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision b074034d65483c22c90989799ad534947078bd98) @@ -236,7 +236,13 @@ * The time limit is expired but leader hasn't submitted required notebook/burning questions yet. Non-leaders * will need to refresh the page in order to stop showing them questions page. */ - public void sendPageRefreshRequest(long toolContentId, long toolSessionId) throws IOException { + public void sendPageRefreshRequest(Long toolContentId, long toolSessionId) throws IOException { + if (toolContentId == null) { + // get tool content ID from seession + ScratchieSession scratchieSession = scratchieService.getScratchieSessionBySessionId(toolSessionId); + toolContentId = scratchieSession.getScratchie().getContentId(); + } + Set sessionWebsockets = websockets.get(toolContentId); if (sessionWebsockets == null) { return;