Create a link/reference between two tables using a modal.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-11-2023 06:39 AM
Hello All,
I am trying to recreate functionality in my PDI for my own application.
I attempted to recreate the 'Add' UI action and 'AssociateCIToTask' Script Include and changing the table names to align with the tables I have in my application. Unfortunately, when doing so I am presented with a page not found error in my modal (Attached Picture). My belief is the url to my table is incorrect, but I am unsure how to resolve this.
Within the PDI, there is a 'change' table that can be found using the filter navigator. To view the change requests within the change table, click ‘open’. After clicking ‘open’, you are taken to the 'change requests' table. Click any of the links under Number to open an individual change request ticket. In my case, I opened ticket ‘CHG0002001’. Within the CHG0002001 ticket, under Related Links there is a tab titled 'Impacted Services/CIs'. Users can add to the related list by clicking the 'Add' button.
After clicking the Add button, a UI action is run. A modal appears and within the modal is a table of Configuration Items.
Here, the user selects which items will be added to the related list. Once the selected, the user clicks the Add Selected button.
The modal then closes and you a returned to the CHG0002001 ticket. The selections are added to the related list and now linked to the change request ticket.
Essentially, this is creating a link/reference to the change request ticket to the configuration item table items using a modal.
My 'AssociateCIToTask' Script Include:
var AssociateCIToTask = Class.create();
AssociateCIToTask.prototype = Object.extendsObject(AbstractAjaxProcessor, {
SESSION_KEY: 'com.snc.cats_projects.AssociateCIToTask.ci_user_filter',
ajaxFunction_getURL: function(){
var chgReqId = this.getParameter("sysparm_id");
var addToTable = this.getParameter("sysparm_add_to") + "";
return this._getURL(chgReqId, addToTable);
},
_getURL: function(chgReqId, addToTable){
this.removeUserFilter();
var url = new GlideURL("cats_project_spot_check_findings.do");
url.set("sysparm_crSysId", chgReqId);
url.set("sysparm_view", "empty");
url.set("sysparm_add_to", addToTable);
url.set("sysparm_table", "x_fadoo_cats_cats_project_i_l");
url.set("sysparm_stack", "no");
return new GlideTinyURL().createTinyURL(url);
},
/*
* If "Best Practice - Bulk CI Changes" plugin is active and task type is change_requests
* parent class = ci_class populated on the change_request
* if --None- is selected for ci_class, then cmdb_ci is returned
* else
* parent class = cmdb_ci
**/
storeUserFilter: function(){
var filter;
filter = this.getParameter("sysparm_filter_query");
gs.getSession().putClientData(this.SESSION_KEY, filter);
return;
},
removeUserFilter: function(){
gs.getSession().clearClientData(this.SESSION_KEY);
return;
},
_isValidTask: function(id) {
var gr = new GlideRecord('task');
return gr.get(id) && gr.active;
},
addSelected: function() {
var id = this.getParameter("sysparm_id");
if(!this._isValidTask(id)){
gs.error("Unable to Add CI item(s) for an inactive/invalid task {0}", id);
return;
}
var addToTable = this.getParameter("sysparm_add_to_table") + "";
var selCIsList = this.getParameter("sysparm_selCIs");
if (!selCIsList)
return;
var affectedCI = new GlideRecord(addToTable);
if (affectedCI.canCreate()) {
var selCIs = selCIsList.split(",");
var existingCI = new GlideRecord(addToTable);
var col = this.getCIField(addToTable);
existingCI.addQuery(col, "IN", selCIsList);
existingCI.addQuery("task", id);
existingCI.query();
var addedCIs = [];
while (existingCI.next())
addedCIs.push(existingCI.getValue(col) + '');
for (var i = 0; i < selCIs.length; i++) {
if (addedCIs.indexOf(selCIs[i] + '') == -1) {
affectedCI.initialize();
affectedCI.task = id;
affectedCI.setValue(col, selCIs[i]);
affectedCI.insert();
}
}
}
},
getLatestClass: function(chgReqId){
var affectedCiGR = new GlideRecordSecure("task_ci");
affectedCiGR.addQuery("task", chgReqId);
affectedCiGR.orderByDesc("sys_updated_on");
affectedCiGR.setLimit(1);
affectedCiGR.query();
if (affectedCiGR.next())
return affectedCiGR.ci_item.sys_class_name;
return "";
},
getCIField: function(table) {
if ("task_ci" === table)
return "ci_item";
else if ("task_service_offering" === table)
return "service_offering";
return "cmdb_ci_service";
},
addAll: function() {
var addToTable = this.getParameter("sysparm_add_to_table") + "";
var id = this.getParameter("sysparm_id");
if(!this._isValidTask(id)){
gs.error("Unable to Add CI item(s) for an inactive/invalid task {0}", id);
return;
}
var affectedCI = new GlideRecord(addToTable);
if (affectedCI.canCreate()) {
var fixedQuery = this.getParameter("sysparm_fixed_query");
var query = this.getParameter("sysparm_query");
var listTableName = this.getParameter("sysparm_tableName");
var result = [];
var existingCI = new GlideRecord(addToTable);
existingCI.addQuery("task", id);
existingCI.query();
var col = this.getCIField(addToTable);
while (existingCI.next())
result.push(existingCI.getValue(col) + '');
var affectedCiGR = new GlideRecordSecure(listTableName);
affectedCiGR.addEncodedQuery(fixedQuery);
affectedCiGR.addEncodedQuery(query);
affectedCiGR.addQuery("sys_id", "NOT IN", result.join());
affectedCiGR.query();
while (affectedCiGR.next()) {
affectedCI.initialize();
affectedCI.task = id;
affectedCI.setValue(col, affectedCiGR.sys_id);
affectedCI.insert();
}
}
},
getTotalNumberOfItems: function() {
var query = this.getParameter("sysparm_query");
var listTableName = this.getParameter("sysparm_table");
var affectedCiGR = new GlideAggregate(listTableName);
if (!affectedCiGR.canRead())
return 0;
affectedCiGR.addEncodedQuery(query);
affectedCiGR.addAggregate('COUNT');
affectedCiGR.query();
if (affectedCiGR.next())
return affectedCiGR.getAggregate('COUNT') - 0;
return 0;
},
isPublic: function() {
return false;
},
type: "AssociateCIToTask"
});
My 'Add' UI action:
function openCmdbCIServiceList(){
var gajax = new GlideAjax("AssociateCIToTask");
gajax.addParam("sysparm_name","getURL");
gajax.addParam("sysparm_id", g_form.getUniqueValue());
gajax.addParam("sysparm_add_to", "task_cmdb_ci_service");
gajax.getXMLAnswer(openServicesList);
}
function openServicesList(url) {
var cmdbciModal = new GlideModal('task_add_affected_cis');
cmdbciModal.setTitle(getMessage("Add Impacted Items"));
cmdbciModal.setWidth(1200);
cmdbciModal.setAutoFullHeight(true);
cmdbciModal.on('beforeclose', function(){
refreshImpactedServices();
});
ScriptLoader.getScripts('/scripts/incident/glide_modal_accessibility.js', function() {
cmdbciModal.template = glideModalTemplate;
cmdbciModal.renderIframe(url, function(event) {
glideModalKeyDownHandler(event, cmdbciModal.getID());
});
});
var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'styles/incident_glide_modal.css';
document.head.appendChild(link);
}
function refreshImpactedServices(){
GlideList2.get(g_form.getTableName() + '.' + g_list.getRelated()).setFilterAndRefresh('');
var modal = window.GlideModal.prototype.get('task_add_affected_cis');
if (modal && modal.message)
g_form.addInfoMessage(modal.message);
}
function resizeIframe(){
var x = g_glideBoxes.cm_add_affected_cis;
x.autoDimension();
x.autoPosition();
x._createIframeShim();
}
PDI 'AssociateCIToTask' Script Include:
var AssociateCIToTask = Class.create();
AssociateCIToTask.prototype = Object.extendsObject(AbstractAjaxProcessor, {
SESSION_KEY: 'com.snc.change_request.AssociateCIToTask.ci_user_filter',
ajaxFunction_getURL: function(){
var chgReqId = this.getParameter("sysparm_id");
var addToTable = this.getParameter("sysparm_add_to") + "";
return this._getURL(chgReqId, addToTable);
},
_getURL: function(chgReqId, addToTable){
this.removeUserFilter();
var latestClassAdded;
var parentClass = "";
var principalClassFilter = "";
// latestClassAdded logic
// 1. if there are ci's, get the latest class of the ci
// 2. default the latest class to parent class
if (addToTable === "task_ci") {
principalClassFilter = this.getPrincipalClassFilter(chgReqId);
if (!principalClassFilter)
latestClassAdded = this.getLatestClass(chgReqId);
parentClass = this.getParentClass(chgReqId);
if (!latestClassAdded)
latestClassAdded = parentClass;
}
else if (addToTable === "task_service_offering")
latestClassAdded = "service_offering";
else
latestClassAdded = "cmdb_ci";
var url = new GlideURL("task_add_affected_cis.do");
url.set("sysparm_crSysId", chgReqId);
url.set("sysparm_view", "associate_ci");
url.set("sysparm_add_to", addToTable);
url.set("sysparm_stack", "no");
url.set("sysparm_table", latestClassAdded);
url.set("sysparm_parent_class", parentClass);
url.set("sysparm_fixed_query", principalClassFilter);
return new GlideTinyURL().createTinyURL(url);
},
getQueryFilter: function(chgReqId, addToTable) {
var principalClassFilter = "";
if (addToTable === "task_ci")
principalClassFilter = this.getPrincipalClassFilter(chgReqId);
return principalClassFilter;
},
/*
* If "Best Practice - Bulk CI Changes" plugin is active and task type is change_requests
* parent class = ci_class populated on the change_request
* if --None- is selected for ci_class, then cmdb_ci is returned
* else
* parent class = cmdb_ci
**/
getParentClass: function(chgReqId) {
if (GlidePluginManager.isActive("com.snc.bestpractice.bulkchange") || GlidePluginManager.isActive("com.snc.change_management.mass_update_ci")) {
var chgReqGR = new GlideRecordSecure("change_request");
if (chgReqGR.get(chgReqId) && !chgReqGR.ci_class.nil()){
if ((chgReqGR.isValidField("is_bulk") && chgReqGR.getValue("is_bulk") === "1") || !chgReqGR.isValidField("is_bulk")) {
return chgReqGR.ci_class;
}
}
}
return "cmdb_ci";
},
getPrincipalClassFilter: function(chgReqId) {
if (!chgReqId)
return;
var taskGr = new GlideRecord("task");
taskGr.get(chgReqId);
if (!taskGr.isValidRecord()) {
gs.error("Invalid task record sys-id passed");
return;
}
return new TaskUtils().getPCFilterEvaluated(taskGr.sys_class_name + '');
},
storeUserFilter: function(){
var filter;
filter = this.getParameter("sysparm_filter_query");
gs.getSession().putClientData(this.SESSION_KEY, filter);
return;
},
removeUserFilter: function(){
gs.getSession().clearClientData(this.SESSION_KEY);
return;
},
_isValidTask: function(id) {
var gr = new GlideRecord('task');
return gr.get(id) && gr.active;
},
addSelected: function() {
var id = this.getParameter("sysparm_id");
if(!this._isValidTask(id)){
gs.error("Unable to Add CI item(s) for an inactive/invalid task {0}", id);
return;
}
var addToTable = this.getParameter("sysparm_add_to_table") + "";
var selCIsList = this.getParameter("sysparm_selCIs");
if (!selCIsList)
return;
var affectedCI = new GlideRecord(addToTable);
if (affectedCI.canCreate()) {
var selCIs = selCIsList.split(",");
var existingCI = new GlideRecord(addToTable);
var col = this.getCIField(addToTable);
existingCI.addQuery(col, "IN", selCIsList);
existingCI.addQuery("task", id);
existingCI.query();
var addedCIs = [];
while (existingCI.next())
addedCIs.push(existingCI.getValue(col) + '');
for (var i = 0; i < selCIs.length; i++) {
if (addedCIs.indexOf(selCIs[i] + '') == -1) {
affectedCI.initialize();
affectedCI.task = id;
affectedCI.setValue(col, selCIs[i]);
affectedCI.insert();
}
}
}
},
getLatestClass: function(chgReqId){
var affectedCiGR = new GlideRecordSecure("task_ci");
affectedCiGR.addQuery("task", chgReqId);
affectedCiGR.orderByDesc("sys_updated_on");
affectedCiGR.setLimit(1);
affectedCiGR.query();
if (affectedCiGR.next())
return affectedCiGR.ci_item.sys_class_name;
return "";
},
getCIField: function(table) {
if ("task_ci" === table)
return "ci_item";
else if ("task_service_offering" === table)
return "service_offering";
return "cmdb_ci_service";
},
addAll: function() {
var addToTable = this.getParameter("sysparm_add_to_table") + "";
var id = this.getParameter("sysparm_id");
if(!this._isValidTask(id)){
gs.error("Unable to Add CI item(s) for an inactive/invalid task {0}", id);
return;
}
var affectedCI = new GlideRecord(addToTable);
if (affectedCI.canCreate()) {
var fixedQuery = this.getParameter("sysparm_fixed_query");
var query = this.getParameter("sysparm_query");
var listTableName = this.getParameter("sysparm_tableName");
var result = [];
var existingCI = new GlideRecord(addToTable);
existingCI.addQuery("task", id);
existingCI.query();
var col = this.getCIField(addToTable);
while (existingCI.next())
result.push(existingCI.getValue(col) + '');
var affectedCiGR = new GlideRecordSecure(listTableName);
affectedCiGR.addEncodedQuery(fixedQuery);
affectedCiGR.addEncodedQuery(query);
affectedCiGR.addQuery("sys_id", "NOT IN", result.join());
affectedCiGR.query();
while (affectedCiGR.next()) {
affectedCI.initialize();
affectedCI.task = id;
affectedCI.setValue(col, affectedCiGR.sys_id);
affectedCI.insert();
}
}
},
getTotalNumberOfItems: function() {
var query = this.getParameter("sysparm_query");
var listTableName = this.getParameter("sysparm_table");
var affectedCiGR = new GlideAggregate(listTableName);
if (!affectedCiGR.canRead())
return 0;
affectedCiGR.addEncodedQuery(query);
affectedCiGR.addAggregate('COUNT');
affectedCiGR.query();
if (affectedCiGR.next())
return affectedCiGR.getAggregate('COUNT') - 0;
return 0;
},
isPublic: function() {
return false;
},
type: "AssociateCIToTask"
});
PDI 'Add' UI action:
function openCmdbCIServiceList(){
var gajax = new GlideAjax("AssociateCIToTask");
gajax.addParam("sysparm_name","getURL");
gajax.addParam("sysparm_id", g_form.getUniqueValue());
gajax.addParam("sysparm_add_to", "task_cmdb_ci_service");
gajax.getXMLAnswer(openServicesList);
}
function openServicesList(url) {
var cmdbciModal = new GlideModal('task_add_affected_cis');
cmdbciModal.setTitle(getMessage("Add Impacted Services/CIs"));
cmdbciModal.setWidth(1200);
cmdbciModal.setAutoFullHeight(true);
cmdbciModal.on('beforeclose', function(){
refreshImpactedServices();
});
ScriptLoader.getScripts('/scripts/incident/glide_modal_accessibility.js', function() {
cmdbciModal.template = glideModalTemplate;
cmdbciModal.renderIframe(url, function(event) {
glideModalKeyDownHandler(event, cmdbciModal.getID());
});
});
var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'styles/incident_glide_modal.css';
document.head.appendChild(link);
}
function refreshImpactedServices(){
GlideList2.get(g_form.getTableName() + '.' + g_list.getRelated()).setFilterAndRefresh('');
var modal = window.GlideModal.prototype.get('task_add_affected_cis');
if (modal && modal.message)
g_form.addInfoMessage(modal.message);
}
function resizeIframe(){
var x = g_glideBoxes.cm_add_affected_cis;
x.autoDimension();
x.autoPosition();
x._createIframeShim();
}