Index: lams_tool_assessment/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r2282297dcd80ed30e79ec409bf5925b2e9417179 -r8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41 --- lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 2282297dcd80ed30e79ec409bf5925b2e9417179) +++ lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41) @@ -167,7 +167,8 @@ label.monitoring.user.summary.title = Title: label.monitoring.user.summary.question = Question: label.monitoring.user.summary.grade.required = requires grading -label.monitoring.user.summary.grade.by = graded by {0} +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 Index: lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -r4ae8ec393ca91db4253d2445e9ca8ca9d5a9c671 -r8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41 --- lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 4ae8ec393ca91db4253d2445e9ca8ca9d5a9c671) +++ lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41) @@ -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 @@ -431,3 +443,7 @@ label.prevent.learner.autosave.mutliple.tabs = You seem to have two LAMS tabs open for this exam. Please close one of them. Otherwise, answers will not be recorder properly and affect your score. 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.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 -rf86d00ef0e3fc17667feabcec9a04b4b3ca4d619 -r8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision f86d00ef0e3fc17667feabcec9a04b4b3ca4d619) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision 8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41) @@ -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/dbupdates/patch20230207.sql =================================================================== diff -u --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/patch20230207.sql (revision 0) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/patch20230207.sql (revision 8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41) @@ -0,0 +1,15 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; +SET FOREIGN_KEY_CHECKS=0; +-- Put all sql statements below here + +-- LDEV-5360 Add marker's comment column to question result +ALTER TABLE tl_laasse10_question_result + ADD COLUMN marker_comment VARCHAR(100); + +-- Put all sql statements above here + +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; +SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java =================================================================== diff -u -re9f21c562efc19cd5b5f9025f6d47165de059b39 -r8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java (.../AssessmentQuestionResult.java) (revision e9f21c562efc19cd5b5f9025f6d47165de059b39) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java (.../AssessmentQuestionResult.java) (revision 8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41) @@ -77,6 +77,9 @@ @Column private String justification; + + @Column(name = "marker_comment") + private String markerComment; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "marked_by") @@ -214,7 +217,15 @@ public void setMarkedBy(AssessmentUser markedBy) { this.markedBy = markedBy; } + + public String getMarkerComment() { + return markerComment; + } + public void setMarkerComment(String markerComment) { + this.markerComment = markerComment; + } + public AssessmentUser getUser() { return user; } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r09cb8620b7ebc847ae6a700d11ba7c24435a279a -r8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 09cb8620b7ebc847ae6a700d11ba7c24435a279a) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41) @@ -2310,66 +2310,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()); - } + AssessmentUser teacher = null; + if (teacherId != null) { + teacher = getUserByIdAndContent(teacherId.longValue(), assessment.getContentId()); + } - // 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 -r09cb8620b7ebc847ae6a700d11ba7c24435a279a -r8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 09cb8620b7ebc847ae6a700d11ba7c24435a279a) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41) @@ -449,7 +449,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/MonitoringController.java =================================================================== diff -u -re6921d0824d45b08f8fc3d584e1934351c4beb93 -r8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision e6921d0824d45b08f8fc3d584e1934351c4beb93) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41) @@ -346,16 +346,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; } /** Index: lams_tool_assessment/web/pages/monitoring/parts/masterDetailLoadUp.jsp =================================================================== diff -u -rb7ab93d56faa7b55a7603d08e358b7486c5345a0 -r8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41 --- lams_tool_assessment/web/pages/monitoring/parts/masterDetailLoadUp.jsp (.../masterDetailLoadUp.jsp) (revision b7ab93d56faa7b55a7603d08e358b7486c5345a0) +++ lams_tool_assessment/web/pages/monitoring/parts/masterDetailLoadUp.jsp (.../masterDetailLoadUp.jsp) (revision 8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41) @@ -49,7 +49,8 @@ "" - + , + markerComment: "" }); // set maxGrade attribute to cell DOM element Index: lams_tool_assessment/web/pages/monitoring/summary.jsp =================================================================== diff -u -rb7ab93d56faa7b55a7603d08e358b7486c5345a0 -r8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41 --- lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision b7ab93d56faa7b55a7603d08e358b7486c5345a0) +++ lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 8bcf5f3b87aa5b9bcead80b6c2c06a5982513b41) @@ -89,8 +89,7 @@ }, loadComplete: function () { initializePortraitPopover(''); - }, - + } }) .jqGrid('filterToolbar', { @@ -114,13 +113,14 @@ '#', 'questionResultUid', 'questionType', - 'Question', + "", "", "", "", - "Marker" + "", + "" ], colModel:[ {name:'id', index:'id', width:20, sorttype:"int"}, @@ -132,23 +132,34 @@ {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:'response', index:'response', datatype:'html', width:400, 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, cellname, value, iRow, iCol){ + 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; } @@ -161,6 +172,9 @@ } }, afterSaveCell : function (rowid,name,val,iRow,iCol){ + if (name != "grade") { + return; + } if (isNaN(val)) { jQuery("#userSummary${sessionDto.sessionId}").restoreCell(iRow,iCol); } else { @@ -170,13 +184,25 @@ } }, beforeSubmitCell : function (rowid,name,val,iRow,iCol){ - if (isNaN(val)) { + if (name == "grade" && isNaN(val)) { return {nan:true}; } else { var questionResultUid = jQuery("#userSummary${sessionDto.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, ""]; + } + + } });