Passing parameters to a script include from a client script

leonard_gilbert
Tera Expert

Hello, I have a requirement to populate members of a group using a list collector for a cat item I am working on for our first use of integration hub.  I have found some code to do it and it works well on the reference qualifier but from within the backend catalog, the list collector does not automatically refresh when the group is changed and from the portal it does not display the full collector.  I would like to use the backend view since on a few itil users will need this form.  Currently, I have to manually click run filter for it to update the list of members.  I was looking into if instead it could be called from a client script however with how the author originally made it I'm not sure if I can.  I have already set it to client callable.

//Current failing client script

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
   if (isLoading || newValue === '') {
      return;
   }
	var ga = new GlideAjax('ShowGroupMembers');
	ga.addParam("sysparm_name", "showGroupMembersBasedOnAddOrRemoveVariable"); 
	ga.addParam("existing_add_remove_members", valueAddOrRemove);
	ga.addParam("existing_group_name", groupName);
	ga.getXML(getResponse);
}

function getResponse(response) {
	alert(response);
}
//Working reference qualifier on the list collector variable

javascript: new ShowGroupMembers().showGroupMembersBasedOnAddOrRemoveVariable(current.variables.existing_add_remove_members, current.variables.existing_group_name)
//Script Include

var ShowGroupMembers = Class.create();
ShowGroupMembers.prototype = {
	initialize: function() {
	},



showGroupMembersBasedOnAddOrRemoveVariable: function(valueAddOrRemove, groupName) {

		var refQualQuery = "active=true";
		if(valueAddOrRemove == 'Add Members'){
			return  refQualQuery + "^sys_idNOT IN " + this._grGroupMembers(groupName);
		}
		else if(valueAddOrRemove == 'Remove Members'){
			return  refQualQuery + "^sys_idIN " + this._grGroupMembersa(groupName);
		}	
	},
	
	_grGroupMembers: function(groupName){
		var grGrpMembers = new GlideRecord('sys_user_grmember');
		grGrpMembers.addQuery('group', groupName);
		grGrpMembers.query();
		var listOfUsers = [];
		while(grGrpMembers.next()){
			//listOfUsers.push(grGrpMembers.user;
			listOfUsers.push(grGrpMembers.user.toString());
		}
		return listOfUsers;
	},
	type: 'ShowGroupMembers'
};
3 REPLIES 3

Sai Kumar B
Mega Sage
Mega Sage

Hi @leonard.gilbert  

Your client script and script include should be like this 

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
   if (isLoading || newValue === '') {
      return;
   }
var valueAddOrRemove = g_form.getValue("add_remove_field");
var groupName = g_form.getValue("group_name");
	var ga = new GlideAjax('ShowGroupMembers');
	ga.addParam("sysparm_name", "showGroupMembersBasedOnAddOrRemoveVariable"); 
	ga.addParam("existing_add_remove_members", valueAddOrRemove);
	ga.addParam("existing_group_name", groupName);
	ga.getXML(getResponse);
}

function getResponse(response) {
	alert(response);
}


Script include

showGroupMembersBasedOnAddOrRemoveVariable: function(valueAddOrRemove, groupName) {
var groupName = this.getParameter('existing_group_name');
var valueAddRemoveName = this.getParameter('existing_add_remove_members');
		var refQualQuery = "active=true";
		if(valueAddOrRemove == 'Add Members'){
			return  refQualQuery + "^sys_idNOT IN " + this._grGroupMembers(groupName);
		}
		else if(valueAddOrRemove == 'Remove Members'){
			return  refQualQuery + "^sys_idIN " + this._grGroupMembersa(groupName);
		}	
	},

Regards,

Sai Kumar

Jagadeesh1
Kilo Guru

Hi,

  It seems that the script include is not client callable. For this to work you might have to create a new script include which is client callable. You have to mark the client callable checkbox to make the script include extend from AbstractAjaxProcessor script.

And also the addParams method mentioned in the client script is not configured properly

Please check the below link to configure client callable script include and also how to pass variables from client script to it.

 

https://docs.servicenow.com/bundle/paris-application-development/page/script/ajax/topic/p_AJAX.html

Thanks,
Jagadeesh

Pranesh072
Mega Sage
Mega Sage

AbstractAjaxProcessor is missing from your script include. 

 

var ShowGroupMembers = Class.create();

ShowGroupMembers.prototype = Object.extendsObject(AbstractAjaxProcessor, {

 

 

 

add following code in your client script , to get the value of fields present on the form

 

var valueAddOrRemove = g_form.getValue("field name"); //update the field names
var groupName = g_form.getValue("field name");//update the field names

var ga = new GlideAjax('ShowGroupMembers');

ga.addParam("sysparm_name", "showGroupMembersBasedOnAddOrRemoveVariable"); ga.addParam("existing_add_remove_members", valueAddOrRemove);

ga.addParam("existing_group_name", groupName);

ga.getXML(getResponse);

 

 

add following code in script include, to fetch the value of the parameters passed by client script 

var groupName = this.getParameter('existing_group_name');
var valueAddRemoveName = this.getParameter('existing_add_remove_members');

var refQualQuery = "active=true";
if(valueAddOrRemove == 'Add Members'){
return refQualQuery + "^sys_idNOT IN " + this._grGroupMembers(groupName);
}
else if(valueAddOrRemove == 'Remove Members'){
return refQualQuery + "^sys_idIN " + this._grGroupMembersa(groupName);
}