Name

global.SPWidgetCategorization

Description

Server Util used for Widget Customization Categorization 1. OOTB 2. Cloned 3. Brand New 4. Customized (Includes Dependency, Providers and Templates as well)

Script

var SPWidgetCategorization = Class.create();
SPWidgetCategorization.prototype = {

  ENCODED_QUERY_BASELINE: '',
  ENCODED_QUERY_PREVIOUS: '',
  ENCODED_QUERY_CURRENT: '',
  /* Constants */
  // Table Names
  TBL: {
  	SYS_UPDATE_VERSION: 'sys_update_version',
  	// Widget Dependency
  	M2M_SP_WID_DEP: 'm2m_sp_widget_dependency',
  	SP_WID_DEP: 'sp_dependency',
  	M2M_SP_JS_INC: 'm2m_sp_dependency_js_include',
  	M2M_SP_CSS_INC: 'm2m_sp_dependency_css_include',
  	// ngProvider
  	M2M_SP_NG_PRO: 'm2m_sp_ng_pro_sp_widget',
  	SP_NG_PRO: 'sp_angular_provider',
  	// ngTemplate
  	SP_NG_TMPL: 'sp_ng_template',
  	// SP Widget
  	SP_WIDGET: 'sp_widget'
  },

  // Column Names
  COL: {
  	NAME: 'name',
  	SRC_TBL: 'source_table',
  	SP_WID: 'sp_widget',
  	SP_WID_DEP: 'sp_dependency',
  	SYS_UPDATED_BY: 'sys_updated_by',
  	SYS_CREATED_ON: 'sys_created_on'
  },

  // Types of meta items to check
  TYPE: {
  	WIDGET: 'sp_widget',
  	WID_DEP: 'sp_dependency',
  	NG_PRO: 'sp_angular_provider',
  	NG_TMPL: 'sp_ng_template'
  },

  // Categories
  CATEGORY: {
  	UNCATEGORIZED: 0,
  	OOTB: 1,
  	CLONED: 2,
  	BRAND_NEW: 3,
  	CUSTOMIZED: 4,
  	CUSTOMIZED_DEP: 5,
  	CUSTOMIZED_NG_PRO: 6,
  	CUSTOMIZED_NG_TMPL: 7
  },

  // Column Values
  SYS_UPDATE_SET: 'sys_update_set',
  ID: 'id',

  // User
  USR_ADMIN: 'admin',

  /* Core Methods */
  isWidgetCategorized: function (widgetCustomizationMeta) {

  	var custcheck = widgetCustomizationMeta.custCheck;
  	var categoryCheck = widgetCustomizationMeta.categoryCheck;
  	var widSysId = widgetCustomizationMeta.widSysId;
  	var m2mDepsCustObj;
  	var m2mNGProCustObj;
  	var m2mTemplCustObj;
  	var arrTemplates;
  	var retObj = {
  		widSysId: widgetCustomizationMeta.widSysId,
  		isCategorized: false,
  		category: this.CATEGORY.UNCATEGORIZED,
  		dependencies: [],
  		providers: [],
  		templates: []
  	};

  	if (categoryCheck === this.CATEGORY.BRAND_NEW
  		|| categoryCheck === this.CATEGORY.CLONED) {

  		var grTBL = new GlideRecord(widgetCustomizationMeta.table);
  		grTBL.setLimit(1);
  		grTBL.addEncodedQuery(widgetCustomizationMeta.firstEncodedQuery);
  		grTBL.query();

  		if (grTBL.hasNext()) {

  			if (widgetCustomizationMeta.categoryCheck === this.CATEGORY.BRAND_NEW) {
  				grTBL = new GlideRecord(widgetCustomizationMeta.table);
  				grTBL.setLimit(1);
  				grTBL.addEncodedQuery(widgetCustomizationMeta.firstEncodedQuery + '^' + widgetCustomizationMeta.secondEncodedQuery);
  				grTBL.query();

  				if (!grTBL.hasNext())
  					retObj.isCategorized = true;
  			} else
  				retObj.isCategorized = true;

  			if (retObj.isCategorized) {
  				retObj.category = categoryCheck;
  				retObj.isRecordCustomized = false;
  			}
  		}
  	}

  	if (retObj.isCategorized
  		|| widgetCustomizationMeta.categoryCheck === this.CATEGORY.CUSTOMIZED) {

  		m2mDepsCustObj = _getM2MDetails.call(this, this.TBL.M2M_SP_WID_DEP, this.TYPE.WID_DEP, this.COL.SP_WID, widSysId, custcheck);
  		retObj.dependencies = m2mDepsCustObj.dependencies;

  		m2mNGProCustObj = _getM2MDetails.call(this, this.TBL.M2M_SP_NG_PRO, this.TYPE.NG_PRO, this.COL.SP_WID, widSysId, custcheck);
  		retObj.providers = m2mNGProCustObj.providers;

  		m2mTemplCustObj = _getM2MDetails.call(this, this.TBL.SP_NG_TMPL, this.TYPE.NG_TMPL, this.COL.SP_WID, widSysId, custcheck);
  		retObj.templates = m2mTemplCustObj.templates;

  		if (widgetCustomizationMeta.custCheck) {

  			this.TBL.SP_WIDGET = widgetCustomizationMeta.sysClassName;
  			this.ENCODED_QUERY_PREVIOUS = widgetCustomizationMeta.firstEncodedQuery;
  			this.ENCODED_QUERY_BASELINE = widgetCustomizationMeta.secondEncodedQuery;
  			this.ENCODED_QUERY_CURRENT = widgetCustomizationMeta.thirdEncodedQuery;

  			recCustObj = _getRecordDetails.call(this, this.TBL.SP_WIDGET, this.TYPE.WIDGET, widSysId, custcheck);
  			retObj.isRecordCustomized = recCustObj.isRecordCustomized;

  			if (recCustObj.isRecordCustomized) {
  				retObj.baselineSysId = recCustObj.baselineSysId;
  				retObj.prevSysId = recCustObj.prevSysId;
  				retObj.currentSysId = recCustObj.currentSysId;
  			}

  			// if any of them are customized - widget is customized
  			if (recCustObj.isRecordCustomized
  				|| m2mDepsCustObj.isCustomized
  				|| m2mNGProCustObj.isCustomized
  				|| m2mTemplCustObj.isCustomized) {

  				retObj.isCategorized = true;
  				retObj.category = this.CATEGORY.CUSTOMIZED;
  			}
  		}
  	}
  	return retObj;
  },

  type: 'SPWidgetCategorization'
};

