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