In MS Dynamics CRM 2011/13 there exists a JavaScript function to get the user's roles (Xrm.Page.context.getUserRoles) unfortunately, there are two problems with this function:
- It does not retrieve all roles, just those directly assigned to the user. In other words, if the user is a member of a team and that team has a role, this function will not find it.
- It returns the guids of the user roles rather than the names.
So in order to get around those shortcomings I wrote this function, which will return an array with all roles the user has including team roles. Note that this function is will only work in IE9+ as neither IE7 nor IE8 support indexOf, something that I will discuss in an upcoming post. It seems to work fine in Chrome (31) and Firefox (25).
I think one of these days I will get the hang of JavaScript but I still find it really obnoxious to work with.function getAllUserRoles() { var guid = "[A-z0-9]{8}-[A-z0-9]{4}-[A-z0-9]{4}-[A-z0-9]{4}-[A-z0-9]{12}"; var serverUrl = Xrm.Page.context.getClientUrl(); var userId = Xrm.Page.context.getUserId(); userId = userId.match(guid); var teamQuery = "TeamMembershipSet?$select=TeamId&$filter=SystemUserId eq guid'"+userId +"'"; var teamRoleQuery = "TeamRolesSet?$select=RoleId&$filter="; var roleQuery = "RoleSet?$select=Name&$filter="; var teams = makeRequest(serverUrl,teamQuery,0); teamRoleQuery = composeQuery(teamRoleQuery,"TeamId",teams); var teamRoles = makeRequest(serverUrl,teamRoleQuery,1); userRoles = Xrm.Page.context.getUserRoles(); if(userRoles != null){ for(var i =0; i< userRoles.length;i++){ teamRoles.push(userRoles[i].match(guid)); } } roleQuery = composeQuery(roleQuery,"RoleId",teamRoles); var roles = makeRequest(serverUrl,roleQuery,2); return roles; } function makeRequest(serverUrl, query, type) { var oDataEndpointUrl = serverUrl + "/XRMServices/2011/OrganizationData.svc/"; oDataEndpointUrl += query; var service = GetRequestObject(); if (service != null) { service.open("GET", oDataEndpointUrl, false); service.setRequestHeader("X-Requested-With", "XMLHttpRequest"); service.setRequestHeader("Accept", "application/json, text/javascript, */*"); service.send(null); var retrieved = $.parseJSON(service.responseText).d; var results = new Array(); switch (type) { case 0: for (var i=0; i < retrieved.results.length;i++){ results.push(retrieved.results[i].TeamId); } break; case 1: for (var i=0; i < retrieved.results.length;i++){ results.push(retrieved.results[i].RoleId); } break; case 2: for (var i=0; i < retrieved.results.length;i++){ if(results.indexOf(retrieved.results[i].Name)==-1){ results.push(retrieved.results[i].Name); } } break; } return results; } return null; } function GetRequestObject() { if (window.XMLHttpRequest) { return new window.XMLHttpRequest; } else { try { return new ActiveXObject("MSXML2.XMLHTTP.3.0"); } catch (ex) { return null; } } } function composeQuery (queryBase, attribute, items ) { if (items != null){ for(var i=0; i < items.length; i++){ if (i==0) { queryBase += attribute + " eq (guid'"+items[i]+"')"; } else { queryBase += " or " + attribute + " eq (guid'"+items[i]+"')"; } } } return queryBase; }
No comments:
Post a Comment