diff --git a/airtime_mvc/application/controllers/ListenerstatController.php b/airtime_mvc/application/controllers/ListenerstatController.php index 525faace3..133103f2b 100644 --- a/airtime_mvc/application/controllers/ListenerstatController.php +++ b/airtime_mvc/application/controllers/ListenerstatController.php @@ -72,7 +72,6 @@ class ListenerstatController extends Zend_Controller_Action $this->view->headLink()->appendStylesheet($baseUrl.'css/datatables/css/ColVis.css?'.$CC_CONFIG['airtime_version']); $this->view->headLink()->appendStylesheet($baseUrl.'css/datatables/css/dataTables.colReorder.min.css?'.$CC_CONFIG['airtime_version']); - $this->view->headLink()->appendStylesheet($baseUrl.'js/datatables/plugin/TableTools-2.1.5/css/TableTools.css?'.$CC_CONFIG['airtime_version']); $this->view->headLink()->appendStylesheet($baseUrl.'css/jquery.ui.timepicker.css?'.$CC_CONFIG['airtime_version']); $this->view->headLink()->appendStylesheet($baseUrl.'css/show_analytics.css'.$CC_CONFIG['airtime_version']); diff --git a/airtime_mvc/application/controllers/PlayouthistoryController.php b/airtime_mvc/application/controllers/PlayouthistoryController.php index 1d55266cb..3f235505e 100644 --- a/airtime_mvc/application/controllers/PlayouthistoryController.php +++ b/airtime_mvc/application/controllers/PlayouthistoryController.php @@ -46,17 +46,15 @@ class PlayouthistoryController extends Zend_Controller_Action $this->view->headScript()->appendFile($baseUrl.'js/datatables/js/jquery.dataTables.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'js/datatables/plugin/dataTables.pluginAPI.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'js/datatables/plugin/dataTables.fnSetFilteringDelay.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); - $this->view->headScript()->appendFile($baseUrl.'js/datatables/plugin/TableTools-2.1.5/js/ZeroClipboard.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); - $this->view->headScript()->appendFile($baseUrl.'js/datatables/plugin/TableTools-2.1.5/js/TableTools.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'js/timepicker/jquery.ui.timepicker.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'js/bootstrap-datetime/bootstrap-datetimepicker.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'js/airtime/buttons/buttons.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'js/airtime/utilities/utilities.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); + $this->view->headScript()->appendFile($baseUrl.'js/libs/CSVexport.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'js/airtime/playouthistory/historytable.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headLink()->appendStylesheet($baseUrl.'css/bootstrap-datetimepicker.min.css?'.$CC_CONFIG['airtime_version']); - $this->view->headLink()->appendStylesheet($baseUrl.'js/datatables/plugin/TableTools-2.1.5/css/TableTools.css?'.$CC_CONFIG['airtime_version']); $this->view->headLink()->appendStylesheet($baseUrl.'css/jquery.ui.timepicker.css?'.$CC_CONFIG['airtime_version']); $this->view->headLink()->appendStylesheet($baseUrl.'css/playouthistory.css?'.$CC_CONFIG['airtime_version']); $this->view->headLink()->appendStylesheet($baseUrl.'css/history_styles.css?'.$CC_CONFIG['airtime_version']); diff --git a/airtime_mvc/public/js/airtime/playouthistory/historytable.js b/airtime_mvc/public/js/airtime/playouthistory/historytable.js index 023b11e99..b8307af87 100644 --- a/airtime_mvc/public/js/airtime/playouthistory/historytable.js +++ b/airtime_mvc/public/js/airtime/playouthistory/historytable.js @@ -243,7 +243,6 @@ var AIRTIME = (function(AIRTIME) { "" + ""); - $menu.append("
" + "
"); + ""); $menu.append("
" + "" + - "
"); + ""); + + $menu.append("
" + + "" + + "
"); $el.append($menu); } @@ -568,7 +574,48 @@ var AIRTIME = (function(AIRTIME) { makeHistoryDialog(json.dialog); }, "json"); - }); + }); + + $historyContentDiv.on("click", "#csv_export", async function(){ + // Get date/time from pickers + var startDay = document.querySelector('#his_date_start').value; + var startTime = document.querySelector('#his_time_start').value; + var endDay = document.querySelector('#his_date_end').value; + var endTime = document.querySelector('#his_time_end').value; + + var url = baseUrl + "api/item-history-feed?start=" + startDay + " " + startTime + "&end=" + endDay + " " + endTime; + var requestData = await fetch(url); + var hisData = await requestData.json(); + + if (!hisData.length) { + alert("The date range selected doesn't have any items to export."); + return + } else { + // Clean returned data + hisData.forEach(element => { + // Start date/time + element.startDate = element.starts.split(" ")[0]; + element.startTime = element.starts.split(" ")[1]; + // End date/time + element.endDate = element.ends.split(" ")[0]; + element.endTime = element.ends.split(" ")[1]; + // Moving Title and Artist fields to the end + element.title = element.track_title; + element.artist = element.artist_name; + // Removing extra fields + delete element.checkbox; + delete element.history_id; + delete element.instance_id; + delete element.starts; // we already converted these, so we don't need them anymore + delete element.ends; + delete element.track_title; + delete element.artist_name; + }); + }; + + var csvX = new CSVExport(hisData); // Actual export function + return false // Was part of the demo. Please leave as is. + }); $('body').on("click", ".his_file_cancel, .his_item_cancel", function(e) { removeHistoryDialog(); diff --git a/airtime_mvc/public/js/libs/CSVexport.js b/airtime_mvc/public/js/libs/CSVexport.js new file mode 100644 index 000000000..dd2006060 --- /dev/null +++ b/airtime_mvc/public/js/libs/CSVexport.js @@ -0,0 +1,106 @@ +/** +@namespace Converts JSON to CSV. + +Compress with: http://jscompress.com/ +*/ +(function (window) { + "use strict"; + /** + Default constructor + */ + var _CSV = function (JSONData) { + if (typeof JSONData === 'undefined') + return; + + var csvData = typeof JSONData != 'object' ? JSON.parse(settings.JSONData) : JSONData, + csvHeaders, + csvEncoding = 'data:text/csv;charset=utf-8,', + csvOutput = "", + csvRows = [], + BREAK = '\r\n', + DELIMITER = ',', + FILENAME = "export.csv"; + + // Get and Write the headers + csvHeaders = Object.keys(csvData[0]); + csvOutput += csvHeaders.join(',') + BREAK; + + for (var i = 0; i < csvData.length; i++) { + var rowElements = []; + for(var k = 0; k < csvHeaders.length; k++) { + rowElements.push(csvData[i][csvHeaders[k]]); + } // Write the row array based on the headers + csvRows.push(rowElements.join(DELIMITER)); + } + + csvOutput += csvRows.join(BREAK); + + // Initiate Download + var a = document.createElement("a"); + + if (navigator.msSaveBlob) { // IE10 + navigator.msSaveBlob(new Blob([csvOutput], { type: "text/csv" }), FILENAME); + } else if ('download' in a) { //html5 A[download] + a.href = csvEncoding + encodeURIComponent(csvOutput); + a.download = FILENAME; + document.body.appendChild(a); + setTimeout(function() { + a.click(); + document.body.removeChild(a); + }, 66); + } else if (document.execCommand) { // Other version of IE + var oWin = window.open("about:blank", "_blank"); + oWin.document.write(csvOutput); + oWin.document.close(); + oWin.document.execCommand('SaveAs', true, FILENAME); + oWin.close(); + } else { + alert("Support for your specific browser hasn't been created yet, please check back later."); + } + }; + + window.CSVExport = _CSV; + +})(window); + +// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys +if (!Object.keys) { + Object.keys = (function() { + 'use strict'; + var hasOwnProperty = Object.prototype.hasOwnProperty, + hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'), + dontEnums = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' + ], + dontEnumsLength = dontEnums.length; + + return function(obj) { + if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) { + throw new TypeError('Object.keys called on non-object'); + } + + var result = [], prop, i; + + for (prop in obj) { + if (hasOwnProperty.call(obj, prop)) { + result.push(prop); + } + } + + if (hasDontEnumBug) { + for (i = 0; i < dontEnumsLength; i++) { + if (hasOwnProperty.call(obj, dontEnums[i])) { + result.push(dontEnums[i]); + } + } + } + return result; + }; + }()); +} \ No newline at end of file