Index: lams_common/src/java/org/lamsfoundation/lams/questions/Question.java =================================================================== diff -u -rf26fb3937b73bfdefd25a6166863ea188d5f8cb9 -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_common/src/java/org/lamsfoundation/lams/questions/Question.java (.../Question.java) (revision f26fb3937b73bfdefd25a6166863ea188d5f8cb9) +++ lams_common/src/java/org/lamsfoundation/lams/questions/Question.java (.../Question.java) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -41,10 +41,11 @@ public static final String QUESTION_TYPE_ESSAY = "es"; public static final String QUESTION_TYPE_MATCHING = "mt"; public static final String QUESTION_TYPE_FILL_IN_BLANK = "fb"; + public static final String QUESTION_TYPE_MARK_HEDGING = "mh"; public static final Set QUESTION_TYPES = new TreeSet(Arrays.asList(new String[] { Question.QUESTION_TYPE_MULTIPLE_CHOICE, Question.QUESTION_TYPE_MULTIPLE_RESPONSE, Question.QUESTION_TYPE_TRUE_FALSE, Question.QUESTION_TYPE_ESSAY, Question.QUESTION_TYPE_MATCHING, - Question.QUESTION_TYPE_FILL_IN_BLANK })); + Question.QUESTION_TYPE_FILL_IN_BLANK, Question.QUESTION_TYPE_MARK_HEDGING })); private String type; private String title; Index: lams_tool_assessment/conf/xdoclet/struts-actions.xml =================================================================== diff -u -r495a38a55b249f3b65031de0ac76ecbd9b86ce09 -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision 495a38a55b249f3b65031de0ac76ecbd9b86ce09) +++ lams_tool_assessment/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -50,6 +50,7 @@ + - + + + + + Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java =================================================================== diff -u -r1668e000b0959071785e5cdd21732af39bd1505f -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision 1668e000b0959071785e5cdd21732af39bd1505f) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -55,6 +55,8 @@ public static final short QUESTION_TYPE_ESSAY = 6; public static final short QUESTION_TYPE_ORDERING = 7; + + public static final short QUESTION_TYPE_MARK_HEDGING = 8; // for action forward name public static final String SUCCESS = "success"; @@ -113,6 +115,8 @@ public static final String ATTR_OPTION_GRADE_PREFIX = "optionGrade"; + public static final String ATTR_OPTION_CORRECT = "optionCorrect"; + public static final String ATTR_OPTION_FLOAT_PREFIX = "optionFloat"; public static final String ATTR_OPTION_ACCEPTED_ERROR_PREFIX = "optionAcceptedError"; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/patch20150629.sql =================================================================== diff -u --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/patch20150629.sql (revision 0) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/patch20150629.sql (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -0,0 +1,14 @@ +-- 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-3489 New question type for marks hedging +ALTER TABLE tl_laasse10_question_option ADD COLUMN correct TINYINT(1) NOT NULL DEFAULT 0; + +----------------------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/AssessmentQuestion.java =================================================================== diff -u -r1668e000b0959071785e5cdd21732af39bd1505f -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.java (.../AssessmentQuestion.java) (revision 1668e000b0959071785e5cdd21732af39bd1505f) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.java (.../AssessmentQuestion.java) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -108,6 +108,8 @@ private String titleEscaped; + private boolean responseSubmitted; + /** * Grade acquired from QUestionReference in learner. */ @@ -608,4 +610,11 @@ public void setQuestionResults(List questionResults2) { this.questionResults = questionResults2; } + + public boolean isResponseSubmitted() { + return responseSubmitted; + } + public void setResponseSubmitted(boolean responseSubmitted) { + this.responseSubmitted = responseSubmitted; + } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionOption.java =================================================================== diff -u -rb6ddefd42c5660f90bd1da67f25e44d65ee21e30 -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionOption.java (.../AssessmentQuestionOption.java) (revision b6ddefd42c5660f90bd1da67f25e44d65ee21e30) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionOption.java (.../AssessmentQuestionOption.java) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -49,6 +49,8 @@ private float grade; + private boolean correct; + private String feedback; // *************** NON Persist Fields ******************** @@ -171,6 +173,18 @@ } /** + * @hibernate.property column="correct" + * @return + */ + public boolean isCorrect() { + return correct; + } + + public void setCorrect(boolean correct) { + this.correct = correct; + } + + /** * @hibernate.property column="feedback" type="text" * * @return Returns feedback on this answer option. Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java =================================================================== diff -u -r2a68a250e3ae88b708a9a2a91e9f3439a4b6d7a9 -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java (.../AssessmentQuestionResult.java) (revision 2a68a250e3ae88b708a9a2a91e9f3439a4b6d7a9) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java (.../AssessmentQuestionResult.java) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -53,9 +53,9 @@ private Float maxMark; private float penalty; private Set optionAnswers; + private Date finishDate; // DTO fields: - private Date finishDate; private AssessmentUser user; private String answerStringEscaped; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rdacc22919fbce0447cf7850bdfb602d446354050 -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision dacc22919fbce0447cf7850bdfb602d446354050) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -63,6 +63,7 @@ import org.lamsfoundation.lams.notebook.service.ICoreNotebookService; import org.lamsfoundation.lams.rest.RestTags; import org.lamsfoundation.lams.rest.ToolRestManager; +import org.lamsfoundation.lams.tool.ToolAccessMode; import org.lamsfoundation.lams.tool.ToolContentImport102Manager; import org.lamsfoundation.lams.tool.ToolContentManager; import org.lamsfoundation.lams.tool.ToolOutput; @@ -431,6 +432,11 @@ for (LinkedHashSet questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { + //in case single MarkHedging question needs to be stored -- search for that question + if ((singleMarkHedgingQuestionUid != null) && !question.getUid().equals(singleMarkHedgingQuestionUid)) { + continue; + } + // In case if assessment was updated after result has been started check question still exists in DB as // it could be deleted if modified in monitor. if ((assessment.getUpdated() != null) && assessment.getUpdated().after(result.getStartDate())) { @@ -465,8 +471,9 @@ } } - //store grades and finished date only on user hitting submit all answers button - if (!isAutosave) { + //store grades and finished date only on user hitting submit all answers button (and not submit mark hedging question) + boolean isStoreResult = !isAutosave && singleMarkHedgingQuestionUid == null; + if (isStoreResult) { result.setMaximumGrade(maximumGrade); result.setGrade(grade); result.setFinishDate(new Timestamp(new Date().getTime())); @@ -512,7 +519,6 @@ questionAnswer.setAnswerBoolean(question.getAnswerBoolean()); questionAnswer.setAnswerFloat(question.getAnswerFloat()); questionAnswer.setAnswerString(question.getAnswerString()); - questionAnswer.setFinishDate(new Date()); int j = 0; for (AssessmentQuestionOption option : question.getOptions()) { @@ -541,13 +547,15 @@ mark += option.getGrade() * maxMark; } } + } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) { float maxMarkForCorrectAnswer = maxMark / question.getOptions().size(); for (AssessmentQuestionOption option : question.getOptions()) { if (option.getAnswerInt() == option.getUid()) { mark += maxMarkForCorrectAnswer; } } + } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER) { for (AssessmentQuestionOption option : question.getOptions()) { String optionString = option.getOptionString().trim().replaceAll("\\*", ".*"); @@ -567,6 +575,7 @@ break; } } + } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_NUMERICAL) { String answerString = question.getAnswerString(); if (answerString != null) { @@ -608,10 +617,12 @@ } } } + } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_TRUE_FALSE) { if (question.getAnswerBoolean() == question.getCorrectAnswer() && question.getAnswerString() != null) { mark = maxMark; } + } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING) { float maxMarkForCorrectAnswer = maxMark / question.getOptions().size(); TreeSet correctOptionSet = new TreeSet( @@ -625,10 +636,20 @@ mark += maxMarkForCorrectAnswer; } } + + } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) { + for (AssessmentQuestionOption option : question.getOptions()) { + if (option.isCorrect()) { + mark += option.getAnswerInt(); + break; + } + } } //we start calculating and storing marks only in case it's not an autosave request if (!isAutosave) { + + questionAnswer.setFinishDate(new Date()); if (mark > maxMark) { mark = maxMark; @@ -662,6 +683,8 @@ questionAnswer.setMark(mark); questionAnswer.setMaxMark(maxMark); + //for displaying purposes in case of submitSingleMarkHedgingQuestion() Ajax call + question.setMark(mark); } return mark; @@ -869,7 +892,10 @@ for (AssessmentResult result : results) { for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { if (question.getUid().equals(questionResult.getAssessmentQuestion().getUid())) { + + //for displaying purposes, no saving occurrs questionResult.setFinishDate(result.getFinishDate()); + questionResultsForSummary.add(questionResult); break; } @@ -1965,7 +1991,8 @@ if (type == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS || type == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE - || type == AssessmentConstants.QUESTION_TYPE_NUMERICAL) { + || type == AssessmentConstants.QUESTION_TYPE_NUMERICAL + || type == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) { if (!questionJSONData.has(RestTags.ANSWERS)) throw new JSONException("REST Authoring is missing answers for a question of type " + type @@ -1978,6 +2005,7 @@ AssessmentQuestionOption option = new AssessmentQuestionOption(); option.setSequenceId(answerData.getInt(RestTags.DISPLAY_ORDER)); option.setGrade(Float.parseFloat(answerData.getString("grade"))); + option.setCorrect(Boolean.parseBoolean(JsonUtil.opt(answerData, "correct", "false"))); option.setAcceptedError(Float.parseFloat(JsonUtil.opt(answerData, "acceptedError", "0.0"))); option.setFeedback(JsonUtil.opt(answerData, "feedback", (String) null)); option.setOptionString(JsonUtil.opt(answerData, RestTags.ANSWER_TEXT, (String) null)); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java =================================================================== diff -u -ra4a61e7b65ede7f903eb08521a9455685ef9283d -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java (.../AuthoringAction.java) (revision a4a61e7b65ede7f903eb08521a9455685ef9283d) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java (.../AuthoringAction.java) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -595,14 +595,20 @@ // options are different depending on the type if (Question.QUESTION_TYPE_MULTIPLE_CHOICE.equals(question.getType()) - || Question.QUESTION_TYPE_FILL_IN_BLANK.equals(question.getType())) { + || Question.QUESTION_TYPE_FILL_IN_BLANK.equals(question.getType()) + || Question.QUESTION_TYPE_MARK_HEDGING.equals(question.getType())) { boolean isMultipleChoice = Question.QUESTION_TYPE_MULTIPLE_CHOICE.equals(question.getType()); + boolean isMarkHedgingType = Question.QUESTION_TYPE_MARK_HEDGING.equals(question.getType()); // setting answers is very similar in both types, so they were put together here - if (isMultipleChoice) { + if (isMarkHedgingType) { + assessmentQuestion.setType(AssessmentConstants.QUESTION_TYPE_MARK_HEDGING); + + } else if (isMultipleChoice) { assessmentQuestion.setType(AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE); assessmentQuestion.setMultipleAnswersAllowed(false); assessmentQuestion.setShuffle(false); + } else { assessmentQuestion.setType(AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER); assessmentQuestion.setCaseSensitive(false); @@ -628,7 +634,7 @@ if ((answer.getScore() != null) && (answer.getScore() > 0)) { // for fill in blanks question all answers are correct and get full grade - if (!isMultipleChoice || correctAnswer == null) { + if (!isMultipleChoice && !isMarkHedgingType || correctAnswer == null) { // whatever the correct answer holds, it becomes the question score questionGrade = new Double(Math.ceil(answer.getScore())).intValue(); // 100% goes to the correct answer @@ -756,6 +762,59 @@ } else if (Question.QUESTION_TYPE_ESSAY.equals(question.getType())) { assessmentQuestion.setType(AssessmentConstants.QUESTION_TYPE_ESSAY); assessmentQuestion.setAllowRichEditor(false); + + } else if (Question.QUESTION_TYPE_ESSAY.equals(question.getType())) { + assessmentQuestion.setType(AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE); + assessmentQuestion.setShuffle(false); + + String correctAnswer = null; + if (question.getAnswers() != null) { + TreeSet optionList = new TreeSet( + new SequencableComparator()); + int orderId = 1; + for (Answer answer : question.getAnswers()) { + String answerText = QuestionParser.processHTMLField(answer.getText(), false, contentFolderID, + question.getResourcesFolderPath()); + if ((correctAnswer != null) && correctAnswer.equals(answerText)) { + AuthoringAction.log.warn("Skipping an answer with same text as the correct answer: " + + answerText); + continue; + } + AssessmentQuestionOption assessmentAnswer = new AssessmentQuestionOption(); + assessmentAnswer.setOptionString(answerText); + assessmentAnswer.setSequenceId(orderId++); + assessmentAnswer.setFeedback(answer.getFeedback()); + + if ((answer.getScore() != null) && (answer.getScore() > 0)) { + // for fill in blanks question all answers are correct and get full grade + if (correctAnswer == null) { + // whatever the correct answer holds, it becomes the question score + questionGrade = new Double(Math.ceil(answer.getScore())).intValue(); + // 100% goes to the correct answer + assessmentAnswer.setGrade(1); + correctAnswer = answerText; + } else { + AuthoringAction.log + .warn("Choosing only first correct answer, despite another one was found: " + + answerText); + assessmentAnswer.setGrade(0); + } + } else { + assessmentAnswer.setGrade(0); + } + + optionList.add(assessmentAnswer); + } + + assessmentQuestion.setOptions(optionList); + } + + if (correctAnswer == null) { + AuthoringAction.log.warn("No correct answer found for question: " + question.getText()); + continue; + } + + } else { AuthoringAction.log.warn("Unknow QTI question type: " + question.getType()); continue; @@ -907,7 +966,25 @@ question.setType(Question.QUESTION_TYPE_ESSAY); answers = null; break; + + case AssessmentConstants.QUESTION_TYPE_MARK_HEDGING: + question.setType(Question.QUESTION_TYPE_MARK_HEDGING); + + for (AssessmentQuestionOption assessmentAnswer : assessmentQuestion.getOptions()) { + Answer answer = new Answer(); + boolean isCorrectAnswer = assessmentAnswer.isCorrect(); + + answer.setText(assessmentAnswer.getOptionString()); + answer.setScore(isCorrectAnswer ? new Integer(assessmentQuestion.getDefaultGrade()).floatValue() + : 0); + answer.setFeedback(isCorrectAnswer ? assessmentQuestion.getFeedbackOnCorrect() : assessmentQuestion + .getFeedbackOnIncorrect()); + + answers.add(assessmentAnswer.getSequenceId(), answer); + } + break; + default: continue; } @@ -1643,6 +1720,9 @@ case AssessmentConstants.QUESTION_TYPE_ORDERING: forward = mapping.findForward("ordering"); break; + case AssessmentConstants.QUESTION_TYPE_MARK_HEDGING: + forward = mapping.findForward("markhedging"); + break; default: forward = null; break; @@ -1686,7 +1766,8 @@ || (questionType == AssessmentConstants.QUESTION_TYPE_ORDERING) || (questionType == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) || (questionType == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER) - || (questionType == AssessmentConstants.QUESTION_TYPE_NUMERICAL)) { + || (questionType == AssessmentConstants.QUESTION_TYPE_NUMERICAL) + || (questionType == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING)) { Set optionList = question.getOptions(); request.setAttribute(AssessmentConstants.ATTR_OPTION_LIST, optionList); } @@ -1768,14 +1849,20 @@ question.setPenaltyFactor(Float.parseFloat(questionForm.getPenaltyFactor())); question.setFeedbackOnCorrect(questionForm.getFeedbackOnCorrect()); question.setFeedbackOnIncorrect(questionForm.getFeedbackOnIncorrect()); + } else if (type == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) { + question.setShuffle(questionForm.isShuffle()); + question.setFeedbackOnCorrect(questionForm.getFeedbackOnCorrect()); + question.setFeedbackOnPartiallyCorrect(questionForm.getFeedbackOnPartiallyCorrect()); + question.setFeedbackOnIncorrect(questionForm.getFeedbackOnIncorrect()); } // set options if ((type == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE) || (type == AssessmentConstants.QUESTION_TYPE_ORDERING) || (type == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) || (type == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER) - || (type == AssessmentConstants.QUESTION_TYPE_NUMERICAL)) { + || (type == AssessmentConstants.QUESTION_TYPE_NUMERICAL) + || (type == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING)) { Set optionList = getOptionsFromRequest(request, true); Set options = new LinkedHashSet(); int seqId = 0; @@ -1854,6 +1941,8 @@ int count = NumberUtils.toInt(paramMap.get(AssessmentConstants.ATTR_OPTION_COUNT)); int questionType = WebUtil.readIntParam(request, AssessmentConstants.ATTR_QUESTION_TYPE); + Integer correctOptionIndex = (paramMap.get(AssessmentConstants.ATTR_OPTION_CORRECT) == null) ? null + : NumberUtils.toInt(paramMap.get(AssessmentConstants.ATTR_OPTION_CORRECT)); TreeSet optionList = new TreeSet( new SequencableComparator()); for (int i = 0; i < count; i++) { @@ -1924,6 +2013,21 @@ option.setOptionString(optionString); option.setAnswerInt(i); optionList.add(option); + } else if (questionType == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) { + String optionString = paramMap.get(AssessmentConstants.ATTR_OPTION_STRING_PREFIX + i); + if ((optionString == null) && isForSaving) { + continue; + } + + AssessmentQuestionOption option = new AssessmentQuestionOption(); + String sequenceId = paramMap.get(AssessmentConstants.ATTR_OPTION_SEQUENCE_ID_PREFIX + i); + option.setSequenceId(NumberUtils.toInt(sequenceId)); + option.setOptionString(optionString); + if ((correctOptionIndex != null) && correctOptionIndex.equals(new Integer(sequenceId))) { + option.setCorrect(true); + } + option.setFeedback(paramMap.get(AssessmentConstants.ATTR_OPTION_FEEDBACK_PREFIX + i)); + optionList.add(option); } } return optionList; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java =================================================================== diff -u -rdacc22919fbce0447cf7850bdfb602d446354050 -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision dacc22919fbce0447cf7850bdfb602d446354050) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -102,6 +102,9 @@ if (param.equals("nextPage")) { return nextPage(mapping, form, request, response); } + if (param.equals("submitSingleMarkHedgingQuestion")) { + return submitSingleMarkHedgingQuestion(mapping, form, request, response); + } if (param.equals("submitAll")) { return submitAll(mapping, form, request, response); } @@ -423,6 +426,58 @@ } /** + * Handling submittion of MarkHedging type of Questions (in case of leader aware tool). + */ + private ActionForward submitSingleMarkHedgingQuestion(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws ServletException { + String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + ArrayList> pagedQuestions = (ArrayList>) sessionMap + .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); + Assessment assessment = (Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT); + Long userId = ((AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER)).getUserId(); + IAssessmentService service = getAssessmentService(); + + //get user answers from request and store them into sessionMap + storeUserAnswersIntoSessionMap(request); + + // store results from sessionMap into DB + Long singleMarkHedgingQuestionUid = WebUtil.readLongParam(request, "singleMarkHedgingQuestionUid") ; + boolean isResultsStored = service.storeUserAnswers(assessment.getUid(), userId, pagedQuestions, + singleMarkHedgingQuestionUid, false); + // result was not stored in case user was prohibited from submitting (or autosubmitting) answers (e.g. when + // using 2 browsers). Then show last stored results + if (!isResultsStored) { + //loadupLastAttempt(sessionMap); + } + + //find according question in order to get its mark + AssessmentQuestion question = null; + for (LinkedHashSet questionsForOnePage : pagedQuestions) { + for (AssessmentQuestion questionIter : questionsForOnePage) { + if (questionIter.getUid().equals(singleMarkHedgingQuestionUid)) { + question = questionIter; + question.setResponseSubmitted(true); + } + } + } + + // populate info for displaying results page + //prepareResultsPageData(sessionMap); + + request.setAttribute("finishedLock", false); + request.setAttribute("assessment", assessment); + request.setAttribute("question", question); + long questionIndex = WebUtil.readLongParam(request, "questionIndex"); + request.setAttribute("questionIndex", questionIndex); + request.setAttribute("isEditingDisabled", true); + request.setAttribute("isLeadershipEnabled", assessment.isUseSelectLeaderToolOuput()); + request.setAttribute("isUserLeader", sessionMap.get(AssessmentConstants.ATTR_IS_USER_LEADER)); + + return mapping.findForward(AssessmentConstants.SUCCESS); + } + + /** * Display same entire authoring page content from HttpSession variable. */ private ActionForward submitAll(ActionMapping mapping, ActionForm form, HttpServletRequest request, @@ -707,28 +762,43 @@ } option.setAnswerBoolean(answerBoolean); } + } else if (questionType == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) { for (AssessmentQuestionOption option : question.getOptions()) { int answerInt = WebUtil.readIntParam(request, AssessmentConstants.ATTR_QUESTION_PREFIX + i + "_" + option.getSequenceId()); option.setAnswerInt(answerInt); } + } else if (questionType == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER) { String answerString = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i); question.setAnswerString(answerString); + } else if (questionType == AssessmentConstants.QUESTION_TYPE_NUMERICAL) { String answerString = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i); question.setAnswerString(answerString); + } else if (questionType == AssessmentConstants.QUESTION_TYPE_TRUE_FALSE) { String answerString = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i); if (answerString != null) { question.setAnswerBoolean(Boolean.parseBoolean(answerString)); question.setAnswerString("answered"); } + } else if (questionType == AssessmentConstants.QUESTION_TYPE_ESSAY) { String answerString = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i); answerString = answerString.replaceAll("[\n\r\f]", ""); question.setAnswerString(answerString); + } else if (questionType == AssessmentConstants.QUESTION_TYPE_ORDERING) { + + } else if (questionType == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) { + for (AssessmentQuestionOption option : question.getOptions()) { + Integer markHedging = WebUtil.readIntParam(request, AssessmentConstants.ATTR_QUESTION_PREFIX + i + "_" + + option.getSequenceId(), true); + if (markHedging != null) { + option.setAnswerInt(markHedging); + } + } } } } @@ -777,6 +847,14 @@ } else if (questionType == AssessmentConstants.QUESTION_TYPE_ORDERING) { isAnswered = true; + + } else if (questionType == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) { + + int sumMarkHedging = 0; + for (AssessmentQuestionOption option : question.getOptions()) { + sumMarkHedging += option.getAnswerInt(); + } + isAnswered = sumMarkHedging == question.getGrade(); } // check all questions were answered @@ -834,6 +912,7 @@ for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { if (question.getUid().equals(questionResult.getAssessmentQuestion().getUid())) { question.setMark(questionResult.getMark()); + question.setResponseSubmitted(questionResult.getFinishDate() != null); question.setPenalty(questionResult.getPenalty()); question.setQuestionFeedback(null); @@ -890,14 +969,29 @@ return; } + //get the latest finished result (required for mark hedging type of questions only) + AssessmentResult lastFinishedResult = null; + if (lastResult.getFinishDate() == null) { + lastFinishedResult = service.getLastFinishedAssessmentResult(assessmentUid, userId); + } + for(LinkedHashSet questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { - for (AssessmentQuestionResult questionResult : lastResult.getQuestionResults()) { + + //load last finished results for hedging type of questions (in order to prevent retry) + Set questionResults = lastResult.getQuestionResults(); + if ((question.getType() == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) + && (lastResult.getFinishDate() == null) && (lastFinishedResult != null)) { + questionResults = lastFinishedResult.getQuestionResults(); + } + + for (AssessmentQuestionResult questionResult : questionResults) { if (question.getUid().equals(questionResult.getAssessmentQuestion().getUid())) { question.setAnswerBoolean(questionResult.getAnswerBoolean()); question.setAnswerFloat(questionResult.getAnswerFloat()); question.setAnswerString(questionResult.getAnswerString()); question.setMark(questionResult.getMark()); + question.setResponseSubmitted(questionResult.getFinishDate() != null); question.setPenalty(questionResult.getPenalty()); for (AssessmentQuestionOption option : question.getOptions()) { Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java =================================================================== diff -u -rb222d3b5e15dfb4da05a89778bfc0982f3fbd53c -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision b222d3b5e15dfb4da05a89778bfc0982f3fbd53c) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -447,33 +447,33 @@ assessmentUser.getUserId()); if (assessmentResult != null) { - Set assessmentQuestionResults = assessmentResult + Set questionResults = assessmentResult .getQuestionResults(); - if (assessmentQuestionResults != null) { + if (questionResults != null) { - for (AssessmentQuestionResult assessmentQuestionResult : assessmentQuestionResults) { + for (AssessmentQuestionResult questionResult : questionResults) { if (showUserNames) { ExcelCell[] userResultRow = new ExcelCell[6]; userResultRow[0] = new ExcelCell(assessmentUser.getUserId(), false); userResultRow[1] = new ExcelCell(assessmentUser.getFullName(), false); userResultRow[2] = new ExcelCell(assessmentResult.getStartDate(), false); - userResultRow[3] = new ExcelCell(assessmentQuestionResult + userResultRow[3] = new ExcelCell(questionResult .getAssessmentQuestion().getTitle(), false); - userResultRow[4] = new ExcelCell(getAnswerObject(assessmentQuestionResult), + userResultRow[4] = new ExcelCell(getAnswerObject(questionResult), false); - userResultRow[5] = new ExcelCell(assessmentQuestionResult.getMark(), false); + userResultRow[5] = new ExcelCell(questionResult.getMark(), false); data.add(userResultRow); } else { ExcelCell[] userResultRow = new ExcelCell[5]; userResultRow[0] = new ExcelCell(assessmentUser.getUserId(), false); userResultRow[1] = new ExcelCell(assessmentResult.getStartDate(), false); - userResultRow[2] = new ExcelCell(assessmentQuestionResult + userResultRow[2] = new ExcelCell(questionResult .getAssessmentQuestion().getTitle(), false); - userResultRow[3] = new ExcelCell(getAnswerObject(assessmentQuestionResult), + userResultRow[3] = new ExcelCell(getAnswerObject(questionResult), false); - userResultRow[4] = new ExcelCell(assessmentQuestionResult.getMark(), false); + userResultRow[4] = new ExcelCell(questionResult.getMark(), false); data.add(userResultRow); } } @@ -573,27 +573,26 @@ int timeTakenCount = 0; int timeTakenTotal = 0; for (List resultList : allResultsForQuestion) { - for (AssessmentQuestionResult assessmentQuestionResult : resultList) { + for (AssessmentQuestionResult questionResult : resultList) { if (showUserNames) { ExcelCell[] userResultRow = new ExcelCell[10]; - userResultRow[0] = new ExcelCell(assessmentQuestionResult.getAssessmentQuestion() - .getTitle(), false); - userResultRow[1] = new ExcelCell(getQuestionTypeLanguageLabel(assessmentQuestionResult + userResultRow[0] = new ExcelCell(questionResult.getAssessmentQuestion().getTitle(), + false); + userResultRow[1] = new ExcelCell(getQuestionTypeLanguageLabel(questionResult .getAssessmentQuestion().getType()), false); - userResultRow[2] = new ExcelCell(new Float(assessmentQuestionResult - .getAssessmentQuestion().getPenaltyFactor()), false); - Float maxMark = (assessmentQuestionResult.getMaxMark() == null) ? 0 : new Float( - assessmentQuestionResult.getMaxMark()); + userResultRow[2] = new ExcelCell(new Float(questionResult.getAssessmentQuestion() + .getPenaltyFactor()), false); + Float maxMark = (questionResult.getMaxMark() == null) ? 0 : new Float( + questionResult.getMaxMark()); userResultRow[3] = new ExcelCell(maxMark, false); - userResultRow[4] = new ExcelCell(assessmentQuestionResult.getUser().getUserId(), false); - userResultRow[5] = new ExcelCell(assessmentQuestionResult.getUser().getFullName(), - false); - userResultRow[6] = new ExcelCell(assessmentQuestionResult.getFinishDate(), false); - userResultRow[7] = new ExcelCell(getAnswerObject(assessmentQuestionResult), false); + userResultRow[4] = new ExcelCell(questionResult.getUser().getUserId(), false); + userResultRow[5] = new ExcelCell(questionResult.getUser().getFullName(), false); + userResultRow[6] = new ExcelCell(questionResult.getFinishDate(), false); + userResultRow[7] = new ExcelCell(getAnswerObject(questionResult), false); - AssessmentResult assessmentResult = assessmentQuestionResult.getAssessmentResult(); - Date finishDate = assessmentQuestionResult.getFinishDate(); + AssessmentResult assessmentResult = questionResult.getAssessmentResult(); + Date finishDate = questionResult.getFinishDate(); if (assessmentResult != null && finishDate != null) { Date startDate = assessmentResult.getStartDate(); if (startDate != null) { @@ -604,32 +603,32 @@ } } - Float mark = assessmentQuestionResult.getMark(); + Float mark = questionResult.getMark(); if (mark != null) { - userResultRow[9] = new ExcelCell(assessmentQuestionResult.getMark(), false); + userResultRow[9] = new ExcelCell(questionResult.getMark(), false); markCount++; - markTotal += assessmentQuestionResult.getMark(); + markTotal += questionResult.getMark(); } data.add(userResultRow); } else { ExcelCell[] userResultRow = new ExcelCell[9]; - userResultRow[0] = new ExcelCell(assessmentQuestionResult.getAssessmentQuestion() - .getTitle(), false); - userResultRow[1] = new ExcelCell(getQuestionTypeLanguageLabel(assessmentQuestionResult + userResultRow[0] = new ExcelCell(questionResult.getAssessmentQuestion().getTitle(), + false); + userResultRow[1] = new ExcelCell(getQuestionTypeLanguageLabel(questionResult .getAssessmentQuestion().getType()), false); - userResultRow[2] = new ExcelCell(new Float(assessmentQuestionResult - .getAssessmentQuestion().getPenaltyFactor()), false); - Float maxMark = (assessmentQuestionResult.getMaxMark() == null) ? 0 : new Float( - assessmentQuestionResult.getMaxMark()); + userResultRow[2] = new ExcelCell(new Float(questionResult.getAssessmentQuestion() + .getPenaltyFactor()), false); + Float maxMark = (questionResult.getMaxMark() == null) ? 0 : new Float( + questionResult.getMaxMark()); userResultRow[3] = new ExcelCell(maxMark, false); - userResultRow[4] = new ExcelCell(assessmentQuestionResult.getUser().getUserId(), false); - userResultRow[5] = new ExcelCell(assessmentQuestionResult.getFinishDate(), false); - userResultRow[6] = new ExcelCell(getAnswerObject(assessmentQuestionResult), false); + userResultRow[4] = new ExcelCell(questionResult.getUser().getUserId(), false); + userResultRow[5] = new ExcelCell(questionResult.getFinishDate(), false); + userResultRow[6] = new ExcelCell(getAnswerObject(questionResult), false); - if (assessmentQuestionResult.getAssessmentResult() != null) { - Date startDate = assessmentQuestionResult.getAssessmentResult().getStartDate(); - Date finishDate = assessmentQuestionResult.getFinishDate(); + if (questionResult.getAssessmentResult() != null) { + Date startDate = questionResult.getAssessmentResult().getStartDate(); + Date finishDate = questionResult.getFinishDate(); if (startDate != null && finishDate != null) { Long seconds = (finishDate.getTime() - startDate.getTime()) / 1000; userResultRow[7] = new ExcelCell(seconds, false); @@ -638,11 +637,11 @@ } } - userResultRow[8] = new ExcelCell(assessmentQuestionResult.getMark(), false); + userResultRow[8] = new ExcelCell(questionResult.getMark(), false); - if (assessmentQuestionResult.getMark() != null) { + if (questionResult.getMark() != null) { markCount++; - markTotal += assessmentQuestionResult.getMark(); + markTotal += questionResult.getMark(); } data.add(userResultRow); @@ -693,6 +692,9 @@ return data.toArray(new ExcelCell[][] {}); } + /** + * Used only for excell export (for getUserSummaryData() method). + */ private String getQuestionTypeLanguageLabel(short type) { switch (type) { case AssessmentConstants.QUESTION_TYPE_ESSAY: @@ -709,65 +711,77 @@ return "Short Answer"; case AssessmentConstants.QUESTION_TYPE_TRUE_FALSE: return "True/False"; + case AssessmentConstants.QUESTION_TYPE_MARK_HEDGING: + return "Mark Hedging"; default: return null; } } - private Object getAnswerObject(AssessmentQuestionResult assessmentQuestionResult) { + /** + * Used only for excell export (for getUserSummaryData() method). + */ + private Object getAnswerObject(AssessmentQuestionResult questionResult) { Object ret = null; - if (assessmentQuestionResult != null) { - switch (assessmentQuestionResult.getAssessmentQuestion().getType()) { + if (questionResult != null) { + switch (questionResult.getAssessmentQuestion().getType()) { case AssessmentConstants.QUESTION_TYPE_ESSAY: - return removeHTMLTags(assessmentQuestionResult.getAnswerString()); + return removeHTMLTags(questionResult.getAnswerString()); case AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS: - return getOptionResponse(assessmentQuestionResult, AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS); + return getOptionResponse(questionResult, AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS); case AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE: - return getOptionResponse(assessmentQuestionResult, AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE); + return getOptionResponse(questionResult, AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE); case AssessmentConstants.QUESTION_TYPE_NUMERICAL: - return assessmentQuestionResult.getAnswerString(); + return questionResult.getAnswerString(); case AssessmentConstants.QUESTION_TYPE_ORDERING: - return getOptionResponse(assessmentQuestionResult, AssessmentConstants.QUESTION_TYPE_ORDERING); + return getOptionResponse(questionResult, AssessmentConstants.QUESTION_TYPE_ORDERING); case AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER: - return assessmentQuestionResult.getAnswerString(); + return questionResult.getAnswerString(); case AssessmentConstants.QUESTION_TYPE_TRUE_FALSE: - return assessmentQuestionResult.getAnswerBoolean(); + return questionResult.getAnswerBoolean(); + case AssessmentConstants.QUESTION_TYPE_MARK_HEDGING: + return getOptionResponse(questionResult, AssessmentConstants.QUESTION_TYPE_MARK_HEDGING); default: return null; } } return ret; } - public String getOptionResponse(AssessmentQuestionResult assessmentQuestionResult, short type) { + /** + * Used only for excell export (for getUserSummaryData() method). + */ + private String getOptionResponse(AssessmentQuestionResult questionResult, short type) { StringBuilder sb = new StringBuilder(); - Set optionAnswers = assessmentQuestionResult.getOptionAnswers(); - boolean trimComma = false; + //whether there is a need to remove last comma + boolean trimLastComma = false; + + Set options = questionResult.getAssessmentQuestion().getOptions(); + Set optionAnswers = questionResult.getOptionAnswers(); if (optionAnswers != null) { if (type == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE) { for (AssessmentOptionAnswer optionAnswer : optionAnswers) { - if (optionAnswer.getAnswerBoolean() == true) { - for (AssessmentQuestionOption option : assessmentQuestionResult.getAssessmentQuestion() - .getOptions()) { + if (optionAnswer.getAnswerBoolean()) { + for (AssessmentQuestionOption option : options) { if (option.getUid().equals(optionAnswer.getOptionUid())) { sb.append(option.getOptionString() + ", "); - trimComma = true; + trimLastComma = true; } } } } + } else if (type == AssessmentConstants.QUESTION_TYPE_ORDERING) { for (int i = 0; i < optionAnswers.size(); i++) { for (AssessmentOptionAnswer optionAnswer : optionAnswers) { if (optionAnswer.getAnswerInt() == i) { - for (AssessmentQuestionOption option : assessmentQuestionResult - .getAssessmentQuestion().getOptions()) { + for (AssessmentQuestionOption option : options) { if (option.getUid().equals(optionAnswer.getOptionUid())) { sb.append(option.getOptionString() + ", "); - trimComma = true; + trimLastComma = true; } } } @@ -776,13 +790,12 @@ } else if (type == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) { - for (AssessmentQuestionOption option : assessmentQuestionResult.getAssessmentQuestion() - .getOptions()) { + for (AssessmentQuestionOption option : options) { sb.append("[" + option.getOptionString() + ", "); + for (AssessmentOptionAnswer optionAnswer : optionAnswers) { if (option.getUid().equals(optionAnswer.getOptionUid())) { - for (AssessmentQuestionOption option2 : assessmentQuestionResult - .getAssessmentQuestion().getOptions()) { + for (AssessmentQuestionOption option2 : options) { if (option2.getUid() == optionAnswer.getAnswerInt()) { sb.append(option2.getOptionString() + "] "); } @@ -791,12 +804,25 @@ } } + + } else if (type == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) { + + for (AssessmentQuestionOption option : options) { + sb.append("[" + option.getOptionString() + ", "); + + for (AssessmentOptionAnswer optionAnswer : optionAnswers) { + if (option.getUid().equals(optionAnswer.getOptionUid())) { + sb.append(optionAnswer.getAnswerInt() + "] "); + } + } + + } } } String ret = sb.toString().replaceAll("\\<.*?\\>", ""); - if (trimComma) { + if (trimLastComma) { ret = ret.substring(0, ret.lastIndexOf(",")); } Index: lams_tool_assessment/web/includes/css/assessment.css =================================================================== diff -u -r724afbcc75966e8132c8793ccbd17121491e2cc2 -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/web/includes/css/assessment.css (.../assessment.css) (revision 724afbcc75966e8132c8793ccbd17121491e2cc2) +++ lams_tool_assessment/web/includes/css/assessment.css (.../assessment.css) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -165,7 +165,7 @@ border-bottom: 1px solid white !important; } -#warning-answers-required, #warning-words-limit, .hidden { +#warning-answers-required, #warning-words-limit, #warning-mark-hedging-wrong-total, .hidden { display: none; } @@ -175,3 +175,7 @@ margin-bottom: 10px; width: 80%; } + +.button-disabled { + opacity:.2; +} Index: lams_tool_assessment/web/includes/javascript/assessmentoption.js =================================================================== diff -u -r76c5de44247cb0f2eef64361e4f5ccacdeb3d45e -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/web/includes/javascript/assessmentoption.js (.../assessmentoption.js) (revision 76c5de44247cb0f2eef64361e4f5ccacdeb3d45e) +++ lams_tool_assessment/web/includes/javascript/assessmentoption.js (.../assessmentoption.js) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -1,10 +1,10 @@ - /* - This is Assessment Question option area. - */ + //This is Assessment Question option area. var optionTargetDiv = "#optionArea"; + // Please set these 2 variables in JSP file for using tag reason: // var removeOptionUrl = ""; // var addOptionUrl = ""; + function addOption(){ //store old InstanceIds before doing Ajax call. We need to keep record of old ones to prevent reinitializing new CKEditor two times. var oldOptionIds = new Array(); @@ -25,6 +25,7 @@ } ); } + function removeOption(idx){ var url= removeOptionUrl; var contentFolderID= $("#contentFolderID").val(); @@ -73,7 +74,7 @@ //in order to be able to use option's value, copy it from CKEditor to textarea function prepareOptionEditorsForAjaxSubmit(){ - if ((questionType == 1) || (questionType == 7)) { + if ((questionType == 1) || (questionType == 7) || (questionType == 8)) { $("textarea[name^=optionString]").each(function() { prepareOptionEditorForAjaxSubmit(this); }); @@ -94,5 +95,3 @@ //skip out empty values ckeditor.value = ((ckeditorData == null) || (ckeditorData.replace(/ | |
|\s|

