[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
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 try { 164 var result = Y.JSON.parse(outcome.responseText); 165 if (result.error) { 166 return new M.core.ajaxException(result); 167 } 168 } catch (e) { 169 new M.core.exception(e); 170 } 171 if (!result.success) { 172 this.setContent = M.util.get_string('errajaxsearch', 'enrol'); 173 } 174 var usersnode, users = [], i=0, count=0, user; 175 if (!args.append) { 176 usersnode = Y.Node.create('<div class="'+CSS.USERS+'"></div>'); 177 } else { 178 usersnode = this.get(BASE).one('.'+CSS.SEARCHRESULTS+' .'+CSS.USERS); 179 } 180 count = this.get(USERCOUNT); 181 for (i in result.response.users) { 182 count++; 183 user = new OTHERUSER(result.response.users[i], count, this); 184 usersnode.append(user.toHTML()); 185 users[user.get(USERID)] = user; 186 } 187 this.set(USERCOUNT, count); 188 if (!args.append) { 189 var usersstr = (result.response.totalusers == '1')?M.util.get_string('ajaxoneuserfound', 'enrol'):M.util.get_string('ajaxxusersfound','enrol', result.response.totalusers); 190 var content = Y.Node.create('<div class="'+CSS.SEARCHRESULTS+'"></div>') 191 .append(Y.Node.create('<div class="'+CSS.TOTALUSERS+'">'+usersstr+'</div>')) 192 .append(usersnode); 193 if (result.response.totalusers > (this.get(PAGE)+1)*25) { 194 var fetchmore = Y.Node.create('<div class="'+CSS.MORERESULTS+'"><a href="#">'+M.util.get_string('ajaxnext25', 'enrol')+'</a></div>'); 195 fetchmore.on('click', this.getUsers, this, true); 196 content.append(fetchmore) 197 } 198 this.setContent(content); 199 } else { 200 if (result.response.totalusers <= (this.get(PAGE)+1)*25) { 201 this.get(BASE).one('.'+CSS.MORERESULTS).remove(); 202 } 203 } 204 }, 205 setContent : function(content) { 206 this.get(BASE).one('.'+CSS.CONTENT+' .'+CSS.AJAXCONTENT).setContent(content); 207 }, 208 getAssignableRoles : function() { 209 Y.io(M.cfg.wwwroot+'/enrol/ajax.php', { 210 method:'POST', 211 data:'id='+this.get(COURSEID)+'&action=getassignable&otherusers=true&sesskey='+M.cfg.sesskey, 212 on: { 213 complete: function(tid, outcome, args) { 214 try { 215 var roles = Y.JSON.parse(outcome.responseText); 216 if (roles.error) { 217 new M.core.ajaxException(roles); 218 } else { 219 this.set(ASSIGNABLEROLES, roles.response); 220 } 221 } catch (e) { 222 new M.core.exception(e); 223 } 224 this.getAssignableRoles = function() { 225 this.fire('assignablerolesloaded'); 226 }; 227 this.getAssignableRoles(); 228 } 229 }, 230 context:this 231 }); 232 } 233 }, { 234 NAME : OUMANAGERNAME, 235 ATTRS : { 236 courseId : { 237 238 }, 239 ajaxUrl : { 240 validator : Y.Lang.isString 241 }, 242 url : { 243 validator : Y.Lang.isString 244 }, 245 roles : { 246 validator :Y.Lang.isArray, 247 value : [] 248 }, 249 base : { 250 setter : function(node) { 251 var n = Y.one(node); 252 if (!n) { 253 Y.fail(OUMANAGERNAME+': invalid base node set'); 254 } 255 return n; 256 } 257 }, 258 search : { 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 requiresRefresh : { 268 validator : Y.Lang.isBoolean, 269 value : false 270 }, 271 users : { 272 validator : Y.Lang.isArray, 273 value : null 274 }, 275 page : { 276 validator : Y.Lang.isNumber, 277 value : 0 278 }, 279 userCount : { 280 validator : Y.Lang.isNumber, 281 value : 0 282 }, 283 assignableRoles : { 284 value : [] 285 } 286 } 287 }); 288 289 var OTHERUSER = function(config, count, manager) { 290 this._count = count; 291 this._manager = manager; 292 OTHERUSER.superclass.constructor.apply(this, arguments); 293 }; 294 Y.extend(OTHERUSER, Y.Base, { 295 _count : 0, 296 _manager : null, 297 _node : null, 298 _assignmentInProgress : false, 299 initializer : function(config) { 300 this.publish('assignrole:success'); 301 this.publish('assignrole:failure'); 302 }, 303 toHTML : function() { 304 this._node = Y.Node.create('<div class="'+CSS.USER+' clearfix" rel="'+this.get(USERID)+'"></div>') 305 .addClass((this._count%2)?CSS.ODD:CSS.EVEN) 306 .append(Y.Node.create('<div class="'+CSS.COUNT+'">'+this._count+'</div>')) 307 .append(Y.Node.create('<div class="'+CSS.USERDETAILS+'"></div>') 308 .append(Y.Node.create('<div class="'+CSS.PICTURE+'"></div>') 309 .append(Y.Node.create(this.get(PICTURE))) 310 ) 311 .append(Y.Node.create('<div class="'+CSS.DETAILS+'"></div>') 312 .append(Y.Node.create('<div class="'+CSS.FULLNAME+'">'+this.get(FULLNAME)+'</div>')) 313 .append(Y.Node.create('<div class="'+CSS.EXTRAFIELDS+'">'+this.get(EXTRAFIELDS)+'</div>')) 314 ) 315 .append(Y.Node.create('<div class="'+CSS.OPTIONS+'"><span class="label">'+M.util.get_string('assignrole', 'role')+': </span></div>')) 316 ); 317 var id = 0, roles = this._manager.get(ASSIGNABLEROLES); 318 for (id in roles) { 319 var role = Y.Node.create('<a href="#" class="'+CSS.ROLEOPTION+'">'+roles[id]+'</a>'); 320 role.on('click', this.assignRoleToUser, this, id, role); 321 this._node.one('.'+CSS.OPTIONS).append(role); 322 } 323 return this._node; 324 }, 325 assignRoleToUser : function(e, roleid, node) { 326 e.halt(); 327 if (this._assignmentInProgress) { 328 return true; 329 } 330 this._node.addClass('assignment-in-progress'); 331 this._assignmentInProgress = true; 332 Y.io(M.cfg.wwwroot+'/enrol/ajax.php', { 333 method:'POST', 334 data:'id='+this._manager.get(COURSEID)+'&action=assign&sesskey='+M.cfg.sesskey+'&roleid='+roleid+'&user='+this.get(USERID), 335 on: { 336 complete: function(tid, outcome, args) { 337 try { 338 var o = Y.JSON.parse(outcome.responseText); 339 if (o.success) { 340 var options = args.node.ancestor('.'+CSS.OPTIONS); 341 if (options.all('.'+CSS.ROLEOPTION).size() == 1) { 342 // This is the last node so remove the options div 343 if (options.ancestor('.'+CSS.USER)) { 344 options.ancestor('.'+CSS.USER).addClass(CSS.ALLROLESASSIGNED); 345 } 346 options.remove(); 347 } else { 348 // There are still more assignable roles 349 args.node.remove(); 350 } 351 this._manager.set(REQUIREREFRESH, true); 352 } 353 } catch (e) { 354 new M.core.exception(e); 355 } 356 this._assignmentInProgress = false; 357 this._node.removeClass('assignment-in-progress'); 358 } 359 }, 360 context:this, 361 arguments:{ 362 roleid : roleid, 363 node : node 364 } 365 }); 366 return true; 367 } 368 }, { 369 NAME : OTHERUSERNAME, 370 ATTRS : { 371 userId : { 372 373 }, 374 fullname : { 375 validator : Y.Lang.isString 376 }, 377 extrafields : { 378 validator : Y.Lang.isString 379 }, 380 picture : { 381 validator : Y.Lang.isString 382 } 383 } 384 }); 385 Y.augment(OTHERUSER, Y.EventTarget); 386 387 M.enrol = M.enrol || {}; 388 M.enrol.otherusersmanager = { 389 init : function(cfg) { 390 new OUMANAGER(cfg); 391 } 392 } 393 394 }, '@VERSION@', {requires:['base','node', 'overlay', 'io-base', 'test', 'json-parse', 'event-delegate', 'dd-plugin', 'event-key', 'moodle-core-notification']});
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |