Index: lams_central/build.properties =================================================================== diff -u -r3f18890e24de43c31ac23d49e2c1a4906e479863 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/build.properties (.../build.properties) (revision 3f18890e24de43c31ac23d49e2c1a4906e479863) +++ lams_central/build.properties (.../build.properties) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -8,6 +8,6 @@ product.core=true # Control which activities are generated for TBL templates - vanilla setting is "checked" (not in quotes) -template.tbl.show.introduction= +template.tbl.show.introduction=checked template.tbl.show.preview=checked -template.tbl.show.notebook= +template.tbl.show.notebook=checked Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r5d865502ffc41ad5759af87eb091d9627e6965a1 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 5d865502ffc41ad5759af87eb091d9627e6965a1) +++ lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -869,15 +869,19 @@ button.return.to.template.list =Go back to Template list authoring.error.content.id =Content ID is missing authoring.error.question.must.have.answer.num =Question {0} must have at least one answer. -authoring.error.application.exercise.must.have.answer.num =Application Exercise {0} must have at least one answer. -authoring.error.application.exercise.must.have.100.percent =Application Exercise {0} must have at least one answer worth 100%. -authoring.error.application.exercise.not.blank.and.grade =Application Exercise {0} may not be blank and must have a grade. +authoring.error.application.exercise.question.must.not.be.blank.num =Application Exercise {0} Question {1} may not be blank. +authoring.error.application.exercise.must.have.answer.num =Application Exercise {0} Question {1} must have at least one answer. +authoring.error.application.exercise.must.have.100.percent =Application Exercise {0} Question {1} must have at least one answer worth 100%. +authoring.error.application.exercise.not.blank.and.grade =Application Exercise {0} Question {1} may not be blank and must have a grade. +authoring.error.application.exercise.needs.noticeboard.text =Application Exercise {0} is missing the text for the noticeboard. +authoring.error.rat.not.blank=RAT Questions must have at least one question. authoring.label.grade =Grade authoring.label.none =None authoring.tbl.template.title =Team Based Learning authoring.tbl.template.description =Individual and Team Readiness Assessments followed by Application Exercises. -authoring.tbl.desc.question =These questions are for IRA and TRA. Click "Create Question" to add more questions. Turn on "Enable confidence levels" to have the learners' confidence levels from the iRA shown on the tRA screen. -authoring.tbl.desc.ae =State the questions for AE. Click "Create Question" to add more questions. +authoring.tbl.desc.question =These questions are for iRA and tRA. Click "Create Question" to add more questions. Turn on "Enable confidence levels" to have the learners' confidence levels from the iRA shown on the tRA screen. +authoring.tbl.desc.ae =Enter the questions for the Application Exercises. You can have one or more Application Exercises and each Application Exercise can have one or more Questions. If you turn on Add A Notebook for the Application Exercise then a Notebook activity will be created after that Application Exercise. authoring.template.basic.import.qti =Import IMS QTI - +authoring.tbl.use.noticeboard=Add a Noticeboard after the Application Exercise with the following instructions: +authoring.create.application.exercise=Create Application Exercise #======= End labels: Exported 872 labels for en AU ===== Index: lams_central/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -r5d865502ffc41ad5759af87eb091d9627e6965a1 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 5d865502ffc41ad5759af87eb091d9627e6965a1) +++ lams_central/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -859,7 +859,6 @@ authoring.create.mc.question =Create Multiple Choice Question authoring.label.application.exercise.num =Application Exercise {0} authoring.error.application.exercise.num =Application Exercise {0} may not be blank. -authoring.label.question.text =Question text authoring.label.question.num =Question {0} authoring.label.option.num =Option {0} authoring.error.option =Option may not be blank @@ -880,6 +879,7 @@ authoring.tbl.template.description =Individual and Team Readiness Assessments followed by Application Exercises. authoring.tbl.desc.question =These questions are for iRA and tRA. Click "Create Question" to add more questions. Turn on "Enable confidence levels" to have the learners' confidence levels from the iRA shown on the tRA screen. authoring.tbl.desc.ae =Enter the questions for the Application Exercises. You can have one or more Application Exercises and each Application Exercise can have one or more Questions. If you turn on Add A Notebook for the Application Exercise then a Notebook activity will be created after that Application Exercise. -authoring.tbl.use.notebook=Add a Notebook after the Application Exercise with the following instructions: +authoring.template.basic.import.qti =Import IMS QTI +authoring.tbl.use.noticeboard=Add a Noticeboard after the Application Exercise with the following instructions: authoring.create.application.exercise=Create Application Exercise #======= End labels: Exported 872 labels for en AU ===== Index: lams_central/conf/language/lams/TBLResources.properties =================================================================== diff -u -r5d865502ffc41ad5759af87eb091d9627e6965a1 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/conf/language/lams/TBLResources.properties (.../TBLResources.properties) (revision 5d865502ffc41ad5759af87eb091d9627e6965a1) +++ lams_central/conf/language/lams/TBLResources.properties (.../TBLResources.properties) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -4,22 +4,20 @@ Next, your group would complete the application exercises.
\ As a post-class activity, you would complete a personal reflection on the key learning points.

