popToScroll = function (event) { var msgDiv = document.getElementById("popupWindow"); if (msgDiv.style["top"] == "1px") { msgDiv.style.top = (event.pageY - 40) + 'px'; msgDiv.style.left = (event.pageX - 250) + 'px'; } } trackMouse = function () { }; function hideAlert() { document.getElementById("AlertWindow").style["display"] = "None"; // document.removeEventListener('mousemove',trackMouse); // document.getElementById("popupWindow").style["top"] = "1px"; } function processAtAppConfirm(bool) { hideAlert(); atAppConfirmCallback(bool); } function processAtAppPrompt(bool) { hideAlert(); if (typeof atAppPromptCallback !== 'undefined') if (bool) { atAppPromptCallback(document.getElementById("atAppPrompt").value, bool); } else { atAppPromptCallback("", bool); } } function createAlert() { var msgDiv = document.body.appendChild(document.createElement('div')); msgDiv["id"] = "AlertWindow"; msgDiv.style["position"] = "absolute"; msgDiv.style["top"] = "1px"; msgDiv.style["left"] = "1px"; msgDiv.style["color"] = "black"; msgDiv.style["width"] = "100%"; msgDiv.style["padding-left"] = "0px"; msgDiv.style["height"] = "4000px"; msgDiv.style["background-color"] = "rgba(0, 0, 0, .5)"; msgDiv.style["z-index"] = 100; return msgDiv; } function alert(msg) { document.addEventListener('mousemove', trackMouse); var msgDiv = document.getElementById("AlertWindow"); if (typeof msgDiv === 'undefined' || msgDiv == null) { msgDiv = createAlert(); } else { msgDiv.style["display"] = "block"; } msgDiv.innerHTML = ""; } function atAppPrompt(msg, value, callback, event) { atAppPromptCallback = callback; var msgDiv = document.getElementById("AlertWindow"); if (typeof msgDiv === 'undefined' || msgDiv == null) { msgDiv = createAlert(); } else { msgDiv.style["display"] = "block"; } msgDiv.innerHTML = ""; if (typeof event !== 'undefined') popToScroll(event); } moveAlertToPage = function () { if (typeof alertPageX !== 'undefined') { var msgDiv = document.getElementById("popupWindow"); msgDiv.style["top"] = alertPageY; msgDiv.style["left"] = alertPageX; } } function atAppConfirm(msg, callback) { atAppConfirmCallback = callback; document.addEventListener('mousemove', trackMouse); var msgDiv = document.getElementById("AlertWindow"); if (typeof msgDiv === 'undefined' || msgDiv == null) { msgDiv = createAlert(); } else { msgDiv.style["display"] = "block"; } msgDiv.innerHTML = ""; moveAlertToPage(); } var useWorkfrontProxy = getParameterByName("wfProxyMode"); var testNewUrl = true; var ATTASK_INSTANCE = 'secure.attasksandbox.com'; var loadingPage = "https://secure.atappstore.com/solutions/showcase/loading.html?v=20240607.2"; var loadingTimeout = 0; var isLoaded = false; var host = getParameterByName("host"); var credential = getParameterByName("credential"); var sessionID = getParameterByName("s"); var apiKey = getParameterByName("a"); var objID = getParameterByName("objID"); var userID = getParameterByName("userID"); var objTerm = getParameterByName("objTerm"); var objType = getParameterByName("objType"); var userSessionID = sessionID; var showDownload = false; var ext = getParameterByName("ext"); var showToolbox = getParameterByName("toolbox"); var uberForm = getParameterByName("uberForm"); var showReports = getParameterByName("reports"); var designerMode = false; var configObjType = "proj"; var configObjID = null; var configObjName = "AtApp Control"; var atAppSettingsProjectID = null; var currentUserName = ""; var currentUserEmailAddr = ""; var currentUserCompany = ""; var includeObjName = ""; var reportTitle = getParameterByName("reportSectionTitle"); var dateFilter = getParameterByName("dateFilter"); var customFrom = getParameterByName("fromDate"); var customTo = getParameterByName("toDate"); var yearFilter = getParameterByName("yearFilter"); var dashboardReport = getParameterByName("dashboardReport"); var reportName = getParameterByName("reportName"); var showTaskFilter = getParameterByName("showTaskFilter"); var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1; var timer = getParameterByName("timer"); var scheduledReport = getParameterByName("scheduledReport"); var ATAPP_HOST = document.location.protocol + '//' + document.location.host; var LICENSE_HOST = 'https://secure.atappstore.com'; var logTo = getParameterByName("logTo"); var logLevel = getParameterByName("logLevel"); var userFilterType = getParameterByName("otherFilterObj"); var defaultUserFilter = getParameterByName("otherFilterDefault"); var userFilterName = getParameterByName("otherFilterLabel"); var showProjectFilter = getParameterByName("showProjectFilter"); var showDateFilter = getParameterByName("showDateFilter"); var showCustomFilter = getParameterByName("showCustomFilter"); var api = "api/v14.0"; var useViewer = (getParameterByName("useViewer") == "true"); var customerID; var testLicenseJson = getParameterByName("testLicenseJson"); var hostedAdminURL = getParameterByName("hostedAdminURL"); var pdfFrameHeight = getParameterByName("pdfFrameHeight"); var useAppliedTaskFilter = false; var exportClickItems = null; var hostedFile = null; if (showToolbox == "true") { document.getElementById("adminToolbox").style["display"] = "inline"; } var securityToken = (getParameterByName("a") != "" ? "apiKey=" + apiKey : "sessionID=" + sessionID); var renderer = getParameterByName("renderer"); if (renderer == "") { //renderer = "secure.atappstore.com/renderer"; // FAILS 2023-05-05 -- redeploy later, then try again renderer = "secure.atappstore.com/renderer"; //renderer = "reports.corp.gs"; } if (showCustomFilter == "" || showCustomFilter == "true") showCustomFilter = true; if (ext == null) { ext = "pdf"; } if (reportTitle == "") { reportTitle = "Administrative Reports"; } if (dashboardReport == "true") { document.getElementById("pdfFrame").style["visibility"] = "visible"; document.getElementById("pdfFrame").style["display"] = "inline"; } if (getParameterByName("design") == "true") { designerMode = true; } if (getParameterByName("ShowDownload") == "true") { showDownload = true; } if (getParameterByName("configName") != "") { configObjName = getParameterByName("configName"); } if (getParameterByName("configObj") != "") { configObjType = getParameterByName("configObj"); } if (getParameterByName("includeName") != "") { includeObjName = getParameterByName("includeName"); } processNoData = (getParameterByName("processNoData").toLowerCase() == "true"); if (getParameterByName("hostedFile") != "") { hostedFile = getParameterByName("hostedFile"); } if (host == "") { if (document.referrer != "") { ATTASK_INSTANCE = document.referrer.substring(8, document.referrer.indexOf(".com") + 4); } } else { ATTASK_INSTANCE = host; } // Create https hostname from INSTANCE atTaskHost = 'https://' + ATTASK_INSTANCE; loadAdminDashboardConfig = function () { }; // routine called back by .qry file provides function handle to load dataset function adminDashboardCallback(getAdminDashboardOptions) { if (isLoaded) return; isLoaded = true; getAdminDashboardOptions(loadAdminDashboardConfig); } angular.module('exceptionOverride', []).factory('$exceptionHandler', ['$log',function($log) { return function(exception, cause) { exception.message += ' (caused by "' + cause + '")'; const eventAwesome = new CustomEvent("atappException", { bubbles: true, detail: { exception }, }); dispatchEvent(eventAwesome) $log.error(exception, cause) // throw exception; }; }]); var app = angular.module('app', ['ngSanitize', 'ui.select', 'atTaskServiceModule', 'exceptionOverride']); // Main render routine for page data: app.controller('AtTaskAdminDashboardCTRL', function ($scope, $http, $sce, $location, $compile, atTaskWebService) { $scope.compile = $compile; $scope.trustAsHtml = function (html) { return $sce.trustAsHtml(html); } $scope.atTaskWebService = atTaskWebService; if (getParameterByName("ShowLabels") == "true"); { $scope.showLabels = true; } if (pdfFrameHeight == "") { $scope.pdfFrameHeight = (window.innerHeight - 125) + "px"; } else { $scope.pdfFrameHeight = pdfFrameHeight; } var thisYear = new Date().getFullYear(); $scope.filterYears = [] for (i = thisYear - 5; i <= thisYear + 5; i++) { $scope.filterYears.push(i); } $scope.getCompanyList = function () { var url = atTaskHost + "/attask/" + api + "/cmpy/search?method=GET&" + securityToken + "&fields=name,ID"; atTaskWebService.atTaskGet(url, function (data) { $scope.filterCompanies = [{ name: "-All-", ID: "" }]; $scope.filterCompanies = $scope.filterCompanies.concat(data); $scope.selectedCompanyFilter = $scope.filterCompanies[0]; }); } $scope.selectDateRangeForFilter = function () { var yr = new Date().getFullYear(); var mn = new Date().getMonth(); var fromDate; var toDate; var x = $scope.selectedDateFilter.value; if ($scope.selectedDateFilter.type == "y") { fromDate = new Date(yr + x, 0, 1); toDate = new Date(yr + x, 11, 31); } else if ($scope.selectedDateFilter.type == "q") { var newMn = mn + x * 3; if (newMn < 0) { fromDate = new Date(yr - 1, 9, 1); toDate = new Date(yr - 1, 11, 31); } else if (newMn > 11) { fromDate = new Date(yr + 1, 0, 1); toDate = new Date(yr + 1, 2, 31); } else { fromDate = new Date(yr, (newMn - newMn % 3), 1); toDate = new Date(yr, (newMn - newMn % 3) + 3, 1); toDate.setDate(0); } } else if ($scope.selectedDateFilter.type == "m") { var newMn = mn + x; if (newMn < 0) { fromDate = new Date(yr - 1, 11, 1); toDate = new Date(yr - 1, 11, 31); } else if (newMn > 11) { fromDate = new Date(yr + 1, 0, 1); toDate = new Date(yr + 1, 0, 31); } else { fromDate = new Date(yr, newMn, 1); toDate = new Date(yr, newMn + 1, 1); toDate.setDate(0); } } else if ($scope.selectedDateFilter.type == "w") { var msDay = 86400000; fromDate = new Date(); fromDate = new Date(fromDate.getTime() + msDay * (7 * x - fromDate.getDay())); toDate = new Date(fromDate.getTime() + (6 * msDay)); } if ($scope.selectedDateFilter.type == "c") { if ($scope.fromDate == null || $scope.toDate == null) { $scope.fromDate = new Date(yr, 0, 1); $scope.toDate = new Date(yr, 11, 31); } document.getElementById("dateRangeSpan").style["display"] = "inline"; document.getElementById("dateRangeSpanAdmin").style["display"] = "inline"; } else { document.getElementById("dateRangeSpan").style["display"] = "none"; document.getElementById("dateRangeSpanAdmin").style["display"] = "none"; $scope.fromDate = fromDate; $scope.toDate = toDate; } } // {name:"-All-",type:"a"}, $scope.filterDates = [ { name: "Last Year", type: "y", value: -1 }, { name: "This Year", type: "y", value: 0 }, { name: "Next Year", type: "y", value: 1 }, { name: "Last Quarter", type: "q", value: -1 }, { name: "This Quarter", type: "q", value: 0 }, { name: "Next Quarter", type: "q", value: 1 }, { name: "Last Month", type: "m", value: -1 }, { name: "This Month", type: "m", value: 0 }, { name: "Next Month", type: "m", value: 1 }, { name: "Last Week", type: "w", value: -1 }, { name: "This Week", type: "w", value: 0 }, { name: "Next Week", type: "w", value: 1 }, { name: "Custom", type: "c" }, ]; if (dateFilter == "") { $scope.selectedDateFilter = $scope.filterDates[1]; } else { $scope.selectedDateFilter = $scope.filterDates.filter(function (d) { return (d.name == dateFilter) })[0]; if (dateFilter == "Custom") { var fDate = new Date(customFrom); var tDate = new Date(customTo); // FireF*x check if (isNaN(tDate.getTime())) { // the default dates sent from Workfront are being misinterpreted by the brower // so, knowing at Workfront sends them as DD/MM/YY but likely being treated as // MM/DD/YY, override fDate and tDate accordingly fDate = new Date(customFrom.substring(6, 8), ("0" + (parseInt(customFrom.substring(3, 5)) - 1)).substring(0, 2), customFrom.substring(0, 2)); tDate = new Date(customTo.substring(6, 8), ("0" + (parseInt(customTo.substring(3, 5)) - 1)).substring(0, 2), customTo.substring(0, 2)); } if (fDate < new Date('01/01/2000')) { fDate.setFullYear(fDate.getFullYear() + 100); } if (tDate < new Date('01/01/2000')) { tDate.setFullYear(tDate.getFullYear() + 100); } $scope.fromDate = fDate; $scope.toDate = tDate; } } if (yearFilter != "") { $scope.selectedYear = parseInt(yearFilter); } else { $scope.selectedYear = thisYear; } $scope.reportTitle = reportTitle; $scope.setStyle = function (source, target) { if (source == target) { return { display: "inline" }; } else { return { display: "none" }; } } $scope.setBorderStyle = function (theColor) { // return {border: '2px solid yellow'} let stuff = '2px solid ' + theColor // console.log(`The stuff: ${stuff}`) return {border: stuff} } $scope.customParameter = function (scopeName, setValue) { var match = $scope.CustomParameters.filter(function (cp) { return cp.scope == scopeName }); if (match.length > 0) { if (setValue != null) { match[0].value = setValue; match[0].dateValue = match[0].type == "date" ? setValue : null; } return match[0].type == "date" ? match[0].dateValue : match[0].value; } else return null; } $scope.projectFilterChanged = function () { if (document.getElementById('adminProjectFilter').style["display"] == "inline") { $scope.getProjectFilterCount(function (count) { $scope.currentBatchStep = 'Note: Selected project filter contains ' + count + ' projects.'; }); } } $scope.toolSelectionChanged = function () { document.getElementById("batchTableOutput").innerHTML = ""; document.getElementById("xlsDownloadButton").style["visibility"] = "hidden"; $scope.currentBatchStep = ''; if (showToolbox == "true" && !(typeof $scope.selectedTool === 'undefined')) { var projDiv = document.getElementById('adminProjectFilter'); projDiv.style['display'] = 'none'; var taskDiv = document.getElementById('adminTaskFilter'); taskDiv.style['display'] = 'none'; var dateDiv = document.getElementById('adminDateFilter'); dateDiv.style['display'] = 'none'; if (!(typeof $scope.selectedTool.arguments === 'undefined')) { if ($scope.selectedTool.arguments.indexOf("projectFilter") >= 0) projDiv.style['display'] = 'inline'; if ($scope.selectedTool.arguments.indexOf("taskFilter") >= 0) taskDiv.style['display'] = 'inline'; if ($scope.selectedTool.arguments.indexOf("dateFilter") >= 0) dateDiv.style['display'] = 'inline'; } var othDiv = document.getElementById('adminOtherDiv'); othDiv.style['display'] = 'none'; if (typeof $scope.selectedTool === 'undefined') { return; } if (!(typeof $scope.selectedTool.includes === 'undefined') && document.getElementById($scope.selectedTool.name + '_src_include_0') == null) { var i = 0; $scope.selectedTool.includes.map(function (t) { var js = document.createElement('script'); js.id = $scope.selectedTool.name + '_src_include_' + i; js.src = t; document.head.appendChild(js); i++; }); } if (!(typeof $scope.selectedTool.custom === 'undefined')) { othDiv.style['display'] = 'inline'; $scope.CustomParameters = $scope.selectedTool.custom; $scope.CustomParameters.map(function (cp) { cp.dateValue = (cp.type == "date" ? new Date(eval(cp.default)) : null); if (cp.type == 'userFilter') { $scope.loadCustomUserFilter(cp.objCode, function (data) { cp.type = 'select'; cp.options = data.map(function (d) { var opt = { key: d.name, value: d.filter }; if (cp.default == d.name) { cp.value = d.filter; } return opt; }); } ); } else if (cp.type == 'select') { if (typeof cp.options[0].key === 'undefined') { cp.options = cp.options.map(function (o) { return { key: o, value: o } }); } cp.value = eval(cp.default); } else { cp.value = eval(cp.default); } }) } else { $scope.CustomParameters = []; } } } cleanupReport = false; $scope.reportSelectionChanged = function () { delete $scope.originalRDL if (typeof $scope.selectedReport === 'undefined' || $scope.selectedReport == null) { return; } else if (!(typeof $scope.selectedReport.filters === 'undefined')) { if ($scope.selectedReport.filters.filter(function (f) { return f.key == "year" }).length > 0) { document.getElementById("yearFilterSpan").style["display"] = "inline"; document.getElementById("dateTab").style["display"] = "inline"; } if ($scope.selectedReport.filters.filter(function (f) { return f.key == "showLabels" }).length > 0) { document.getElementById("showLabelsSpan").style["display"] = "inline"; document.getElementById("otherTab").style["display"] = "inline"; } if ($scope.selectedReport.filters.filter(function (f) { return f.key == "dateFilter" }).length > 0) { document.getElementById("dateFilterSpan").style["display"] = "inline"; document.getElementById("dateTab").style["display"] = "inline"; } var tmpFilters = $scope.selectedReport.filters.filter(function (f) { return f.key == "showLabels" }); if (tmpFilters.length > 0) { $scope.showFilters = tmpFilters[0].value; document.getElementById("showLabelsSpan").style["display"] = "inline"; document.getElementById("otherTab").style["display"] = "inline"; } else { $scope.showFilters = false; } if ($scope.selectedReport.filters.filter(function (f) { return f.key == "companyFilter" }).length > 0) { document.getElementById("companyFilterSpan").style["display"] = "inline"; document.getElementById("otherTab").style["display"] = "inline"; } var custVal = $scope.selectedReport.filters.filter(function (f) { return f.key == "customValuesFilter" }) if (custVal.length > 0) { document.getElementById("customValuesTab").style["display"] = (showCustomFilter == true ? "inline" : "none"); $scope.customValueFilterName = custVal[0].value.filterName; $scope.customFilterValues = custVal[0].value.filterValues.filter(function (v) { return (typeof v.key !== 'undefined') }); var customCheckboxValues = custVal[0].value.filterValues.filter(function (v) { return (typeof v.checked !== 'undefined') }); var customTextValues = custVal[0].value.filterValues.filter(function (v) { return (typeof v.default !== 'undefined') }); var customRadioButtonValues = custVal[0].value.filterValues.filter(function (v) { return (typeof v.chosen !== 'undefined') }); if (customCheckboxValues.length > 0 || customTextValues.length > 0) { var ufTab = document.getElementById("tab5") var tmpHTML = $scope.customFilterValues.length == 0 ? '' : '
'; if (customCheckboxValues.length > 0) tmpHTML += " " customCheckboxValues.forEach(function (cb) { tmpHTML += "   " + cb.label + ""; $scope[cb.scopeName] = cb.checked; }); if (customCheckboxValues.length > 0) tmpHTML += ""; if (customRadioButtonValues.length > 0) tmpHTML += "    " customRadioButtonValues.forEach(function (rb) { tmpHTML += "   " + (typeof rb.title !== 'undefined' ? rb.title + ' ' : '') + "" + rb.label; if (rb.chosen) $scope[rb.scopeName] = rb.value; }); if (customRadioButtonValues.length > 0) tmpHTML += "   " if (customTextValues.length > 0) tmpHTML += " " customTextValues.forEach(function (tb) { var typ = (typeof tb.type === 'undefined' ? 'text' : tb.type); var wid = (typeof tb.width === 'undefined' ? '50px' : tb.width); tmpHTML += "   " + tb.label + " "; $scope[tb.scopeName] = tb.default; }); if (customTextValues.length > 0) tmpHTML += ""; tmpHTML += "
"; ufTab.innerHTML = tmpHTML; var angUF = (angular.element(ufTab)); $compile(angUF)($scope); cleanupReport = true; } else if (cleanupReport) { var ufTab = document.getElementById("tab5") ufTab.innerHTML = '
'; var angUF = (angular.element(ufTab)); $compile(angUF)($scope); cleanupReport = false; } if (typeof $scope.customValueFilterName === 'undefined') { defaultCustomFilter = ""; } else { defaultCustomFilter = getParameterByName($scope.customValueFilterName); } if (defaultCustomFilter != "") { defFlt = custVal[0].value.filterValues.filter(function (f) { return f.key == defaultCustomFilter }); $scope.selectedCustomValueFilter = (defFlt.length == 1 ? defFlt[0] : custVal[0].value.filterValues[0]); } else { $scope.selectedCustomValueFilter = custVal[0].value.filterValues[0]; } } } // check for a ReportSelectedCallback for this report, and if it exits, call it // NOTE: JavaScript does not allow function names to have spaces, so skip any // selectedReport.templates that (foolishly) have a space in them if ($scope.selectedReport.template.indexOf(" ") < 0 && eval("typeof " + $scope.selectedReport.template + "ReportSelectedCallback") === "function") { eval($scope.selectedReport.template + "ReportSelectedCallback")(); } } $scope.$watch('selectedReport', $scope.reportSelectionChanged); $scope.$watch('selectedTool', $scope.toolSelectionChanged); $scope.$watch('currentProjectFilter', $scope.projectFilterChanged); $scope.loadUberForms = function (forms) { if (!(typeof forms === 'undefined') && (uberForm != "" && uberForm != null)) { $scope.uberForms = forms; var ufSpan = document.getElementById("uberForm"); var uForm = forms.filter(function (f) { return f.name == uberForm || f.name == uberForm + '.atapp' })[0]; if (!(typeof uForm === 'undefined') && !(typeof uForm.includes === 'undefined') && document.getElementById(uForm.name + '_src_include_0') == null) { var i = 0; uForm.includes.map(function (t) { if (t.indexOf(".css") > (t.length - 5)) { var fileref = document.createElement("link"); fileref.setAttribute("rel", "stylesheet"); fileref.setAttribute("type", "text/css"); fileref.setAttribute("href", t); } else { var js = document.createElement('script'); js.id = uForm.name + '_src_include_' + i; js.src = t; document.head.appendChild(js); i++; } }); } if (!(typeof uForm === 'undefined')) { ufSpan.innerHTML = uForm.htmlBlock; ufSpan.style["display"] = "inline"; angUF = (angular.element(ufSpan)); $compile(angUF)($scope); if (!(typeof uForm.callback === 'undefined')) { uForm.callback(); } } } } $scope.recompileUberForm = function (html) { var ufSpan = document.getElementById("uberForm"); ufSpan.innerHTML = html; ufSpan.style["display"] = "inline"; angUF = (angular.element(ufSpan)); $compile(angUF)($scope); } $scope.loadAdminDashboardConfig = function (tools, reports, forms) { $scope.adminTools = tools; $scope.adminReports = reports; if (hostedAdminURL != "") { $scope.configDocuments = []; $scope.adminReports.forEach(function (r) { var downloadURL = hostedAdminURL.replace('AdminDashboard.atapp.js', '') + r.template + '.tpx.js' $scope.configDocuments.push({ downloadURL: downloadURL, name: r.template, currentVersion: { ext: 'tpx' } }); }) } $scope.sequentialLoadRDLDocumentList( $scope.adminReports.map(function (r) { return $scope.configDocuments.filter(function (c) { return ((c.name == r.template && c.currentVersion.ext == 'tpx') || (c.name == r.template + '.tpx' && c.currentVersion.ext == 'js')) })[0] }), function () { $scope.selectedTool = $scope.adminTools[0]; if (reportName == "") { $scope.selectedReport = $scope.adminReports[0]; } else { $scope.selectedReport = $scope.adminReports.filter(function (r) { return (r.name == reportName || r.name == reportName + '.tpx'); })[0]; } $scope.reportSelectionChanged(); $scope.toolSelectionChanged(); $scope.loadUberForms(forms); $scope.$apply(); if (showReports == "true") { document.getElementById("adminReports").style["display"] = "inline"; document.getElementById("pdfFrame").style["visibility"] = "visible"; document.getElementById("pdfFrame").style["display"] = "inline"; } if (dashboardReport == "true") { document.getElementById('adminReports').style['display'] = 'inline'; if (showReports != 'true') { document.getElementById('reportParams').style['display'] = 'none'; document.getElementById('viewReportButton').style['display'] = 'none'; } setTimeout($scope.viewReport, 200); } $scope.initTimer(); }); } loadAdminDashboardConfig = $scope.loadAdminDashboardConfig; $scope.createFilterFromDefinition = function (def, prefix) { var filter = ""; for (itm in def) { def[itm] = def[itm].replace(/&/g, '%26').replace(/#/g, '%23'); var eItm = itm.replace(/&/g, '%26').replace(/#/g, '%23'); if (typeof def[itm + "_Mod"] !== 'undefined' && def[itm + '_Mod'] == 'in') { def[itm] = def[itm].replace(/,/g, "\t"); } filter += '&' + def[itm].split('\t').map(function (str) { return prefix + eItm + '=' + str }).join('&'); } return filter; } $scope.loadCustomUserFilter = function (objCode, callback) { var newFilter = [{ 'name': '-ALL-', definition: '', filter: '' }]; var path = 'api-internal/uift/filtersForObjCode'; var filter = securityToken + '&objCode=' + objCode.toUpperCase() + '&filterType=STANDARD'; var fields = ['name', 'definition']; var filterURL = 'https://' + ATTASK_INSTANCE + '/attask/' + path + '?method=GET&' + filter + '&fields= ' + fields.join(','); atTaskWebService.atTaskGet(filterURL, function (data) { newFilter = newFilter.concat(data.map(function (tFilter) { tFilter['filter'] = $scope.createFilterFromDefinition(tFilter.definition, ''); return tFilter; })); callback(newFilter); }); } $scope.loadProjectFilters = function (prefix) { $scope.projectFilters = [{ 'name': '-ALL-', definition: 'ID_Mod=notnull', filter: '&ID_Mod=notnull' }]; var path = 'api-internal/uift/filtersForObjCode'; var filter = securityToken + '&objCode=PROJ&filterType=STANDARD'; var fields = ['name', 'definition']; var filterURL = 'https://' + ATTASK_INSTANCE + '/attask/' + path + '?method=GET&' + filter + '&fields= ' + fields.join(','); atTaskWebService.atTaskGet(filterURL, function (data) { $scope.projectFilters = $scope.projectFilters.concat( data.map(function (pFilter) { pFilter['filter'] = $scope.createFilterFromDefinition(pFilter.definition, prefix); return pFilter; })); $scope.setDefaultProjectFilter(); }); } $scope.showSolutionNotification = false $scope.solutionNotification = null $scope.solutionNotificationColor = 'orange'; $scope.loadSolutionNotification = function () { var url = atTaskHost + '/attask/' + api url += '/task/search?name=AtApp Notification:&name_Mod=cicontains' url += '&' + securityToken url += '&project:name=' + configObjName url += '&plannedStartDate=$$NOW&plannedStartDate_Mod=lt' url += '&plannedCompletionDate=$$NOW&plannedCompletionDate_Mod=gt' url += '&fields=name,description' atTaskWebService.atTaskGet(url, function (data) { $scope.solutionNotification = null if (data && data.length > 0) { $scope.showSolutionNotification = true $scope.solutionNotification = data[0].description // If a hex code color string is found at the beginning of the notification message, ( ie: #F1AB11; ) strip it off the message and use it let notificationColor = data[0].description.match(/^(#[a-fA-F0-9]+);/gi) if (notificationColor && notificationColor.length > 0){ $scope.solutionNotification = $scope.solutionNotification.substring(notificationColor[0].length) $scope.solutionNotificationColor = notificationColor[0].split(';')[0] } $scope.redrawScreen() } }); } $scope.hideSolutionNotification = function () { $scope.showSolutionNotification = false; $scope.redrawScreen() } $scope.redrawScreen = function () { setTimeout(function () { $scope.$apply() }, 20); } $scope.setDefaultProjectFilter = function () { // Page can have "ProjectFilter" argument var vProj = getParameterByName("projectFilter"); if (typeof $scope.currentProjectFilter === 'undefined') { $scope.currentProjectFilter = $scope.projectFilters[0]; if (vProj != "") { var search = $scope.projectFilters.filter(function (pf) { return (pf.name == vProj) }); if (search.length > 0) $scope.currentProjectFilter = $scope.projectFilters.filter(function (pf) { return (pf.name == vProj) })[0]; } } } $scope.loadTaskFilters = function (prefix) { $scope.taskFilters = [{ 'name': '-ALL-', definition: 'ID_Mod=notnull', filter: '&ID_Mod=notnull' }]; var path = 'api-internal/uift/filtersForObjCode'; var filter = securityToken + '&objCode=TASK&filterType=STANDARD'; var fields = ['name', 'definition']; var filterURL = 'https://' + ATTASK_INSTANCE + '/attask/' + path + '?method=GET&' + filter + '&fields= ' + fields.join(','); atTaskWebService.atTaskGet(filterURL, function (data) { $scope.taskFilters = $scope.taskFilters.concat(data.map(function (tFilter) { tFilter['filter'] = $scope.createFilterFromDefinition(tFilter.definition, prefix); return tFilter; })); $scope.setDefaultTaskFilter(); }); } $scope.setDefaultTaskFilter = function () { // Page can have "TaskFilter" argument var vTask = getParameterByName("taskFilter"); if (typeof $scope.currentTaskFilter === 'undefined') { $scope.currentTaskFilter = $scope.taskFilters[0]; if (vTask != "") { var search = $scope.taskFilters.filter(function (tf) { return (tf.name == vTask) }); if (search.length > 0) $scope.currentTaskFilter = $scope.taskFilters.filter(function (tf) { return (tf.name == vTask) })[0]; } } }; $scope.reloadPage = function () { location.reload(); } $scope.reloadIfTimeout = function () { if (!isLoaded) { location.reload(); } } $scope.uploadConfigFile = function (fileName, fileData, callback, error) { var fileInfo = "?fileName=" + fileName + "&objType=" + configObjType + "&id=" + $scope.configObjID + "&path=&server=" + ATTASK_INSTANCE + "&session=" + sessionID; $http({ method: 'POST', url: 'https://' + renderer + '/WorkfrontUploadProxy.aspx' + fileInfo, headers: { 'Content-Type': null }, responseType: 'text/plain', data: fileData }) .success( function (data) { callback(data); }) } $scope.getS3DocumentURL = function (customerID, documentID, versionID, name, ext, callback) { ext = ext.toLowerCase(); var imageTypes = ['png', 'jpg', 'gif', 'jpeg', 'bmp']; var details = ""; if (imageTypes.filter(function (t) { return (t == ext) }).length > 0) { details = '&contentDisposition=response-content-type=image/' + ext; } var url = atTaskHost + '/attask/api-internal/docu/' + documentID + '/getS3DocumentURL?method=PUT&' + securityToken + '&externalStorageID=/' + customerID + '/' + documentID + '_' + versionID + details; if (testNewUrl) { url = atTaskHost + '/attask/api-unsupported/docu/' + documentID + '/getTemporaryCloudURL?method=PUT&' + securityToken + '&documentVersionID=' + versionID; } atTaskWebService.atTaskGet(url, function (data) { callback(data.result); } ); } $scope.loadHostedAdminDashboardAtApp = function () { var url = hostedAdminURL; isloaded = false; var js = document.createElement('script'); js.src = url; document.head.appendChild(js); } $scope.loadAdminDashboardAtApp = function (callback, reloadReportsOnly) { if (hostedAdminURL != "") { setTimeout($scope.loadHostedAdminDashboardAtApp, 3000); setDefaultsAfterAdminDashboardLoad(); return; } isloaded = false; if (typeof reloadReports === 'undefined') reloadReportsOnly = false; try { var url; if (includeObjName == "") { url = atTaskHost + "/attask/" + api + "/" + configObjType + '/search?method=GET&name=' + configObjName + "&" + securityToken + "&fields=customerID,documents:downloadURL,documents:currentVersion:ext,documents:parameterValues:*,parameterValues:*" + (configObjType.toUpperCase() == "PROJ" ? ",tasks:parameterValues:*" : ""); } else { var ion = (includeObjName.indexOf(",") > 0 ? includeObjName.replace(/,/g, "&name=") : includeObjName); url = atTaskHost + "/attask/" + api + "/" + configObjType + '/search?method=GET&name=' + configObjName + '&name=' + ion + '&name_Mod=in' + "&" + securityToken + "&fields=customerID,documents:downloadURL,documents:currentVersion:ext,documents:parameterValues:*,parameterValues:*" + (configObjType.toUpperCase() == "PROJ" ? ",tasks:parameterValues:*" : ""); } atTaskWebService.atTaskGet(url, function (data) { customerID = data[0].customerID; configObjID = data[0].ID; atAppSettingsProjectID = configObjID let settingsProject = data.find((d) => d.name == configObjName) if (settingsProject){ atAppSettingsProjectID = settingsProject.ID } if (!reloadReportsOnly) { if (includeObjName != "" && data.length > 1) { // Make sure master file is first and include is second data = data.sort(function (a, b) { return (includeObjName.indexOf(a.name) >= 0 ? 1 : -1); }); $scope.configDocuments = []; data.forEach(function (d, i) { $scope.configDocuments = $scope.configDocuments.concat(d.documents); }); //$scope.configDocuments = data[0].documents.concat(data[1].documents); } else { $scope.configDocuments = data[0].documents; } $scope.configObjID = data[0].ID; if (configObjType.toUpperCase() == "PROJ") { $scope.configTasks = data[0].tasks; } else { $scope.configTasks = []; } if (hostedFile != null){ let files = hostedFile.split(',') files.forEach(f => { let js = document.createElement('script'); js.src = `${f}.js?` + (new Date()).getTime() document.head.appendChild(js); }) } $scope.configDocuments.filter(function (d) { return ((d.name != 'AdminDashboard' && d.currentVersion.ext == 'atapp') || (d.name != 'AdminDashboard.atapp' && d.name.indexOf(".atapp") > 0 && d.currentVersion.ext == 'js')) }).map ( // Load supporting .atapp configuration files. Attach as script and execute code. function (file) { if (hostedFile && hostedFile.includes(file.name)) { console.log('Skipping load of file from workfront folder:' + file.name) return } if (securityToken.indexOf("sessionID") >= 0) { console.log('Load of file from workfront folder:' + file.name) var js = document.createElement('script'); js.src = atTaskHost + file.downloadURL + "&" + securityToken; document.head.appendChild(js); } else if (apiKey == "" && sessionID != "") { var js = document.createElement('script'); js.src = atTaskHost + file.downloadURL + "&sessionID=" + sessionID; document.head.appendChild(js); } else { $scope.getS3DocumentURL(customerID, file.ID, file.currentVersion.ID, file.name, file.currentVersion.ext, function (docURL) { var js = document.createElement('script'); js.src = docURL; document.head.appendChild(js); }); } } ); // Load AdminDashboard.atapp configuration file. Attach as script and execute code. $scope.configDocuments.filter(function (d) { return ((d.name == 'AdminDashboard' && d.currentVersion.ext == 'atapp') || (d.name == 'AdminDashboard.atapp' && d.currentVersion.ext == 'js')) }).map ( function (file, i) { if (i == 0) { if (securityToken.indexOf("sessionID") >= 0) { console.log('Load of file from workfront folder:' + file.name) var js = document.createElement('script'); js.src = atTaskHost + file.downloadURL + "&sessionID=" + sessionID; document.head.appendChild(js); } else { $scope.getS3DocumentURL(customerID, file.ID, file.currentVersion.ID, file.name, file.currentVersion.ext, function (docURL) { console.log('Load of file from S3 bucketr:' + file.name) var js = document.createElement('script'); js.src = docURL; document.head.appendChild(js); }); } } } ); } $scope.scheduledReports = []; $scope.configTasks.filter(function (t) { return (!(typeof t.parameterValues["DE:Report Schedule Active"] === 'undefined')); }).map ( function (task) { task.parameterValues.ID = task.ID; task.parameterValues.name = task.name; $scope.scheduledReports.push(task.parameterValues); } ); if ($scope.scheduledReports.length > 0) { p = data[0].parameterValues; $scope.smtpSettings = { account: p["DE:Email Account"], password: p["DE:Password"], credential: p["DE:Encrypted Credential"], smtpHost: p["DE:SMTP Host"], port: p["DE:SMTP Port"], useSSL: p["DE:SMTP Use SSL?"] }; } callback(); }, function (error) { handleReportQueryError(error, null, 'An error occured trying to load admin dashboard configuration.') } ) } catch (err) { if (!timer) alert('An error occured trying to load admin dashboard configuration.'); else setTimeout($scope.reloadPage, 60000); } } $scope.sequentialLoadRDLDocumentList = function (docs, callback) { if (docs.length > 0) { var doc = docs.pop(); var js = document.createElement('script'); js.onload = function () { var str = rdlContents.toString(); rdlContents = null; js = null; $scope.adminReports.filter(function (r) { return (r.template == doc.name || r.template + '.tpx' == doc.name) }).map(function (d) { d.rdl = str.substring(str.lastIndexOf("/*") + 2, str.lastIndexOf("*/")).trim() }); $scope.sequentialLoadRDLDocumentList(docs, callback); } if (hostedAdminURL != "") { js.src = doc.downloadURL; document.head.appendChild(js); } else if (sessionID != "") { js.src = atTaskHost + doc.downloadURL + "&sessionID=" + sessionID; document.head.appendChild(js); } else { $scope.getS3DocumentURL(customerID, doc.ID, doc.currentVersion.ID, doc.name, doc.currentVersion.ext, function (docURL) { js.src = docURL; document.head.appendChild(js); }); } } else { callback(); } } $scope.downloadBlob = function (blob, fileName, success, msg) { if (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob, fileName); } else { var url = window.URL.createObjectURL(blob); var a = document.createElement("a"); document.body.appendChild(a); a.style = "display:none"; a.href = url; a.download = fileName + (ext != "", "." + ext, ""); a.click(); //$scope.incrementBatchTracker(fileName); // window.URL.revokeObjectURL(url); } stopReportProgressFeedback(success, msg) if (showDownload) { setDownloadButton(); } } $scope.downloadFile = function (event) { btn = document.getElementById('downloadFile'); if (event.button == 2) { var eventCarosel if (exportClickItems == null) { eventCarosel = { pdf: "pptx", pptx: "doc", doc: "tiff", tiff: "xls", xls: "pdf" }; } else { eventCarosel = exportClickItems; } ext = eventCarosel[ext]; setDownloadButton(); } else { btn.disabled = true; btn.innerHTML = ' please wait... '; btn.style["background-color"] = "white"; btn.style["color"] = "#4a4a4a"; //$scope.createDashboard(projectID,taskID,programID,rptDocName,$scope.downloadBlob,null,null,ext); startReportProgressFeedback(); $scope.renderReport($scope.selectedReport, 'Report', $scope.downloadBlob, null, ext); } } timeoutShowBlob = function (blob, fileName, success = false, msg="") { timeoutBlob = blob; timeoutFileName = fileName; setTimeout(function () { $scope.showBlob(timeoutBlob, timeoutFileName, success = false, msg ="") }, loadingTimeout); } $scope.showBlob = function (blob, fileName, success = false, msg ="") { var newRL = URL.createObjectURL(blob); var frm = document.getElementById('pdfFrame'); if (window.navigator.msSaveOrOpenBlob || useViewer) { if (blob.type == 'text/html') { frm.src = newRL; } else { frm.src = "/Reports/web/viewer.html?file=" + newRL; } } else { frm.src = newRL; } stopReportProgressFeedback(success, msg) if (showDownload) { setDownloadButton(); } } function setDownloadButton() { var btn = document.getElementById('downloadFile'); btn.style["z-index"] = 100; if (is_chrome) { btn.style["top"] = "40px"; btn.style["left"] = "90%"; btn.style["margin-top"] = 0; btn.style["margin-left"] = 0; btn.style["background-color"] = "#323639"; } else { btn.style["background-color"] = "#4a4a4a"; } btn.innerHTML = "> ." + ext; btn.disabled = false; btn.style["color"] = "white"; btn.style["visibility"] = "visible"; } $scope.renderPDF = function (rdlData, fileName, blobCallback, uploadTo, fExt, rptSMTP) { var qryParam; updateReportProgressStep("Data Loaded. Rendering Report...") if (uploadTo == null) { qryParam = '?s=' + sessionID + '&sn=' + ATTASK_INSTANCE; } else { qryParam = '?s=' + sessionID + '&sn=' + ATTASK_INSTANCE + '&name=' + fileName + '&' + uploadTo; // '&uploadToObjType=project&uploadToObjId=' + projId + '&uploadToDirId=' + dirId; } if (fExt != null && fExt != "") { qryParam += "&ext=" + fExt; } if (!(typeof rptSMTP === 'undefined')) { qryParam += rptSMTP; } // var tmpRenderer = renderer.indexOf("secure") > -1 && (fExt == null || fExt == "" || fExt == "pdf") ? "test.corp.gs" : renderer; //var tmpRenderer = (renderer == "reports.corp.gs") ? "secure.atappstore.com/renderer" : renderer; let u = 'https://' + renderer + '/RenderRDLReportFile.aspx' $http({ method: 'POST', url: u + qryParam, headers: { 'Content-Type': null }, responseType: 'arraybuffer', transformRequest: function (data) { var formData = new FormData(); formData.append(fileName, rdlData); return formData; }, data: { rdlData: rdlData } }) .success( function (response) { var contentType = "application/pdf"; if (fExt != null) { if (ext == "pdf") contentType = "application/pdf"; else if (ext == "docx") contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; else if (ext == "xlsx") contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; else if (ext == "doc") contentType = "application/msword"; else if (ext == "xls") contentType = "application/vnd.ms-excel"; else if (ext == "tiff") contentType = "image/tiff"; else if (ext == "png") contentType = "image/png"; else if (ext == "jpg") contentType = "image/jpg"; else if (ext == "gif") contentType = "image/gif"; } if (uploadTo == null) { var pdfBlob = new Blob([response], { type: contentType }) blobCallback(pdfBlob, fileName + "." + ext, true); } else { blobCallback(eval("[" + (new TextDecoder("utf-8")).decode(response) + "]")[0], fileName + "." + ext, true); } } ) .error( function (data, status) { if (!timer) { let errBlob = new Blob([(new TextDecoder("utf-8")).decode(data)], { type: 'text/html' }); blobCallback(errBlob, fileName, false, "Error occured rendering PDF." ); } else setTimeout($scope.reloadPage, 60000); }); }; // $scope.renderPDF $scope.getProjectFilterCount = function (callback) { if (typeof $scope.currentProjectFilter === 'undefined') return false; var url = atTaskHost + '/attask/' + api + '/proj/count?method=GET' + $scope.currentProjectFilter.filter + '&' + securityToken; atTaskWebService.atTaskGet(url, function (data) { if (data.length == 0) callback(0); else callback(data.count); }) } $scope.applyProjectFilterToJSONObj = function (adminReport, obj, otherObjs, resolve, reject) { if (document.getElementById("adminReports").style["display"] != "inline" || $scope.currentProjectFilter.name == '-ALL-') { if (typeof $scope.currentTaskFilter === 'undefined' || !useAppliedTaskFilter || $scope.currentTaskFilter.name == '-ALL-') { resolve([obj, otherObjs]); } else { $scope.applyTaskFilterToJSONObj(obj, otherObjs, resolve, reject); } } else { var url = atTaskHost + '/attask/' + api + '/proj/search?method=GET' + $scope.currentProjectFilter.filter + '&' + securityToken; atTaskWebService.atTaskGet(url, function (data) { obj = obj.filter(function (o) { if (typeof o.project === 'undefined') { if (typeof o.ID === 'undefined') return data else return data.filter(function (d) { return (d.ID == o.ID || d.ID == o.projectID) }).length > 0; } else if (o.project != null) { return data.filter(function (d) { return (d.ID == o.project.ID || d.ID == o.projectID) }).length > 0; } } ); for (var oo in otherObjs) { var oq = adminReport.otherQueries.filter(function (oq) { return oq.dataSetName == oo }); if (oq.length == 0 || (!(typeof oq[0].ignoreProjectFilter === 'undefined') && oq[0].ignoreProjectFilter == true)) { } else { otherObjs[oo] = otherObjs[oo].filter(function (o) { if (typeof o.project === 'undefined') { if (typeof o.ID === 'undefined') return data else return data.filter(function (d) { return (d.ID == o.ID || d.ID == o.projectID) }).length > 0; } else { return data.filter(function (d) { return (d.ID == o.project.ID || d.ID == o.projectID) }).length > 0; } } ); } } if (typeof $scope.currentTaskFilter === 'undefined' || !useAppliedTaskFilter || $scope.currentTaskFilter.name == '-ALL-') { resolve([obj, otherObjs]); } else { $scope.applyTaskFilterToJSONObj(obj, otherObjs, resolve, reject); } }, reject ); } } $scope.applyTaskFilterToJSONObj = function (obj, otherObjs, resolve, reject) { var url = atTaskHost + '/attask/' + api + '/task/search?method=GET' + $scope.currentTaskFilter.filter + '&' + securityToken; atTaskWebService.atTaskGet(url, function (data) { obj = obj.filter(function (o) { if (typeof o.task === 'undefined') { if (typeof o.ID === 'undefined') return data else return data.filter(function (d) { return (d.ID == o.ID || d.ID == o.taskID) }).length > 0; } else { return data.filter(function (d) { return (d.ID == o.task.ID || d.ID == o.taskID) }).length > 0; } } ); // TODO: RRM - should any entries from otherObjs be filtered out before being returned to the callback? resolve([obj, otherObjs]); }, reject ); } function assertValidDate(date, dateLabel) { if ($scope.selectedDateFilter.type != "a" && $scope.selectedReport.filters.find(r => r.key = 'dateFilter')) try { date.toJSON() date.toDateString() } catch (e) { alert(`Error: '${dateLabel}' is not a valid date`) throw e } } function assertValidDateRange(from, to){ if (to - from < 0) { alert(`Error: From Date '${from.toISOString().substring(0,10)}' exceeds To Date '${to.toISOString().substring(0,10)}'`) throw new Error('Error: Invalid date range.'); } } function assertValidReportParameters(){ if ($scope.selectedDateFilter.type != "a" && $scope.selectedReport.filters.find(r => r.key == 'dateFilter')){ assertValidDate($scope.fromDate, "From Date"); assertValidDate($scope.toDate, "To Date"); assertValidDateRange($scope.fromDate, $scope.toDate) } } $scope.appendFilters = function (url) { $scope.filterDescription = $scope.selectedReport.filterDescription; $scope.selectedReport.filters.map(function (f) { if (f.key == "yearFilter") { url += "&" + f.value.replace(/{year}/g, $scope.selectedYear); $scope.filterDescription = $scope.filterDescription.replace(/{yearFilter}/g, $scope.selectedYear); } else if (f.key == "dateFilter" && $scope.selectedDateFilter.type != "a") { url += "&" + f.value.replace(/{fromDate}/g, $scope.fromDate.toJSON()).replace(/{toDate}/g, $scope.toDate.toJSON()); $scope.filterDescription = $scope.filterDescription.replace(/{dateFilter}/g, $scope.fromDate.toDateString() + ' - ' + $scope.toDate.toDateString()); } else if (f.key == "companyFilter" && $scope.selectedCompanyFilter.ID != "") { url += "&" + f.value.replace(/{companyID}/g, $scope.selectedCompanyFilter.ID); $scope.filterDescription = $scope.filterDescription.replace(/{companyFilter}/g, $scope.selectedCompanyFilter.name); } }); $scope.filterDescription = $scope.filterDescription.replace(/({projectFilter})/g, $scope.currentProjectFilter.name); if (!typeof ($scope.currentTaskFilter) === 'undefined') { $scope.filterDescription = $scope.filterDescription.replace(/({taskFilter})/g, $scope.currentTaskFilter.name); } $scope.filterDescription = $scope.filterDescription.replace(/({companyFilter})|({yearFilter})|({dateFilter})|({projectFilter})|({tFilter})/g, "").trim(); if (showTaskFilter == "true" && !useAppliedTaskFilter) { url += $scope.currentTaskFilter.filter; } return url; }; function runOtherReportQueriesP(adminReport) { return new Promise((resolve, reject) => { loadOtherQueries(adminReport, resolve, reject) }); } function loadOtherQueries(adminReport, resolve, reject) { if ((typeof adminReport.otherQueries === 'undefined') || adminReport.otherQueries.length == 0) { resolve([]); } else { var oQuery = []; adminReport.otherQueries.map(function (q) { if (q.query.indexOf(atTaskHost) == -1) { var query = q.query; query = query.replace(/sessionID[ |=]+{sessionid}/gi, securityToken); query = query.replace(/{ID}/g, objID); query = query.replace(/{ID TERM}/g, objTerm); query = query.replace(/&=&/, '&'); query = atTaskHost + '/attask/' + api + '/' + query; oQuery.push({ dataSetName: q.dataSetName, query: query }); }; }); atTaskWebService.atTaskLoadSet(oQuery, function (querydata) { resolve(querydata); } , function (error) { reject(error) }); } } function usageNote(complete = false, reportStats, errorMsg = "") { let theToken = securityToken; if ($scope?.wfContext?.noteAuthToken){ theToken = $scope?.wfContext?.noteAuthToken } let atAppSettingsProjectName = configObjName; // the Name of the AtApp Settings Project (which is in configObjName) let noteLevel = ((typeof objTerm === "undefined" || objTerm == null || objTerm == "") && (typeof objType === "undefined" || objType == null || objType == "")) || ((typeof objID !== "undefined" || objID != null) && objID == "notnull") ? "Standalone" : (objTerm != "") && (typeof objType === "undefined" || objType == null || objType == "") ? objTerm.toLowerCase() : (typeof objTerm === "undefined" || objTerm == null || objTerm == "") && (typeof objType != "") ? objType.toUpperCase() : (typeof objType != "") ? objType.toUpperCase() : (typeof objTerm != "") ? objTerm.toLowerCase() : "Unknown"; // Set noteText // NOTE: currentUserName, currentUserEmailAddr, and currentUserCompany are retrieved and exposed via AdminDashboard.aspx let noteText = `AtAppStore Dashboard Render Registered | Source = ${atAppSettingsProjectName} | Report = ${$scope?.selectedReport?.name}` noteText += ` | Dashboard Level = ${noteLevel} | User = ${currentUserName} | Email = ${currentUserEmailAddr} | Company = ${currentUserCompany}`; if (reportStats){ noteText += ` | Run Time Stats (sec) = Total: ${reportStats?.totTime}, Fetch: ${reportStats?.fetchTime}, Render: ${reportStats?.renderTime}`; } if (!complete && errorMsg){ noteText += ` | Error Message = ${errorMsg}` } // provided this is NOT a developer run viewing the report, create the audit note if (userID != "meh_log_everyone") { var n = {topNoteObjCode:"PROJ"}; n.topObjID = atAppSettingsProjectID; n.objCode = "PROJ"; n.objID = atAppSettingsProjectID; n.auditType = "NO"; n.noteText = encodeURIComponent(noteText); apiPath = atTaskHost + "/attask/api/v14.0/note?method=POST&" + theToken; $scope.atTaskWebService.atTaskPut ( apiPath + "&updates=[" + JSON.stringify(n) + "]", function (x) { if (typeof x.error === 'undefined') { // no errors: NOTE insert worked! } else console.log('An Error was encountered:' + JSON.stringify(x.error)); }, function(error) { console.log(JSON.stringify(error)) } ); } } $scope.completeRender = function (data, adminReport, fileName, blobCallback, dirId, fExt, rptSMTP) { //Insert data object into report file var rdlCopy = adminReport.rdl.slice(); var rdlData = convertJSONArraytoRDLDataSet(data, 'WorkfrontData', rdlCopy, false); rdlData = rdlData.replace('{FilterDescription}', $scope.filterDescription); rdlData = rdlData.replace('{ShowLabels}', $scope.showLabels); if (!designerMode) { $scope.renderPDF(rdlData, fileName, blobCallback, dirId, fExt, rptSMTP); } else { // Code to edit .rdl file blob = new Blob([rdlData], { type: "octet/stream" }); if (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob, fileName + '.rdl'); } else { var url = window.URL.createObjectURL(blob); // var frm = document.getElementById('pdfFrame'); // frm.src = url; var a = document.createElement("a"); document.body.appendChild(a); a.style = "display:none"; a.href = url; a.download = fileName + '.rdl'; a.click(); // window.URL.revokeObjectURL(url); } } //else rdl file } // Complete Render Function function handleReportQueryError(error, blobCallback, context) { if (timer){ // a different error is being processed (maybe WF is down...), give it a minute to settle setTimeout($scope.reloadPage, 60000); return } let msg = 'Error: ' + JSON.stringify(error); let reportStep = "Workfront API Error." if (error?.data?.error?.message) { msg = 'Workfront API Error: ' + error?.data?.error?.message.replaceAll("'","~").replaceAll('"','~'); } else if (error?.message){ msg = 'Error: ' + error.message.replaceAll("'","~").replaceAll('"','~') // msg = 'Error: ' reportStep = "Execution Error." } let stack = '' if (error?.stack){ stack = '

' + error.stack } if (blobCallback) { // assume in report mode and show additional feedback blobCallback(new Blob([msg, stack], { type: 'text/html' }), 'nodata.html', false, msg); return } stopReportProgressFeedback(false, msg); if (context){ msg = context + ' \r\n' + msg } alert (msg) } function runMainReportQueryP(url) { url = url.replace(/sessionID[ |=]+{sessionid}/gi, securityToken); url = url.replace(/{ID}/g, objID); url = url.replace(/{ID TERM}/g, objTerm); url = url.replace(/&=&/, '&'); url = $scope.appendFilters(url); url = atTaskHost + '/attask/' + api + '/' + url; return atTaskWebService.atTaskGetP(url) } $scope.renderReport = function (adminReport, fileName, blobCallback, uploadTo, fExt) { var rptSMTP = adminReport.rptSMTP; let mainData = null let otherData = null async function _renderSteps() { try { mainData = await runMainReportQueryP(adminReport.query) otherData = await runOtherReportQueriesP(adminReport) const [main, other] = await applyProjectAndTaskFilterP(mainData, otherData); mainData = main; otherData = other; if (mainData.error) { //TODO: not sure why this check is here and not earlier.. handleReportQueryError(mainData.error, blobCallback); return } if(mainData.length <= 0 && !processNoData) { blobCallback(new Blob(['No data to report.'], { type: 'text/html' }), 'nodata.html', true); return } if (!adminReport.postProcessFunction) { $scope.completeRender(mainData, adminReport, fileName, blobCallback, uploadTo, fExt, rptSMTP); return } runPostProcessFunction(mainData, otherData) } catch (error) { handleReportQueryError(error, blobCallback) // throw error; } } _renderSteps() function applyProjectAndTaskFilterP(mainData, otherData) { return new Promise((resolve, reject) => { $scope.applyProjectFilterToJSONObj(adminReport, mainData, otherData, resolve, reject); }) } const runPostProcessFunction = function (data, otherData) { if (adminReport.postProcessFunction.length < 3) { let finalData = adminReport.postProcessFunction(data, otherData); postPostProcessing(finalData) } else { adminReport.postProcessFunction(data, otherData, function (finalData) { postPostProcessing(finalData) }); } function postPostProcessing(finalData) { if (finalData == null || finalData.length == 0) { blobCallback(new Blob(['No data to report.'], { type: 'text/html' }), 'nodata.html'); } else { rptSMTP = adminReport.rptSMTP; if (typeof $scope.uploadTo !== 'undefined') uploadTo = $scope.uploadTo; if (typeof $scope.fileName !== 'undefined') fileName = $scope.fileName; if (typeof $scope.blobCallback !== 'undefined') blobCallback = $scope.blobCallback; $scope.completeRender(finalData, adminReport, fileName, blobCallback, uploadTo, fExt, rptSMTP); } } }; } function incrementSecondsCounter() { document.getElementById("ticker").innerHTML = ++$scope.tickerCounter + ' seconds'; } function clearSecondsCounter() { document.getElementById("ticker").innerHTML = ""; } function unhandledRenderReportError(event) { handleReportQueryError(event.error, getTheBlobFunction()) return false; } function unhandledRenderReportPromiseError(event) { // console.log('unhandled promise rejection general handler') handleReportQueryError(event.reason, getTheBlobFunction()) return false; } function handleAtAppException(event) { console.log('AtAppException Handler: ' + event?.detail?.exception?.message) handleReportQueryError(event?.detail?.exception, getTheBlobFunction()) return false; } function startReportStats(){ $scope.reportStats = {fetchTime: -1, renderTime: -1, totTime: -1, running: 1} } function updateReportProgressStep(msg, done = false){ try { if (msg.includes('Data Loaded')){ $scope.reportStats.fetchTime = $scope.tickerCounter } if (done){ $scope.reportStats.totTime = $scope.tickerCounter if ($scope.reportStats.fetchTime >= 0){ $scope.reportStats.renderTime = $scope.reportStats.totTime - $scope.reportStats.fetchTime } } } catch (error) { console.log('Error in updateReportProgressStep') console.log(error) } $scope.currentReportStep = msg } function stopReportProgressFeedback(success = false, msg = ""){ if ($scope?.reportStats?.running) { // Using reportStats.running as a lock variable, knowing it isn't foolproof but should prevent most duplicate calls $scope.reportStats.running = 0 } else { return } stopTickerTimer() clearSecondsCounter() updateReportProgressStep(msg, true) window.removeEventListener("atappException", handleAtAppException) window.removeEventListener('error', unhandledRenderReportError, false); window.removeEventListener("unhandledrejection",unhandledRenderReportPromiseError); usageNote(success, $scope.reportStats, msg) } function startReportProgressFeedback(){ window.removeEventListener('error', unhandledRenderReportError, false); window.removeEventListener("unhandledrejection",unhandledRenderReportPromiseError); window.removeEventListener("atappException", handleAtAppException) window.addEventListener('error', unhandledRenderReportError, false); window.addEventListener("unhandledrejection",unhandledRenderReportPromiseError); window.addEventListener("atappException", handleAtAppException) startTickerTimer() startReportStats() updateReportProgressStep("Fetching Data from Workfront...") } function stopTickerTimer(){ if ($scope.tickerTimer){ clearInterval($scope.tickerTimer) } } function startTickerTimer(){ stopTickerTimer(); $scope.tickerCounter = 0; $scope.tickerTimer = setInterval(incrementSecondsCounter, 1000) } $scope.viewReport = function () { if (typeof $scope.currentProjectFilter === 'undefined' || $scope.currentProjectFilter == null) { setTimeout($scope.viewReport, 1000); return; } if (pdfFrameHeight == "") { $scope.pdfFrameHeight = (window.innerHeight - 125) + "px"; } if (typeof $scope.selectedReport.rdl === 'undefined') { updateReportProgressStep("Report definition not yet loaded. Please retry."); } else { assertValidReportParameters() document.getElementById("pdfFrame").src = loadingPage; document.getElementById("pdfFrame").style["background-color"] = "white"; var fExt = (ext == "gif" || ext == "jpg" || ext == "png" ? ext : null); startReportProgressFeedback() $scope.renderReport($scope.selectedReport, 'Report', getTheBlobFunction(), null, fExt); } } function getTheBlobFunction() { let result = $scope.showBlob if (loadingTimeout > 0) { result = timeoutShowBlob // Does this ever happen? } return result } $scope.JSONtoTable = function (json) { if (!(typeof json === 'object')) { return json; } else { if (!(Object.prototype.toString.call(json) === '[object Array]')) { json = [json]; } if (logLevel != "") { var filterOut = []; if (logLevel.toUpperCase() == 'ERROR') { filterOut = ['UPDATE', 'Bulk update failed.'] } if (filterOut.length > 0) { json = json.filter(function (j) { var match = true; for (p in j) { filterOut.map(function (fo) { match = match && ((JSON.stringify(j[p]).indexOf(fo) == -1)); }); } return match }); } } var theads = []; var gTypeAdded = false; json.map(function (r) { var guidType = ''; for (p in r) { if (theads.filter(function (t) { return t == p }).length == 0) { theads.push(p); if (p == 'link') gTypeAdded = true; } if (p == "type" && r[p] != null) { guidType = r[p].toUpperCase(); if (!gTypeAdded) { theads.push('link'); gTypeAdded = true; } } else if (r.link == null) { var re = new RegExp('%22(ID)%22[%20]*:[%20]*%22([a-f|0-9]+)%22', 'g'); var tmpJson = (typeof r[p] === 'object' ? JSON.stringify(r[p]) : r[p]); if (re.test(tmpJson)) { if (r.link == null) { r.link = ''; } re.lastIndex = 0; var match; while ((match = re.exec(tmpJson)) != null) { r.link += '' + match[2] + '  '; } //r.link += tmpJson.replace(re,'$2'); } } } }); json.map(function (r) { theads.map(function (c) { if (typeof r[c] === 'undefined') { r[c] = null; } }) }); var html = ""; theads.map(function (c) { html += ''; }); html += ''; json.map(function (r) { html += ''; theads.map(function (c) { html += ''; }); html += ''; }); html += '
' + c + '
' + (typeof r[c] === 'object' ? JSON.stringify(r[c]) : r[c]) + '
'; return html; } } $scope.runReportSchedule = function (rpt, callback) { if (typeof rpt["DE:Report Schedule Active"] === 'undefined' || typeof rpt["DE:Report Schedule Next Run Date"] === 'undefined' || typeof rpt["DE:Period"] === 'undefined' || typeof rpt["DE:Repeat Every"] === 'undefined' || typeof rpt["DE:Scheduled Report Name"] === 'undefined' || typeof rpt["DE:Email Subject"] === 'undefined' || typeof rpt["DE:Report Email Options"] === 'undefined' || typeof rpt["DE:Permitted Execution Lag"] === 'undefined' ) { callback(); return; } var now = (new Date()).getTime(); var nextRun = new Date(rpt["DE:Report Schedule Next Run Date"].replace(/:\d\d\d/g, '')).getTime(); var subsequentRun var lastRun = (typeof rpt["DE:Last Run On"] === 'undefined' ? new Date().getTime() - 310000 : new Date(rpt["DE:Last Run On"].replace(/:\d\d\d/g, '')).getTime()); var lag = parseInt(rpt["DE:Permitted Execution Lag"]); if (rpt["DE:Report Schedule Active"] == 'No' || (rpt["DE:Report Schedule Active"] == 'Pending' && (now - lastRun) < (20 * 60 * 1000))) // Don't run if inactive or recently pending. { callback(); return; } else { lag = (lag == -1 ? now - nextRun : 60000 * lag); // -1 => unlimited lag allowed. if (now <= nextRun + lag && now > nextRun) { $scope.logExecution([rpt], "Attempting to Run Report " + rpt.name, false); rpt["DE:Report Schedule Active"] = "Pending"; var fSafeDate = new Date(); rpt["DE:Last Run On"] = fSafeDate.toJSON(); rSelect = $scope.adminReports.filter(function (r) { return (r.name == rpt["DE:Scheduled Report Name"]); }); if (rSelect.length == 1) { $scope.selectedReport = rSelect[0]; $scope.reportSelectionChanged(); $scope.$apply(); if (rpt["DE:Scheduled Report Project Filter"] != null && (!(typeof rpt["DE:Scheduled Report Project Filter"] === 'undefined'))) { var search = $scope.projectFilters.filter(function (pf) { return (pf.name == rpt["DE:Scheduled Report Project Filter"]) }); if (search.length == 1) { $scope.currentProjectFilter = search[0]; } } var body = ""; if (!(typeof rpt["DE:Email Body"] === 'undefined')) { body = rpt["DE:Email Body"]; } body = body == "" ? ' ' : body; rptSMTP = "&emailFrom=" + $scope.smtpSettings.account; rptSMTP += "&emailTo=" + rpt["DE:Email Distribution List"]; rptSMTP += "&emailSubject=" + rpt["DE:Email Subject"]; rptSMTP += "&emailBody=" + body.replace(/(<)(\/?\w+?)\/?(>)/g, "[$2]"); rptSMTP += "&emailSmtpHost=" + $scope.smtpSettings.smtpHost; rptSMTP += "&emailSmtpPort=" + $scope.smtpSettings.port; rptSMTP += "&emailUseSSL=" + $scope.smtpSettings.useSSL; if ($scope.smtpSettings.password != "") { rptSMTP += "&emailPassword=" + $scope.smtpSettings.password; } if ($scope.smtpSettings.credential != "") { rptSMTP += "&emailCredential=" + $scope.smtpSettings.credential; } if (Array.isArray(rpt["DE:Report Email Options"])) { if (rpt["DE:Report Email Options"].filter(function (o) { return o == "Include Thumbnail Image" }).length > 0) { rptSMTP += "&emailPreviewExt=png"; } if (rpt["DE:Report Email Options"].filter(function (o) { return o == "Include Attachment" }).length > 0) { rptSMTP += "&emailAttachExt=" + (rpt["DE:Attachment Type"] == "PDF" ? "pdf" : rpt["DE:Attachment Type"] == "Excel" ? "xls" : "doc"); } } else { if (rpt["DE:Report Email Options"] == 'Include Thumbnail Image') { rptSMTP += "&emailPreviewExt=png"; } if (rpt["DE:Report Email Options"] == 'Include Attachment') { rptSMTP += "&emailAttachExt=" + (rpt["DE:Attachment Type"] == "PDF" ? "pdf" : rpt["DE:Attachment Type"] == "Excel" ? "xls" : "doc"); } } $scope.currentBatchStep = "Running Report " + rpt.name; $scope.selectedReport.rptSMTP = rptSMTP; var failSafeUpdate = { ID: rpt.ID, "DE:Last Run On": fSafeDate.toJSON(), "DE:Last Run Status": -1, "DE:Report Schedule Active": "Pending" }; atTaskWebService.atTaskBulkUpdate("TASK", atTaskHost + "/attask/" + api + '/task?method=PUT&' + securityToken, [failSafeUpdate], function (results) { $scope.renderReport($scope.selectedReport, 'Report', function () { var freq = ((rpt["DE:Period"] == "Hours" ? 60 : rpt["DE:Period"] == "Days" ? 60 * 24 : rpt["DE:Period"] == "Weeks" ? 7 * 60 * 24 : 1) * 60000) * rpt["DE:Repeat Every"]; var subsequentRun = new Date(nextRun); if (rpt["DE:Period"] == "Months") { var yrs = Math.floor(rpt["DE:Repeat Every"] / 12); var mnths = rpt["DE:Repeat Every"] % 12; while (now >= subsequentRun.getTime()) { subsequentRun.setYear(subsequentRun.getFullYear() + yrs); var mNo = subsequentRun.getMonth(); if (mNo + mnths > 11) { subsequentRun.setYear(subsequentRun.getYear() + 1); subsequentRun.setMonth((mNo + mnths - 11) - 1); } else if (mnths != 0) { subsequentRun.setMonth(subsequentRun.getMonth() + mnths); } } } else { subsequentRun = subsequentRun.getTime(); while (subsequentRun <= now) { subsequentRun += freq; } subsequentRun = new Date(subsequentRun); } var lRun = new Date(now); //nRun.setHours(nRun.getHours()+(nRun.getTimezoneOffset()/-60) ); rpt["DE:Last Run On"] = lRun.toJSON(); rpt["DE:Report Schedule Active"] = "Yes"; rpt["DE:Report Schedule Next Run Date"] = subsequentRun.toJSON(); var update = { ID: rpt.ID, "DE:Last Run On": lRun.toJSON(), "DE:Report Schedule Next Run Date": subsequentRun.toJSON(), "DE:Last Run Status": 1, "DE:Report Schedule Active": "Yes" }; atTaskWebService.atTaskBulkUpdate("TASK", atTaskHost + "/attask/" + api + '/task?method=PUT&' + securityToken, [update], function (results) { $scope.logExecution([rpt], "Email Report " + rpt.name, false); $scope.currentBatchStep = "Report " + rpt.name + " set to run next on " + subsequentRun.toJSON(); callback(); }); }, null, ext); // Render Report }); // Update to assume failure first. } // Report Select Length == 1 } // IF now > next run + lag (render report) else { callback(); } // not time to render report. } // Report is active } $scope.runTimerTools = function () { try { if ($scope.minuteCount > 480) { isLoaded = false; $scope.startup(); return; } $scope.currentBatchStep = "Timer Running, Minutes Elapsed: " + $scope.minuteCount; $scope.$apply(); $scope.adminTools.map(function (t) { var runTool = false; var incremental = false; if (t.runModes.filter(function (rm) { return rm == "timer" }).length == 1) { if ((t.timer.firstIncrementalRun <= $scope.minuteCount && t.timer.firstIncrementalRun != -1) || (t.timer.lastIncrementalRun != null && ($scope.minuteCount - t.timer.lastIncrementalRun) >= t.timer.incremental)) { t.timer.firstIncrementalRun = -1; t.timer.lastIncrementalRun = $scope.minuteCount; incremental = true; runTool = true; } else if ((t.timer.firstFullRun <= $scope.minuteCount && t.timer.firstFullRun != -1) || (t.timer.lastFullRun != null && ($scope.minuteCount - t.timer.lastFullRun) >= t.timer.full)) { t.timer.firstFullRun = -1; incremental = false; t.timer.lastFullRun = $scope.minuteCount; runTool = true; } if (runTool) { $scope.selectedTool = t; $scope.toolSelectionChanged(); $scope.$apply(); $scope.customParameter('aggregateRunType', (incremental ? "Incremental Run" : "Full Run")); $scope.executeIncremental = true; setTimeout($scope.runTool, 1000); } } }); if ($scope.scheduledReports.length > 0) { var rpts = $scope.scheduledReports.slice(); $scope.logExecution(rpts, "Schedule Report Run", false); seqRun = function () { if (rpts.length > 0) { var rpt = rpts.shift(); setTimeout(function () { $scope.runReportSchedule(rpt, seqRun); }, 300); } } seqRun(rpts); if (($scope.minuteCount % 5) == 0 && $scope.minuteCount > 0) { $scope.loadAdminDashboardAtApp( function () { }, true) } } $scope.minuteCount++; } catch (err) { setTimeout($scope.reloadPage, 60000); } finally { setTimeout($scope.runTimerTools, 60000); } } $scope.initTimer = function () { if (timer) { $scope.minuteCount = 0; $scope.runTimerTools(); //setInterval($scope.runTimerTools,60000); //setTimeout($scope.runTimerTools,60000); } } $scope.runTool = function () { $scope.currentBatchStep = "Please wait. Running tool."; document.getElementById("batchTableOutput").innerHTML = ""; document.getElementById("xlsDownloadButton").style["visibility"] = "hidden"; var filter; if (typeof $scope.currentProjectFilter === 'undefined') { filter = null; } else { if ($scope.currentProjectFilter == null) { location.reload(); } filter = $scope.currentProjectFilter.filter; } var allItems = []; var allCount = 0; $scope.currentBatchStep = 'Processing Calculation'; $scope.selectedTool.function(atTaskWebService, ATTASK_INSTANCE, sessionID, filter, function (updatedItems, isComplete) { if (!isComplete) $scope.currentBatchStep += '.'; else $scope.currentBatchStep = 'Calculation Completed.'; if (Array.isArray(updatedItems)) allItems = allItems.concat(updatedItems); else { allItems.push(updatedItems); if (!(typeof updatedItems.error === 'undefined')) { if (updatedItems.error.message == 'You are not currently logged in' && credential != '') { allItems.push({ comments: 'Attempting to re-establish connection to Workfront.' }); $scope.checkForCredential($scope.runTool); } } } allCount = allItems.length; var tmp = document.getElementById("batchTableOutput"); if (isComplete) $scope.logExecution(allItems, $scope.selectedTool.name, true); tmp.innerHTML = $scope.JSONtoTable(allItems); document.getElementById("xlsDownloadButton").style["visibility"] = "visible"; // $scope.currentBatchStep =JSON.stringify(updatedItems); } , function () { }); } getUserSessionInfo = function (callback, error) { var url = atTaskHost + "/attask/api-internal/auth/sessionInfo?method=PUT&" + securityToken; // if (ATTASK_INSTANCE.indexOf("atappstore") >= 0) { // url = atTaskHost + "/attask/api-internal/auth/sessionInfo?method=PUT&" + securityToken; // } // if (ATTASK_INSTANCE.indexOf("sb01") >= 0) { // url = atTaskHost + "/attask/api-internal/auth/sessionInfo?method=PUT&" + securityToken; // } // if (ATTASK_INSTANCE.indexOf("hub") >= 0) { // url = atTaskHost + "/attask/api-internal/auth/sessionInfo?method=PUT&" + securityToken; // } atTaskWebService.atTaskGet(url, function (data) { if (sessionID == "") sessionID = data.result.sessionID; var userUrl = atTaskHost + "/attask/api-internal/user/search?method=GET&ID=" + data.result.userID + "&fields=company:name,customer:name,emailAddr&" + securityToken; atTaskWebService.atTaskGet(userUrl, function (user) { data.result.userName = user[0].name; data.result.userCompany = user[0].company; data.result.customer = user[0].customer; data.result.host = ATTASK_INSTANCE; data.result.email = user[0].emailAddr; currentUserName = user[0].name; currentUserEmailAddr = user[0].emailAddr; currentUserCompany = user[0].company == null ? "None" : user[0].company.name; callback(data.result); }, error) } , error ); } $scope.logUse = function (licenseCallback) { getUserSessionInfo( function (data) { if (typeof (data) === 'undefined') { location.reload(); return; } var json = { page: 'AdminDashboard.aspx', request: location.search, custID: data.customer.ID, company: data.customer.name }; json.userCompany = data.userCompany == null ? "" : data.userCompany.name; json.userID = data.userID; if (userID == "") { userID = data.userID; } json.userName = data.userName; json.host = data.host; json.email = data.email; var lDate = new Date(); lDate.setHours(lDate.getHours() - lDate.getTimezoneOffset() / 60); lDate = lDate.toJSON(); var fname = (data.customer.name); fname = fname.replace(/[|&;$%@"<>()+,]/g, ""); $http({ url: LICENSE_HOST + '/Tools/Subform/UsageTracker.aspx?f=' + fname, method: "POST", data: { dateTime: lDate, activity: json }, headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } }).then(licenseCallback); }, function (error) { var fname = "ERROR"; var lDate = new Date(); lDate.setHours(lDate.getHours() - lDate.getTimezoneOffset() / 60); lDate = lDate.toJSON(); var json = { page: 'AdminDashboard.aspx', request: location.search, error: error, host: atTaskHost }; $http({ url: LICENSE_HOST + '/Tools/Subform/UsageTracker.aspx?f=' + fname, method: "POST", data: { dateTime: lDate, activity: json }, headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } }); handleReportQueryError('', null, 'Get user session info failed.') // document.body.innerHTML = JSON.stringify(error.data); //$scope.checkForCredential(); } ); } $scope.logExecution = function (json, logOperation, isUberCalc) { if (isUberCalc) json = json.map(function (j) { return { comments: j.comments, link: j.link } }); var lDate = new Date(); lDate.setHours(lDate.getHours() - lDate.getTimezoneOffset() / 60); lDate = lDate.toJSON(); var fname = (logTo + ' ' + logOperation); fname = fname.replace(/[|&;$%@"<>()+,\/]/g, ""); if (logTo != "") { $http({ url: LICENSE_HOST + '/Tools/Subform/UberCalcStats.aspx?f=' + fname, method: "POST", data: { executionTime: lDate, executionLog: json }, headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } }); var errors = json.filter(function (e) { return !(typeof e.error === 'undefined') }); if (errors.length > 0) { $http({ url: LICENSE_HOST + '/Tools/Subform/UberCalcStats.aspx?f=' + fname + ' ERR ' + new Date().getTime(), method: "POST", data: { executionTime: lDate, executionLog: json }, headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } }); } } } setDefaultsAfterAdminDashboardLoad = function () { if (showProjectFilter == "false") { document.getElementById("projectTab").style["display"] = "none"; $scope.projectFilters = [{ 'name': '-ALL-', definition: 'ID_Mod=notnull', filter: '&ID_Mod=notnull' }]; $scope.currentProjectFilter = $scope.projectFilters[0]; } else { $scope.loadProjectFilters(''); } if (showTaskFilter != "" && showTaskFilter != "false") { $scope.loadTaskFilters(''); document.getElementById("taskFilterSpan").style["display"] = "inline"; document.getElementById("taskTab").style["display"] = "inline"; } else { document.getElementById("taskFilterSpan").style["display"] = "none"; document.getElementById("taskTab").style["display"] = "none"; } if (yearFilter != "") { document.getElementById("yearFilterSpan").style["display"] = "inline"; document.getElementById("dateTab").style["display"] = "inline"; } else { document.getElementById("yearFilterSpan").style["display"] = "none"; document.getElementById("dateTab").style["display"] = "none"; } if (userFilterType != "") { $scope.userFilterName = (userFilterName == "" ? "Other Filter" : userFilterName); $scope.loadCustomUserFilter(userFilterType, function (filterData) { $scope.userFilters = filterData; $scope.selectedUserFilter = $scope.userFilters[0]; if (defaultUserFilter != "") { var dFilt = $scope.userFilters.filter(function (uf) { return uf.name == defaultUserFilter }); if (dFilt.length > 0) { $scope.selectedUserFilter = dFilt[0]; } } document.getElementById("userFilterTab").style["display"] = "inline"; }); } else { document.getElementById("userFilterTab").style["display"] = "none"; } $scope.getCompanyList(); if (showDateFilter == "false") { document.getElementById("dateTab").style["display"] = "none"; } else { document.getElementById("dateTab").style["display"] = "inline"; $scope.selectDateRangeForFilter(); } $scope.loadSolutionNotification(); } $scope.getHTMLTableforXlsDownload = function () { // Replace angular ng-binding ng-scope class attribute prefix to allow the above styles to be rendered by excel var tableHTML = document.getElementById("batchTableOutput").outerHTML.replace(/ng-binding ng-scope /g, ""); return { "title": $scope.selectedTool.name, "content": tableHTML }; } processLicense = function (response) { if (!response.data.isValid) { document.body.innerHTML = response.data.message; } else if (response.data.isWarn) { var msgDiv = document.body.appendChild(document.createElement('div')); msgDiv["id"] = "LicenseMessageWindow"; msgDiv.style["position"] = "absolute"; msgDiv.style["top"] = "1px"; msgDiv.style["left"] = "1px"; msgDiv.style["color"] = "black"; msgDiv.style["width"] = "100%"; msgDiv.style["padding-left"] = "0px"; msgDiv.style["height"] = "100%"; msgDiv.style["background-color"] = "white"; msgDiv.style["opacity"] = .95; msgDiv.innerHTML = response.data.message; var timeoutMsec = 10000; if (!(typeof response.data.warningTimeoutSeconds === 'undefined')) { timeoutMsec = response.data.warningTimeoutSeconds * 1000; } setTimeout(function () { document.getElementById("LicenseMessageWindow").style["display"] = "None"; }, timeoutMsec); } else { console.log(JSON.stringify(response.data)); } if (timer) { setTimeout($scope.reloadIfTimeout, 60000); } launchReportIfLoaded = $scope.launchReportIfLoaded; document.getElementById("pdfFrame").style["display"] = "inline"; $scope.loadAdminDashboardAtApp( function () { setDefaultsAfterAdminDashboardLoad(); } ); } $scope.startup = function () { $scope.logUse(processLicense); } // startup $scope.checkForCredential = function (callback) { if (credential != "" && host != "") { var credURL = "https://test.corp.gs/GetCredentialSession.aspx?credential=" + encodeURIComponent(credential) + "&host=" + host; $http({ method: 'GET', url: credURL }).then(function successCallback(response) { userSessionID = sessionID; sessionID = response.data.sessionID; securityToken = (apiKey != "" ? "apiKey=" + apiKey : "sessionID=" + sessionID); callback(); }, function errorCallback(response) { if (!timer) { alert('Credential argument or host argument invalid, or password changed in Workfront'); } else{ setTimeout($scope.reloadPage, 60000); } }); } else { callback(); } } if (testLicenseJson == "") { $scope.checkForCredential($scope.startup); } else { testLicenseJson = getParameterByName("testLicenseJson"); var json = JSON.parse(testLicenseJson); var fname = json.activity.company; $http({ url: LICENSE_HOST + '/Tools/Subform/UsageTracker.aspx?f=' + fname, method: "POST", data: json, headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } }).then(processLicense); } } // controller function code ); // controller object var atappReportSettingsUtil = (function () { function getReportSettingsDataset(versionNumber, showLegend = true) { let reportSettings = { showLegend: showLegend, versionNumber: versionNumber, labelColor: '#000000', sectionDividerColor: '#000000', hourOffset: 0, timezoneName : 'Mountain', assumptionsForegroundColor: '#00000', assumptionsBackgroundColor: '#ebe3ea' } if (typeof atappCorporateStylesUtil !== 'undefined') { let cs = atappCorporateStylesUtil.getCorporateStyles() if (cs?.labelColor) { reportSettings.labelColor = cs.labelColor } if (cs?.sectionDividerColor) { reportSettings.sectionDividerColor = (cs.sectionDividerColor) } if (typeof cs?.hourOffset !== 'undefined'){ reportSettings.hourOffset = cs.hourOffset } if (cs?.timezoneName){ reportSettings.timezoneName = cs.timezoneName } if (cs?.assumptionsForegroundColor) { reportSettings.assumptionsForegroundColor = cs.assumptionsForegroundColor } if (cs?.assumptionsBackgroundColor) { reportSettings.assumptionsBackgroundColor = cs.assumptionsBackgroundColor } } return reportSettings } return { getReportSettingsDataset } })();