The CreatorCon Call for Content is officially open! Get started here.

How to call a Script Include with parameters from Dynamic Content

grady
Tera Contributor

Hello, I am trying to create a custom dashboard filter with Dynamic Content by Calling a Script Include. I have done this before with a Script Include function that takes no parameters, but my new function requires some input. I've tried various ways to encode the parameters in the query but it's not working. Here's my code right now.

 

Script Include: trying to call agreementsProcessedByDate

 

/* Grady Landers
 * u_TeleworkUtilities Script Include
 *
 * This utility provides a function for getting the list of government employees without 
 * an active telework agreement so that metric can be displayed in a report.
 */

var u_TeleworkUtilities = Class.create();
u_TeleworkUtilities.prototype = {
    initialize: function() {
    },
	
	//return a comma delimited string of user sys_id(s) for those active government employees without an active telework agreement
	usersWithoutAgreement: function() {
		//get current Government employees
		var users = new GlideRecord('sys_user');
		users.addQuery('user_name', 'CONTAINS', '@mil');
		users.addQuery('u_employee_type', 'Government');
		var active_query = users.addNullQuery('u_active_condition');
		active_query.addOrCondition('u_active_condition', 'no_value');
		users.query();
		
		//put their IDs in a list
		var userIDs = [];
		while(users.next()) {
			userIDs.push(users.getUniqueValue());
		}
		gs.info('u_TeleworkUtilities.usersWithoutAgreement total userIDs: '+userIDs.length);
		
		//get current Active Agreements
		var agreements = new GlideRecord('x_g_us56_telework_telework_agreements');
		var query = agreements.addQuery('state', 'active');
		query.addOrCondition('state', 'termination_requested');
		agreements.query();
		
		//put their employee values in a list
		var agreementHolders = [];
		while(agreements.next()) {
			if(agreementHolders.indexOf(agreements.getValue('user')) < 0)
				agreementHolders.push(agreements.getValue('user'));
		}
		gs.info('u_TeleworkUtilities.usersWithoutAgreement total agreementHolders: '+agreementHolders.length);
		
		//remove agreement holders from the list of all goverment employees
		for(var i=0; i<agreementHolders.length; i++) {
			var index = userIDs.indexOf(agreementHolders[i]);
			if(index > -1) {
				userIDs.splice(index, 1);
			}
		}
		gs.info('u_TeleworkUtilities.usersWithoutAgreement total users WITHOUT agreements: '+userIDs.length);
		
		//return as a string (returning an array doesn't seem to work)
		return userIDs.toString();
	},

	//get the sys_ids of the records that were 'processed' within the date range
	agreementsProcessedByDate: function(start, end) {
		try {
			var tw_audits = new GlideRecord('sys_audit');
			tw_audits.addQuery('tablename', 'x_g_us56_telework_telework_agreements');
			tw_audits.addQuery('fieldname', 'state');
			tw_audits.addQuery('oldvalue', 'coordinator_review');
			tw_audits.addQuery('newvalue', 'active');
			if(start) tw_audits.addEncodedQuery('sys_created_on>='+start);
			if(end) tw_audits.addEncodedQuery('sys_created_on<='+end);
			tw_audits.query();

			gs.info("u_TeleworkUtilities.agreementsProcessedByDate: found "+tw_audits.getRowCount());

			var agreements = [];
			while(tw_audits.next()) {
				agreements.push(tw_audits.documentkey);
			}

			return agreements.toString();
		} catch(e) {
			gs.info("u_TeleworkUtilities.agreementsProcessedByDate ERROR: "+e.toString());
		}
		
	},

    type: 'u_TeleworkUtilities'
};

 

 

Dynamic Content:

 

<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
	<style>
		span {
			margin: 1rem;
		}
		input {
			border: solid 1px;
			border-radius: 5px;
			margin-top: 1rem;
		}
	</style>
	<script>
		//initialize critical variables
		var table = 'x_g_us56_telework_telework_agreements';
		var uid = 'processed_filter_handler';
		var messageHandler = new DashboardMessageHandler(uid); //must be a unique id

		//when a date is entered, update the filter
		function updateFilter() {
			var start = document.getElementById('start').value
			if(start) start += ' 00:00:00'
			var end = document.getElementById('end').value;
			if(end) end += ' 23:59:00';

			var agreements = "${new x_g_us56_telework.u_TeleworkUtilities().agreementsProcessedByDate("+start+", "+end+")}";
			console.log(agreements);
		}
		
		//enforce the given filter on the dashboard's widgets
		function publishFilter(filter) {
			var filter_message = {};
			filter_message.id = uid; //must be the same as in the message handler
			filter_message.table = table;
			filter_message.filter = filter;
			SNC.canvas.interactiveFilters.setDefaultValue({
				id: filter_message.id,
				filters: [filter_message]
			}, false);
			messageHandler.publishFilter(filter_message.table, filter_message.filter);
		}
	</script>
	<span/>
	Processed After:
	<input id='start' type='date' onchange="updateFilter()" />
	<span/>
	Processed Before:
	<input id='end' type='date' onchange="updateFilter()" />
</j:jelly>

 

 

In the script part of my Dynamic Content, the line that assigns 'agreements' always comes back empty and I can see from my system logs that some error is getting thrown in the script include but I've failed to get anything useful out of that. I'm sure I'm just trying to pass the parameters incorrectly. Any advice is appreciated!

P.S. I know the Dynamic Content script is incomplete, but I need agreements to come back correctly so I can generate my filter and publish it.

0 REPLIES 0