Name

global.SPDiagnosticsDriver

Description

Driver - Entry point for AJAX Call to be made to categorize method

Script

var SPDiagnosticsDriver = Class.create();
SPDiagnosticsDriver.prototype = Object.extendsObject(AbstractAjaxProcessor, {

  widgetCategorization: new SPWidgetCategorization(),

  /* Constants */
  // Table Names
  TBL: {
  	SP_REL_WID_CLONE: 'sp_rel_widget_clone',
  	SYS_UPDATE_VERSION: 'sys_update_version',
  	SP_WIDGET: 'sp_widget'
  },

  // Column Names
  COL: {
  	NAME: 'name',
  	SRC_TBL: 'source_table',
  	STATE: 'state'
  },

  // Categories
  CATEGORY: {
  	UNCATEGORIZED: 0,
  	OOTB: 1,
  	CLONED: 2,
  	BRAND_NEW: 3,
  	CUSTOMIZED: 4
  },

  // Column Values
  OOTB_TBLS: ['sys_upgrade_history', 'sys_store_app'],
  CHILD: 'child',
  NAME: 'name',
  DESCRIPTION: 'description',
  SYS_CLASS_NAME: 'sys_class_name',
  SP_INSTANCE: 'sp_instance',
  SP_WIDGET: 'sp_widget',
  CURRENT: 'current',
  PREVIOUS: 'previous',

  // Entry point for the Ajax Call to be made from client side
  categorize: function (arrIDs) {
  	var strInstanceIds = this.getParameter('sysparm_instances_array') || arrIDs;
  	if (!strInstanceIds)
  		return;

  	var instWidgetMap = this.categorizeInstances(JSON.parse(strInstanceIds)) || {} ;
  	return JSON.stringify(instWidgetMap);
  },

  categorizeInstances: function (arrInstanceIds) {

  	var widgetCustMap = {};
  	var processed = {};
  	var widgetCustDetailsObj = {};
  	var instanceCustDetailsObj = {};
  	var shouldItProcess = false;
  	var retObj = {};
  	var instWidgetMap;

  	instWidgetMap = _getInstanceToWidgetsMap.call(this, arrInstanceIds) || {};

  	for (var instanceId in instWidgetMap) {

  		var widgetId = instWidgetMap[instanceId];
  		shouldItProcess = !processed[widgetId];

  		if (shouldItProcess) {
  			widgetCustDetailsObj = _categorizeWidget.call(this, widgetId);
  			delete widgetCustDetailsObj.isCategorized;
  			widgetCustMap[widgetId] = widgetCustDetailsObj;
  			processed[widgetId] = true;
  		} else
  			widgetCustDetailsObj = widgetCustMap[widgetId];

  		instanceCustDetailsObj.widgetCustDetails = widgetCustDetailsObj;
  		retObj[instanceId] = JSON.parse(JSON.stringify(instanceCustDetailsObj));
  	}
  	return retObj;
  },

  type: 'SPDiagnosticsDriver'
});

// Private functions

function _getWidgetDetails (widSysId) {

  var retObj = {
  	name: '',
  	description: ''
  };
  var grTBL = new GlideRecord(this.SP_WIDGET);
  if (grTBL.get(widSysId)) {
  	retObj.name = grTBL.getValue(this.NAME) || '';
  	retObj.description = grTBL.getValue(this.DESCRIPTION) || '';
  	this.TBL.SP_WIDGET = grTBL.getValue(this.SYS_CLASS_NAME) || this.SP_WIDGET;
  }
  return retObj;
}

function _getInstanceToWidgetsMap (instanceIdArr) {

  var instWidgetMap = {};
  var instArrlength =  instanceIdArr.length;
  var	instanceId;
  var	widgetId;
  var	index;

  for (index = 0; index < instArrlength; index++) {
  	instanceId = instanceIdArr[index];
  	widgetId = _getWidgetForInstance.call(this, instanceId);
  	instWidgetMap[instanceId] = widgetId;
  }

  return instWidgetMap;
}

function _getWidgetForInstance (instanceId) {

  var grSPInstance = new GlideRecord(this.SP_INSTANCE);
  if (grSPInstance.get(instanceId))
  	return grSPInstance.getValue(this.SP_WIDGET);
  else
  	return instanceId; // For embedded widgets instanceId itself is the widgetId
}

// Main function called for categorizing each widget
function _categorizeWidget (widgetId) {

  var widgetDetails = _getWidgetDetails.call(this, widgetId);

  var widgetCustomizationMetaCloned = {
  	widSysId: widgetId,
  	categoryCheck: this.CATEGORY.CLONED,
  	custCheck: false,
  	table: this.TBL.SP_REL_WID_CLONE,
  	firstEncodedQuery: this.CHILD + '=' + widgetId
  };

  var widgetCustomizationMetaNew = {
  	widSysId: widgetId,
  	categoryCheck: this.CATEGORY.BRAND_NEW,
  	custCheck: false,
  	table: this.TBL.SYS_UPDATE_VERSION,
  	firstEncodedQuery: this.COL.NAME + '=' + this.TBL.SP_WIDGET + '_' + widgetId,
  	secondEncodedQuery: this.COL.SRC_TBL + 'IN' + this.OOTB_TBLS.toString()
  };

  var widgetCustomizationMetaCustomized = {
  	widSysId: widgetId,
  	categoryCheck: this.CATEGORY.CUSTOMIZED,
  	custCheck: true,
  	firstEncodedQuery: this.COL.STATE + '=' + this.PREVIOUS,
  	secondEncodedQuery: this.COL.SRC_TBL + 'IN' + this.OOTB_TBLS.toString(),
  	thirdEncodedQuery: this.COL.STATE + '=' + this.CURRENT,
  	sysClassName: this.TBL.SP_WIDGET
  };

  var catObj = this.widgetCategorization.isWidgetCategorized(widgetCustomizationMetaCloned);
  if (!catObj.isCategorized) {
  	catObj = this.widgetCategorization.isWidgetCategorized(widgetCustomizationMetaNew);
  	if (!catObj.isCategorized) {
  		catObj = this.widgetCategorization.isWidgetCategorized(widgetCustomizationMetaCustomized);
  		if (!catObj.isCategorized)
  			catObj.category = this.CATEGORY.OOTB;
  	}
  }
  catObj.name = widgetDetails.name;
  catObj.description = widgetDetails.description;

  return catObj;
}

Sys ID

16880abcc7233300393d265c95c26078

Offical Documentation

Official Docs: