Name

sn_ace.FormBuilder

Description

No description available

Script

var FormBuilder = Class.create();

FormBuilder.VIEW_PAYLOAD = {
  "block_id": "",
  "id": "",
  "parent_block_id": "",
  "active": true,
  "name": "View",
  "label": "",
  "title": "",
  "subtitle": "",
  "order": "100",
  "props_details": {
      "component_name": "now-uxf-page-container",
      "component_properties": {
          "label": "Test1233",
          "canCollapse": true,
          "collapsed": false
      }
  },
  "type": {
      "group": "container",
      "name": "Generic",
      "id": "439e03fbeb611430d05213b347522802",
      "route": "generic"
  }
};

FormBuilder.SECTION_PAYLOAD = {
  "block_id": "",
  "id": "",
  "parent_block_id": "",
  "active": true,
  "name": "SECTION",
  "label": "",
  "title": "",
  "subtitle": "",
  "order": "100",
  "props_details": {
      "component_name": "sn-styleable-container",
      "component_properties": {
          "styles": {
              "display": "grid",
              "grid-template-columns": "1fr",
              "grid-template-rows": "1fr",
              "grid-auto-rows": "1fr",
              "grid-auto-columns": "1fr",
              "justify-content": "space-around",
              "gap": "var(--now-static-space--md)",
              "padding": "var(--now-static-space--lg)",
              "box-shadow": "rgba(99, 99, 99, 0.2) 0px 2px 8px 0px",
              "background-color": "#fafdff"
          }
      }
  },
  "type": {
      "group": "container",
      "name": "Generic",
      "id": "439e03fbeb611430d05213b347522802",
      "route": "generic"
  }
};

FormBuilder.ROW_PAYLOAD = {
  "block_id": "",
  "id": "",
  "parent_block_id": "",
  "active": true,
  "name": "ROW",
  "label": "",
  "title": "",
  "subtitle": "",
  "order": "100",
  "props_details": {
      "component_name": "sn-styleable-container",
      "component_properties": {
          "styles": {
              "display": "grid",
              "grid-template-columns": "1fr 1fr",
              "grid-template-rows": "1fr",
              "grid-auto-rows": "1fr",
              "grid-auto-columns": "1fr",
              "justify-content": "space-around",
              "gap": "var(--now-static-space--md)",
              "padding": "var(--now-static-space--lg)",
              "box-shadow": "rgba(99, 99, 99, 0.2) 0px 2px 8px 0px",
              "background-color": "#f3f2f8"
          }
      }
  },
  "type": {
      "group": "container",
      "name": "Generic",
      "id": "439e03fbeb611430d05213b347522802",
      "route": "generic"
  }
};

FormBuilder.COLUMN_PAYLOAD = {
  "block_id": "",
  "id": "",
  "parent_block_id": "",
  "active": true,
  "name": "COLUMN",
  "label": "",
  "title": "",
  "subtitle": "",
  "order": "100",
  "props_details": {
      "component_name": "sn-styleable-container",
      "component_properties": {
          "styles": {
              "display": "grid",
              "grid-template-columns": "1fr",
              "grid-template-rows": "1fr",
              "grid-auto-rows": "1fr",
              "grid-auto-columns": "1fr",
              "justify-content": "space-around",
              "gap": "var(--now-static-space--md)",
              "padding": "var(--now-static-space--lg)",
              "box-shadow": "rgba(99, 99, 99, 0.2) 0px 2px 8px 0px",
              "background-color": "white"
          }
      }
  },
  "type": {
      "group": "container",
      "name": "Generic",
      "id": "439e03fbeb611430d05213b347522802",
      "route": "generic"
  }
};

FormBuilder.ELEMENT_PAYLOAD = {
  "block_id": "50ac9ad8ac3f10110fc8629bca840dd20",
  "id": "50ac9ad8ac3f10110fc869b2c8a84dd20",
  "parent_block_id": "",
  "active": true,
  "name": "ELEMENT",
  "label": "",
  "title": "",
  "subtitle": "",
  "order": "100",
  "props_details": {
      "component_name": "now-input",
      "component_properties": {
          "label": ""
      }
  },
  "type": {
      "group": "container",
      "name": "Generic",
      "id": "439e03fbeb611430d05213b347522802",
      "route": "generic"
  }
};

