Dynamic Dropdown Menu

cc11
Tera Contributor

I have three fields as shows in the screenshot below,

find_real_file.png

1 User selects Category = 'Software'

2 On clicking Type dropdown, we want to query a Table called 'Inventory' (where we have Category, Type & Subtype columns data) and pull matching Type values from there.

But here is another thing - while displaying Type values, we need to transform them by appending Type & Subtype together with a dot(.) and making them lowercase.

So the Type dropdown should show the values in this format ->   type.subtype

Is this possible?

Thank you,

Yogesh

1 ACCEPTED SOLUTION

Hi Yogesh,



Please check below code with few modifications.



********** Script Include *****************


var DisplayTypeMenu = Class.create();


DisplayTypeMenu.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {


getListDetails : function() {


var list = [];


var order = this.getParameter('sysparm_category');


var gr = new GlideRecord('x_137749_test_menuvalue'); // Table name was wrong, it had x_137749_test_menuvalues (extra s) instead of x_137749_test_menuvalue


gr.addQuery('localmenuname', order); // Field name was wrong, filed backend name is localmenuname


gr.query();


while(gr.next())


{


var item_val = gr.getDisplayValue('menuvalue');


list.push(item_val);


}


return JSON.stringify(list);


},


type: 'DisplayTypeMenu'


});



*********** Client Script ******************


function onChange(control, oldValue, newValue, isLoading, isTemplate) {


if (isLoading || newValue === '') {


return;


}


//g_form.clearOptions('type'); //change the field name with dependent field name


var listDetails = new GlideAjax("DisplayTypeMenu");


listDetails.addParam("sysparm_name", "getListDetails");


listDetails.addParam("sysparm_category", newValue);


listDetails.getXML(ajaxResponse);


function ajaxResponse(serverResponse) {


var answer = serverResponse.responseXML.documentElement.getAttribute("answer");


var myObj = JSON.parse(answer);


alert(myObj);


// if(myObj.length > 0)


// {


// for(var i = 0; i<myObj.length; i++)


// {


// //g_form.addOption('type', myObj[i].toLowerCase(), myObj[i].toLowerCase()); //Replace the field name where you have to assign the value


// alert(myObj[i].toLowerCase());


// }


// }


}


}



Result:


find_real_file.png


find_real_file.png


View solution in original post

39 REPLIES 39

cc11
Tera Contributor

I created client script below(screenshot 2). The intent was to build simple menu values for 'Type' field when 'Category' field was changed. But I got error error (from screenshot 1)



screenshot 1


find_real_file.png





screenshot 2


find_real_file.png


Hi Yogesh,



I tried like below code and it worked, you might need to make some changes to meet your requirements.



onChange Client Script:


function onChange(control, oldValue, newValue, isLoading, isTemplate) {


if (isLoading || newValue === '') {


return;


}


g_form.clearOptions('u_new_choice'); //change the field name with dependent field name


var listDetails = new GlideAjax("DisplayTypeList");


listDetails.addParam("sysparm_name", "getListDetails");


listDetails.addParam("sysparm_order", newValue);


listDetails.getXML(ajaxResponse);


function ajaxResponse(serverResponse) {


var answer = serverResponse.responseXML.documentElement.getAttribute("answer");


var myObj = JSON.parse(answer);


if(myObj.length > 0)


{


for(var i = 0; i<myObj.length; i++)


{


g_form.addOption('u_new_choice', myObj[i].toLowerCase(), myObj[i].toLowerCase()); //Replace the field name where you have to assign the value


}


}


}


}



Client Callable Script Include:


var DisplayTypeList = Class.create();


DisplayTypeList.prototype = Object.extendsObject(AbstractAjaxProcessor, {


getListDetails : function() {


var list = [];


var gr = new GlideRecord('sys_choice'); //Replace with your table name


var order = this.getParameter('sysparm_order');


gr.addQuery('element', order); //Add your queries here


gr.query();


while(gr.next())


{


var item_val = gr.getValue('value') + '.' + gr.getValue('label'); // Replace the field names from where you have to fetch the value


list.push(item_val);


}


return JSON.stringify(list);


},


type: 'DisplayTypeList'


});


Just want add -


In my case, Type field is of type 'Reference'.


Does it need to be of type 'Choice'?



Thank you,


Yogesh


cc11
Tera Contributor

I tried by making 'Type' a Choice field. It doesnt seem to be working


On reference field this will work, you need to have it as choice field, let me know what code are you using?



In sysparm_order you should pass the category value, sysparm_order is a variable which will be used in script include.