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