FormBuilder.prototype = {
  initialize: function() {

  },

  getLabel: function(tableName, elementName) {
      var gr = new GlideRecord('sys_documentation');
      gr.addQuery('name', tableName);
      gr.addQuery('element', elementName);
      gr.query();
      if (gr.next()) {
          return gr.getDisplayValue('label');
      }
      return "";
  },

  getLabelFromTableHierarchy: function(tableName, elementName) {
      var label = this.getLabel(tableName, elementName);
      if (label)
          return label;

      var tableHierarchy = new GlideTableHierarchy(tableName);
      var tables = tableHierarchy.getTables();
      var parentTables = tables.filter(function(table) {
          return table != tableName;
      });
      for (var index in parentTables) {
          label = this.getLabel(parentTables[index], elementName);
          if (label)
              return label;
      }
      return "";
  },

  getFormElements: function(tableName, viewName) {
      var formElements = {};
      var formGr = new GlideRecord('sys_ui_form');
      formGr.addQuery('name', tableName);
      formGr.addQuery('view.title', viewName);
      formGr.query();
      if (!formGr.hasNext())
          return formElements;
      formGr.next();
      formElements.id = viewName;
      formElements.label = formGr.getDisplayValue('view');
      formElements.type = "view";
      formElements.tableName = tableName;
      formElements.children = [];

      var formSectionGr = new GlideRecord('sys_ui_form_section');
      formSectionGr.addQuery('sys_ui_form', formGr.getUniqueValue());
      formSectionGr.orderBy('position');
      formSectionGr.query();
      while (formSectionGr.next()) {
          var sectionObj = {};
          var sectionLabel = !formSectionGr.getDisplayValue('sys_ui_section') ? "empty" : formSectionGr.getDisplayValue('sys_ui_section');
          sectionObj.id = sectionLabel;
          sectionObj.position = formSectionGr.getValue('position');
          sectionObj.label = sectionLabel;
          sectionObj.type = "section";
          formElements.children.push(sectionObj);

          var elementGr = new GlideRecord('sys_ui_element');
          elementGr.addQuery('sys_ui_section', formSectionGr.getValue('sys_ui_section'));
          elementGr.orderBy('position');
          elementGr.query();
          var elements = [];
          while (elementGr.next()) {
              var obj = {};
              obj.id = elementGr.getValue('element');
              obj.position = elementGr.getValue('position');
              obj.label = this.getLabelFromTableHierarchy(tableName, obj.id);
              obj.type = "element";
              elements.push(obj);
          }
          sectionObj.children = elements;
      }
      return formElements;
  },

  hasSplitElement: function(elements) {
      var result = elements.filter(function(element) {
          return element['id'] === '.split';
      });
      return result.length > 0;
  },

  hasEndSplitElement: function(elements) {
      var result = elements.filter(function(element) {
          return element['id'] === '.end_split';
      });
      return result.length > 0;
  },

  hasBeginSplitElement: function(elements) {
      var result = elements.filter(function(element) {
          return element['id'] === '.begin_split';
      });
      return result.length > 0;
  },

  processPayload: function(payload, obj) {
      payload.block_id = gs.generateGUID();
      payload.title = obj.id;
      payload.subtitle = obj.id + ' - subtitle';
      payload.label = obj.label;
  },

  createSectionPayload: function(obj) {
      var sectionPayload = JSON.parse(JSON.stringify(FormBuilder.SECTION_PAYLOAD));
      sectionPayload.children = [];
      this.processPayload(sectionPayload, obj);
      return sectionPayload;
  },

  createElementPayload: function(obj) {
      var elementPayload = JSON.parse(JSON.stringify(FormBuilder.ELEMENT_PAYLOAD));
      elementPayload.children = [];
      this.processPayload(elementPayload, obj);
      return elementPayload;
  },

  addRow: function(sectionPayload, obj) {
      var rowPayload = JSON.parse(JSON.stringify(FormBuilder.ROW_PAYLOAD));
      rowPayload.children = [];
      this.processPayload(rowPayload, obj);
      sectionPayload.children.push(rowPayload);
      return rowPayload;
  },

  addColumn: function(rowPayload, obj) {
      var columnPayload = JSON.parse(JSON.stringify(FormBuilder.COLUMN_PAYLOAD));
      columnPayload.children = [];
      this.processPayload(columnPayload, obj);
      rowPayload.children.push(columnPayload);
      return columnPayload;
  },

  generateContentBlock: function(formElements) {
      var contentBlocks = [];

      if (formElements.type == "view") {
          viewPayload = JSON.parse(JSON.stringify(FormBuilder.VIEW_PAYLOAD));
          viewPayload.children = [];
          this.processPayload(viewPayload, formElements);
          viewPayload.tableName = formElements.tableName;
          contentBlocks.push(viewPayload);
      }

      if (!(formElements.children && formElements.children.length))
          return contentBlocks;


      for (var sectionIndex in formElements.children) {
          var section = formElements.children[sectionIndex];
          var sectionPayload = this.createSectionPayload(section);

          var rowPayload = this.addRow(sectionPayload, section);
          var columnPayload = {};
          var column1 = [],
              column2 = [];
          var beginSplit = false,
              split = false,
              endSplit = false;

          var elements = section.children;
          this.hasSplitElement(elements) ? beginSplit = true : endSplit = true;

          for (var elementIndex in elements) {
              var element = elements[elementIndex];
              if (element.id == '.begin_split') {
                  beginSplit = true;
                  split = false;
                  endSplit = false;
                  column1 = [];
                  column2 = [];
                  continue;
              } else if (element.id == '.split') {
                  split = true;
                  beginSplit = false;
                  endSplit = false;
                  if (column1.length) {
                      columnPayload = this.addColumn(rowPayload, element);
                      columnPayload.children = column1;
                      column1 = [];
                  }
                  continue;
              } else if (element.id == '.end_split') {
                  endSplit = true;
                  split = false;
                  beginSplit = false;
                  if (column2.length) {
                      columnPayload = this.addColumn(rowPayload, element);
                      columnPayload.children = column2;
                      column2 = [];
                  }
                  continue;
              }
              if (beginSplit)
                  column1.push(this.createElementPayload(element));
              else if (split)
                  column2.push(this.createElementPayload(element));
              else if (endSplit)
                  rowPayload.children.push(this.createElementPayload(element));
          }
          if (this.hasSplitElement(elements) && !this.hasEndSplitElement(elements) && column2.length) {
              columnPayload = this.addColumn(rowPayload, {
                  "id": "COLUMN",
                  "label": "COLUMN LABEL"
              });
              columnPayload.children = column2;
              column2 = [];
          }
          contentBlocks[0].children.push(sectionPayload);
      }
      return contentBlocks;
  },

  getContentBlocks: function(tableName, viewName) {
      var response = {};
      response.status = "success";
      if (!tableName) {
          response.status = "failure";
          response.errMessage = "tableName must be populated";
          return response;
      }

      var gr = new GlideRecord(tableName);
      if (!gr.isValid) {
          response.status = "failure";
          response.errMessage = "Invalid table name!!";
          return response;
      }
      if (!viewName)
          viewName = 'Default view';

      var formElements = this.getFormElements(tableName, viewName);
      response.contentBlocks = this.generateContentBlock(formElements);
      response.status = "success";
      return response;
  },

  getSplitType: function(elements) {
      var splitType = "";
      elements.forEach(function(element) {
          if (element.id == '.begin_split') splitType = '.split';
          else if (element.id == '.split') splitType = '.end_split';
          else if (element.id == '.end_split') splitType == '.begin_split';
      });
      return splitType;
  },

  getSectionElements: function(sections, formElements) {
      var elements = sections.children;
      if (!elements)
          return;

      var fields = [];
      var position = 0;
      for (var index in elements) {
          var element = elements[index];
          if (element.name == '1') {
              var section = {};
              section.id = !element.label ? "" : element.title;
              section.label = element.title;
              section.sysId = element.sysId;
              section.type = "section";
              if (element.hasOwnProperty('new'))
                  section['new'] = element['new'];
              if (element.hasOwnProperty('edit'))
                  section['edit'] = element['edit'];
              section.position = position++ + "";
              formElements.children.push(section);
          }
          if (element.name == '4') {
              var field = {};
              field.id = element.props_details.component_properties.name;
              field.label = element.label;
              field.type = "element";
              field.position = position++ + "";
              fields.push(field);
          }
          if (element.children && element.children.length > 0)
              this.getSectionElements(element, formElements);
      }
      if (fields.length) {
          var lastSection = formElements.children[formElements.children.length - 1];
          var newPosition = 0;

          if (!lastSection.children) {
              lastSection.children = [];
              lastSection.children.push({
                  "id": ".begin_split",
                  "position": newPosition + "",
                  "label": "",
                  "type": "element"
              });
              newPosition = 1;
          } else {
              newPosition = lastSection.children.length;
              lastSection.children.push({
                  // "id": this.getSplitType(lastSection.children),
                  "id": sections.name == "2" ? ".end_split" : ".split",
                  "position": newPosition + "",
                  "label": "",
                  "type": "element"
              });
              newPosition++;
          }

          fields.forEach(function(field) {
              field.position = newPosition++ + "";
              lastSection.children.push(field);
          });
      }
  },

  getFormElementsFromContentBlock: function(contentBlock) {
      var formElements = {};
      var header = contentBlock[0];
      formElements.table = header.table;
      formElements.view = header.view;
      formElements.type = "view";
      formElements.children = [];

      this.getSectionElements(header, formElements);
      return formElements;
  },

  updateFormFields: function(formElements) {
      var response = {};
      var tableName = formElements.table;
      var view = formElements.view;
      var aceAPI = new global.ACEGlobalAPI();
      var viewGr = aceAPI.getView(view);
      if (!viewGr) {
          response.status = "failure";
          response.message = "Invalid view name!!";
          return;
      }
      var updatedSections = formElements.children.filter(function(section) {
          var hasNewSection = section.hasOwnProperty('new') && section['new'] == true;
          var hasEditSection = (section.hasOwnProperty('edit') && section['edit'] == true);
          return (hasNewSection || hasEditSection);
      });
      try {
          updatedSections.forEach(function(section) {
              var elements = section.children;
              aceAPI.removeSectionElements(tableName, view, section);
              var sectionGr = aceAPI.createSection(tableName, viewGr, section);
              aceAPI.createFormSection(tableName, viewGr, sectionGr, section);
              aceAPI.createSectionElements(sectionGr, elements);
          });
          response.status = "success";
          response.message = "Form fields updated successfully!!";
      } catch (e) {
          response.status = "failure";
          response.message = "Error while processing the payload!!";
      }
      return response;
  },

  type: 'FormBuilder'
};

Sys ID

d4af07727732d110bc5db5b27a5a99e4

Offical Documentation

Official Docs: