Name

global.sc_ic_Base

Description

Base class for all Item Designer wrapper classes

Script

/**
* sc_ic_Base
*
* Base class used for the creation of components of the Service Catalog Item Creator.
*
* This class should never be instanciated directly.  It should only be extedned.
*
* @author Chris Henson <chris.henson@service-now.com>
*/
var sc_ic_Base = Class.create();

sc_ic_Base.prototype = {
  initialize: function(_gr,_gs) {
      this._log = (new GSLog(sc_ic.LOG_LEVEL,this.type)).setLog4J();

  	// Assume current if not defined.  This can only ever work if you're instantiating objects directly.
  	this._gr = (typeof _gr !== "undefined" ? _gr : current);
  	 // Assume gs if not defined
  	this._gs = (typeof _gs !== "undefined" ? _gs : gs);
  	
  	// Assume null if global action not defined
  	try {
  		this._action = (JSUtil.notNil(action) ? action : null);
  	} catch(e) {
  		this._action = null;
  	}
  	
      if (this.type == "sc_ic_Base")
          this._log.error("[initialise] You shouldn't be instanciating objects of type sc_ic_Base");
  },

  /**
   * Returns the GlideRecord object this object wraps
   */
  get_gr: function() {
      return this._gr;
  },
  
  /**
   * Returns the GlideSystem object this was instantiated with
   */
  get_gs: function() {
  	return this._gs;
  },

  // A lot of the following methods could be moved to a mixin script include and simply referenced in this class.
  
  convertToJSONString: function(anObj){
  	if (GlideStringUtil.nil(anObj))
  		return "{}";
  	
  	var myJSON = new JSON();
  	return myJSON.encode(anObj);
  },

  /**
   * Turns off engines sys fields and business rules for the GlideRecord
   */
  _enableQuietUpdate: function() {
  	this._gr.setWorkflow(false);
  	this._gr.autoSysFields(false);
  	this._gr.useEngines(false);
  },

  /**
   * Turns on engines, sys fields and business rules for the GlideRecord
   */
  _disableQuietUpdate: function() {
  	this._gr.useEngines(true);
  	this._gr.autoSysFields(true);
  	this._gr.setWorkflow(true);
  },

  /**
   * Copies all translation data between source and target glide element
   * Source and target should both be of type GlideElement
   * This only copies values in the translation tables, not the base value.
   */
  copyElementTranslations: function(sourceGr, sourceFld, targetFld) {
  	var TRANSLATED_FIELD = "translated_field";
  	var TRANSLATED_TEXT = "translated_text";
  	var TRANSLATED_HTML = "translated_html";
  	
  	var Translation = function() {
  		return {"sys_id" : "",
  				"tableName" : "",
  				"fieldName" : "",
  				"key" : "",
  				"translation" : "",
  				"language" : ""
  		};
  	};
  	
  	var sourceType = sourceGr[sourceFld].getED().getInternalType()+"";
  	var targetType = this._gr[targetFld].getED().getInternalType()+"";
  	var targetTable = this._gr.getElement(targetFld).getTableName()+"";
  	
  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[copyElementTranslations] Source field " + sourceFld + " is: " + sourceType + ", Target field " + targetFld + " is: " + targetType);
  	
  	var sourceTrans = [];
  	var transFld = "";
  	var sysTrans = null;
  	
  	//Query the appropriate table.
  	if (sourceType == TRANSLATED_FIELD) {
  		transFld = "label";
  		sysTrans = new GlideRecord("sys_translated");
  		sysTrans.addQuery("name",sourceGr.getTableName());
  		sysTrans.addQuery("element",sourceFld);
  		sysTrans.addQuery("value", sourceGr.getValue(sourceFld + ''));
  		sysTrans.query();
  	}
  	else if (sourceType == TRANSLATED_TEXT || sourceType == TRANSLATED_HTML) {
  		transFld = "value";
  		sysTrans = new GlideRecord("sys_translated_text");
  		sysTrans.addQuery("tablename",sourceGr.getTableName());
  		sysTrans.addQuery("fieldname",sourceFld);
  		sysTrans.addQuery("documentkey",sourceGr.getUniqueValue());
  		sysTrans.query();
  	}
  	
  	// If there's no translations for this field put in a log entry.
  	if (this._log.atLevel(GSLog.DEBUG) && (sysTrans == null || !sysTrans.hasNext()))
  		this._log.debug("[copyElementTranslations] No translations found for " + sourceGr.getTableName() + "." + sourceFld + " <" + sourceGr.getUniqueValue() + ">");
  	
  	while (sysTrans.next()) {
  		var nt = new Translation();
  		nt.sys_id = sourceGr.getUniqueValue()+"";
  		nt.tableName = sourceGr.getTableName()+"";
  		nt.fieldName = sourceFld;
  		nt.key = sourceGr.getValue(sourceFld + '');
  		nt.translation = sysTrans[transFld]+"";
  		nt.language = sysTrans.language+"";				
  		sourceTrans.push(nt);
  		
  		if (this._log.atLevel(GSLog.DEBUG))
  			this._log.debug("[copyElementTranslations] Found translation: " + nt.language + ":" + nt.translation + " <" + nt.sys_id + ">");
  	}
  	
  	// Determine target field type
  	if (targetType == TRANSLATED_FIELD) {
  		sysTrans = new GlideRecord("sys_translated");
  		sysTrans.addQuery("name", targetTable);
  		sysTrans.addQuery("element",targetFld);
  		sysTrans.addQuery("value",this._gr[targetFld]);
  		sysTrans.query();
  		
  		//Update any that already exist and do not delete any orphans if translated field
  		while (sysTrans.next()) {
  			for (i = 0; i < sourceTrans.length; i++) {
  				st = sourceTrans[i];

  				if (sysTrans.language+"" == st.language && sysTrans.label+"" != st.translation) {
  					sysTrans.label = st.translation;
  					sysTrans.update();

  					transItem = st;
  					sourceTrans.splice(i,1);

  					if (this._log.atLevel(GSLog.DEBUG))
  						this._log.debug("[copyElementTranslations] Updated (sys_translated): " + transItem.key + ":" + transItem.language + ":" + transItem.translation + " <" + transItem.sys_id + ">");
  					break;
  				}
  				else if (sysTrans.language+"" == st.language && sysTrans.label+"" == st.translation) {
  					if (this._log.atLevel(GSLog.DEBUG))
  						this._log.debug("[copyElementTranslations] " + st.language + " Translation is up to date");

  					transItem = st;
  					sourceTrans.splice(i,1);
  					break;
  				}
  			}
  		}
  		
  		//At this point we have an object with any new translations in.
  		if (this._log.atLevel(GSLog.DEBUG))
  			this._log.debug("[copyElementTranslations] " + sourceTrans.length + " translations to insert");
  		
  		for (i = 0; i < sourceTrans.length; i++) {
  			sysTrans = new GlideRecord("sys_translated");
  			sysTrans.name = targetTable;
  			sysTrans.element = targetFld;
  			sysTrans.value = sourceTrans[i].key;
  			sysTrans.label = sourceTrans[i].translation;
  			sysTrans.language = sourceTrans[i].language;
  			
  			if (this._log.atLevel(GSLog.DEBUG))
  				this._log.debug("[copyElementTranslations] Insert (sys_translated): " + sysTrans.name + ":" + sysTrans.element + ":" + sysTrans.language + ":" + sysTrans.value);
  			
  			sysTrans.insert();
  		}
  	}
  	else if (targetType == TRANSLATED_HTML || targetType == TRANSLATED_TEXT) {
  		sysTrans = new GlideRecord("sys_translated_text");
  		sysTrans.addQuery("tablename",this._gr.getTableName());
  		sysTrans.addQuery("fieldname",targetFld);
  		sysTrans.addQuery("documentkey",this._gr.getUniqueValue());
  		sysTrans.query();
  		
  		//Update any that already exist
  		while (sysTrans.next()) {
  			var transItem = null;
  			for (i = 0; i < sourceTrans.length; i++) {
  				var st = sourceTrans[i];
  				if (sysTrans.language+"" == st.language && sysTrans.value+"" != st.translation) {
  					sysTrans.value = st.translation;
  					sysTrans.update();
  					
  					if (this._log.atLevel(GSLog.DEBUG))
  						this._log.debug("[copyElementTranslations] Update (sys_translated_text): " + transItem.key + ":" + transItem.language + ":" + transItem.translation + " <" + transItem.sys_id + ">");
  					
  					transItem = st;
  					sourceTrans.splice(i,1); //Remove the used element
  					break;
  				}
  				else if (sysTrans.language+"" == st.language && sysTrans.value+"" == st.translation) {
  					if (this._log.atLevel(GSLog.DEBUG))
  						this._log.debug("[copyElementTranslations] " + st.language + " Translation is up to date");
  					
  					transItem = st;
  					sourceTrans.splice(i,1);
  					break;
  				}
  			}
  			
  			if (transItem == null) {
  				if (this._log.atLevel(GSLog.DEBUG))
  					this._log.debug("[copyElementTranslations] Delete (sys_translated_text): " + sysTrans.tablename + ":" + sysTrans.fieldname + ":" + sysTrans.documentkey + ":" + sysTrans.language + ":" + sysTrans.value);
  				sysTrans.deleteRecord();
  			}
  		}
  		
  		//Insert any new ones
  		if (this._log.atLevel(GSLog.DEBUG))
  			this._log.debug("[copyElementTranslations] " + sourceTrans.length + " translations to insert");
  		 
  		for (var i = 0; i < sourceTrans.length; i++) {
  			sysTrans = new GlideRecord("sys_translated_text");
  			sysTrans.documentkey = this._gr.getUniqueValue();
  			sysTrans.tablename = this._gr.getTableName();
  			sysTrans.fieldname = targetFld;
  			sysTrans.value = sourceTrans[i].translation;
  			sysTrans.language = sourceTrans[i].language;
  						
  			if (this._log.atLevel(GSLog.DEBUG))
  				this._log.debug("[copyElementTranslations] Insert (sys_translated_text): " + sysTrans.tablename + ":" + sysTrans.fieldname + ":" + sysTrans.language + ":" + sysTrans.value + ":" + sysTrans.documentkey);
  			
  			sysTrans.insert();
  		}
  	}
  },
  
  redirect: function() {
  	if (this._action != null && !JSUtil.nil(this._action.getActionSysId()))
  		this._action.setRedirectURL(this._gr);
  },
  
  type: "sc_ic_Base"
};

Sys ID

1a2f73f2eb2011003623666cd206fee2

Offical Documentation

Official Docs: