Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Multiple responses from Script Include to one Client Script

Sinae
Tera Contributor

Hello,

I am trying to get multiple responses from Script Include to one Client Script via GlideAjax.

But something is wrong with my code.....:(

 

Client Script

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

var varSkill = [];
var varGroup = [];
var gaFilter = new GlideAjax('xxx.CatalogUtil');
gaFilter.addParam('sysparm_name', 'getFilterBySkillsGroups');
gaFilter.addParam('sysparm_xxx_skill_ids', g_form.getValue('skills'));
gaFilter.addParam('sysparm_xxx_group_ids', g_form.getValue('groups'));
gaFilter.addParam('sysparm_variable', g_form.getValue('location'));
gaFilter.getXML(responseAjax);

function responseAjax(response) {
var answer = response.responseXML.documentElement.getAttribute('response');
if (answer) {
var getAgentGroupIds = answer[0].getAttribute('xxxGroupIds').toString();
varSkill = getxxxGroupIds;
var getAgentSkillIds = answer[0].getAttribute('xxxSkillIds').toString();
varGroup = getxxxSkillIds;
g_form.setValue('filter', varSkill + varGroup);
} else {
g_form.setValue('filter', '');
}
}

 

Script Include

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

getFilterBySkillsGroups: function() {

var listSkills =[];
var listGroups =[];

var xxxSkillIds = this.getParameter('sysparm_xxx_skill_ids');
var xxxGroupIds = this.getParameter('sysparm_xxx_group_ids');

var grHasSkills = new GlideRecord('sys_user_has_skill');
grHasSkills.addQuery('user.company', 'STARTSWITH', this.getParameter('sysparm_variable'));
grHasSkills.addQuery('skill', 'IN', xxxSkillIds);
grHasSkills.query();
while (grHasSkills.next()) {
listSkills.push(grHasSkills.user.sys_id);
}

var grInGroup = new GlideRecord('x_xxx_groups');
grInGroup.addQuery('u_xxx_group.sys_id', 'IN', xxxGroupIds);
grInGroup.query();
while (grInGroup.next()) {
listGroups.push(grInGroup.u_xxx_agent.sys_id);
}

var response = this.newItem('response');
response.setAttribute('xxxGroupIds', listGroups.toString());
response.setAttribute('xxxSkillIds', listSkills.toString());
return answer;
},

});

 

What is wrong with it?

 

Thanks a lot,

1 ACCEPTED SOLUTION

DUGGI
Giga Guru

@Sinae 

There are a few issues with the code provided:

  1. In the client script, the responseAjax function should be defined outside the onChange function.
  2. In the client script, the varSkill and varGroup variables should be concatenated with a comma, not a plus sign, to separate the values.
  3. In the script include, the return answer; statement should be return response; instead.

Here's the updated code:

Client Script

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

    var varSkill = [];
    var varGroup = [];
    var gaFilter = new GlideAjax('xxx.CatalogUtil');
    gaFilter.addParam('sysparm_name', 'getFilterBySkillsGroups');
    gaFilter.addParam('sysparm_xxx_skill_ids', g_form.getValue('skills'));
    gaFilter.addParam('sysparm_xxx_group_ids', g_form.getValue('groups'));
    gaFilter.addParam('sysparm_variable', g_form.getValue('location'));
    gaFilter.getXML(responseAjax);
}

function responseAjax(response) {
    var answer = response.responseXML.documentElement.getAttribute('response');
    if (answer) {
        var getAgentGroupIds = answer[0].getAttribute('xxxGroupIds').toString();
        varSkill = getAgentGroupIds;
        var getAgentSkillIds = answer[0].getAttribute('xxxSkillIds').toString();
        varGroup = getAgentSkillIds;
        g_form.setValue('filter', varSkill + ',' + varGroup);
    } else {
        g_form.setValue('filter', '');
    }
}

Script Include

