Index: lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -r46e0b05aa6ff4798e51f86f140dbea83b22b798e -r731ac9bda6562e241a71eb71b18caeaa49aeefb5 --- lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 46e0b05aa6ff4798e51f86f140dbea83b22b798e) +++ lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 731ac9bda6562e241a71eb71b18caeaa49aeefb5) @@ -376,6 +376,6 @@ label.correct =Correct label.incorrect =Incorrect label.answer.alternatives =Answer alternatives +label.someone.allocated.this.answer =Sorry, someone has allocated this answer already - #======= End labels: Exported 370 labels for en AU ===== Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r18b228bd194ec58143b063ea9e0329c5ed12c276 -r731ac9bda6562e241a71eb71b18caeaa49aeefb5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 18b228bd194ec58143b063ea9e0329c5ed12c276) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 731ac9bda6562e241a71eb71b18caeaa49aeefb5) @@ -27,6 +27,7 @@ import java.lang.reflect.InvocationTargetException; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashMap; @@ -36,6 +37,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; @@ -1392,7 +1394,7 @@ } @Override - public void allocateAnswerToOption(Long questionUid, Long targetOptionUid, Long previousOptionUid, + public Optional allocateAnswerToOption(Long questionUid, Long targetOptionUid, Long previousOptionUid, Long questionResultUid) { AssessmentQuestion assessmentQuestion = assessmentQuestionDao.getByUid(questionUid); QbQuestion qbQuestion = assessmentQuestion.getQbQuestion(); @@ -1402,6 +1404,15 @@ //adding if (previousOptionUid.equals(-1L)) { + //search for duplicates and, if found, return false + for (QbOption option : qbQuestion.getQbOptions()) { + String name = option.getName(); + String[] alternatives = name.split("\r\n"); + if (Arrays.asList(alternatives).contains(answer)) { + return Optional.of(option.getUid()); + } + } + for (QbOption targetOption : qbQuestion.getQbOptions()) { if (targetOption.getUid().equals(targetOptionUid)) { String name = targetOption.getName(); @@ -1521,6 +1532,8 @@ //recalculate marks in all Scratchie activities, that use modified QbQuestion toolService.recalculateScratchieMarksForVsaQuestion(qbQuestion.getUid()); } + + return Optional.empty(); } @Override Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -r670dd8e248dc4705c92031c79d05a99559e35024 -r731ac9bda6562e241a71eb71b18caeaa49aeefb5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 670dd8e248dc4705c92031c79d05a99559e35024) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 731ac9bda6562e241a71eb71b18caeaa49aeefb5) @@ -26,6 +26,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import org.lamsfoundation.lams.notebook.model.NotebookEntry; @@ -424,7 +425,17 @@ */ QuestionSummary getQuestionSummary(Long contentId, Long questionUid); - void allocateAnswerToOption(Long questionUid, Long targetOptionUid, Long previousOptionUid, Long questionResultUid); + /** + * Allocate learner's answer into one of the available answer groups. + * + * @param questionUid + * @param targetOptionUid + * @param previousOptionUid + * @param questionResultUid + * @return if present, it contains optionUid of the option group containing duplicate (added there presumably by + * another teacher working in parallel) + */ + Optional allocateAnswerToOption(Long questionUid, Long targetOptionUid, Long previousOptionUid, Long questionResultUid); /** * For export purposes Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java =================================================================== diff -u -re6dc4db4137cfd6b07a4aa79711b9d12b39fb78e -r731ac9bda6562e241a71eb71b18caeaa49aeefb5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision e6dc4db4137cfd6b07a4aa79711b9d12b39fb78e) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 731ac9bda6562e241a71eb71b18caeaa49aeefb5) @@ -28,6 +28,7 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.TimeZone; import java.util.TreeSet; @@ -194,11 +195,18 @@ } @RequestMapping("/allocateUserAnswer") - @ResponseStatus(HttpStatus.OK) - public void allocateUserAnswer(HttpServletRequest request, HttpServletResponse response, + @ResponseBody + public String allocateUserAnswer(HttpServletRequest request, HttpServletResponse response, @RequestParam Long questionUid, @RequestParam Long targetOptionUid, @RequestParam Long previousOptionUid, @RequestParam Long questionResultUid) { - service.allocateAnswerToOption(questionUid, targetOptionUid, previousOptionUid, questionResultUid); + Optional optionUid = service.allocateAnswerToOption(questionUid, targetOptionUid, previousOptionUid, + questionResultUid); + + ObjectNode responseJSON = JsonNodeFactory.instance.objectNode(); + responseJSON.put("isAnswerDuplicated", optionUid.isPresent()); + responseJSON.put("optionUid", optionUid.orElse(-1L)); + response.setContentType("application/json;charset=utf-8"); + return responseJSON.toString(); } @RequestMapping("/userSummary") Index: lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp =================================================================== diff -u -r0a731bb87287def162bc6adc4be2ff872d2002dc -r731ac9bda6562e241a71eb71b18caeaa49aeefb5 --- lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp (.../questionsummary.jsp) (revision 0a731bb87287def162bc6adc4be2ff872d2002dc) +++ lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp (.../questionsummary.jsp) (revision 731ac9bda6562e241a71eb71b18caeaa49aeefb5) @@ -18,6 +18,9 @@ min-height: 110px; padding: 10px; } + .filtered { + background-color: lightgrey; + } .list-group-item { cursor: pointer; } @@ -146,6 +149,7 @@ new Sortable($(this)[0], { group: 'shared', animation: 150, + filter: '.filtered', // 'filtered' class is not draggable //ghostClass: 'sortable-placeholder', //direction: 'vertical', onStart: function (evt) { @@ -162,18 +166,17 @@ previousOptionUid: $(evt.from).data("option-uid"), questionResultUid: $(evt.item).data("question-result-uid") }, - type: 'post' + method: 'post', + dataType: "json", + success: function (data) { + if (data.isAnswerDuplicated) { + alert(""); + $(evt.item).appendTo("#answer-group" + data.optionUid); + $(evt.item).addClass("filtered"); + } + } + }); - }, - store: { - set: function (sortable) { - //update all displayOrders in order to later save it as options' order - var order = sortable.toArray(); - for (var i = 0; i < order.length; i++) { - var optionIndex = order[i]; - $('input[name="optionDisplayOrder' + optionIndex + '"]').val(i+1); - } - } } }); }); @@ -278,14 +281,14 @@ : ${fn:replace(option0.name, newLineChar, ', ')} -
+

() -
+
  @@ -314,7 +317,7 @@ : ${fn:replace(option1.name, newLineChar, ', ')} -
+
@@ -332,7 +335,7 @@ : ${fn:replace(optionDto.name, newLineChar, ', ')} -
+