Index: lams_tool_assessment/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -rb4efdafc56d24361458ebb803387771843e452f7 -rbb6788de1fe910e6ab6fb14bb54b5e21551392de --- lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision b4efdafc56d24361458ebb803387771843e452f7) +++ lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision bb6788de1fe910e6ab6fb14bb54b5e21551392de) @@ -444,4 +444,5 @@ label.learning.draft.autosave.error = It seems that you have lost connection to the server. Check your internet connection and click OK. If this keeps happening, please inform your teacher. message.disclose.correct.before.groups.answers = Usually other groups' answers are disclosed before correct answers so students can discuss their choices. Are you sure you want continue? label.vsa.allocate.button = Allocate VSAs -label.vsa.allocate.description = Allocate students' answers by dragging and dropping them to correct options \ No newline at end of file +label.vsa.allocate.description = Allocate students' answers by dragging and dropping them to correct options +label.vsa.deallocate.button.tip = Click to move answer back to queue \ No newline at end of file Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java =================================================================== diff -u -rff9b1c659da59060b4690a29bfdd493e8741b224 -rbb6788de1fe910e6ab6fb14bb54b5e21551392de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision ff9b1c659da59060b4690a29bfdd493e8741b224) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision bb6788de1fe910e6ab6fb14bb54b5e21551392de) @@ -33,8 +33,6 @@ List getAssessmentResults(Long assessmentUid, Long userId); - List getAssessmentResultsByQbQuestion(Long qbQuestionUid); - List getAssessmentResultsByQbQuestionAndAnswer(Long qbQuestionUid, String answer); List getAssessmentResultsBySession(Long sessionId, Long userId); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java =================================================================== diff -u -r8a1b8b9cba5668f9c9b47a716093214aeec87f30 -rbb6788de1fe910e6ab6fb14bb54b5e21551392de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision 8a1b8b9cba5668f9c9b47a716093214aeec87f30) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision bb6788de1fe910e6ab6fb14bb54b5e21551392de) @@ -146,23 +146,18 @@ } @Override - public List getAssessmentResultsByQbQuestion(Long qbQuestionUid) { - return getAssessmentResultsByQbQuestionAndAnswer(qbQuestionUid, null); - } - - @Override public List getAssessmentResultsByQbQuestionAndAnswer(Long qbQuestionUid, String answer) { - String FIND_BY_QBQUESTION_AND_FINISHED = "SELECT r FROM " + AssessmentQuestionResult.class.getName() - + " AS q, " + AssessmentResult.class.getName() + " AS r " - + " WHERE q.assessmentResult.uid = r.uid AND q.qbToolQuestion.qbQuestion.uid =:qbQuestionUid AND (r.finishDate != null) "; + String FIND_BY_QBQUESTION = "SELECT r FROM " + AssessmentQuestionResult.class.getName() + " AS q, " + + AssessmentResult.class.getName() + " AS r " + + " WHERE q.assessmentResult.uid = r.uid AND q.qbToolQuestion.qbQuestion.uid =:qbQuestionUid "; if (StringUtils.isNotBlank(answer)) { - FIND_BY_QBQUESTION_AND_FINISHED += "AND REGEXP_REPLACE(q.answer, '" + FIND_BY_QBQUESTION += "AND REGEXP_REPLACE(q.answer, '" + AssessmentEscapeUtils.VSA_ANSWER_NORMALISE_SQL_REG_EXP + "', '') = :answer"; } - FIND_BY_QBQUESTION_AND_FINISHED += " ORDER BY r.startDate ASC"; + FIND_BY_QBQUESTION += " ORDER BY r.startDate ASC"; - Query q = getSession().createQuery(FIND_BY_QBQUESTION_AND_FINISHED, AssessmentResult.class); + Query q = getSession().createQuery(FIND_BY_QBQUESTION, AssessmentResult.class); q.setParameter("qbQuestionUid", qbQuestionUid); if (StringUtils.isNotBlank(answer)) { String normalisedAnswer = AssessmentEscapeUtils.normaliseVSAnswer(answer); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r2c97a0be0070d0fc70b7562940ebde3f423dde29 -rbb6788de1fe910e6ab6fb14bb54b5e21551392de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 2c97a0be0070d0fc70b7562940ebde3f423dde29) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision bb6788de1fe910e6ab6fb14bb54b5e21551392de) @@ -1462,6 +1462,7 @@ if (normalisedAnswer == null) { return null; } + answer = answer.strip(); AssessmentQuestion assessmentQuestion = assessmentQuestionDao.getByUid(questionUid); QbQuestion qbQuestion = assessmentQuestion.getQbQuestion(); @@ -1501,9 +1502,10 @@ String[] alternatives = name.split(AssessmentEscapeUtils.VSA_ANSWER_DELIMITER); Set nameWithoutUserAnswer = new LinkedHashSet<>(List.of(alternatives)); - nameWithoutUserAnswer.remove(normalisedAnswer); - name = nameWithoutUserAnswer.stream() - .collect(Collectors.joining(AssessmentEscapeUtils.VSA_ANSWER_DELIMITER)); + nameWithoutUserAnswer.remove(answer); + name = nameWithoutUserAnswer.isEmpty() ? "" + : nameWithoutUserAnswer.stream() + .collect(Collectors.joining(AssessmentEscapeUtils.VSA_ANSWER_DELIMITER)); previousOption.setName(name); assessmentDao.saveObject(previousOption); assessmentDao.flush(); @@ -1525,7 +1527,7 @@ } // append new answer to option - name += AssessmentEscapeUtils.VSA_ANSWER_DELIMITER + answer; + name += (StringUtils.isBlank(name) ? "" : AssessmentEscapeUtils.VSA_ANSWER_DELIMITER) + answer; targetOption.setName(name); assessmentDao.saveObject(targetOption); assessmentDao.flush(); @@ -1540,7 +1542,7 @@ } @Override - public void recalculateMarksForAllocatedAnswer(Long questionUid, String answer) { + public boolean recalculateMarksForAllocatedAnswer(Long questionUid, String answer) { AssessmentQuestion assessmentQuestion = assessmentQuestionDao.getByUid(questionUid); QbQuestion qbQuestion = assessmentQuestion.getQbQuestion(); // get all finished user results @@ -1586,6 +1588,8 @@ //recalculate marks in all Scratchie activities, that use modified QbQuestion toolService.recalculateScratchieMarksForVsaQuestion(qbQuestion.getUid(), answer); + + return !assessmentResults.isEmpty(); } @Override Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -rd2fae62bad612aad30c914422eea4e0316fc4be1 -rbb6788de1fe910e6ab6fb14bb54b5e21551392de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision d2fae62bad612aad30c914422eea4e0316fc4be1) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision bb6788de1fe910e6ab6fb14bb54b5e21551392de) @@ -426,8 +426,9 @@ /** * Recalculate learners' marks after a VSA answer was allocated as correct or incorrect. + * Returns true if at least one result was recalculated. */ - void recalculateMarksForAllocatedAnswer(Long questionUid, String answer); + boolean recalculateMarksForAllocatedAnswer(Long questionUid, String answer); /** * For export purposes Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java =================================================================== diff -u -rc145f7087c6e9364a2886db4decbecb02b775ec9 -rbb6788de1fe910e6ab6fb14bb54b5e21551392de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java (.../AssessmentEscapeUtils.java) (revision c145f7087c6e9364a2886db4decbecb02b775ec9) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java (.../AssessmentEscapeUtils.java) (revision bb6788de1fe910e6ab6fb14bb54b5e21551392de) @@ -376,7 +376,7 @@ public static Set normaliseVSOption(String option) { return StringUtils.isBlank(option) ? Set.of() - : Stream.of(option.split(VSA_ANSWER_DELIMITER)) + : Stream.of(option.split(VSA_ANSWER_DELIMITER)).filter(StringUtils::isNotBlank) .collect(Collectors.mapping(answer -> AssessmentEscapeUtils.normaliseVSAnswer(answer), Collectors.toCollection(LinkedHashSet::new))); } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java =================================================================== diff -u -rff9b1c659da59060b4690a29bfdd493e8741b224 -rbb6788de1fe910e6ab6fb14bb54b5e21551392de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision ff9b1c659da59060b4690a29bfdd493e8741b224) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision bb6788de1fe910e6ab6fb14bb54b5e21551392de) @@ -331,13 +331,12 @@ @ResponseBody public String allocateUserAnswer(HttpServletRequest request, HttpServletResponse response, @RequestParam Long questionUid, @RequestParam Long targetOptionUid, @RequestParam Long previousOptionUid, - @RequestParam Long questionResultUid) { + @RequestParam String answer) { Long optionUid = null; + boolean answerFoundInResults = false; - if (!targetOptionUid.equals(previousOptionUid)) { - AssessmentQuestionResult questionRes = service.getAssessmentQuestionResultByUid(questionResultUid); - String answer = questionRes.getAnswer(); + if (!targetOptionUid.equals(previousOptionUid) && StringUtils.isNotBlank(answer)) { /* * We need to synchronise this operation. * When multiple requests are made to modify the same option, for example to add a VSA answer, @@ -359,12 +358,13 @@ optionUid = service.allocateAnswerToOption(questionUid, targetOptionUid, previousOptionUid, answer); } //recalculate marks for all lessons in all cases except for reshuffling inside the same container - service.recalculateMarksForAllocatedAnswer(questionUid, answer); + answerFoundInResults = service.recalculateMarksForAllocatedAnswer(questionUid, answer); } ObjectNode responseJSON = JsonNodeFactory.instance.objectNode(); responseJSON.put("isAnswerDuplicated", optionUid != null); responseJSON.put("optionUid", optionUid == null ? -1 : optionUid); + responseJSON.put("answerFoundInResults", answerFoundInResults); response.setContentType("application/json;charset=utf-8"); return responseJSON.toString(); } Index: lams_tool_assessment/web/pages/monitoring/vsaAllocate.jsp =================================================================== diff -u -r7e47f6b33ae66ad74a98b535a9f4f75330fad4ce -rbb6788de1fe910e6ab6fb14bb54b5e21551392de --- lams_tool_assessment/web/pages/monitoring/vsaAllocate.jsp (.../vsaAllocate.jsp) (revision 7e47f6b33ae66ad74a98b535a9f4f75330fad4ce) +++ lams_tool_assessment/web/pages/monitoring/vsaAllocate.jsp (.../vsaAllocate.jsp) (revision bb6788de1fe910e6ab6fb14bb54b5e21551392de) @@ -21,6 +21,14 @@ overflow-y: auto; } + .sortable-on .portrait-generic-sm { + margin-right: 5px; + } + + .sortable-on .portrait-anonymous { + color: #ddd; + } + .tbl-correct-list { border: 3px solid #3c763d; border-radius: 10px; @@ -39,6 +47,14 @@ background: initial; } + .answer-alternatives { + text-align: left; + margin-top: 5px; + } + .answer-alternatives button { + margin-bottom: 2px; + } + .filtered { background-color: lightgrey; } @@ -80,29 +96,62 @@ questionUid: questionUid, targetOptionUid: $(evt.to).data("option-uid"), previousOptionUid: $(evt.from).data("option-uid"), - questionResultUid: $(evt.item).data("question-result-uid"), + answer: $('.answer-text', evt.item).text(), "":"" }, method: 'post', dataType: "json", - success: function (data) { - updateAnswerQueueSize(questionUid); - - if (data.isAnswerDuplicated) { - alert(""); - $(evt.item).appendTo("#answer-group" + data.optionUid); - $(evt.item).addClass("filtered"); - } - } - + success: function (data) { + updateAnswerQueueSize(questionUid); + + if (data.isAnswerDuplicated) { + alert(""); + $(evt.item).appendTo("#answer-group" + data.optionUid); + $(evt.item).addClass("filtered"); + } + } }); } }); }); + + $('.answer-alternatives button').click(function(){ + var button = $(this), + answer = button.text(), + container = button.closest('.answer-alternatives'), + questionUid = container.data('question-uid'), + optionUid = container.data('option-uid'); + + $.ajax({ + url: '', + data: { + sessionMapID: "${sessionMapID}", + questionUid: questionUid, + targetOptionUid: -1, + previousOptionUid: optionUid, + answer: answer, + "":"" + }, + method: 'post', + dataType: "json", + success: function (data) { + if (data.answerFoundInResults) { + $('
') + .append($('
')) + .append($('').text(answer)) + .appendTo('#answer-queue' + questionUid); + + updateAnswerQueueSize(questionUid); + } + + button.remove(); + } + }); + }); }); function updateAnswerQueueSize(questionUid) { - var answerQueueLength = $('.answer-queue[data-question-uid="' + questionUid + '"] .list-group-item').length; + var answerQueueLength = $('#answer-queue' + questionUid + ' .list-group-item').length; $('#answer-queue-size' + questionUid).text(answerQueueLength ? ' (' + answerQueueLength + ')' : ''); } @@ -170,8 +219,17 @@ data-question-uid="${questionDto.uid}" data-option-uid="${option0.uid}" id="answer-group${option0.uid}">
- : - ${fn:replace(option0.name, newLineChar, ', ')} + + : +
+ + + +
+
@@ -182,11 +240,12 @@
+ data-option-uid="-1" + id="answer-queue${questionDto.uid}"> -
-   - ${questionResult.answer} +
+ + ${questionResult.answer}
@@ -210,10 +269,19 @@
- - : - ${fn:replace(option1.name, newLineChar, ', ')} + data-option-uid="${option1.uid}" id="answer-group${option1.uid}">
+ + + : +
+ + + +
+