function _getM2MDetails(table, type, qcol, recId, custcheck) {

  var recCustObj = {};
  var retObj = {
  	widSysId: recId,
  	dependencies: [],
  	providers: [],
  	templates: [],
  	isCustomized: false,
  	category: this.CATEGORY.UNCATEGORIZED,
  };
  var arrRetObj = [];
  var childTable = '';
  var isCssOrJSCustomized = false;
  var tmpObj;

  var grM2M = new GlideRecord(table);
  grM2M.addQuery(qcol, '=', recId);
  grM2M.query();

  while (grM2M.next()) {

  	tmpObj = {};

  	if (type === this.TYPE.WID_DEP) {

  		tmpObj.sys_id = grM2M.sp_dependency.sys_id.toString();
  		tmpObj.name = grM2M.sp_dependency.name.toString();
  		childTable = this.TBL.SP_WID_DEP;

  	} else if (type === this.TYPE.NG_PRO) {

  		tmpObj.sys_id = grM2M.sp_angular_provider.sys_id.toString();
  		tmpObj.name = grM2M.sp_angular_provider.name.toString();
  		childTable = this.TBL.SP_NG_PRO;

  	} else if (type === this.TYPE.NG_TMPL) {

  		tmpObj.sys_id = grM2M.getUniqueValue();
  		tmpObj.id = grM2M.getValue(this.ID) || '';
  		childTable = table;
  	}

  	if (custcheck) {

  		recCustObj = _getRecordDetails.call(this, childTable, type, tmpObj.sys_id, custcheck);

  		if (recCustObj.isRecordCustomized) {
  			tmpObj.baselineSysId = recCustObj.baselineSysId;
  			tmpObj.currentSysId = recCustObj.currentSysId;
  			tmpObj.prevSysId = recCustObj.prevSysId;
  		}

  		if (type !== this.TYPE.NG_TMPL)
  			tmpObj.isM2MCustomized = (grM2M.getValue(this.COL.SYS_UPDATED_BY) != this.USR_ADMIN) ? true : false;

  		if (type === this.TYPE.WID_DEP)
  			isCssOrJSCustomized = _isDepJSORCSSCustomized.call(this, tmpObj.sys_id);

  		tmpObj.isRecordCustomized = recCustObj.isRecordCustomized || isCssOrJSCustomized;

  		if (!retObj.isCustomized
  			&& (tmpObj.isRecordCustomized || tmpObj.isM2MCustomized))
  			retObj.isCustomized = true;
  	}
  	arrRetObj.push(JSON.parse(JSON.stringify(tmpObj)));
  }

  if (type === this.TYPE.WID_DEP)
  	retObj.dependencies = arrRetObj;

  else if (type === this.TYPE.NG_PRO)
  	retObj.providers = arrRetObj;

  else if (type === this.TYPE.NG_TMPL)
  	retObj.templates = arrRetObj;

  return retObj;
}

