List collector value not removed from script

Ruchi Kumari1
Tera Expert

Hi,

I am trying to remove values from list collector through onsubmit client script.
I have a script include which returns what values are to be removed from the list collector on submit. I tried below script but no luck. I am getting the expected alerts. What am i missing ?

var mrvsValues = g_form.getValue('list_the_existing_machine_name');
    var mrvsSelectedUsers = [];
    var rows = JSON.parse(mrvsValues);
    for (var i = 0; i < rows.length; i++) {
        var val = rows[i].req_for;
        mrvsSelectedUsers.push(val.toString());
    }

    var userListCollector = g_form.getValue('requested_for');

    var listArr = userListCollector.split(',');
    alert('listArr  ' + listArr); //Getting expected alert

    var gaGetUserDetails = new GlideAjax('GetUserDetails');
    gaGetUserDetails.addParam('sysparm_name', 'getUserDetails');
    gaGetUserDetails.addParam('sysparm_listusers', listArr);
    gaGetUserDetails.addParam('sysparm_mrvsusers', mrvsSelectedUsers);
    gaGetUserDetails.getXMLAnswer(parseAnswer);

    function parseAnswer(response) {
         //returned value should be array of sysids of user to be removed from list
        var answer = response;
        var test = answer.split(',');
        alert('anser1 = ' + test); ///getting expected alert
        //if (answer.length > 0) {
        for (var a = 0; a < test.length; a++) {
            var valueToRemove = test[a];
            alert('Value to remove ' + valueToRemove);
            var index = listArr.indexOf(valueToRemove);
            alert('index ' + index); //getting expected index value
            if (index !== -1) { 
                listArr.splice(index, 1); //remove value
            }
        }
        alert('listArr100  ' + listArr); //getting expected value
        g_form.setValue('requested_for', listArr.join(','));
        return false; //This is false only for testing purpose.

 

There is no change in the selected values before / after clicking submit.

12 REPLIES 12

Community Alums
Not applicable

The use of asynchronous javascript in an onSubmit client script can be quite tricky.  You will actually need to submit the form a second time with your client script.

 

Here is a KB article on the topic that shows the code you will need - KB0783579 

 

Feel free to follow up if you get stuck.

Hi @Community Alums , Tried this as well but no luck. Here's what i tried :

var actionName = g_form.getActionName();
var mrvsValues = g_form.getValue('list_the_existing_machine_name');
var mrvsSelectedUsers = [];
var rows = JSON.parse(mrvsValues);
for (var i = 0; i < rows.length; i++) {
    var val = rows[i].req_for;
     mrvsSelectedUsers.push(val.toString());
    }
var userListCollector = g_form.getValue('requested_for');
var listArr = userListCollector.split(',');

var gaGetUserDetails = new GlideAjax('GetUserDetails');
gaGetUserDetails.addParam('sysparm_name', 'getUserDetails');
gaGetUserDetails.addParam('sysparm_listusers', listArr);
gaGetUserDetails.addParam('sysparm_mrvsusers', mrvsSelectedUsers);
gaGetUserDetails.getXMLAnswer(parseAnswer);

function parseAnswer(response) {
        ///returned value should be array of sysids of user to be removed from list
        var answer = response;
        var test = answer.split(',');
       
        //if (answer.length > 0) {
        for (var a = 0; a < test.length; a++) {
            var valueToRemove = test[a];
            alert('Value to remove ' + valueToRemove);
            var index = listArr.indexOf(valueToRemove);
            alert('index ' + index);
            if (index !== -1) { //valueToRemove was found in array
                listArr.splice(index, 1); //remove array member from this array
            }
        }
     
       g_form.setValue('requested_for', listArr.join(','));
g_form.submit(actionName);
       //g_form.orderNow();


    }

 

I was getting this error message : "The g_form.submit function has no meaning on a catlog item. Perhaps you mean g_form.addToCart() or g_form.orderNow() instead ". Tried with orderNow() as well but no luck.

 

Rafael Batistot
Tera Sage

Hi @Ruchi Kumari1,

 

Try this solution and Ken know if help you 

 

 

var mrvsValues = g_form.getValue('list_the_existing_machine_name');
var mrvsSelectedUsers = [];

if (mrvsValues) {
var rows = JSON.parse(mrvsValues);
for (var i = 0; i < rows.length; i++) {
var val = rows[i].req_for;
if (val) {
mrvsSelectedUsers.push(val.toString());
}
}
}

var userListCollector = g_form.getValue('requested_for') || '';
var listArr = userListCollector ? userListCollector.split(',') : [];
alert('listArr: ' + listArr);

var gaGetUserDetails = new GlideAjax('GetUserDetails');
gaGetUserDetails.addParam('sysparm_name', 'getUserDetails');
gaGetUserDetails.addParam('sysparm_listusers', listArr.join(','));
gaGetUserDetails.addParam('sysparm_mrvsusers', mrvsSelectedUsers.join(','));
gaGetUserDetails.getXMLAnswer(parseAnswer);

function parseAnswer(response) {
var answer = response;
var usersToRemove = answer.split(',');
alert('Users to remove: ' + usersToRemove);

listArr = listArr.filter(function(userId) {
return usersToRemove.indexOf(userId) === -1;
});

alert('Updated listArr: ' + listArr);
g_form.setValue('requested_for', listArr.join(','));
}

 

 

If you’re placing this script inside an onSubmit Client Script, make sure of the following:

 

  • Set Is Async = true in the script configuration. This is required because you’re using GlideAjax, which runs asynchronously.
  • Ensure the GlideAjax call includes a valid callback function (which you already have with parseAnswer).
    Otherwise, the form may submit before the GlideAjax call finishes, which would prevent your list from being updated in time.

 

 

 

Community Alums
Not applicable

onSubmit client scripts must return true or false synchronously to let the form know if it should proceed.

But GlideAjax is asynchronous — it finishes after the script already returned, so your g_form.setValue() runs too late to affect the submission.

That’s why your values don’t update on submit.

try this scripts:

 

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading) return;

    var listArr = newValue.split(',');
    var mrvsValues = g_form.getValue('list_the_existing_machine_name');
    var mrvsSelectedUsers = JSON.parse(mrvsValues).map(row => row.req_for.toString());

    var ga = new GlideAjax('GetUserDetails');
    ga.addParam('sysparm_name', 'getUserDetails');
    ga.addParam('sysparm_listusers', listArr);
    ga.addParam('sysparm_mrvsusers', mrvsSelectedUsers);
    ga.getXMLAnswer(function(answer) {
        var toRemove = answer.split(',');
        for (var i = 0; i < toRemove.length; i++) {
            var index = listArr.indexOf(toRemove[i]);
            if (index !== -1) listArr.splice(index, 1);
        }
        g_form.setValue('requested_for', listArr.join(','));
    });
}