- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-22-2014 02:19 AM
Hi,
I have a requirement where Manager should be allowed to edit the group members ( add / remove ) of the groups that he / she is managing.
I have created below variables in Catalog item.
1. Reference : User Assignment group table (sys_user_group) : This displays the groups which are managed by 'logged In' user. I put a reference qualifier here to display particular groups.
2. List Collector :
I am thinking to use 'Group Edit' form / page on the Catalog item ( I think this will make my work easier) , pls find the attached screenshot
This form displays the 'existing users' of the groups on the right side and Other users on the left.
Is it possible to have that complete page in the Catalog item ? Where to find that page ?
Is there any other approach you think will be easier ?
Thanks,
Abhijeet
Solved! Go to Solution.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-22-2014 03:27 AM
here is the code for changing the filter of slush bucket and preloading the selected options on the right side... make changes according to your requirement.. Hope this helps
onchange function()
{
if(!isLoading)
{
//ci is the variable name of slush bucket. replace ci below lines with your variable name
var query = "^u_active=" + newValue+"^name!=";
cig_filter.reset();
cig_filter.setQuery(query);
ciacRequest(null);
if(newValue=='true')
{
setTimeout("defaultSelectedOptions();", 5000);
}
}
}
function defaultSelectedOptions()
{
try
{
var loadInitialValues = '6fd6bc05871d10005ea5476dff434d69,bbd7bc45871d10005ea5476dff434dca'; //values to load
var varName = 'ci'; //slush bucket variable name
var leftBucket = gel(varName + '_select_0');
var rightBucket = gel(varName + '_select_1');
rightBucket.options.length = '0';
var leftOptions = leftBucket.options;
var selectedOptions = loadInitialValues.split(',');
var selectedIDs = new Array();
var index = 0;
for(var i = 0; i < leftOptions.length; i++){
for(var j = 0; j < selectedOptions.length; j++){
if(leftOptions[i].value == selectedOptions[j]){
selectedIDs[index]= i;
index++;
}
}
}
moveSelectedOptions(selectedIDs,leftBucket, rightBucket, '');
}
catch(err)
{
alert(err);
}
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-19-2017 02:05 AM
Hi,
Are you saying that I will need the g_form.setValue method to populate the list collector ?
How can we do that for the leftbucket and rightbucket ?
Thanks

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-19-2017 10:54 PM
setValue method doesn't appear to be working. I was able to find a workaround for this but the below solution is a violation of ServiceNow best practices and would not work on portal and might break in future.
Below is the script include function that does the heavy lifting. It retrieves the group members, new filter condition for the list collector and formats the data as JSON
getGroupMembers : function(){
var group = this.getParameter('sysparam_groupID');
var user_array = [];
var query = 'active=true';
var getMembers = new GlideRecord('sys_user_grmember');
getMembers.addQuery('group',group);
getMembers.query();
while(getMembers.next())
{
var user_Obj = {};
query= query + '^sys_id!=' + (getMembers.getValue('user'));
user_Obj.key=getMembers.user.getDisplayValue();
user_Obj.value=getMembers.getValue('user');
user_array.push(user_Obj);
}
var filter_Obj = {};
filter_Obj.key = 'list_filter';
filter_Obj.value = query; //This is the new filter of list collector.
user_array.push(filter_Obj);
return (new JSON()).encode(user_array); //JSON formatted string
}
The onchange script of the group variable fetches the information related to the group and populates the fields. Since the list collector is essentially a select box, I am using Jquery to fill out the options (groups members)
var glideAjax = new GlideAjax('Common_Utilities');
glideAjax.addParam('sysparm_name','getGroupMembers');
glideAjax.addParam('sysparam_groupID',newValue);
glideAjax.getXMLWait();
jQuery('#group_members_select_1').empty();
var response =(glideAjax.getAnswer());
var jsonData = (response.evalJSON());
for( var i=0 ; i < (jsonData.length)-1 ; i++)
jQuery('#group_members_select_1').append(jQuery("<option></option>").attr("value",jsonData[i].value).text(jsonData[i].key)); //Populate the options
//sets the new filter for the list collector.
group_membersg_filter.reset();
group_membersg_filter.setQuery(jsonData[(jsonData.length)-1].value);
group_membersacRequest(null);

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-20-2017 01:53 AM
Reworked the code a bit and was able to eliminate JQuery and filter part.
Below is the optimized script.
Script include :
getGroupMembers : function(){
var group = this.getParameter('sysparam_groupID');
var user_array = [];
var query = 'active=true';
var getMembers = new GlideRecord('sys_user_grmember');
getMembers.addQuery('group',group);
getMembers.query();
while(getMembers.next())
{
var user_Obj = {};
query= query + '^sys_id!=' + (getMembers.getValue('user'));
user_Obj.key=getMembers.user.getDisplayValue();
user_Obj.value=getMembers.getValue('user');
user_array.push(user_Obj);
}
return (new JSON()).encode(user_array); //JSON formatted string
}
Onchange Client script:
var varName = 'group_members'; //slush bucket variable name
var glideAjax = new GlideAjax('Common_Utilities');
glideAjax.addParam('sysparm_name','getGroupMembers');
glideAjax.addParam('sysparam_groupID',newValue);
glideAjax.getXMLWait();
var leftBucket = gel(varName + '_select_0');
var rightBucket = gel(varName + '_select_1');
rightBucket.options.length = '0';
var response =(glideAjax.getAnswer());
var jsonData = (response.evalJSON());
for( var i=0 ; i < (jsonData.length)-1 ; i++)
addOption(rightBucket,jsonData[i].value, jsonData[i].key);
sortSelect(rightBucket);
leftBucket.onchange();
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-20-2017 02:17 AM
kalai it's working pretty well !!
However, something strange, for every group, I always get one missing member, fro example hardware group have 7 members, I have 6 members in the rightbucket....
I'll try to investigate what's going wrong with the retreived data.
Thanks for your precious help !

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-20-2017 02:24 AM
Oops. Change this like
for( var i=0 ; i < (jsonData.length)-1 ; i++)
to
for( var i=0 ; i < (jsonData.length) ; i++)