<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
<g2:evaluate var="jvar_incident_caller_email">
current.caller_id.email.toString();
</g2:evaluate>
<g2:evaluate var="jvar_incident_caller_userid">
current.caller_id.user_name.toString();
</g2:evaluate>
<g2:evaluate var="jvar_device_user_id">
gs.getProperty('x_zsca2_zdx_manage.zdx_userid');
</g2:evaluate>
<g2:evaluate var="jvar_user_mod">
gs.getProperty('x_zsca2_zdx_manage.zdx_api_mod_choice');
</g2:evaluate>
<g2:evaluate var="jvar_user_mod_append">
gs.getProperty('x_zsca2_zdx_manage.zdx_api_mode_append');
</g2:evaluate>
<g2:evaluate var="jvar_user_mod_replace_from">
gs.getProperty('x_zsca2_zdx_manage.zdx_api_mode_replace_from');
</g2:evaluate>
<g2:evaluate var="jvar_user_mod_replace_to">
gs.getProperty('x_zsca2_zdx_manage.zdx_api_mode_replace_to');
</g2:evaluate>
<body>
<div class="score-analysis-wrapper">
<div class="score-analysis-loading-animation" id="score-analysis-loading-logo" style="display:none">
<h4>Loading...</h4>
</div>
<div class="score-analysis-info-message-wrapper" id="score-analysis-info-message-wrapper"></div>
<div class="score-analysis-date-time-wrapper" id="score-analysis-date-time-wrapper"></div>
<div class="score-analysis-content-wrapper" id="score-analysis-content-wrapper"></div>
<div class="score-analysis-button-wrapper" id="score-analysis-button-wrapper"></div>
</div>
</body>
<script>
var applicationresult1={};
var userDevices = {};
var idCounter = 0;
var chartTimeAxisX = {};
var divZeroLevelId;
var divFirstLevelId;
var divTableId;
var tabId;
var selectId;
var optionId;
var tableId;
var tokenRetryCount = 0;
addLoadEvent(function() {
//Get all section tabs
var getSectionElementnsSA = g_tabs2Sections.tabDiv.children;
var getTabSectionsSA = g_tabs2Sections.tabs;
//Get Tab Index for checking active Tab
var tabIndex = [];
for(var t = 0; t != getTabSectionsSA.length; t++){
if(getTabSectionsSA[t].attributes.tab_caption.value == "ZDX Summary"){
tabIndex.push(g_tabs2Sections.findTabIndexByID(getTabSectionsSA[t].attributes.id.value));
}
}
for (var i = 0; i != getSectionElementnsSA.length; i++) {
if (getSectionElementnsSA[i].children[0].innerText == 'ZDX Summary') {
if(sessionStorage.getItem('privateSessionToken') == "" || sessionStorage.getItem('privateSessionToken') == undefined || sessionStorage.getItem('privateSessionToken') == null){
requestAndSetToken();
}
if (tabIndex == g_tabs2Sections.activeTab) {
//Initiate execution if section selected by default
initiateScoreAnalysisSection();
} else {
//Add onclick eventListener to ZDX Score Analysis section tab
getSectionElementnsSA[i].children[0].addEventListener("click", initiateScoreAnalysisSection);
}
}
}
});
function requestAndSetToken() {
//Get credentials
var gAjax = new GlideAjax('zdxRESTajax');
gAjax.addParam('sysparm_name', 'checkCredentials');
gAjax.getXML(parseResult);
function parseResult(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
var result = JSON.parse(answer);
if (!result) {
document.getElementById("score-analysis-loading-logo").style.display = "none";
infoMessageForSA("error", "Login Error. Please contact your ServiceNow administrator");
} else {
sessionStorage.setItem('privateSessionToken', result.token);
}
}
}
function initiateScoreAnalysisSection() {
//Initiation should be triggered only once
document.getElementById("score-analysis-loading-logo").style.display = "";
disableEventListenerForSA();
if ('$[jvar_incident_caller_email]') {
mainFormForSA();
getDevicesDataForSA();
} else {
document.getElementById("score-analysis-loading-logo").style.display = "none";
infoMessageForSA("error", "Please check user's details in Caller field. Account should be actual and contains valid email");
}
}
//Get devices
function getDevicesDataForSA(userID) {
if('$[jvar_device_user_id]' == 'Email Id'){
userID = '$[jvar_incident_caller_email]'; //filtering by email id BUG-161512
}
else{
userID = '$[jvar_incident_caller_userid]';
}
if('$[jvar_user_mod]' != 'None')
{
var domains= ['xxx','xxx','xxx'];
if ('$[jvar_user_mod_append]')
{
domains[0]='$[jvar_user_mod_append]';
}
if ('$[jvar_user_mod_replace_from]')
{
domains[1]='$[jvar_user_mod_replace_from]';
}
if ('$[jvar_user_mod_replace_to]')
{
domains[2]='$[jvar_user_mod_replace_to]';
}
userID = userModification(userID,'$[jvar_user_mod]',domains);
}
var gAjax = new GlideAjax('zdxRESTajax');
gAjax.addParam('sysparm_name', 'getDevice');
gAjax.addParam('sysparm_get_device', userID);
gAjax.addParam('sysparm_cred_token', 'Bearer ' + sessionStorage.getItem('privateSessionToken'));
gAjax.getXML(parseResult);
function parseResult(response) {
if(response.responseXML.documentElement.getAttribute("answer") == null){
requestAndSetToken();
tokenRetryCount++
if(tokenRetryCount==1){
getDevicesDataForSA(userID);
}
else{
document.getElementById("score-analysis-loading-logo").style.display = "none";
infoMessageForSA("error", "Login Error. Please contact your ServiceNow administrator");
}
}
else {
var answer = response.responseXML.documentElement.getAttribute("answer");
var result = JSON.parse(answer);
if (!result) {
document.getElementById("score-analysis-loading-logo").style.display = "none";
infoMessageForSA("error", "No devices found matching the user's email address.Please check the email address of the user or the user may not have any active devices.");
}
else {
userDevices = result['devices'];
if (userDevices.length == 0 || userDevices.length > 4) {
if (userDevices.length == 0) {
document.getElementById("score-analysis-loading-logo").style.display = "none";
infoMessageForSA("error", "There are no devices owned by the user. Please contact your ZDX administrator");
}
if (userDevices.length > 4) {
document.getElementById("score-analysis-loading-logo").style.display = "none";
infoMessageForSA("error", "There are too many devices owned by the user. Please contact your ZDX administrator");
}
} else {
//setDevices(idCounter,userDevices);
getApplicationsDataForSA(userDevices);
}
}
}
}
}
//Helper to get the modded user based on choice
function userModification(base,choice,domains) {
if (choice == 'Append')
{
base = base+domains[0];
}
else if (choice == 'Replace')
{
base = base.replace(domains[1],domains[2]);
}
return base;
}
//Get applications
function getApplicationsDataForSA(userDevices) {
//Used in test purposes
//var userDevices = [{"id": 13445788,"name": "z-tm","userid": 76064},{"id": 14886948,"name": "Kell","userid": 14886944}];
var gAjax = new GlideAjax('zdxRESTajax');
gAjax.addParam('sysparm_name', 'getApplication');
gAjax.addParam('sysparm_get_app', JSON.stringify(userDevices));
gAjax.addParam('sysparm_cred_token', 'Bearer ' + sessionStorage.getItem('privateSessionToken'));
gAjax.getXML(parseResult);
function parseResult(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
var applicationresult = JSON.parse(answer);
applicationresult1=JSON.stringify(applicationresult);
if (!applicationresult) {
document.getElementById("score-analysis-loading-logo").style.display = "none";
infoMessageForSA("error", "There is no information about applications. Please contact your ZDX administrator");
} else {
getTimestamps(applicationresult);
}
}
}
//get apps timestams and merging obj above
async function getTimestamps(userApplications){
var data = JSON.parse(JSON.stringify(userApplications));
if (typeof data == 'object') {
var arrResult = [];
//Case if requested applications for multiple devices
for (var i = 0; i ${AMP}lt; data.length; i++) {
idCounter = idCounter + 1;
await setDevices(idCounter,data[i]['devicename']);
var obj = {};
var apps = [];
var deviceID = data[i]['deviceid'];
var deviceName = data[i]['devicename'];
var link = data[i]['link'];
obj['deviceid'] = deviceID;
obj['devicename'] = deviceName;
obj['link'] = link;
obj['apps'] = apps;
//Case if requested timestamps for multiple applications
for (var j = 0; j ${AMP}lt; data[i]["apps"].length; j++) {
var app = data[i]["apps"][j];
var appID = data[i]["apps"][j]['id'];
//var response = this.requestScoreMetrics(deviceID, appID, this.getParameter('sysparm_cred_token'));
var gAjax = new GlideAjax('zdxRESTajax');
gAjax.addParam('sysparm_name', 'requestScoreMetrics');
gAjax.addParam('sysparm_deviceID', deviceID);
gAjax.addParam('sysparm_appID', appID);
gAjax.addParam('sysparm_cred_token', 'Bearer ' + sessionStorage.getItem('privateSessionToken'));
//gAjax.getXML(parseResult);
gAjax.getXMLWait();
var response = gAjax.getAnswer();
var result = JSON.parse(response);
function parseResult(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
result = JSON.parse(answer);
result1 = JSON.stringify(result);
}
document.getElementById("score-analysis-loading-logo").style.display = "none";
if (result['responseStatus'] == 200) {
var responseData = JSON.parse(result['responseBody']);
app['timestamps'] = responseData;
apps.push(app);
}
await createTable(j,apps,chartTimeAxisX,deviceID,link);
apps = [];
}
arrResult.push(obj);
//mainFormForSA(arrResult);
//arrResult = [];
}
//mainFormForSA(arrResult);
}
/*
var gAjax = new GlideAjax('zdxRESTajax');
gAjax.addParam('sysparm_name', 'getSM');
gAjax.addParam('sysparm_get_timestamp', JSON.stringify(userApplications));
gAjax.addParam('sysparm_cred_token', 'Bearer ' + sessionStorage.getItem('privateSessionToken'));
gAjax.getXML(parseResult);
function parseResult(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
var result = JSON.parse(answer);
var result1 = JSON.stringify(result);
if (!result) {
document.getElementById("score-analysis-loading-logo").style.display = "none";
infoMessageForSA("error", "There is no information about applications. Please contact your ZDX administrator");
} else {
document.getElementById("score-analysis-loading-logo").style.display = "none";
mainFormForSA(result);
}
}
*/
}
//Run Y-Engine Analysis
function postYEngineForSA(payload) {
return new Promise((resolve, reject) => {
var gAjax = new GlideAjax('zdxRESTajax');
gAjax.addParam('sysparm_name', 'postYEngine');
gAjax.addParam('sysparm_post_y_engine', payload);
gAjax.addParam('sysparm_cred_token', 'Bearer ' + sessionStorage.getItem('privateSessionToken'));
gAjax.getXML(parseResult);
function parseResult(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
var result = JSON.parse(answer);
var result1 = JSON.stringify(result);
if (!result) {
popUpMessageForSA(false, "Y-Engine session has been not created. Please contact your ZDX administrator");
reject(new Error("Y-Engine session has not been created."));
} else {
//put some logic
resolve(result['analysis_id']);
}
}
});
}
function getYEngineForSA(id) {
return new Promise(function(resolve, reject) {
var gAjax = new GlideAjax('zdxRESTajax');
gAjax.addParam('sysparm_name', 'getYEngine');
gAjax.addParam('sysparm_get_y_engine', id);
gAjax.addParam('sysparm_cred_token', 'Bearer ' + sessionStorage.getItem('privateSessionToken'));
gAjax.getXML(parseResult);
function parseResult(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
var result = JSON.parse(answer);
var result2 = JSON.stringify(result);
if(!result) {
popUpMessageForSA(false, "There is no information about current Y-Engine session. Please contact your ZDX administrator");
reject("There is no information about current Y-Engine session. Please contact your ZDX administrator");
} else {
resolve(result);
}
}
});
}
//Build main markup for section
function mainFormForSA(obj,applicationresult) {
idCounter = 0;
divTimeFromId = "score-analysis-time-from-" + idCounter;
divTimeToId = "score-analysis-time-to-" + idCounter;
submitbutton= "score-analysis-submit-" + idCounter;
var date = new Date();
var dateTimeOneHourBefore = new Date(date.getTime() - 3600000).toISOString().split(':').slice(0,2).join(':');
var dateTimeTwoHoursBefore = new Date(date.getTime() - 7200000).toISOString().split(':').slice(0,2).join(':');
var dateTimeCurrent = new Date().toISOString().split(':').slice(0,2).join(':');
chartTimeAxisX = {
0: dateTimeTwoHoursBefore.split("T")[1],
50: dateTimeOneHourBefore.split("T")[1],
95: dateTimeCurrent.split("T")[1]
};
var dateTimeFromMin = new Date(date.getTime() - 13 * 86400000).toISOString().split(':').slice(0,2).join(':'); //-14 day
var dateTimeFromMax = new Date().toISOString().split(':').slice(0,2).join(':'); //+1 day
var dateTimeToMin = new Date(date.getTime() - 13 * 86400000).toISOString().split(':').slice(0,2).join(':'); //-14 day
var dateTimeToMax = new Date().toISOString().split(':').slice(0,2).join(':'); //+1 day;
//Time from
var divTimeFrom = document.createElement("div");
divTimeFrom.setAttribute("class", "score-analysis-time-from");
divTimeFrom.setAttribute("id", divTimeFromId);
var divContainerTime = document.getElementById("score-analysis-date-time-wrapper");
divContainerTime.appendChild(divTimeFrom);
var label = document.createElement("label");
label.setAttribute("for", "score-analysis-time-from");
label.innerHTML = "From:";
var input = document.createElement("input");
input.setAttribute("type", "datetime-local");
input.setAttribute("id", "score-analysis-time-from");
input.setAttribute("name", "score-analysis-time-from");
input.setAttribute("value", dateTimeTwoHoursBefore);
input.setAttribute("min", dateTimeFromMin);
input.setAttribute("max", dateTimeFromMax);
var divContainerTimeFrom = document.getElementById(divTimeFromId);
divContainerTimeFrom.appendChild(label);
divContainerTimeFrom.appendChild(input);
//Time to
var divTimeTo = document.createElement("div");
divTimeTo.setAttribute("class", "score-analysis-time-to");
divTimeTo.setAttribute("id", divTimeToId);
var divContainerTime = document.getElementById("score-analysis-date-time-wrapper");
divContainerTime.appendChild(divTimeTo);
var label = document.createElement("label");
label.setAttribute("for", "score-analysis-time-to");
label.innerHTML = "To:";
var input = document.createElement("input");
input.setAttribute("type", "datetime-local");
input.setAttribute("id", "score-analysis-time-to");
input.setAttribute("name", "score-analysis-time-to");
input.setAttribute("value", dateTimeCurrent);
input.setAttribute("min", dateTimeToMin);
input.setAttribute("max", dateTimeToMax);
//input.setAttribute("disabled", true);
var divContainerTimeTo = document.getElementById(divTimeToId);
divContainerTimeTo.appendChild(label);
divContainerTimeTo.appendChild(input);
//submit button
var submitbtn = document.createElement("div");
submitbtn.setAttribute("class", "score-analysis-submit");
submitbtn.setAttribute("id", submitbutton);
var divContainerTime = document.getElementById("score-analysis-date-time-wrapper");
divContainerTime.appendChild(submitbtn);
var input = document.createElement("input");
input.setAttribute("type", "button");
input.setAttribute("id", "score-analysis-submit");
input.setAttribute("value", "Submit");
var divContainerSubmit = document.getElementById(submitbutton);
divContainerSubmit.appendChild(input);
input.addEventListener("click", function() {
if(userDevices.length != 0){
var fromvalue = document.getElementById("score-analysis-time-from").value;
var fromepochtime = new Date(fromvalue + 'Z').getTime() /1000;
var tovalue = document.getElementById("score-analysis-time-to").value;
var toepochtime = new Date(tovalue + 'Z').getTime() /1000;
var currentDate = new Date();
var epochTimeGMT = currentDate.getTime();
var epochTimeGMTInSeconds = Math.floor(epochTimeGMT / 1000);
if(fromepochtime > epochTimeGMTInSeconds || toepochtime > epochTimeGMTInSeconds){
alert("Please check the selected dates/time. Future date/time is not allowed.");
}
else {
var midtime = (fromepochtime+toepochtime) / 2;
var midTimeDate = new Date(midtime * 1000);
//gs.info(FromDate);
var gmtMidTime = new Date(midTimeDate.valueOf() + midTimeDate.getTimezoneOffset() * 60000);
var hours = gmtMidTime.getHours();
var mins = gmtMidTime.getMinutes();
if(hours ${AMP}lt; 10){
hours = '0' + hours;
}
if(mins ${AMP}lt; 10){
mins = '0' + mins;
}
var hrsmin = hours + ':'+ mins;
chartTimeAxisX = {
0: fromvalue.split("T")[1],
50: hrsmin,
95: tovalue.split("T")[1]
};
var FromDate = new Date(fromepochtime * 1000);
var ToDate = new Date(toepochtime * 1000);
// Calculate the time difference in milliseconds
var diff = Math.abs(ToDate - FromDate);
// Convert the difference to hours
var diffHours = diff / (1000 * 60 * 60);
if (diffHours > 2) {
alert("The selected date difference is more that two hours.");
}
else{
var maincontainer = document.getElementById("score-analysis-content-wrapper");
maincontainer.innerHTML = "";
var divElement = document.createElement("div");
divElement.classList.add("score-analysis-loading-animation-submit");
divElement.id = "score-analysis-loading-logo-submit";
divElement.style.display = "";
// Create the h4 element
var h4Element = document.createElement("h4");
h4Element.textContent = "Loading...";
// Append the h4 element to the div element
divElement.appendChild(h4Element);
// Find the parent div to append the created div
maincontainer.appendChild(divElement);
//var appresult = getApplicationsDataForSA(deviceresults);
//userDevices=[];
var gAjax = new GlideAjax('zdxRESTajax');
gAjax.addParam('sysparm_name', 'getApplicationSubmit');
gAjax.addParam('sysparm_get_app', JSON.stringify(userDevices));
gAjax.addParam('sysparm_cred_token', 'Bearer ' + sessionStorage.getItem('privateSessionToken'));
gAjax.addParam('sysparm_fromepoch', fromepochtime);
gAjax.addParam('sysparm_toepoch', toepochtime);
gAjax.getXML(parseResult);
function parseResult(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
var appresult = JSON.parse(answer);
if (!appresult) {
document.getElementById("score-analysis-loading-logo-submit").style.display = "none";
infoMessageForSA("error", "There is no information about applications for submit. Please contact your ZDX administrator");
} else {
getTimestampsSubmit(appresult);
}
}
async function getTimestampsSubmit(appresult){
var data = JSON.parse(JSON.stringify(appresult));
if (typeof data == 'object') {
var arrResult = [];
idCounter = 0;
//Case if requested applications for multiple devices
for (var i = 0; i ${AMP}lt; data.length; i++) {
idCounter = idCounter + 1;
await setDevices(idCounter,data[i]['devicename']);
var obj = {};
var apps = [];
var deviceID = data[i]['deviceid'];
var deviceName = data[i]['devicename'];
var link = data[i]['link'];
obj['deviceid'] = deviceID;
obj['devicename'] = deviceName;
obj['link'] = link;
obj['apps'] = apps;
//Case if requested timestamps for multiple applications
for (var j = 0; j ${AMP}lt; data[i]["apps"].length; j++) {
var app = data[i]["apps"][j];
var appID = data[i]["apps"][j]['id'];
//var response = this.requestScoreMetrics(deviceID, appID, this.getParameter('sysparm_cred_token'));
var gAjax = new GlideAjax('zdxRESTajax');
gAjax.addParam('sysparm_name', 'requestScoreMetricsSubmit');
gAjax.addParam('sysparm_deviceID', deviceID);
gAjax.addParam('sysparm_appID', appID);
gAjax.addParam('sysparm_fromepoch', fromepochtime);
gAjax.addParam('sysparm_toepoch', toepochtime);
gAjax.addParam('sysparm_cred_token', 'Bearer ' + sessionStorage.getItem('privateSessionToken'));
//gAjax.getXML(parseResult);
gAjax.getXMLWait();
var response = gAjax.getAnswer();
var result = JSON.parse(response);
function parseResult(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
result = JSON.parse(answer);
result1 = JSON.stringify(result);
}
document.getElementById("score-analysis-loading-logo-submit").style.display = "none";
if (result['responseStatus'] == 200) {
var responseData = JSON.parse(result['responseBody']);
app['timestamps'] = responseData;
apps.push(app);
}
await createTable(j,apps,chartTimeAxisX,deviceID,link,fromvalue,tovalue);
apps = [];
}
arrResult.push(obj);
}
}
}
}
}
}
else{
document.getElementById("score-analysis-loading-logo").style.display = "none";
infoMessageForSA("error", "There are no devices owned by the user. Please contact your ZDX administrator");
}
});
// createTable(obj,chartTimeAxisX,dateTimeTwoHoursBefore,dateTimeCurrent,idCounter);
}
async function setDevices(idCounter,obj){
return new Promise(resolve => {
//idCounter = idCounter + 1;
//Device folders
divZeroLevelId = "score-analysis-content-" + idCounter;
divFirstLevelId = "score-analysis-container-element-" + idCounter;
divTableId = "score-analysis-container-element-table-" + idCounter;
tabId = "score-analysis-tab-input-" + idCounter;
selectId = "score-analysis-tab-select-" + idCounter;
optionId ="score-analysis-tab-option-" + idCounter;
tableId = "score-analysis-app-table-" + idCounter;
var divZeroLevel = document.createElement("div");
divZeroLevel.setAttribute("class", "score-analysis-content");
divZeroLevel.setAttribute("id", divZeroLevelId);
var divContainerMain = document.getElementById("score-analysis-content-wrapper");
divContainerMain.appendChild(divZeroLevel);
var input = document.createElement("input");
input.setAttribute("type", "radio");
input.setAttribute("name", "score-analysis-css-tabs");
input.setAttribute("id", tabId);
if (idCounter == 1) {
input.setAttribute("checked", "true");
}
input.setAttribute("class", "score-analysis-tab-switch");
var label = document.createElement("label");
label.setAttribute("for", tabId);
label.setAttribute("class", "score-analysis-tab-label");
label.setAttribute("title", obj);
label.innerHTML = obj;
var divFirstLevel = document.createElement("div");
divFirstLevel.setAttribute("class", "score-analysis-container-element");
divFirstLevel.setAttribute("id", divFirstLevelId);
var divContainerTab = document.getElementById(divZeroLevelId);
divContainerTab.appendChild(input);
divContainerTab.appendChild(label);
divContainerTab.appendChild(divFirstLevel);
resolve();
});
}
async function createTable(loop,obj,chartTimeAxisX,idCounter,link,fromdate,todate){
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}//making some delay in creatatble
await delay(1000);
return new Promise(resolve => {
tableId = "score-analysis-app-table-" + idCounter;
//Create Dynamic Table for Application and Score
var table = document.createElement("table");
table.setAttribute("id", tableId);
var tr = table.insertRow(-1);
tr.setAttribute("id", "score-analysis-tr-table-id");// TABLE ROW.
var column = ["Application", "ZDX Score"];
for(var k = 0; k != column.length; k++){
var th = document.createElement("th");
th.setAttribute("id", "score-analysis-td-table-id");// TABLE HEADER.
th.setAttribute("class", "score-analysis-table-th");
th.innerHTML = column[k];
tr.appendChild(th);
}
//for (var l = 0; l != obj[i]["apps"].length; l++) {
var tr = table.insertRow(-1);
//trcontainer.setAttribute("id", "score-analysis-tr-table-id");
tr.setAttribute("id", "score-analysis-tr-table-id");
tr.setAttribute("class", "score-analysis-table-tr");
//set App
var tabCell = tr.insertCell(-1);
tabCell.setAttribute("id", "score-analysis-td-table-id");
tabCell.setAttribute("class", "score-analysis-table-td");
tabCell.setAttribute("rowspan", "2");
var spanName = obj[0]["name"];
var scoreValue = Math.round(obj[0]["score"]); // ZDX 7842 Round off API values for ZDX summary scores.
//span for app chart
var chartSpan= document.createElement("span");
chartSpan.setAttribute("id", "chart-span");
chartSpan.setAttribute("class", "chart-span");
chartSpan.innerHTML = spanName;
tabCell.appendChild(chartSpan);
//actual chart svg
chartSvg.setAttribute("id", "chart-svg");
chartSvg.setAttribute("viewBox", "0 0 1600 100");
chartSvg.setAttribute("preserveAspectRatio", "none");
chartSvg.setAttribute("version", "1.2");
chartSvg.setAttribute("class", "chart");
tabCell.appendChild(chartSvg);
var chartColor = '';
if(scoreValue ${AMP}lt;= 33){
chartColor = "red";
}else if(scoreValue > 65) {
chartColor = "green";
}else{
chartColor = "orange";
}
var points = '';
var fillPoints = '';
var dataPoints = obj[0]["timestamps"]["datapoints"];
var dataPointsLength = dataPoints.length;
var graphWidth = 2000; // Set your desired width for the graph
var stepX = graphWidth / (dataPointsLength - 1);
for (var d = 0; d != dataPointsLength; d++) {
if (dataPoints[d]["value"] != -1) {
var x = d * stepX;
var y = 100 - Math.round(dataPoints[d]["value"]);
points += x + "," + y + " ";
}
}
fillPoints = "0,100 " + points + (graphWidth - stepX) + ',' + 100;
/*var points = '';
var fillPoints = '';
var stepX = 70;
for (var d = 0; d != obj[i]["apps"][l]["timestamps"]["datapoints"].length; d++) {
if(obj[i]["apps"][l]["timestamps"]["datapoints"][d]["value"] != -1){
points += stepX + "," + (100 - Math.round(obj[i]["apps"][l]["timestamps"]["datapoints"][d]["value"])) + " ";
stepX += 70;
}
}
fillPoints = '70,100 ' + points + (stepX -70) + ',' + 100;*/
chartStroke.setAttribute("fill", "none");
chartStroke.setAttribute("stroke", chartColor);
chartStroke.setAttribute("stroke-width", "1.5");
chartStroke.setAttribute("vector-effect", "non-scaling-stroke");
chartStroke.setAttribute("points", points);
chartSvg.appendChild(chartStroke);
chartPolyline.setAttribute("fill", chartColor);
chartPolyline.setAttribute("fill-opacity", "0.4");
chartPolyline.setAttribute("stroke", "#1f8476");
chartPolyline.setAttribute("stroke-width", "0");
chartPolyline.setAttribute("vector-effect", "non-scaling-stroke");
chartPolyline.setAttribute("points", fillPoints);
chartSvg.appendChild(chartPolyline);
// text svg
gSvg.setAttribute("id", "g-svg");
gSvg.setAttribute("class", "g-svg");
tabCell.appendChild(gSvg);
chartGx.setAttribute("id", "chart-x-labels");
chartGx.setAttribute("class", "chart-x-labels");
gSvg.appendChild(chartGx);
for (var key in chartTimeAxisX) {
textX.setAttribute("x", key + "%");
textX.setAttribute("y", "100%");
textX.innerHTML = chartTimeAxisX[key];
chartGx.appendChild(textX);
}
//set Score
var tabCellScore = tr.insertCell(-1);
tabCellScore.setAttribute("id", "score-analysis-score-td");
tabCellScore.setAttribute("class", "score-analysis-score-td");
tabCellScore.innerHTML = scoreValue;
if(scoreValue ${AMP}lt;= 35){
tabCellScore.setAttribute("class", "red");
}else if(scoreValue > 65) {
tabCellScore.setAttribute("class", "green");
}else{
tabCellScore.setAttribute("class", "orange");
}
var tr1 = table.insertRow(-1);
tr1.setAttribute("id", "score-analysis-tr-table-id");
tr1.setAttribute("class", "score-analysis-table-tr");
var tabCellBtn = tr1.insertCell(-1);
tabCellBtn.setAttribute("class", "score-analysis-btn-td");
//"Analyze Score" button creation
var buttonID = "button-id-"+obj[0]["id"]+"-"+idCounter;
var btnAnalyze = document.createElement("INPUT");
btnAnalyze.setAttribute("type", "button");
btnAnalyze.setAttribute("id", buttonID);
btnAnalyze.setAttribute("class", "score-analysis-button");
btnAnalyze.setAttribute("value", "Analyze Score");
btnAnalyze.setAttribute("scoreValue", scoreValue);
//btnAnalyze.setAttribute("disabled", false);
//var analyzebutton = document.getElementById(buttonID);
if(btnAnalyze.getAttribute("scoreValue") >34) {
//analyzebutton.disabled=true;
btnAnalyze.disabled= true;
}
else{
//analyzebutton.disabled=false;
btnAnalyze.disabled= false;
}
var ApplicationID=obj[0]["id"];
var DeviceID=idCounter;
var fromvalue1 = document.getElementById("score-analysis-time-from").value;
var fromepochtime1 = new Date(fromvalue1 + 'Z').getTime() /1000;
var tovalue1 = document.getElementById("score-analysis-time-to").value;
var toepochtime1 = new Date(tovalue1 + 'Z').getTime() /1000;
btnAnalyze.setAttribute("deviceid", DeviceID);
btnAnalyze.setAttribute("appid", ApplicationID);
btnAnalyze.setAttribute("epochFrom", fromepochtime1);
btnAnalyze.setAttribute("epochTo", toepochtime1);
btnAnalyze.setAttribute("idCounter", idCounter);
btnAnalyze.setAttribute("rowid", "divtable-"+obj[0]["id"]+"-"+idCounter);
//btnAnalyze.setAttribute("obj", obj);
btnAnalyze.addEventListener("click", function() {
runAnalysisForSA(this.getAttribute("deviceid"), this.getAttribute("appid"), this.getAttribute("epochFrom"), this.getAttribute("epochTo"), idCounter, this.getAttribute("rowid"));
});
tabCellBtn.appendChild(btnAnalyze);
//"View in ZDX" button creation
var a = document.createElement("a");
var finallink =link.replace(" ", "");
//a.href = finallink + "/devices";
a.href = finallink;
a.target = "_blank";
tabCellBtn.appendChild(a);
var btnZdx = document.createElement("INPUT");
btnZdx.setAttribute("type", "button");
btnZdx.setAttribute("class", "score-analysis-button");
btnZdx.setAttribute("value", "View in ZDX");
a.appendChild(btnZdx);
var trcontainer = table.insertRow(-1);
var tabCellTable = trcontainer.insertCell(-1);
tabCellTable.setAttribute("id", "divtable-"+obj[0]["id"]+"-"+idCounter);
trcontainer.appendChild(tabCellTable);
//}
//Add the newly created table to the container
var divContainerSelect = document.getElementById(divFirstLevelId);
divContainerSelect.appendChild(table);
var divTable = document.createElement("div");
divTable.setAttribute("class", "score-analysis-content-table");
divTable.setAttribute("id", divTableId);
var divContainerTable = document.getElementById(divFirstLevelId);
divContainerTable.appendChild(divTable);
resolve();
//}
});//promise end
}//create table ends
async function runAnalysisForSA(devicesid, applicationsid, fromepoch, toepoch, tabNumber, rowID) {
//var tabNumber = object.slice(-1);
//dummy
var data = '';
//Data for payload: first value - device_id, second value - app_id
var payload = {};
payload['device_id'] = devicesid;
payload['app_id'] = applicationsid;
payload['t0'] = fromepoch;
payload['t1'] = toepoch;
var removeTable = document.getElementById("score-analysis-content-table-" + tabNumber);
if (removeTable) {
removeTable.parentNode.removeChild(removeTable);
}
//Block selector during proccessing
//document.getElementById("score-analysis-tab-select-" + tabNumber).disabled = true;
var divTableId = rowID;
var divTable = document.getElementById(divTableId);
var divFirstLevelId = "score-analysis-container-element-" + tabNumber;
var divProgressBarId = "score-analysis-content-progress-bar-" + tabNumber;
var divBarId = "score-analysis-progress-bar-" + tabNumber;
var divProgressBar = document.createElement("div");
divProgressBar.setAttribute("class", "score-analysis-content-progress-bar");
divProgressBar.setAttribute("id", divProgressBarId);
//var divContainerProgress = document.getElementById(divFirstLevelId);
divTable.innerHTML = "";
divTable.appendChild(divProgressBar);
//divTable.parentNode.insertBefore(divProgressBar, divTable.nextSibling);*/
//divWrapper.appendChild(divProgressBar); // Append the progress bar element to the new div element
var paragraph = document.createElement("p");
paragraph.innerHTML = "Analyzing your data.";
var divContainerParagraph = document.getElementById(divProgressBarId);
divContainerParagraph.appendChild(paragraph);
var divBar = document.createElement("div");
divBar.setAttribute("class", "score-analysis-progress-bar");
divBar.setAttribute("id", divBarId);
var divContainerBar = document.getElementById(divProgressBarId);
divContainerBar.appendChild(divBar);
const progressBar = document.getElementById("divProgressBarId");
var progressCount = 0;
// const intervalId = setInterval(() => {
if (progressCount == 0) {
progressCount = 1;
var element = document.getElementById(divBarId);
var width = 1;
var progressId = setInterval(frameProgress, 360);
function frameProgress() {
if (width >= 100) {
clearInterval(progressId);
progressCount = 0;
var removeDivProgressBar = document.getElementById(divProgressBarId);
removeDivProgressBar.parentNode.removeChild(removeDivProgressBar);
// var removeDivWrapper = document.getElementById(divWrapper);
// removeDivWrapper.parentNode.removeChild(removeDivWrapper); // Remove the entire wrapper div element
} else {
width++;
element.style.width = width + "%";
}
}
}
//}, 300); //run for 30 secs
var analysisId = await postYEngineForSA(JSON.stringify(payload));
var analysisResult = await getYEngineForSA(analysisId);
var finalanalysisResult;
setTimeout(async function() {
finalanalysisResult = await getYEngineForSA(analysisId);
if(["analysis_id"] in finalanalysisResult){
var close = document.createElement("button");
close.setAttribute("class", "close-button");
close.innerHTML = "Close";
// Add a click event listener to the button
close.addEventListener("click", function() {
var divContainerTable = document.getElementById(rowID);
divContainerTable.innerHTML = "";
divContainerTable.removeChild(close);
});
var divContainerTable = document.getElementById(rowID);
divContainerTable.innerHTML = "No data. Please try after some time.";
divContainerTable.appendChild(close);
}
else{
tableAnalysisForSA(tabNumber, rowID, finalanalysisResult);
}
}, 30000);
//Remove previous table
/*var removeTable = document.getElementById("score-analysis-content-table-" + tabNumber);
if (removeTable) {
removeTable.parentNode.removeChild(removeTable);
}
//Block selector during proccessing
//document.getElementById("score-analysis-tab-select-" + tabNumber).disabled = true;
var divFirstLevelId = "score-analysis-container-element-" + tabNumber;
var divProgressBarId = "score-analysis-content-progress-bar-" + tabNumber;
var divBarId = "score-analysis-progress-bar-" + tabNumber;
var divProgressBar = document.createElement("div");
divProgressBar.setAttribute("class", "score-analysis-content-progress-bar");
divProgressBar.setAttribute("id", divProgressBarId);
var divContainerProgress = document.getElementById(divFirstLevelId);
divContainerProgress.appendChild(divProgressBar);
var paragraph = document.createElement("p");
paragraph.innerHTML = "Analyzing your data.";
var divContainerParagraph = document.getElementById(divProgressBarId);
divContainerParagraph.appendChild(paragraph);
var divBar = document.createElement("div");
divBar.setAttribute("class", "score-analysis-progress-bar");
divBar.setAttribute("id", divBarId);
var divContainerBar = document.getElementById(divProgressBarId);
divContainerBar.appendChild(divBar);
var progressCount = 0;
if (progressCount == 0) {
progressCount = 1;
var element = document.getElementById(divBarId);
var width = 1;
var progressId = setInterval(frameProgress, 100);
function frameProgress() {
if (width >= 100) {
clearInterval(progressId);
progressCount = 0;
var removeDivProgressBar = document.getElementById(divProgressBarId);
removeDivProgressBar.parentNode.removeChild(removeDivProgressBar);
//Unblock selector
//document.getElementById("score-analysis-tab-select-" + tabNumber).disabled = false;
//Call table building
tableAnalysisForSA(tabNumber, rowID);
//userButtonForSA();
} else {
width++;
element.style.width = width + "%";
}
}
}*/
}
//Build table of Y-Engine analysis result
function tableAnalysisForSA(tab, rowid, finalanalysisResult) {
var column = ['Factor','Explanation'];
var result = finalanalysisResult.result;
var idCounter = tab;
var divTableId = "score-analysis-container-element-table-" + idCounter;
var tableId = "score-analysis-content-table-" + idCounter;
var table = document.createElement("table");
table.setAttribute("class", "score-analysis-table-tb");
table.setAttribute("id", tableId);
var tr = table.insertRow(-1);
tr.setAttribute("class", "score-analysis-table-tr");
for (var i = 0; i != column.length; i++) {
var th = document.createElement("th");
th.setAttribute("class", "score-analysis-table-th");
th.innerHTML = column[i];
tr.appendChild(th);
}
for (var i = 0; i != result.length; i++) {
tr = table.insertRow(-1);
tr.setAttribute("class", "score-analysis-table-tr1");
for (var j = 0; j != column.length; j++) {
if (j == 0) {
var tabCell = tr.insertCell(-1);
tabCell.setAttribute("class", "score-analysis-table-td");
tabCell.innerHTML = result[i]["issue"];
} else {
var tabCell = tr.insertCell(-1);
tabCell.setAttribute("class", "score-analysis-table-td");
tabCell.innerHTML = result[i]["detailed_message"];
}
}
}
var closeButton = document.createElement("button");
closeButton.setAttribute("class", "close-button");
closeButton.innerHTML = "Close Table";
// Add a click event listener to the button
closeButton.addEventListener("click", function() {
var table = document.getElementById(tableId);
var divContainerTable = document.getElementById(rowid);
divContainerTable.removeChild(table);
divContainerTable.removeChild(closeButton);
});
var divContainerTable = document.getElementById(rowid);
divContainerTable.innerHTML = "";
divContainerTable.appendChild(closeButton);
divContainerTable.appendChild(table);
//scroll to new table
//var innerTable = divContainerTable.querySelector('.score-analysis-content-table');
//innerTable.scrollIntoView();
table.scrollIntoView({ behavior:'smooth', block:'center'});
}
function userButtonForSA() {
//User in ZDX button
var input = document.createElement("input");
input.setAttribute("style", "button");
input.setAttribute("class", "score-analysis-button-user");
input.setAttribute("value", "View User details on ZDX");
var divContainerButton = document.getElementById("score-analysis-button-wrapper");
divContainerButton.innerHTML = "";
divContainerButton.appendChild(input);
}
function infoMessageForSA(type, message) {
//type (error,info)
var divMessage = document.createElement("div");
divMessage.setAttribute("class", "score-analysis-message-" + type);
divMessage.setAttribute("id", "score-analysis-message");
var divContainerMessage = document.getElementById("score-analysis-info-message-wrapper");
divContainerMessage.appendChild(divMessage);
var paragraph = document.createElement("p");
paragraph.innerHTML = message;
var divContainerParagraph = document.getElementById("score-analysis-message");
divContainerParagraph.appendChild(paragraph);
return true;
}
function popUpMessageForSA(state, message) {
//GlideModal scrolling function crashes in case of "Modal over Modal"
//var dialogClass = GlideModal ? GlideModal : GlideDialogWindow;
var popUpDialog = new GlideDialogWindow("x_zsca2_zdx_manage_zdx_score_analysis_info", false, 600);
popUpDialog.setTitle(new GwtMessage().getMessage("Score Analysis information message"));
popUpDialog.setPreference('scoreAnalysisMessageState', state);
popUpDialog.setPreference('scoreAnalysisMessage', message);
popUpDialog.render();
}
//Remove onclick listener from ZDX Score Analysis section tab
function disableEventListenerForSA() {
//Get all section tabs
var getSectionElementnsSA = g_tabs2Sections.tabDiv.children;
for (var i = 0; i != getSectionElementnsSA.length; i++) {
if (getSectionElementnsSA[i].children[0].innerText == 'ZDX Summary') {
//Remove onclick eventListener to Deep Tracing section tab
getSectionElementnsSA[i].children[0].removeEventListener("click", initiateScoreAnalysisSection);
}
}
return true;
}
</script>
<style>
.score-analysis-info-message-wrapper {
font-weight: bold;
display:flex;
justify-content: center;
align-items: center;
height:100%;
margin: auto;
}
.score-analysis-date-time-wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr auto;
grid-gap: 10px;
width: 100%;
margin-bottom: 20px;
}
#score-analysis-time-from, #score-analysis-time-to {
margin-left: 10px;
}
.score-analysis-submit {
margin-top: 10px;
}
.score-analysis-wrapper {
width: 100%;
margin: 0 auto;
}
.score-analysis-content-wrapper {
position: relative;
margin: 3rem 0;
background: #ffffff;
height: 40rem;
overflow: scroll;
overflow-x: hidden;
}
.score-analysis-content-wrapper::before,
.score-analysis-content-wrapper::after {
content: "";
display: table;
}
.score-analysis-content-wrapper::after {
clear: both;
}
.score-analysis-content {
float: left;
}
.score-analysis-tab-switch {
display: none;
}
.score-analysis-tab-label {
position: relative;
line-height: 2.75em;
height: 3em;
padding: 0 5em;
background: #e6e9eb;
border-top: 3px solid #cbcbcb;
color: #000000;
cursor: pointer;
top: 0;
transition: all 0.25s;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: inline-block;
width: 400px
}
.score-analysis-tab-label:hover {
top: -0.25rem;
transition: top 0.25s;
}
.score-analysis-container-element {
width: 100%;
position: absolute;
z-index: 1;
top: 2.75em;
left: 0;
padding: 1.618rem;
background: #ffffff;
color: #2c3e50;
opacity: 0;
transition: all 0.35s;
}
.score-analysis-tab-switch:checked + .score-analysis-tab-label {
background: #ffffff;
color: #2c3e50;
border-top: 3px solid #1f8476;
border-bottom: 0;
border-right: 0.125rem solid #ffffff;
border-left: 0.125rem solid #cbcbcb;
transition: all 0.35s;
z-index: 1;
top: -0.0625rem;
}
.score-analysis-tab-switch:checked + .score-analysis-tab-label + .score-analysis-container-element {
z-index: 2;
opacity: 1;
transition: all 0.35s;
}
.score-analysis-content-table {
padding-top: 25px;
}
.score-analysis-table-th {
width: -webkit-fill-available;
font-family: SourceSansPro, "Helvetica Neue", Arial;
font-size: 13px;
border: solid 2px #ffffff;
border-collapse: collapse;
background-color: #e6e9eb;
padding: 5px 10px;
text-align: left;
}
.score-analysis-table-tb,
.score-analysis-table-tr,
.score-analysis-table-td {
width: -webkit-fill-available;
font-family: SourceSansPro, "Helvetica Neue", Arial;
font-size: 13px;
border: solid 2px #e6e9eb;
border-collapse: collapse;
padding: 5px 10px;
text-align: left;
}
.score-analysis-table-tr1 {
font-family: SourceSansPro, "Helvetica Neue", Arial;
font-size: 13px;
border: solid 2px #e6e9eb;
border-collapse: collapse;
padding: 5px 10px;
text-align: left;
height: 5px !important;
}
.score-analysis-table-tr1 td:first-child {
width: 30%;
height: 5px !important;
}
.score-analysis-table-tr1 td:last-child {
width: 70%;
height: 5px !important;
}
.score-analysis-button-user {
background-color: #1f8476;
border: 1px solid #1f8476;
border-radius: 12px;
box-sizing: border-box;
color: #ffffff;
cursor: pointer;
font-size: 12px;
outline: 0;
text-align: center;
transition: transform 150ms, box-shadow 150ms;
-webkit-user-select: none;
}
.score-analysis-button-user:hover {
box-shadow: rgba(0, 0, 0, .15) 0 3px 9px 0;
transform: translateY(-3px);
}
@media (min-width: 768px) {
.score-analysis-button-user {
padding: 6px 10px;
}
}
@keyframes load {
0%{
opacity: 0.08;
filter: blur(5px);
letter-spacing: 3px;
}
100%{
}
}
.score-analysis-loading-animation {
display:flex;
justify-content: center;
align-items: center;
height:100%;
margin: auto;
font-family: SourceSansPro, "Helvetica Neue", Arial;
animation: load 1.2s infinite 0s ease-in-out;
animation-direction: alternate;
text-shadow: 0 0 1px white;
}
.score-analysis-loading-animation-submit {
display:flex;
justify-content: center;
align-items: center;
height:4%;
margin: auto;
font-family: SourceSansPro, "Helvetica Neue", Arial;
animation: load 1.2s infinite 0s ease-in-out;
animation-direction: alternate;
text-shadow: 0 0 1px white;
}
.score-analysis-content-progress-bar {
text-align: center;
position: relative;
top: 60%;
left: 50%;
transform: translate(-50%, -50%);
width: 200px;
margin-top: 30px;
background-color: #ffffff;
border: 1px solid #000000;
}
.score-analysis-progress-bar {
width: 1%;
height: 15px;
background-color: #7a7676;
}
table {
width: 100%;
}
.score-analysis-table-td {
width: 80%;
height: 100px;
}
.score-analysis-btn-td {
border-style: hidden;
border-right: aliceblue;
border-bottom: aliceblue;
border-left: aliceblue;
text-align: center;
}
.score-analysis-button {
border: 1px solid #005F99;
background-color: white;
color: #005F99;
border-radius: 3px;
height: 30px;
width: 115px;
margin: 5px;
}
.score-analysis-button:hover {
box-shadow: rgba(0, 0, 0, .15) 0 3px 9px 0;
transform: translateY(-1px);
}
.score-analysis-button[disabled] {
background-color: gray;
color: white;
}
.red {
color: red;
}
.orange {
color: orange;
}
.green {
color: green;
}
.red,
.orange,
.green {
text-align: center;
font-size: 20pt;
font-weight: 500;
}
.chart{
width: calc(100% - 20px);
height: calc(100% - 20px);
float: left;
}
.g-svg{
clear: both;
margin-left: 20px;
width: calc(100% - 40px);
height: 20px;
}
</style>
</j:jelly>