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 testNewUrl = true; var ATTASK_INSTANCE = 'secure.attasksandbox.com'; var loadingPage = "https://test.corp.gs/loading.html"; 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 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; 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 ( 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 ); } var app=angular.module('app', ['ngSanitize', 'ui.select','atTaskServiceModule']); // 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.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]; } } } } $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.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++; } }); } 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','') + r.template + '.tpx' $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.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; 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 = []; } $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 (securityToken.indexOf("sessionID") >= 0) { 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) { 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); }); } } } ); } $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 () { if (timer == null) alert('An error occured trying to load admin dashboard configuration.'); else setTimeout($scope.reloadPage,60000); } ) } catch (err) { if (timer == null) 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) { 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); } 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); $scope.renderReport($scope.selectedReport,'Report',$scope.downloadBlob,null,ext); } } timeoutShowBlob = function (blob,fileName) { timeoutBlob = blob; timeoutFileName = fileName; setTimeout(function () { $scope.showBlob(timeoutBlob,timeoutFileName) },loadingTimeout); } $scope.showBlob = function (blob,fileName) { // setTimeout( function () {window.navigator.msSaveOrOpenBlob(blob,fileName);},500); 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; /* if (ext != 'pdf' && ext != "") setTimeout(function () { var newRL = URL.createObjectURL(new Blob(['Report Generation Complete. ' + ext + ' file downloaded by browser.'],{type : 'text/html'})); frm.src = newRL; },2000) */ 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; $scope.currentReportStep = "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; $http({ method: 'POST', url: 'https://' + renderer + '/RenderRDLReportFile.aspx' + 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); } else { blobCallback( eval("[" + (new TextDecoder("utf-8")).decode(response) + "]")[0] , fileName + "." + ext) ; } $scope.currentReportStep = ""; } ) .error( function(data,status) { if (typeof timer === 'undefined' || timer == null || timer == "") { var frm = document.getElementById('pdfFrame'); var newRL = URL.createObjectURL(new Blob([(new TextDecoder("utf-8")).decode(data) ],{type : 'text/html'})); frm.src = newRL; $scope.currentReportStep = "Aborted. 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, callback) { if (document.getElementById("adminReports").style["display"] != "inline" || $scope.currentProjectFilter.name == '-ALL-') { if (typeof $scope.currentTaskFilter === 'undefined' || !useAppliedTaskFilter || $scope.currentTaskFilter.name == '-ALL-') { callback(obj,otherObjs); } else { $scope.applyTaskFilterToJSONObj(obj, otherObjs, callback); } } 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) { callback(obj,otherObjs); } else { $scope.applyTaskFilterToJSONObj(obj, otherObjs, callback); } }, function () { if (timer == null) alert ('Error Retrieving project filter'); else setTimeout($scope.reloadPage,60000); }); } } $scope.applyTaskFilterToJSONObj = function(obj, otherObjs, callback) { 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; } } ); /* for (var oo in otherObjs) { otherObjs[oo] = otherObjs[oo].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; } } ); }; */ callback(obj,otherObjs); }, function () { if (timer == null) alert ('Error Retrieving task filter'); else setTimeout($scope.reloadPage,60000); }); } $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; }; $scope.loadOtherQueries = function(adminReport,callback) { if ( (typeof adminReport.otherQueries === 'undefined') || adminReport.otherQueries.length == 0 ) { callback([]); } 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) { callback(querydata); }); } } $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 $scope.renderReport = function(adminReport,fileName,blobCallback,uploadTo,fExt) { var url = adminReport.query; 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 ; var rptSMTP = adminReport.rptSMTP; atTaskWebService.atTaskGet(url, function (rawData) { $scope.loadOtherQueries(adminReport,function(otherRawData) { $scope.applyProjectFilterToJSONObj(adminReport, rawData, otherRawData, function (data,otherData) { if (!(typeof data.error === 'undefined')) { if (timer == null) alert('Error With Workfront Query. msg:' + JSON.stringify(data.error)); else setTimeout($scope.reloadPage,60000); } else if (data.length > 0 || processNoData) { if (!(typeof adminReport.postProcessFunction === 'undefined') && adminReport.postProcessFunction != null) { if (adminReport.postProcessFunction.length < 3) { var finalData = adminReport.postProcessFunction(data,otherData); if (finalData == null || finalData.length == 0) { blobCallback(new Blob(['No data to report.'],{type : 'text/html'}),'nodata.html'); } else { if (typeof $scope.uploadTo !== 'undefined') uploadTo = $scope.uploadTo; if (typeof $scope.fileName !== 'undefined') fileName = $scope.fileName; if (typeof $scope.blobCallback !== 'undefined') blobCallback = $scope.blobCallback; rptSMTP = adminReport.rptSMTP; $scope.completeRender(finalData, adminReport,fileName,blobCallback,uploadTo,fExt,rptSMTP); } } else { adminReport.postProcessFunction(data,otherData, function(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); } }); } } else { $scope.completeRender(data, adminReport,fileName,blobCallback,uploadTo,fExt,rptSMTP); } } else { blobCallback(new Blob(['No data to report.'],{type : 'text/html'}),'nodata.html'); } })}) } // success , function (error) { if (timer == null) alert('Error With Workfront Query. msg:' + JSON.stringify(error) ); else setTimeout($scope.reloadPage,60000); } ); } $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') { $scope.currentReportStep = "report definition not yet loaded. Please retry."; } else { $scope.currentReportStep = "Fetching Data from Workfront..."; document.getElementById("pdfFrame").src = loadingPage; document.getElementById("pdfFrame").style["background-color"] ="white"; var fExt = (ext == "gif" || ext == "jpg" || ext == "png" ? ext : null); if (loadingTimeout > 0) { $scope.renderReport($scope.selectedReport,'Report',timeoutShowBlob,null,fExt); } else { $scope.renderReport($scope.selectedReport,'Report',$scope.showBlob,null,fExt); } } } $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.count; 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' } }); 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.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 != null) { 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 == null) 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