// Check if the record is customized
function _getRecordDetails (tableName, type, recId, custcheck) {

  var recName = tableName + '_' + recId;
  var retObj = {
  	isRecordCustomized: false,
  	category: this.CATEGORY.UNCATEGORIZED
  };
  var tmpObj;

  var grTBL = new GlideRecord(this.TBL.SYS_UPDATE_VERSION);
  grTBL.addQuery(this.COL.NAME, '=', recName);
  grTBL.addEncodedQuery(this.ENCODED_QUERY_CURRENT);
  grTBL.addQuery(this.COL.SRC_TBL, '=', this.SYS_UPDATE_SET);
  grTBL.query();

  if (grTBL.next()) {

  	if (custcheck) {
  		retObj.currentSysId = grTBL.getUniqueValue();
  		tmpObj = _getVersionSysIds.call(this, tableName, retObj.currentSysId, recId);
  		retObj.baselineSysId = tmpObj.baselineSysId;
  		retObj.prevSysId = tmpObj.prevSysId || retObj.currentSysId;
  	}

  	if (type === this.TYPE.WIDGET)
  		retObj.category = this.CATEGORY.CUSTOMIZED;

  	else if (type === this.TYPE.WID_DEP)
  		retObj.category = this.CATEGORY.CUSTOMIZED_DEP;

  	else if (type === this.TYPE.NG_PRO)
  		retObj.category = this.CATEGORY.CUSTOMIZED_NG_PRO;

  	else if (type === this.TYPE.NG_TMPL)
  		retObj.category = this.CATEGORY.CUSTOMIZED_NG_TMPL;

  	retObj.isRecordCustomized = true;
  }
  return retObj;
}

// Check if M2M JS or CSS customized
function _isDepJSORCSSCustomized (recId) {

  var isCustomized = false;
  isCustomized = _isDepJSORCSSRecordCustomized.call(this, this.TBL.M2M_SP_JS_INC, recId);

  if (!isCustomized)
  	isCustomized = _isDepJSORCSSRecordCustomized.call(this, this.TBL.M2M_SP_CSS_INC, recId);

  return isCustomized;
}

function _isDepJSORCSSRecordCustomized (table, recId) {

  var isCustomized = false;
  var grDepM2M = new GlideRecord(table);
  grDepM2M.addQuery(this.COL.SP_WID_DEP, '=', recId);
  grDepM2M.query();

  while (grDepM2M.next()) {
  	if (grDepM2M.getValue(this.COL.SYS_UPDATED_BY) !== this.USR_ADMIN) {
  		isCustomized = true;
  		break;
  	}
  }
  return isCustomized;
}

// Get Version sys_ids
function _getVersionSysIds (tableName, currentSysId, recId) {

  var recName = tableName + '_' + recId;
  var	retObj = {};

  var encodedQueryCommon = this.COL.NAME + '=' + recName;
  var encodedQueryBaseline = encodedQueryCommon + '^' + this.ENCODED_QUERY_BASELINE;
  var encodedQueryPrevious = encodedQueryCommon + '^' + this.ENCODED_QUERY_PREVIOUS;
  var encodedQueryCurrent = encodedQueryCommon + '^' + this.ENCODED_QUERY_CURRENT;

  retObj.baselineSysId = _getVersionSysId.call(this, encodedQueryBaseline);
  retObj.prevSysId = _getVersionSysId.call(this, encodedQueryPrevious);

  if (!currentSysId)
  	retObj.currentSysId = _getVersionSysId.call(this, encodedQueryCurrent);
  else
  	retObj.currentSysId = currentSysId;

  return retObj;
}

function _getVersionSysId (encodedQuery) {

  var sysId = '';

  var grTBL = new GlideRecord(this.TBL.SYS_UPDATE_VERSION);
  grTBL.orderByDesc(this.COL.SYS_CREATED_ON);
  grTBL.addEncodedQuery(encodedQuery);
  grTBL.query();

  if (grTBL.next())
  	sysId = grTBL.getUniqueValue();

  return sysId;
}

Sys ID

75b84ebcc7233300393d265c95c260b1

Offical Documentation

Official Docs: