Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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/>.
15
 
16
/**
17
 * @copyright  2015 Martin Mastny <mastnym@vscht.cz>
18
 * @since      3.0
19
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
20
 */
21
 
22
 /**
23
  * @module core/permissionmanager
24
  */
25
define(['jquery', 'core/config', 'core/notification', 'core/templates', 'core/yui'],
26
    function($, config, notification, templates, Y) {
27
 
28
     /**
29
      * Used CSS selectors
30
      * @access private
31
      */
32
    var SELECTORS = {
33
        ADDROLE: 'a.allowlink, a.prohibitlink',
34
        REMOVEROLE: 'a.preventlink, a.unprohibitlink',
35
        UNPROHIBIT: 'a.unprohibitlink'
36
        };
37
    var rolesloadedevent = $.Event('rolesloaded');
38
    var contextid;
39
    var contextname;
40
    var adminurl;
41
    var overideableroles;
42
    var panel = null;
43
 
44
    /**
45
     * Load all possible roles, which could be assigned from server
46
     *
47
     * @access private
48
     * @method loadOverideableRoles
49
     */
50
    var loadOverideableRoles = function() {
51
        var params = {
52
            contextid: contextid,
53
            getroles: 1,
54
            sesskey: config.sesskey
55
        };
56
 
57
        // Need to tell jQuery to expect JSON as the content type may not be correct (MDL-55041).
58
        $.post(adminurl + 'roles/ajax.php', params, null, 'json')
59
            .done(function(data) {
60
              try {
61
                  overideableroles = data;
62
                  loadOverideableRoles = function() {
63
                      $('body').trigger(rolesloadedevent);
64
                  };
65
                  loadOverideableRoles();
66
              } catch (err) {
67
                  notification.exception(err);
68
              }
69
            })
70
            .fail(function(jqXHR, status, error) {
71
                notification.exception(error);
72
            });
73
    };
74
 
75
    /**
76
     * Perform the UI changes after server change
77
     *
78
     * @access private
79
     * @method changePermissions
80
     * @param {JQuery} row
81
     * @param {int} roleid
82
     * @param {string} action
83
     */
84
    var changePermissions = function(row, roleid, action) {
85
        var params = {
86
            contextid: contextid,
87
            roleid: roleid,
88
            sesskey: M.cfg.sesskey,
89
            action: action,
90
            capability: row.data('name')
91
        };
92
        $.post(adminurl + 'roles/ajax.php', params, null, 'json')
93
        .done(function(data) {
94
            var action = data;
95
            try {
96
                var templatedata = {rolename: overideableroles[roleid],
97
                                    roleid: roleid,
98
                                    adminurl: adminurl,
99
                                    imageurl: M.util.image_url('t/delete', 'moodle')
100
                                    };
101
                switch (action) {
102
                    case 'allow':
103
                        templatedata.spanclass = 'allowed';
104
                        templatedata.linkclass = 'preventlink';
105
                        templatedata.action = 'prevent';
106
                        templatedata.icon = 't/delete';
107
                        templatedata.iconalt = M.util.get_string('deletexrole', 'core_role', overideableroles[roleid]);
108
                        break;
109
                    case 'prohibit':
110
                        templatedata.spanclass = 'forbidden';
111
                        templatedata.linkclass = 'unprohibitlink';
112
                        templatedata.action = 'unprohibit';
113
                        templatedata.icon = 't/delete';
114
                        templatedata.iconalt = M.util.get_string('deletexrole', 'core_role', overideableroles[roleid]);
115
                        break;
116
                    case 'prevent':
117
                        row.find('a[data-role-id="' + roleid + '"]').first().closest('.allowed').remove();
118
                        return;
119
                    case 'unprohibit':
120
                        row.find('a[data-role-id="' + roleid + '"]').first().closest('.forbidden').remove();
121
                        return;
122
                    default:
123
                        return;
124
                }
125
                templates.render('core/permissionmanager_role', templatedata)
126
                .done(function(content) {
127
                    if (action == 'allow') {
128
                        $(content).insertBefore(row.find('.allowmore').first());
129
                    } else if (action == 'prohibit') {
130
                        $(content).insertBefore(row.find('.prohibitmore').first());
131
                        // Remove allowed link
132
                        var allowedLink = row.find('.allowedroles').first().find('a[data-role-id="' + roleid + '"]');
133
                        if (allowedLink) {
134
                            allowedLink.first().closest('.allowed').remove();
135
                        }
136
                    }
137
                    panel.hide();
138
                })
139
                .fail(notification.exception);
140
            } catch (err) {
141
                notification.exception(err);
142
            }
143
        })
144
        .fail(function(jqXHR, status, error) {
145
            notification.exception(error);
146
        });
147
    };
148
 
149
    /**
150
     * Prompts user for selecting a role which is permitted
151
     *
152
     * @access private
153
     * @method handleAddRole
154
     * @param {event} e
155
     */
156
    var handleAddRole = function(e) {
157
        e.preventDefault();
158
 
159
        var link = $(e.currentTarget);
160
 
161
        // TODO: MDL-57778 Convert to core/modal.
162
        $('body').one('rolesloaded', function() {
163
            Y.use('moodle-core-notification-dialogue', function() {
164
                var action = link.data('action');
165
                var row = link.closest('tr.rolecap');
166
                var confirmationDetails = {
167
                    cap: row.data('humanname'),
168
                    context: contextname
169
                };
170
                var message = M.util.get_string('role' + action + 'info', 'core_role', confirmationDetails);
171
                if (panel === null) {
172
                    panel = new M.core.dialogue({
173
                        draggable: true,
174
                        modal: true,
175
                        closeButton: true,
176
                        width: '450px'
177
                    });
178
                }
179
                panel.set('headerContent', M.util.get_string('role' + action + 'header', 'core_role'));
180
 
181
                var i, existingrolelinks;
182
 
183
                var roles = [];
184
                switch (action) {
185
                    case 'allow':
186
                        existingrolelinks = row.find(SELECTORS.REMOVEROLE);
187
                        break;
188
                    case 'prohibit':
189
                        existingrolelinks = row.find(SELECTORS.UNPROHIBIT);
190
                        break;
191
                }
192
                for (i in overideableroles) {
193
                    var disabled = '';
194
                    var disable = existingrolelinks.filter("[data-role-id='" + i + "']").length;
195
                    if (disable) {
196
                        disabled = 'disabled';
197
                    }
198
                    var roledetails = {roleid: i, rolename: overideableroles[i], disabled: disabled};
199
                    roles.push(roledetails);
200
                }
201
 
202
                templates.render('core/permissionmanager_panelcontent', {message: message, roles: roles})
203
                .done(function(content) {
204
                    panel.set('bodyContent', content);
205
                    panel.show();
206
                    $('div.role_buttons').on('click', 'button', function(e) {
207
                        var roleid = $(e.currentTarget).data('role-id');
208
                        changePermissions(row, roleid, action);
209
                    });
210
                })
211
                .fail(notification.exception);
212
 
213
            });
214
        });
215
        loadOverideableRoles();
216
    };
217
 
218
    /**
219
     * Prompts user when removing permission
220
     *
221
     * @access private
222
     * @method handleRemoveRole
223
     * @param {event} e
224
     */
225
    var handleRemoveRole = function(e) {
226
        e.preventDefault();
227
        var link = $(e.currentTarget);
228
        $('body').one('rolesloaded', function() {
229
            var action = link.data('action');
230
            var roleid = link.data('role-id');
231
            var row = link.closest('tr.rolecap');
232
            var questionDetails = {
233
                role: overideableroles[roleid],
234
                cap: row.data('humanname'),
235
                context: contextname
236
            };
237
 
238
            notification.confirm(M.util.get_string('confirmunassigntitle', 'core_role'),
239
                M.util.get_string('confirmrole' + action, 'core_role', questionDetails),
240
                M.util.get_string('confirmunassignyes', 'core_role'),
241
                M.util.get_string('confirmunassignno', 'core_role'),
242
                function() {
243
                   changePermissions(row, roleid, action);
244
                }
245
            );
246
         });
247
        loadOverideableRoles();
248
    };
249
 
250
    return /** @alias module:core/permissionmanager */ {
251
        /**
252
         * Initialize permissionmanager
253
         * @access public
254
         * @param {Object} args
255
         */
256
        initialize: function(args) {
257
            contextid = args.contextid;
258
            contextname = args.contextname;
259
            adminurl = args.adminurl;
260
            var body = $('body');
261
            body.on('click', SELECTORS.ADDROLE, handleAddRole);
262
            body.on('click', SELECTORS.REMOVEROLE, handleRemoveRole);
263
        }
264
    };
265
});