diff --git a/js/questionset.js b/js/questionset.js index e69de29..93e7d0b 100644 --- a/js/questionset.js +++ b/js/questionset.js @@ -0,0 +1,136 @@ +// Will render a Question with multiple choices for answers. + +// Options format: +// { +// title: "Optional title for question box", +// question: "Question text", +// answers: [{text: "Answer text", correct: false}, ...], +// singleAnswer: true, // or false, will change rendered output slightly. +// } +window.H5P = window.H5P || {}; + +H5P.QuestionSet = function (options) { + if ( !(this instanceof H5P.QuestionSet) ) + return new H5P.QuestionSet(options); + + var texttemplate = '' + +'
' + +'

<%= title %>

' + +' <% for (var i=0; i' + +'
' + +'

<%= questions[i].machineName %>

' + +'
' + +' <% } %>' + +' ' + +'
' + + ''; + + var defaults = { + title: "", + randomOrder: false, + initialQuestion: 0, + progressType: 'textual', + questions: [] + }; + + var template = new EJS({text: texttemplate}); + var params = jQuery.extend({}, defaults, options); + + var currentQuestion = -1; + var questionInstances = new Array(); + var allQuestionsAnswered = false; + var myDom; + + if (params.randomOrder) { + // TODO: Randomize order of questions + console.log("TODO: Randomize order of questions"); + } + + var _showQuestion = function (questionNumber) { + // Sanitize input. + if (questionNumber < 0) { questionNumber = 0; } + if (questionNumber >= params.questions.length) { questionNumber = params.questions.length - 1; } + + $('.prev.button', myDom).attr({'disabled': (questionNumber === 0)}); + $('.next.button', myDom).attr({'disabled': (questionNumber == params.questions.length-1)}); + + // Hide all questions + $('.question', myDom).hide(); + + // Reshow the requested question + $('#q-' + questionNumber, myDom).show(); + + // Update progress indicator + // Test if current has been answered. + if (params.progressType == 'textual') { + $('.progress-current', myDom).text("" + (questionNumber+1)); + } else { + $('.progress-dot.current', myDom).removeClass('current'); + // Set answered/unanswered for current. + $('#qdot-' + questionNumber, myDom).addClass('current'); + } + + // Remember where we are + currentQuestion = questionNumber; + return currentQuestion; + }; + + // Function for attaching the multichoice to a DOM element. + var attach = function (targetId) { + // Render own DOM into target. + template.update(targetId, params); + myDom = jQuery('#' + targetId); + + // Attach questions + for (var i=0; i= 0; i--) { + score += questionInstances[i].getScore(); + } + return score; + }; + + return { + attach: attach, // Attach to DOM object + getQuestions: function () {return questionInstances;}, + getScore: getScore, + defaults: defaults // Provide defaults for inspection + }; +}; diff --git a/schema.json b/schema.json index e69de29..63026ba 100644 --- a/schema.json +++ b/schema.json @@ -0,0 +1,35 @@ +{ + "title": { + "name": "Title", + "description": "Question set title (optional)", + "type": "text", + "default": "" + }, + "randomOrder": { + "name": "Randomize order", + "description": "Whether questions should be shown in random order", + "type": "boolean", + "default": false + }, + "initialQuestion": { + "name": "Initial question", + "description": "Which question to start with. Count from 0", + "type": "integer", + "default": 0 + }, + "progressType": { + "name": "Progress indicator", + "description": "Question set progress indicator style", + "type": "select", + "values": [{"text": "Textual", "value": "textual"}, {"text": "Dots", "value": "dots"}], + "default": "textual" + }, + "questions": { + "name": "Questions", + "description": "List of questions in this set.", + "type": "h5p-library", + "array": true, + "minEntries": 1, + "maxEntries": -1 + } +} diff --git a/views/questionset.ejs b/views/questionset.ejs index e69de29..a9c19b4 100644 --- a/views/questionset.ejs +++ b/views/questionset.ejs @@ -0,0 +1,25 @@ +
+

<%= title %>

+ <% for (var i=0; i +
+

<%= questions[i].machineName %>

+
+ <% } %> + +