From 9f15347e2c545ac4cd3ee6facd6a3e976f883b5a Mon Sep 17 00:00:00 2001 From: Sam Hemelryk Date: Fri, 23 Jul 2010 08:21:42 +0000 Subject: [PATCH] enrol MDL-23447 Others users page now only lists roles that have moodle/course:view --- enrol/ajax.php | 3 ++- enrol/locallib.php | 19 ++++++++++++-- enrol/otherusers.php | 2 +- enrol/renderer.php | 5 +++- .../otherusersmanager/otherusersmanager.js | 6 +++-- .../assets/skins/sam/rolemanager.css | 2 +- enrol/yui/rolemanager/rolemanager.js | 26 ++++++++++++++----- 7 files changed, 49 insertions(+), 14 deletions(-) diff --git a/enrol/ajax.php b/enrol/ajax.php index 2841944a76a..fa2053b18e1 100644 --- a/enrol/ajax.php +++ b/enrol/ajax.php @@ -86,7 +86,8 @@ switch ($action) { break; case 'getassignable': - $outcome->response = $manager->get_assignable_roles(); + $otheruserroles = optional_param('otherusers', false, PARAM_BOOL); + $outcome->response = $manager->get_assignable_roles($otheruserroles); break; case 'getcohorts': require_capability('moodle/course:enrolconfig', $context); diff --git a/enrol/locallib.php b/enrol/locallib.php index f0ba77822b4..078aa8c4d65 100644 --- a/enrol/locallib.php +++ b/enrol/locallib.php @@ -90,6 +90,7 @@ class course_enrolment_manager { private $_plugins = null; private $_roles = null; private $_assignableroles = null; + private $_assignablerolesothers = null; private $_groups = null; /**#@-*/ @@ -438,11 +439,25 @@ class course_enrolment_manager { * * @return array */ - public function get_assignable_roles() { + public function get_assignable_roles($otherusers = false) { if ($this->_assignableroles === null) { $this->_assignableroles = get_assignable_roles($this->context, ROLENAME_ALIAS, false); // verifies unassign access control too } - return $this->_assignableroles; + + if ($otherusers) { + if (!is_array($this->_assignablerolesothers)) { + $this->_assignablerolesothers = array(); + list($courseviewroles, $ignored) = get_roles_with_cap_in_context($this->context, 'moodle/course:view'); + foreach ($this->_assignableroles as $roleid=>$role) { + if (isset($courseviewroles[$roleid])) { + $this->_assignablerolesothers[$roleid] = $role; + } + } + } + return $this->_assignablerolesothers; + } else { + return $this->_assignableroles; + } } /** diff --git a/enrol/otherusers.php b/enrol/otherusers.php index 7f689011fab..03631d5f486 100644 --- a/enrol/otherusers.php +++ b/enrol/otherusers.php @@ -83,7 +83,7 @@ $table->set_fields($fields); $renderer = $PAGE->get_renderer('core_enrol'); $canassign = has_capability('moodle/role:assign', $manager->get_context()); $users = $manager->get_other_users_for_display($renderer, $pageurl, $table->sort, $table->sortdirection, $table->page, $table->perpage); -$assignableroles = $manager->get_assignable_roles(); +$assignableroles = $manager->get_assignable_roles(true); foreach ($users as $userid=>&$user) { $user['picture'] = $OUTPUT->render($user['picture']); $user['role'] = $renderer->user_roles_and_actions($userid, $user['roles'], $assignableroles, $canassign, $pageurl); diff --git a/enrol/renderer.php b/enrol/renderer.php index 4ce600428fc..b477dd8196c 100644 --- a/enrol/renderer.php +++ b/enrol/renderer.php @@ -494,7 +494,8 @@ class course_enrolment_table extends html_table implements renderable { $arguments = array( 'containerId'=>$this->id, 'userIds'=>array_keys($users), - 'courseId'=>$this->manager->get_course()->id); + 'courseId'=>$this->manager->get_course()->id, + 'otherusers'=>isset($this->otherusers)); $page->requires->yui_module($modules, $function, array($arguments)); } } @@ -719,6 +720,8 @@ class course_enrolment_users_table extends course_enrolment_table { */ class course_enrolment_other_users_table extends course_enrolment_table { + public $otherusers = true; + /** * Constructs the table * diff --git a/enrol/yui/otherusersmanager/otherusersmanager.js b/enrol/yui/otherusersmanager/otherusersmanager.js index 4ff889ec255..d35d20fa09e 100644 --- a/enrol/yui/otherusersmanager/otherusersmanager.js +++ b/enrol/yui/otherusersmanager/otherusersmanager.js @@ -208,7 +208,7 @@ YUI.add('moodle-enrol-otherusersmanager', function(Y) { getAssignableRoles : function() { Y.io(M.cfg.wwwroot+'/enrol/ajax.php', { method:'POST', - data:'id='+this.get(COURSEID)+'&action=getassignable&sesskey='+M.cfg.sesskey, + data:'id='+this.get(COURSEID)+'&action=getassignable&otherusers=true&sesskey='+M.cfg.sesskey, on: { complete: function(tid, outcome, args) { try { @@ -340,8 +340,10 @@ YUI.add('moodle-enrol-otherusersmanager', function(Y) { 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(); - options.ancestor(CSS.USER).addClass(CSS.ALLROLESASSIGNED); } else { // There are still more assignable roles args.node.remove(); diff --git a/enrol/yui/rolemanager/assets/skins/sam/rolemanager.css b/enrol/yui/rolemanager/assets/skins/sam/rolemanager.css index 504323c9de1..423ea149b1a 100644 --- a/enrol/yui/rolemanager/assets/skins/sam/rolemanager.css +++ b/enrol/yui/rolemanager/assets/skins/sam/rolemanager.css @@ -1,4 +1,4 @@ -.enrolpanel {display:none;position:absolute;background-color:#666;padding:0 5px;} +.enrolpanel {display:none;position:absolute;background-color:#666;padding:0 5px;min-width:200px;} .enrolpanel.visible {display:block;} .enrolpanel .container {position:relative;background-color:#fff;border:1px solid #999;top:-5px;} .enrolpanel .container .header {border-bottom:1px solid #999;} diff --git a/enrol/yui/rolemanager/rolemanager.js b/enrol/yui/rolemanager/rolemanager.js index f8cf04935dd..6cfb7d8704c 100644 --- a/enrol/yui/rolemanager/rolemanager.js +++ b/enrol/yui/rolemanager/rolemanager.js @@ -14,7 +14,8 @@ YUI.add('moodle-enrol-rolemanager', function(Y) { UNASSIGNROLELINKS = 'unassignRoleLinks', UNASSIGNROLELINKSSELECTOR = 'unassignRoleLinksSelector', MANIPULATOR = 'manipulator', - CURRENTROLES = 'currentroles'; + CURRENTROLES = 'currentroles', + OTHERUSERS = 'otherusers'; var ROLE = function(config) { ROLE.superclass.constructor.apply(this, arguments); @@ -47,6 +48,9 @@ YUI.add('moodle-enrol-rolemanager', function(Y) { }, assignableRoles : { value : [] + }, + otherusers : { + value : false } } Y.extend(ROLE, Y.Base, { @@ -144,10 +148,15 @@ YUI.add('moodle-enrol-rolemanager', function(Y) { }); }, _loadAssignableRoles : function() { - var c = this.get(COURSEID); + var c = this.get(COURSEID), params = { + id : this.get(COURSEID), + otherusers : (this.get(OTHERUSERS))?'true':'false', + action : 'getassignable', + sesskey : M.cfg.sesskey + }; Y.io(M.cfg.wwwroot+'/enrol/ajax.php', { method:'POST', - data:'id='+this.get(COURSEID)+'&action=getassignable&sesskey='+M.cfg.sesskey, + data:build_querystring(params), on: { complete: function(tid, outcome, args) { try { @@ -357,10 +366,12 @@ YUI.add('moodle-enrol-rolemanager', function(Y) { element.one('.header .close').on('click', this.hide, this); }, display : function(user) { - var currentroles = user.get(CURRENTROLES); + var currentroles = user.get(CURRENTROLES), node = null; for (var i in currentroles) { if (currentroles[i] === true) { - this.get('contentNode').one('#add_assignable_role_'+i).setAttribute('disabled', 'disabled'); + if (node = this.get('contentNode').one('#add_assignable_role_'+i)) { + node.setAttribute('disabled', 'disabled'); + } this.roles.push(i); } } @@ -378,8 +389,11 @@ YUI.add('moodle-enrol-rolemanager', function(Y) { this._escCloseEvent.detach(); this._escCloseEvent = null; } + var node = null; for (var i in this.roles) { - this.get('contentNode').one('#add_assignable_role_'+this.roles[i]).removeAttribute('disabled'); + if (node = this.get('contentNode').one('#add_assignable_role_'+i)) { + node.removeAttribute('disabled'); + } } this.roles = []; this.user = null;