MDL-53451 competency: Removing sneaky whitespaces
[moodle.git] / admin / tool / lp / amd / src / actionselector.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  * Action selector.
18  *
19  * To handle 'save' events use: actionselector.on('save')
20  * This will receive the information to display in popup.
21  * The actions have the format [{'text': sometext, 'value' : somevalue}].
22  *
23  * @package    tool_lp
24  * @copyright  2016 Serge Gauthier - <serge.gauthier.2@umontreal.ca>
25  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26  */
28 define(['jquery',
29         'core/notification',
30         'core/ajax',
31         'core/templates',
32         'tool_lp/dialogue',
33         'tool_lp/event_base'],
34         function($, Notification, Ajax, Templates, Dialogue, EventBase) {
36     /**
37      * Action selector class.
38      * @param {String} title The title of popup.
39      * @param {String} message The message to display.
40      * @param {object} actions The actions that can be selected.
41      * @param {String} confirm Text for confirm button.
42      * @param {String} cancel Text for cancel button.
43      */
44     var ActionSelector = function(title, message, actions, confirm, cancel) {
45         var self = this;
47         EventBase.prototype.constructor.apply(this, []);
48         self._title = title;
49         self._message = message;
50         self._actions = actions;
51         self._confirm = confirm;
52         self._cancel = cancel;
53         self._selectedValue = null;
54         self._reset();
55     };
57     ActionSelector.prototype = Object.create(EventBase.prototype);
59     /** @type {String} The value that was selected. */
60     ActionSelector.prototype._selectedValue = null;
61     /** @type {Dialogue} The reference to the dialogue. */
62     ActionSelector.prototype._popup = null;
63     /** @type {String} The title of popup. */
64     ActionSelector.prototype._title = null;
65     /** @type {String} The message in popup. */
66     ActionSelector.prototype._message = null;
67     /** @type {object} The information for radion buttons. */
68     ActionSelector.prototype._actions = null;
69     /** @type {String} The text for confirm button. */
70     ActionSelector.prototype._confirm = null;
71     /** @type {String} The text for cancel button. */
72     ActionSelector.prototype._cancel = null;
74     /**
75      * Hook to executed after the view is rendered.
76      *
77      * @method _afterRender
78      */
79     ActionSelector.prototype._afterRender = function() {
80         var self = this;
82         // Confirm button is disabled until a choice is done.
83         self._find('[data-action="action-selector-confirm"]').attr('disabled', 'disabled');
85         // Add listener for radio buttons change.
86         self._find('[data-region="action-selector-radio-buttons"]').change(function() {
87             self._selectedValue = $("input[type='radio']:checked").val();
88             self._find('[data-action="action-selector-confirm"]').removeAttr('disabled');
89             self._refresh.bind(self);
90         }.bind(self));
92         // Add listener for cancel.
93         self._find('[data-action="action-selector-cancel"]').click(function(e) {
94             e.preventDefault();
95             self.close();
96         }.bind(self));
98         // Add listener for confirm.
99         self._find('[data-action="action-selector-confirm"]').click(function(e) {
100             e.preventDefault();
101             if (!self._selectedValue.length) {
102                 return;
103             }
104             self._trigger('save', { action: self._selectedValue });
105             self.close();
106         }.bind(self));
107     };
109     /**
110      * Close the dialogue.
111      *
112      * @method close
113      */
114     ActionSelector.prototype.close = function() {
115         var self = this;
116         self._popup.close();
117         self._reset();
118     };
120     /**
121      * Opens the action selector.
122      *
123      * @method display
124      * @return {Promise}
125      */
126     ActionSelector.prototype.display = function() {
127         var self = this;
128         return self._render().then(function(html) {
129             self._popup = new Dialogue(
130                 self._title,
131                 html,
132                 self._afterRender.bind(self)
133             );
134         }.bind(self)).fail(Notification.exception);
135     };
137     /**
138      * Find a node in the dialogue.
139      *
140      * @param {String} selector
141      * @method _find
142      */
143     ActionSelector.prototype._find = function(selector) {
144         return $(this._popup.getContent()).find(selector);
145     };
147     /**
148      * Refresh the view.
149      *
150      * @method _refresh
151      * @return {Promise}
152      */
153     ActionSelector.prototype._refresh = function() {
154         var self = this;
155         return self._render().then(function(html) {
156             self._find('[data-region="action-selector"]').replaceWith(html);
157             self._afterRender();
158         }.bind(self));
159     };
161     /**
162      * Render the dialogue.
163      *
164      * @method _render
165      * @return {Promise}
166      */
167     ActionSelector.prototype._render = function() {
168         var self = this;
169         var choices = [];
170         for (var i in self._actions) {
171             choices.push(self._actions[i]);
172         }
173         var content = {'message': self._message, 'choices' : choices,
174             'confirm' : self._confirm, 'cancel' : self._cancel};
176         return Templates.render('tool_lp/action_selector', content);
177     };
179     /**
180      * Reset the dialogue properties.
181      *
182      * This does not reset everything, just enough to reset the UI.
183      *
184      * @method _reset
185      */
186     ActionSelector.prototype._reset = function() {
187         this._popup = null;
188         this._selectedValue = '';
189     };
191     return /** @alias module:tool_lp/actionselector */ ActionSelector;
193 });