| 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']});
 |