Merge branch 'wip-MDL-46819-master' of git://github.com/abgreeve/moodle
[moodle.git] / mod / quiz / yui / src / quizquestionbank / js / quizquestionbank.js
1 // This file is part of Moodle - http://moodle.org/
2 //
3 // Moodle is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // Moodle is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Add questions from question bank functionality for a popup in quiz editing page.
19  *
20  * @package   mod_quiz
21  * @copyright 2014 The Open University
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
26 var CSS = {
27         QBANKLOADING: 'div.questionbankloading',
28         ADDQUESTIONLINKS: 'ul.menu a.questionbank',
29         ADDTOQUIZCONTAINER: 'td.addtoquizaction'
30 };
32 var PARAMS = {
33     PAGE: 'addonpage',
34     HEADER: 'header'
35 };
37 var POPUP = function() {
38     POPUP.superclass.constructor.apply(this, arguments);
39 };
41 Y.extend(POPUP, Y.Base, {
42     loadingDiv: '',
43     dialogue: null,
44     addonpage: 0,
46     create_dialogue: function() {
47         // Create a dialogue on the page and hide it.
48         config = {
49             headerContent : '',
50             bodyContent : Y.one(CSS.QBANKLOADING),
51             draggable : true,
52             modal : true,
53             centered: true,
54             width: null,
55             visible: false,
56             postmethod: 'form',
57             footerContent: null,
58             extraClasses: ['mod_quiz_qbank_dialogue']
59         };
60         this.dialogue = new M.core.dialogue(config);
61         this.dialogue.bodyNode.delegate('click', this.link_clicked,
62                 '.paging a[href], thead tr a[href]', this);
63         this.dialogue.hide();
65         this.loadingDiv = this.dialogue.bodyNode.getHTML();
67         Y.later(100, this, function() {this.load_content(window.location.search);});
68     },
70     initializer : function() {
71         if (!Y.one(CSS.QBANKLOADING)) {
72             return;
73         }
74         this.create_dialogue();
75         Y.one('body').delegate('click', this.display_dialogue, CSS.ADDQUESTIONLINKS, this);
76     },
78     display_dialogue : function (e) {
79         e.preventDefault();
80         this.dialogue.set('headerContent', e.currentTarget.getData(PARAMS.HEADER));
82         this.addonpage = e.currentTarget.getData(PARAMS.PAGE);
83         var controlsDiv = this.dialogue.bodyNode.one('.modulespecificbuttonscontainer');
84         if (controlsDiv) {
85             var hidden = controlsDiv.one('input[name=addonpage]');
86             if (!hidden) {
87                 hidden = controlsDiv.appendChild('<input type="hidden" name="addonpage">');
88             }
89             hidden.set('value', this.addonpage);
90         }
92         this.dialogue.show();
93     },
95     load_content : function(queryString) {
96         Y.log('Starting load.', 'debug', 'moodle-mod_quiz-quizquestionbank');
97         this.dialogue.bodyNode.append(this.loadingDiv);
99         // If to support old IE.
100         if (window.history.replaceState) {
101             window.history.replaceState(null, '', M.cfg.wwwroot + '/mod/quiz/edit.php' + queryString);
102         }
104         Y.io(M.cfg.wwwroot + '/mod/quiz/questionbank.ajax.php' + queryString, {
105             method: 'GET',
106             on: {
107                 success: this.load_done,
108                 failure: this.load_failed
109             },
110             context: this
111         });
113         Y.log('Load request sent.', 'debug', 'moodle-mod_quiz-quizquestionbank');
114     },
116     load_done: function(transactionid, response) {
117         var result = JSON.parse(response.responseText);
118         if (!result.status || result.status !== 'OK') {
119             // Because IIS is useless, Moodle can't send proper HTTP response
120             // codes, so we have to detect failures manually.
121             this.load_failed(transactionid, response);
122             return;
123         }
125         Y.log('Load completed.', 'debug', 'moodle-mod_quiz-quizquestionbank');
127         this.dialogue.bodyNode.setHTML(result.contents);
128         Y.use('moodle-question-chooser', function() {M.question.init_chooser({});});
129         this.dialogue.bodyNode.one('form').delegate('change', this.options_changed, '.searchoptions', this);
131         if (this.dialogue.visible) {
132             Y.later(0, this.dialogue, this.dialogue.centerDialogue);
133         }
134         M.question.qbankmanager.init();
136         if (Y.one('#advancedsearch')) {
137             M.util.init_collapsible_region(Y, "advancedsearch", "question_bank_advanced_search",
138                     M.util.get_string('clicktohideshow'));
139         }
141         this.dialogue.fire('widget:contentUpdate');
142         // TODO MDL-47602 really, the base class should listen for the even fired
143         // on the previous line, and fix things like makeResponsive.
144         // However, it does not. So the next two lines are a hack to fix up
145         // display issues (e.g. overall scrollbars on the page). Once the base class
146         // is fixed, this comment and the following four lines should be deleted.
147         if (this.dialogue.get('visible')) {
148             this.dialogue.hide();
149             this.dialogue.show();
150         }
151     },
153     load_failed: function() {
154         Y.log('Load failed.', 'debug', 'moodle-mod_quiz-quizquestionbank');
155     },
157     link_clicked: function(e) {
158         if (e.currentTarget.ancestor(CSS.ADDTOQUIZCONTAINER)) {
159             // These links need to work like normal, after we modify the URL.
160             e.currentTarget.set('href', e.currentTarget.get('href') + '&addonpage=' + this.addonpage);
161             return;
162         }
163         e.preventDefault();
164         this.load_content(e.currentTarget.get('search'));
165     },
167     options_changed: function(e) {
168         e.preventDefault();
169         this.load_content('?' + Y.IO.stringify(e.currentTarget.get('form')));
170     }
171 });
173 M.mod_quiz = M.mod_quiz || {};
174 M.mod_quiz.quizquestionbank = M.mod_quiz.quizquestionbank || {};
175 M.mod_quiz.quizquestionbank.init = function() {
176     return new POPUP();
177 };