javascriptCopy code
var CatalogUtil = Class.create();
CatalogUtil.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {

    getFilterBySkillsGroups: function() {

        var listSkills =[];
        var listGroups =[];

        var xxxSkillIds = this.getParameter('sysparm_xxx_skill_ids');
        var xxxGroupIds = this.getParameter('sysparm_xxx_group_ids');

        var grHasSkills = new GlideRecord('sys_user_has_skill');
        grHasSkills.addQuery('user.company', 'STARTSWITH', this.getParameter('sysparm_variable'));
        grHasSkills.addQuery('skill', 'IN', xxxSkillIds);
        grHasSkills.query();
        while (grHasSkills.next()) {
            listSkills.push(grHasSkills.user.sys_id);
        }

        var grInGroup = new GlideRecord('x_xxx_groups');
        grInGroup.addQuery('u_xxx_group.sys_id', 'IN', xxxGroupIds);
        grInGroup.query();
        while (grInGroup.next()) {
            listGroups.push(grInGroup.u_xxx_agent.sys_id);
        }

        var response = this.newItem('response');
        response.setAttribute('xxxGroupIds', listGroups.toString());
        response.setAttribute('xxxSkillIds', listSkills.toString());
        return response;
    },

});

 

View solution in original post

1 REPLY 1

DUGGI
Giga Guru

@Sinae 

There are a few issues with the code provided:

  1. In the client script, the responseAjax function should be defined outside the onChange function.
  2. In the client script, the varSkill and varGroup variables should be concatenated with a comma, not a plus sign, to separate the values.
  3. In the script include, the return answer; statement should be return response; instead.

Here's the updated code:

Client Script

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

    var varSkill = [];
    var varGroup = [];
    var gaFilter = new GlideAjax('xxx.CatalogUtil');
    gaFilter.addParam('sysparm_name', 'getFilterBySkillsGroups');
    gaFilter.addParam('sysparm_xxx_skill_ids', g_form.getValue('skills'));
    gaFilter.addParam('sysparm_xxx_group_ids', g_form.getValue('groups'));
    gaFilter.addParam('sysparm_variable', g_form.getValue('location'));
    gaFilter.getXML(responseAjax);
}

function responseAjax(response) {
    var answer = response.responseXML.documentElement.getAttribute('response');
    if (answer) {
        var getAgentGroupIds = answer[0].getAttribute('xxxGroupIds').toString();
        varSkill = getAgentGroupIds;
        var getAgentSkillIds = answer[0].getAttribute('xxxSkillIds').toString();
        varGroup = getAgentSkillIds;
        g_form.setValue('filter', varSkill + ',' + varGroup);
    } else {
        g_form.setValue('filter', '');
    }
}

Script Include

javascriptCopy code
var CatalogUtil = Class.create();
CatalogUtil.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {

    getFilterBySkillsGroups: function() {

        var listSkills =[];
        var listGroups =[];

        var xxxSkillIds = this.getParameter('sysparm_xxx_skill_ids');
        var xxxGroupIds = this.getParameter('sysparm_xxx_group_ids');

        var grHasSkills = new GlideRecord('sys_user_has_skill');
        grHasSkills.addQuery('user.company', 'STARTSWITH', this.getParameter('sysparm_variable'));
        grHasSkills.addQuery('skill', 'IN', xxxSkillIds);
        grHasSkills.query();
        while (grHasSkills.next()) {
            listSkills.push(grHasSkills.user.sys_id);
        }

        var grInGroup = new GlideRecord('x_xxx_groups');
        grInGroup.addQuery('u_xxx_group.sys_id', 'IN', xxxGroupIds);
        grInGroup.query();
        while (grInGroup.next()) {
            listGroups.push(grInGroup.u_xxx_agent.sys_id);
        }

        var response = this.newItem('response');
        response.setAttribute('xxxGroupIds', listGroups.toString());
        response.setAttribute('xxxSkillIds', listSkills.toString());
        return response;
    },

});