Controllers.prototype.downloads = (function(){ 'use strict'; var tmpl = new Template(), apiObj = { 'reportQueue': null, 'scheduledReportsList': null }; function Downloads(core, target, data, returnCB) { var eleDL = getElementFromString(tmpl.indexDL), eleSched = getElementFromString(tmpl.indexSched), note = eleDL.querySelector('.note'), tableDL, tableSched, timerID; this.exit = exit; checkQueue(initTable); target.appendChild(eleDL); target.appendChild(eleSched); if(returnCB) returnCB(); function initTable(_, d) { clearTimeout(timerID); if(!core) return; // on the off chance we exited right as we started updating the table. note.classList.add('noDisplay'); if(tableDL) tableDL.exit(); if(tableSched) tableSched.exit(); tableDL = NewMTable(eleDL.querySelector('.manageTable'), getTableDLData(d.reportQueue)); tableDL.sort('name', 1); note.classList.remove('noDisplay'); tableSched = NewMTable(eleSched.querySelector('.manageTable'), getTableSchedData(d.scheduledReportsList)); tableSched.sort('freq', 1); loop(tableSched.qSA('a.hot'), function(_, e) { e.addEventListener('click', delSchedReport); }); timerID = setTimeout(function() { checkQueue(initTable); }, 50 * 1000); } function exit() { if (!!tableDL) { tableDL.exit(); } if (!!tableSched) { tableSched.exit(); } if (!!eleDL) { target.removeChild(eleDL); } if (!!eleSched) { target.removeChild(eleSched); } core = target = data = returnCB = eleDL = eleSched = tableDL = tableSched = null; } function checkQueue(cb) { if(core) new ApiManager(apiObj, core.userID, cb); } function getTableDLData(data) { var tdata = data.map(function(v) { return { name: {title: v.name, value: v.createdAt}, desc: (v.desc || 'n/a').replace(/00:00:00 \+0000 UTC/g, ''), expires: v.expiresAt ? formatTime(v.expiresAt - Date.now()) : 'N/A', status: getStatus(v) }; }); return { columns : { 'name' : { 'title' : 'Name', 'valueType' : 'string', 'sortable' : true, 'width' : '260' }, 'desc' : { 'title' : 'Description', 'valueType' : 'string', 'sortable' : true, 'width' : '420' }, 'expires': { 'title' : 'Expires In', 'valueType' : 'string', 'sortable' : true, 'width' : '100' }, 'status': { 'title' : 'Status', 'valueType' : 'html', 'sortable' : true, 'width' : '110' } }, 'rowSelect': false, 'rows' : tdata, 'maxPerPage' : 10 }; } function getTableSchedData(data) { var freqMap = ['daily', 'weekly', 'monthly']; var tdata = (data||[]).map(function(v) { return { name: [v.userID, v.campaignID].filter(function(v) { return v != null }).join('-'), recip: v.recipient, freq: {title: v.frequency, value: freqMap.indexOf(v.frequency)}, type: v.type, del: {title: 'Delete', html: 'Delete'} }; }); return { "columns" : { "name" : { "title" : "Name", "valueType" : "string", "sortable" : true, "width" : "260" }, "recip" : { "title" : "Recipient", "valueType" : "string", "sortable" : true, "width" : "270" }, "freq" : { "title" : "Frequency", "valueType" : "string", "sortable" : true, "width" : "130" }, "type": { "title" : "Type", "valueType" : "string", "sortable" : true, "width" : "120" }, "del": { "title" : "Delete", "valueType" : "string", "sortable" : true, "width" : "110"} }, "rowSelect": false, "rows" : tdata, "maxPerPage" : 10 }; } function delSchedReport(e) { preventDefault(e); var id = this.getAttribute('data-id'); if(!id) return; new HttpRequest('DELETE', '/api/v1/scheduledReports/' + id, null, null, 'json', function() { checkQueue(initTable); }); } function getStatus(v) { if(v.status === 1) return {value: 'Generating', title: 'generating', noTitle: true}; if(v.status === 2) return {value: 'Ready To Download', title: 'download', noTitle: true}; if(v.status === 3) return {value: 'Error: ' + v.err, title: 'error: ' + v.err, noTitle: true}; console.error("invalid status", v); } } function Template(){ var manageRow = '

Download Queue

', manageTable = '
', note = '
* generated reports will self destruct after 24 hours, good luck agent.
', schedRow = '

Scheduled Reports

', schedTable = '
'; this.indexDL = '
' + manageRow + note + manageTable + '
'; this.indexSched = '
' + schedRow + schedTable + '
'; this.fresh = '

There is nothing to download!

'; } function reportUrl(apiBase, uid, v) { return apiBase + '/reportDownload/' + uid + '/' + v.id + '/' + v.name; } function formatTime(diff) { var v = Math.floor(diff/1000); if(v > 3600) return (v/3600).toFixed(2) + 'h'; if(v < 60) return v.toFixed(2) + 's'; return (v/60).toFixed(2) + 'm'; } return function(core, target, data, returnCB) { return new Downloads(core, target, data, returnCB); }; })();