Choice Fields are not set on Form while calling GlideAjax from Catalog Client Script

jayapradade
Tera Contributor

Hi , 

 

I have Choice Fields in a catalog item in the service portal. Via changes of other fields( On change Catalog client script ) ,  Glide ajax call is made to fetch the values.

I have made some logging statements in both Glide Ajax and Client Script. In the Backend, values are generated. From the Client side, Values are being Set( I see the Client logs) ,

 

But Those choice values are not being appearing on the fields.

Is there any way that we get these choice type variables values set?

 

Requirement :

On change of a Variable on Catalog Form ,  Set the field value to the value if it exists, otherwise set the label.

 

* the below code works for field types: "list" but not for "choice "

 

here is my catalog client Script :

 

 

function onChange(control, oldValue, newValue, isLoading) {
    var preLoadId = getParameterValue('system_id');


    // If it is loading and a system_id (sys_id of it system inventory entry), load the values
    if (isLoading && preLoadId) {
        g_form.setValue('it_system_inventory_entry', preLoadId);
        loadEntrysById(preLoadId);


    }

    // If the new value is empty, clear values
    if (newValue == '') {
        var fieldNames = JSON.stringify(g_form.getFieldNames());
        for (var i in fieldNames) {
            g_form.clearValue(fieldNames[i]);
            //  g_form.addInfoMessage("New value is empty ");
        }
    }
    // If the new value differentiates from the old value and the new value is not empty, load the values
    else if (newValue != oldValue && newValue != '') {
        loadEntrysById(newValue);
        g_form.addInfoMessage("calling function loadEntrysById");

    }
}

function loadEntrysById(sysId) {
    var ga = new GlideAjax('clientHelper');
    ga.addParam('sysparm_name', 'loadSystemInvetoryEntryGr');
    ga.addParam('system_inventory_sys_id', sysId);
    ga.addParam('fields', JSON.stringify(g_form.getFieldNames()));
    ga.getXML(ajaxResponse);

    function ajaxResponse(response) {
        var answer = JSON.parse(response.responseXML.documentElement.getAttribute('answer'));

        for (var i in answer) {


            // Skip the field if it's 'it_system_inventory_entry'
            if (answer[i].key != 'it_system_inventory_entry') {

                // g_form.setValue(answer[i].key, answer[i].value);

               // Get the value from the response
             var fieldValue = answer[i].value;
             g_form.addInfoMessage("fieldValue  is  " + fieldValue);
                var fieldLabel = g_form.getLabelOf(answer[i].key);
                g_form.addInfoMessage("fieldLabel  is  " + fieldLabel);

           // Set the field value to the value if it exists, otherwise set the label
          if (fieldValue) {
                   g_form.setValue(answer[i].key, fieldValue);
                    g_form.addInfoMessage("field Value Set" + fieldValue);
                   
                   
             } else if (!fieldValue) {
                 g_form.setValue(answer[i].key, fieldLabel);
                     g_form.addInfoMessage("field Label Set" + fieldLabel);
            }


            }
        }
    }
}
/**
 * Retrieves the url parameter by name
 *
 * @Param {String} name - The name of the url parameter
 * @returns {String} The value of the url parameter
 */
function getParameterValue(name) {
    var ret = '';
    var url = top.location.href;
    ret = new URLSearchParams(url).get(name);

    return ret;
}

 

 

My Glide Ajax Function :

 

 

 * @returns {Array} - Array of key (field name) and values (field values)
     */
    loadSystemInvetoryEntryGr: function() {
        var debugMessage = 'The function loadSystemInvetoryEntryGr has been called';
        var ret = [];
        debugMessage += '\n' + this.getParameter('system_inventory_sys_id') + '\n' + this.getParameter('fields');

        try {
            var systemInvetoryEntry = this.getParameter('system_inventory_sys_id');
            var fields = JSON.parse(this.getParameter('fields'));

            var gr = new GlideRecord('cmdb_ci_business_app');
            if (gr.get(systemInvetoryEntry)) {

                for (var i in fields) {
                    // Create an empty object to store the field's information
                    var temp = {};
                    // Assign the field name to the 'key' property of the object
                    temp.key = fields[i];

                    //temp.value = gr.getValue(fields[i]);
                   
                    // Get the field element object from the GlideRecord

                    var fieldElement = gr.getElement(fields[i]);
                    // Check if the field element exists (i.e., the field name is valid)
                    if (fieldElement) {
                        var rawValue = fieldElement.getValue();
                        gs.info('Field: ' + rawValue + ' is the field value in the  record.');
                        var displayValue = fieldElement.getDisplayValue();

                        if (rawValue) {

                            // temp.value = displayValue ? displayValue : rawValue;
                            temp.value = fieldElement.getDisplayValue();
                            gs.info('Field: ' + fields[i] + ', Raw Value: ' + rawValue + ', Display Value: ' + displayValue);
                        }

                    }

                    // Add the 'temp' object to the 'ret' array, which collects results
                    ret.push(temp);
                }
            }
        } catch (ex) {
            this._log.logErr(debugMessage + '\nError: ' + ex);
        }

        debugMessage += '\nReturn: ' + JSON.stringify(ret);
        gs.info(debugMessage);

        return JSON.stringify(ret);
    },

 

 

