Name

global.SysSection

Description

Locates the section that should be used to display the form. 1. Search for a section for a given table and views 2. Search for a section for each parent of the given table and the views 3. Search for a section for a given table and the default view 4. Search for a section for each parent of the given table and the default view

Script

gs.include("PrototypeServer");
gs.include("AbstractList");

var SysSection = Class.create();

SysSection.prototype = Object.extendsObject(AbstractList, {

  SYS_METADATA: 'sys_metadata',
  SYS_UI_SECTION: 'sys_ui_section',
  SYS_UI_ELEMENT: 'sys_ui_element',
  HEADER: 'header',
  TITLE: 'title',

  get: function() {
  	this.targetTable = this.tableName;
  	var id = this.getSection();
  	if (id != null)
  		return id;

  	if (this.view == this.defaultViewID)
  		return null;

  	this.targetTable = this.tableName;
  	this.view = this.defaultViewID;
  	return this.getSection();
  },

  getResolvedView: function() {
  	return this.resolvedView;
  },

  getSectionForTable: function(tableName) {
  	this.targetTable = tableName;
  	return this.getSection();
  },

  getSection: function() {
  	this.resolvedView = null;
  	var list = this._getViewList();
  	for (var i = 0; i < list.length; i++) {
  		var viewID = list[i];
  		var gr = new GlideRecord(this.SYS_UI_SECTION);
  		gr.addQuery(this.NAME, this.targetTable);
  		gr.addQuery(this.VIEW, viewID);
  		gr.orderByDesc(this.TITLE);
  		this.domainQuery(gr, this.domainID);
  		if (gr.next()) {
  			this.resolvedView = new GlideScriptViewManager(viewID, true).getViewName();
  			this.section = gr;
  			return gr.getUniqueValue();
  		}
  	}

  	return this.checkParents();
  },

  // It is possible to have multiple views provided when a popup is being requested on a
  // form that already has a view.  In this case we want to first check for a pop_up view
  // and if that fails then we look for the view that matches the view displaying the
  // form.
  _getViewList: function() {
  	if (this.view == this.defaultViewID)
  		return [this.view];

  	if (this.viewName == 'sys_popup')
  		this.isPopUp = true;

  	var views = this.viewName.split(",");
  	if (views.length == 1)
  		return [this.view];

  	var answer = [];
  	for (var i = 0; i < views.length; i++) {
  		var viewName = views[i];
  		if (viewName == 'sys_popup')
  			this.isPopUp = true;

  		answer.push(new GlideScriptViewManager(viewName).getID());
  	}

  	return answer;
  },

  checkParents: function() {
  	if (this.targetTable != this.tableName)
  		return null;

  	var list = this.getParents();
  	if (list == null)
  		return null;

  	for (var i = 0; i < list.length; i++) {
  		if (list[i] == this.SYS_METADATA)
  			continue; // Special case.  We don't ever want to copy from sys_metadata

  		this.targetTable = list[i];
  		var answer = this.getSection();
  		if (answer != null)
  			return this._clone();
  	}

  	return null;
  },

  _clone: function() {
  	if (this._hasForm(this.targetTable, this.view) == true) {
  		//create all parent table views
  		this._copyForm();
  		return this.getSection();
  	} else {
  		var fromSysid = this.section.getUniqueValue();
  		var ss = new GlideSysSection(this.tableName);
  		var toSysid = ss.copySection(this.section);
  		if (toSysid === null)
  			return;

  		this._copySectionElements(toSysid, fromSysid);
  		return toSysid;
  	}
  },

  _hasForm: function(tableName, viewName) {
  	var gr = new GlideRecord('sys_ui_form');
  	gr.addQuery('name', tableName);
  	if (viewName != null)
  		gr.addQuery('view', viewName);
  	gr.query();

  	return gr.next();
  },

  _copyForm: function() {
  	var grTargetform = new GlideRecord('sys_ui_form');
  	grTargetform.addQuery('name', this.targetTable);
  	grTargetform.query();

  	while (grTargetform.next()) {
  		if (this._hasForm(this.tableName, grTargetform.view) == false) {
  			var grForm = new GlideRecord('sys_ui_form');
  			grForm.initialize();
  			grForm.view = grTargetform.view;
  			grForm.name = this.tableName;
  			grForm.insert();

  			var frmSys = grTargetform.getUniqueValue();

  			var scm2m = new GlideRecord("sys_ui_form_section");
  			scm2m.addQuery("sys_ui_form", frmSys);
  			scm2m.addNotNullQuery("sys_ui_section");
  			scm2m.query();
  			var nf_id = grForm.getUniqueValue();
  			while (scm2m.next()) {
  				scm2m.sys_ui_form = nf_id;
  				var nsc_id = this._copyFormSection(scm2m.sys_ui_section, grTargetform.view);

  				if (!nsc_id)
  					continue;
  				scm2m.sys_ui_section = nsc_id;
  				scm2m.insert();
  			}

  			//Regenerate update payload of sys_ui_form_sections
  			var glideform = new GlideSysForms(this.tableName);
  			glideform.setFormID(nf_id);
  			glideform.save();
  		}
  	}

  },

  _copyFormSection: function(id, view) {
  	var sc = new GlideRecord("sys_ui_section");
  	if (!sc.get(id))
  		return;

  	var ss = new GlideSysSection(this.tableName);
  	var nsc_id = ss.copySection(sc);
  	if (nsc_id === null)
  		return;

  	this._copySectionElements(nsc_id, id);

  	//generate newly created sys_ui_section update payload
  	var newSc = new GlideRecord("sys_ui_section");
  	if (newSc.get(nsc_id)) {
  		var saver = new GlideUpdateManager2();
  		saver.saveRecord(newSc);
  	}

  	return nsc_id;
  },

  _copySectionElements: function(toID, fromID) {
  	var gr = new GlideRecord(this.SYS_UI_ELEMENT);
  	gr.addQuery(this.SYS_UI_SECTION, fromID);
  	gr.query();
  	while (gr.next()) {
  		gr.sys_ui_section = toID;
  		gr.insert();
  	}
  },

  z: function() {}

});

Sys ID

8842c4a4c0a8016800de382d677a3b39

Offical Documentation

Official Docs: