diff --git a/css/questionset.css b/css/questionset.css index 325f94d..a6959fa 100644 --- a/css/questionset.css +++ b/css/questionset.css @@ -114,6 +114,12 @@ float: right; } +/* Need to disable max-height animation stuff, since this will + make resizing of iframe in Safari not work! */ +.questionset .h5p-question-buttons.h5p-question-visible { + transition: none; +} + .h5p-question .h5p-question-prev, .h5p-question .h5p-question-finish, .h5p-question .h5p-question-next { @@ -215,9 +221,3 @@ .h5p-no-frame .questionset .h5p-question > *:last-child { margin-bottom: 0; } - -/* Hide retry and show solution buttons */ -.questionset .h5p-question .h5p-question-try-again, -.questionset .h5p-question .h5p-question-show-solution { - display: none; -} diff --git a/js/questionset.js b/js/questionset.js index d2a5c2f..c34a4a8 100644 --- a/js/questionset.js +++ b/js/questionset.js @@ -110,6 +110,7 @@ H5P.QuestionSet = function (options, contentId) { var questionInstances = []; var $myDom; var scoreBar; + var up; renderSolutions = false; // Instantiate question instances @@ -126,11 +127,21 @@ H5P.QuestionSet = function (options, contentId) { }); } var questionInstance = H5P.newRunnable(question, contentId, undefined, undefined, {parent: self}); + questionInstance.on('resize', function () { + up = true; + self.trigger('resize'); + }); questionInstances.push(questionInstance); } // Resize all interactions on resize self.on('resize', function () { + if (up) { + // Prevent resizing the question again. + up = false; + return; + } + for (var i = 0; i < questionInstances.length; i++) { questionInstances[i].trigger('resize'); } @@ -143,11 +154,18 @@ H5P.QuestionSet = function (options, contentId) { answered = answered && (questionInstances[i]).getAnswerGiven(); } - if (currentQuestion === (params.questions.length - 1) && answered) { + if (currentQuestion === (params.questions.length - 1) && answered && + questionInstances[currentQuestion]) { questionInstances[currentQuestion].showButton('finish'); } }; + var _stopQuestion = function (questionNumber) { + if (questionInstances[questionNumber]) { + pauseMedia(questionInstances[questionNumber]); + } + }; + var _showQuestion = function (questionNumber) { // Sanitize input. if (questionNumber < 0) { @@ -157,13 +175,18 @@ H5P.QuestionSet = function (options, contentId) { questionNumber = params.questions.length - 1; } - // Hide all questions + currentQuestion = questionNumber; + + // Hide all questions $('.question-container', $myDom).hide().eq(questionNumber).show(); - // Trigger resize on question in case the size of the QS has changed. - var instance = questionInstances[questionNumber]; - if (instance.$ !== undefined) { - instance.trigger('resize'); + if (questionInstances[questionNumber]) { + // Trigger resize on question in case the size of the QS has changed. + var instance = questionInstances[questionNumber]; + instance.setActivityStarted(); + if (instance.$ !== undefined) { + instance.trigger('resize'); + } } // Update progress indicator @@ -178,7 +201,6 @@ H5P.QuestionSet = function (options, contentId) { } // Remember where we are - currentQuestion = questionNumber; _updateButtons(); self.trigger('resize'); return currentQuestion; @@ -250,7 +272,7 @@ H5P.QuestionSet = function (options, contentId) { passed: success }; var displayResults = function () { - self.triggerXAPICompleted(self.getScore(), self.totalScore()); + self.triggerXAPICompleted(self.getScore(), self.totalScore(), success); if (!params.endGame.showResultPage) { self.trigger('h5pQuestionSetFinished', eventData); @@ -332,7 +354,9 @@ H5P.QuestionSet = function (options, contentId) { // Function for attaching the multichoice to a DOM element. this.attach = function (target) { - this.setActivityStarted(); + if (this.isRoot()) { + this.setActivityStarted(); + } if (typeof(target) === "string") { $myDom = $('#' + target); } @@ -383,6 +407,7 @@ H5P.QuestionSet = function (options, contentId) { // Add finish question set button question.addButton('finish', params.texts.finishButton, function () { + _stopQuestion(currentQuestion); _displayEndGame(); }, false); @@ -390,6 +415,7 @@ H5P.QuestionSet = function (options, contentId) { // Add next question button question.addButton('next', '', function () { + _stopQuestion(currentQuestion); _showQuestion(currentQuestion + 1); }); } @@ -397,6 +423,7 @@ H5P.QuestionSet = function (options, contentId) { // Add previous question button if (questionInstances[0] !== question) { question.addButton('prev', '', function () { + _stopQuestion(currentQuestion); _showQuestion(currentQuestion - 1); }); } @@ -413,6 +440,10 @@ H5P.QuestionSet = function (options, contentId) { // An activity within this activity is not allowed to send completed events event.setVerb('answered'); } + if (event.data.statement.context.extensions === undefined) { + event.data.statement.context.extensions = []; + } + event.data.statement.context.extensions['http://id.tincanapi.com/extension/ending-point'] = currentQuestion + 1; }); if (question.getAnswerGiven()) { $('.progress-dot:eq(' + i +')', $myDom).removeClass('unanswered').addClass('answered'); @@ -430,6 +461,7 @@ H5P.QuestionSet = function (options, contentId) { // Set event listeners. $('.progress-dot', $myDom).click(function () { + _stopQuestion(currentQuestion); _showQuestion($(this).index()); }); @@ -535,6 +567,26 @@ H5P.QuestionSet = function (options, contentId) { this.showSolutions = function() { renderSolutions = true; }; + + /** + * Stop the given element's playback if any. + * + * @param {object} instance + */ + var pauseMedia = function (instance) { + try { + if (instance.pause !== undefined && + (instance.pause instanceof Function || + typeof instance.pause === 'function')) { + instance.pause(); + } + } + catch (err) { + // Prevent crashing, log error. + H5P.error(err); + } + }; }; + H5P.QuestionSet.prototype = Object.create(H5P.EventDispatcher.prototype); H5P.QuestionSet.prototype.constructor = H5P.QuestionSet; diff --git a/language/it.json b/language/it.json index 42f76ea..6f52c6f 100644 --- a/language/it.json +++ b/language/it.json @@ -8,11 +8,11 @@ }, { "label": "Titolo", - "description": "Questo titolo verr� visualizzato sopra il testo introduttivo." + "description": "Questo titolo verrà visualizzato sopra il testo introduttivo." }, { "label": "Testo introduttivo", - "description": "Questo testo verr� visualizzato prima dell'inizio del quiz." + "description": "Questo testo verrà visualizzato prima dell'inizio del quiz." }, { "label": "Testo pulsante Start" @@ -73,7 +73,7 @@ }, { "label": "Testo Avanzamento", - "description": "esto utilizzato se il testo Avanzamento � selezionato." + "description": "esto utilizzato se il testo Avanzamento è selezionato." } ] }, @@ -85,27 +85,27 @@ }, { "label": "Intestazione Feedback", - "description": "Questa intestazione verr� visualizzata alla fine del quiz, dopo che l'utente avr� risposto a tutte le domande." + "description": "Questa intestazione verrà visualizzata alla fine del quiz, dopo che l'utente avrà risposto a tutte le domande." }, { "label": "Testo visualizza punteggio", - "description": "Testo utilizzato per visualizzare il punteggio Totale dell'utente. \"@score\" verr� rimpiazzato dal punteggio calcolato, \"@total\" sar� rimpiazzato dal punteggio massimo possibile. " + "description": "Testo utilizzato per visualizzare il punteggio Totale dell'utente. \"@score\" verrà rimpiazzato dal punteggio calcolato, \"@total\" sarà rimpiazzato dal punteggio massimo possibile. " }, { "label": "Messaggio di superamento quiz", - "description": "Questo testo verr� visualizzato sopra il punteggio se l'utente ha superato con successo il quiz." + "description": "Questo testo verrà visualizzato sopra il punteggio se l'utente ha superato con successo il quiz." }, { "label": "Commento di superamento quiz", - "description": "Questo commento verr� visualizzato dopo il punteggio se l'utente ha superato con successo il quiz." + "description": "Questo commento verrà visualizzato dopo il punteggio se l'utente ha superato con successo il quiz." }, { "label": "Titolo quiz fallito", - "description": "Questo testo verr� visualizzato sopra il punteggio se l'utente non ha superato il quiz." + "description": "Questo testo verrà visualizzato sopra il punteggio se l'utente non ha superato il quiz." }, { "label": "Commento quiz fallito", - "description": "Questo commento verr� visualizzato dopo il punteggio se l'utente non ha superato il quiz." + "description": "Questo commento verrà visualizzato dopo il punteggio se l'utente non ha superato il quiz." }, { "label": "Etichetta pulsante Soluzione", @@ -129,11 +129,11 @@ }, { "label": "Video di superamento quiz", - "description": "Questo video verr� visualizzato sopra il punteggio se l'utente ha superato con successo il quiz." + "description": "Questo video verrà visualizzato sopra il punteggio se l'utente ha superato con successo il quiz." }, { "label": "Video quiz fallito", - "description": "Questo testo verr� visualizzato se l'utente non ha superato il quiz." + "description": "Questo testo verrà visualizzato se l'utente non ha superato il quiz." } ] }, @@ -143,15 +143,15 @@ "fields": [ { "label": "Abilita ignora impostazioni per \"Mostra soluzione\" e \"Riprova\".", - "description": "Se questa opzione � abilitata le proprie impostazioni per le domande saranno ignorate e verranno utilizzate le impostazioni seguenti." + "description": "Se questa opzione è abilitata le proprie impostazioni per le domande saranno ignorate e verranno utilizzate le impostazioni seguenti." }, { "label": "Abilita pulsanti \"Mostra soluzione\".", - "description": "L'attivazione di questa opzione far� in modo che le domande mostrino il tasto \"Mostra soluzione\"." + "description": "L'attivazione di questa opzione farà in modo che le domande mostrino il tasto \"Mostra soluzione\"." }, { "label": "Abilita \"Riprova\".", - "description": "L'attivazione di questa opzione far� in modo che per l'utente sia abilitata l'opzione \"Riprova\"." + "description": "L'attivazione di questa opzione farà in modo che per l'utente sia abilitata l'opzione \"Riprova\"." } ] }, diff --git a/library.json b/library.json index 15176cb..afe9c46 100644 --- a/library.json +++ b/library.json @@ -3,7 +3,7 @@ "description": "Put together a set of different questions that has to be solved. (Quiz)", "contentType": "question", "majorVersion": 1, - "minorVersion": 5, + "minorVersion": 6, "patchVersion": 0, "embedTypes": [ "iframe" diff --git a/semantics.json b/semantics.json index aa23981..cd20d2d 100644 --- a/semantics.json +++ b/semantics.json @@ -110,7 +110,7 @@ "label": "Question type", "description": "Library for this question.", "options": [ - "H5P.MultiChoice 1.4", + "H5P.MultiChoice 1.5", "H5P.DragQuestion 1.5", "H5P.Blanks 1.4", "H5P.MarkTheWords 1.4",