102e17462249b8501b84c81f7866a21792db0023
[moodle.git] / enrol / manual / amd / src / quickenrolment.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/>.
16 /**
17  * Quick enrolment AMD module.
18  *
19  * @module     enrol_manual/quickenrolment
20  * @copyright  2016 Damyon Wiese <damyon@moodle.com>
21  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
22  */
23 define(['core/templates',
24          'jquery',
25          'core/str',
26          'core/config',
27          'core/notification',
28          'core/modal_factory',
29          'core/modal_events',
30          'core/fragment',
31        ],
32        function(Template, $, Str, Config, Notification, ModalFactory, ModalEvents, Fragment) {
34     /** @type {Object} The list of selectors for the quick enrolment modal. */
35     var SELECTORS = {
36         COHORTSELECT: "#id_cohortlist",
37         TRIGGERBUTTONS: ".enrolusersbutton.enrol_manual_plugin [type='submit']",
38         UNWANTEDHIDDENFIELDS: ":input[value='_qf__force_multiselect_submission']"
39     };
41     /**
42      * Constructor
43      *
44      * @param {Object} options Object containing options. The only valid option at this time is contextid.
45      * Each call to templates.render gets it's own instance of this class.
46      */
47     var QuickEnrolment = function(options) {
48         this.contextid = options.contextid;
50         this.initModal();
51     };
52     // Class variables and functions.
54     /** @var {number} courseid - */
55     QuickEnrolment.prototype.courseid = 0;
57     /** @var {Modal} modal */
58     QuickEnrolment.prototype.modal = null;
60     /**
61      * Private method
62      *
63      * @method initModal
64      * @private
65      */
66     QuickEnrolment.prototype.initModal = function() {
67         var triggerButtons = $(SELECTORS.TRIGGERBUTTONS);
69         var stringsPromise = Str.get_strings([
70             {key: 'enroluserscohorts', component: 'enrol_manual'},
71             {key: 'enrolusers', component: 'enrol_manual'},
72         ]);
74         var titlePromise = stringsPromise.then(function(strings) {
75             return strings[1];
76         });
78         return ModalFactory.create({
79             type: ModalFactory.types.SAVE_CANCEL,
80             large: true,
81             title: titlePromise,
82             body: this.getBody()
83         }, triggerButtons)
84         .then(function(modal) {
85             this.modal = modal;
87             // The save button text depends on whether or not cohorts exist.
88             var stringindex = 1;
89             if (this.modal.getRoot().find('form').find(SELECTORS.COHORTSELECT).length !== 0) {
90                 stringindex = 0;
91             }
93             var buttonPromise = stringsPromise.then(function(strings) {
94                 return strings[stringindex];
95             });
97             this.modal.setSaveButtonText(buttonPromise);
99             // We want the reset the form every time it is opened.
100             this.modal.getRoot().on(ModalEvents.hidden, function() {
101                 this.modal.setBody(this.getBody());
102             }.bind(this));
104             this.modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));
105             this.modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));
107             return modal;
108         }.bind(this))
109         .fail(Notification.exception);
110     };
112     /**
113      * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.
114      *
115      * @method submitForm
116      * @param {Event} e Form submission event.
117      * @private
118      */
119     QuickEnrolment.prototype.submitForm = function(e) {
120         e.preventDefault();
121         this.modal.getRoot().find('form').submit();
122     };
124     /**
125      * Private method
126      *
127      * @method submitForm
128      * @private
129      * @param {Event} e Form submission event.
130      */
131     QuickEnrolment.prototype.submitFormAjax = function(e) {
132         // We don't want to do a real form submission.
133         e.preventDefault();
135         var form = this.modal.getRoot().find('form');
137         // Before send the data through AJAX, we need to parse and remove some unwanted hidden fields.
138         // This hidden fields are added automatically by mforms and when it reaches the AJAX we get an error.
139         var hidden = form.find(SELECTORS.UNWANTEDHIDDENFIELDS);
140         hidden.each(function () {
141             this.remove();
142         });
144         var formData = form.serialize();
146         this.modal.hide();
148         var settings = {
149             type: 'GET',
150             processData: false,
151             contentType: "application/json"
152         };
154         var script = Config.wwwroot + '/enrol/manual/ajax.php?' + formData;
155         $.ajax(script, settings)
156             .then(function(response) {
158                 if (response.error) {
159                     Notification.addNotification({
160                         message: response.error,
161                         type: "error"
162                     });
163                 } else {
164                     // Reload the page, don't show changed data warnings.
165                     if (typeof window.M.core_formchangechecker !== "undefined") {
166                         window.M.core_formchangechecker.reset_form_dirty_state();
167                     }
168                     window.location.reload();
169                 }
170                 return;
171             })
172             .fail(Notification.exception);
173     };
175     /**
176      * Private method
177      *
178      * @method getBody
179      * @private
180      * @return {Promise}
181      */
182     QuickEnrolment.prototype.getBody = function() {
183         return Fragment.loadFragment('enrol_manual', 'enrol_users_form', this.contextid, {}).fail(Notification.exception);
184     };
186     /**
187      * Private method
188      *
189      * @method getFooter
190      * @private
191      * @return {Promise}
192      */
193     QuickEnrolment.prototype.getFooter = function() {
194         return Template.render('enrol_manual/enrol_modal_footer', {});
195     };
197     return /** @alias module:enrol_manual/quickenrolment */ {
198         // Public variables and functions.
199         /**
200          * Every call to init creates a new instance of the class with it's own event listeners etc.
201          *
202          * @method init
203          * @public
204          * @param {object} config - config variables for the module.
205          */
206         init: function(config) {
207             (new QuickEnrolment(config));
208         }
209     };
210 });