eedda356f4e2196151be279bfd11232b21170753
[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     /**
35      * Constructor
36      *
37      * @param {Object} options Object containing options. The only valid option at this time is contextid.
38      * Each call to templates.render gets it's own instance of this class.
39      */
40     var QuickEnrolment = function(options) {
41         this.contextid = options.contextid;
43         this.initModal();
44     };
45     // Class variables and functions.
47     /** @var {number} courseid - */
48     QuickEnrolment.prototype.courseid = 0;
50     /** @var {Modal} modal */
51     QuickEnrolment.prototype.modal = null;
53     /**
54      * Private method
55      *
56      * @method initModal
57      * @private
58      */
59     QuickEnrolment.prototype.initModal = function() {
60         var triggerButtons = $('.enrolusersbutton.enrol_manual_plugin [type="submit"]');
62         var strparams = [
63             {key: 'enroluserscohorts', component: 'enrol_manual'},
64             {key: 'enrolusers', component: 'enrol_manual'}
65         ];
67         $.when(Str.get_strings(strparams)).then(function(strlist) {
68             var modalSaveChanges = strlist[0],
69                 modalTitle = strlist[1];
71             return ModalFactory.create({
72                 type: ModalFactory.types.SAVE_CANCEL,
73                 title: modalTitle,
74                 body: this.getBody()
75             }, triggerButtons).then(function(modal) {
76                 this.modal = modal;
77                 this.modal.setLarge();
78                 this.modal.setSaveButtonText(modalSaveChanges);
80                 // We want the reset the form every time it is opened.
81                 this.modal.getRoot().on(ModalEvents.hidden, function() {
82                     this.modal.setBody(this.getBody());
83                 }.bind(this));
85                 this.modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));
86                 this.modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));
87             }.bind(this));
88         }.bind(this)).fail(Notification.exception);
89     };
91     /**
92      * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.
93      *
94      * @method submitForm
95      * @param {Event} e Form submission event.
96      * @private
97      */
98     QuickEnrolment.prototype.submitForm = function(e) {
99         e.preventDefault();
100         this.modal.getRoot().find('form').submit();
101     };
103     /**
104      * Private method
105      *
106      * @method submitForm
107      * @private
108      * @param {Event} e Form submission event.
109      */
110     QuickEnrolment.prototype.submitFormAjax = function(e) {
111         // We don't want to do a real form submission.
112         e.preventDefault();
114         var formData = this.modal.getRoot().find('form').serialize();
116         this.modal.hide();
118         var settings = {
119             type: 'GET',
120             processData: false,
121             contentType: "application/json"
122         };
124         var script = Config.wwwroot + '/enrol/manual/ajax.php?' + formData;
125         $.ajax(script, settings)
126             .then(function(response) {
128                 if (response.error) {
129                     Notification.addNotification({
130                         message: response.error,
131                         type: "error"
132                     });
133                 } else {
134                     // Reload the page, don't show changed data warnings.
135                     if (typeof window.M.core_formchangechecker !== "undefined") {
136                         window.M.core_formchangechecker.reset_form_dirty_state();
137                     }
138                     window.location.reload();
139                 }
140                 return;
141             })
142             .fail(Notification.exception);
143     };
145     /**
146      * Private method
147      *
148      * @method getBody
149      * @private
150      * @return {Promise}
151      */
152     QuickEnrolment.prototype.getBody = function() {
153         return Fragment.loadFragment('enrol_manual', 'enrol_users_form', this.contextid, {}).fail(Notification.exception);
154     };
156     /**
157      * Private method
158      *
159      * @method getFooter
160      * @private
161      * @return {Promise}
162      */
163     QuickEnrolment.prototype.getFooter = function() {
164         return Template.render('enrol_manual/enrol_modal_footer', {});
165     };
167     return /** @alias module:enrol_manual/quickenrolment */ {
168         // Public variables and functions.
169         /**
170          * Every call to init creates a new instance of the class with it's own event listeners etc.
171          *
172          * @method init
173          * @public
174          * @param {object} config - config variables for the module.
175          */
176         init: function(config) {
177             (new QuickEnrolment(config));
178         }
179     };
180 });