diff --git a/mod/quiz/amd/build/add_question_modal_launcher.min.js b/mod/quiz/amd/build/add_question_modal_launcher.min.js new file mode 100644 index 00000000000..1a808a6bfe8 --- /dev/null +++ b/mod/quiz/amd/build/add_question_modal_launcher.min.js @@ -0,0 +1 @@ +define(["jquery","core/notification","core/modal_factory"],function(a,b,c){return{init:function(d,e,f,g){var h=a("body");return c.create({type:d,large:!0,preShowCallback:function(b,c){b=a(b),c.setContextId(f),c.setAddOnPageId(b.attr("data-addonpage")),c.setTitle(b.attr("data-header")),g&&g(b,c)}},[h,e]).fail(b.exception)}}}); \ No newline at end of file diff --git a/mod/quiz/amd/build/add_random_question.min.js b/mod/quiz/amd/build/add_random_question.min.js new file mode 100644 index 00000000000..49e921e1daf --- /dev/null +++ b/mod/quiz/amd/build/add_random_question.min.js @@ -0,0 +1 @@ +define(["mod_quiz/add_question_modal_launcher","mod_quiz/modal_add_random_question"],function(a,b){return{init:function(c,d,e,f){a.init(b.TYPE,'.menu [data-action="addarandomquestion"]',c,function(a,b){b.setCategory(d),b.setReturnUrl(e),b.setCMID(f)})}}}); \ No newline at end of file diff --git a/mod/quiz/amd/build/quizquestionbank.min.js b/mod/quiz/amd/build/quizquestionbank.min.js index 4c3bfcca53b..e36cf916df2 100644 --- a/mod/quiz/amd/build/quizquestionbank.min.js +++ b/mod/quiz/amd/build/quizquestionbank.min.js @@ -1 +1 @@ -define(["jquery","core/notification","core/custom_interaction_events","core/modal_factory","mod_quiz/modal_quiz_question_bank"],function(a,b,c,d,e){var f={ADD_QUESTION_LINKS:'.menu [data-action="questionbank"]'};return{init:function(g){var h=a("body");d.create({type:e.TYPE,large:!0},[h,f.ADD_QUESTION_LINKS]).then(function(b){return b.setContextId(g),h.on(c.events.activate,f.ADD_QUESTION_LINKS,function(c){var d=a(c.target).closest(f.ADD_QUESTION_LINKS);b.setAddOnPageId(d.attr("data-addonpage")),b.setTitle(d.attr("data-header"))}),b}).fail(b.exception)}}}); \ No newline at end of file +define(["mod_quiz/add_question_modal_launcher","mod_quiz/modal_quiz_question_bank"],function(a,b){return{init:function(c){a.init(b.TYPE,'.menu [data-action="questionbank"]',c)}}}); \ No newline at end of file diff --git a/mod/quiz/amd/src/add_question_modal_launcher.js b/mod/quiz/amd/src/add_question_modal_launcher.js new file mode 100644 index 00000000000..40c197c8d62 --- /dev/null +++ b/mod/quiz/amd/src/add_question_modal_launcher.js @@ -0,0 +1,78 @@ +// This file is part of Moodle - http://moodle.org/ +// +// Moodle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see . + +/** + * Initialise the an add question modal on the quiz page. + * + * @module mod_quiz/add_question_modal_launcher + * @package mod_quiz + * @copyright 2018 Ryan Wyllie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +define( + [ + 'jquery', + 'core/notification', + 'core/modal_factory', + ], + function( + $, + Notification, + ModalFactory + ) { + + return { + /** + * Create a modal using the modal factory and add listeners to launch the + * modal when clicked. + * + * @param {string} modalType Which modal to create + * @param {string} selector The selectors for the elements that trigger the modal + * @param {int} contextId The current context id + * @param {function} preShowCallback A callback to execute before the modal is shown + * @return {promise} Resolved with the modal + */ + init: function(modalType, selector, contextId, preShowCallback) { + var body = $('body'); + + // Create a question bank modal using the factory. + // The same modal will be used by all of the add question + // links that match "selector" on the page. The content + // of the modal will be changed depending on which link is + // clicked. + return ModalFactory.create( + { + type: modalType, + large: true, + // This callback executes before the modal is shown when the + // trigger element is clicked. + preShowCallback: function(triggerElement, modal) { + triggerElement = $(triggerElement); + modal.setContextId(contextId); + modal.setAddOnPageId(triggerElement.attr('data-addonpage')); + modal.setTitle(triggerElement.attr('data-header')); + + if (preShowCallback) { + preShowCallback(triggerElement, modal); + } + } + }, + // Created a deligated listener rather than a single + // trigger element. + [body, selector] + ).fail(Notification.exception); + } + }; +}); diff --git a/mod/quiz/amd/src/add_random_question.js b/mod/quiz/amd/src/add_random_question.js new file mode 100644 index 00000000000..9b40312677d --- /dev/null +++ b/mod/quiz/amd/src/add_random_question.js @@ -0,0 +1,57 @@ +// This file is part of Moodle - http://moodle.org/ +// +// Moodle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see . + +/** + * Initialise the add random question modal on the quiz page. + * + * @module mod_quiz/add_random_question + * @package mod_quiz + * @copyright 2018 Ryan Wyllie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +define( + [ + 'mod_quiz/add_question_modal_launcher', + 'mod_quiz/modal_add_random_question' + ], + function( + AddQuestionModalLauncher, + ModalAddRandomQuestion + ) { + + return { + /** + * Create the add random question modal. + * + * @param {int} contextId Current context id. + * @param {string} category Category id and category context id comma separated. + * @param {string} returnUrl URL to return to after form submission. + * @param {int} cmid Current course module id. + */ + init: function(contextId, category, returnUrl, cmid) { + AddQuestionModalLauncher.init( + ModalAddRandomQuestion.TYPE, + '.menu [data-action="addarandomquestion"]', + contextId, + // Additional values that should be set before the modal is shown. + function(triggerElement, modal) { + modal.setCategory(category); + modal.setReturnUrl(returnUrl); + modal.setCMID(cmid); + } + ); + } + }; +}); diff --git a/mod/quiz/amd/src/quizquestionbank.js b/mod/quiz/amd/src/quizquestionbank.js index 70014219406..e0f5716a5c4 100644 --- a/mod/quiz/amd/src/quizquestionbank.js +++ b/mod/quiz/amd/src/quizquestionbank.js @@ -23,55 +23,26 @@ */ define( [ - 'jquery', - 'core/notification', - 'core/custom_interaction_events', - 'core/modal_factory', + 'mod_quiz/add_question_modal_launcher', 'mod_quiz/modal_quiz_question_bank' ], function( - $, - Notification, - CustomEvents, - ModalFactory, + AddQuestionModalLauncher, ModalQuizQuestionBank ) { - var SELECTORS = { - ADD_QUESTION_LINKS: '.menu [data-action="questionbank"]', - }; - return { + /** + * Create the question bank modal. + * + * @param {int} contextId Current context id. + */ init: function(contextId) { - var body = $('body'); - - // Create a question bank modal using the factory. - // The same modal will be used by all of the add question - // links on the page. The content of the modal will be - // changed depending on which link is clicked. - ModalFactory.create( - { - type: ModalQuizQuestionBank.TYPE, - large: true - }, - // Created a deligated listener rather than a single - // trigger element. - [body, SELECTORS.ADD_QUESTION_LINKS] - ).then(function(modal) { - // Save the Moodle context id that the modal is being rendered in. - modal.setContextId(contextId); - - body.on(CustomEvents.events.activate, SELECTORS.ADD_QUESTION_LINKS, function(e) { - // We need to listen for activations on the trigger elements because there are - // several on the page and we need to know which one was activated in order to - // set some relevant data on the modal. - var triggerElement = $(e.target).closest(SELECTORS.ADD_QUESTION_LINKS); - modal.setAddOnPageId(triggerElement.attr('data-addonpage')); - modal.setTitle(triggerElement.attr('data-header')); - }); - - return modal; - }).fail(Notification.exception); + AddQuestionModalLauncher.init( + ModalQuizQuestionBank.TYPE, + '.menu [data-action="questionbank"]', + contextId + ); } }; }); diff --git a/mod/quiz/classes/output/edit_renderer.php b/mod/quiz/classes/output/edit_renderer.php index d3a33bff1d7..8d3a045ff05 100644 --- a/mod/quiz/classes/output/edit_renderer.php +++ b/mod/quiz/classes/output/edit_renderer.php @@ -98,17 +98,17 @@ class edit_renderer extends \plugin_renderer_base { // Include the contents of any other popups required. if ($structure->can_be_edited()) { - $popups = ''; - + $thiscontext = $contexts->lowest(); $this->page->requires->js_call_amd('mod_quiz/quizquestionbank', 'init', [ - $contexts->lowest()->id + $thiscontext->id ]); - $popups .= $this->random_question_form($pageurl, $contexts, $pagevars); - $this->page->requires->yui_module('moodle-mod_quiz-randomquestion', - 'M.mod_quiz.randomquestion.init'); - - $output .= html_writer::div($popups, 'mod_quiz_edit_forms'); + $this->page->requires->js_call_amd('mod_quiz/add_random_question', 'init', [ + $thiscontext->id, + $pagevars['cat'], + $pageurl->out_as_local_url(true), + $pageurl->param('cmid') + ]); // Include the question chooser. $output .= $this->question_chooser(); @@ -1059,29 +1059,6 @@ class edit_renderer extends \plugin_renderer_base { return html_writer::div($this->pix_icon('i/loading', get_string('loading')), 'questionbankloading'); } - /** - * Return random question form. - * @param \moodle_url $thispageurl the canonical URL of this page. - * @param \question_edit_contexts $contexts the relevant question bank contexts. - * @param array $pagevars the variables from {@link \question_edit_setup()}. - * @return string HTML to output. - */ - protected function random_question_form(\moodle_url $thispageurl, \question_edit_contexts $contexts, array $pagevars) { - - if (!$contexts->have_cap('moodle/question:useall')) { - return ''; - } - $randomform = new \quiz_add_random_form(new \moodle_url('/mod/quiz/addrandom.php'), - array('contexts' => $contexts, 'cat' => $pagevars['cat'])); - $randomform->set_data(array( - 'category' => $pagevars['cat'], - 'returnurl' => $thispageurl->out_as_local_url(true), - 'randomnumber' => 1, - 'cmid' => $thispageurl->param('cmid'), - )); - return html_writer::div($randomform->render(), 'randomquestionformforpopup'); - } - /** * Initialise the JavaScript for the general editing. (JavaScript for popups * is handled with the specific code for those.)