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
I have the same question (0)