add/remove options with client script not working in agent workspace

Musab Rasheed
Tera Sage
Tera Sage

Hello Experts,

I have a requirement to populate 'Request type' field dropdownlist depending on 'HR service' selected by user on Interaction record, There is dependency between 'Request type' and 'HR Service' on HR case form and same I'm trying to replicate on 'Interaction' form but due to limitation I'm resorted to writing client script to populate 'Request type' based on 'HR service'. Though script is working fine in Native UI but it's not working in Agent workspace. I have read few articles saying that add/remove options won't work in agent workspace but just wanted to understand if there is alternate approach to make it work. @Ankur Bawiskar Your help will be appreciated.

Script :

Client Script :

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading || newValue === '') {

        g_form.clearOptions('u_interaction_request_type');
        g_form.addOption('u_interaction_request_type', '-- None --', '-- None --');
        return;
    }

    var g = g_form.getDisplayBox('u_hr_service').value;

    if (newValue != '') {
        //alert("Workspace view");
        g_form.clearOptions('u_interaction_request_type');
        var userDetails = new GlideAjax('RequestTypeDetails'); //script include UserDetailsUtil
        userDetails.addParam('sysparm_name', 'getrequestDetails'); //calling function getUserDetails
        userDetails.addParam('sysparm_service', g); //passing the user detail as a parameter

        userDetails.getXML(HelloWorldParse);

        function HelloWorldParse(response) {

            var answer = response.responseXML.documentElement.getAttribute("answer");


            //  userDetails.getXML(function(response) {
            var userObj = JSON.parse(answer); //parsing the user object received from getUserDetails function

            g_form.addOption('u_interaction_request_type', '-- None --', '-- None --');
            //   g_form.addOption('u_interaction_request_type', userObj.value.toString(), userObj.label.toString());
            for (var i = 0; i < userObj.length; i++) {
                g_form.addOption('u_interaction_request_type', userObj[i].value, userObj[i].label); //replace with your field name
            }

        }

    }

}

 

Script include :

var RequestTypeDetails = Class.create();
RequestTypeDetails.prototype = Object.extendsObject(AbstractAjaxProcessor, {
	
	getrequestDetails: function(){
		var optionsArray = [];
    var processer = new JSON();//definition for getUserDetails function, called from client script
		var userObj = {}; //declaring user object
		var gg = this.getParameter('sysparm_service');
		gs.log("HR Service Name "+gg);
		var gr = GlideRecord('sys_choice'); //gliding through the user object
        gr.addQuery('element', 'u_request_type');
        gr.addQuery('dependent_value', gg);
        gr.query();
        while (gr.next()) {

			optionsArray.push({
        'label' : gr.label.toString(),
        'value' : gr.value.toString()
      });//replace with the field name(s) for your choice list Label and Value
    }
  return processer.encode(optionsArray);

		
		//return JSON.stringify(userObj); //returning the user defined object with details
	},


    type: 'RequestTypeDetails'
});

 

Screenshot:

find_real_file.png

Please hit like and mark my response as correct if that helps
Regards,
Musab
1 ACCEPTED SOLUTION

Musab Rasheed
Tera Sage
Tera Sage

So I made this work, Issue was with  var g = g_form.getDisplayBox('u_hr_service').value; as I got to know that getDisplayBox doesn't work in agent workspace so Instead of this I added some code in Script include. @Ankur Bawiskar What you said about addoption is correct but since I'm not directly making fields dependable and setting it through code so this worked. Here is the updated code.

Client Script :

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading && newValue === '') {

        g_form.clearOptions('u_interaction_request_type');
		g_form.setValue('u_interaction_request_type', '');
     //   g_form.addOption('u_interaction_request_type', '', '-- None --');
        return;
    }

    if (newValue != '' && !isLoading) {

        g_form.clearOptions('u_interaction_request_type');
        g_form.setValue('u_interaction_request_type', '');
        var userDetails = new GlideAjax('RequestTypeDetails'); //script include UserDetailsUtil
        userDetails.addParam('sysparm_name', 'getrequestDetails'); //calling function getUserDetails
        userDetails.addParam('sysparm_service', newValue); //passing the user detail as a parameter

        userDetails.getXML(HelloWorldParse);

        function HelloWorldParse(response) {

            var answer = response.responseXML.documentElement.getAttribute("answer");

            var userObj = JSON.parse(answer); //parsing the user object received from getUserDetails function

            //g_form.addOption('u_interaction_request_type', '', '-- None --');

            for (var i = 0; i < userObj.length; i++) {
                g_form.addOption('u_interaction_request_type', userObj[i].value, userObj[i].label); //replace with your field name
            }

        }

    }
	
	else if(newValue == '' && !isLoading)
		{
	
			   g_form.clearOptions('u_interaction_request_type');
			g_form.setValue('u_interaction_request_type', '');
      //  g_form.addOption('u_interaction_request_type', '', '-- None --');
		}

}

 

