Hi,
We have a ribbon where we load a JS function to check whether the logged user has any of the allowed roles to "see" the "Qualify" button on a lead; theoretically, because is not working.
For what I was able to see, the Javascript function is not reactive and the "Qualify" button loads before the function ends. Therefore the function does not hide the button.
This is the function:
function CheckSecurityRoles() { // Definicion de variables // Se leen los argumentos pasados como roles permitidos var allowedRoles = arguments; // Se lee el ID de los roles del usuario ingresado var loggedUserRoles = Xrm.Page.context.userSettings.securityRoles; // Se accede a la API de Xrm para obtener todos los roles del sistema Xrm.WebApi.retrieveMultipleRecords("roles", "?$select=name,roleid").then( function success(result) { // Definicion de variables var userHasAccess = false; // Se verifican los roles devueltos y los roles permitidos if(result.entities.length > 0 && allowedRoles.length > 0) { // Definicion de variables var totalRoles = result.entities; var existingRoles = compareRolesNames(allowedRoles, totalRoles); // Se verifican los roles existentes devueltos if(existingRoles.length > 0) { userHasAccess = compareRolesID(loggedUserRoles, existingRoles); } // end-if } // end-if console.log("CheckSecurityRoles() devolvió (OK): " + userHasAccess); // Devuelve el acceso return userHasAccess; }, // end-function // En caso de error en la ejecución de la API function (error) { console.log("CheckSecurityRoles() devolvió (ERROR): " + error.message); return false; }); } function compareRolesNames(firstRoles, secondRoles) { // Declaración de variables var resultingRoles = new Array(); // Se itera el array de roles pasados como primer argumento for(var firstRolesIndex = 0; firstRolesIndex < firstRoles.length; firstRolesIndex++) { // Se itera el array de roles pasados como segundo argumento for(var secondRolesIndex = 0; secondRolesIndex < secondRoles.length; secondRolesIndex++) { if(firstRoles[firstRolesIndex].toLowerCase() === secondRoles[secondRolesIndex].name.toLowerCase()) { // Se agrega al array de roles resultantes las coincidencias entre los roles del primero y segundo parámetro resultingRoles.push(secondRoles[secondRolesIndex]); } // end-if } // end-for } // end-for // Devolución de roles comparados return resultingRoles; } function compareRolesID(firstRoles, secondRoles) { // Declaración de variables var result = false; // Se iteran los roles del array pasado como primer parámetro for(var firstRolesIndex = 0; firstRolesIndex < firstRoles.length; firstRolesIndex++) { // Se iteran los roles del array pasado como segundo parámetro for(var secondRolesIndex = 0; secondRolesIndex < secondRoles.length; secondRolesIndex++) { // Se comparan los roles de cada array if(firstRoles[firstRolesIndex] === secondRoles[secondRolesIndex].roleid) { // Se otorga el acceso result = true; } //end-if } //end-for } // end-for // Se devuelve el acceso return result; }
I was reading that Xrm class hasn't an asynchronous property.
Note: I realized the function works since I debugged the entire function with `console.log(userHasAccess)`, any suggestions to make the function reactive or make it work?
Thanks in advance.
*This post is locked for comments