Set values dynamically to a list collector catalog variable(Groups)

Sarah Bouil
Tera Expert

In Catalog form I have a choice field 'Access' with 2 drop down values 'Admin' and 'Non-Admin' and other field is 'Groups'(type is: list collector). If I select 'Admin' as 'Access' then I should see only groups(I mean admin groups) that contains 'admin' role and if I select 'Non-Admin' as 'Access' then I should see only groups(Non admin groups) that does not contains 'admin' role. I tried with below code but it is not working.

 

Catalog Client Script:

function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}

//Type appropriate comment here, and begin script below
var ga = new GlideAjax('Cat_Var_GetGrps'); //calling script include

if (g_form.getValue('access_user') == 'non_admin') { //access_user- is the drop down variable
ga.addParam('sysparm_name', 'getUserGroups'); //Script include function
} else {
ga.addParam('sysparm_name', 'getUserGroupsAdmin'); //Script include function
}
ga.addParam('sysparm_user', newValue); //On change Value
ga.getXML(Cat_Var_GetGrps);

function Cat_Var_GetGrps(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
var filStr = answer;
setMyFilter(answer);
function setMyFilter(filStr) {
eval(groups_dis+'g_filter.reset()'); // groups_dis- is the list collector varaible
eval(groups_dis+'g_filter.setQuery(filStr)');
eval(groups_dis+'acRequest(null)');
}

}
}

 

Script Include:

var Cat_Var_GetGrps = Class.create();
Cat_Var_GetGrps.prototype = Object.extendsObject(AbstractAjaxProcessor, {

getUserGroupsAdmin: function() {
function groupHasAdminRole(group) {
var hasadmin = false;
var grAdminRole = new GlideRecord('sys_group_has_role');
grAdminRole.addQuery('group.name', group);
grAdminRole.addQuery('role.name', 'CONTAINS', 'admin');
grAdminRole.query();

if (grAdminRole.next()) {
hasadmin = true;
}
return hasadmin;
}

var dataArr = [];
var data = {};
var user = this.getParameter('sysparm_user');
var grGroup = new GlideRecord('sys_user_grmember');
grGroup.addQuery('user', this.getParameter('sysparm_user'));
grGroup.addQuery('active', true);
grGroup.query();
while (grGroup.next()) {
var resultAdmin = groupHasAdminRole(grGroup.group.name.getValue());

if (resultAdmin) {
data = {};
data.user = grGroup.getValue('user');
data.group = grGroup.getValue('group');
dataArr.push(data);
}
}

return JSON.stringify(dataArr);

},
getUserGroups: function() {
function groupHasAdminRole(group) {
var hasadmin = false;
var grAdminRole = new GlideRecord('sys_group_has_role');
grAdminRole.addQuery('group.name', group);
grAdminRole.addQuery('role.name', 'CONTAINS', 'admin');
grAdminRole.query();

if (grAdminRole.next()) {
hasadmin = true;
}
return hasadmin;
}

var dataArr = [];
var data = {};
var user = this.getParameter('sysparm_user');
var grGroup = new GlideRecord('sys_user_grmember');
grGroup.addQuery('user', this.getParameter('sysparm_user'));
grGroup.addQuery('active', true);
grGroup.query();
while (grGroup.next()) {
var resultAdmin = groupHasAdminRole(grGroup.group.name.getValue());

if (!resultAdmin) {
data = {};
data.user = grGroup.getValue('user');
data.group = grGroup.getValue('group');
dataArr.push(data);
}
}

return JSON.stringify(dataArr);

},

 

type: 'Cat_Var_GetGrps'
});

 

Kindly assist me what was wrong with my script?

 

10 REPLIES 10

Is it required 2 UI Policies or we can achieve with one UI policy?

Hi @Sarah Bouil 

Option 1:

one UI policy using the script

if admin do this (show admin group list, hide non-admin group list)

else do this (hide admin group list, show non-admin group list)

 

Option 2:

two UI policies

1. for admin access is selected 

2. for non-admin access is selected

 

Hope this helps. Let us know, if you need more support here.

 

Thank you. 

Regards,

Karunakaran.

I tried achieve by Catalog Client Script.

Mark Manders
Mega Patron

Could you try it like this:

Client Script:

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue === '') {
        return;
    }

    var accessType = g_form.getValue('access_user');
    var ga = new GlideAjax('Cat_Var_GetGrps');
    ga.addParam('sysparm_name', accessType === 'non_admin' ? 'getUserGroups' : 'getUserGroupsAdmin');
    ga.addParam('sysparm_user', newValue);
    ga.getXMLAnswer(setGroupsFilter);
}

function setGroupsFilter(response) {
    var groupsList = JSON.parse(response);
    var filterQuery = "sys_idIN" + groupsList.join(',');
    var listCollectorVariableName = 'groups_dis'; // Replace with your actual List Collector variable name
    var lc = g_form.getControl(listCollectorVariableName);
    if (lc) {
        lc.g_filter.reset();
        lc.g_filter.addEncodedQuery(filterQuery);
        lc.acRequest(null);
    }
}

 
Script include:

var Cat_Var_GetGrps = Class.create();
Cat_Var_GetGrps.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getUserGroupsAdmin: function() {
        return JSON.stringify(this._getGroups(true));
    },

    getUserGroups: function() {
        return JSON.stringify(this._getGroups(false));
    },

    _getGroups: function(isAdmin) {
        var groupIds = [];
        var grMember = new GlideRecord('sys_user_grmember');
        grMember.addQuery('user', this.getParameter('sysparm_user'));
        grMember.query();
        while (grMember.next()) {
            var groupName = grMember.group.getDisplayValue();
            if (this._groupHasRole(groupName, 'admin') === isAdmin) {
                groupIds.push(grMember.group.toString());
            }
        }
        return groupIds;
    },

   _groupHasRole: function(group, roleName) {
    var grRole = new GlideRecord('sys_group_has_role');
    grRole.addQuery('group', group);
    grRole.addQuery('role.name', roleName);
    grRole.query();
    return grRole.hasNext();
},

    type: 'Cat_Var_GetGrps'
});

Please mark any helpful or correct solutions as such. That helps others find their solutions.
Mark

Hi Mark, I tried with above code but its not working.