Set values dynamically to a list collector catalog variable(Groups)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-24-2024 03:28 AM
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?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-24-2024 06:49 AM
Is it required 2 UI Policies or we can achieve with one UI policy?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-25-2024 01:07 AM
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-24-2024 10:59 AM
I tried achieve by Catalog Client Script.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-24-2024 03:52 AM
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-24-2024 06:29 AM
Hi Mark, I tried with above code but its not working.