Merge branch 'master' into stable
commit
84eea1e44a
|
@ -14,8 +14,10 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
if (!(this instanceof H5P.QuestionSet)) {
|
if (!(this instanceof H5P.QuestionSet)) {
|
||||||
return new H5P.QuestionSet(options, contentId);
|
return new H5P.QuestionSet(options, contentId);
|
||||||
}
|
}
|
||||||
|
H5P.EventDispatcher.call(this);
|
||||||
var $ = H5P.jQuery;
|
var $ = H5P.jQuery;
|
||||||
|
var self = this;
|
||||||
|
this.contentId = contentId;
|
||||||
|
|
||||||
var texttemplate =
|
var texttemplate =
|
||||||
'<% if (introPage.showIntroPage) { %>' +
|
'<% if (introPage.showIntroPage) { %>' +
|
||||||
|
@ -96,8 +98,7 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
overrideButtons: false,
|
overrideButtons: false,
|
||||||
overrideShowSolutionButton: false,
|
overrideShowSolutionButton: false,
|
||||||
overrideRetry: false
|
overrideRetry: false
|
||||||
},
|
}
|
||||||
postUserStatistics: (H5P.postUserStatistics === true)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var template = new EJS({text: texttemplate});
|
var template = new EJS({text: texttemplate});
|
||||||
|
@ -122,11 +123,11 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
enableSolutionsButton: params.override.overrideShowSolutionButton
|
enableSolutionsButton: params.override.overrideShowSolutionButton
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
var questionInstance = H5P.newRunnable(question, contentId);
|
||||||
$.extend(question.params, {
|
questionInstances.push(questionInstance);
|
||||||
postUserStatistics: false
|
questionInstance.on('resize', function() {
|
||||||
|
self.trigger('resize');
|
||||||
});
|
});
|
||||||
questionInstances.push(H5P.newRunnable(question, contentId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update button state.
|
// Update button state.
|
||||||
|
@ -167,7 +168,7 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
// Trigger resize on question in case the size of the QS has changed.
|
// Trigger resize on question in case the size of the QS has changed.
|
||||||
var instance = questionInstances[questionNumber];
|
var instance = questionInstances[questionNumber];
|
||||||
if (instance.$ !== undefined) {
|
if (instance.$ !== undefined) {
|
||||||
instance.$.trigger('resize');
|
instance.trigger('resize');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update progress indicator
|
// Update progress indicator
|
||||||
|
@ -184,6 +185,7 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
// Remember where we are
|
// Remember where we are
|
||||||
currentQuestion = questionNumber;
|
currentQuestion = questionNumber;
|
||||||
_updateButtons();
|
_updateButtons();
|
||||||
|
self.trigger('resize');
|
||||||
return currentQuestion;
|
return currentQuestion;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -225,7 +227,7 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
|
|
||||||
var rendered = false;
|
var rendered = false;
|
||||||
|
|
||||||
var reRender = function () {
|
this.reRender = function () {
|
||||||
rendered = false;
|
rendered = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -239,8 +241,8 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
rendered = true;
|
rendered = true;
|
||||||
|
|
||||||
// Get total score.
|
// Get total score.
|
||||||
var finals = getScore();
|
var finals = self.getScore();
|
||||||
var totals = totalScore();
|
var totals = self.totalScore();
|
||||||
var scoreString = params.endGame.scoreString.replace("@score", finals).replace("@total", totals);
|
var scoreString = params.endGame.scoreString.replace("@score", finals).replace("@total", totals);
|
||||||
var success = ((100 * finals / totals) >= params.passPercentage);
|
var success = ((100 * finals / totals) >= params.passPercentage);
|
||||||
var eventData = {
|
var eventData = {
|
||||||
|
@ -248,12 +250,10 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
passed: success
|
passed: success
|
||||||
};
|
};
|
||||||
var displayResults = function () {
|
var displayResults = function () {
|
||||||
if (params.postUserStatistics === true) {
|
self.triggerXAPICompleted(self.getScore(), self.totalScore());
|
||||||
H5P.setFinished(contentId, getScore(), totalScore());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!params.endGame.showResultPage) {
|
if (!params.endGame.showResultPage) {
|
||||||
$(returnObject).trigger('h5pQuestionSetFinished', eventData);
|
self.trigger('h5pQuestionSetFinished', eventData);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,7 +271,7 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
$myDom.children().hide();
|
$myDom.children().hide();
|
||||||
$myDom.append(endTemplate.render(eparams));
|
$myDom.append(endTemplate.render(eparams));
|
||||||
$('.qs-finishbutton').click(function () {
|
$('.qs-finishbutton').click(function () {
|
||||||
$(returnObject).trigger('h5pQuestionSetFinished', eventData);
|
self.trigger('h5pQuestionSetFinished', eventData);
|
||||||
});
|
});
|
||||||
$('.qs-solutionbutton', $myDom).click(function () {
|
$('.qs-solutionbutton', $myDom).click(function () {
|
||||||
showSolutions();
|
showSolutions();
|
||||||
|
@ -293,21 +293,23 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
var $videoContainer = $('<div class="video-container"></div>').appendTo($myDom);
|
var $videoContainer = $('<div class="video-container"></div>').appendTo($myDom);
|
||||||
|
|
||||||
var video = new H5P.Video({
|
var video = new H5P.Video({
|
||||||
files: videoData,
|
sources: videoData,
|
||||||
fitToWrapper: true,
|
fitToWrapper: true,
|
||||||
controls: false,
|
controls: false,
|
||||||
autoplay: false
|
autoplay: false
|
||||||
}, contentId);
|
}, contentId);
|
||||||
video.endedCallback = function () {
|
video.on('stateChange', function (event) {
|
||||||
|
if (event.data === H5P.Video.ENDED) {
|
||||||
displayResults();
|
displayResults();
|
||||||
$videoContainer.hide();
|
$videoContainer.hide();
|
||||||
};
|
}
|
||||||
|
});
|
||||||
video.attach($videoContainer);
|
video.attach($videoContainer);
|
||||||
video.play();
|
video.play();
|
||||||
|
|
||||||
if (params.endGame.skipButtonText) {
|
if (params.endGame.skipButtonText) {
|
||||||
$('<a class="h5p-button skip">' + params.endGame.skipButtonText + '</a>').click(function () {
|
$('<a class="h5p-button skip">' + params.endGame.skipButtonText + '</a>').click(function () {
|
||||||
video.stop();
|
video.pause();
|
||||||
$videoContainer.hide();
|
$videoContainer.hide();
|
||||||
displayResults();
|
displayResults();
|
||||||
}).appendTo($videoContainer);
|
}).appendTo($videoContainer);
|
||||||
|
@ -318,10 +320,11 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
}
|
}
|
||||||
// Trigger finished event.
|
// Trigger finished event.
|
||||||
displayResults();
|
displayResults();
|
||||||
|
self.trigger('resize');
|
||||||
};
|
};
|
||||||
|
|
||||||
// Function for attaching the multichoice to a DOM element.
|
// Function for attaching the multichoice to a DOM element.
|
||||||
var attach = function (target) {
|
this.attach = function (target) {
|
||||||
if (typeof(target) === "string") {
|
if (typeof(target) === "string") {
|
||||||
$myDom = $('#' + target);
|
$myDom = $('#' + target);
|
||||||
}
|
}
|
||||||
|
@ -354,9 +357,11 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
var question = questionInstances[i];
|
var question = questionInstances[i];
|
||||||
|
|
||||||
question.attach($('.question-container:eq(' + i + ')', $myDom));
|
question.attach($('.question-container:eq(' + i + ')', $myDom));
|
||||||
$(question).on('h5pQuestionAnswered', function () {
|
question.on('xAPI', function (event) {
|
||||||
|
if (event.getVerb() === 'attempted') {
|
||||||
$('.progress-dot:eq(' + currentQuestion +')', $myDom).removeClass('unanswered').addClass('answered');
|
$('.progress-dot:eq(' + currentQuestion +')', $myDom).removeClass('unanswered').addClass('answered');
|
||||||
_updateButtons();
|
_updateButtons();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
if (question.getAnswerGiven()) {
|
if (question.getAnswerGiven()) {
|
||||||
$('.progress-dot:eq(' + i +')'
|
$('.progress-dot:eq(' + i +')'
|
||||||
|
@ -395,12 +400,13 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
showSolutions();
|
showSolutions();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$.trigger('resize');
|
this.trigger('resize');
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Get current score for questionset.
|
// Get current score for questionset.
|
||||||
var getScore = function () {
|
this.getScore = function () {
|
||||||
var score = 0;
|
var score = 0;
|
||||||
for (var i = questionInstances.length - 1; i >= 0; i--) {
|
for (var i = questionInstances.length - 1; i >= 0; i--) {
|
||||||
score += questionInstances[i].getScore();
|
score += questionInstances[i].getScore();
|
||||||
|
@ -409,7 +415,7 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Get total score possible for questionset.
|
// Get total score possible for questionset.
|
||||||
var totalScore = function () {
|
this.totalScore = function () {
|
||||||
var score = 0;
|
var score = 0;
|
||||||
for (var i = questionInstances.length - 1; i >= 0; i--) {
|
for (var i = questionInstances.length - 1; i >= 0; i--) {
|
||||||
score += questionInstances[i].getMaxScore();
|
score += questionInstances[i].getMaxScore();
|
||||||
|
@ -422,7 +428,7 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
*
|
*
|
||||||
* @returns {H5P.ContentCopyrights}
|
* @returns {H5P.ContentCopyrights}
|
||||||
*/
|
*/
|
||||||
var getCopyrights = function () {
|
this.getCopyrights = function () {
|
||||||
var info = new H5P.ContentCopyrights();
|
var info = new H5P.ContentCopyrights();
|
||||||
|
|
||||||
// Background
|
// Background
|
||||||
|
@ -462,20 +468,12 @@ H5P.QuestionSet = function (options, contentId) {
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
};
|
};
|
||||||
|
this.getQuestions = function() {
|
||||||
// Masquerade the main object to hide inner properties and functions.
|
return questionInstances;
|
||||||
var returnObject = {
|
};
|
||||||
$: $(this),
|
this.showSolutions = function() {
|
||||||
attach: attach, // Attach to DOM object
|
|
||||||
getQuestions: function () {return questionInstances;},
|
|
||||||
getScore: getScore,
|
|
||||||
showSolutions: function () {
|
|
||||||
renderSolutions = true;
|
renderSolutions = true;
|
||||||
},
|
}
|
||||||
totalScore: totalScore,
|
|
||||||
reRender: reRender,
|
|
||||||
defaults: defaults, // Provide defaults for inspection
|
|
||||||
getCopyrights: getCopyrights
|
|
||||||
};
|
|
||||||
return returnObject;
|
|
||||||
};
|
};
|
||||||
|
H5P.QuestionSet.prototype = Object.create(H5P.EventDispatcher.prototype);
|
||||||
|
H5P.QuestionSet.prototype.constructor = H5P.QuestionSet;
|
16
library.json
16
library.json
|
@ -2,15 +2,18 @@
|
||||||
"title": "Question set",
|
"title": "Question set",
|
||||||
"contentType": "question",
|
"contentType": "question",
|
||||||
"majorVersion": 1,
|
"majorVersion": 1,
|
||||||
"minorVersion": 1,
|
"minorVersion": 2,
|
||||||
"patchVersion": 0,
|
"patchVersion": 0,
|
||||||
|
"embedTypes": [
|
||||||
|
"iframe"
|
||||||
|
],
|
||||||
"runnable": 1,
|
"runnable": 1,
|
||||||
"fullscreen": 0,
|
"fullscreen": 0,
|
||||||
"machineName": "H5P.QuestionSet",
|
"machineName": "H5P.QuestionSet",
|
||||||
"author": "Amendor AS",
|
"author": "Joubel AS",
|
||||||
"coreApi": {
|
"coreApi": {
|
||||||
"majorVersion": 1,
|
"majorVersion": 1,
|
||||||
"minorVersion": 1
|
"minorVersion": 4
|
||||||
},
|
},
|
||||||
"license": "cc-by-sa",
|
"license": "cc-by-sa",
|
||||||
"preloadedJs": [
|
"preloadedJs": [
|
||||||
|
@ -37,13 +40,18 @@
|
||||||
{
|
{
|
||||||
"machineName": "H5P.Video",
|
"machineName": "H5P.Video",
|
||||||
"majorVersion": 1,
|
"majorVersion": 1,
|
||||||
"minorVersion": 0
|
"minorVersion": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"editorDependencies": [
|
"editorDependencies": [
|
||||||
{
|
{
|
||||||
"machineName": "H5PEditor.VerticalTabs",
|
"machineName": "H5PEditor.VerticalTabs",
|
||||||
"majorVersion": 1,
|
"majorVersion": 1,
|
||||||
|
"minorVersion": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"machineName": "H5PEditor.QuestionSetTextualEditor",
|
||||||
|
"majorVersion": 1,
|
||||||
"minorVersion": 0
|
"minorVersion": 0
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -92,7 +92,16 @@
|
||||||
"name": "questions",
|
"name": "questions",
|
||||||
"label": "Questions",
|
"label": "Questions",
|
||||||
"type": "list",
|
"type": "list",
|
||||||
"widget": "verticalTabs",
|
"widgets": [
|
||||||
|
{
|
||||||
|
"name": "VerticalTabs",
|
||||||
|
"label": "Default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "QuestionSetTextualEditor",
|
||||||
|
"label": "Textual"
|
||||||
|
}
|
||||||
|
],
|
||||||
"min": 1,
|
"min": 1,
|
||||||
"entity": "question",
|
"entity": "question",
|
||||||
"field": {
|
"field": {
|
||||||
|
@ -101,11 +110,11 @@
|
||||||
"label": "Question type",
|
"label": "Question type",
|
||||||
"description": "Library for this question.",
|
"description": "Library for this question.",
|
||||||
"options": [
|
"options": [
|
||||||
"H5P.MultiChoice 1.1",
|
"H5P.MultiChoice 1.2",
|
||||||
"H5P.DragQuestion 1.1",
|
"H5P.DragQuestion 1.2",
|
||||||
"H5P.Blanks 1.1",
|
"H5P.Blanks 1.2",
|
||||||
"H5P.MarkTheWords 1.1",
|
"H5P.MarkTheWords 1.2",
|
||||||
"H5P.DragText 1.1"
|
"H5P.DragText 1.2"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue