Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java =================================================================== diff -u -reeb8faaea5372ccf5445d7172f726931e9f26098 -r1e25de333185aa272dbfc03ea327ea740a0094ba --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision eeb8faaea5372ccf5445d7172f726931e9f26098) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision 1e25de333185aa272dbfc03ea327ea740a0094ba) @@ -21,7 +21,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.tool.assessment.web.action; import java.io.IOException; @@ -126,7 +125,13 @@ if (param.equals("statistic")) { return statistic(mapping, form, request, response); } - + if (param.equals("discloseCorrectAnswers")) { + return discloseCorrectAnswers(mapping, form, request, response); + } + if (param.equals("discloseGroupsAnswers")) { + return discloseGroupsAnswers(mapping, form, request, response); + } + return mapping.findForward(AssessmentConstants.ERROR); } @@ -153,7 +158,8 @@ Date tzSubmissionDeadline = DateUtil.convertToTimeZoneFromDefault(teacherTimeZone, submissionDeadline); request.setAttribute(AssessmentConstants.ATTR_SUBMISSION_DEADLINE, tzSubmissionDeadline.getTime()); // use the unconverted time, as convertToStringForJSON() does the timezone conversion if needed - request.setAttribute(AssessmentConstants.ATTR_SUBMISSION_DEADLINE_DATESTRING, DateUtil.convertToStringForJSON(submissionDeadline, request.getLocale())); + request.setAttribute(AssessmentConstants.ATTR_SUBMISSION_DEADLINE_DATESTRING, + DateUtil.convertToStringForJSON(submissionDeadline, request.getLocale())); } @@ -198,13 +204,13 @@ WebUtil.readStrParam(request, AttributeNames.PARAM_CONTENT_FOLDER_ID)); return mapping.findForward(AssessmentConstants.SUCCESS); } - + private ActionForward userMasterDetail(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { initAssessmentService(); Long userId = WebUtil.readLongParam(request, AttributeNames.PARAM_USER_ID); Long sessionId = WebUtil.readLongParam(request, AssessmentConstants.PARAM_SESSION_ID); - String sessionMapID = request.getParameter(AssessmentConstants.ATTR_SESSION_MAP_ID); + String sessionMapID = request.getParameter(AssessmentConstants.ATTR_SESSION_MAP_ID); AssessmentResultDTO result = service.getUserMasterDetail(sessionId, userId); request.setAttribute(AssessmentConstants.ATTR_ASSESSMENT_RESULT, result); @@ -270,7 +276,7 @@ * @param request * @param response * @return - * @throws IOException + * @throws IOException */ private ActionForward setSubmissionDeadline(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException { @@ -322,7 +328,7 @@ String activityEvaluation = WebUtil.readStrParam(request, AssessmentConstants.ATTR_ACTIVITY_EVALUATION); service.setActivityEvaluation(contentID, activityEvaluation); - // update the session ready for stats tab to be reloaded otherwise flicking between tabs + // update the session ready for stats tab to be reloaded otherwise flicking between tabs // causes the old value to be redisplayed sessionMap.put(AssessmentConstants.ATTR_ACTIVITY_EVALUATION, activityEvaluation); @@ -399,8 +405,9 @@ String fullName = HtmlUtils.htmlEscape(userDto.getFirstName() + " " + userDto.getLastName()); userData.put(fullName); userData.put(userDto.getGrade()); - if (userDto.getPortraitId() != null ) + if (userDto.getPortraitId() != null) { userData.put(userDto.getPortraitId()); + } JSONObject userRow = new JSONObject(); userRow.put("id", i++); @@ -500,15 +507,16 @@ userData.put(questionResult.getMaxMark()); userData.put(fullName); userData.put(AssessmentEscapeUtils.printResponsesForJqgrid(questionResult)); - // show confidence levels if this feature is turned ON + // show confidence levels if this feature is turned ON if (assessment.isEnableConfidenceLevels()) { userData.put(questionResult.getConfidenceLevel()); } - + userData.put(questionResult.getMark()); - if (userDto.getPortraitId() != null ) + if (userDto.getPortraitId() != null) { userData.put(userDto.getPortraitId()); - + } + } else { userData.put(""); userData.put(""); @@ -538,7 +546,7 @@ return null; } - /** + /** * Get the mark summary with data arranged in bands. Can be displayed graphically or in a table. */ private ActionForward getMarkChartData(ActionMapping mapping, ActionForm form, HttpServletRequest request, @@ -554,21 +562,22 @@ Long contentId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_CONTENT_ID); Assessment assessment = service.getAssessmentByContentId(contentId); List results = null; - - if ( assessment != null ) { - if ( assessment.isUseSelectLeaderToolOuput() ) { + + if (assessment != null) { + if (assessment.isUseSelectLeaderToolOuput()) { results = service.getMarksArrayForLeaders(contentId); } else { Long sessionId = WebUtil.readLongParam(request, AssessmentConstants.ATTR_TOOL_SESSION_ID); results = service.getMarksArray(sessionId); } } - + JSONObject responseJSON = new JSONObject(); - if ( results != null ) + if (results != null) { responseJSON.put("data", results); - else + } else { responseJSON.put("data", new Float[0]); + } res.setContentType("application/json;charset=utf-8"); res.getWriter().write(responseJSON.toString()); @@ -638,7 +647,7 @@ return null; } - + private ActionForward statistic(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { @@ -650,8 +659,8 @@ Long contentId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); Assessment assessment = service.getAssessmentByContentId(contentId); - if ( assessment != null ) { - if ( assessment.isUseSelectLeaderToolOuput() ) { + if (assessment != null) { + if (assessment.isUseSelectLeaderToolOuput()) { LeaderResultsDTO leaderDto = service.getLeaderResultsDTOForLeaders(contentId); sessionMap.put("leaderDto", leaderDto); } else { @@ -662,7 +671,42 @@ return mapping.findForward(AssessmentConstants.SUCCESS); } + /** + * Allows displaying correct answers to learners + */ + private ActionForward discloseCorrectAnswers(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws JSONException { + Long questionUid = WebUtil.readLongParam(request, "questionUid"); + Long toolContentId = WebUtil.readLongParam(request, AssessmentConstants.PARAM_TOOL_CONTENT_ID); + initAssessmentService(); + AssessmentQuestion question = service.getAssessmentQuestionByUid(questionUid); + question.setCorrectAnswersDisclosed(true); + service.updateAssessmentQuestion(question); + + service.notifyLearnersOnAnswerDisclose(toolContentId); + + return null; + } + + /** + * Allows displaying other groups' answers to learners + */ + private ActionForward discloseGroupsAnswers(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws JSONException { + Long questionUid = WebUtil.readLongParam(request, "questionUid"); + Long toolContentId = WebUtil.readLongParam(request, AssessmentConstants.PARAM_TOOL_CONTENT_ID); + + initAssessmentService(); + AssessmentQuestion question = service.getAssessmentQuestionByUid(questionUid); + question.setGroupsAnswersDisclosed(true); + service.updateAssessmentQuestion(question); + + service.notifyLearnersOnAnswerDisclose(toolContentId); + + return null; + } + // ************************************************************************************* // Private method // ************************************************************************************* Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/TblMonitoringAction.java =================================================================== diff -u -r5e40c22a096ef6175b11206e276600782348306d -r1e25de333185aa272dbfc03ea327ea740a0094ba --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/TblMonitoringAction.java (.../TblMonitoringAction.java) (revision 5e40c22a096ef6175b11206e276600782348306d) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/TblMonitoringAction.java (.../TblMonitoringAction.java) (revision 1e25de333185aa272dbfc03ea327ea740a0094ba) @@ -347,46 +347,6 @@ return mapping.findForward("teams"); } - /** - * Allows displaying correct answers to learners - * - * @throws JSONException - */ - public ActionForward discloseCorrectAnswers(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) throws JSONException { - Long questionUid = WebUtil.readLongParam(request, "questionUid"); - Long toolContentId = WebUtil.readLongParam(request, AssessmentConstants.PARAM_TOOL_CONTENT_ID); - - initAssessmentService(); - AssessmentQuestion question = assessmentService.getAssessmentQuestionByUid(questionUid); - question.setCorrectAnswersDisclosed(true); - assessmentService.updateAssessmentQuestion(question); - - assessmentService.notifyLearnersOnAnswerDisclose(toolContentId); - - return null; - } - - /** - * Allows displaying other groups' answers to learners - * - * @throws JSONException - */ - public ActionForward discloseGroupsAnswers(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) throws JSONException { - Long questionUid = WebUtil.readLongParam(request, "questionUid"); - Long toolContentId = WebUtil.readLongParam(request, AssessmentConstants.PARAM_TOOL_CONTENT_ID); - - initAssessmentService(); - AssessmentQuestion question = assessmentService.getAssessmentQuestionByUid(questionUid); - question.setGroupsAnswersDisclosed(true); - assessmentService.updateAssessmentQuestion(question); - - assessmentService.notifyLearnersOnAnswerDisclose(toolContentId); - - return null; - } - // ************************************************************************************* // Private method // ************************************************************************************* Index: lams_tool_assessment/web/WEB-INF/struts-config.xml =================================================================== diff -u -ra05411c3da91b4b357b1615cc5361ea25e3614da -r1e25de333185aa272dbfc03ea327ea740a0094ba --- lams_tool_assessment/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision a05411c3da91b4b357b1615cc5361ea25e3614da) +++ lams_tool_assessment/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision 1e25de333185aa272dbfc03ea327ea740a0094ba) @@ -358,6 +358,14 @@ parameter="statistic" > + + + + var portraitId = rowObject[6]; Index: lams_tool_assessment/web/pages/monitoring/summary.jsp =================================================================== diff -u -rfeb6062a5128a445b1fa0095b8c9d6cf232af90f -r1e25de333185aa272dbfc03ea327ea740a0094ba --- lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision feb6062a5128a445b1fa0095b8c9d6cf232af90f) +++ lams_tool_assessment/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 1e25de333185aa272dbfc03ea327ea740a0094ba) @@ -159,16 +159,121 @@ resizeJqgrid(jQuery(".ui-jqgrid-btable:visible", this)); }) - $("#questionUid").change(function() { - var questionUid = $("#questionUid").val(); - if (questionUid != -1) { - var questionSummaryUrl = ''; - var questionSummaryHref = questionSummaryUrl + "&questionUid=" + questionUid + "&KeepThis=true&TB_iframe=true&modal=true"; - $("#questionSummaryHref").attr("href", questionSummaryHref); - $("#questionSummaryHref").click(); + var questionUidSelect = $('#questionUid'), + summaryButton = $('#questionSummaryHref'), + correctButton = $('#questionDiscloseCorrect'), + correctAllButton = $('#discloseAllCorrect'), + groupsAllButton = $('#discloseAllGroups'), + groupsButton = $('#questionDiscloseGroups'), + correctButtonLabel = "", + groupsButtonLabel = "", + checkIcon = ' '; + + // when question dropdow changes, manipulate buttons + questionUidSelect.change(function(event) { + var questionUid = $(this).val(), + selectedOption = $('option:selected', this), + // disclosing correct answers works only for multiple choice + isMultipleChoice = selectedOption.attr('isMultipleChoice') == 'true', + correctDisclosed = isMultipleChoice && selectedOption.attr('correctDisclosed'), + groupsDisclosed = selectedOption.attr('groupsDisclosed'); + if (questionUid == -1) { + // user went back to "Choose..." option + summaryButton.addClass('disabled'); + correctButton.show().addClass('disabled').text(correctButtonLabel); + groupsButton.show().addClass('disabled').text(groupsButtonLabel); + } else { + // set link for thickbox + summaryButton.removeClass('disabled').attr("href", + '&questionUid=' + + questionUid + "&KeepThis=true&TB_iframe=true&modal=true"); + // manipulate disclose buttons + if (isMultipleChoice) { + correctButton.show(); + if (correctDisclosed == "true") { + correctButton.addClass('disabled').html(checkIcon + correctButtonLabel); + } else { + correctButton.removeClass('disabled').html(correctButtonLabel); + } + } else { + correctButton.hide(); + } + + if (groupsDisclosed == "true") { + groupsButton.addClass('disabled').html(checkIcon + groupsButtonLabel); + } else { + groupsButton.removeClass('disabled').html(groupsButtonLabel); + } } }); - + + // ajax calls to disclose correct/groups answers + correctButton.click(function(){ + $.ajax({ + 'url' : 'monitoring/discloseCorrectAnswers.do', + 'data' : { + 'questionUid' : questionUidSelect.val(), + 'toolContentID' : '${sessionMap.assessment.contentId}' + } + }).done(function(){ + $('option:selected', questionUidSelect).attr('correctDisclosed', 'true'); + correctButton.addClass('disabled').html(checkIcon + correctButtonLabel); + }); + }); + + groupsButton.click(function(){ + $.ajax({ + 'url' : 'monitoring/discloseGroupsAnswers.do', + 'data' : { + 'questionUid' : questionUidSelect.val(), + 'toolContentID' : '${sessionMap.assessment.contentId}' + } + }).done(function(){ + $('option:selected', questionUidSelect).attr('groupsDisclosed', 'true'); + groupsButton.addClass('disabled').html(checkIcon + groupsButtonLabel); + }); + }); + + correctAllButton.click(function(){ + $('option[correctDisclosed="false"]', questionUidSelect).each(function(){ + var option = $(this), + questionUid = option.val(); + $.ajax({ + 'url' : 'monitoring/discloseCorrectAnswers.do', + 'data' : { + 'questionUid' : questionUid, + 'toolContentID' : '${sessionMap.assessment.contentId}' + } + }).done(function(){ + option.attr('correctDisclosed', 'true'); + if (questionUidSelect.val() == questionUid) { + correctButton.addClass('disabled').html(checkIcon + correctButtonLabel); + } + }); + }); + correctAllButton.addClass('disabled').html(checkIcon + correctAllButton.text()); + }); + + groupsAllButton.click(function(){ + $('option[groupsDisclosed="false"]', questionUidSelect).each(function(){ + var option = $(this), + questionUid = option.val(); + $.ajax({ + 'url' : 'monitoring/discloseGroupsAnswers.do', + 'data' : { + 'questionUid' : questionUid, + 'toolContentID' : '${sessionMap.assessment.contentId}' + } + }).done(function(){ + option.attr('groupsDisclosed', 'true'); + if (questionUidSelect.val() == questionUid) { + groupsButton.addClass('disabled').html(checkIcon + groupsButtonLabel); + } + }); + }); + groupsAllButton.addClass('disabled').html(checkIcon + groupsAllButton.text()); + }); + // trigger the resize when the window first opens so that the grid uses all the space available. setTimeout(function(){ window.dispatchEvent(new Event('resize')); }, 300); }); @@ -273,20 +378,53 @@
-
- -
- + +
- + + + + + + + + + + +
+ + + +
Index: lams_tool_assessment/web/pages/tblmonitoring/assessment.jsp =================================================================== diff -u -r5e40c22a096ef6175b11206e276600782348306d -r1e25de333185aa272dbfc03ea327ea740a0094ba --- lams_tool_assessment/web/pages/tblmonitoring/assessment.jsp (.../assessment.jsp) (revision 5e40c22a096ef6175b11206e276600782348306d) +++ lams_tool_assessment/web/pages/tblmonitoring/assessment.jsp (.../assessment.jsp) (revision 1e25de333185aa272dbfc03ea327ea740a0094ba) @@ -44,9 +44,10 @@ button.one('click', function() { $.ajax({ - 'url' : 'tblmonitoring.do', + 'url' : 'monitoring/' + + (isCorrectButton ? 'discloseCorrectAnswers' : 'discloseGroupsAnswers') + + '.do', 'data' : { - 'method' : isCorrectButton ? 'discloseCorrectAnswers' : 'discloseGroupsAnswers', 'questionUid' : button.closest('.disclose-button-group').attr('questionUid'), 'toolContentID' : $('#selected-content-id').val() }