List collector not working in the Native UI.

JLeong
Mega Sage

Hi All,

I have the below client script to move list collector values from left to right. It is working in the portal but in the native UI the filter is not working, it is transferring everything from left to right. Could someone please check and let me know how to fix it.

Thanks in advance.

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

g_form.clearValue('sftp_sites_to_update');

if (newValue !== '') {
var parm = '';
if (window === null)
parm = 'portal';
else
parm = 'native';
}

var accntsList = 'sftp_sites_to_update'; // variable name of the List Collector
var filterString = 'u_active=true^owned_by=' + newValue;
alert('filterString - ' + filterString);
// filter list collector to only show the accounts owned by the current user (left side)
// reset the filter (left side) based on the above filterstring

if (parm == 'portal') {
var myListCollector = g_list.get(accntsList);
myListCollector.reset();
myListCollector.setQuery(filterString);
g_form.hideFieldMsg('sftp_current_owner', true);
g_form.showFieldMsg('sftp_current_owner', 'Please wait... searching for SFTP Account(s)...');
} else {
window[accntsList + 'g_filter'].reset();
window[accntsList + 'g_filter'].setQuery(filterString);
window[accntsList + 'acRequest'](null);
g_form.hideFieldMsg('sftp_current_owner', true);
g_form.showFieldMsg('sftp_current_owner', 'Please wait... searching for SFTP Account(s)...');
}

//now populate the Service Portal variable
if (parm == 'portal') {
var ajax = new GlideAjax('SFTPutil');
ajax.addParam('sysparm_name', 'getSFTP_Accnts');
ajax.addParam('sysparm_owner', newValue);
ajax.getXML(populateValues);

} else {
var leftBucket = gel(accntsList + '_select_0');
var rightBucket = gel(accntsList + '_select_1');
var selectedOptions = leftBucket.options;

//Get an array of all option IDs to move
var selectedIDs = new Array();
alert('selectedIDs ' + selectedIDs);
var index = 0;
for (var i = 0; i < selectedOptions.length; i++) {
selectedIDs[index] = i;
index++;
}
rightBucket.options.length = '0';
moveSelectedOptions(selectedIDs, leftBucket, rightBucket);
sortSelect(rightBucket);
g_form.hideFieldMsg('sftp_current_owner', true);
if (selectedIDs == 0) {
g_form.showFieldMsg('sftp_current_owner', 'No SFTP Account(s) found!');
}
}

function populateValues(response) {
g_form.hideFieldMsg('sftp_current_owner', true);
var answer = response.responseXML.documentElement.getAttribute("answer");
//alert('answer = ' + answer);

if (answer == '||') {
g_form.showFieldMsg('sftp_current_owner', 'No SFTP Account(s) found!');
}
var arr = answer.split('||');
//arr[1] has the sys_id of the accountID
//arr[0] has the display name of the accountID
g_form.setValue('sftp_sites_to_update', arr[1], arr[0]);
}
}

1 ACCEPTED SOLUTION

Ankur Bawiskar
Tera Patron
Tera Patron

Hi,

you can refer below blog for help for similar requirement

https://community.servicenow.com/community?id=community_blog&sys_id=a60c397edb04dc1c190dfb24399619b1

Client Script: Ensure "Isolate Script" field is set to false for onChange Catalog Client Script on that Variable

  1. The field Isolate Script is not present on the form view
  2. From the list layout it can be added and set to false
  3. By default it is true

Regards
Ankur

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

View solution in original post

10 REPLIES 10

Joshwa Antony S
Mega Guru

Hi,

You don't need to use gel (DOM) to set/clear List Collector value

Example:

 

var sysIDS = '1234,23456,34567,45678'

g_form.setValue("LISTCOLLECTORVARIABLENAME",sysIDS )

This will set the list collector value [pushing values from left slush bucket to right bucket]

g_form.clearValue("LISTCOLLECTORVARIABLENAME")

This will clear the list collector value [pushing values from right slush bucket to left bucket]