boilerplate.ira.title=IRA -boilerplate.ira.instructions=Please complete the MCQ before proceeding to the next activity. +boilerplate.ira.instructions= boilerplate.leader.title=Leader Selection boilerplate.leader.instructions=Instructions boilerplate.tra.title=Scratchie / TRA -boilerplate.tra.instructions=Please give your input based on the answers given by your peers. +boilerplate.tra.instructions= boilerplate.ae.instructions= -boilerplate.ae.application.exercise.num=Assessment / AE {0} -boilerplate.ae.question.num =Question {0} -boilerplate.grouped.notebook.num=Notebook for Assessment / AE {0} +boilerplate.grouped.ae.noticeboard.num=Noticeboard {0} boilerplate.individual.reflection.title=Notebook boilerplate.individual.reflection.instructions=What are your key learning points? boilerplate.peerreview=Peer Review boilerplate.peerreview.instructions=Please rate your peers' interaction with the group. -boilerplate.before.ira.gate=Gate for IRA -boilerplate.before.tra.gate=Gate for TRA -boilerplate.before.app.ex=Gate for Application Exercise -boilerplate.before.app.ex.notebook=Gate for Notebook -boilerplate.before.peer.review=Gate for Peer Review +boilerplate.before.ira.gate=IRAGate +boilerplate.before.tra.gate=TRAGate +boilerplate.before.app.ex=AEGate {0} +boilerplate.before.app.ex.noticeboard=AEGate Noticeboard {0} +boilerplate.before.peer.review=Peer Review Gate boilerplate.grouping.title=Group Setup Index: lams_central/src/java/org/lamsfoundation/lams/authoring/template/Assessment.java =================================================================== diff -u -r5d865502ffc41ad5759af87eb091d9627e6965a1 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/src/java/org/lamsfoundation/lams/authoring/template/Assessment.java (.../Assessment.java) (revision 5d865502ffc41ad5759af87eb091d9627e6965a1) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/template/Assessment.java (.../Assessment.java) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -129,16 +129,16 @@ } /** If no errors exist, returns null */ - public List validate(ResourceBundle appBundle, MessageFormat formatter, Integer applicationExerciseNumber, Integer questionNumber) { + public List validate(ResourceBundle appBundle, MessageFormat formatter, Integer applicationExerciseNumber, String applicationExerciseTitle, Integer questionNumber) { List errorMessages = null; if (questionText == null || questionText.length() == 0) { errorMessages = addError(errorMessages, TextUtil.getText(appBundle, formatter, - "authoring.error.application.exercise.question.must.not.be.blank.num", new Object[] { questionNumber })); + "authoring.error.application.exercise.question.must.not.be.blank.num", new Object[] { applicationExerciseTitle, title })); } if (type == ASSESSMENT_QUESTION_TYPE_MULTIPLE_CHOICE) { if (answers.size() == 0) { errorMessages = addError(errorMessages, TextUtil.getText(appBundle, formatter, - "authoring.error.application.exercise.must.have.answer.num", new Object[] { applicationExerciseNumber, questionNumber })); + "authoring.error.application.exercise.must.have.answer.num", new Object[] { applicationExerciseTitle, title })); } else { boolean found100percent = false; for (AssessMCAnswer answer : answers) { @@ -151,7 +151,7 @@ errorMessages = addError(errorMessages, TextUtil.getText(appBundle, formatter, "authoring.error.application.exercise.must.have.100.percent", - new Object[] { applicationExerciseNumber, questionNumber })); + new Object[] { applicationExerciseTitle, title })); } } } Index: lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/LdTemplateController.java =================================================================== diff -u -r5d865502ffc41ad5759af87eb091d9627e6965a1 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/LdTemplateController.java (.../LdTemplateController.java) (revision 5d865502ffc41ad5759af87eb091d9627e6965a1) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/LdTemplateController.java (.../LdTemplateController.java) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -1464,6 +1464,7 @@ request.setAttribute("questionNumber", WebUtil.readIntParam(request, "questionNumber")); request.setAttribute("optionNumber", WebUtil.readIntParam(request, "optionNumber")); boolean useAssessmentVersion = WebUtil.readBooleanParam(request, "assess", false); + request.setAttribute("containingDivName", WebUtil.readStrParam(request, "containingDivName", true)); return (useAssessmentVersion ? "authoring/template/tool/assessoption" : "authoring/template/tool/mcoption"); } Index: lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/TBLTemplateController.java =================================================================== diff -u -r5d865502ffc41ad5759af87eb091d9627e6965a1 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/TBLTemplateController.java (.../TBLTemplateController.java) (revision 5d865502ffc41ad5759af87eb091d9627e6965a1) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/TBLTemplateController.java (.../TBLTemplateController.java) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -155,9 +155,17 @@ data.contentFolderID, groupingUIID, null, null, activityTitle); activities.add(iraActivityJSON); - // Stop! + // Leader Selection firstActivityInRowPosition = calcPositionBelow(firstActivityInRowPosition); currentActivityPosition = firstActivityInRowPosition; + activityTitle = data.getText("boilerplate.leader.title"); + Long leaderSelectionToolContentId = createLeaderSelectionToolContent(userDTO, activityTitle, + data.getText("boilerplate.leader.instructions")); + activities.add(createLeaderSelectionActivity(maxUIID, order++, currentActivityPosition, + leaderSelectionToolContentId, data.contentFolderID, groupingUIID, null, null, activityTitle)); + + // Stop! + currentActivityPosition = calcPositionNextRight(currentActivityPosition); activityTitle = data.getText("boilerplate.before.tra.gate"); if (data.useScheduledGates && data.traStartOffset != null) { activities.add(createScheduledGateActivity(maxUIID, order++, calcGateOffset(currentActivityPosition), @@ -167,14 +175,6 @@ activityTitle)); } - // Leader Selection - currentActivityPosition = calcPositionNextRight(currentActivityPosition); - activityTitle = data.getText("boilerplate.leader.title"); - Long leaderSelectionToolContentId = createLeaderSelectionToolContent(userDTO, activityTitle, - data.getText("boilerplate.leader.instructions")); - activities.add(createLeaderSelectionActivity(maxUIID, order++, currentActivityPosition, - leaderSelectionToolContentId, data.contentFolderID, groupingUIID, null, null, activityTitle)); - // tRA Test currentActivityPosition = calcPositionNextRight(currentActivityPosition); activityTitle = data.getText("boilerplate.tra.title"); @@ -193,10 +193,8 @@ // notebook after an exercise if indicated by the user. Each Application Exercise will have one or more questions. // Start a new row so that they group nicely together int displayOrder = 1; - String displayOrderAsString = Integer.toString(displayOrder); + int noticeboardCount = 0; if (data.useApplicationExercises) { - String gateTitleBeforeAppEx = data.getText("boilerplate.before.app.ex"); - String gateTitleBeforeNotebook = data.getText("boilerplate.before.app.ex.notebook"); for (AppExData applicationExercise : data.applicationExercises.values()) { @@ -205,6 +203,7 @@ currentActivityPosition = firstActivityInRowPosition; // Gate before Application Exercise + String gateTitleBeforeAppEx = data.getText("boilerplate.before.app.ex", new String[] {applicationExercise.title}); if (data.useScheduledGates && data.aeStartOffset != null) { activities.add(createScheduledGateActivity(maxUIID, order++, calcGateOffset(currentActivityPosition), gateTitleBeforeAppEx, data.aeStartOffset)); @@ -215,16 +214,10 @@ // Application Exercise int assessmentNumber = 1; - String applicationExerciseTitle = data.getText("boilerplate.ae.application.exercise.num", - new String[] { displayOrderAsString }); + String applicationExerciseTitle = applicationExercise.title; currentActivityPosition = calcPositionNextRight(currentActivityPosition); ArrayNode questionsJSONArray = JsonNodeFactory.instance.arrayNode(); for (Assessment exerciseQuestion : applicationExercise.assessments.values()) { - if (exerciseQuestion.getTitle() == null) { - // put in a dummy title if one is not supplied by the user - exerciseQuestion.setTitle(data.getText("boilerplate.ae.question.num", - new String[] { Integer.toString(assessmentNumber) })); - } questionsJSONArray.add(exerciseQuestion.getAsObjectNode(assessmentNumber)); assessmentNumber++; } @@ -233,20 +226,23 @@ activities.add(createAssessmentActivity(maxUIID, order++, currentActivityPosition, aetoolContentId, data.contentFolderID, groupingUIID, null, null, applicationExerciseTitle)); - // Optional Gate / Notebook. Don't add the extra gate in LAMS TBL or we will get too many scheduled gates to manage - if (applicationExercise.useNotebook) { + // Optional Gate / Noticeboard. Don't add the extra gate in LAMS TBL or we will get too many scheduled gates to manage + if (applicationExercise.useNoticeboard) { + noticeboardCount++; + String noticeboardCountAsString = Integer.toString(noticeboardCount); + if (!data.useScheduledGates) { currentActivityPosition = calcPositionNextRight(currentActivityPosition); activities.add(createGateActivity(maxUIID, order++, calcGateOffset(currentActivityPosition), - gateTitleBeforeNotebook)); + data.getText("boilerplate.before.app.ex.noticeboard", new String[] {noticeboardCountAsString} ))); } currentActivityPosition = calcPositionNextRight(currentActivityPosition); - String notebookTitle = data.getText("boilerplate.grouped.notebook.num", - new String[] { displayOrderAsString }); - Long reflectionToolContentId = createNotebookToolContent(userDTO, notebookTitle, - applicationExercise.notebookInstructions, false, false); - activities.add(createNotebookActivity(maxUIID, order++, currentActivityPosition, - reflectionToolContentId, data.contentFolderID, groupingUIID, null, null, notebookTitle)); + String notebookTitle = data.getText("boilerplate.grouped.ae.noticeboard.num", + new String[] { noticeboardCountAsString }); + Long aeNoticeboardContentId = createNoticeboardToolContent(userDTO, notebookTitle, + applicationExercise.noticeboardInstructions, null); + activities.add(createNoticeboardActivity(maxUIID, order++, currentActivityPosition, aeNoticeboardContentId, + data.contentFolderID, groupingUIID, null, null, notebookTitle)); } displayOrder++; @@ -304,9 +300,10 @@ } class AppExData { + String title="Fix me"; SortedMap assessments; - boolean useNotebook = false; - String notebookInstructions; + boolean useNoticeboard = false; + String noticeboardInstructions; } /** @@ -358,6 +355,15 @@ TBLData(HttpServletRequest request) { super(request, templateCode); + // Debugging .....String name = (String) parameterNames.nextElement(); + for ( Map.Entry paramEntry : request.getParameterMap().entrySet() ) { + StringBuffer debugStr = new StringBuffer("Parameter name ").append(paramEntry.getKey()).append(" values "); + for ( String value : paramEntry.getValue() ) { + debugStr.append(value).append(", "); + } + log.debug(debugStr.toString()); + } + contentFolderID = getTrimmedString(request, "contentFolderID", false); sequenceTitle = getTrimmedString(request, "sequenceTitle", false); @@ -413,12 +419,19 @@ if (optionIndex > 0) { Integer questionDisplayOrder = Integer.valueOf(name.substring(questionOffset, optionIndex)); Integer optionDisplayOrder = Integer.valueOf(name.substring(optionIndex + 6)); - processTestQuestion(name, null, questionDisplayOrder, optionDisplayOrder, + processTestQuestion(name, null, null, questionDisplayOrder, optionDisplayOrder, getTrimmedString(request, name, true)); } else { - Integer questionDisplayOrder = Integer.valueOf(name.substring(questionOffset)); - processTestQuestion(name, getTrimmedString(request, name, true), questionDisplayOrder, null, - null); + int titleIndex = name.indexOf("title"); + if (titleIndex > 0) { // question1title + Integer questionDisplayOrder = Integer.valueOf(name.substring(questionOffset, titleIndex)); + processTestQuestion(name, null, getTrimmedString(request, name, false), + questionDisplayOrder, null, null); + } else { + Integer questionDisplayOrder = Integer.valueOf(name.substring(questionOffset)); + processTestQuestion(name, getTrimmedString(request, name, true), null, + questionDisplayOrder, null, null); + } } } } else if (usePeerReview && name.startsWith("peerreview")) { @@ -428,6 +441,9 @@ confidenceLevelEnable = WebUtil.readBooleanParam(request, "confidenceLevelEnable", false); if (useIRATRA) { + if ( testQuestions.size() == 0 ) { + addValidationErrorMessage("authoring.error.rat.not.blank", null); + } updateCorrectAnswers(correctAnswers); } @@ -464,16 +480,20 @@ for (int i = 1; i <= numAppEx; i++) { String appexDiv = "divappex"+i; AppExData newAppex = new AppExData(); - newAppex.assessments = processAssessments(request, i); - newAppex.useNotebook = WebUtil.readBooleanParam(request, appexDiv+"NB", false); - if ( newAppex.useNotebook ) { - newAppex.notebookInstructions = WebUtil.readStrParam(request, appexDiv+"NBIns", true); + newAppex.title = WebUtil.readStrParam(request, appexDiv+"Title"); + newAppex.assessments = processAssessments(request, i, newAppex.title); + newAppex.useNoticeboard = WebUtil.readBooleanParam(request, appexDiv+"NB", false); + if ( newAppex.useNoticeboard ) { + newAppex.noticeboardInstructions = getTrimmedString(request, appexDiv+"NBEntry", true); + if ( newAppex.noticeboardInstructions == null ) + addValidationErrorMessage( + "authoring.error.application.exercise.needs.noticeboard.text", new Object[] {"\"" + newAppex.title + "\""}); } applicationExercises.put(i, newAppex); } } - private SortedMap processAssessments(HttpServletRequest request, int appexNumber) { + private SortedMap processAssessments(HttpServletRequest request, int appexNumber, String appexTitle) { SortedMap applicationExercises = new TreeMap(); int numAssessments = WebUtil.readIntParam(request, "numAssessments" + appexNumber); @@ -501,7 +521,7 @@ } catch (Exception e) { log.error("Error parsing " + grade + " for float", e); addValidationErrorMessage( - "authoring.error.application.exercise.not.blank.and.grade", new Object[] {appexNumber, i}); + "authoring.error.application.exercise.not.blank.and.grade", new Object[] {"\"" + appexTitle + "\"", i}); } } } @@ -540,7 +560,7 @@ return criteria; } - void processTestQuestion(String name, String questionText, Integer questionDisplayOrder, + void processTestQuestion(String name, String questionText, String questionTitle, Integer questionDisplayOrder, Integer optionDisplayOrder, String optionText) { ObjectNode question = testQuestions.get(questionDisplayOrder); @@ -553,12 +573,16 @@ if (questionText != null) { question.put(RestTags.QUESTION_TEXT, questionText); - question.put(RestTags.QUESTION_TITLE, "Q" + questionDisplayOrder.toString()); // only used for - // Scratchie, not MCQ but - // won't hurt MCQ by being - // there! + // default title just in case - used for scratchie. Should be replaced with a user value + if ( ! question.has(RestTags.QUESTION_TITLE) ) { + question.put(RestTags.QUESTION_TITLE, "Q" + questionDisplayOrder.toString()); + } } - + + if (questionTitle != null) { + question.put(RestTags.QUESTION_TITLE, questionTitle); + } + if (optionDisplayOrder != null && optionText != null) { ObjectNode newOption = JsonNodeFactory.instance.objectNode(); newOption.put(RestTags.DISPLAY_ORDER, optionDisplayOrder); @@ -574,18 +598,21 @@ Integer questionNumber = entry.getKey(); ObjectNode question = entry.getValue(); if (!question.has(RestTags.QUESTION_TEXT)) { - addValidationErrorMessage("authoring.error.question.num", new Integer[] { questionNumber }); + Object param = question.has(RestTags.QUESTION_TITLE) ? question.get(RestTags.QUESTION_TITLE) : questionNumber; + addValidationErrorMessage("authoring.error.question.num", new Object[] { param }); } Integer correctAnswerDisplay = correctAnswers.get(entry.getKey()); if (correctAnswerDisplay == null) { - addValidationErrorMessage("authoring.error.question.correct.num", new Integer[] { questionNumber }); + Object param = question.has(RestTags.QUESTION_TITLE) ? question.get(RestTags.QUESTION_TITLE): questionNumber; + addValidationErrorMessage("authoring.error.question.correct.num", new Object[] { param }); } else { ArrayNode answers = (ArrayNode) question.get(RestTags.ANSWERS); if (answers == null || answers.size() == 0) { + Object param = question.has(RestTags.QUESTION_TITLE) ? question.get(RestTags.QUESTION_TITLE): questionNumber; addValidationErrorMessage("authoring.error.question.must.have.answer.num", - new Integer[] { questionNumber }); + new Object[] { param }); } else { boolean correctAnswerFound = false; // may not exist as the user didn't put any text in! for (int i = 0; i < answers.size(); i++) { @@ -597,8 +624,9 @@ } } if (!correctAnswerFound) { + Object param = question.has(RestTags.QUESTION_TITLE) ? question.get(RestTags.QUESTION_TITLE): questionNumber; addValidationErrorMessage("authoring.error.question.correct.num", - new Integer[] { questionNumber }); + new Object[] { param }); } } } @@ -629,11 +657,11 @@ AppExData appEx = appExEntry.getValue(); if (appEx.assessments == null || appEx.assessments.size() == 0) { addValidationErrorMessage("authoring.error.application.exercise.num", - new Integer[] { appExEntry.getKey() }); + new String[] { "\""+appEx.title +"\""}); } else { for (Map.Entry assessmentEntry : appEx.assessments.entrySet()) { List errors = assessmentEntry.getValue().validate(appBundle, formatter, - appExEntry.getKey(), assessmentEntry.getKey()); + appExEntry.getKey(), "\""+appEx.title +"\"", assessmentEntry.getKey()); if (errors != null) errorMessages.addAll(errors); } Index: lams_central/web/authoring/template/comms.jsp =================================================================== diff -u -r5d865502ffc41ad5759af87eb091d9627e6965a1 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/web/authoring/template/comms.jsp (.../comms.jsp) (revision 5d865502ffc41ad5759af87eb091d9627e6965a1) +++ lams_central/web/authoring/template/comms.jsp (.../comms.jsp) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -13,7 +13,7 @@ 'nextSelector': '.button-next', 'previousSelector': '.button-previous', 'onTabShow': function(tab, navigation, index) { - var total = navigation.find('li[display = block]').length; + var total = navigation.find('li:visible').length; var current = index+1; var percent = (current/total) * 100; $('#rootwizard .progress-bar').css({width:percent+'%'}) @@ -214,29 +214,28 @@ } }); } - - function createAssessmentOption(questionNum, maxOptionCount) { - var currNum = $('#assmcq'+questionNum+'numOptions').val(); + function createAssessmentOption(questionNum, maxOptionCount, containingDivName) { + var currNum = $('#'+containingDivName+'assmcq'+questionNum+'numOptions').val(); var nextNum = +currNum + 1; var newDiv = document.createElement("div"); - newDiv.id = 'divassmcq'+questionNum+'opt'+nextNum; - var optionsDiv=$('#divassmcq'+questionNum+'options'); + newDiv.id = containingDivName+'divassmcq'+questionNum+'opt'+nextNum; + var optionsDiv=$('#'+containingDivName+'divassmcq'+questionNum+'options'); var lastChild=optionsDiv.children().filter(':last'); $(lastChild).after(newDiv); - var url=getSubmissionURL()+"/createOption.do?questionNumber="+questionNum+"&optionNumber="+nextNum+"&assess=true"; + var url=getSubmissionURL()+"/createOption.do?questionNumber="+questionNum+"&optionNumber="+nextNum+"&assess=true&containingDivName="+containingDivName; $.ajaxSetup({ cache: true }); $(newDiv).load(url, function( response, status, xhr ) { if ( status == "error" ) { console.log( xhr.status + " " + xhr.statusText ); newDiv.remove(); } else { - $('#assmcq'+questionNum+'numOptions').val(nextNum); + $('#'+containingDivName+'assmcq'+questionNum+'numOptions').val(nextNum); if ( nextNum >= maxOptionCount ) { - $('#createAssessmentOptionButton'+questionNum).hide(); + $('#'+containingDivName+'createAssessmentOptionButton'+questionNum).hide(); } // need to add the down button to the previous last option! - var image = document.getElementById('assmcq'+questionNum+'option'+currNum+'DownButton') + var image = document.getElementById(containingDivName+'assmcq'+questionNum+'option'+currNum+'DownButton') image.style.display="inline"; newDiv.scrollIntoView(); Index: lams_central/web/authoring/template/tbl/appex.jsp =================================================================== diff -u -r5d865502ffc41ad5759af87eb091d9627e6965a1 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/web/authoring/template/tbl/appex.jsp (.../appex.jsp) (revision 5d865502ffc41ad5759af87eb091d9627e6965a1) +++ lams_central/web/authoring/template/tbl/appex.jsp (.../appex.jsp) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -3,17 +3,23 @@ <%@ taglib uri="tags-core" prefix="c"%> <%-- Application Exercise. It should have one or more essay or multiple choice questions. If QTI Import is used then all the questions are put into one exercise. --%> +<%-- The title needs to look like an ordinary panel title, but be editable via the X-editable javascript. But that won't be returned to the server in the form data, so copy what appears in the displayed span to a hidden input field. --%> + +divappex${appexNumber}TitleDisplay +divappex${appexNumber}Title +
-
- +
+
Index: lams_central/web/authoring/template/tbl/tbl.jsp =================================================================== diff -u -r5d865502ffc41ad5759af87eb091d9627e6965a1 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/web/authoring/template/tbl/tbl.jsp (.../tbl.jsp) (revision 5d865502ffc41ad5759af87eb091d9627e6965a1) +++ lams_central/web/authoring/template/tbl/tbl.jsp (.../tbl.jsp) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -3,6 +3,7 @@ <%@ taglib uri="tags-lams" prefix="lams"%> <%@ taglib uri="tags-fmt" prefix="fmt"%> <%@ taglib uri="tags-core" prefix="c"%> +<%@ taglib uri="tags-function" prefix="fn"%> @@ -11,26 +12,15 @@ - <%@ include file="../header.jsp" %> + + + <fmt:message key="authoring.tbl.template.title"/> - - \ No newline at end of file Index: lams_central/web/authoring/template/tool/assessment.jsp =================================================================== diff -u -r5d865502ffc41ad5759af87eb091d9627e6965a1 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/web/authoring/template/tool/assessment.jsp (.../assessment.jsp) (revision 5d865502ffc41ad5759af87eb091d9627e6965a1) +++ lams_central/web/authoring/template/tool/assessment.jsp (.../assessment.jsp) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -5,23 +5,51 @@ Question, and hence question.title and question.text are optional and are only populated if QTI is used to start the questions. ${containingDivName} is set if this is being called from a page with multiple sets of assessments, like the Application Exercises for TBL. --%> +<%-- The title needs to look like an ordinary panel title, but be editable via the X-editable javascript. But that won't be returned to the server in the form data, so copy what appears in the displayed span to a hidden input field. --%> + +${question.title} + + +${containingDivName}assessment${questionNumber}titleDisplay +${containingDivName}assessment${questionNumber}title +
${questionNumber eq 1 ? "" : ""} +
- - - -
-
\ No newline at end of file +
+ + \ No newline at end of file Index: lams_central/web/authoring/template/tool/mcquestion.jsp =================================================================== diff -u -r3f18890e24de43c31ac23d49e2c1a4906e479863 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/web/authoring/template/tool/mcquestion.jsp (.../mcquestion.jsp) (revision 3f18890e24de43c31ac23d49e2c1a4906e479863) +++ lams_central/web/authoring/template/tool/mcquestion.jsp (.../mcquestion.jsp) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -6,9 +6,22 @@ <%-- Generic Q&A question page. Expects an input of questionNumber, contentFolderID, and creates a text field field question${questionNumber} and three options / as many as are need for a QTI import --%> +<%-- The title needs to look like an ordinary panel title, but be editable via the X-editable javascript. But that won't be returned to the server in the form data, so copy what appears in the displayed span to a hidden input field. --%> + +${question.title} + + +question${questionNumber}titleDisplay +question${questionNumber}title +
-
+
+ ${questionNumber eq 1 ? "" : ""} + +
@@ -72,4 +85,27 @@
-
\ No newline at end of file + + + \ No newline at end of file Index: lams_central/web/css/_authoring_base.scss =================================================================== diff -u -r2940e9564fb8acca1fdad9dbcb227fe777694af7 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_central/web/css/_authoring_base.scss (.../_authoring_base.scss) (revision 2940e9564fb8acca1fdad9dbcb227fe777694af7) +++ lams_central/web/css/_authoring_base.scss (.../_authoring_base.scss) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -554,12 +554,19 @@ #rootwizard table.table-condensed { margin-bottom: 0px; } -#rootwizard .required:after { - content: "*"; - font-style: normal; - font-weight: normal; - text-decoration: inherit; - margin-left: 5px; } +#rootwizard { + .required:after { + content: "*"; + font-style: normal; + font-weight: normal; + text-decoration: inherit; + margin-left: 5px; + } + + .panel-title .required { + font-weight: 500; + } +} #rootwizard .container { margin-right: 4px; @@ -595,3 +602,24 @@ #rootwizard .progress-bar { background-color: $brand-primary; } + +#rootwizard { + div.space-top { + padding-top: 15px; + } + div.space-sides { + padding-left: 15px; + padding-right: 15px; + } + div.space-bottom { + padding-bottom: 15px; + } + // Allow panel titles to be edited - show pencil only when hovering + span.hoverEdit:hover +span+ i { + visibility: visible; + } + span.hoverEdit +span+ i { + visibility: hidden; + } +} + \ No newline at end of file Index: lams_www/web/public/ld-templates/tbl/tbl.png =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f Binary files differ Index: lams_www/web/public/ld-templates/tbl/tblintro.html =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_www/web/public/ld-templates/tbl/tblintro.html (.../tblintro.html) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_www/web/public/ld-templates/tbl/tblintro.html (.../tblintro.html) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -1,12 +1,13 @@ -

Your students would have gone through pre-class activities designated by you. They would form groups before completing the Individual Readiness Assessment (iRA). They would then attempt the Team Readiness Assessment (tRA), where the group leader would submit the group's answer. Next, the groups would complete the application exercises.
+

Your students would have gone through pre-class activities designated by you. They would form groups before completing the Individual Readiness Assessment (iRA). They would then attempt the Team Readiness Assessment (tRA), where the group leader would submit the group's answer. Next, the groups would complete a number of Application Exercises.
As a post-class activity, your students would complete a personal reflection on the key learning points.

+

You may create one or more Application Exercises, and each Exercise can have one or more Questions. Each Application Exercise has an optional Noticeboard feature, which will display a Noticeboard after the Exercise has been completed, with additional content relating to the Exercise.

The Peer Review activity will only be included if you enter values in the Peer Review Criteria fields on the following pages. If you leave the fields blank then the learners will skip the Peer Review stage.

Students would go through the following activities.

Step 1: Introducing TBL to the students
Step 2: Forming teams
Step 3: Completing the Individual Readiness Assessment (iRA)
Step 4: Completing the Team Readiness Assessment (tRA)
-Step 5: Completing the Application Exercises
+Step 5: Completing one or more Application Exercises.
Step 6: Completing the Peer Review (optional - see notes above)
Step 7: Completing a personal reflection on the key learning points as a post-class activity.
-

+

\ No newline at end of file Index: lams_www/web/public/ld-templates/tbl/tblintro_en_AU.html =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f --- lams_www/web/public/ld-templates/tbl/tblintro_en_AU.html (.../tblintro_en_AU.html) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_www/web/public/ld-templates/tbl/tblintro_en_AU.html (.../tblintro_en_AU.html) (revision 08a2133f0cddf6ef58bdd8bd6ea21c6d73cc354f) @@ -1,12 +1,13 @@ -

Your students would have gone through pre-class activities designated by you. They would form groups before completing the Individual Readiness Assessment (iRA). They would then attempt the Team Readiness Assessment (tRA), where the group leader would submit the group's answer. Next, the groups would complete the application exercises.
+

Your students would have gone through pre-class activities designated by you. They would form groups before completing the Individual Readiness Assessment (iRA). They would then attempt the Team Readiness Assessment (tRA), where the group leader would submit the group's answer. Next, the groups would complete a number of Application Exercises.
As a post-class activity, your students would complete a personal reflection on the key learning points.

+

You may create one or more Application Exercises, and each Exercise can have one or more Questions. Each Application Exercise has an optional Noticeboard feature, which will display a Noticeboard after the Exercise has been completed, with additional content relating to the Exercise.

The Peer Review activity will only be included if you enter values in the Peer Review Criteria fields on the following pages. If you leave the fields blank then the learners will skip the Peer Review stage.

Students would go through the following activities.

Step 1: Introducing TBL to the students
Step 2: Forming teams
Step 3: Completing the Individual Readiness Assessment (iRA)
Step 4: Completing the Team Readiness Assessment (tRA)
-Step 5: Completing the Application Exercises
+Step 5: Completing one or more Application Exercises.
Step 6: Completing the Peer Review (optional - see notes above)
Step 7: Completing a personal reflection on the key learning points as a post-class activity.
-

+

\ No newline at end of file