Populate reference field from list collector

Hervi
Tera Contributor

Hi Team,

 

I am working on portal end. I am trying to populate type field with my reference value when list collector "Parent" contains RITM type tickets.

 

 

 

 

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    var list = g_form.getDisplayValue('parent').toString();
    var array = list.split(',');
	alert("list is " +array);
    for (var i = 0; i < array.length; i++) {
        if (array[i].includes('RITM')) {
            g_form.setValue('type', 'Enhancement::Planned Change');
			alert("set type field for ritm");
           // return;
        } else if (array[i].includes('PRB')) {
            g_form.setValue('type', 'HI22');
           // return;
        }
    }


}

 

 

 

 Can you please let me know what is the issue with this script? i am writing an onchange catalog client script. 

@Ankur Bawiskar 

@Tai Vu 

@Anil Lande 

 

1 ACCEPTED SOLUTION

Hi @Hervi 

I've checked around your script, you can find my observation below.

 

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    var list = g_form.getDisplayValue('parent').toString(); //getDisplayValue won't work in servicecatalog_cat_item_view within platform view.
    var array = list.split(',');
    for (var i = 0; i < 1; i++) { //loop only the first element => i < array.length
        if (array[i].includes('RITM')) {
            var b = g_form.setValue('type', '152c8359375293402c4a005a54990e56', 'Enhancement::Planned Change'); 
            break; //not required
        } else if (array[i].includes("PRB")) {
            g_form.setValue('type', 'HI22');
            break; //not required
        }

		//What if the parnet list collector contains both RITM and PRB?
    }

}

 

 

You can consider to pass the list collector to an Ajax script include to do your validation, then return the Type accordingly.

Sample

Script Include

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

    getTypeByTaskID: function() {
        var taskIDs = this.getParameter('sysparm_parent');
        var classes = [];
        var grTask = new GlideRecord('task');
        grTask.addQuery('sys_id', 'IN', taskIDs);
        grTask.query();
        while (grTask.next()) {
            var className = grTask.getRecordClassName();
            if (classes.indexOf(className) === -1) {
                classes.push(className);
            }
        }

		var type = {};
		if(classes.indexOf('sc_req_item') >= 0){
			//try to avoid hard-coding by storing sys_id in a system property
			type.sys_id = '152c8359375293402c4a005a54990e56'; 
			type.name = 'Enhancement::Planned Change';
		}
		if(classes.indexOf('problem') >= 0){
			//try to avoid hard-coding by storing sys_id in a system property
			type.sys_id = '152c8359375293402c4a005a54990e52'; //replace the HI22's sys_id record
			type.name = 'HI22';
		}

		//What if the parent list collector contains both RITM and PRB?
		return JSON.stringify(type);

    },

    type: 'CLCatalogItemUtilAJAX'
});

 

Client Script

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

	var ga = new GlideAjax('CLCatalogItemUtilAJAX');
	ga.addParam('sysparm_name', 'getTypeByTaskID');
	ga.addParam('sysparm_parent', newValue);
	ga.getXMLAnswer(function(answer){
		var type = JSON.parse(answer);
		if(type && type.sys_id != undefined){
			g_form.setValue('type', type.sys_id, type.name);
		}
	});

}

 

Just keep in mind that there's a scenario the parent can have both RITM and PRB because it's a list collector.
 
Cheers,
Tai Vu

View solution in original post

19 REPLIES 19


@Hervi wrote:

i have captured setvalue in a variable and alert shows undefined


Can you clarify what you mean by this? Are you saying that all of these alerts in your script show undefined?:

alert("list is " +array);

 

alert("reference value is " +array[i]);

 

alert("before setting");

 

alert("set type field for ritm");

 

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    var list = g_form.getDisplayValue('parent').toString();
    var array = list.split(',');
    alert("list is " + array);
    for (var i = 0; i < 1; i++) {
        alert("reference value is " + array[i]);
        if (array[i].includes('RITM')) {
            alert("before setting");
            var b = g_form.setValue('type', '152c8359375293402c4a005a54990e56', 'Enhancement::Planned Change');
            alert("set type field for ritm" + b);
            break;
        } else if (array[i].includes("PRB")) {
            g_form.setValue('type', 'HI22');
            break;
        }
    }


}

alert on variable b is undefined. rest all alerts are working fine

Thanks for clarifying. Yes, that's expected that `b` will be `undefined`, as `setValue()` doesn't return anything. So you're saying that you see "before setting" appear? Are you sure that the sys_id you've specified is valid and belongs to the table you've specified? Perhaps also check other client-scripts or UI policies in your catalog item and make sure that they aren't clearing the type field once set.

yes everything is fine as same is running perfectly in native view. this issue is on portal view.

The script looks fine to me (barring the b variable). Make sure that the same scripts (not just this script, but other scripts for this catalog item) and UI policies are running on the portal view that are running in the native view (for client scripts that means ensuring the the UI Type field is set correctly to run on both native and portal and for UI policies that means checking the "Scripts" tab and ensuring the Run scripts in UI type field is set correctly)