How to call a Script Include with parameters from Dynamic Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-15-2024 12:06 PM
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.