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 ? '' : '';
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 += '' + c + ' | ';
});
html += '';
json.map(function (r) {
html += '';
theads.map(function (c) {
html += '' + (typeof r[c] === 'object' ? JSON.stringify(r[c]) : r[c]) + ' | ';
});
html += '
';
});
html += '
';
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
}
})();