- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-31-2024 01:11 PM - edited 01-31-2024 01:43 PM
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.
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-31-2024 09:13 PM
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);
}
});
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-31-2024 04:29 PM
@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");
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-31-2024 04:31 PM
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-31-2024 04:36 PM - edited 01-31-2024 04:37 PM
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-31-2024 04:39 PM
yes everything is fine as same is running perfectly in native view. this issue is on portal view.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-31-2024 04:46 PM - edited 01-31-2024 04:47 PM
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)