Changing the Filter of a List Collector Variable via Client Script

	https://www.servicenowguru.com/scripting/client-scripts-scripting/changing-filter-list-collector-variable-client-script/

	If you’ve worked with the Service-now.com service catalog much, you’ve probably realized that there are some differences between the service catalog interface and the traditional forms that are used throughout the rest of the tool. The intention of this is to make the experience a little bit better for end users of the system but it also means that you, as an administrator, have to learn a few new tricks to deal with those differences.

	One of these differences is the List collector variable. It allows the user to select multiple items from a list of items and optionally filter those items to help in their selection. One of the most common requests I see about this type of variable deals with how to handle the filter at the top of the list collector. Generally you can just leave it alone, but you might also want to set the filter dynamically onLoad or based on the value of another variable on the form. Depending on the situation and the number of items in the list collector table you may want to remove the filter portion completely.

List Collector - Filtered

	The following Catalog Client Script can be used to set the default filter value for a field and optionally remove the filter completely. It assumes that your List collector variable is named ‘configuration_items’. By default it sets a filter where ‘name != null’ and ‘sys_class_name (CI type)’ is anything. Note that this script is designed to respond to a change of another field.

	Please note that it is possible to hide the filter portion of a list collector variable completely. This can be accomplished by adding the ‘no_filter’ attribute to the ‘Attributes’ field on the variable form. The client script method may still be useful if you want to show/hide the filter conditionally however. This also works for Service Portal! Just make sure you set the ‘UI type’ field on the client script form to ‘Both’.
function onChange(control, oldValue, newValue, isLoading) {

    //Apply a filter to the list collector variable

    var collectorName = 'configuration_items';

    var filterString = 'name!=NULL^sys_class_nameANYTHING';

    

    //Try Service Portal method

    try{

        var myListCollector = g_list.get(collectorName);

        myListCollector.reset();

        myListCollector.setQuery(filterString);

    }

    //Revert to Service Catalog method

    catch(e){

        //Find and hide the filter header elements (optional)

        //Simple method for items with only one list collector

        //$('ep').select('.row')[0].hide();

        //Advanced method for items with more than one list collector (more prone to upgrade failure)

        //var el = $('container_' + g_form.getControl(collectorName).id).select('div.row')[0].hide();

        

        //Reset the filter query

        window[collectorName + 'g_filter'].reset();

        window[collectorName + 'g_filter'].setQuery(filterString);

        window[collectorName + 'acRequest'](null);

    }

}
	Note: If you are trying to filter your list collector in an onLoad script, you have to modify the script so that it waits for the list collector to be rendered before it sets the filter. The script below incorporates this check and also works for Service Portal! Just make sure you set the ‘UI type’ field on the client script form to ‘Both’.
	`function onLoad() {

//Apply a default filter to the list collector variable

var collectorName = 'configuration_items';

var filterString = 'name!=NULL^sys_class_nameANYTHING';



//Try Service Portal method

try{

    var myListCollector = g_list.get(collectorName);

    myListCollector.reset();

    myListCollector.setQuery(filterString);

}

//Revert to Service Catalog method

catch(e){

    //Hide the list collector until we've set the filter

    g_form.setDisplay(collectorName, false);

    setCollectorFilter();

}



function setCollectorFilter(){

    //Test if the g_filter property is defined on our list collector.

    //If it hasn't rendered yet, wait 100ms and try again.

    if(typeof(window[collectorName + 'g_filter']) == 'undefined'){

        setTimeout(setCollectorFilter, 100);

        return;

    }

    //Find and hide the filter elements (optional)

    //Simple method for items with only one list collector

    //$('ep').select('.row')[0].hide();

    //Advanced method for items with more than one list collector (more prone to upgrade failure)

    //var el = $('container_' + g_form.getControl(collectorName).id).select('div.row')[0].hide();

    

    //Reset the filter query

    window[collectorName + 'g_filter'].reset();

    window[collectorName + 'g_filter'].setQuery(filterString);

    window[collectorName + 'acRequest'](null);

    //Redisplay the list collector variable

    g_form.setDisplay(collectorName, true);

}

}`

By Mark Stanger| January 13th, 2010|Categories: Client scripts|Tags: Catalog client scripts, List collector, Service catalog|119 Comments