diff --git a/css/questionset.css b/css/questionset.css index a6959fa..5e9cd9b 100644 --- a/css/questionset.css +++ b/css/questionset.css @@ -55,6 +55,11 @@ .progress-dot.current { background: #285585; } +.progress-dot:focus { + outline-color: rgb(40, 130, 211); + outline-width: thin; + outline-style: solid; +} .intro-page .title { font-size: 2em; @@ -104,7 +109,7 @@ float: none; } -.questionset-results a.h5p-button.qs-retrybutton:before { +.questionset-results button.h5p-button.qs-retrybutton:before { font-family: 'H5PFontAwesome4'; padding-right: 0.5em; content: "\f01e"; @@ -128,8 +133,7 @@ .h5p-question .h5p-question-prev, .h5p-question .h5p-question-next { - padding: 0; - height: 2.1875em; + padding: 0.5em 0; width: 2.1875em; } @@ -164,7 +168,7 @@ content: "\f00c"; } -.questionset-results a.h5p-button.qs-solutionbutton:before { +.questionset-results button.h5p-button.qs-solutionbutton:before { font-family: 'H5PFontAwesome4'; content: "\f06e "; /* TODO: Use margin not whitespace, spacing is not content! */ } @@ -174,6 +178,7 @@ } .video-container > video { background-color: #000; + width: 100%; } .video-container > .h5p-button { position: absolute; @@ -190,22 +195,44 @@ text-align: center; background: rgba(255, 255, 255, 0.9); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#E6FFFFFF,endColorstr=#E6FFFFFF); - padding: 0.625em; } .questionset-results .feedback-section { - margin: 1em; + margin: 0.75em; +} + +.questionset-results .greeting { + margin-top: 1em; + color: #777; + font-size: 1.25em; } .questionset-results .feedback-section .feedback-text { - font-weight: bold; - color: #1a73d9; + font-weight: normal; + color: #777; } .questionset-results .buttons { margin-bottom: 1.5em; } +.questionset-results .result-header, +.questionset-results .result-text { + color: #1a73d9; + font-weight: bold; +} + +.questionset-results .result-header { + font-size: 2em; + margin-top: 1em; +} + +.questionset-results .result-text { + font-size: 1.25em; + line-height: 1.25em; + margin: 1em 1em 2.25em; +} + /* No margin for questions when no frame */ .h5p-no-frame .questionset .h5p-question > * { margin-left: 0; diff --git a/js/questionset.js b/js/questionset.js index c34a4a8..f8d60dd 100644 --- a/js/questionset.js +++ b/js/questionset.js @@ -40,7 +40,7 @@ H5P.QuestionSet = function (options, contentId) { ' <% if (progressType == "dots") { %>' + '
' + ' <% for (var i=0; i' + - ' ' + + ' ' + ' <%} %>' + '
' + ' <% } else if (progressType == "textual") { %>' + @@ -52,14 +52,21 @@ H5P.QuestionSet = function (options, contentId) { var resulttemplate = '
' + + '
<%= message %>
' + '
' + ' ' + ' ' + '
' + + ' <% if (comment) { %>' + + '
<%= comment %>
' + + ' <% } %>' + + ' <% if (resulttext) { %>' + + '
<%= resulttext %>
' + + ' <% } %>' + '
' + - ' <%= finishButtonText %>' + - ' <%= solutionButtonText %>' + - ' ' + + ' ' + + ' ' + + ' ' + '
' + '
'; @@ -76,30 +83,28 @@ H5P.QuestionSet = function (options, contentId) { startButtonText: 'Start' }, texts: { - prevButton: 'Previous', - nextButton: 'Next', + prevButton: 'Previous question', + nextButton: 'Next question', finishButton: 'Finish', - textualProgress: 'Question: @current of @total questions' + textualProgress: 'Question: @current of @total questions', + jumpToQuestion: 'Jump to question %d', + questionLabel: 'Question' }, endGame: { showResultPage: true, + noResultMessage: 'Finished', message: 'Your result:', successGreeting: 'Congratulations!', successComment: 'You have enough correct answers to pass the test.', failGreeting: 'Sorry!', failComment: "You don't have enough correct answers to pass this test.", - scoreString: 'You got @score points of @total possible.', + scoreString: 'You got @score of @total points', finishButtonText: 'Finish', solutionButtonText: 'Show solution', retryButtonText: 'Retry', - showAnimations: false - }, - override: { - overrideButtons: false, - overrideShowSolutionButton: false, - overrideRetry: false - }, - questionLabel: 'Question' + showAnimations: false, + skipButtonText: 'Skip video' + } }; var template = new EJS({text: texttemplate}); @@ -113,19 +118,39 @@ H5P.QuestionSet = function (options, contentId) { var up; renderSolutions = false; + var $template = $(template.render(params)); + // Set overrides for questions + var override; + if (params.override.showSolutionButton || params.override.retryButton) { + override = {}; + if (params.override.showSolutionButton) { + // Force "Show solution" button to be on or off for all interactions + override.enableSolutionsButton = + (params.override.showSolutionButton === 'on' ? true : false); + } + + if (params.override.retryButton) { + // Force "Retry" button to be on or off for all interactions + override.enableRetry = + (params.override.retryButton === 'on' ? true : false); + } + } + // Instantiate question instances for (var i = 0; i < params.questions.length; i++) { var question = params.questions[i]; - // TODO: Render on init, inject in template. - // override content parameters. - if (params.override.overrideButtons) { + question.jumpAriaLabel = params.texts.jumpToQuestion.replace('%d', i + 1); + if (override) { // Extend subcontent with the overrided settings. - $.extend(question.params.behaviour, { - enableRetry: params.override.overrideRetry, - enableSolutionsButton: params.override.overrideShowSolutionButton - }); + $.extend(question.params.behaviour, override); } + + question.params = question.params || {}; + question.params.overrideSettings = question.params.overrideSettings || {}; + question.params.overrideSettings.$confirmationDialogParent = $template.last(); + question.params.overrideSettings.instance = this; + var questionInstance = H5P.newRunnable(question, contentId, undefined, undefined, {parent: self}); questionInstance.on('resize', function () { up = true; @@ -242,6 +267,9 @@ H5P.QuestionSet = function (options, contentId) { // Hide finish button questionInstances[questionInstances.length - 1].hideButton('finish'); + // Mark all tasks as unanswered: + $('.progress-dot').removeClass('answered').addClass('unanswered'); + //Force the last page to be reRendered rendered = false; }; @@ -252,6 +280,17 @@ H5P.QuestionSet = function (options, contentId) { rendered = false; }; + var moveQuestion = function (direction) { + _stopQuestion(currentQuestion); + if (currentQuestion + direction >= questionInstances.length) { + _displayEndGame(); + + } + else { + _showQuestion(currentQuestion + direction); + } + }; + var _displayEndGame = function () { if (rendered) { $myDom.children().hide().filter('.questionset-results').show(); @@ -271,44 +310,78 @@ H5P.QuestionSet = function (options, contentId) { score: scoreString, passed: success }; + + /** + * Makes our buttons behave like other buttons. + * + * @private + * @param {string} classSelector + * @param {function} handler + */ + var hookUpButton = function (classSelector, handler) { + $(classSelector, $myDom).click(handler).keypress(function (e) { + if (e.which === 32) { + handler(); + e.preventDefault(); + } + }); + }; + var displayResults = function () { self.triggerXAPICompleted(self.getScore(), self.totalScore(), success); - if (!params.endGame.showResultPage) { - self.trigger('h5pQuestionSetFinished', eventData); - return; - } - var eparams = { - comment: (success ? params.endGame.successGreeting : params.endGame.failGreeting), + message: params.endGame.showResultPage ? params.endGame.message : params.endGame.noResultMessage, + comment: params.endGame.showResultPage ? (success ? params.endGame.successGreeting : params.endGame.failGreeting) : undefined, + resulttext: params.endGame.showResultPage ? (success ? params.endGame.successComment : params.endGame.failComment) : undefined, finishButtonText: params.endGame.finishButtonText, - solutionButtonText: params.endGame.solutionButtonText + solutionButtonText: params.endGame.solutionButtonText, + retryButtonText: params.endGame.retryButtonText }; // Show result page. $myDom.children().hide(); $myDom.append(endTemplate.render(eparams)); - $('.qs-finishbutton', $myDom).click(function () { - self.trigger('h5pQuestionSetFinished', eventData); - }); - $('.qs-solutionbutton', $myDom).click(function () { - showSolutions(); - $myDom.children().hide().filter('.questionset').show(); - _showQuestion(params.initialQuestion); - }); - $('.qs-retrybutton', $myDom) - .html(params.endGame.retryButtonText) - .click(function () { - resetTask(); - $myDom.children().hide().filter('.questionset').show(); - _showQuestion(params.initialQuestion);}); - if (scoreBar === undefined) { - scoreBar = H5P.JoubelUI.createScoreBar(totals); + if (params.endGame.showResultPage) { + // Add event handlers to summary buttons + hookUpButton('.qs-finishbutton', function () { + self.trigger('h5pQuestionSetFinished', eventData); + }); + hookUpButton('.qs-solutionbutton', function () { + showSolutions(); + $myDom.children().hide().filter('.questionset').show(); + _showQuestion(params.initialQuestion); + }); + hookUpButton('.qs-retrybutton', function () { + resetTask(); + $myDom.children().hide(); + + var $intro = $('.intro-page', $myDom); + if ($intro.length) { + // Show intro + $('.intro-page', $myDom).show(); + } + else { + // Show first question + $('.questionset', $myDom).show(); + _showQuestion(params.initialQuestion); + } + }); + + if (scoreBar === undefined) { + scoreBar = H5P.JoubelUI.createScoreBar(totals); + } + scoreBar.appendTo($('.feedback-scorebar', $myDom)); + scoreBar.setScore(finals); + $('.feedback-text', $myDom).html(scoreString); } - scoreBar.appendTo($('.feedback-scorebar', $myDom)); - scoreBar.setScore(finals); - $('.feedback-text', $myDom).html(scoreString); + else { + // Remove buttons and feedback section + $('.qs-finishbutton, .qs-solutionbutton, .qs-retrybutton, .feedback-section', $myDom).remove(); + } + + self.trigger('resize'); }; if (params.endGame.showAnimations) { @@ -365,7 +438,8 @@ H5P.QuestionSet = function (options, contentId) { } // Render own DOM into target. - $myDom.html(template.render(params)); + $myDom.children().remove(); + $myDom.append($template); if (params.backgroundImage !== undefined) { $myDom.css({ overflow: 'hidden', @@ -377,13 +451,15 @@ H5P.QuestionSet = function (options, contentId) { if (params.introPage.backgroundImage !== undefined) { var $intro = $myDom.find('.intro-page'); if ($intro.length) { + var bgImg = params.introPage.backgroundImage; + var bgImgRatio = (bgImg.height / bgImg.width); $intro.css({ - background: '#fff url("' + H5P.getPath(params.introPage.backgroundImage.path, contentId) + '") no-repeat 50% 50%', - backgroundSize: '100% auto' + background: '#fff url("' + H5P.getPath(bgImg.path, contentId) + '") no-repeat 50% 50%', + backgroundSize: 'auto 100%', + minHeight: bgImgRatio * +window.getComputedStyle($intro[0]).width.replace('px','') }); } } - var registerImageLoadedListener = function (question) { H5P.on(question, 'imageLoaded', function () { self.trigger('resize'); @@ -399,32 +475,27 @@ H5P.QuestionSet = function (options, contentId) { // Listen for image resize registerImageLoadedListener(question); - // Disable feedback for question - question.setBehaviour({disableFeedback: true}); - // Add next/finish button if (questionInstances[questionInstances.length -1] === question) { // Add finish question set button - question.addButton('finish', params.texts.finishButton, function () { - _stopQuestion(currentQuestion); - _displayEndGame(); - }, false); + question.addButton('finish', params.texts.finishButton, + moveQuestion.bind(this, 1), false); } else { // Add next question button - question.addButton('next', '', function () { - _stopQuestion(currentQuestion); - _showQuestion(currentQuestion + 1); + question.addButton('next', '', moveQuestion.bind(this, 1), true, { + href: '#', // Use href since this is a navigation button + 'aria-label': params.texts.nextButton }); } // Add previous question button if (questionInstances[0] !== question) { - question.addButton('prev', '', function () { - _stopQuestion(currentQuestion); - _showQuestion(currentQuestion - 1); + question.addButton('prev', '', moveQuestion.bind(this, -1), true, { + href: '#', // Use href since this is a navigation button + 'aria-label': params.texts.prevButton }); } @@ -433,7 +504,9 @@ H5P.QuestionSet = function (options, contentId) { if (shortVerb === 'interacted' || shortVerb === 'answered' || shortVerb === 'attempted') { - $('.progress-dot:eq(' + currentQuestion +')', $myDom).removeClass('unanswered').addClass('answered'); + if (questionInstances[currentQuestion].getAnswerGiven()) { + $('.progress-dot:eq(' + currentQuestion +')', $myDom).removeClass('unanswered').addClass('answered'); + } _updateButtons(); } if (shortVerb === 'completed') { @@ -441,13 +514,10 @@ H5P.QuestionSet = function (options, contentId) { event.setVerb('answered'); } if (event.data.statement.context.extensions === undefined) { - event.data.statement.context.extensions = []; + 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'); - } } // Allow other libraries to add transitions after the questions have been inited @@ -455,19 +525,19 @@ H5P.QuestionSet = function (options, contentId) { $('.qs-startbutton', $myDom).click(function () { $(this).parents('.intro-page').hide(); - $('.questionset', $myDom).removeClass('hidden'); - _showQuestion(currentQuestion); + $('.questionset', $myDom).show(); + _showQuestion(params.initialQuestion); }); // Set event listeners. $('.progress-dot', $myDom).click(function () { _stopQuestion(currentQuestion); _showQuestion($(this).index()); + return false; }); // Hide all but initial Question. _showQuestion(params.initialQuestion); - _updateButtons(); if (renderSolutions) { showSolutions(); @@ -529,7 +599,7 @@ H5P.QuestionSet = function (options, contentId) { } // Determine label - var label = (params.questionLabel + ' ' + (i + 1)); + var label = (params.texts.questionLabel + ' ' + (i + 1)); if (qParams.contentName !== undefined) { label += ': ' + qParams.contentName; } diff --git a/language/ar.json b/language/ar.json index 55032b7..5217dad 100644 --- a/language/ar.json +++ b/language/ar.json @@ -74,6 +74,15 @@ { "label": "نص التقدم", "description": "النص المستخدم إذا تم تحديد التقدم نصيا" + }, + { + "label": "Label for jumping to a certain question", + "description": "You must use the placeholder '%d' instead of the question number.", + "default": "Jump to question %d" + }, + { + "label": "Copyright dialog question label", + "default": "Question" } ] }, @@ -83,6 +92,11 @@ { "label": "عرض النتائج" }, + { + "label": "No results message", + "description": "Text displayed on end page when \"Display results\" is disabled", + "default": "Finished" + }, { "label": "نص راس الملاحظات", "description": "سيتم عرض هذا العنوان في نهاية هذه المسابقة حيثما أجاب المستخدم على جميع الأسئلة المستعملة" @@ -139,25 +153,32 @@ }, { "label": "إعدادات زر \"مشاهدة حل \" وزر \"إعادة المحاولة\" ", - "description": "وهذه الخيارات تمكنك من تجاوز وقت العرض بزر \"مشاهدة حل \" وزر \"إعادة المحاولة \" في محتويات متكامل h5p.", "fields": [ { - "label": "تفعيل زر تجاوز \"مشاهدة حل \" و إعدادات \"إعادة \"المحاولة", - "description": "وإذا تم تفعيل هذه الأسئلة سيتم تجاهل الإعدادات الخاصة وسيتم استخدام الضبط أدناه بدلا من ذلك" + "label": "Override \"Show Solution\" button", + "description": "This option determines if the \"Show Solution\" button will be shown for all questions, disabled for all or configured for each question individually.", + "options": [ + { + "label": "Enabled" + }, + { + "label": "Disabled" + } + ] }, { - "label": "تفعيل زر \"إظهار الحل\"", - "description": "تفعيل هذا الخيار يجعل الأسئلة تظهر زر \"مشاهدة الحل\"" - }, - { - "label": "تفعيل زر \"إعادة المحاولة\"", - "description": "تفعيل هذا الخيار يجعل المستخدم قادرا على \"إعادة المحاولة\"" + "label": "Override \"Retry\" button", + "description": "This option determines if the \"Retry\" button will be shown for all questions, disabled for all or configured for each question individually.", + "options": [ + { + "label": "Enabled" + }, + { + "label": "Disabled" + } + ] } ] - }, - { - "label": "Question label text", - "default": "Question" } ] } diff --git a/language/de.json b/language/de.json index 428a353..82a29c6 100644 --- a/language/de.json +++ b/language/de.json @@ -79,6 +79,15 @@ "label": "Fortschrittstext", "description": "Verwendeter Text wenn Text Fortschrittsanzeige gewählt wurde.", "default": "Aktuelle Frage: @current von @total Fragen" + }, + { + "label": "Label for jumping to a certain question", + "description": "You must use the placeholder '%d' instead of the question number.", + "default": "Jump to question %d" + }, + { + "label": "Copyright dialog question label", + "default": "Question" } ] }, @@ -88,6 +97,11 @@ { "label": "Ergebnisanzeige" }, + { + "label": "No results message", + "description": "Text displayed on end page when \"Display results\" is disabled", + "default": "Finished" + }, { "label": "Kopfzeile Feedback", "default": "Dein Ergebnis:", @@ -154,19 +168,30 @@ }, { "label": "Einstellungen für \"Zeige die Lösung\" Button und \"Nochmal\".", - "description": "Diese Möglichkeiten überschreiben die Anzeige von \"Zeige die Lösung\" Button und \"Nochmal\" bei integrierten h5p Inhalten.", "fields": [ { - "label": "Aktiviert das Überschreiben für \"Zeige die Lösung\" Button und \"Wiederholen\" Einstellungen.", - "description": "Wenn dies ausgewählt wurde, werden die Einstellungen der Frage ignoriert und stattdessen werden die nachfolgenden Einstellungen verwendet." + "label": "Override \"Show Solution\" button", + "description": "This option determines if the \"Show Solution\" button will be shown for all questions, disabled for all or configured for each question individually.", + "options": [ + { + "label": "Enabled" + }, + { + "label": "Disabled" + } + ] }, { - "label": "Aktiviert \"Zeige die Lösung\" Buttons.", - "description": "Wenn dies ausgewählt wurde, werden die Fragen den \"Zeige die Lösung\" Button haben." - }, - { - "label": "Aktiviert \"Wiederholen\".", - "description": "Wenn diese Option gewählt wurde, ermöglicht es den Benutzern zu \"Wiederholen\" ." + "label": "Override \"Retry\" button", + "description": "This option determines if the \"Retry\" button will be shown for all questions, disabled for all or configured for each question individually.", + "options": [ + { + "label": "Enabled" + }, + { + "label": "Disabled" + } + ] } ] } diff --git a/language/fr.json b/language/fr.json index 27eb841..23f6fb9 100644 --- a/language/fr.json +++ b/language/fr.json @@ -74,6 +74,15 @@ { "label": "Texte de progression", "description": "Texte utilisé si la progression textuelle est utilisée." + }, + { + "label": "Label for jumping to a certain question", + "description": "You must use the placeholder '%d' instead of the question number.", + "default": "Jump to question %d" + }, + { + "label": "Copyright dialog question label", + "default": "Question" } ] }, @@ -83,6 +92,11 @@ { "label": "Montrer les résultats" }, + { + "label": "No results message", + "description": "Text displayed on end page when \"Display results\" is disabled", + "default": "Finished" + }, { "label": "Feedback de fin", "description": "Ce texte sera affiché quand l'utilisateur aura totalement terminé le quiz." @@ -139,25 +153,32 @@ }, { "label": "Options pour les boutons \"Montrer la solution\" et \"Réessayer\".", - "description": "Ces options vous permettent de choisir quand afficher les boutons \"Solutions\" et \"Réessayer\" dans votre acivité h5p..", "fields": [ { - "label": "Activer les réglages par défaut pour les boutons \"Solution\" et \"Réessayer\".", - "description": "Si cette option est choisie, les réglages seront valables pour toutes les questions, les réglages individuels ne seront pas pris en compte." + "label": "Override \"Show Solution\" button", + "description": "This option determines if the \"Show Solution\" button will be shown for all questions, disabled for all or configured for each question individually.", + "options": [ + { + "label": "Enabled" + }, + { + "label": "Disabled" + } + ] }, { - "label": "Afficher le bouton \"Solution\".", - "description": "Affiche le bouton \"Solution\"." - }, - { - "label": "Afficher le bouton \"Réessayer\".", - "description": "Affiche le bouton \"Réessayer\"." + "label": "Override \"Retry\" button", + "description": "This option determines if the \"Retry\" button will be shown for all questions, disabled for all or configured for each question individually.", + "options": [ + { + "label": "Enabled" + }, + { + "label": "Disabled" + } + ] } ] - }, - { - "label": "Texte de la question", - "default": "Question" } ] } diff --git a/language/it.json b/language/it.json index 6f52c6f..8af2417 100644 --- a/language/it.json +++ b/language/it.json @@ -74,6 +74,15 @@ { "label": "Testo Avanzamento", "description": "esto utilizzato se il testo Avanzamento è selezionato." + }, + { + "label": "Label for jumping to a certain question", + "description": "You must use the placeholder '%d' instead of the question number.", + "default": "Jump to question %d" + }, + { + "label": "Copyright dialog question label", + "default": "Question" } ] }, @@ -83,6 +92,11 @@ { "label": "Visualizza risultati" }, + { + "label": "No results message", + "description": "Text displayed on end page when \"Display results\" is disabled", + "default": "Finished" + }, { "label": "Intestazione Feedback", "description": "Questa intestazione verrà visualizzata alla fine del quiz, dopo che l'utente avrà risposto a tutte le domande." @@ -139,25 +153,32 @@ }, { "label": "Impostazioni per i pulsanti \"Mostra soluzione\" e \"Riprova\".", - "description": "Queste opzioni consentono di ignorare quando visualizzare i pulsanti \"Mostra soluzione\" e \"Riprova\" nel contenuto H5P integrato.", "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." + "label": "Override \"Show Solution\" button", + "description": "This option determines if the \"Show Solution\" button will be shown for all questions, disabled for all or configured for each question individually.", + "options": [ + { + "label": "Enabled" + }, + { + "label": "Disabled" + } + ] }, { - "label": "Abilita pulsanti \"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\"." + "label": "Override \"Retry\" button", + "description": "This option determines if the \"Retry\" button will be shown for all questions, disabled for all or configured for each question individually.", + "options": [ + { + "label": "Enabled" + }, + { + "label": "Disabled" + } + ] } ] - }, - { - "label": "Question label text", - "default": "Question" } ] } diff --git a/language/nb.json b/language/nb.json index 023a101..84783da 100644 --- a/language/nb.json +++ b/language/nb.json @@ -62,11 +62,11 @@ "fields": [ { "label": "Forrige-knappen", - "default": "Forrige" + "default": "Forrige spørsmål" }, { "label": "Neste-knappen", - "default": "Neste" + "default": "Neste spørsmål" }, { "label": "Avslutt-knappen", @@ -76,6 +76,15 @@ "label": "Fremdriftstekst", "description": "Tekst brukt hvis tekstlig angivelse av fremdrift er valgt. Variabler: @current og @total", "default": "Deloppgave @current av @total" + }, + { + "label": "Merkelapp ved hopping til spørsmål", + "description": "Du må bruke plassholderen '%d' istedenfor spørsmålsnummeret.", + "default": "Hopp til spørsmål %d" + }, + { + "label": "Opphavsrett spørsmål-etikett", + "default": "Spørsmål" } ] }, @@ -85,14 +94,19 @@ { "label": "Vis resultater" }, + { + "label": "Melding når resultater ikke vises", + "description": "Teksten vises på avslutnings-siden når resultater ikke vises", + "default": "Ferdig" + }, { "label": "Overskrift over tilbakemeldinger", - "default": "Ditt resultat:", + "default": "Resultat:", "description": "Denne overskriften vises over tilbakemeldingene på slutten av spørsmålssettet." }, { "label": "Poengvisningstekst", - "default": "Du fikk @score poeng av @total mulige.", + "default": "@score av @total poeng", "description": "Tekst som viser brukerens oppnådde poeng. \"@score\" blir erstattet med utregnet resultat, \"@total\" blir erstattet med høyest mulige resultat." }, { @@ -102,27 +116,27 @@ }, { "label": "Kommentar ved bestått", - "default": "Du presterte godt!", + "default": "Dette gikk bra.", "description": "Denne kommentaren vises dersom brukeren har bestått spørsmålssettet." }, { "label": "Tittel ved ikke bestått", - "default": "Ikke bestått", + "default": "Dette gikk ikke så bra!", "description": "Denne tittelen vises dersom brukeren ikke har bestått spørsmålssettet." }, { "label": "Kommentar ved ikke bestått", - "default": "Ikke bestått. Prøv igjen!", + "default": "Det er litt mange feil her. Prøv igjen!", "description": "Denne kommentaren vises dersom brukeren ikke har bestått spørsmålssettet." }, { "label": "Tekst til \"Fasit\" knapp", - "default": "Vis fasit", + "default": "Gå gjennom fasit", "description": "" }, { "label": "Tekst til \"Prøv igjen\" knapp", - "default": "Prøv igjen", + "default": "Prøv igjen!", "description": "" }, { @@ -150,26 +164,33 @@ ] }, { - "label": "Innstillinger for \"Vis svar\" knapp og \"Prøv igjen\".", - "description": "Disse instillingene lar deg overstyre når \"Vis svar\" knapp og \"Prøv igjen\" er slått på i integrert h5p innhold.", + "label": "Innstillinger for «Fasit»- og «Prøv igjen»-knapp", "fields": [ { - "label": "Slå på overstyring for \"Vis svar\" og \"Prøv igjen\".", - "description": "Aktivering vil overstyre de følgende innstillingene for integrert innhold." + "label": "Overstyr «Fasit»-knapp", + "description": "Dette valget avgjør om «Fasit»-knappen vil vises for alle spørsmål, skjules for alle eller konfigureres individuelt for hvert spørsmål.", + "options": [ + { + "label": "Aktivert" + }, + { + "label": "Deaktivert" + } + ] }, { - "label": "Slå på \"Vis svar\" knapp.", - "description": "Aktivering vil slå på \"Vis svar\" knappen." - }, - { - "label": "Slå på \"Prøv igjen\".", - "description": "Aktivering vil slå på \"Prøv igjen\" ." + "label": "Overstyr «Prøv igjen»-knapp", + "description": "Dette valget avgjør om «Prøv igjen»-knappen vil vises for alle spørsmål, skjules for alle eller konfigureres individuelt for hvert spørsmål.", + "options": [ + { + "label": "Aktivert" + }, + { + "label": "Deaktivert" + } + ] } ] - }, - { - "label": "Spørsmål-etikett", - "default": "Spørsmål" } ] } diff --git a/language/nn.json b/language/nn.json index 106be80..5e47a98 100644 --- a/language/nn.json +++ b/language/nn.json @@ -61,8 +61,8 @@ "label": "Ledetekster", "fields": [ { - "label": "Forrige-knappen", - "default": "Forrige" + "label": "Førre-knappen", + "default": "Førre" }, { "label": "Neste-knappen", @@ -75,7 +75,16 @@ { "label": "Fremdriftstekst", "description": "Tekst brukt hvis tekstlig angivelse av fremdrift er valgt. Variabler: @current og @total", - "default": "Deloppgave @current av @total" + "default": "Deloppgåve @current av @total" + }, + { + "label": "Merkelapp ved hopping til spørsmål", + "description": "Du må bruke plassholderen '%d' istedenfor spørsmålstalet.", + "default": "Hopp til spørsmål %d" + }, + { + "label": "Opphavsrett spørsmål-etikett", + "default": "Spørsmål" } ] }, @@ -85,14 +94,19 @@ { "label": "Vis resultat" }, + { + "label": "Melding når resultater ikke vises", + "description": "Teksten vises på avslutnings-siden når resultater ikke vises", + "default": "Ferdig" + }, { "label": "Overskrift over tilbakemeldingar", - "default": "Ditt resultat:", + "default": "Resultat:", "description": "Denne overskriften vises over tilbakemeldingane på slutten av spørsmålssettet." }, { "label": "Poengvisningstekst", - "default": "Du fikk @score poeng av @total mulige.", + "default": "@score av @total poeng", "description": "Tekst som viser brukerens oppnådde poeng. \"@score\" blir erstatta med utregna resultat, \"@total\" blir erstatta med høgest mulig resultat." }, { @@ -102,17 +116,17 @@ }, { "label": "Kommentar ved bestått", - "default": "Du presterte meget godt!", + "default": "Dette gjekk bra.", "description": "Denne kommentaren vises dersom brukaren har bestått spørsmålssettet." }, { "label": "Tittel ved ikkje bestått", - "default": "Ikkje bestått", + "default": "Dette gjekk ikkje så bra!", "description": "Denne tittelen visast dersom brukaren ikkje har bestått spørsmålssettet." }, { "label": "Kommentar ved ikkje bestått", - "default": "Dette er litt mange feil her. Prøv igjen!", + "default": "Det er litt mange feil her. Prøv igjen!", "description": "Denne kommentaren vises dersom brukaren ikkje har bestått spørsmålssettet." }, { @@ -150,26 +164,33 @@ ] }, { - "label": "Innstillinger for \"Vis svar\" knapp og \"Prøv igjen\".", - "description": "Disse instillingene lar deg overstyre når \"Vis svar\" knapp og \"Prøv igjen\" er slått på i integrert h5p innhald.", + "label": "Innstillinger for «Fasit»- og «Prøv igjen»-knapp", "fields": [ { - "label": "Slå på overstyring for \"Vis svar\" og \"Prøv igjen\".", - "description": "Aktivering vil overstyre dei følgjande innstillingene for integrert innhald." + "label": "Overstyr «Fasit»-knapp", + "description": "Dette valget avgjør om «Fasit»-knappen vil vises for alle spørsmål, skjules for alle eller konfigureres individuelt for hvert spørsmål.", + "options": [ + { + "label": "Aktivert" + }, + { + "label": "Deaktivert" + } + ] }, { - "label": "Slå på \"Vis svar\" knapp.", - "description": "Aktivering vil slå på \"Vis svar\" knappen." - }, - { - "label": "Slå på \"Prøv igjen\".", - "description": "Aktivering vil slå på \"Prøv igjen\" ." + "label": "Overstyr «Prøv igjen»-knapp", + "description": "Dette valget avgjør om «Prøv igjen»-knappen vil vises for alle spørsmål, skjules for alle eller konfigureres individuelt for hvert spørsmål.", + "options": [ + { + "label": "Aktivert" + }, + { + "label": "Deaktivert" + } + ] } ] - }, - { - "label": "Spørsmål-etikett", - "default": "Spørsmål" } ] } diff --git a/library.json b/library.json index f813828..f4e9632 100644 --- a/library.json +++ b/library.json @@ -3,8 +3,8 @@ "description": "Put together a set of different questions that has to be solved. (Quiz)", "contentType": "question", "majorVersion": 1, - "minorVersion": 7, - "patchVersion": 0, + "minorVersion": 8, + "patchVersion": 3, "embedTypes": [ "iframe" ], diff --git a/semantics.json b/semantics.json index de90e20..1ce4c57 100644 --- a/semantics.json +++ b/semantics.json @@ -110,11 +110,11 @@ "label": "Question type", "description": "Library for this question.", "options": [ - "H5P.MultiChoice 1.6", - "H5P.DragQuestion 1.5", - "H5P.Blanks 1.4", - "H5P.MarkTheWords 1.5", - "H5P.DragText 1.4" + "H5P.MultiChoice 1.7", + "H5P.DragQuestion 1.6", + "H5P.Blanks 1.6", + "H5P.MarkTheWords 1.6", + "H5P.DragText 1.5" ] } }, @@ -128,13 +128,13 @@ "name": "prevButton", "type": "text", "label": "Back button", - "default": "Previous" + "default": "Previous question" }, { "name": "nextButton", "type": "text", "label": "Next button", - "default": "Next" + "default": "Next question" }, { "name": "finishButton", @@ -152,6 +152,19 @@ "strong", "em" ] + }, + { + "name": "jumpToQuestion", + "type": "text", + "label": "Label for jumping to a certain question", + "description": "You must use the placeholder '%d' instead of the question number.", + "default": "Jump to question %d" + }, + { + "name": "questionLabel", + "type": "text", + "label": "Copyright dialog question label", + "default": "Question" } ] }, @@ -166,6 +179,14 @@ "label": "Display results", "default": true }, + { + "name": "noResultMessage", + "type": "text", + "label": "No results message", + "description": "Text displayed on end page when \"Display results\" is disabled", + "default": "Finished", + "optional": true + }, { "name": "message", "type": "text", @@ -183,7 +204,7 @@ "type": "text", "label": "Score display text", "description": "Text used to display Total user score. \"@score\" will be replaced by calculated score, \"@total\" will be replaced by maximum possible score. ", - "default": "You got @score points of @total possible.", + "default": "You got @score of @total points", "optional": true }, { @@ -300,37 +321,43 @@ { "name": "override", "type": "group", - "label": "Settings for \"Show solution\" button and \"Retry\".", - "description": "These options will let you override when to display \"Show solution\" button and \"Retry\" in integrated h5p content.", + "label": "Settings for \"Show solution\" and \"Retry\" buttons", "optional": true, "fields": [ { - "name": "overrideButtons", - "type": "boolean", - "label": "Enable override for \"Show solution\" and \"Retry\" settings.", - "description": "If this is enabled the questions own settings will be ignored and the below settings will be used instead.", - "default": false + "name": "showSolutionButton", + "type": "select", + "label": "Override \"Show Solution\" button", + "description": "This option determines if the \"Show Solution\" button will be shown for all questions, disabled for all or configured for each question individually.", + "optional": true, + "options": [ + { + "value": "on", + "label": "Enabled" + }, + { + "value": "off", + "label": "Disabled" + } + ] }, { - "name": "overrideShowSolutionButton", - "type": "boolean", - "label": "Enable \"Show solution\" buttons.", - "description": "Enabling this option will make questions show the \"Show solution\" button.", - "default": false - }, - { - "name": "overrideRetry", - "type": "boolean", - "label": "Enable \"Retry\".", - "description": "Enabling this option will make the user able to \"Retry\" .", - "default": false + "name": "retryButton", + "type": "select", + "label": "Override \"Retry\" button", + "description": "This option determines if the \"Retry\" button will be shown for all questions, disabled for all or configured for each question individually.", + "optional": true, + "options": [ + { + "value": "on", + "label": "Enabled" + }, + { + "value": "off", + "label": "Disabled" + } + ] } ] - }, - { - "name": "questionLabel", - "type": "text", - "label": "Question label text", - "default": "Question" } ] diff --git a/upgrades.js b/upgrades.js index 77c5add..dc41328 100644 --- a/upgrades.js +++ b/upgrades.js @@ -14,6 +14,44 @@ H5PUpgrades['H5P.QuestionSet'] = (function ($) { }); } } + finished(null, parameters); + }, + + /** + * Asynchronous content upgrade hook. + * Upgrades content parameters to support IV 1.7. + * + * Groups all UI text strings to make them eaiser to translate and handle. + * + * @params {Object} parameters + * @params {function} finished + */ + 8: function (parameters, finished) { + + if (parameters.override) { + if (parameters.override.overrideButtons) { + // Set new variables + parameters.override.showSolutionButton = + (parameters.override.overrideShowSolutionButton ? 'on' : 'off'); + parameters.override.retryButton = + (parameters.override.overrideRetry ? 'on' : 'off'); + } + + // Remove old field variables + delete parameters.override.overrideButtons; + delete parameters.override.overrideShowSolutionButton; + delete parameters.override.overrideRetry; + } + + // Move copyright dialog question label + if (parameters.questionLabel) { + parameters.texts = parameters.texts || {}; + parameters.texts.questionLabel = parameters.questionLabel; + } + + // Remove old copyright dialog question label + delete parameters.questionLabel; + finished(null, parameters); } }