Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
YUI.add('moodle-enrol-otherusersmanager', function(Y) {
2
 
3
    var OUMANAGERNAME = 'Other users manager',
4
        OTHERUSERNAME = 'Other user (not enroled in course)',
5
        COURSEID = 'courseId',
6
        USERID = 'userId',
7
        BASE = 'base',
8
        SEARCH = 'search',
9
        REQUIREREFRESH = 'requiresRefresh',
10
        PAGE = 'page',
11
        USERCOUNT = 'userCount',
12
        PICTURE = 'picture',
13
        FULLNAME = 'fullname',
14
        EXTRAFIELDS = 'extrafields',
15
        ASSIGNABLEROLES = 'assignableRoles',
16
        USERS = 'users',
17
        URL = 'url',
18
        AJAXURL = 'ajaxUrl';
19
 
20
    CSS = {
21
        PANEL : 'other-user-manager-panel',
22
        WRAP : 'oump-wrap',
23
        HEADER : 'oump-header',
24
        CONTENT : 'oump-content',
25
        AJAXCONTENT : 'oump-ajax-content',
26
        SEARCHRESULTS : 'oump-search-results',
27
        TOTALUSERS : 'oump-total-users',
28
        USERS : 'oump-users',
29
        USER : 'oump-user',
30
        USERDETAILS : 'oump-user-details',
31
        MORERESULTS : 'oump-more-results',
32
        LIGHTBOX : 'oump-loading-lightbox',
33
        LOADINGICON : 'loading-icon',
34
        FOOTER : 'oump-footer',
35
        COUNT : 'count',
36
        PICTURE : 'oump-user-picture',
37
        DETAILS : 'oump-user-specifics',
38
        FULLNAME : 'oump-user-fullname',
39
        EXTRAFIELDS : 'oump-user-extrafields',
40
        OPTIONS : 'oump-role-options',
41
        ROLEOPTION : 'oump-assignable-role',
42
        ODD  : 'odd',
43
        EVEN : 'even',
44
        HIDDEN : 'hidden',
45
        SEARCH : 'oump-search',
46
        CLOSE : 'oump-panel-close',
47
        ALLROLESASSIGNED : 'oump-has-all-roles'
48
    };
49
 
50
    var OUMANAGER = function(config) {
51
        OUMANAGER.superclass.constructor.apply(this, arguments);
52
    };
53
    Y.extend(OUMANAGER, Y.Base, {
54
        _loadingNode : null,
55
        _escCloseEvent : null,
56
        initializer : function(config) {
57
            this.set(BASE, Y.Node.create('<div class="'+CSS.PANEL+' '+CSS.HIDDEN+'"></div>')
58
                .append(Y.Node.create('<div class="'+CSS.WRAP+'"></div>')
59
                    .append(Y.Node.create('<div class="'+CSS.HEADER+' header"></div>')
60
                        .append(Y.Node.create('<div class="'+CSS.CLOSE+'"></div>'))
61
                        .append(Y.Node.create('<h2>'+M.util.get_string('usersearch', 'enrol')+'</h2>')))
62
                    .append(Y.Node.create('<div class="'+CSS.CONTENT+'"></div>')
63
                        .append(Y.Node.create('<div class="'+CSS.AJAXCONTENT+'"></div>'))
64
                        .append(Y.Node.create('<div class="'+CSS.LIGHTBOX+' '+CSS.HIDDEN+'"></div>')
65
                            .append(Y.Node.create('<img alt="loading" class="'+CSS.LOADINGICON+'" />')
66
                                .setAttribute('src', M.util.image_url('i/loading', 'moodle')))
67
                            .setStyle('opacity', 0.5)))
68
                    .append(Y.Node.create('<div class="'+CSS.FOOTER+'"></div>')
69
                        .append(Y.Node.create('<div class="'+CSS.SEARCH+'"><label>'+M.util.get_string('usersearch', 'enrol')+'</label></div>')
70
                            .append(Y.Node.create('<input type="text" id="oump-usersearch" value="" />'))
71
                        )
72
                    )
73
                )
74
            );
75
            this.set(SEARCH, this.get(BASE).one('#oump-usersearch'));
76
            Y.all('.assignuserrole input').each(function(node){
77
                if (node.getAttribute('type', 'submit')) {
78
                    node.on('click', this.show, this);
79
                }
80
            }, this);
81
            this.get(BASE).one('.'+CSS.HEADER+' .'+CSS.CLOSE).on('click', this.hide, this);
82
            this._loadingNode = this.get(BASE).one('.'+CSS.CONTENT+' .'+CSS.LIGHTBOX);
83
            Y.on('key', this.getUsers, this.get(SEARCH), 'down:13', this);
84
            Y.one(document.body).append(this.get(BASE));
85
 
86
            var base = this.get(BASE);
87
            base.plug(Y.Plugin.Drag);
88
            base.dd.addHandle('.'+CSS.HEADER+' h2');
89
            base.one('.'+CSS.HEADER+' h2').setStyle('cursor', 'move');
90
 
91
            this.getAssignableRoles();
92
        },
93
        show : function(e) {
94
            e.preventDefault();
95
            e.halt();
96
 
97
            var base = this.get(BASE);
98
            base.removeClass(CSS.HIDDEN);
99
            var x = (base.get('winWidth') - 400)/2;
100
            var y = (parseInt(base.get('winHeight'))-base.get('offsetHeight'))/2 + parseInt(base.get('docScrollY'));
101
            if (y < parseInt(base.get('winHeight'))*0.1) {
102
                y = parseInt(base.get('winHeight'))*0.1;
103
            }
104
            base.setXY([x,y]);
105
 
106
            if (this.get(USERS)===null) {
107
                this.getUsers(e, false);
108
            }
109
 
110
            this._escCloseEvent = Y.on('key', this.hide, document.body, 'down:27', this);
111
        },
112
        hide : function() {
113
            if (this._escCloseEvent) {
114
                this._escCloseEvent.detach();
115
                this._escCloseEvent = null;
116
            }
117
            this.get(BASE).addClass(CSS.HIDDEN);
118
            if (this.get(REQUIREREFRESH)) {
119
                window.location = this.get(URL);
120
            }
121
        },
122
        getUsers : function(e, append) {
123
            if (e) {
124
                e.halt();
125
                e.preventDefault();
126
            }
127
            var on, params;
128
            if (append) {
129
                this.set(PAGE, this.get(PAGE)+1);
130
            } else {
131
                this.set(USERCOUNT, 0);
132
            }
133
 
134
            params = [];
135
            params['id'] = this.get(COURSEID);
136
            params['sesskey'] = M.cfg.sesskey;
137
            params['action'] = 'searchotherusers';
138
            params['search'] = this.get(SEARCH).get('value');
139
            params['page'] = this.get(PAGE);
140
 
141
            Y.io(M.cfg.wwwroot+this.get(AJAXURL), {
142
                method:'POST',
143
                data:build_querystring(params),
144
                on : {
145
                    start : this.displayLoading,
146
                    complete: this.processSearchResults,
147
                    end : this.removeLoading
148
                },
149
                context:this,
150
                arguments:{
151
                    append:append,
152
                    params:params
153
                }
154
            });
155
        },
156
        displayLoading : function() {
157
            this._loadingNode.removeClass(CSS.HIDDEN);
158
        },
159
        removeLoading : function() {
160
            this._loadingNode.addClass(CSS.HIDDEN);
161
        },
162
        processSearchResults : function(tid, outcome, args) {
163
            var result;
164
            try {
165
                result = Y.JSON.parse(outcome.responseText);
166
                if (result.error) {
167
                    return new M.core.ajaxException(result);
168
                }
169
            } catch (e) {
170
                new M.core.exception(e);
171
            }
172
            if (!result.success) {
173
                this.setContent = M.util.get_string('errajaxsearch', 'enrol');
174
            }
175
            var usersnode, users = [], i=0, count=0, user;
176
            if (!args.append) {
177
                usersnode = Y.Node.create('<div class="'+CSS.USERS+'"></div>');
178
            } else {
179
                usersnode = this.get(BASE).one('.'+CSS.SEARCHRESULTS+' .'+CSS.USERS);
180
            }
181
            count = this.get(USERCOUNT);
182
            for (i in result.response.users) {
183
                count++;
184
                user = new OTHERUSER(result.response.users[i], count, this);
185
                usersnode.append(user.toHTML());
186
                users[user.get(USERID)] = user;
187
            }
188
            this.set(USERCOUNT, count);
189
            if (!args.append) {
190
                var usersstr = '';
191
                if (this.get(USERCOUNT) === 1) {
192
                    usersstr = M.util.get_string('ajaxoneuserfound', 'enrol');
193
                } else if (result.response.moreusers) {
194
                    usersstr = M.util.get_string('ajaxxmoreusersfound', 'enrol', this.get(USERCOUNT));
195
                } else {
196
                    usersstr = M.util.get_string('ajaxxusersfound', 'enrol', this.get(USERCOUNT));
197
                }
198
 
199
                var content = Y.Node.create('<div class="'+CSS.SEARCHRESULTS+'"></div>')
200
                    .append(Y.Node.create('<div class="'+CSS.TOTALUSERS+'">'+usersstr+'</div>'))
201
                    .append(usersnode);
202
                if (result.response.moreusers) {
203
                    var fetchmore = Y.Node.create('<div class="'+CSS.MORERESULTS+'"><a href="#">'+M.util.get_string('ajaxnext25', 'enrol')+'</a></div>');
204
                    fetchmore.on('click', this.getUsers, this, true);
205
                    content.append(fetchmore)
206
                }
207
                this.setContent(content);
208
            } else {
209
                if (!result.response.moreusers) {
210
                    this.get(BASE).one('.'+CSS.MORERESULTS).remove();
211
                }
212
            }
213
        },
214
        setContent : function(content) {
215
            this.get(BASE).one('.'+CSS.CONTENT+' .'+CSS.AJAXCONTENT).setContent(content);
216
        },
217
        getAssignableRoles : function() {
218
            Y.io(M.cfg.wwwroot+'/enrol/ajax.php', {
219
                method:'POST',
220
                data:'id='+this.get(COURSEID)+'&action=getassignable&otherusers=true&sesskey='+M.cfg.sesskey,
221
                on: {
222
                    complete: function(tid, outcome, args) {
223
                        try {
224
                            var roles = Y.JSON.parse(outcome.responseText);
225
                            if (roles.error) {
226
                                new M.core.ajaxException(roles);
227
                            } else {
228
                                this.set(ASSIGNABLEROLES, roles.response);
229
                            }
230
                        } catch (e) {
231
                            new M.core.exception(e);
232
                        }
233
                        this.getAssignableRoles = function() {
234
                            this.fire('assignablerolesloaded');
235
                        };
236
                        this.getAssignableRoles();
237
                    }
238
                },
239
                context:this
240
            });
241
        }
242
    }, {
243
        NAME : OUMANAGERNAME,
244
        ATTRS : {
245
            courseId : {
246
 
247
            },
248
            ajaxUrl : {
249
                validator : Y.Lang.isString
250
            },
251
            url : {
252
                validator : Y.Lang.isString
253
            },
254
            roles : {
255
                validator :Y.Lang.isArray,
256
                value : []
257
            },
258
            base : {
259
                setter : function(node) {
260
                    var n = Y.one(node);
261
                    if (!n) {
262
                        Y.fail(OUMANAGERNAME+': invalid base node set');
263
                    }
264
                    return n;
265
                }
266
            },
267
            search : {
268
                setter : function(node) {
269
                    var n = Y.one(node);
270
                    if (!n) {
271
                        Y.fail(OUMANAGERNAME+': invalid base node set');
272
                    }
273
                    return n;
274
                }
275
            },
276
            requiresRefresh : {
277
                validator : Y.Lang.isBoolean,
278
                value : false
279
            },
280
            users : {
281
                validator : Y.Lang.isArray,
282
                value : null
283
            },
284
            page : {
285
                validator : Y.Lang.isNumber,
286
                value : 0
287
            },
288
            userCount : {
289
                validator : Y.Lang.isNumber,
290
                value : 0
291
            },
292
            assignableRoles : {
293
                value : []
294
            }
295
        }
296
    });
297
 
298
    var OTHERUSER = function(config, count, manager) {
299
        this._count = count;
300
        this._manager = manager;
301
        OTHERUSER.superclass.constructor.apply(this, arguments);
302
    };
303
    Y.extend(OTHERUSER, Y.Base, {
304
        _count : 0,
305
        _manager : null,
306
        _node : null,
307
        _assignmentInProgress : false,
308
        initializer : function(config) {
309
            this.publish('assignrole:success');
310
            this.publish('assignrole:failure');
311
        },
312
        toHTML : function() {
313
            this._node = Y.Node.create('<div class="'+CSS.USER+' clearfix" rel="'+this.get(USERID)+'"></div>')
314
                .addClass((this._count%2)?CSS.ODD:CSS.EVEN)
315
                .append(Y.Node.create('<div class="'+CSS.COUNT+'">'+this._count+'</div>'))
316
                .append(Y.Node.create('<div class="'+CSS.USERDETAILS+'"></div>')
317
                    .append(Y.Node.create('<div class="'+CSS.PICTURE+'"></div>')
318
                        .append(Y.Node.create(this.get(PICTURE)))
319
                    )
320
                    .append(Y.Node.create('<div class="'+CSS.DETAILS+'"></div>')
321
                        .append(Y.Node.create('<div class="'+CSS.FULLNAME+'">'+this.get(FULLNAME)+'</div>'))
322
                        .append(Y.Node.create('<div class="'+CSS.EXTRAFIELDS+'">'+this.get(EXTRAFIELDS)+'</div>'))
323
                    )
324
                    .append(Y.Node.create('<div class="'+CSS.OPTIONS+'"><span class="label">'+M.util.get_string('assignrole', 'role')+': </span></div>'))
325
                );
326
            var roles = this._manager.get(ASSIGNABLEROLES);
327
            for (var i in roles) {
328
                var role = Y.Node.create('<a href="#" class="' + CSS.ROLEOPTION + '">' + roles[i].name + '</a>');
329
                role.on('click', this.assignRoleToUser, this, roles[i].id, role);
330
                this._node.one('.'+CSS.OPTIONS).append(role);
331
            }
332
            return this._node;
333
        },
334
        assignRoleToUser : function(e, roleid, node) {
335
            e.halt();
336
            if (this._assignmentInProgress) {
337
                return true;
338
            }
339
            this._node.addClass('assignment-in-progress');
340
            this._assignmentInProgress = true;
341
            Y.io(M.cfg.wwwroot+'/enrol/ajax.php', {
342
                method:'POST',
343
                data:'id='+this._manager.get(COURSEID)+'&action=assign&sesskey='+M.cfg.sesskey+'&roleid='+roleid+'&user='+this.get(USERID),
344
                on: {
345
                    complete: function(tid, outcome, args) {
346
                        try {
347
                            var o = Y.JSON.parse(outcome.responseText);
348
                            if (o.success) {
349
                                var options = args.node.ancestor('.'+CSS.OPTIONS);
350
                                if (options.all('.'+CSS.ROLEOPTION).size() == 1) {
351
                                    // This is the last node so remove the options div
352
                                    if (options.ancestor('.'+CSS.USER)) {
353
                                        options.ancestor('.'+CSS.USER).addClass(CSS.ALLROLESASSIGNED);
354
                                    }
355
                                    options.remove();
356
                                } else {
357
                                    // There are still more assignable roles
358
                                    args.node.remove();
359
                                }
360
                                this._manager.set(REQUIREREFRESH, true);
361
                            }
362
                        } catch (e) {
363
                            new M.core.exception(e);
364
                        }
365
                        this._assignmentInProgress = false;
366
                        this._node.removeClass('assignment-in-progress');
367
                    }
368
                },
369
                context:this,
370
                arguments:{
371
                    roleid : roleid,
372
                    node : node
373
                }
374
            });
375
            return true;
376
        }
377
    }, {
378
        NAME : OTHERUSERNAME,
379
        ATTRS : {
380
            userId : {
381
 
382
            },
383
            fullname : {
384
                validator : Y.Lang.isString
385
            },
386
            extrafields : {
387
                validator : Y.Lang.isString
388
            },
389
            picture : {
390
                validator : Y.Lang.isString
391
            }
392
        }
393
    });
394
    Y.augment(OTHERUSER, Y.EventTarget);
395
 
396
    M.enrol = M.enrol || {};
397
    M.enrol.otherusersmanager = {
398
        init : function(cfg) {
399
            new OUMANAGER(cfg);
400
        }
401
    }
402
 
403
}, '@VERSION@', {requires:['base','node', 'overlay', 'io-base', 'test', 'json-parse', 'event-delegate', 'dd-plugin', 'event-key', 'moodle-core-notification']});