Any Changes to code here ?

Please help.

 

Regards,

tia 

3 REPLIES 3

Sid_Takali
Kilo Patron
Kilo Patron

Hi @jayapradade Try below code and modify accordingly

Script Include:

loadSystemInvetoryEntryGr: function() {
    var debugMessage = 'The function loadSystemInvetoryEntryGr has been called';
    var ret = [];
    debugMessage += '\n' + this.getParameter('system_inventory_sys_id') + '\n' + this.getParameter('fields');

    try {
        var systemInvetoryEntry = this.getParameter('system_inventory_sys_id');
        var fields = JSON.parse(this.getParameter('fields'));

        var gr = new GlideRecord('cmdb_ci_business_app');
        if (gr.get(systemInvetoryEntry)) {

            for (var i in fields) {
                var temp = {};
                temp.key = fields[i];

                var fieldElement = gr.getElement(fields[i]);
                if (fieldElement) {
                    var rawValue = fieldElement.getValue();
                    var displayValue = fieldElement.getDisplayValue();
                    if (fieldElement.getED() && fieldElement.getED().getTableName() == 'sys_choice') {
                        temp.value = rawValue; // Use the raw value
                    } else {
                        temp.value = displayValue || rawValue; 
                    }
                    gs.info('Field: ' + fields[i] + ', Raw Value: ' + rawValue + ', Display Value: ' + displayValue);
                }
                ret.push(temp);
            }
        }
    } catch (ex) {
        this._log.logErr(debugMessage + '\nError: ' + ex);
    }
    debugMessage += '\nReturn: ' + JSON.stringify(ret);
    gs.info(debugMessage);
    return JSON.stringify(ret);
}

 

Client Script :

function onChange(control, oldValue, newValue, isLoading) {
    var preLoadId = getParameterValue('system_id');

    if (isLoading && preLoadId) {
        g_form.setValue('it_system_inventory_entry', preLoadId);
        loadEntrysById(preLoadId);
    }

    if (newValue == '') {
        var fieldNames = JSON.stringify(g_form.getFieldNames());
        for (var i in fieldNames) {
            g_form.clearValue(fieldNames[i]);
        }
    } else if (newValue != oldValue && newValue != '') {
        loadEntrysById(newValue);
    }
}

function loadEntrysById(sysId) {
    var ga = new GlideAjax('clientHelper');
    ga.addParam('sysparm_name', 'loadSystemInvetoryEntryGr');
    ga.addParam('system_inventory_sys_id', sysId);
    ga.addParam('fields', JSON.stringify(g_form.getFieldNames()));
    ga.getXML(ajaxResponse);

    function ajaxResponse(response) {
        var answer = JSON.parse(response.responseXML.documentElement.getAttribute('answer'));

        for (var i in answer) {
            if (answer[i].key != 'it_system_inventory_entry') {
                var fieldValue = answer[i].value;
                g_form.addInfoMessage("fieldValue is " + fieldValue);
                if (g_form.getControl(answer[i].key).type === 'select') {
                    var choices = g_form.getControl(answer[i].key).options;
                    var isChoiceValid = choices.some(option => option.value == fieldValue);
                    
                    if (isChoiceValid) {
                        g_form.setValue(answer[i].key, fieldValue);
                        g_form.addInfoMessage("field Value Set to " + fieldValue);
                    } else {
                        g_form.addInfoMessage("Invalid choice value: " + fieldValue);
                    }
                } else {
                    g_form.setValue(answer[i].key, fieldValue);
                    g_form.addInfoMessage("field Value Set to " + fieldValue);
                }
            }
        }
    }
}

 

Hi @Sid_Takali ,

I am getting below error in client script .

 

jayapradade_0-1725444203325.png

 

@Sid_Takali 

 

Added the Screenshot for your reference . The field business criticality is choice, And when i test in logs , that value is set. but it is not appearing on the form while the form loads.
all Choice fields on this form has same issue.