- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-19-2023 01:16 PM
I have a requirement that we show a conflict message only for normal, standard and urgent changes
I have updated the conflict properties and the onchange rule to reflect the new message.
The problem i am having is excluding emergency changes (which don't require this message to show)
I've tried adding if (startDateReadOnly && type != 'emergency" || endDateReadOnly && type !=emergency) to the below code without any luck.
How could i prevent this from showing if the change type is emergency?
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-19-2023 01:44 PM
OK Along with above changes in client script , update following ChangeRequestConflictUtils :
function initializeConflictDetection() {
var trackerId = $('tracker_id').value;
if (trackerId !== "") {
runBackgroundPoll(trackerId);
showProgressButton(true);
}
// Ensure the warning message and check conflicts button are
// correctly shown/hidden (Poll every 2 seconds in case User has
// cleared one of the 3 mandatory conflict detection fields)
setInterval(updateWarningBoxAndConflictButton, 2000);
setTimeout(function() {
if (!g_form.isNewRecord() && ($('tracker_id').value !== "")) {
if (updateWarningBoxAndConflictButton()) {
updateConflictStatus();
refreshConflicts();
}
}
}, 1000);
$("conflict_action_run").observe("click", function(event) {
event.stop();
// If we have unfilled mandatory fields then do not progress
if (!g_form.mandatoryCheck())
return;
if (g_form.getValue('type')== 'emergency') // to make sure conflict calculation not to run
return;
if (g_form.isNewRecord() || g_form.modified){
// Add a hidden parameter to indicate that the run conflict detection should be run after the form has saved
var afterSaveURL = new GlideURL();
if (g_form.isNewRecord())
afterSaveURL.setFromString(g_form.getTableName() + '.do?sys_id=' + g_form.getUniqueValue());
else
afterSaveURL.setFromCurrent();
addHidden(g_form.getFormElement(), 'sysparm_goto_url', afterSaveURL.getURL().replace(g_form.getTableName() + '.do','change_conflict_ui.do'));
g_form.save();
} else
runConflictDetection();
});
//Add event listener for list v2 changes for Affected CI's
CustomEventManager.observe('partial.page.reload', function (elem, e) {
if (e && e.listID === g_form.getTableName() + '.task_ci.task')
$('affected_item_count').value = e.totalRows;
});
//Add event listener for list v3 changes for Affected CI's
CustomEventManager.observe('g_list.api.refresh', function (e) {
if (e && e.listId === g_form.getTableName() + '.task_ci.task')
$('affected_item_count').value = GlideList.get(g_form.getTableName() + '.task_ci.task').getRowCount();
});
var runTrackerEl = $('run_tracker_ui');
if (runTrackerEl && runTrackerEl.value == 'true')
runConflictDetection();
}
function getSchedulingConflictMessage() {
var startDateReadOnly = g_form.is ("", g_form.getControl("start_date"));
var endDateReadOnly = g_form.isReadOnly("", g_form.getControl("end_date"));
if (startDateReadOnly || endDateReadOnly)
return new GwtMessage().getMessage("Scheduling conflict detected. Review the Conflicts form section.");
return new GwtMessage().getMessage("The Planned Start or Planned End Data falls within a Scheduled Change Freeze. Use the <a href='javascript:void(0);' onclick='openNextAvailableTime()'>Scheduling Assistant</a> to avoid conflicts. If the change MUST occur at this time then approval will be needed from Joey Sudomir (including for Standard Changes)");
}
function runConflictDetection() {
var cancelButtonId = 'cancelButton';
var backgroundlButtonId = 'runInBackgroundButton';
var dd = new GlideModal("simple_progress_viewer", true, "40em", "10.5em");
dd.setTitle(new GwtMessage().getMessage("Checking conflicts"));
dd.setPreference('sysparm_progress_name', "Conflict Checker");
dd.setPreference("sysparm_renderer_expanded_levels", "0");
dd.setPreference("sysparm_renderer_hide_drill_down", true);
if ($('tracker_id').value == "") {
dd.setPreference("sysparm_ajax_processor", "ChangeConflictAJAXProcessor");
dd.setPreference("sysparm_sysid", g_form.getUniqueValue());
} else
dd.setPreference('sysparm_renderer_execution_id', $('tracker_id').value + "");
dd.setPreference("sysparm_button_close", new GwtMessage().getMessage("Close"));
dd.on("executionComplete", function(trackerObj) {
receiveMessage(trackerObj);
if (trackerObj.state == 4){
var progressContainer = $("simple_progress_viewer");
if (progressContainer)
progressContainer.down("#container").innerHTML = $("conflict_canceled_progress_status").innerHTML;
}
var closeBtn = $("sysparm_button_close");
if (closeBtn) {
closeBtn.onclick = function() {
showProgressButton(false);
dd.destroy();
};
}
var cancelButton = $(cancelButtonId);
if (cancelButton)
cancelButton.hide();
var backgroundButton = $(backgroundlButtonId);
if (backgroundButton)
backgroundButton.hide();
});
dd.on("beforeclose", function() {
runBackgroundPoll($('tracker_id').value);
});
dd.on("renderStatus", function(trackerObj) {
// Record the value of the tracker for future use
$('tracker_id').value = trackerObj.sys_id;
// Add the cancel button
if (!dd.hasCancelButton){
// Create a button that closes the dialog when it is clicked
// (But continues to run conflict detection in the background)
var button = new Element('button', {'id': cancelButtonId, 'class': 'btn btn-default', 'style': 'margin: 0px 4px 0px 4px;'});
button.update(new GwtMessage().getMessage("Cancel"));
button.observe("click", function(event) {
var backgroundButton = $(backgroundlButtonId);
if (backgroundButton)
backgroundButton.disable();
cancelConflictDetection($('tracker_id').value);
});
// Add the button to the dialog and make a note of the fact that you added it
var buttonPanel = $('buttonsPanel');
buttonPanel.appendChild(button);
dd.hasCancelButton = true;
}
// Add the Run in background button
if (!dd.hasRunInBackgroundButton){
// Create a button that closes the dialog when it is clicked
// (But continues to run conflict detection in the background)
var button = new Element('button', {'id': backgroundlButtonId, 'class': 'btn btn-primary', 'style': 'margin: 0px 4px 0px 4px;'});
button.update(new GwtMessage().getMessage("Run in Background"));
button.observe("click", function(event) {
var cancelButton = $(cancelButtonId);
if (cancelButton)
cancelButton.disable();
runBackgroundPoll($('tracker_id').value);
dd.destroy();
});
// Add the button to the dialog and make a note of the fact that you added it
var buttonPanel = $('buttonsPanel');
buttonPanel.appendChild(button);
dd.hasRunInBackgroundButton = true;
}
});
showProgressButton(true);
dd.render();
}
function updateWarningBoxAndConflictButton() {
// Get values of all fields to determine if conflict detection should be allowed or not
var cmdbCi = g_form.getValue('cmdb_ci');
var startDate = g_form.getValue('start_date');
var endDate = g_form.getValue('end_date');
var conflictMode = $('conflict_mode').value;
var affectedItemCount = $('affected_item_count').value;
// Get references to the two gui widgets you intend to enable/disable
var warningBox = $('conflictDetectionStatus');
var checkConflictsButton = $('conflict_action_run');
// Case1: Basic Mode + Configuration Item + Planned Start Date + Planned End Date
if (conflictMode == 'basic' && cmdbCi != '' && startDate != '' && endDate != '') {
warningBox.hide();
checkConflictsButton.enable();
return true;
}
// Case2: Advanced Mode + Configuration Item + Planned Start Date + Planned End Date
if (conflictMode == 'advanced' && cmdbCi != '' && startDate != '' && endDate != '') {
warningBox.hide();
checkConflictsButton.enable();
return true;
}
// Case3: Advanced Mode + Affected Items + Planned Start Date + Planned End Date
if (conflictMode == 'advanced' && parseInt(affectedItemCount) != 0 && startDate != '' && endDate != '') {
warningBox.hide();
checkConflictsButton.enable();
return true;
}
// Default: Do not allow User to run conflict detection
warningBox.show();
checkConflictsButton.disable();
return false;
}
function showProgressButton(boolValue) {
if (boolValue) {
$("conflict_run_state").value = "executing";
$("conflict_action_run").innerHTML = new GwtMessage().getMessage("View Progress");
} else {
$("conflict_run_state").value = "ready";
$("conflict_action_run").innerHTML = new GwtMessage().getMessage("Check Conflicts");
}
}
function runBackgroundPoll(sysId) {
if (sysId != "") {
var ga = new GlideAjax('ChangeConflictAJAXProcessor');
ga.addParam('sysparm_name', 'getTrackerRecord');
ga.addParam('sysparm_tracker_id', sysId);
ga.getXMLAnswer(function (answer){
receiveMessage(answer.evalJSON());
});
}
}
function cancelConflictDetection(sysId) {
if (sysId != "") {
var ga = new GlideAjax('ChangeConflictAJAXProcessor');
ga.addParam('sysparm_name', 'cancel');
ga.addParam('sysparm_tracker_id', sysId);
ga.getXML();
}
}
function everyTenPercent(percent, handler) {
this.data = this.data || [false, false, false, false, false, false, false, false, false, false, false];
var slot = ((Math.round(percent / 10) * 10) / 10);
if (this.data[slot])
return;
this.data[slot] = true;
handler();
}
function refreshConflicts() {
var conflictLists = GlideList2.getListsForTable("conflict");
var impactedCIs = GlideList2.get(g_form.getTableName() + '.task_cmdb_ci_service.task');
conflictLists.push(impactedCIs);
for (var i = 0; i < conflictLists.length; ++i)
if (conflictLists[i]) //Check that the list is valid before trying to refresh
conflictLists[i].refresh();
}
function receiveMessage(tracker) {
/**
* 0 - Pending
* 1 - Running
* 2 - Successful
* 3 - Failed
* 4 - Cancelled
*/
if (tracker.state == 0 || tracker.state == 1) {
everyTenPercent(tracker.percent_complete, refreshConflicts);
$("conflict_status").update(new GwtMessage().getMessage("{0}% completed", tracker.percent_complete));
setTimeout(function() {
this.runBackgroundPoll($("tracker_id").value);
}, 2000);
} else {
$("tracker_id").value = "";
showProgressButton(false);
switch (tracker.state - 0){
case 2:
refreshConflicts();
updateConflictLastRun(tracker.timestamp);
updateConflictStatus();
$("conflict_status").update(new GwtMessage().getMessage("Completed"));
break;
case 3:
case 4:
deleteConflicts(tracker);
break;
}
setTimeout(function() {
$("conflict_status").update("");
}, 5000);
}
}
function deleteConflicts(trackerObj){
if (trackerObj.state == 3)
$("conflict_status").update(new GwtMessage().getMessage("Failed"));
if (trackerObj.state == 4)
$("conflict_status").update(new GwtMessage().getMessage("Canceled"));
var ga = new GlideAjax('ChangeConflictAJAXProcessor');
ga.addParam('sysparm_name', 'deleteConflicts');
ga.addParam('sysparm_sys_id', g_form.getUniqueValue());
ga.getXML(function(){
refreshConflicts();
updateConflictLastRun("");
g_form.setValue('conflict_status', 'Not Run');
});
}
function updateConflictLastRun(timestamp) {
// update the field which gets displayed when time displayed in 'calendar' or 'both' modes
var conflictLastRunCalendar = $('sys_readonly.' + g_form.getTableName() + '.conflict_last_run');
if (conflictLastRunCalendar)
conflictLastRunCalendar.setValue(timestamp);
// update the field which gets displayed when time displayed in 'timeAgo' mode
var conflictLastRunTimeAgo = $(g_form.getTableName() + '.conflict_last_run.timeago');
if (conflictLastRunTimeAgo)
conflictLastRunTimeAgo.update(new GwtMessage().getMessage("Just now"));
}
function updateConflictStatus() {
var conflictLastRun = $('sys_readonly.' + g_form.getTableName() + '.conflict_last_run');
var ga = new GlideAjax("ChangeConflictAJAXProcessor");
ga.addParam('sysparm_name', 'getConflictData');
ga.addParam('sysparm_change_id', g_form.getUniqueValue());
ga.getXML(function(message) {
var conflictInfo = message.responseXML.documentElement.getAttribute("answer").evalJSON();
if (conflictInfo.conflictCount === 0) {
if (conflictLastRun == '')
g_form.setValue('conflict_status', 'Not Run');
else {
g_form.setValue('conflict_status', 'No Conflict');
updateConflictLastRun(conflictInfo.timestamp);
}
} else {
g_form.setValue('conflict_status', 'Conflict');
updateConflictLastRun(conflictInfo.timestamp);
}
});
}
Changes present on line 30
Regards,Sushant Malsure
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-19-2023 01:19 PM
Can you share the complete script of your onChnage() client script?
I am little confused on how the functions are called
Regards,Sushant Malsure
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-19-2023 01:22 PM
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
function getSchedulingConflictMessage() {
var startDateReadOnly = g_form.isReadOnly("", g_form.getControl("start_date"));
var endDateReadOnly = g_form.isReadOnly("", g_form.getControl("end_date"));
if (startDateReadOnly || endDateReadOnly)
return new GwtMessage().getMessage("Scheduling conflict detected. Review the Conflicts form section.");
return new GwtMessage().getMessage("<font color='red'><font size=6>The Planned Start or Planned End Data falls within a Scheduled Change Freeze. If the change MUST occur at this time then approval will be needed from Joey Sudomir (including for Standard Changes). Use the <a href='javascript:void(0);' onclick='openNextAvailableTime()'>Scheduling Assistant</a> to avoid conflicts.</font>");
}
function showConflictNotification() {
var showConflictMessage = g_scratchpad.show_conflict_message;
if (showConflictMessage.property === "never") return false;
if (showConflictMessage.property === "always") return true;
var showNotification = showConflictMessage.preference;
return showNotification;
}
//We don't want to render the warning and link to the conflict scheduler if we're in 'print' mode
var gURL = new GlideURL();
gURL.setFromCurrent();
var isPrint = !!gURL.getParam("sysparm_media");
if (!isPrint && newValue === "Conflict" && showConflictNotification()) {
g_form.addInfoMessage(getSchedulingConflictMessage(), "conflict_warn_status");
return;
} else if (isLoading || newValue === '')
return;
// Remove the warning message as status is not Conflict.
var chgGlideUI = GlideUI.get();
var messageKey = "alert_" + getSchedulingConflictMessage();
if (!chgGlideUI.messages[messageKey])
return;
delete chgGlideUI.messages[messageKey];
var messageCount = Object.keys(chgGlideUI.messages).length;
if (messageCount === 0)
chgGlideUI.clearOutputMessages();
else {
var msgElement = $("conflict_warn_status");
if (msgElement)
msgElement.remove();
}
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-19-2023 01:27 PM
This then flows in to the ChangeRequestConflictUtils UI Script for the Macro
Which maybe it's in there... basically i just don't want Conflict to run if the change is an emergency (or if it does run to not show a message)
function initializeConflictDetection() {
var trackerId = $('tracker_id').value;
if (trackerId !== "") {
runBackgroundPoll(trackerId);
showProgressButton(true);
}
// Ensure the warning message and check conflicts button are
// correctly shown/hidden (Poll every 2 seconds in case User has
// cleared one of the 3 mandatory conflict detection fields)
setInterval(updateWarningBoxAndConflictButton, 2000);
setTimeout(function() {
if (!g_form.isNewRecord() && ($('tracker_id').value !== "")) {
if (updateWarningBoxAndConflictButton()) {
updateConflictStatus();
refreshConflicts();
}
}
}, 1000);
$("conflict_action_run").observe("click", function(event) {
event.stop();
// If we have unfilled mandatory fields then do not progress
if (!g_form.mandatoryCheck())
return;
if (g_form.isNewRecord() || g_form.modified){
// Add a hidden parameter to indicate that the run conflict detection should be run after the form has saved
var afterSaveURL = new GlideURL();
if (g_form.isNewRecord())
afterSaveURL.setFromString(g_form.getTableName() + '.do?sys_id=' + g_form.getUniqueValue());
else
afterSaveURL.setFromCurrent();
addHidden(g_form.getFormElement(), 'sysparm_goto_url', afterSaveURL.getURL().replace(g_form.getTableName() + '.do','change_conflict_ui.do'));
g_form.save();
} else
runConflictDetection();
});
//Add event listener for list v2 changes for Affected CI's
CustomEventManager.observe('partial.page.reload', function (elem, e) {
if (e && e.listID === g_form.getTableName() + '.task_ci.task')
$('affected_item_count').value = e.totalRows;
});
//Add event listener for list v3 changes for Affected CI's
CustomEventManager.observe('g_list.api.refresh', function (e) {
if (e && e.listId === g_form.getTableName() + '.task_ci.task')
$('affected_item_count').value = GlideList.get(g_form.getTableName() + '.task_ci.task').getRowCount();
});
var runTrackerEl = $('run_tracker_ui');
if (runTrackerEl && runTrackerEl.value == 'true')
runConflictDetection();
}
function getSchedulingConflictMessage() {
var startDateReadOnly = g_form.is ("", g_form.getControl("start_date"));
var endDateReadOnly = g_form.isReadOnly("", g_form.getControl("end_date"));
if (startDateReadOnly || endDateReadOnly)
return new GwtMessage().getMessage("Scheduling conflict detected. Review the Conflicts form section.");
return new GwtMessage().getMessage("The Planned Start or Planned End Data falls within a Scheduled Change Freeze. Use the <a href='javascript:void(0);' onclick='openNextAvailableTime()'>Scheduling Assistant</a> to avoid conflicts. If the change MUST occur at this time then approval will be needed from Joey Sudomir (including for Standard Changes)");
}
function runConflictDetection() {
var cancelButtonId = 'cancelButton';
var backgroundlButtonId = 'runInBackgroundButton';
var dd = new GlideModal("simple_progress_viewer", true, "40em", "10.5em");
dd.setTitle(new GwtMessage().getMessage("Checking conflicts"));
dd.setPreference('sysparm_progress_name', "Conflict Checker");
dd.setPreference("sysparm_renderer_expanded_levels", "0");
dd.setPreference("sysparm_renderer_hide_drill_down", true);
if ($('tracker_id').value == "") {
dd.setPreference("sysparm_ajax_processor", "ChangeConflictAJAXProcessor");
dd.setPreference("sysparm_sysid", g_form.getUniqueValue());
} else
dd.setPreference('sysparm_renderer_execution_id', $('tracker_id').value + "");
dd.setPreference("sysparm_button_close", new GwtMessage().getMessage("Close"));
dd.on("executionComplete", function(trackerObj) {
receiveMessage(trackerObj);
if (trackerObj.state == 4){
var progressContainer = $("simple_progress_viewer");
if (progressContainer)
progressContainer.down("#container").innerHTML = $("conflict_canceled_progress_status").innerHTML;
}
var closeBtn = $("sysparm_button_close");
if (closeBtn) {
closeBtn.onclick = function() {
showProgressButton(false);
dd.destroy();
};
}
var cancelButton = $(cancelButtonId);
if (cancelButton)
cancelButton.hide();
var backgroundButton = $(backgroundlButtonId);
if (backgroundButton)
backgroundButton.hide();
});
dd.on("beforeclose", function() {
runBackgroundPoll($('tracker_id').value);
});
dd.on("renderStatus", function(trackerObj) {
// Record the value of the tracker for future use
$('tracker_id').value = trackerObj.sys_id;
// Add the cancel button
if (!dd.hasCancelButton){
// Create a button that closes the dialog when it is clicked
// (But continues to run conflict detection in the background)
var button = new Element('button', {'id': cancelButtonId, 'class': 'btn btn-default', 'style': 'margin: 0px 4px 0px 4px;'});
button.update(new GwtMessage().getMessage("Cancel"));
button.observe("click", function(event) {
var backgroundButton = $(backgroundlButtonId);
if (backgroundButton)
backgroundButton.disable();
cancelConflictDetection($('tracker_id').value);
});
// Add the button to the dialog and make a note of the fact that you added it
var buttonPanel = $('buttonsPanel');
buttonPanel.appendChild(button);
dd.hasCancelButton = true;
}
// Add the Run in background button
if (!dd.hasRunInBackgroundButton){
// Create a button that closes the dialog when it is clicked
// (But continues to run conflict detection in the background)
var button = new Element('button', {'id': backgroundlButtonId, 'class': 'btn btn-primary', 'style': 'margin: 0px 4px 0px 4px;'});
button.update(new GwtMessage().getMessage("Run in Background"));
button.observe("click", function(event) {
var cancelButton = $(cancelButtonId);
if (cancelButton)
cancelButton.disable();
runBackgroundPoll($('tracker_id').value);
dd.destroy();
});
// Add the button to the dialog and make a note of the fact that you added it
var buttonPanel = $('buttonsPanel');
buttonPanel.appendChild(button);
dd.hasRunInBackgroundButton = true;
}
});
showProgressButton(true);
dd.render();
}
function updateWarningBoxAndConflictButton() {
// Get values of all fields to determine if conflict detection should be allowed or not
var cmdbCi = g_form.getValue('cmdb_ci');
var startDate = g_form.getValue('start_date');
var endDate = g_form.getValue('end_date');
var conflictMode = $('conflict_mode').value;
var affectedItemCount = $('affected_item_count').value;
// Get references to the two gui widgets you intend to enable/disable
var warningBox = $('conflictDetectionStatus');
var checkConflictsButton = $('conflict_action_run');
// Case1: Basic Mode + Configuration Item + Planned Start Date + Planned End Date
if (conflictMode == 'basic' && cmdbCi != '' && startDate != '' && endDate != '') {
warningBox.hide();
checkConflictsButton.enable();
return true;
}
// Case2: Advanced Mode + Configuration Item + Planned Start Date + Planned End Date
if (conflictMode == 'advanced' && cmdbCi != '' && startDate != '' && endDate != '') {
warningBox.hide();
checkConflictsButton.enable();
return true;
}
// Case3: Advanced Mode + Affected Items + Planned Start Date + Planned End Date
if (conflictMode == 'advanced' && parseInt(affectedItemCount) != 0 && startDate != '' && endDate != '') {
warningBox.hide();
checkConflictsButton.enable();
return true;
}
// Default: Do not allow User to run conflict detection
warningBox.show();
checkConflictsButton.disable();
return false;
}
function showProgressButton(boolValue) {
if (boolValue) {
$("conflict_run_state").value = "executing";
$("conflict_action_run").innerHTML = new GwtMessage().getMessage("View Progress");
} else {
$("conflict_run_state").value = "ready";
$("conflict_action_run").innerHTML = new GwtMessage().getMessage("Check Conflicts");
}
}
function runBackgroundPoll(sysId) {
if (sysId != "") {
var ga = new GlideAjax('ChangeConflictAJAXProcessor');
ga.addParam('sysparm_name', 'getTrackerRecord');
ga.addParam('sysparm_tracker_id', sysId);
ga.getXMLAnswer(function (answer){
receiveMessage(answer.evalJSON());
});
}
}
function cancelConflictDetection(sysId) {
if (sysId != "") {
var ga = new GlideAjax('ChangeConflictAJAXProcessor');
ga.addParam('sysparm_name', 'cancel');
ga.addParam('sysparm_tracker_id', sysId);
ga.getXML();
}
}
function everyTenPercent(percent, handler) {
this.data = this.data || [false, false, false, false, false, false, false, false, false, false, false];
var slot = ((Math.round(percent / 10) * 10) / 10);
if (this.data[slot])
return;
this.data[slot] = true;
handler();
}
function refreshConflicts() {
var conflictLists = GlideList2.getListsForTable("conflict");
var impactedCIs = GlideList2.get(g_form.getTableName() + '.task_cmdb_ci_service.task');
conflictLists.push(impactedCIs);
for (var i = 0; i < conflictLists.length; ++i)
if (conflictLists[i]) //Check that the list is valid before trying to refresh
conflictLists[i].refresh();
}
function receiveMessage(tracker) {
/**
* 0 - Pending
* 1 - Running
* 2 - Successful
* 3 - Failed
* 4 - Cancelled
*/
if (tracker.state == 0 || tracker.state == 1) {
everyTenPercent(tracker.percent_complete, refreshConflicts);
$("conflict_status").update(new GwtMessage().getMessage("{0}% completed", tracker.percent_complete));
setTimeout(function() {
this.runBackgroundPoll($("tracker_id").value);
}, 2000);
} else {
$("tracker_id").value = "";
showProgressButton(false);
switch (tracker.state - 0){
case 2:
refreshConflicts();
updateConflictLastRun(tracker.timestamp);
updateConflictStatus();
$("conflict_status").update(new GwtMessage().getMessage("Completed"));
break;
case 3:
case 4:
deleteConflicts(tracker);
break;
}
setTimeout(function() {
$("conflict_status").update("");
}, 5000);
}
}
function deleteConflicts(trackerObj){
if (trackerObj.state == 3)
$("conflict_status").update(new GwtMessage().getMessage("Failed"));
if (trackerObj.state == 4)
$("conflict_status").update(new GwtMessage().getMessage("Canceled"));
var ga = new GlideAjax('ChangeConflictAJAXProcessor');
ga.addParam('sysparm_name', 'deleteConflicts');
ga.addParam('sysparm_sys_id', g_form.getUniqueValue());
ga.getXML(function(){
refreshConflicts();
updateConflictLastRun("");
g_form.setValue('conflict_status', 'Not Run');
});
}
function updateConflictLastRun(timestamp) {
// update the field which gets displayed when time displayed in 'calendar' or 'both' modes
var conflictLastRunCalendar = $('sys_readonly.' + g_form.getTableName() + '.conflict_last_run');
if (conflictLastRunCalendar)
conflictLastRunCalendar.setValue(timestamp);
// update the field which gets displayed when time displayed in 'timeAgo' mode
var conflictLastRunTimeAgo = $(g_form.getTableName() + '.conflict_last_run.timeago');
if (conflictLastRunTimeAgo)
conflictLastRunTimeAgo.update(new GwtMessage().getMessage("Just now"));
}
function updateConflictStatus() {
var conflictLastRun = $('sys_readonly.' + g_form.getTableName() + '.conflict_last_run');
var ga = new GlideAjax("ChangeConflictAJAXProcessor");
ga.addParam('sysparm_name', 'getConflictData');
ga.addParam('sysparm_change_id', g_form.getUniqueValue());
ga.getXML(function(message) {
var conflictInfo = message.responseXML.documentElement.getAttribute("answer").evalJSON();
if (conflictInfo.conflictCount === 0) {
if (conflictLastRun == '')
g_form.setValue('conflict_status', 'Not Run');
else {
g_form.setValue('conflict_status', 'No Conflict');
updateConflictLastRun(conflictInfo.timestamp);
}
} else {
g_form.setValue('conflict_status', 'Conflict');
updateConflictLastRun(conflictInfo.timestamp);
}
});
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-19-2023 01:44 PM
OK Along with above changes in client script , update following ChangeRequestConflictUtils :
function initializeConflictDetection() {
var trackerId = $('tracker_id').value;
if (trackerId !== "") {
runBackgroundPoll(trackerId);
showProgressButton(true);
}
// Ensure the warning message and check conflicts button are
// correctly shown/hidden (Poll every 2 seconds in case User has
// cleared one of the 3 mandatory conflict detection fields)
setInterval(updateWarningBoxAndConflictButton, 2000);
setTimeout(function() {
if (!g_form.isNewRecord() && ($('tracker_id').value !== "")) {
if (updateWarningBoxAndConflictButton()) {
updateConflictStatus();
refreshConflicts();
}
}
}, 1000);
$("conflict_action_run").observe("click", function(event) {
event.stop();
// If we have unfilled mandatory fields then do not progress
if (!g_form.mandatoryCheck())
return;
if (g_form.getValue('type')== 'emergency') // to make sure conflict calculation not to run
return;
if (g_form.isNewRecord() || g_form.modified){
// Add a hidden parameter to indicate that the run conflict detection should be run after the form has saved
var afterSaveURL = new GlideURL();
if (g_form.isNewRecord())
afterSaveURL.setFromString(g_form.getTableName() + '.do?sys_id=' + g_form.getUniqueValue());
else
afterSaveURL.setFromCurrent();
addHidden(g_form.getFormElement(), 'sysparm_goto_url', afterSaveURL.getURL().replace(g_form.getTableName() + '.do','change_conflict_ui.do'));
g_form.save();
} else
runConflictDetection();
});
//Add event listener for list v2 changes for Affected CI's
CustomEventManager.observe('partial.page.reload', function (elem, e) {
if (e && e.listID === g_form.getTableName() + '.task_ci.task')
$('affected_item_count').value = e.totalRows;
});
//Add event listener for list v3 changes for Affected CI's
CustomEventManager.observe('g_list.api.refresh', function (e) {
if (e && e.listId === g_form.getTableName() + '.task_ci.task')
$('affected_item_count').value = GlideList.get(g_form.getTableName() + '.task_ci.task').getRowCount();
});
var runTrackerEl = $('run_tracker_ui');
if (runTrackerEl && runTrackerEl.value == 'true')
runConflictDetection();
}
function getSchedulingConflictMessage() {
var startDateReadOnly = g_form.is ("", g_form.getControl("start_date"));
var endDateReadOnly = g_form.isReadOnly("", g_form.getControl("end_date"));
if (startDateReadOnly || endDateReadOnly)
return new GwtMessage().getMessage("Scheduling conflict detected. Review the Conflicts form section.");
return new GwtMessage().getMessage("The Planned Start or Planned End Data falls within a Scheduled Change Freeze. Use the <a href='javascript:void(0);' onclick='openNextAvailableTime()'>Scheduling Assistant</a> to avoid conflicts. If the change MUST occur at this time then approval will be needed from Joey Sudomir (including for Standard Changes)");
}
function runConflictDetection() {
var cancelButtonId = 'cancelButton';
var backgroundlButtonId = 'runInBackgroundButton';
var dd = new GlideModal("simple_progress_viewer", true, "40em", "10.5em");
dd.setTitle(new GwtMessage().getMessage("Checking conflicts"));
dd.setPreference('sysparm_progress_name', "Conflict Checker");
dd.setPreference("sysparm_renderer_expanded_levels", "0");
dd.setPreference("sysparm_renderer_hide_drill_down", true);
if ($('tracker_id').value == "") {
dd.setPreference("sysparm_ajax_processor", "ChangeConflictAJAXProcessor");
dd.setPreference("sysparm_sysid", g_form.getUniqueValue());
} else
dd.setPreference('sysparm_renderer_execution_id', $('tracker_id').value + "");
dd.setPreference("sysparm_button_close", new GwtMessage().getMessage("Close"));
dd.on("executionComplete", function(trackerObj) {
receiveMessage(trackerObj);
if (trackerObj.state == 4){
var progressContainer = $("simple_progress_viewer");
if (progressContainer)
progressContainer.down("#container").innerHTML = $("conflict_canceled_progress_status").innerHTML;
}
var closeBtn = $("sysparm_button_close");
if (closeBtn) {
closeBtn.onclick = function() {
showProgressButton(false);
dd.destroy();
};
}
var cancelButton = $(cancelButtonId);
if (cancelButton)
cancelButton.hide();
var backgroundButton = $(backgroundlButtonId);
if (backgroundButton)
backgroundButton.hide();
});
dd.on("beforeclose", function() {
runBackgroundPoll($('tracker_id').value);
});
dd.on("renderStatus", function(trackerObj) {
// Record the value of the tracker for future use
$('tracker_id').value = trackerObj.sys_id;
// Add the cancel button
if (!dd.hasCancelButton){
// Create a button that closes the dialog when it is clicked
// (But continues to run conflict detection in the background)
var button = new Element('button', {'id': cancelButtonId, 'class': 'btn btn-default', 'style': 'margin: 0px 4px 0px 4px;'});
button.update(new GwtMessage().getMessage("Cancel"));
button.observe("click", function(event) {
var backgroundButton = $(backgroundlButtonId);
if (backgroundButton)
backgroundButton.disable();
cancelConflictDetection($('tracker_id').value);
});
// Add the button to the dialog and make a note of the fact that you added it
var buttonPanel = $('buttonsPanel');
buttonPanel.appendChild(button);
dd.hasCancelButton = true;
}
// Add the Run in background button
if (!dd.hasRunInBackgroundButton){
// Create a button that closes the dialog when it is clicked
// (But continues to run conflict detection in the background)
var button = new Element('button', {'id': backgroundlButtonId, 'class': 'btn btn-primary', 'style': 'margin: 0px 4px 0px 4px;'});
button.update(new GwtMessage().getMessage("Run in Background"));
button.observe("click", function(event) {
var cancelButton = $(cancelButtonId);
if (cancelButton)
cancelButton.disable();
runBackgroundPoll($('tracker_id').value);
dd.destroy();
});
// Add the button to the dialog and make a note of the fact that you added it
var buttonPanel = $('buttonsPanel');
buttonPanel.appendChild(button);
dd.hasRunInBackgroundButton = true;
}
});
showProgressButton(true);
dd.render();
}
function updateWarningBoxAndConflictButton() {
// Get values of all fields to determine if conflict detection should be allowed or not
var cmdbCi = g_form.getValue('cmdb_ci');
var startDate = g_form.getValue('start_date');
var endDate = g_form.getValue('end_date');
var conflictMode = $('conflict_mode').value;
var affectedItemCount = $('affected_item_count').value;
// Get references to the two gui widgets you intend to enable/disable
var warningBox = $('conflictDetectionStatus');
var checkConflictsButton = $('conflict_action_run');
// Case1: Basic Mode + Configuration Item + Planned Start Date + Planned End Date
if (conflictMode == 'basic' && cmdbCi != '' && startDate != '' && endDate != '') {
warningBox.hide();
checkConflictsButton.enable();
return true;
}
// Case2: Advanced Mode + Configuration Item + Planned Start Date + Planned End Date
if (conflictMode == 'advanced' && cmdbCi != '' && startDate != '' && endDate != '') {
warningBox.hide();
checkConflictsButton.enable();
return true;
}
// Case3: Advanced Mode + Affected Items + Planned Start Date + Planned End Date
if (conflictMode == 'advanced' && parseInt(affectedItemCount) != 0 && startDate != '' && endDate != '') {
warningBox.hide();
checkConflictsButton.enable();
return true;
}
// Default: Do not allow User to run conflict detection
warningBox.show();
checkConflictsButton.disable();
return false;
}
function showProgressButton(boolValue) {
if (boolValue) {
$("conflict_run_state").value = "executing";
$("conflict_action_run").innerHTML = new GwtMessage().getMessage("View Progress");
} else {
$("conflict_run_state").value = "ready";
$("conflict_action_run").innerHTML = new GwtMessage().getMessage("Check Conflicts");
}
}
function runBackgroundPoll(sysId) {
if (sysId != "") {
var ga = new GlideAjax('ChangeConflictAJAXProcessor');
ga.addParam('sysparm_name', 'getTrackerRecord');
ga.addParam('sysparm_tracker_id', sysId);
ga.getXMLAnswer(function (answer){
receiveMessage(answer.evalJSON());
});
}
}
function cancelConflictDetection(sysId) {
if (sysId != "") {
var ga = new GlideAjax('ChangeConflictAJAXProcessor');
ga.addParam('sysparm_name', 'cancel');
ga.addParam('sysparm_tracker_id', sysId);
ga.getXML();
}
}
function everyTenPercent(percent, handler) {
this.data = this.data || [false, false, false, false, false, false, false, false, false, false, false];
var slot = ((Math.round(percent / 10) * 10) / 10);
if (this.data[slot])
return;
this.data[slot] = true;
handler();
}
function refreshConflicts() {
var conflictLists = GlideList2.getListsForTable("conflict");
var impactedCIs = GlideList2.get(g_form.getTableName() + '.task_cmdb_ci_service.task');
conflictLists.push(impactedCIs);
for (var i = 0; i < conflictLists.length; ++i)
if (conflictLists[i]) //Check that the list is valid before trying to refresh
conflictLists[i].refresh();
}
function receiveMessage(tracker) {
/**
* 0 - Pending
* 1 - Running
* 2 - Successful
* 3 - Failed
* 4 - Cancelled
*/
if (tracker.state == 0 || tracker.state == 1) {
everyTenPercent(tracker.percent_complete, refreshConflicts);
$("conflict_status").update(new GwtMessage().getMessage("{0}% completed", tracker.percent_complete));
setTimeout(function() {
this.runBackgroundPoll($("tracker_id").value);
}, 2000);
} else {
$("tracker_id").value = "";
showProgressButton(false);
switch (tracker.state - 0){
case 2:
refreshConflicts();
updateConflictLastRun(tracker.timestamp);
updateConflictStatus();
$("conflict_status").update(new GwtMessage().getMessage("Completed"));
break;
case 3:
case 4:
deleteConflicts(tracker);
break;
}
setTimeout(function() {
$("conflict_status").update("");
}, 5000);
}
}
function deleteConflicts(trackerObj){
if (trackerObj.state == 3)
$("conflict_status").update(new GwtMessage().getMessage("Failed"));
if (trackerObj.state == 4)
$("conflict_status").update(new GwtMessage().getMessage("Canceled"));
var ga = new GlideAjax('ChangeConflictAJAXProcessor');
ga.addParam('sysparm_name', 'deleteConflicts');
ga.addParam('sysparm_sys_id', g_form.getUniqueValue());
ga.getXML(function(){
refreshConflicts();
updateConflictLastRun("");
g_form.setValue('conflict_status', 'Not Run');
});
}
function updateConflictLastRun(timestamp) {
// update the field which gets displayed when time displayed in 'calendar' or 'both' modes
var conflictLastRunCalendar = $('sys_readonly.' + g_form.getTableName() + '.conflict_last_run');
if (conflictLastRunCalendar)
conflictLastRunCalendar.setValue(timestamp);
// update the field which gets displayed when time displayed in 'timeAgo' mode
var conflictLastRunTimeAgo = $(g_form.getTableName() + '.conflict_last_run.timeago');
if (conflictLastRunTimeAgo)
conflictLastRunTimeAgo.update(new GwtMessage().getMessage("Just now"));
}
function updateConflictStatus() {
var conflictLastRun = $('sys_readonly.' + g_form.getTableName() + '.conflict_last_run');
var ga = new GlideAjax("ChangeConflictAJAXProcessor");
ga.addParam('sysparm_name', 'getConflictData');
ga.addParam('sysparm_change_id', g_form.getUniqueValue());
ga.getXML(function(message) {
var conflictInfo = message.responseXML.documentElement.getAttribute("answer").evalJSON();
if (conflictInfo.conflictCount === 0) {
if (conflictLastRun == '')
g_form.setValue('conflict_status', 'Not Run');
else {
g_form.setValue('conflict_status', 'No Conflict');
updateConflictLastRun(conflictInfo.timestamp);
}
} else {
g_form.setValue('conflict_status', 'Conflict');
updateConflictLastRun(conflictInfo.timestamp);
}
});
}
Changes present on line 30
Regards,Sushant Malsure