|<\/p>|\xa0/g, "").length == 0)) ? "" : ckeditorData; } - - Index: lams_tool_assessment/web/pages/authoring/basic.jsp =================================================================== diff -u -rcc1b2b3fdc49088abf515c55bc8533c762e95412 -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/web/pages/authoring/basic.jsp (.../basic.jsp) (revision cc1b2b3fdc49088abf515c55bc8533c762e95412) +++ lams_tool_assessment/web/pages/authoring/basic.jsp (.../basic.jsp) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -213,6 +213,7 @@ + @@ -235,12 +236,10 @@ - + - -


- \ No newline at end of file + Index: lams_tool_assessment/web/pages/authoring/parts/addmarkhedging.jsp =================================================================== diff -u --- lams_tool_assessment/web/pages/authoring/parts/addmarkhedging.jsp (revision 0) +++ lams_tool_assessment/web/pages/authoring/parts/addmarkhedging.jsp (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -0,0 +1,226 @@ + + +<%@ include file="/common/taglibs.jsp"%> + + + <%@ include file="/common/header.jsp"%> + + + + + + + + + + + + + + + +
+ <%@ include file="/common/messages.jsp"%> + + + + + + + + + + + + + +

+ +

+ +
+ + Required field +
+ + +
+ +
+ + + +
+ + Required field +
+ + +
+ + +
+ +
+ + + + + +
+ + +
+ + +
+ +
+ +
+ +
+ + +
+ <%@ include file="optionlist.jsp"%> + + + +
+ + +
+ + + + + +
+ +

+ + + + + + + + + + +
+ + + + + + +
Index: lams_tool_assessment/web/pages/authoring/parts/optionhedgingmark.jsp =================================================================== diff -u --- lams_tool_assessment/web/pages/authoring/parts/optionhedgingmark.jsp (revision 0) +++ lams_tool_assessment/web/pages/authoring/parts/optionhedgingmark.jsp (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + +
+ + + + ${status.index+1} + +
+ + +
+ checked="checked" > + + + + +
+ + + +
+ +
Index: lams_tool_assessment/web/pages/authoring/parts/optionlist.jsp =================================================================== diff -u -r72100e7842f4ba7a26156d51d620235e5af78d5b -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/web/pages/authoring/parts/optionlist.jsp (.../optionlist.jsp) (revision 72100e7842f4ba7a26156d51d620235e5af78d5b) +++ lams_tool_assessment/web/pages/authoring/parts/optionlist.jsp (.../optionlist.jsp) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -16,13 +16,16 @@ <%@ include file="shortansweroption.jsp"%> - + <%@ include file="numericaloption.jsp"%> - + <%@ include file="orderingoption.jsp"%> - + + + <%@ include file="optionhedgingmark.jsp"%> + Index: lams_tool_assessment/web/pages/authoring/parts/questionlist.jsp =================================================================== diff -u -re83e4b897113057714ced4be6d03a621c782b075 -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/web/pages/authoring/parts/questionlist.jsp (.../questionlist.jsp) (revision e83e4b897113057714ced4be6d03a621c782b075) +++ lams_tool_assessment/web/pages/authoring/parts/questionlist.jsp (.../questionlist.jsp) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -48,7 +48,10 @@ - + + + + @@ -161,7 +164,10 @@ - + + + + Index: lams_tool_assessment/web/pages/learning/learning.jsp =================================================================== diff -u -r0f1867f956a900cf3ae3269f2f47d81c96cbda85 -r11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa --- lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 0f1867f956a900cf3ae3269f2f47d81c96cbda85) +++ lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 11d6b3d1391ab1d1aa42453aa0347a6b85fcfeaa) @@ -84,6 +84,35 @@