How to execute onload function in g:ui_reference tag

SANDEEP28
Mega Sage

I am working on custom filter on reports using dynamic content block. I wrote below jelly scripts and its working fine.  Initially when dashboard is loading, its taking lot of time to populate data in reports as count is huge in the kb_use table and it will definitely cause performance issue in production.

 

So I thought of adding default article in reference field and showing the result for that particular article itself while loading.  I did set the default value but articleFilterChange() function is not getting called because I am not changing it on form, I am defaulting value.

 

Is there any way where we add the function on load ?

 

<g:ui_reference name="group" id="group" table="kb_knowledge" value="aa9f6766874df9107926c8090cbb35d7" displayvalue="KB0077337" query="active=true" completer="AJAXTableCompleter" ng-model="group" columns="number;short_description" onchange="articleFilterChange()"/>

 

 

<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
<script>
    var my_dashboardMessageHandler = new DashboardMessageHandler("get_article_numbers");
   
    function articleFilterChange() {
        var value = gel("group").value; 
   
        if (value != "") {
			try {
                var filter_message = {};
                filter_message.id = "number";
                filter_message.table = "kb_use";

				var grKB = new GlideRecord('kb_knowledge');
				if (grKB.get(value)){
                
                //filter_message.filter = "article=" + value;
				filter_message.filter = "article.numberSTARTSWITH" +grKB.number+"^article.active=true";
                SNC.canvas.interactiveFilters.setDefaultValue({
                        id: filter_message.id,
                        filters: [filter_message]
                    }, false);
                my_dashboardMessageHandler.publishFilter(filter_message.table, filter_message.filter);
			}
            }
            catch (ex) {
                alert('Filter Error: ' + ex.message);
            }
		}

		else
		{
			var filter_message = {};
            filter_message.id = "number";
            filter_message.table = "kb_use";
            filter_message.filter = "";
            SNC.canvas.interactiveFilters.setDefaultValue({
                    id: filter_message.id,
                    filters: [filter_message]
                }, false);
            my_dashboardMessageHandler.removeFilter();  

		}
            
    }
 </script>   

<g:ui_reference name="group" id="group" table="kb_knowledge" value="aa9f6766874df9107926c8090cbb35d7" displayvalue="KB0077337" query="active=true^workflow_state=published" completer="AJAXTableCompleter" ng-model="group" columns="number;short_description" onchange="articleFilterChange()"/>

</j:jelly>

 

@Ankur Bawiskar

@AnveshKumar M 

@Vishal Birajdar 

 

Could you please help

6 REPLIES 6

Danish Bhairag2
Tera Sage
Tera Sage

Hi @SANDEEP28 ,

 

In your scenario, where you want to trigger the articleFilterChange() function on load even when the value is set by default, you can achieve this by manually calling the articleFilterChange() function after setting the default value. Here's how you can modify your script to accomplish this:

 

<script>
var my_dashboardMessageHandler = new DashboardMessageHandler("get_article_numbers");

function articleFilterChange() {
var value = gel("group").value;

if (value != "") {
try {
var filter_message = {};
filter_message.id = "number";
filter_message.table = "kb_use";

var grKB = new GlideRecord('kb_knowledge');
if (grKB.get(value)){
filter_message.filter = "article.numberSTARTSWITH" +grKB.number+"^article.active=true";
SNC.canvas.interactiveFilters.setDefaultValue({
id: filter_message.id,
filters: [filter_message]
}, false);
my_dashboardMessageHandler.publishFilter(filter_message.table, filter_message.filter);
}
}
catch (ex) {
alert('Filter Error: ' + ex.message);
}
}
else {
var filter_message = {};
filter_message.id = "number";
filter_message.table = "kb_use";
filter_message.filter = "";
SNC.canvas.interactiveFilters.setDefaultValue({
id: filter_message.id,
filters: [filter_message]
}, false);
my_dashboardMessageHandler.removeFilter();
}
}

// Call the function after setting the default value
articleFilterChange();
</script>

 

In this modification, the articleFilterChange() function is called immediately after it is defined. This ensures that the function runs on page load, even when the default value is set. This way, the filter logic will be applied to the default value as well, allowing you to populate the data in reports more efficiently.

 

Please adjust the script as needed to fit into your overall implementation.

 

Mark my answer helpful & accepted if it helps you resolve your issue.

 

Thanks,

Danish

SANDEEP28
Mega Sage

@Danish Bhairag2 @Vishal Birajdar I tried your suggestion but didn't work. Thanks for your help.

 

I found method called as "addLoadEvent()" which gets called in during page load and its working perfectly fine. Below is the working script.

 

<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
<script>
    var my_dashboardMessageHandler = new DashboardMessageHandler("get_article_numbers");

	addLoadEvent( function(){
     articleFilterChange();
	});
   
    function articleFilterChange() {
        var value = gel("group").value; 
   
        if (value != "") {
			try {
                var filter_message = {};
                filter_message.id = "number";
                filter_message.table = "kb_use";

				var grKB = new GlideRecord('kb_knowledge');
				if (grKB.get(value)){
                
                //filter_message.filter = "article=" + value;
				filter_message.filter = "article.numberSTARTSWITH" +grKB.number+"^article.active=true";
                SNC.canvas.interactiveFilters.setDefaultValue({
                        id: filter_message.id,
                        filters: [filter_message]
                    }, false);
                my_dashboardMessageHandler.publishFilter(filter_message.table, filter_message.filter);
			}
            }
            catch (ex) {
                alert('Filter Error: ' + ex.message);
            }
		}

		else
		{
			var filter_message = {};
            filter_message.id = "number";
            filter_message.table = "kb_use";
            filter_message.filter = "article.numberSTARTSWITHKB0050311^article.active=true";
            SNC.canvas.interactiveFilters.setDefaultValue({
                    id: filter_message.id,
                    filters: [filter_message]
                }, false);
            my_dashboardMessageHandler.removeFilter();  

		}
            
    }

 </script>   

<g:ui_reference name="group" id="group" value="00bf8043872d9190142584850cbb35e0" displayvalue="KB0050311" table="kb_knowledge" query="active=true^workflow_state=published" completer="AJAXTableCompleter" ng-model="group" columns="number;short_description" onchange="articleFilterChange()"/>

</j:jelly>