- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-11-2022 10:53 AM - edited 10-11-2022 10:59 AM
I have Category and subcategory fields on a Catalog item, both mandatory. Now i want to make the subcategory non-mandatory if it has no dependent choices.
Can someone help me How to achieve this?
In one of the posts i found the below on change client script on Category which is not working for me:
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
if (isLoading || newValue === '') {
return;
}
if (newValue !='') {
var field = g_form.getControl('subcategory');
var options = field.options.length;
if(options==0){
g_form.setMandatory(field, false);
}
}}
Solved! Go to Solution.
- Labels:
-
Request Management
-
Service Catalog
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-11-2022 12:48 PM
If you alert on options you'll see that the onChange script is running before the ref_qual_elements / reference qualifier finishes, so it contains the number of subcategories for the previous category. I was also seeing 1, not 0, when -- None -- was the only choice, so here's a script that works to wait a bit then set Mandatory or not:
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
setTimeout(function() {
setMand();
}, 1500);
}
function setMand() {
var field = g_form.getControl('subcategory');
var options = field.options.length;
if (options==1) {
g_form.setMandatory('subcategory', false);
} else {
g_form.setMandatory('subcategory', true);
}
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-11-2022 12:48 PM
If you alert on options you'll see that the onChange script is running before the ref_qual_elements / reference qualifier finishes, so it contains the number of subcategories for the previous category. I was also seeing 1, not 0, when -- None -- was the only choice, so here's a script that works to wait a bit then set Mandatory or not:
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
setTimeout(function() {
setMand();
}, 1500);
}
function setMand() {
var field = g_form.getControl('subcategory');
var options = field.options.length;
if (options==1) {
g_form.setMandatory('subcategory', false);
} else {
g_form.setMandatory('subcategory', true);
}
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-26-2022 03:50 AM
hi Brad,
this script seems not to be working on portal, although the UI type is selected as ALL
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-26-2022 06:50 AM - edited 10-26-2022 06:57 AM
can you please help with the script, since below is not working on portal
@Brad Bowman
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-26-2022 12:38 PM
g_form.getControl no longer works in Portal. I don't see a viable replacement, so a different approach may be necessary. You can change subcategory to a select box with no choice table or choices, then onChange of Category have a client script call a GlideAjax Script Include that reads the choice table and returns a JSON of the choices. The advantage to this is that if there are no dependent choices, the client script would recognize/interpret this as setting the variable non-mandatory. This works in both the native UI and Portal when subcategory is a select box:
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
g_form.clearOptions('subcategory');
var ga = new GlideAjax('ChoiceLookup');
ga.addParam('sysparm_name', 'getChoices');
ga.addParam('sysparm_table', 'incident');
ga.addParam('sysparm_dependent', newValue);
ga.addParam('sysparm_element', 'subcategory');
ga.getXML(setValue);
function setValue(response) {
var answer = JSON.parse(response.responseXML.documentElement.getAttribute("answer"));
g_form.addOption('subcategory','',' -- None --');
if (answer.length == 0) {
g_form.setMandatory('subcategory', false);
} else {
g_form.setMandatory('subcategory', true);
for(var i=0;i<answer.length;i++) {
g_form.addOption('subcategory',answer[i].value,answer[i].label);
}
}
}
}
The Client callable Script Include:
var ChoiceLookup = Class.create();
ChoiceLookup.prototype = Object.extendsObject(AbstractAjaxProcessor, {
getChoices : function(){
var optionsArray = [];
var json = new JSON();
var tablename = this.getParameter('sysparm_table');
var dependent = this.getParameter('sysparm_dependent');
var element = this.getParameter('sysparm_element');
var gr = new GlideRecord('sys_choice');
gr.addQuery('name', tablename);
gr.addQuery('dependent_value', dependent);
gr.addQuery('element', element);
gr.addQuery('inactive', false);
gr.query();
while(gr.next()) {
optionsArray.push({
'label' : gr.label.toString(),
'value' : gr.value.toString()
});
}
return json.encode(optionsArray);
},
type: 'ChoiceLookup'
});