Index: lams_tool_assessment/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r8a7a259deba12163c46440a712e41bde926fdaf8 -r0586f1081f3b7e5b550da93b64463175ea698c28 --- lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 8a7a259deba12163c46440a712e41bde926fdaf8) +++ lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 0586f1081f3b7e5b550da93b64463175ea698c28) @@ -78,8 +78,15 @@ label.authoring.ordering.add.ordering = Add question label.authoring.advance.allow.students.overall.feedback = Display overall feedback at the end of each attempt label.authoring.advance.time.limit = Time limit (minutes) +label.authoring.advance.question.distribution = Question distribution label.authoring.advance.questions.per.page = Questions per page label.authoring.advance.all.in.one.page = All in one page +label.authoring.advance.sections = Sections +label.authoring.advance.section.name = Name +label.authoring.advance.section.questions.count = Questions in section +label.authoring.advance.section.add = Add section +label.authoring.advance.section.remove = Remove section +label.authoring.advance.section.all.remaining.questions = All remaining label.authoring.advance.shuffle.questions = Shuffle questions label.authoring.advance.attempts.allowed = Attempts allowed label.authoring.advance.unlimited = Unlimited @@ -103,6 +110,8 @@ authoring.msg.cancel.save = Do you want to close this window without saving? authoring.msg.one.question.to.be.saved = There must be at least one question to be saved. label.learning.page = Page: +label.learning.section = Section: +label.learning.section.default.name = Section {0} label.learning.title = Assessment label.learning.choose.one.answer = Choose one of the following answers. label.learning.choose.at.least.one.answer = Choose at least one answer. @@ -157,6 +166,9 @@ label.monitoring.user.summary.grade = Grade label.monitoring.user.summary.title = Title: label.monitoring.user.summary.question = Question: +label.monitoring.user.summary.grade.required = requires grading +label.monitoring.user.summary.marker = Marker +label.monitoring.user.summary.marker.comment = Comment label.monitoring.question.summary.history.responses = Responses for the question label.monitoring.question.summary.title = Title label.monitoring.question.summary.question = Question @@ -433,7 +445,7 @@ monitoring.label.all.learners = All learners label.authoring.preview.skip.validation = As a learner you should answer all required questions. In preview mode you are allowed to press this button again to continue. label.monitoring.student.choices.none = No learners have answered questions yet -label.monitoring.user.summary.grade.required = requires grading -label.monitoring.user.summary.grade.by = graded by {0} label.learning.page.next = Next page -label.learning.page.previous = Previous page \ No newline at end of file +label.learning.page.previous = Previous page +label.learning.section.next = Next section +label.learning.section.previous = Previous section \ No newline at end of file Index: lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -r50fabd2b7976cd956f18eb2991c5b386df2102b7 -r0586f1081f3b7e5b550da93b64463175ea698c28 --- lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 50fabd2b7976cd956f18eb2991c5b386df2102b7) +++ lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 0586f1081f3b7e5b550da93b64463175ea698c28) @@ -78,8 +78,15 @@ label.authoring.ordering.add.ordering = Add question label.authoring.advance.allow.students.overall.feedback = Display overall feedback at the end of each attempt label.authoring.advance.time.limit = Time limit (minutes) +label.authoring.advance.question.distribution = Question distribution label.authoring.advance.questions.per.page = Questions per page label.authoring.advance.all.in.one.page = All in one page +label.authoring.advance.sections = Sections +label.authoring.advance.section.name = Name +label.authoring.advance.section.questions.count = Questions in section +label.authoring.advance.section.add = Add section +label.authoring.advance.section.remove = Remove section +label.authoring.advance.section.all.remaining.questions = All remaining label.authoring.advance.shuffle.questions = Shuffle questions label.authoring.advance.attempts.allowed = Attempts allowed label.authoring.advance.unlimited = Unlimited @@ -103,6 +110,8 @@ authoring.msg.cancel.save = Do you want to close this window without saving? authoring.msg.one.question.to.be.saved = There must be at least one question to be saved. label.learning.page = Page: +label.learning.section = Section: +label.learning.section.default.name = Section {0} label.learning.title = Assessment label.learning.choose.one.answer = Choose one of the following answers. label.learning.choose.at.least.one.answer = Choose at least one answer. @@ -157,6 +166,9 @@ label.monitoring.user.summary.grade = Grade label.monitoring.user.summary.title = Title: label.monitoring.user.summary.question = Question: +label.monitoring.user.summary.grade.required = requires grading +label.monitoring.user.summary.marker = Marker +label.monitoring.user.summary.marker.comment = Comment label.monitoring.question.summary.history.responses = Responses for the question label.monitoring.question.summary.title = Title label.monitoring.question.summary.question = Question @@ -360,6 +372,7 @@ admin.return = Return to maintain LAMS admin.button.save = Save admin.hide.titles = Hide question titles for learners +admin.autoexpand.justification = Expand justification panel on question answer label.answer.queue = Answer queue label.drag.and.drop = drag and drop answer to tick or cross label.correct = Correct @@ -432,5 +445,7 @@ monitoring.label.all.learners = All learners label.authoring.preview.skip.validation = As a learner you should answer all required questions. In preview mode you are allowed to press this button again to continue. label.monitoring.student.choices.none = No learners have answered questions yet -label.monitoring.user.summary.grade.required = requires grading -label.monitoring.user.summary.grade.by = graded by {0} +label.learning.page.next = Next page +label.learning.page.previous = Previous page +label.learning.section.next = Next section +label.learning.section.previous = Previous section \ No newline at end of file Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java =================================================================== diff -u -r8a7a259deba12163c46440a712e41bde926fdaf8 -r0586f1081f3b7e5b550da93b64463175ea698c28 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision 8a7a259deba12163c46440a712e41bde926fdaf8) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision 0586f1081f3b7e5b550da93b64463175ea698c28) @@ -59,6 +59,10 @@ public static final String PARAM_NOT_A_NUMBER = "nan"; public static final String PARAM_GRADE = "grade"; + + public static final String PARAM_MARKER_COMMENT = "markerComment"; + + public static final String PARAM_COLUMN = "column"; public static final String PARAM_MAX_MARK = "maxMark"; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rf19d927f4831a3aaaab2bd824618fc35deafd001 -r0586f1081f3b7e5b550da93b64463175ea698c28 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision f19d927f4831a3aaaab2bd824618fc35deafd001) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 0586f1081f3b7e5b550da93b64463175ea698c28) @@ -115,6 +115,7 @@ import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestion; import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult; +import org.lamsfoundation.lams.tool.assessment.model.AssessmentSection; import org.lamsfoundation.lams.tool.assessment.model.AssessmentSession; import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser; import org.lamsfoundation.lams.tool.assessment.model.QuestionReference; @@ -520,6 +521,11 @@ } @Override + public void deleteSection(Long uid) { + assessmentDao.removeObject(AssessmentSection.class, uid); + } + + @Override public Assessment getAssessmentBySessionId(Long sessionId) { AssessmentSession session = assessmentSessionDao.getSessionBySessionId(sessionId); // to skip CGLib problem @@ -1857,6 +1863,10 @@ questionTitleRow.addCell(getMessage("label.answer.justification"), true, ExcelCell.BORDER_STYLE_BOTTOM_THIN); } + questionTitleRow.addCell(getMessage("label.monitoring.user.summary.marker"), true, + ExcelCell.BORDER_STYLE_BOTTOM_THIN); + questionTitleRow.addCell(getMessage("label.monitoring.user.summary.marker.comment"), true, + ExcelCell.BORDER_STYLE_BOTTOM_THIN); int questionNumber = 1; @@ -1981,7 +1991,9 @@ //mark //calculating markCount & markTotal if (questionResult.getMark() != null && questionResult.getFinishDate() != null) { - userResultRow.addCell(questionResult.getMark()); + userResultRow.addCell(questionResult.getMarkedBy() == null + && question.getType().equals(QbQuestion.TYPE_ESSAY) ? "-" + : questionResult.getMark().toString()); markCount++; markTotal += questionResult.getMark(); @@ -1993,6 +2005,9 @@ userResultRow.addCell(AssessmentEscapeUtils .escapeStringForExcelExport(questionResult.getJustification())); } + userResultRow.addCell( + questionResult.getMarkedBy() == null ? "" : questionResult.getMarkedBy().getFullName()); + userResultRow.addCell(questionResult.getMarkerComment()); questionSummaryTabTemp.add(userResultRow); @@ -2062,6 +2077,9 @@ questionTitlesRow.addCell(title, true, ExcelCell.BORDER_STYLE_LEFT_THIN); int columnShift = 1; + if (QbQuestion.TYPE_ESSAY == question.getType()) { + columnShift += 2; + } // currently only MCQ and True/False questions have learner interaction logged // for other question types, do not include the column boolean addAnsweredDateColumn = QbQuestion.TYPE_MULTIPLE_CHOICE == question.getType() @@ -2090,8 +2108,12 @@ for (QuestionReference questionReference : questionReferences) { userSummaryUserHeadersRow.addCell(getMessage("label.export.mark"), ExcelCell.BORDER_STYLE_LEFT_THIN); userSummaryUserHeadersRow.addCell(getMessage("label.authoring.basic.option.answer")); - AssessmentQuestion question = questionReference.getQuestion(); + if (QbQuestion.TYPE_ESSAY == question.getType()) { + userSummaryUserHeadersRow.addCell(getMessage("label.monitoring.user.summary.marker")); + userSummaryUserHeadersRow.addCell(getMessage("label.monitoring.user.summary.marker.comment")); + } + boolean addAnsweredDateColumn = QbQuestion.TYPE_MULTIPLE_CHOICE == question.getType() || QbQuestion.TYPE_TRUE_FALSE == question.getType(); if (addAnsweredDateColumn) { @@ -2100,6 +2122,7 @@ if (assessment.isEnableConfidenceLevels() && QbQuestion.TYPE_MARK_HEDGING != question.getType()) { userSummaryUserHeadersRow.addCell(getMessage("label.confidence")); } + } // a single column at the end of previous headers @@ -2154,6 +2177,12 @@ // learner interaction QbQuestion question = questionResult.getQbQuestion(); + if (QbQuestion.TYPE_ESSAY == question.getType()) { + userResultRow.addCell(questionResult.getMarkedBy() == null ? "" + : questionResult.getMarkedBy().getFullName()); + userResultRow.addCell(questionResult.getMarkerComment()); + } + boolean addAnsweredDateColumn = QbQuestion.TYPE_MULTIPLE_CHOICE == question.getType() || QbQuestion.TYPE_TRUE_FALSE == question.getType(); if (addAnsweredDateColumn) { @@ -2363,66 +2392,77 @@ } @Override - public void changeQuestionResultMark(Long questionResultUid, float newMark, Integer teacherId) { + public void changeQuestionResultMark(Long questionResultUid, Float newMark, String markerComment, + Integer teacherId) { + if (newMark == null && markerComment == null) { + // nothing to chagne + return; + } AssessmentQuestionResult questionResult = assessmentQuestionResultDao .getAssessmentQuestionResultByUid(questionResultUid); - float oldMark = questionResult.getMark(); - AssessmentResult assessmentResult = questionResult.getAssessmentResult(); - float assessmentMark = (assessmentResult.getGrade() - oldMark) + newMark; + if (newMark != null) { + float oldMark = questionResult.getMark(); + AssessmentResult assessmentResult = questionResult.getAssessmentResult(); + float assessmentMark = (assessmentResult.getGrade() - oldMark) + newMark; - Long toolSessionId = assessmentResult.getSessionId(); - Assessment assessment = assessmentResult.getAssessment(); - Long questionUid = questionResult.getQbToolQuestion().getUid(); + Long toolSessionId = assessmentResult.getSessionId(); + Assessment assessment = assessmentResult.getAssessment(); + Long questionUid = questionResult.getQbToolQuestion().getUid(); - AssessmentUser teacher = null; - if (teacherId != null) { - teacher = getUserByIdAndContent(teacherId.longValue(), assessment.getContentId()); - } + User teacher = null; + if (teacherId != null) { + teacher = userManagementService.getUserById(teacherId); + } - // When changing a mark for user and isUseSelectLeaderToolOuput is true, the mark should be propagated to all - // students within the group - List users = new ArrayList<>(); - if (assessment.isUseSelectLeaderToolOuput()) { - users = getUsersBySession(toolSessionId); - } else { - users = new ArrayList<>(); - AssessmentUser user = assessmentResult.getUser(); - users.add(user); - } + // When changing a mark for user and isUseSelectLeaderToolOuput is true, the mark should be propagated to all + // students within the group + List users = new ArrayList<>(); + if (assessment.isUseSelectLeaderToolOuput()) { + users = getUsersBySession(toolSessionId); + } else { + users = new ArrayList<>(); + AssessmentUser user = assessmentResult.getUser(); + users.add(user); + } - for (AssessmentUser user : users) { - Long userId = user.getUserId(); + for (AssessmentUser user : users) { + Long userId = user.getUserId(); - List questionResults = assessmentQuestionResultDao - .getAssessmentQuestionResultList(assessment.getUid(), userId, questionUid); + List questionResults = assessmentQuestionResultDao + .getAssessmentQuestionResultList(assessment.getUid(), userId, questionUid); - if ((questionResults == null) || questionResults.isEmpty()) { - log.warn("User with uid: " + user.getUid() - + " doesn't have any results despite the fact group leader has some."); - continue; - } + if ((questionResults == null) || questionResults.isEmpty()) { + log.warn("User with uid: " + user.getUid() + + " doesn't have any results despite the fact group leader has some."); + continue; + } - Object[] lastAssessmentQuestionResultObj = questionResults.get(questionResults.size() - 1); - AssessmentQuestionResult lastAssessmentQuestionResult = (AssessmentQuestionResult) lastAssessmentQuestionResultObj[0]; + Object[] lastAssessmentQuestionResultObj = questionResults.get(questionResults.size() - 1); + AssessmentQuestionResult lastAssessmentQuestionResult = (AssessmentQuestionResult) lastAssessmentQuestionResultObj[0]; - lastAssessmentQuestionResult.setMark(newMark); - if (teacher != null) { - lastAssessmentQuestionResult.setMarkedBy(teacher); - } - assessmentQuestionResultDao.saveObject(lastAssessmentQuestionResult); + lastAssessmentQuestionResult.setMark(newMark); + if (teacher != null) { + lastAssessmentQuestionResult.setMarkedBy(teacher); + } + assessmentQuestionResultDao.saveObject(lastAssessmentQuestionResult); - AssessmentResult result = lastAssessmentQuestionResult.getAssessmentResult(); - result.setGrade(assessmentMark); - assessmentResultDao.saveObject(result); + AssessmentResult result = lastAssessmentQuestionResult.getAssessmentResult(); + result.setGrade(assessmentMark); + assessmentResultDao.saveObject(result); - // propagade changes to Gradebook - toolService.updateActivityMark(Double.valueOf(assessmentMark), null, userId.intValue(), toolSessionId, - false); + // propagade changes to Gradebook + toolService.updateActivityMark(Double.valueOf(assessmentMark), null, userId.intValue(), toolSessionId, + false); - // records mark change with audit service - logEventService.logMarkChange(userId, user.getLoginName(), assessment.getContentId(), "" + oldMark, - "" + assessmentMark); + // records mark change with audit service + logEventService.logMarkChange(userId, user.getLoginName(), assessment.getContentId(), "" + oldMark, + "" + assessmentMark); + } } + if (markerComment != null) { + questionResult.setMarkerComment(markerComment); + assessmentResultDao.saveObject(questionResult); + } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -r7b3eba5d7b856941bb0b89cb6e49a1498a8feac4 -r0586f1081f3b7e5b550da93b64463175ea698c28 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 7b3eba5d7b856941bb0b89cb6e49a1498a8feac4) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 0586f1081f3b7e5b550da93b64463175ea698c28) @@ -198,6 +198,8 @@ void deleteQuestionReference(Long uid); + void deleteSection(Long uid); + /** * Get assessment which is relative with the special toolSession. * @@ -456,7 +458,7 @@ */ List getMarksArrayForLeaders(Long contentId); - void changeQuestionResultMark(Long questionResultUid, float newMark, Integer teacherId); + void changeQuestionResultMark(Long questionResultUid, Float newMark, String markerComment, Integer teacherId); void notifyTeachersOnAttemptCompletion(Long sessionId, String userName); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java =================================================================== diff -u -r8a7a259deba12163c46440a712e41bde926fdaf8 -r0586f1081f3b7e5b550da93b64463175ea698c28 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 8a7a259deba12163c46440a712e41bde926fdaf8) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 0586f1081f3b7e5b550da93b64463175ea698c28) @@ -75,6 +75,7 @@ import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestion; import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult; +import org.lamsfoundation.lams.tool.assessment.model.AssessmentSection; import org.lamsfoundation.lams.tool.assessment.model.AssessmentSession; import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser; import org.lamsfoundation.lams.tool.assessment.model.QuestionReference; @@ -385,22 +386,41 @@ } //paging + int questionPerPageCount = assessment.getQuestionsPerPage(); + List paging = null; + if (questionPerPageCount == -1) { + paging = assessment.getSections().stream() + .collect(Collectors.mapping(AssessmentSection::getQuestionCount, Collectors.toList())); + } else if (questionPerPageCount == 0) { + paging = List.of(questionDtos.size()); + } else { + paging = new ArrayList<>(); + int pageCount = questionDtos.size() / questionPerPageCount; + if (questionDtos.size() % questionPerPageCount > 0) { + pageCount++; + } + for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++) { + paging.add(questionPerPageCount); + } + } + List> pagedQuestionDtos = new ArrayList<>(); - int maxQuestionsPerPage = ((assessment.getQuestionsPerPage() != 0) && hasEditRight) - ? assessment.getQuestionsPerPage() - : questionDtos.size(); - LinkedHashSet questionsForOnePage = new LinkedHashSet<>(); + Set questionsForOnePage = new LinkedHashSet<>(); pagedQuestionDtos.add(questionsForOnePage); - int count = 0; + int questionInPageCount = 0; + Iterator pageIterator = paging.iterator(); + questionPerPageCount = pageIterator.next(); // lists all code styles used in this assessment Set codeStyles = new HashSet<>(); for (QuestionDTO questionDto : questionDtos) { questionsForOnePage.add(questionDto); - count++; - if ((questionsForOnePage.size() == maxQuestionsPerPage) && (count != questionDtos.size())) { + questionInPageCount++; + if (questionPerPageCount > 0 && questionInPageCount == questionPerPageCount && pageIterator.hasNext()) { questionsForOnePage = new LinkedHashSet<>(); pagedQuestionDtos.add(questionsForOnePage); + questionPerPageCount = pageIterator.next(); + questionInPageCount = 0; } if (questionDto.getCodeStyle() != null) { @@ -483,10 +503,11 @@ String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = getSessionMap(request); int oldPageNumber = (Integer) sessionMap.get(AssessmentConstants.ATTR_PAGE_NUMBER); + boolean hasEditRight = (Boolean) sessionMap.get(AssessmentConstants.ATTR_HAS_EDIT_RIGHT); //if AnswersValidationFailed - get pageNumber as request parameter and as method parameter otherwise int pageNumberToOpen; - if (isAnswersValidationFailed) { + if (isAnswersValidationFailed && hasEditRight) { pageNumberToOpen = pageNumberWithUnasweredQuestions; } else { pageNumberToOpen = WebUtil.readIntParam(request, AssessmentConstants.ATTR_PAGE_NUMBER); @@ -508,10 +529,12 @@ return "pages/learning/results"; } else { - //get user answers from request and store them into sessionMap - storeUserAnswersIntoSessionMap(request, oldPageNumber); - // store results from sessionMap into DB - storeUserAnswersIntoDatabase(sessionMap, true); + if (hasEditRight) { + //get user answers from request and store them into sessionMap + storeUserAnswersIntoSessionMap(request, oldPageNumber); + // store results from sessionMap into DB + storeUserAnswersIntoDatabase(sessionMap, true); + } // use redirect to prevent form resubmission String redirectURL = "redirect:/pages/learning/learning.jsp"; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java =================================================================== diff -u -r7b3eba5d7b856941bb0b89cb6e49a1498a8feac4 -r0586f1081f3b7e5b550da93b64463175ea698c28 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 7b3eba5d7b856941bb0b89cb6e49a1498a8feac4) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 0586f1081f3b7e5b550da93b64463175ea698c28) @@ -333,16 +333,31 @@ } @RequestMapping(path = "/saveUserGrade", method = RequestMethod.POST) - public void saveUserGrade(HttpServletRequest request, HttpServletResponse response) { - + @ResponseBody + public String saveUserGrade(HttpServletRequest request, HttpServletResponse response) { + String responseText = null; if ((request.getParameter(AssessmentConstants.PARAM_NOT_A_NUMBER) == null) && !StringUtils.isEmpty(request.getParameter(AssessmentConstants.PARAM_QUESTION_RESULT_UID))) { Long questionResultUid = WebUtil.readLongParam(request, AssessmentConstants.PARAM_QUESTION_RESULT_UID); - float newGrade = Float.valueOf(request.getParameter(AssessmentConstants.PARAM_GRADE)); HttpSession ss = SessionManager.getSession(); UserDTO teacher = (UserDTO) ss.getAttribute(AttributeNames.USER); - service.changeQuestionResultMark(questionResultUid, newGrade, teacher.getUserID()); + + String column = request.getParameter(AssessmentConstants.PARAM_COLUMN); + Float newGrade = null; + String markerComment = null; + if (column.equals(AssessmentConstants.PARAM_GRADE)) { + String gradeString = request.getParameter(AssessmentConstants.PARAM_GRADE); + if (StringUtils.isNotBlank(gradeString) && !gradeString.strip().equals("-")) { + newGrade = Float.valueOf(gradeString); + responseText = teacher.getLastName() + " " + teacher.getFirstName(); + } + } else if (column.equals(AssessmentConstants.PARAM_MARKER_COMMENT)) { + markerComment = request.getParameter(AssessmentConstants.PARAM_MARKER_COMMENT); + } + + service.changeQuestionResultMark(questionResultUid, newGrade, markerComment, teacher.getUserID()); } + return responseText; } /** @@ -577,8 +592,14 @@ userData.add(questionResultUid); userData.add(questionResult.getMaxMark()); userData.add(fullName); - //LDEV_NTU-11 Swapping Mark and Response columns in Assessment Monitor - userData.add(questionResult.getMark()); + + String response = AssessmentEscapeUtils.printResponsesForJqgrid(questionResult); + if (StringUtils.isNotBlank(questionResult.getJustification())) { + response += "
" + service.getMessage("label.answer.justification") + "
" + + questionResult.getJustificationEscaped(); + } + userData.add(response); + // show confidence levels if this feature is turned ON if (assessment.isEnableConfidenceLevels()) { userData.add(questionResult.getQbQuestion().getType().equals(QbQuestion.TYPE_MARK_HEDGING) ? -1 @@ -612,15 +633,17 @@ userData.add(starString); } - String response = AssessmentEscapeUtils.printResponsesForJqgrid(questionResult); - if (StringUtils.isNotBlank(questionResult.getJustification())) { - response += "
" + service.getMessage("label.answer.justification") + "
" - + questionResult.getJustificationEscaped(); - } - - userData.add(response); - userData.add(questionResult.getMarkedBy() == null ? "" : questionResult.getMarkedBy().getFullName()); + //LDEV_NTU-11 Swapping Mark and Response columns in Assessment Monitor + userData.add(questionResult.getQbQuestion().getType().equals(QbQuestion.TYPE_ESSAY) + && questionResult.getMarkedBy() == null ? "-" : questionResult.getMark().toString()); + userData.add( + questionResult.getMarkedBy() == null + ? (questionResult.getQbQuestion().getType().equals(QbQuestion.TYPE_ESSAY) + ? service.getMessage("label.monitoring.user.summary.grade.required") + : "") + : questionResult.getMarkedBy().getFullName()); + userData.add(questionResult.getMarkerComment()); } else { userData.add(""); userData.add(""); @@ -634,6 +657,7 @@ } userData.add("-"); userData.add(""); + userData.add(""); } userData.add(userDto.getUserId()); Index: lams_tool_assessment/web/pages/monitoring/parts/masterDetailLoadUp.jsp =================================================================== diff -u -r7b3eba5d7b856941bb0b89cb6e49a1498a8feac4 -r0586f1081f3b7e5b550da93b64463175ea698c28 --- lams_tool_assessment/web/pages/monitoring/parts/masterDetailLoadUp.jsp (.../masterDetailLoadUp.jsp) (revision 7b3eba5d7b856941bb0b89cb6e49a1498a8feac4) +++ lams_tool_assessment/web/pages/monitoring/parts/masterDetailLoadUp.jsp (.../masterDetailLoadUp.jsp) (revision 0586f1081f3b7e5b550da93b64463175ea698c28) @@ -14,6 +14,8 @@ <%@ include file="userresponse.jsp"%> var table = jQuery("#userSummary${param.tableName}"); + table.addRowData(${i.index + 1}, { id:"${i.index + 1}", questionResultUid:"${questionResult.uid}", @@ -22,32 +24,33 @@ confidence:"${question.type == 8 ? -1 : questionResult.confidenceLevel}", - grade:"" + grade: + + + "-" + + + "" + + , + marker : + + + ("") + + + "" + + + "" + + , + markerComment: "" }); - // set maxGrade attribute to cell DOM element - table.setCell(${i.index + 1}, "grade", "", ${requiresMarking ? "'requires-grading'" : "null"}, - {"maxGrade" : "${questionResult.maxMark}" - - - ,"title" : "" - ,"data-toggle" : "tooltip" - ,"data-container" : "body" - - - ,"title" : " - - " - ,"data-toggle" : "tooltip" - ,"data-container" : "body" - - - }); + table.setCell(${i.index + 1}, "grade", "", null, {"maxGrade" : "${questionResult.maxMark}"}); - - $('[data-toggle="tooltip"]').bootstrapTooltip(); if (typeof CodeMirror != 'undefined') { CodeMirror.colorize($('.code-style')); Index: lams_tool_assessment/web/pages/monitoring/summary.jsp =================================================================== diff -u -r7b3eba5d7b856941bb0b89cb6e49a1498a8feac4 -r0586f1081f3b7e5b550da93b64463175ea698c28 --- lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 7b3eba5d7b856941bb0b89cb6e49a1498a8feac4) +++ lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 0586f1081f3b7e5b550da93b64463175ea698c28) @@ -119,8 +119,7 @@ }, loadComplete: function () { initializePortraitPopover(''); - }, - + } }) .jqGrid('filterToolbar', { @@ -143,32 +142,52 @@ colNames:[ '#', 'questionResultUid', - 'Question', - "", + "", + "", "", - "" + "", + "", + "" ], colModel:[ {name:'id', index:'id', width:20, sorttype:"int"}, {name:'questionResultUid', index:'questionResultUid', width:0, hidden: true}, {name:'title', index:'title', width: 200}, + {name:'response', index:'response', datatype:'html', width:400, sortable:false}, + + {name:'confidence', index:'confidence', width: 80, classes: 'vertical-align', formatter: gradientNumberFormatter}, + {name:'grade', index:'grade', width:80, sorttype:"float", editable:true, editoptions: {size:4, maxlength: 4}, align:"right", classes: 'vertical-align', title : false }, - - {name:'confidence', index:'confidence', width: 80, classes: 'vertical-align', formatter: gradientNumberFormatter}, - - {name:'response', index:'response', datatype:'html', width:443, sortable:false} + {name:'marker', index:'marker', width: 80, title: false}, + {name:'markerComment', index:'markerComment', width:120, editable:true, sortable: false, + editoptions: {maxlength: 100}, align:"left", classes: 'vertical-align', title : false } ], multiselect: false, cellurl: '&', cellEdit: true, + formatCell: function(rowid, name, value, iRow, iCol){ + if (name != "grade") { + return value; + } + if (value == "-") { + value = "0"; + } + return value; + }, afterEditCell: function (rowid,name,val,iRow,iCol){ + if (name != "grade") { + return; + } oldValue = eval(val); }, beforeSaveCell : function(rowid, name, val, iRow, iCol) { + if (name != "grade") { + return val; + } if (isNaN(val)) { return null; } @@ -181,6 +200,9 @@ } }, afterSaveCell : function (rowid,name,val,iRow,iCol){ + if (name != "grade") { + return; + } if (isNaN(val)) { jQuery("#userSummary" + sessionId).restoreCell(iRow,iCol); } else { @@ -190,11 +212,22 @@ } }, beforeSubmitCell : function (rowid,name,val,iRow,iCol){ - if (isNaN(val)) { + if (name == "grade" && isNaN(val)) { return {nan:true}; } else { var questionResultUid = jQuery("#userSummary" + sessionId).getCell(rowid, 'questionResultUid'); - return {questionResultUid:questionResultUid}; + return { + questionResultUid:questionResultUid, + column:name + }; + } + }, + afterSubmitCell : function (serverresponse, rowid, name, value, iRow, iCol) { + if (serverresponse.statusText == "OK") { + if (serverresponse.responseText != "") { + $(this).setCell(rowid, 'marker', serverresponse.responseText, {}, {}); + } + return [true, ""]; } } });