Name
sn_ex_sp.ActionUtilSNC
Description
WARNING Customers should NOT modify this script The purpose of this script include is to provide default behaviours for the ActionUtilSNC script include. To change the behaviour of these methods (or add new methods), Customers should override/add new methods to the ActionUtil script include.
Script
var ActionUtilSNC = Class.create();
ActionUtilSNC.prototype = {
initialize: function(context) {
this.context = context;
this.isValidContext = !gs.nil(context);
this.returnParametersWithTypes = false;
},
type: 'ActionUtilSNC',
toggleParameterTypes: function() {
this.returnParametersWithTypes = !this.returnParametersWithTypes;
},
fetchActionsForGroup: function(groupId) {
var resolvedActions = [];
var actions = new GlideRecord('sn_ex_sp_m2m_action_group');
actions.addQuery('group.active', true);
actions.addQuery('action.active',true);
actions.addQuery('group', groupId);
actions.orderByDesc('primary');
actions.orderBy('order');
actions.query();
while (actions.next()) {
if (this.resolveActionVisibility(actions)) {
resolvedActions.push({
actionId: actions.getValue('action'),
order: actions.getValue('order'),
primary: actions.getDisplayValue('primary'),
});
}
}
return resolvedActions;
},
fetchFormattedActions: function(actionsList) {
var that = this;
return actionsList.map(function(action) {
var gr = new GlideRecord('sn_ex_sp_action');
if(!gr.get(action.actionId))
return {};
return that.mergeObjects(action, that.getActionDefaultObj(gr));
}).filter(function(x) {
return x.hasOwnProperty('type');
});
},
getActionDefaultObj: function(action) {
var action_Type = new GlideRecord('sn_ex_sp_action_type');
if(action.table && this.isValidContext)
{
if(action.table != this.context.getTableName())
return {};
}
else if(action.table && !this.isValidContext) {
return {};
}
action_Type.get(action.action_type);
var hasServerScript = !gs.nil(action_Type.server_script.toString());
var reverseExecution = action_Type.getValue('reverse_execution');
//get parameters for server script
var serverscriptvalue = {};
if(hasServerScript){
var serverParameters = new GlideRecord('sn_ex_sp_action_parameter');
serverParameters.addQuery('action', action.getUniqueValue());
serverParameters.addQuery('is_client', false);
serverParameters.query();
while(serverParameters.next()){
var val = this.resolveParameter(serverParameters);
serverscriptvalue[serverParameters.getValue('name')]=val;
}
}
//get parameters for client script
var clientParams = {};
var clientParamters = new GlideRecord('sn_ex_sp_action_parameter');
clientParamters.addQuery('action', action.getUniqueValue());
clientParamters.addQuery('is_client', true);
clientParamters.query();
while(clientParamters.next()){
var val = this.resolveParameter(clientParamters);
clientParams[clientParamters.getValue('name')]=val;
}
var clientScript = this._replaceTranslations(action_Type.client_script.toString());
return {
type: action.getValue('action_type'),
actionName: action.getDisplayValue('name'),
actionIcon: action.getDisplayValue('icon'),
clientParams: clientParams,
clientScript : clientScript,
serverScriptInputs : serverscriptvalue,
hasServerScript: hasServerScript,
reverseExecution: reverseExecution
};
},
_replaceTranslations: function(script) {
try {
var keys = script.match(/\${(.+?)\}/g);
if (keys && keys.length > 0) {
var keyValueMap = {};
for (var i = 0; i < keys.length; i++) {
if (keyValueMap[keys[i]]) {
continue;
}
keyValueMap[keys[i]] = gs.getMessage(keys[i].substring(keys[i].indexOf('${') + 2, keys[i].indexOf('}')).trim());
if (!keyValueMap[keys[i]]) {
keyValueMap[keys[i]] = '';
}
script = script.replaceAll(keys[i], keyValueMap[keys[i]]);
}
}
} catch (e) {
return script;
}
return script;
},
executeActionServerScript : function(actionId, actionParameters){
var gr = new GlideRecord('sn_ex_sp_action');
gr.get(actionId);
var actionTypeGR = gr.action_type.getRefRecord();
var evaluator = new GlideScopedEvaluator();
var that = this;
Object.keys(actionParameters).map(function(x){
evaluator.putVariable(x, that._inputParamCreator(actionParameters[x]));
return x;
});
return evaluator.evaluateScript(actionTypeGR,'server_script');
},
_inputParamCreator: function(input){
if(this.returnParametersWithTypes && input.hasOwnProperty('param_type')){
if(input.param_type == 'json')
return JSON.parse(input.value);
return input.value;
}
return input;
},
_outputParamCreator: function(type){
var that = this;
return function(value){
if(!that.returnParametersWithTypes)
return value;
return {'param_type': type, 'value': value};
};
},
resolveParameter: function(parameter){
var type = parameter.getValue('parameter_type').toString();
var outputCreator = this._outputParamCreator(type);
switch(type){
case 'string':
return outputCreator(parameter.getValue('text'));
case 'json':
return outputCreator(parameter.getValue('json'));
case 'table':
return outputCreator(this.isValidContext ? (parameter.is_display_value ? this.context.getDisplayValue(parameter.getValue('field')) : this.context.getElement(parameter.getValue('field')).toString()) : '');
}
},
resolveActionVisibility: function(action) {
switch (action.action_visibility.toString()) {
case "self":
if (this.isValidContext && this.context.getTableName() == 'sys_user') {
return this.context.getValue('user_name') == gs.getUserName();
}
return this.isValidContext ? this.context.getValue('sys_created_by') == gs.getUserName() : false;
case "others":
if (this.isValidContext && this.context.getTableName() == 'sys_user') {
return this.context.getValue('user_name') != gs.getUserName();
}
return this.isValidContext ? this.context.getValue('sys_created_by') != gs.getUserName() : false;
case "manager":
if (this.context.getTableName() == 'sys_user') {
return this.context.getValue('manager') == gs.getUserID();
}
return false;
case "user_criteria":
return sn_uc.UserCriteriaLoader.userMatches(gs.getUserID(), [action.getValue('user_criteria')]);
case 'adv':
var evaluator = new GlideScopedEvaluator();
evaluator.putVariable('context', this.context);
return evaluator.evaluateScript(action, 'script');
case "all":
return true;
default:
return false;
}
},
//Writing own object.assin like function as it is not supported in ECMA Script 5
mergeObjects: function() {
var overiddenClone = {};
for (var index = 0; index < arguments.length; index++) {
for (var property in arguments[index]) {
overiddenClone[property] = arguments[index][property];
}
}
return overiddenClone;
},
};
Sys ID
76cd0b78530201101865ddeeff7b127a