Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -re137553ae8df8ba48da568c79e4deea0f5380d29 -re0265c3507ca12f61524934309a32092296fe601 --- lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision e137553ae8df8ba48da568c79e4deea0f5380d29) +++ lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -890,4 +890,6 @@ label.marks=Marks authoring.tbl.delete.appex.prompt=Do you want to delete the Application Exercise {0}? authoring.tbl.delete.mcq.prompt=Do you want to delete the RAT Question {0}? +authoring.application.exercise.allow.multiple.responses =Allow Multiple Responses +authoring.application.exercise.allow.multiple.responses.tooltip =When learners are allowed to select multiple answers the grade is the sum of the grade for all correct responses selected. #======= End labels: Exported 872 labels for en AU ===== Index: lams_central/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -re137553ae8df8ba48da568c79e4deea0f5380d29 -re0265c3507ca12f61524934309a32092296fe601 --- lams_central/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision e137553ae8df8ba48da568c79e4deea0f5380d29) +++ lams_central/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -891,4 +891,6 @@ label.marks=Marks authoring.tbl.delete.appex.prompt=Do you want to delete the Application Exercise {0}? authoring.tbl.delete.mcq.prompt=Do you want to delete the RAT Question {0}? +authoring.application.exercise.allow.multiple.responses =Allow Multiple Responses +authoring.application.exercise.allow.multiple.responses.tooltip =When learners are allowed to select multiple answers the grade is the sum of the grade for all correct responses selected. #======= End labels: Exported 872 labels for en AU ===== Index: lams_central/src/java/org/lamsfoundation/lams/authoring/template/AssessMCAnswer.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -re0265c3507ca12f61524934309a32092296fe601 --- lams_central/src/java/org/lamsfoundation/lams/authoring/template/AssessMCAnswer.java (.../AssessMCAnswer.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/template/AssessMCAnswer.java (.../AssessMCAnswer.java) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -116,4 +116,5 @@ this.answerFloat = answerFloat; } + } Index: lams_central/src/java/org/lamsfoundation/lams/authoring/template/Assessment.java =================================================================== diff -u -rd0031eadc1ee66ed82eade3ffa5c039016d999eb -re0265c3507ca12f61524934309a32092296fe601 --- lams_central/src/java/org/lamsfoundation/lams/authoring/template/Assessment.java (.../Assessment.java) (revision d0031eadc1ee66ed82eade3ffa5c039016d999eb) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/template/Assessment.java (.../Assessment.java) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -49,9 +49,10 @@ short type = 6; String title = null; - String questionText = null; + String text = null; Boolean required = false; int defaultGrade = 1; + boolean multipleAnswersAllowed = false; // only used if type == 1 List answers = null; // only used if type == 1 public void setType(short type) { @@ -81,12 +82,12 @@ return required; } - public void setQuestionText(String questionText) { - this.questionText = questionText; + public void setText(String text) { + this.text = text; } - public String getQuestionText() { - return questionText; + public String getText() { + return text; } public String getTitle() { @@ -109,10 +110,17 @@ return answers; } + public boolean isMultipleAnswersAllowed() { + return multipleAnswersAllowed; + } + + public void setMultipleAnswersAllowed(boolean multipleAnswersAllowed) { + this.multipleAnswersAllowed = multipleAnswersAllowed; + } public ObjectNode getAsObjectNode(int displayOrder) { ObjectNode json = JsonNodeFactory.instance.objectNode(); json.put(RestTags.QUESTION_TITLE, title != null ? title : ""); - json.put(RestTags.QUESTION_TEXT, questionText != null ? questionText : ""); + json.put(RestTags.QUESTION_TEXT, text != null ? text : ""); json.put(RestTags.DISPLAY_ORDER, displayOrder); json.put("answerRequired", required); json.put("defaultGrade", defaultGrade); @@ -123,6 +131,9 @@ answersJSON.add(answer.getAsObjectNode()); } json.set(RestTags.ANSWERS, answersJSON); + // if multiple answers are allowed then the mark should only apply if no incorrect answers are selected + json.put("multipleAnswersAllowed", multipleAnswersAllowed); + json.put("incorrectAnswerNullifiesMark", multipleAnswersAllowed); } else { json.put("type", ASSESSMENT_QUESTION_TYPE_ESSAY); } @@ -133,7 +144,7 @@ public boolean validate(List errorMessages, ResourceBundle appBundle, MessageFormat formatter, Integer applicationExerciseNumber, String applicationExerciseTitle, Integer questionNumber) { boolean errorsExist = false; - if (questionText == null || questionText.length() == 0) { + if (text == null || text.length() == 0) { errorMessages.add(TextUtil.getText(appBundle, formatter, "authoring.error.application.exercise.question.must.not.be.blank.num", new Object[] { applicationExerciseTitle, title })); @@ -145,7 +156,8 @@ "authoring.error.application.exercise.must.have.answer.num", new Object[] { applicationExerciseTitle, "\""+ title +"\"" })); errorsExist = true; - } else { + } else if ( !multipleAnswersAllowed ){ + // multiple answers -> no validation, single answer -> must have one with 100% boolean found100percent = false; for (AssessMCAnswer answer : answers) { if (answer.getGrade() == 1) { Index: lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/LdTemplateController.java =================================================================== diff -u -r9243647079d26f07f3822cf6116b5789ed8ba8de -re0265c3507ca12f61524934309a32092296fe601 --- lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/LdTemplateController.java (.../LdTemplateController.java) (revision 9243647079d26f07f3822cf6116b5789ed8ba8de) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/LdTemplateController.java (.../LdTemplateController.java) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -28,7 +28,9 @@ import java.text.DecimalFormat; import java.text.MessageFormat; import java.text.NumberFormat; +import java.util.ArrayList; import java.util.LinkedList; +import java.util.List; import java.util.ResourceBundle; import java.util.Set; import java.util.TreeMap; @@ -40,6 +42,8 @@ import org.apache.log4j.Logger; import org.lamsfoundation.lams.authoring.service.IAuthoringFullService; +import org.lamsfoundation.lams.authoring.template.AssessMCAnswer; +import org.lamsfoundation.lams.authoring.template.Assessment; import org.lamsfoundation.lams.authoring.template.Option; import org.lamsfoundation.lams.authoring.template.TextUtil; import org.lamsfoundation.lams.learningdesign.Activity; @@ -1366,59 +1370,111 @@ public String importAssessmentQTI(HttpServletRequest request) throws UnsupportedEncodingException { String contentFolderID = WebUtil.readStrParam(request, "contentFolderID"); String templatePage = WebUtil.readStrParam(request, "templatePage"); - Question[] updatedQuestions = preprocessQuestions(QuestionParser.parseQuestionChoiceForm(request), contentFolderID); + List updatedQuestions = preprocessQuestions(QuestionParser.parseQuestionChoiceForm(request), contentFolderID); request.setAttribute("questions", updatedQuestions); request.setAttribute("questionNumber", WebUtil.readIntParam(request, "questionNumber")); request.setAttribute("numQuestionsFieldname", WebUtil.readStrParam(request, "numQuestionsFieldname")); request.setAttribute("containingDivName", WebUtil.readStrParam(request, "containingDivName", true)); return "/authoring/template/tool/" + templatePage; } - private Question[] preprocessQuestions(Question[] questions, String contentFolderID) { + private List preprocessQuestions(Question[] questions, String contentFolderID) { + List assessments = new ArrayList(questions.length); + // Processing based on QTIUtil from the Assessment tool - for ( Question question : questions ) { + for (Question question : questions) { - String correctAnswer = null; + Assessment assessment = new Assessment(); + assessments.add(assessment); + boolean isMultipleChoice = Question.QUESTION_TYPE_MULTIPLE_CHOICE.equals(question.getType()); - boolean isMarkHedgingType = Question.QUESTION_TYPE_MARK_HEDGING.equals(question.getType()); - // int questionGrade = 1; Currently not supported by the templates. + boolean isMultipleResponse = Question.QUESTION_TYPE_MULTIPLE_RESPONSE.equals(question.getType()); + int defaultGrade = 1; - question.setText(QuestionParser.processHTMLField(question.getText(), false, contentFolderID, + assessment.setText(QuestionParser.processHTMLField(question.getText(), false, contentFolderID, question.getResourcesFolderPath())); + assessment.setTitle(question.getTitle()); - if (question.getAnswers() != null) { - for (Answer answer : question.getAnswers()) { + if (isMultipleChoice) { + assessment.setType(Assessment.ASSESSMENT_QUESTION_TYPE_MULTIPLE_CHOICE); + assessment.setMultipleAnswersAllowed(false); + String correctAnswer = null; - String answerText = QuestionParser.processHTMLField(answer.getText(), false, contentFolderID, - question.getResourcesFolderPath()); - answer.setText(answerText); + if (question.getAnswers() != null) { + int displayOrder = 1; + for (Answer answer : question.getAnswers()) { - if ((correctAnswer != null) && correctAnswer.equals(answerText)) { - log.warn("Skipping an answer with same text as the correct answer: " + answerText); - continue; + String answerText = QuestionParser.processHTMLField(answer.getText(), false, contentFolderID, + question.getResourcesFolderPath()); + if ((correctAnswer != null) && correctAnswer.equals(answerText)) { + log.warn("Skipping an answer with same text as the correct answer: " + answerText); + continue; + } + + AssessMCAnswer newAnswer = new AssessMCAnswer(displayOrder++, answerText, 0F); + + if ((answer.getScore() != null) && (answer.getScore() > 0)) { + if (correctAnswer == null) { + // whatever the correct answer holds, it becomes the question score + defaultGrade = Double.valueOf(Math.ceil(answer.getScore())).intValue(); + // 100% goes to the correct answer + newAnswer.setGrade(1F); + correctAnswer = answerText; + } else { + log.warn("Choosing only first correct answer, despite another one was found: " + + answerText); + } + } + + assessment.getAnswers().add(newAnswer); } - if ((answer.getScore() != null) && (answer.getScore() > 0)) { - // for fill in blanks question all answers are correct and get full grade - if (!isMultipleChoice && !isMarkHedgingType || correctAnswer == null) { - // whatever the correct answer holds, it becomes the question score - // questionGrade = Double.valueOf(Math.ceil(answer.getScore())).intValue(); - // 100% goes to the correct answer - answer.setScore(1F); - correctAnswer = answerText; - } else { - log.warn("Choosing only first correct answer, despite another one was found: " - + answerText); - answer.setScore(0F); + } + + if (correctAnswer == null) { + log.warn("No correct answer found for question: " + question.getText()); + continue; + } + + } else if (isMultipleResponse) { + assessment.setType(Assessment.ASSESSMENT_QUESTION_TYPE_MULTIPLE_CHOICE); + assessment.setMultipleAnswersAllowed(true); + + if (question.getAnswers() != null) { + float totalScore = 0; + for (Answer answer : question.getAnswers()) { + if ((answer.getScore() != null) && (answer.getScore() > 0)) { + // the question score information is stored as sum of answer scores + totalScore += answer.getScore(); } - } else { - answer.setScore(0F); } + defaultGrade = Double.valueOf(Math.round(totalScore)).intValue(); + int displayOrder = 1; + for (Answer answer : question.getAnswers()) { + String answerText = QuestionParser.processHTMLField(answer.getText(), false, contentFolderID, + question.getResourcesFolderPath()); + + AssessMCAnswer newAnswer = new AssessMCAnswer(displayOrder++, answerText, 0F); + + if ((answer.getScore() != null) && (answer.getScore() > 0)) { + // set the factor of score for correct answers + newAnswer.setGrade(answer.getScore() / totalScore); + } else { + newAnswer.setGrade(0F); + } + + assessment.getAnswers().add(newAnswer); + } } + } else { + assessment.setType(Assessment.ASSESSMENT_QUESTION_TYPE_ESSAY); } + + assessment.setDefaultGrade(defaultGrade); } - return questions; + + return assessments; } /** Index: lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/TBLTemplateController.java =================================================================== diff -u -r1873ffca4fc3227607a706a55ac025bff50126c7 -re0265c3507ca12f61524934309a32092296fe601 --- lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/TBLTemplateController.java (.../TBLTemplateController.java) (revision 1873ffca4fc3227607a706a55ac025bff50126c7) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/TBLTemplateController.java (.../TBLTemplateController.java) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -544,7 +544,7 @@ Assessment assessment = new Assessment(); if (questionText != null) { assessment.setTitle(questionTitle); - assessment.setQuestionText(questionText); + assessment.setText(questionText); assessment.setType(WebUtil.readStrParam(request, assessmentPrefix + "type")); assessment.setRequired(true); @@ -562,6 +562,7 @@ } if (assessment.getType() == Assessment.ASSESSMENT_QUESTION_TYPE_MULTIPLE_CHOICE) { + assessment.setMultipleAnswersAllowed(WebUtil.readBooleanParam(request, assessmentPrefix + "multiAllowed", false)); String optionPrefix = new StringBuilder("divass").append(appexNumber).append("assmcq") .append(i).append("option").toString(); for (int o = 1, order = 0; o <= MAX_OPTION_COUNT; o++) { Index: lams_central/web/authoring/template/tbl/appex.jsp =================================================================== diff -u -r1873ffca4fc3227607a706a55ac025bff50126c7 -re0265c3507ca12f61524934309a32092296fe601 --- lams_central/web/authoring/template/tbl/appex.jsp (.../appex.jsp) (revision 1873ffca4fc3227607a706a55ac025bff50126c7) +++ lams_central/web/authoring/template/tbl/appex.jsp (.../appex.jsp) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -36,7 +36,8 @@
Index: lams_central/web/authoring/template/tool/assessmcq.jsp =================================================================== diff -u -r1873ffca4fc3227607a706a55ac025bff50126c7 -re0265c3507ca12f61524934309a32092296fe601 --- lams_central/web/authoring/template/tool/assessmcq.jsp (.../assessmcq.jsp) (revision 1873ffca4fc3227607a706a55ac025bff50126c7) +++ lams_central/web/authoring/template/tool/assessmcq.jsp (.../assessmcq.jsp) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -34,9 +34,19 @@ - - +
+ + + +
+
+
+
@@ -59,9 +69,9 @@ ${numAnswers} - ${answer.text} + ${answer.answerText} ${loopStatus.count} - ${answer.score} + ${answer.grade}
<%@ include file="assessoption.jsp" %>
@@ -110,5 +120,10 @@ } }).on('shown', onShownForXEditable) .on('hidden', onHiddenForXEditable); + + $(document).ready(function(){ + $('[data-toggle="tooltip"]').tooltip(); + }); + \ No newline at end of file Index: lams_central/web/authoring/template/tool/assessment.jsp =================================================================== diff -u -r1873ffca4fc3227607a706a55ac025bff50126c7 -re0265c3507ca12f61524934309a32092296fe601 --- lams_central/web/authoring/template/tool/assessment.jsp (.../assessment.jsp) (revision 1873ffca4fc3227607a706a55ac025bff50126c7) +++ lams_central/web/authoring/template/tool/assessment.jsp (.../assessment.jsp) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -30,7 +30,7 @@ - + Index: lams_central/web/authoring/template/tool/assessmentQTI.jsp =================================================================== diff -u -r5d865502ffc41ad5759af87eb091d9627e6965a1 -re0265c3507ca12f61524934309a32092296fe601 --- lams_central/web/authoring/template/tool/assessmentQTI.jsp (.../assessmentQTI.jsp) (revision 5d865502ffc41ad5759af87eb091d9627e6965a1) +++ lams_central/web/authoring/template/tool/assessmentQTI.jsp (.../assessmentQTI.jsp) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -12,7 +12,7 @@
- + <%@ include file="../tool/assessmcq.jsp" %> Index: lams_central/web/authoring/template/tool/mcquestion.jsp =================================================================== diff -u -r1873ffca4fc3227607a706a55ac025bff50126c7 -re0265c3507ca12f61524934309a32092296fe601 --- lams_central/web/authoring/template/tool/mcquestion.jsp (.../mcquestion.jsp) (revision 1873ffca4fc3227607a706a55ac025bff50126c7) +++ lams_central/web/authoring/template/tool/mcquestion.jsp (.../mcquestion.jsp) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -51,8 +51,8 @@ ${numAnswers} - ${answer.text} - ${answer.score > 0} + ${answer.answerText} + ${answer.grade > 0} ${loopStatus.count}
<%@ include file="mcoption.jsp" %> Index: lams_tool_scratchie/web/pages/tblmonitoring/tra.jsp =================================================================== diff -u -r29b264ddf2450e67397b935d9d232eac92050d7e -re0265c3507ca12f61524934309a32092296fe601 --- lams_tool_scratchie/web/pages/tblmonitoring/tra.jsp (.../tra.jsp) (revision 29b264ddf2450e67397b935d9d232eac92050d7e) +++ lams_tool_scratchie/web/pages/tblmonitoring/tra.jsp (.../tra.jsp) (revision e0265c3507ca12f61524934309a32092296fe601) @@ -31,7 +31,7 @@ barStrokeWidth: 2, barValueSpacing: 5, barDatasetSpacing: 1, - responsive: true, + <%-- responsive: true, When responsive the font becomes too small on larger screen --%> }; var ctx = document.getElementById("barChart").getContext("2d");