Name

global.ActionUtils

Description

Various utility functions to assist the execution of action scripts. Assumes the existence of an action global variable pointing to an instance of Action.java gs.include( ActionUtils ); var au = new ActionUtils(); au.

Script

gs.include("PrototypeServer");


var ActionUtils = Class.create();

ActionUtils.prototype = {
 initialize : function() {
 },
 
 postInsert : function(/* GlideRecord */ gr) {
    if (gr.isActionAborted())
       return;
    
    var linkedM2MTable = action.get('sysparm_link_collection');
    if (linkedM2MTable)
       this._insertM2M(linkedM2MTable, gr.sys_id);
    
    var relationship = action.get('sysparm_collection_relationship');
    if (relationship) {
       var parentKey = action.get('sysparm_collectionID');
       var parentTable = action.get('sysparm_collection');
       var r = GlideRelationship.get(relationship);
       r.postInsert(parentTable, parentKey, current);
    }
 },
 
 _insertM2M : function(/* String */ table, /* String */ sys_id) {
    var fromRefName = action.get('sysparm_collection_key');
    if (!fromRefName)
       return;
    
    var fromRefValue = action.get('sysparm_collectionID');
    if (!fromRefValue)
       return;
    
    var newRefName = action.get('sysparm_collection_related_field');
    if (!newRefName )
       return;
    
    var gr = new GlideRecord(table);
    if (!gr.isValid())
       return;
    
    gr.initialize();
    gr.setValue(fromRefName, fromRefValue);
    gr.setValue(newRefName, sys_id);
    gr.insert();
 },
 
 convertListActions: function() {
    var convert = [ 'action_list_button', 'action_list_contextmenu', 'action_list_choice' ];
    this._convertActions(convert);
 },
 
 convertFormActions: function() {
    var convert = [ 'action_button', 'action_menu' ];
    this._convertActions(convert);
 },
 
 _convertActions: function(convert) {
    var gr = new GlideRecord('sys_script');
    
    gr.addQuery('when', convert);
    gr.query();
    while (gr.next()) {
       var id = gr.sys_id.toString();
       var action = this._initAction(gr);

  	 // first delete sys_script record since we are inserting into another table 
  	 gr.deleteRecord();
  	  
       // insert or update the action record after the converted from
       // sys_script record has been purged
       action.insertOrUpdate('sys_id');
    }
 },
 
 _initAction : function(gr) {
    var action = new GlideRecord('sys_ui_action');
    action.newRecord();
    // use same sys_id as old script so that customers get a predictable sys_id
    // such that we can subequently ship updates to these things
    action.setNewGuidValue(gr.sys_id);
    action.table = gr.collection;
    action.condition = gr.condition;
    action.order = gr.order;
    action.active = gr.active;
    action.name = gr.name;
    action.action_name = gr.action_name;
    action.script = gr.script;
    this._prep(action, gr);
    return action;
 },
 
 _prep : function(action, gr) {
    if (gr.action_run_at == 'client') {
       action.client = true;
       action.onclick = gr.onclick;
    }
    
    if (gr.when == 'action_button')
       action.form_button = true;
    else if (gr.when == 'action_menu')
       action.form_context_menu = true;
    else if (gr.when == 'action_list_button')
       action.list_button = true;
    else if (gr.when == 'action_list_contextmenu')
       action.list_context_menu = true;
    else if (gr.when == 'action_list_choice')
       action.list_choice = true;
 },
 
 _isAction : function(when) {
    if (when == 'action')
       return false;
    
    when = when.substring(0, 6);
    gs.print('WHEN = ' + when);
    return when == 'action';
 },
 
 convertUnloads : function() {
    var ser =  new GlideRecordXMLSerializer();
    var gr = new GlideRecord('sys_update_xml');
    gr.addQuery('name', 'STARTSWITH', 'sys_script');
    gr.query();
    while (gr.next()) {
       var xml = gr.payload + '';
       var d = GlideXMLUtil.parse(xml, true);
       var node = d.getDocumentElement().getChildNodes().item(0);
       var s = node.getLocalName();
       if (!s)
          s = node.getNodeName();
       if (s != 'sys_script')
          continue; // not a script
       
       var script = new GlideRecord('sys_script');
       script.initialize();
       ser.deserializeFromElement(script, node);
       var when = script.when + '';
       if (!this._isAction(when)) {
          gs.print('Not updating ' + gr.name + ' since it is not an action script');
          continue;
       }
       var action = this._initAction(script);
       var newPayLoad = this._createPayload(action, ser);
       gr.payload = newPayLoad;
       var oldName = gr.name + '';
       gr.name = "sys_ui_action_" + action.sys_id;
       gr.update();
       gs.print('Updated ' + oldName + ' to ' + gr.name);
    }
 },
 
 _createPayload : function(action, ser) {
    var doc = GlideXMLUtil.newDocument('record_update');
    var root = doc.getDocumentElement();
    root.setAttribute('table', 'sys_ui_action');
    var e = doc.createElement('sys_ui_action');
    root.appendChild(e);
    e.setAttribute('action', 'INSERT_OR_UPDATE');
    ser.serializeIntoElement(action, e);
    return GlideXMLUtil.toString(doc);
 }
}

Sys ID

56c8741f0a0a0b34003ec298a82ea737

Offical Documentation

Official Docs: