Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java =================================================================== diff -u -r5129d828c41c0731ee7889271cffde6421e2146c -rec62f6f6a9e56cd545c527d2fd530614b3a7e744 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision 5129d828c41c0731ee7889271cffde6421e2146c) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision ec62f6f6a9e56cd545c527d2fd530614b3a7e744) @@ -50,8 +50,6 @@ public static final String PARAM_QUESTION_DISPLAY_ORDER = "questionDisplayOrder"; - public static final String PARAM_QUESTION_REFERENCE_INDEX = "questionReferenceIndex"; - public static final String PARAM_QUESTION_UID = "questionUid"; public static final String PARAM_OPTION_INDEX = "optionIndex"; @@ -63,6 +61,8 @@ public static final String PARAM_GRADE = "grade"; public static final String PARAM_MAX_MARK = "maxMark"; + + public static final String PARAM_SEQUENCE_ID = "sequenceId"; public static final String PARAM_SESSION_ID = "sessionId"; @@ -101,8 +101,10 @@ public static final String ATTR_UNIT_LIST = "unitList"; - public static final String ATTR_QUESTION_REFERENCES_MAX_MARKS = "referenceMaxMarks"; + public static final String ATTR_REFERENCES_MAX_MARKS = "referenceMaxMarks"; + public static final String ATTR_REFERENCES_SEQUENCE_IDS = "sequenceIds"; + public static final String ATTR_HAS_EDIT_RIGHT = "hasEditRight"; public static final String ATTR_IS_TIME_LIMIT_NOT_LAUNCHED = "isTimeLimitNotLaunched"; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rf777da65e4da8c529923ed6eb3a50d6a8cf98f96 -rec62f6f6a9e56cd545c527d2fd530614b3a7e744 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision f777da65e4da8c529923ed6eb3a50d6a8cf98f96) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision ec62f6f6a9e56cd545c527d2fd530614b3a7e744) @@ -418,9 +418,6 @@ @Override public void saveOrUpdateAssessment(Assessment assessment) { for (QuestionReference reference : assessment.getQuestionReferences()) { - if (!reference.isRandomQuestion()) { - assessmentQuestionDao.saveObject(reference.getQuestion()); - } assessmentQuestionDao.saveObject(reference); } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java =================================================================== diff -u -rf777da65e4da8c529923ed6eb3a50d6a8cf98f96 -rec62f6f6a9e56cd545c527d2fd530614b3a7e744 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java (.../AuthoringController.java) (revision f777da65e4da8c529923ed6eb3a50d6a8cf98f96) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java (.../AuthoringController.java) (revision ec62f6f6a9e56cd545c527d2fd530614b3a7e744) @@ -31,10 +31,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -249,9 +251,9 @@ } for (QuestionReference reference : oldReferences) { service.releaseFromCache(reference); - if (reference.getQuestion() != null) { - service.releaseFromCache(reference.getQuestion()); - } +// if (reference.getQuestion() != null) { +// service.releaseFromCache(reference.getQuestion()); +// } } Long uid = assessmentPO.getUid(); @@ -288,7 +290,7 @@ // ************************* Handle assessment questions ******************* List newRandomQuestions = getRandomPoolQuestions(sessionMap); - Set newReferences = cacheReferencesMaxMarks(request, sessionMap, true); + Set newReferences = getQuestionReferences(sessionMap); TreeSet newQuestions = new TreeSet<>(); newQuestions.addAll(newRandomQuestions); @@ -305,7 +307,7 @@ assessmentPO.setQuestions(newQuestions); -// // recalculate results in case content is edited from monitoring and it's been already attempted by a student + // recalculate results in case content is edited from monitoring and it's been already attempted by a student boolean isAuthoringRestricted = (boolean) sessionMap.get(AssessmentConstants.ATTR_IS_AUTHORING_RESTRICTED); if (isAuthoringRestricted) { service.recalculateUserAnswers(assessmentPO.getUid(), assessmentPO.getContentId(), oldQuestions, @@ -353,17 +355,6 @@ request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); return "pages/authoring/authoring"; } - - /** - * Caches references MaxMarks. Invoked on clicking import button. - */ - @RequestMapping("/cacheReferencesMaxMarks") - @ResponseStatus(HttpStatus.OK) - public void cacheReferencesMaxMarks(HttpServletRequest request) - throws ServletException, IOException { - SessionMap sessionMap = getSessionMap(request); - cacheReferencesMaxMarks(request, sessionMap, false); - } /** * Display empty page for new assessment question. @@ -372,7 +363,6 @@ public String initNewReference(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { SessionMap sessionMap = getSessionMap(request); - cacheReferencesMaxMarks(request, sessionMap, false); Integer type = NumberUtils.toInt(request.getParameter(QbConstants.ATTR_QUESTION_TYPE)); if (type.equals(-1)) {//randomQuestion case @@ -402,13 +392,13 @@ */ @RequestMapping("/editReference") public String editReference(HttpServletRequest request, HttpServletResponse response, - @RequestParam int questionReferenceIndex) throws ServletException, IOException { + @RequestParam int referenceSequenceId) throws ServletException, IOException { SessionMap sessionMap = getSessionMap(request); - cacheReferencesMaxMarks(request, sessionMap, false); - SortedSet questionReferences = getQuestionReferences(sessionMap); + + //find reference to edit List rList = new ArrayList<>(questionReferences); - QuestionReference questionReference = rList.get(questionReferenceIndex); + QuestionReference questionReference = rList.get(referenceSequenceId); if (questionReference.isRandomQuestion()) { request.setAttribute("isReferenceNew", false); @@ -490,18 +480,13 @@ // edit } else { - //QbQuestion's uid is kept the same - means it's a minor change, do nothing - if (oldQbQuestionUid.equals(qbQuestion.getUid())) { - //replace QbQuestion with the new version of it - } else { - for (QuestionReference reference : references) { - if (!reference.isRandomQuestion() - && oldQbQuestionUid.equals(reference.getQuestion().getQbQuestion().getUid())) { - AssessmentQuestion assessmentQuestion = reference.getQuestion(); - assessmentQuestion.setQbQuestion(qbQuestion); - break; - } + for (QuestionReference reference : references) { + if (!reference.isRandomQuestion() + && oldQbQuestionUid.equals(reference.getQuestion().getQbQuestion().getUid())) { + AssessmentQuestion assessmentQuestion = reference.getQuestion(); + assessmentQuestion.setQbQuestion(qbQuestion); + break; } } } @@ -639,77 +624,23 @@ * happen when user submit whole page. So this remove is just impact HttpSession values. */ @RequestMapping("/removeQuestionReference") - public String removeQuestionReference(HttpServletRequest request) { + public String removeQuestionReference(HttpServletRequest request, @RequestParam int referenceSequenceId) { SessionMap sessionMap = getSessionMap(request); - cacheReferencesMaxMarks(request, sessionMap, false); + SortedSet questionReferences = getQuestionReferences(sessionMap); - int questionReferenceIdx = NumberUtils - .toInt(request.getParameter(AssessmentConstants.PARAM_QUESTION_REFERENCE_INDEX), -1); - if (questionReferenceIdx != -1) { - SortedSet questionReferences = getQuestionReferences(sessionMap); - List rList = new ArrayList<>(questionReferences); - QuestionReference questionReference = rList.remove(questionReferenceIdx); - questionReferences.clear(); - questionReferences.addAll(rList); - // add to delList - List delList = getDeletedQuestionReferences(sessionMap); - delList.add(questionReference); - } + //find reference to delete + List rList = new ArrayList<>(questionReferences); + QuestionReference questionReference = rList.remove(referenceSequenceId); - return "pages/authoring/parts/questionlist"; - } + questionReferences.remove(questionReference); - /** - * Move up current question reference. - */ - @RequestMapping("/upQuestionReference") - public String upQuestionReference(HttpServletRequest request) { - return switchQuestionReferences(request, true); - } + // add to delList + List delList = getDeletedQuestionReferences(sessionMap); + delList.add(questionReference); - /** - * Move down current question reference. - */ - @RequestMapping("/downQuestionReference") - public String downQuestionReference(HttpServletRequest request) { - return switchQuestionReferences(request, false); + return "pages/authoring/parts/questionlist"; } - - private String switchQuestionReferences(HttpServletRequest request, boolean up) { - SessionMap sessionMap = getSessionMap(request); - cacheReferencesMaxMarks(request, sessionMap, false); - - int questionReferenceIdx = NumberUtils - .toInt(request.getParameter(AssessmentConstants.PARAM_QUESTION_REFERENCE_INDEX), -1); - if (questionReferenceIdx != -1) { - SortedSet references = getQuestionReferences(sessionMap); - List rList = new ArrayList<>(references); - // get current and the target item, and switch their sequnece - QuestionReference reference = rList.get(questionReferenceIdx); - QuestionReference repReference; - if (up) { - repReference = rList.get(--questionReferenceIdx); - } else { - repReference = rList.get(++questionReferenceIdx); - } - int upSeqId = repReference.getSequenceId(); - repReference.setSequenceId(reference.getSequenceId()); - reference.setSequenceId(upSeqId); - - // put back list, it will be sorted again - references.clear(); - references.addAll(rList); - } - - //in case of edit in monitor and at least one attempted user, we show authoring page with restricted options - boolean isAuthoringRestricted = (boolean) sessionMap.get(AssessmentConstants.ATTR_IS_AUTHORING_RESTRICTED); - if (isAuthoringRestricted) { - return "pages/authoring/parts/questionlistRestricted"; - } else { - return "pages/authoring/parts/questionlist"; - } - } - + @RequestMapping("/getAllQbQuestionUids") @ResponseBody public String getAllQbQuestionUids(HttpServletRequest request, HttpServletResponse response, @@ -782,8 +713,49 @@ response.setContentType("application/json;charset=utf-8"); return responseJSON.toString(); } + + /** + * Caches references order, along with this caches MaxMarks. + */ + @RequestMapping("/cacheReferencesOrder") + @ResponseStatus(HttpStatus.OK) + public void cacheReferencesOrder(HttpServletRequest request) + throws ServletException, IOException { + SessionMap sessionMap = getSessionMap(request); + Set questionReferences = getQuestionReferences(sessionMap); + + //cache references' sequenceIds + Map sequenceIdsParamMap = splitRequestParameter(request, + AssessmentConstants.ATTR_REFERENCES_SEQUENCE_IDS); + List updatedQuestionReferences = new LinkedList<>(); + for (QuestionReference questionReference : questionReferences.toArray(new QuestionReference[0])) { + String newSequenceId = sequenceIdsParamMap + .get(AssessmentConstants.PARAM_SEQUENCE_ID + questionReference.getSequenceId()); + questionReference.setSequenceId(Integer.valueOf(newSequenceId)); + updatedQuestionReferences.add(questionReference); + } + questionReferences.clear(); + questionReferences.addAll(updatedQuestionReferences); + } + /** + * change reference's MaxMark + */ + @RequestMapping("/changeMaxMark") + @ResponseStatus(HttpStatus.OK) + public void changeMaxMark(HttpServletRequest request, @RequestParam int referenceSequenceId, + @RequestParam int maxMark) throws ServletException, IOException { + SessionMap sessionMap = getSessionMap(request); + SortedSet questionReferences = getQuestionReferences(sessionMap); + + //find reference to edit + List rList = new ArrayList<>(questionReferences); + QuestionReference questionReference = rList.get(referenceSequenceId); + questionReference.setMaxMark(maxMark); + } + + /** * Ajax call, will add one more input line for a new OverallFeedback. */ @RequestMapping("/initOverallFeedback") @@ -884,32 +856,6 @@ return list; } - private Set cacheReferencesMaxMarks(HttpServletRequest request, - SessionMap sessionMap, boolean isFormSubmit) { - Map paramMap = splitRequestParameter(request, - AssessmentConstants.ATTR_QUESTION_REFERENCES_MAX_MARKS); - - SortedSet questionReferences = getQuestionReferences(sessionMap); - for (QuestionReference questionReference : questionReferences) { - try { - int maxMark; - if (isFormSubmit) { - maxMark = WebUtil.readIntParam(request, - AssessmentConstants.PARAM_MAX_MARK + questionReference.getSequenceId()); - } else { - String maxMarkStr = paramMap.get(AssessmentConstants.PARAM_MAX_MARK + questionReference.getSequenceId()); - maxMark = Integer.valueOf(maxMarkStr); - } - - questionReference.setMaxMark(maxMark); - } catch (Exception e) { - log.debug(e.getMessage()); - } - } - - return questionReferences; - } - /** * Get overall feedbacks from HttpRequest * Index: lams_tool_assessment/web/pages/authoring/basic.jsp =================================================================== diff -u -r0ebe2a9625e896e58700f9e6aaacab2190e6e348 -rec62f6f6a9e56cd545c527d2fd530614b3a7e744 --- lams_tool_assessment/web/pages/authoring/basic.jsp (.../basic.jsp) (revision 0ebe2a9625e896e58700f9e6aaacab2190e6e348) +++ lams_tool_assessment/web/pages/authoring/basic.jsp (.../basic.jsp) (revision ec62f6f6a9e56cd545c527d2fd530614b3a7e744) @@ -42,87 +42,64 @@ ); }) - //handler for "Import" button. Caches references maxMarks. - $(document).on("click", '#import-button[disabled!=disabled]', function() { + //handler for "delete" buttons + $(document).on("click", '.delete-reference-link', function() { + var deletionConfirmed = confirm(""); + + if (deletionConfirmed) { + var sequenceId = $('.reference-sequence-id', $(this).parents('tr')).val(); + + $(questionListTargetDiv).load( + "", + { + referenceSequenceId: sequenceId, + sessionMapID: "${sessionMapID}" + }, + function(){ + reinitializePassingMarkSelect(false); + refreshThickbox(); + } + ); + }; + }); + + //handler for "maxMark" inputs + $(document).on("change", '.max-mark-input', function() { + var sequenceId = $('.reference-sequence-id', $(this).parents('tr')).val(); + $.ajax({ - url: '', + url: '', type: 'POST', data: { sessionMapID: "${sessionMapID}", - referenceMaxMarks: serializeReferenceMaxMarks() + referenceSequenceId: sequenceId, + maxMark: this.value } }); }); }); //The panel of assessment list panel var questionListTargetDiv = "#itemArea"; - function deleteQuestionReference(idx){ - var deletionConfirmed = confirm(""); - - if (deletionConfirmed) { - var url = ""; - $(questionListTargetDiv).load( - url, - { - questionReferenceIndex: idx, - sessionMapID: "${sessionMapID}", - referenceMaxMarks: serializeReferenceMaxMarks() - }, - function(){ - reinitializePassingMarkSelect(false); - refreshThickbox(); - } - ); - }; - } - function upQuestionReference(idx){ - var url = ""; - $(questionListTargetDiv).load( - url, - { - questionReferenceIndex: idx, - sessionMapID: "${sessionMapID}", - referenceMaxMarks: serializeReferenceMaxMarks() - }, - function(){ - refreshThickbox(); - } - ); - } - function downQuestionReference(idx){ - var url = ""; - $(questionListTargetDiv).load( - url, - { - questionReferenceIndex: idx, - sessionMapID: "${sessionMapID}", - referenceMaxMarks: serializeReferenceMaxMarks() - }, - function(){ - refreshThickbox(); - } - ); - } - function serializeReferenceMaxMarks(){ - var serializedMaxMarks = ""; - $("[name^=maxMark]").each(function() { - serializedMaxMarks += "&" + this.name + "=" + this.value; - }); - return serializedMaxMarks; - } - function initNewReferenceHref() { var questionTypeDropdown = document.getElementById("questionType"); var questionType = questionTypeDropdown.value; - var newQuestionInitHref = "?sessionMapID=${sessionMapID}&questionType=" + questionType + "&referenceMaxMarks=" + encodeURIComponent(serializeReferenceMaxMarks()) + "&KeepThis=true&TB_iframe=true&modal=true"; + var newQuestionInitHref = "?sessionMapID=${sessionMapID}" + + "&questionType=" + questionType + + "&KeepThis=true&TB_iframe=true&modal=true"; $("#newQuestionInitHref").attr("href", newQuestionInitHref); }; - function createEditQuestionHref(idx){ - var editHref = "?sessionMapID=${sessionMapID}&questionReferenceIndex=" + idx + "&referenceMaxMarks=" + encodeURIComponent(serializeReferenceMaxMarks()) + "&KeepThis=true&TB_iframe=true&modal=true"; - $("#edit-ref-" + idx).attr("href", editHref); - } + + //handler for "edit" buttons + function editReference(link) { + var sequenceId = $('.reference-sequence-id', $(link).parents('tr')).val(); + + var editHref = "?sessionMapID=${sessionMapID}" + + "&referenceSequenceId=" + sequenceId + + "&KeepThis=true&TB_iframe=true&modal=true"; + $(link).attr("href", editHref); + } function refreshThickbox(){ tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox Index: lams_tool_assessment/web/pages/authoring/parts/questionlist.jsp =================================================================== diff -u -r8eefd9a2f57ce5b05eb75908e36bb042c5fe7fce -rec62f6f6a9e56cd545c527d2fd530614b3a7e744 --- lams_tool_assessment/web/pages/authoring/parts/questionlist.jsp (.../questionlist.jsp) (revision 8eefd9a2f57ce5b05eb75908e36bb042c5fe7fce) +++ lams_tool_assessment/web/pages/authoring/parts/questionlist.jsp (.../questionlist.jsp) (revision ec62f6f6a9e56cd545c527d2fd530614b3a7e744) @@ -1,7 +1,8 @@ <%@ include file="/common/taglibs.jsp"%> - <%@ page import="org.lamsfoundation.lams.qb.service.IQbService" %> + +
@@ -39,6 +83,8 @@ + + @@ -88,31 +134,17 @@ - + - - - - - - - - - - - - + "> - " - onclick="javascript:deleteQuestionReference(${status.index})"> + ">