Make sure you set the "Isolate Script" to false [you can find this list of your script] when you using window objects and DOM techniques (gel, document.get, $, $j)

 

Regards,

JAS

Ankur Bawiskar
Tera Patron
Tera Patron

@JLeong 

Let me know if that answered your question.

If so, please mark appropriate response as correct & helpful so that this thread can be closed and others can be benefited by this.

Regards
Ankur

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

Hi Ankur,

Thanks for responding to my post.

I replaced my script and followed yours. But this time, the values are not going to the right bucket. Same issue in the portal.

I need to check further. Or maybe you can spot the issue quickly.

Thanks,

Jocelyn

 

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

g_form.clearValue('sftp_sites_to_update');

if (newValue !== '') {
var parm = '';
if (window === null)
parm = 'portal';
else
parm = 'native';
}

var ajax = new GlideAjax('SFTPutil');
ajax.addParam('sysparm_name', 'getSFTP_Accnts');
ajax.addParam('sysparm_owner', newValue);
ajax.addParam('sysparm_view', parm);
ajax.getXML(populateValues);

function populateValues(response) {
g_form.hideFieldMsg('sftp_current_owner', true);
var answer = response.responseXML.documentElement.getAttribute("answer");
//alert('answer = ' + answer);
var arr = answer.split('||');

if (window === null) {
g_form.setValue('sftp_sites_to_update', arr[0]); // Mobile/Portal Compatible
//g_form.setValue('', arr[1], arr[0]);
} else {
addItemstoList('sftp_sites_to_update', answer); // Native Compatible
}
}

function addItemstoList(listCollector, accountList) {

var parser = JSON.parse(accountList);
var arrSysId = [];
var arrName = [];
for (var i = 0; i < parser.length; i++) {
arrName.push(parser[i].name.toString());
arrSysId.push(parser[i].sys_id.toString());
}

var varName = listCollector; // variable name of the List Collector
var leftBucket = gel(varName + '_select_0');
var rightBucket = gel(varName + '_select_1');
var rightOptions = rightBucket.options;
var rightIDs = [];

//Remove --None--
for (var k = 0; k < rightOptions.length; k++) {
var value = rightOptions[k].innerHTML;
if (value == '--None--') {
rightBucket.remove(0);
}
}

// Add new options
if (arrName.length > 0) {
var myCIArray = arrName.toString().split(',');
for (var j = 0; j < myCIArray.length; j++) {
addOption(rightBucket, arrSysId[j], myCIArray[j]);
sortSelect(rightBucket);
leftBucket.onchange();
}
}

// sort the buckets
sortSelect(rightBucket);
}
}

========script include=============================

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

getSFTP_Accnts: function() {
//var accntsSYSid = [];
var listAccnts = [];
var acctOwner = this.getParameter('sysparm_owner');
gs.log('acctOwner = ' + acctOwner);
//var parm = this.getParameter(sysparm_view);

var jsonArr = [];

var sftp = new GlideRecord('u_cmdb_ci_web_service_account');
sftp.addQuery('owned_by', acctOwner);
sftp.query();
while (sftp.next()) {
if(parm == 'portal'){
listAccnts.push(sftp.u_account_id.toString());
} else if(parm == 'native'){
var obj = {};
obj.name = sftp.u_account_id.toString();
obj.sys_id = sftp.sys_id.toString();
jsonArr.push(obj);
}
}
if(parm == 'portal')
return listGroup.toString();
else
return JSON.stringify(jsonArr);
},

type: 'SFTPutil'
});

===================================

find_real_file.png

Hi Ankur,

I found the issue. I forgot to uncomment 

var parm = this.getParameter('sysparm_view');

So the native UI is working perfectly, but the portal shows and error:

I will check tomorrow morning.

Thanks!

 

 

Hi Ankur,

I found the issue. I forgot to uncomment 

var parm = this.getParameter('sysparm_view');

So the native UI is working perfectly, but the portal shows and error:

I will check tomorrow morning.

Thanks!