YUI.add('moodle-enrol-otherusersmanager', function(Y) { var OUMANAGERNAME = 'Other users manager', OTHERUSERNAME = 'Other user (not enroled in course)', COURSEID = 'courseId', USERID = 'userId', BASE = 'base', SEARCH = 'search', REQUIREREFRESH = 'requiresRefresh', PAGE = 'page', USERCOUNT = 'userCount', PICTURE = 'picture', FULLNAME = 'fullname', EXTRAFIELDS = 'extrafields', ASSIGNABLEROLES = 'assignableRoles', USERS = 'users', URL = 'url', AJAXURL = 'ajaxUrl'; CSS = { PANEL : 'other-user-manager-panel', WRAP : 'oump-wrap', HEADER : 'oump-header', CONTENT : 'oump-content', AJAXCONTENT : 'oump-ajax-content', SEARCHRESULTS : 'oump-search-results', TOTALUSERS : 'oump-total-users', USERS : 'oump-users', USER : 'oump-user', USERDETAILS : 'oump-user-details', MORERESULTS : 'oump-more-results', LIGHTBOX : 'oump-loading-lightbox', LOADINGICON : 'loading-icon', FOOTER : 'oump-footer', COUNT : 'count', PICTURE : 'oump-user-picture', DETAILS : 'oump-user-specifics', FULLNAME : 'oump-user-fullname', EXTRAFIELDS : 'oump-user-extrafields', OPTIONS : 'oump-role-options', ROLEOPTION : 'oump-assignable-role', ODD : 'odd', EVEN : 'even', HIDDEN : 'hidden', SEARCH : 'oump-search', CLOSE : 'oump-panel-close', ALLROLESASSIGNED : 'oump-has-all-roles' }; var OUMANAGER = function(config) { OUMANAGER.superclass.constructor.apply(this, arguments); }; Y.extend(OUMANAGER, Y.Base, { _loadingNode : null, _escCloseEvent : null, initializer : function(config) { this.set(BASE, Y.Node.create('
') .append(Y.Node.create('
') .append(Y.Node.create('
') .append(Y.Node.create('
')) .append(Y.Node.create('

'+M.util.get_string('usersearch', 'enrol')+'

'))) .append(Y.Node.create('
') .append(Y.Node.create('
')) .append(Y.Node.create('
') .append(Y.Node.create('loading') .setAttribute('src', M.util.image_url('i/loading', 'moodle'))) .setStyle('opacity', 0.5))) .append(Y.Node.create('
') .append(Y.Node.create('
') .append(Y.Node.create('')) ) ) ) ); this.set(SEARCH, this.get(BASE).one('#oump-usersearch')); Y.all('.assignuserrole input').each(function(node){ if (node.getAttribute('type', 'submit')) { node.on('click', this.show, this); } }, this); this.get(BASE).one('.'+CSS.HEADER+' .'+CSS.CLOSE).on('click', this.hide, this); this._loadingNode = this.get(BASE).one('.'+CSS.CONTENT+' .'+CSS.LIGHTBOX); Y.on('key', this.getUsers, this.get(SEARCH), 'down:13', this); Y.one(document.body).append(this.get(BASE)); var base = this.get(BASE); base.plug(Y.Plugin.Drag); base.dd.addHandle('.'+CSS.HEADER+' h2'); base.one('.'+CSS.HEADER+' h2').setStyle('cursor', 'move'); this.getAssignableRoles(); }, show : function(e) { e.preventDefault(); e.halt(); var base = this.get(BASE); base.removeClass(CSS.HIDDEN); var x = (base.get('winWidth') - 400)/2; var y = (parseInt(base.get('winHeight'))-base.get('offsetHeight'))/2 + parseInt(base.get('docScrollY')); if (y < parseInt(base.get('winHeight'))*0.1) { y = parseInt(base.get('winHeight'))*0.1; } base.setXY([x,y]); if (this.get(USERS)===null) { this.getUsers(e, false); } this._escCloseEvent = Y.on('key', this.hide, document.body, 'down:27', this); }, hide : function() { if (this._escCloseEvent) { this._escCloseEvent.detach(); this._escCloseEvent = null; } this.get(BASE).addClass(CSS.HIDDEN); if (this.get(REQUIREREFRESH)) { window.location = this.get(URL); } }, getUsers : function(e, append) { if (e) { e.halt(); e.preventDefault(); } var on, params; if (append) { this.set(PAGE, this.get(PAGE)+1); } else { this.set(USERCOUNT, 0); } params = []; params['id'] = this.get(COURSEID); params['sesskey'] = M.cfg.sesskey; params['action'] = 'searchotherusers'; params['search'] = this.get(SEARCH).get('value'); params['page'] = this.get(PAGE); Y.io(M.cfg.wwwroot+this.get(AJAXURL), { method:'POST', data:build_querystring(params), on : { start : this.displayLoading, complete: this.processSearchResults, end : this.removeLoading }, context:this, arguments:{ append:append, params:params } }); }, displayLoading : function() { this._loadingNode.removeClass(CSS.HIDDEN); }, removeLoading : function() { this._loadingNode.addClass(CSS.HIDDEN); }, processSearchResults : function(tid, outcome, args) { var result; try { result = Y.JSON.parse(outcome.responseText); if (result.error) { return new M.core.ajaxException(result); } } catch (e) { new M.core.exception(e); } if (!result.success) { this.setContent = M.util.get_string('errajaxsearch', 'enrol'); } var usersnode, users = [], i=0, count=0, user; if (!args.append) { usersnode = Y.Node.create('
'); } else { usersnode = this.get(BASE).one('.'+CSS.SEARCHRESULTS+' .'+CSS.USERS); } count = this.get(USERCOUNT); for (i in result.response.users) { count++; user = new OTHERUSER(result.response.users[i], count, this); usersnode.append(user.toHTML()); users[user.get(USERID)] = user; } this.set(USERCOUNT, count); if (!args.append) { var usersstr = ''; if (this.get(USERCOUNT) === 1) { usersstr = M.util.get_string('ajaxoneuserfound', 'enrol'); } else if (result.response.moreusers) { usersstr = M.util.get_string('ajaxxmoreusersfound', 'enrol', this.get(USERCOUNT)); } else { usersstr = M.util.get_string('ajaxxusersfound', 'enrol', this.get(USERCOUNT)); } var content = Y.Node.create('
') .append(Y.Node.create('
'+usersstr+'
')) .append(usersnode); if (result.response.moreusers) { var fetchmore = Y.Node.create('
'+M.util.get_string('ajaxnext25', 'enrol')+'
'); fetchmore.on('click', this.getUsers, this, true); content.append(fetchmore) } this.setContent(content); } else { if (!result.response.moreusers) { this.get(BASE).one('.'+CSS.MORERESULTS).remove(); } } }, setContent : function(content) { this.get(BASE).one('.'+CSS.CONTENT+' .'+CSS.AJAXCONTENT).setContent(content); }, getAssignableRoles : function() { Y.io(M.cfg.wwwroot+'/enrol/ajax.php', { method:'POST', data:'id='+this.get(COURSEID)+'&action=getassignable&otherusers=true&sesskey='+M.cfg.sesskey, on: { complete: function(tid, outcome, args) { try { var roles = Y.JSON.parse(outcome.responseText); if (roles.error) { new M.core.ajaxException(roles); } else { this.set(ASSIGNABLEROLES, roles.response); } } catch (e) { new M.core.exception(e); } this.getAssignableRoles = function() { this.fire('assignablerolesloaded'); }; this.getAssignableRoles(); } }, context:this }); } }, { NAME : OUMANAGERNAME, ATTRS : { courseId : { }, ajaxUrl : { validator : Y.Lang.isString }, url : { validator : Y.Lang.isString }, roles : { validator :Y.Lang.isArray, value : [] }, base : { setter : function(node) { var n = Y.one(node); if (!n) { Y.fail(OUMANAGERNAME+': invalid base node set'); } return n; } }, search : { setter : function(node) { var n = Y.one(node); if (!n) { Y.fail(OUMANAGERNAME+': invalid base node set'); } return n; } }, requiresRefresh : { validator : Y.Lang.isBoolean, value : false }, users : { validator : Y.Lang.isArray, value : null }, page : { validator : Y.Lang.isNumber, value : 0 }, userCount : { validator : Y.Lang.isNumber, value : 0 }, assignableRoles : { value : [] } } }); var OTHERUSER = function(config, count, manager) { this._count = count; this._manager = manager; OTHERUSER.superclass.constructor.apply(this, arguments); }; Y.extend(OTHERUSER, Y.Base, { _count : 0, _manager : null, _node : null, _assignmentInProgress : false, initializer : function(config) { this.publish('assignrole:success'); this.publish('assignrole:failure'); }, toHTML : function() { this._node = Y.Node.create('
') .addClass((this._count%2)?CSS.ODD:CSS.EVEN) .append(Y.Node.create('
'+this._count+'
')) .append(Y.Node.create('
') .append(Y.Node.create('
') .append(Y.Node.create(this.get(PICTURE))) ) .append(Y.Node.create('
') .append(Y.Node.create('
'+this.get(FULLNAME)+'
')) .append(Y.Node.create('
'+this.get(EXTRAFIELDS)+'
')) ) .append(Y.Node.create('
'+M.util.get_string('assignrole', 'role')+':
')) ); var roles = this._manager.get(ASSIGNABLEROLES); for (var i in roles) { var role = Y.Node.create('' + roles[i].name + ''); role.on('click', this.assignRoleToUser, this, roles[i].id, role); this._node.one('.'+CSS.OPTIONS).append(role); } return this._node; }, assignRoleToUser : function(e, roleid, node) { e.halt(); if (this._assignmentInProgress) { return true; } this._node.addClass('assignment-in-progress'); this._assignmentInProgress = true; Y.io(M.cfg.wwwroot+'/enrol/ajax.php', { method:'POST', data:'id='+this._manager.get(COURSEID)+'&action=assign&sesskey='+M.cfg.sesskey+'&roleid='+roleid+'&user='+this.get(USERID), on: { complete: function(tid, outcome, args) { try { var o = Y.JSON.parse(outcome.responseText); if (o.success) { var options = args.node.ancestor('.'+CSS.OPTIONS); if (options.all('.'+CSS.ROLEOPTION).size() == 1) { // This is the last node so remove the options div if (options.ancestor('.'+CSS.USER)) { options.ancestor('.'+CSS.USER).addClass(CSS.ALLROLESASSIGNED); } options.remove(); } else { // There are still more assignable roles args.node.remove(); } this._manager.set(REQUIREREFRESH, true); } } catch (e) { new M.core.exception(e); } this._assignmentInProgress = false; this._node.removeClass('assignment-in-progress'); } }, context:this, arguments:{ roleid : roleid, node : node } }); return true; } }, { NAME : OTHERUSERNAME, ATTRS : { userId : { }, fullname : { validator : Y.Lang.isString }, extrafields : { validator : Y.Lang.isString }, picture : { validator : Y.Lang.isString } } }); Y.augment(OTHERUSER, Y.EventTarget); M.enrol = M.enrol || {}; M.enrol.otherusersmanager = { init : function(cfg) { new OUMANAGER(cfg); } } }, '@VERSION@', {requires:['base','node', 'overlay', 'io-base', 'test', 'json-parse', 'event-delegate', 'dd-plugin', 'event-key', 'moodle-core-notification']});