Script Include:

var RequestTypeDetails = Class.create();
RequestTypeDetails.prototype = Object.extendsObject(AbstractAjaxProcessor, {
	
	getrequestDetails: function(){
		var servicename;
		var optionsArray = [];
    var processer = new JSON();//definition for getUserDetails function, called from client script
		var userObj = {}; //declaring user object
		var gg = this.getParameter('sysparm_service');
		var rr = gg.name;
		var er = new GlideRecord('sn_hr_core_service');
		er.addQuery('sys_id', gg);
		er.query();
		if(er.next())
			{
				servicename = er.name;
			}

		var gr = GlideRecord('sys_choice'); //gliding through the user object
        gr.addQuery('element', 'u_request_type');
        gr.addQuery('dependent_value', servicename);
        gr.query();
        while (gr.next()) {

			optionsArray.push({
        'label' : gr.label.toString(),
        'value' : gr.value.toString()
      });//replace with the field name(s) for your choice list Label and Value
    }
  return processer.encode(optionsArray);

		
		//return JSON.stringify(userObj); //returning the user defined object with details
	},


    type: 'RequestTypeDetails'
});
Please hit like and mark my response as correct if that helps
Regards,
Musab

View solution in original post

3 REPLIES 3

Ankur Bawiskar
Tera Patron
Tera Patron

Hi,

If you are having any dependency then addOption won't work

This is mentioned in below KB and has no workaround yet

Agent Workspace - Glideform "addOption" method doesn't work if the dictionary entry is dependent on ...

regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

Harshal Gawali
Giga Guru

Hi @Musab Rasheed 

In your client script uncheck global checkbox & select view name as "agent_workspace" then it will work in agent workspace view.

Regards,

Harshal.

 

Musab Rasheed
Tera Sage
Tera Sage

So I made this work, Issue was with  var g = g_form.getDisplayBox('u_hr_service').value; as I got to know that getDisplayBox doesn't work in agent workspace so Instead of this I added some code in Script include. @Ankur Bawiskar What you said about addoption is correct but since I'm not directly making fields dependable and setting it through code so this worked. Here is the updated code.

Client Script :

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading && newValue === '') {

        g_form.clearOptions('u_interaction_request_type');
		g_form.setValue('u_interaction_request_type', '');
     //   g_form.addOption('u_interaction_request_type', '', '-- None --');
        return;
    }

    if (newValue != '' && !isLoading) {

        g_form.clearOptions('u_interaction_request_type');
        g_form.setValue('u_interaction_request_type', '');
        var userDetails = new GlideAjax('RequestTypeDetails'); //script include UserDetailsUtil
        userDetails.addParam('sysparm_name', 'getrequestDetails'); //calling function getUserDetails
        userDetails.addParam('sysparm_service', newValue); //passing the user detail as a parameter

        userDetails.getXML(HelloWorldParse);

        function HelloWorldParse(response) {

            var answer = response.responseXML.documentElement.getAttribute("answer");

            var userObj = JSON.parse(answer); //parsing the user object received from getUserDetails function

            //g_form.addOption('u_interaction_request_type', '', '-- None --');

            for (var i = 0; i < userObj.length; i++) {
                g_form.addOption('u_interaction_request_type', userObj[i].value, userObj[i].label); //replace with your field name
            }

        }

    }
	
	else if(newValue == '' && !isLoading)
		{
	
			   g_form.clearOptions('u_interaction_request_type');
			g_form.setValue('u_interaction_request_type', '');
      //  g_form.addOption('u_interaction_request_type', '', '-- None --');
		}

}

 

Script Include:

var RequestTypeDetails = Class.create();
RequestTypeDetails.prototype = Object.extendsObject(AbstractAjaxProcessor, {
	
	getrequestDetails: function(){
		var servicename;
		var optionsArray = [];
    var processer = new JSON();//definition for getUserDetails function, called from client script
		var userObj = {}; //declaring user object
		var gg = this.getParameter('sysparm_service');
		var rr = gg.name;
		var er = new GlideRecord('sn_hr_core_service');
		er.addQuery('sys_id', gg);
		er.query();
		if(er.next())
			{
				servicename = er.name;
			}

		var gr = GlideRecord('sys_choice'); //gliding through the user object
        gr.addQuery('element', 'u_request_type');
        gr.addQuery('dependent_value', servicename);
        gr.query();
        while (gr.next()) {

			optionsArray.push({
        'label' : gr.label.toString(),
        'value' : gr.value.toString()
      });//replace with the field name(s) for your choice list Label and Value
    }
  return processer.encode(optionsArray);

		
		//return JSON.stringify(userObj); //returning the user defined object with details
	},


    type: 'RequestTypeDetails'
});
Please hit like and mark my response as correct if that helps
Regards,
Musab