1024 lines
26 KiB
JavaScript
1024 lines
26 KiB
JavaScript
var AIRTIME = (function (AIRTIME) {
|
|
var mod;
|
|
|
|
if (AIRTIME.history === undefined) {
|
|
AIRTIME.history = {};
|
|
}
|
|
mod = AIRTIME.history;
|
|
|
|
var $historyContentDiv;
|
|
|
|
var lengthMenu = [
|
|
[10, 25, 50, 100, 500, -1],
|
|
[10, 25, 50, 100, 500, $.i18n._("All")],
|
|
];
|
|
|
|
var sDom = 'l<"dt-process-rel"r><"H"><"dataTables_scrolling"t><"F"ip>';
|
|
|
|
var selectedLogItems = {};
|
|
|
|
var dateStartId = "#his_date_start",
|
|
timeStartId = "#his_time_start",
|
|
dateEndId = "#his_date_end",
|
|
timeEndId = "#his_time_end",
|
|
oTableAgg,
|
|
oTableItem,
|
|
oTableShow,
|
|
inShowsTab = false;
|
|
|
|
function validateTimeRange() {
|
|
var oRange,
|
|
inputs = $(".his-timerange > input"),
|
|
start,
|
|
end;
|
|
|
|
oRange = AIRTIME.utilities.fnGetScheduleRange(
|
|
dateStartId,
|
|
timeStartId,
|
|
dateEndId,
|
|
timeEndId,
|
|
);
|
|
|
|
start = oRange.start;
|
|
end = oRange.end;
|
|
|
|
if (end >= start) {
|
|
inputs.removeClass("error");
|
|
} else {
|
|
inputs.addClass("error");
|
|
}
|
|
|
|
return {
|
|
start: start,
|
|
end: end,
|
|
isValid: end >= start,
|
|
};
|
|
}
|
|
|
|
function getSelectedLogItems() {
|
|
var items = Object.keys(selectedLogItems);
|
|
|
|
return items;
|
|
}
|
|
|
|
function addSelectedLogItem($el) {
|
|
var id;
|
|
|
|
$el.addClass("his-selected");
|
|
id = $el.data("his-id");
|
|
selectedLogItems[id] = "";
|
|
}
|
|
|
|
function removeSelectedLogItem($el) {
|
|
var id;
|
|
|
|
$el.removeClass("his-selected");
|
|
id = $el.data("his-id");
|
|
delete selectedLogItems[id];
|
|
}
|
|
|
|
function emptySelectedLogItems() {
|
|
var $inputs = $historyContentDiv.find(".his_checkbox").find("input");
|
|
|
|
$inputs.prop("checked", false);
|
|
$inputs.parents("tr").removeClass("his-selected");
|
|
|
|
selectedLogItems = {};
|
|
}
|
|
|
|
function selectCurrentPage(e) {
|
|
var $ctx = $(e.currentTarget).parents("div.dataTables_wrapper"),
|
|
$inputs = $ctx.find(".his_checkbox").find("input"),
|
|
$tr,
|
|
$input;
|
|
|
|
$.each($inputs, function (index, input) {
|
|
$input = $(input);
|
|
$input.prop("checked", true);
|
|
$tr = $input.parents("tr");
|
|
addSelectedLogItem($tr);
|
|
});
|
|
}
|
|
|
|
function deselectCurrentPage(e) {
|
|
var $ctx = $(e.currentTarget).parents("div.dataTables_wrapper"),
|
|
$inputs = $ctx.find(".his_checkbox").find("input"),
|
|
$tr,
|
|
$input;
|
|
|
|
$.each($inputs, function (index, input) {
|
|
$input = $(input);
|
|
$input.prop("checked", false);
|
|
$tr = $input.parents("tr");
|
|
removeSelectedLogItem($tr);
|
|
});
|
|
}
|
|
|
|
function getFileName(ext) {
|
|
var filename =
|
|
$("#his_date_start").val() +
|
|
"_" +
|
|
$("#his_time_start").val() +
|
|
"m--" +
|
|
$("#his_date_end").val() +
|
|
"_" +
|
|
$("#his_time_end").val() +
|
|
"m";
|
|
filename = filename.replace(/:/g, "h");
|
|
|
|
if (ext == "pdf") {
|
|
filename = filename + ".pdf";
|
|
} else {
|
|
filename = filename + ".csv";
|
|
}
|
|
return filename;
|
|
}
|
|
|
|
/* This callback can be used for all history tables */
|
|
function fnServerData(sSource, aoData, fnCallback) {
|
|
if (fnServerData.hasOwnProperty("start")) {
|
|
aoData.push({ name: "start", value: fnServerData.start });
|
|
}
|
|
if (fnServerData.hasOwnProperty("end")) {
|
|
aoData.push({ name: "end", value: fnServerData.end });
|
|
}
|
|
if (fnServerData.hasOwnProperty("instance")) {
|
|
aoData.push({ name: "instance_id", value: fnServerData.instance });
|
|
}
|
|
|
|
aoData.push({ name: "format", value: "json" });
|
|
|
|
$.ajax({
|
|
dataType: "json",
|
|
type: "GET",
|
|
url: sSource,
|
|
data: aoData,
|
|
success: fnCallback,
|
|
});
|
|
}
|
|
|
|
function createShowAccordSection(config) {
|
|
var template, $el;
|
|
|
|
template =
|
|
"<h3>" +
|
|
"<a href='#'>" +
|
|
"<span class='show-title'><%= name %></span>" +
|
|
"<span class='push-right'>" +
|
|
"<span class='show-date'><%= date %></span>" +
|
|
"<span class='show-time'><%= startTime %></span>" +
|
|
"-" +
|
|
"<span class='show-time'><%= endTime %></span>" +
|
|
"</span>" +
|
|
"</a>" +
|
|
"</h3>" +
|
|
"<div " +
|
|
"data-instance='<%= instance %>' " +
|
|
"></div>";
|
|
|
|
template = _.template(template);
|
|
$el = $(template(config));
|
|
|
|
return $el;
|
|
}
|
|
|
|
//$el is the div in the accordian we should create the table on.
|
|
function createShowTable($el) {
|
|
var instance = $el.data("instance");
|
|
var $table = $("<table/>", {
|
|
cellpadding: "0",
|
|
cellspacing: "0",
|
|
class: "datatable",
|
|
id: "history_table_show",
|
|
});
|
|
|
|
//assign the retrieval function the show instance id.
|
|
fnServerData.instance = instance;
|
|
$el.append($table);
|
|
$el.css("height", "auto");
|
|
oTableShow = itemHistoryTable("history_table_show");
|
|
}
|
|
|
|
function drawShowList(oShows) {
|
|
var $showList = $historyContentDiv.find("#history_show_summary"),
|
|
i,
|
|
len,
|
|
$accordSection,
|
|
show,
|
|
tmp;
|
|
|
|
$showList.accordion("destroy").empty();
|
|
|
|
for (i = 0, len = oShows.length; i < len; i++) {
|
|
show = oShows[i];
|
|
tmp = show.starts.split(" ");
|
|
|
|
$accordSection = createShowAccordSection({
|
|
instance: show.instance_id,
|
|
name: show.name,
|
|
date: tmp[0],
|
|
startTime: tmp[1],
|
|
endTime: show.ends.split(" ").pop(),
|
|
});
|
|
|
|
$showList.append($accordSection);
|
|
}
|
|
|
|
$showList.accordion({
|
|
animated: false,
|
|
create: function (event, ui) {
|
|
var $div = $showList.find(".ui-accordion-content-active");
|
|
console.log(event);
|
|
//$div.css()
|
|
createShowTable($div);
|
|
},
|
|
change: function (event, ui) {
|
|
var $div = $(ui.newContent);
|
|
$(ui.oldContent).empty();
|
|
createShowTable($div);
|
|
selectedLogItems = {};
|
|
},
|
|
//changestart: function( event, ui ) {}
|
|
});
|
|
}
|
|
|
|
function createToolbarButtons($el) {
|
|
var $menu = $("<div class='btn-toolbar' />");
|
|
|
|
$menu.append(
|
|
"<div class='btn-group'>" +
|
|
"<button class='btn btn-small btn-new' id='his_create'>" +
|
|
"<i class='icon-white icon-plus'></i>" +
|
|
$.i18n._("New Log Entry") +
|
|
"</button>" +
|
|
"</div>",
|
|
);
|
|
|
|
$menu.append(
|
|
"<div class='btn-group'>" +
|
|
"<button class='btn btn-small dropdown-toggle' data-toggle='dropdown'>" +
|
|
$.i18n._("Select") +
|
|
" <span class='caret'></span>" +
|
|
"</button>" +
|
|
"<ul class='dropdown-menu'>" +
|
|
"<li class='his-select-page'><a href='#'>" +
|
|
$.i18n._("Select this page") +
|
|
"</a></li>" +
|
|
"<li class='his-dselect-page'><a href='#'>" +
|
|
$.i18n._("Deselect this page") +
|
|
"</a></li>" +
|
|
"<li class='his-dselect-all'><a href='#'>" +
|
|
$.i18n._("Deselect all") +
|
|
"</a></li>" +
|
|
"</ul>" +
|
|
"</div>",
|
|
);
|
|
|
|
$menu.append(
|
|
"<div class='btn-group'>" +
|
|
"<button class='btn btn-small dropdown-toggle' data-toggle='dropdown'>" +
|
|
$.i18n._("Export") +
|
|
" <span class='caret'></span>" +
|
|
"</button>" +
|
|
"<ul class='dropdown-menu'>" +
|
|
"<li id='csv_export'><a href='#'>" +
|
|
$.i18n._("Export as CSV") +
|
|
"</a></li>" +
|
|
"<li id='pdf_export'><a href='#'>" +
|
|
$.i18n._("Export as PDF") +
|
|
"</a></li>" +
|
|
"</ul>" +
|
|
"</div>",
|
|
);
|
|
|
|
$menu.append(
|
|
"<div class='btn-group'>" +
|
|
"<button class='btn btn-small' id='his_trash'>" +
|
|
"<i class='icon-white icon-trash'></i>" +
|
|
"</button>" +
|
|
"</div>",
|
|
);
|
|
|
|
$el.append($menu);
|
|
}
|
|
|
|
function aggregateHistoryTable() {
|
|
var oTable,
|
|
$historyTableDiv = $historyContentDiv.find("#history_table_aggregate"),
|
|
columns,
|
|
fnRowCallback;
|
|
|
|
fnRowCallback = function (nRow, aData, iDisplayIndex, iDisplayIndexFull) {
|
|
var editUrl =
|
|
baseUrl + "playouthistory/edit-file-item/id/" + aData.file_id,
|
|
$nRow = $(nRow);
|
|
|
|
$nRow.data("url-edit", editUrl);
|
|
};
|
|
|
|
columns = JSON.parse(
|
|
localStorage.getItem("datatables-historyfile-aoColumns"),
|
|
);
|
|
|
|
oTable = $historyTableDiv.dataTable({
|
|
aoColumns: columns,
|
|
|
|
bProcessing: true,
|
|
bServerSide: true,
|
|
sAjaxSource: baseUrl + "playouthistory/file-history-feed",
|
|
sAjaxDataProp: "history",
|
|
fnServerData: fnServerData,
|
|
fnRowCallback: fnRowCallback,
|
|
oLanguage: getDatatablesStrings({
|
|
sEmptyTable: $.i18n._(
|
|
"No tracks were played during the selected time period.",
|
|
),
|
|
sInfoEmpty: $.i18n._("Showing 0 to 0 of 0 tracks"),
|
|
sInfo: $.i18n._("Showing _START_ to _END_ of _TOTAL_ tracks"),
|
|
sInfoEmpty: $.i18n._("Showing 0 to 0 of 0 tracks"),
|
|
sInfoFiltered: $.i18n._("(filtered from _MAX_ total tracks)"),
|
|
}),
|
|
aLengthMenu: lengthMenu,
|
|
iDisplayLength: 25,
|
|
sPaginationType: "full_numbers",
|
|
bJQueryUI: true,
|
|
bAutoWidth: true,
|
|
sDom: sDom,
|
|
});
|
|
oTable.fnSetFilteringDelay(350);
|
|
|
|
return oTable;
|
|
}
|
|
|
|
function itemHistoryTable(id) {
|
|
var oTable,
|
|
$historyTableDiv = $historyContentDiv.find("#" + id),
|
|
$toolbar,
|
|
columns,
|
|
fnRowCallback,
|
|
booleans = {},
|
|
i,
|
|
c;
|
|
|
|
columns = JSON.parse(
|
|
localStorage.getItem("datatables-historyitem-aoColumns"),
|
|
);
|
|
|
|
for (i in columns) {
|
|
c = columns[i];
|
|
if (c["sDataType"] === "boolean") {
|
|
booleans[c["mDataProp"]] = c["sTitle"];
|
|
}
|
|
}
|
|
|
|
fnRowCallback = function (nRow, aData, iDisplayIndex, iDisplayIndexFull) {
|
|
var editUrl =
|
|
baseUrl + "playouthistory/edit-list-item/id/" + aData.history_id,
|
|
deleteUrl =
|
|
baseUrl + "playouthistory/delete-list-item/id/" + aData.history_id,
|
|
emptyCheckBox = String.fromCharCode(parseInt(2610, 16)),
|
|
checkedCheckBox = String.fromCharCode(parseInt(2612, 16)),
|
|
b,
|
|
text,
|
|
$nRow = $(nRow);
|
|
|
|
// add checkbox
|
|
$nRow
|
|
.find("td.his_checkbox")
|
|
.html("<input type='checkbox' name='cb_" + aData.history_id + "'>");
|
|
|
|
$nRow.data("his-id", aData.history_id);
|
|
$nRow.data("url-edit", editUrl);
|
|
$nRow.data("url-delete", deleteUrl);
|
|
|
|
for (b in booleans) {
|
|
text = aData[b] ? checkedCheckBox : emptyCheckBox;
|
|
text = text + " " + booleans[b];
|
|
|
|
$nRow.find(".his_" + b).html(text);
|
|
}
|
|
};
|
|
|
|
oTable = $historyTableDiv.dataTable({
|
|
aoColumns: columns,
|
|
bProcessing: true,
|
|
bServerSide: true,
|
|
sAjaxSource: baseUrl + "playouthistory/item-history-feed",
|
|
sAjaxDataProp: "history",
|
|
fnServerData: fnServerData,
|
|
fnRowCallback: fnRowCallback,
|
|
oLanguage: getDatatablesStrings({
|
|
sEmptyTable: $.i18n._(
|
|
"No tracks were played during the selected time period.",
|
|
),
|
|
sInfoEmpty: $.i18n._("Showing 0 to 0 of 0 tracks"),
|
|
sInfo: $.i18n._("Showing _START_ to _END_ of _TOTAL_ tracks"),
|
|
sInfoEmpty: $.i18n._("Showing 0 to 0 of 0 tracks"),
|
|
sInfoFiltered: $.i18n._("(filtered from _MAX_ total tracks)"),
|
|
}),
|
|
aLengthMenu: lengthMenu,
|
|
iDisplayLength: 25,
|
|
sPaginationType: "full_numbers",
|
|
bJQueryUI: true,
|
|
bAutoWidth: true,
|
|
sDom: sDom,
|
|
});
|
|
oTable.fnSetFilteringDelay(350);
|
|
|
|
$toolbar = $historyTableDiv
|
|
.parents(".dataTables_wrapper")
|
|
.find(".fg-toolbar:first");
|
|
createToolbarButtons($toolbar);
|
|
|
|
return oTable;
|
|
}
|
|
|
|
function showSummaryList(start, end) {
|
|
var url = baseUrl + "playouthistory/show-history-feed",
|
|
data = {
|
|
format: "json",
|
|
start: start,
|
|
end: end,
|
|
};
|
|
|
|
$.post(url, data, function (json) {
|
|
drawShowList(json);
|
|
});
|
|
}
|
|
|
|
mod.onReady = function () {
|
|
var oBaseDatePickerSettings,
|
|
oBaseTimePickerSettings,
|
|
$hisDialogEl,
|
|
tabsInit = [
|
|
{
|
|
initialized: false,
|
|
initialize: function () {
|
|
oTableItem = itemHistoryTable("history_table_list");
|
|
},
|
|
navigate: function () {
|
|
delete fnServerData.instance;
|
|
oTableItem.fnDraw();
|
|
},
|
|
always: function () {
|
|
inShowsTab = false;
|
|
emptySelectedLogItems();
|
|
},
|
|
},
|
|
{
|
|
initialized: false,
|
|
initialize: function () {
|
|
oTableAgg = aggregateHistoryTable();
|
|
},
|
|
navigate: function () {
|
|
delete fnServerData.instance;
|
|
oTableAgg.fnDraw();
|
|
},
|
|
always: function () {
|
|
inShowsTab = false;
|
|
emptySelectedLogItems();
|
|
},
|
|
},
|
|
{
|
|
initialized: false,
|
|
initialize: function () {},
|
|
navigate: function () {},
|
|
always: function () {
|
|
inShowsTab = true;
|
|
|
|
var info = getStartEnd();
|
|
showSummaryList(info.start, info.end);
|
|
emptySelectedLogItems();
|
|
},
|
|
},
|
|
];
|
|
|
|
//set the locale names for the bootstrap calendar.
|
|
$.fn.datetimepicker.dates = {
|
|
daysMin: i18n_days_short,
|
|
months: i18n_months,
|
|
monthsShort: i18n_months_short,
|
|
};
|
|
|
|
$historyContentDiv = $("#history_content");
|
|
|
|
function redrawTables() {
|
|
oTableAgg && oTableAgg.fnDraw();
|
|
oTableItem && oTableItem.fnDraw();
|
|
oTableShow && oTableShow.fnDraw();
|
|
}
|
|
|
|
function removeHistoryDialog() {
|
|
$hisDialogEl.dialog("destroy");
|
|
$hisDialogEl.remove();
|
|
}
|
|
|
|
function initializeDialog() {
|
|
var $startPicker = $hisDialogEl.find("#his_item_starts_datetimepicker"),
|
|
$endPicker = $hisDialogEl.find("#his_item_ends_datetimepicker");
|
|
|
|
$startPicker.datetimepicker();
|
|
|
|
$endPicker.datetimepicker({
|
|
showTimeFirst: true,
|
|
});
|
|
|
|
$startPicker.on("changeDate", function (e) {
|
|
$endPicker.data("datetimepicker").setLocalDate(e.localDate);
|
|
});
|
|
}
|
|
|
|
function processDialogHtml($el) {
|
|
if (inShowsTab) {
|
|
$el.find("#his_choose_instance").remove();
|
|
}
|
|
|
|
return $el;
|
|
}
|
|
|
|
function makeHistoryDialog(html) {
|
|
$hisDialogEl = $(html);
|
|
$hisDialogEl = processDialogHtml($hisDialogEl);
|
|
|
|
$hisDialogEl.dialog({
|
|
title: $.i18n._("Edit History Record"),
|
|
modal: false,
|
|
open: function (event, ui) {
|
|
initializeDialog();
|
|
},
|
|
close: function () {
|
|
removeHistoryDialog();
|
|
},
|
|
});
|
|
}
|
|
|
|
hisSubmit(); // Fixes display bug
|
|
|
|
/*
|
|
* Icon hover states for search.
|
|
*/
|
|
$historyContentDiv.on(
|
|
"mouseenter",
|
|
".his-timerange .ui-button",
|
|
function (ev) {
|
|
$(this).addClass("ui-state-hover");
|
|
},
|
|
);
|
|
$historyContentDiv.on(
|
|
"mouseleave",
|
|
".his-timerange .ui-button",
|
|
function (ev) {
|
|
$(this).removeClass("ui-state-hover");
|
|
},
|
|
);
|
|
|
|
oBaseDatePickerSettings = {
|
|
dateFormat: "yy-mm-dd",
|
|
//i18n_months, i18n_days_short are in common.js
|
|
monthNames: i18n_months,
|
|
dayNamesMin: i18n_days_short,
|
|
onSelect: function (sDate, oDatePicker) {
|
|
$(this).datepicker("setDate", sDate);
|
|
},
|
|
onClose: validateTimeRange,
|
|
};
|
|
|
|
oBaseTimePickerSettings = {
|
|
showPeriodLabels: false,
|
|
showCloseButton: true,
|
|
closeButtonText: $.i18n._("Done"),
|
|
showLeadingZero: false,
|
|
defaultTime: "0:00",
|
|
hourText: $.i18n._("Hour"),
|
|
minuteText: $.i18n._("Minute"),
|
|
onClose: validateTimeRange,
|
|
};
|
|
|
|
$historyContentDiv
|
|
.find(dateStartId)
|
|
.datepicker(oBaseDatePickerSettings)
|
|
.blur(validateTimeRange);
|
|
|
|
$historyContentDiv
|
|
.find(timeStartId)
|
|
.timepicker(oBaseTimePickerSettings)
|
|
.blur(validateTimeRange);
|
|
|
|
$historyContentDiv
|
|
.find(dateEndId)
|
|
.datepicker(oBaseDatePickerSettings)
|
|
.blur(validateTimeRange);
|
|
|
|
$historyContentDiv
|
|
.find(timeEndId)
|
|
.timepicker(oBaseTimePickerSettings)
|
|
.blur(validateTimeRange);
|
|
|
|
$historyContentDiv.on("click", "#his_create", function (e) {
|
|
var url = baseUrl + "playouthistory/edit-list-item/format/json";
|
|
|
|
e.preventDefault();
|
|
|
|
$.get(
|
|
url,
|
|
function (json) {
|
|
makeHistoryDialog(json.dialog);
|
|
},
|
|
"json",
|
|
);
|
|
});
|
|
|
|
$historyContentDiv.on("click", "#pdf_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 {
|
|
// Generate PDF template
|
|
var dd = {
|
|
content: [
|
|
{ text: "Libretime", style: "subheader" },
|
|
{
|
|
text:
|
|
"Playout History from " +
|
|
startDay +
|
|
" " +
|
|
startTime +
|
|
" to " +
|
|
endDay +
|
|
" " +
|
|
endTime,
|
|
style: "header",
|
|
},
|
|
{
|
|
style: "mainTable",
|
|
table: {
|
|
headerRows: 1,
|
|
body: [
|
|
[
|
|
{ text: "Start Time", style: "tableHeader" },
|
|
{ text: "End Time", style: "tableHeader" },
|
|
{ text: "Song", style: "tableHeader" },
|
|
{ text: "Artist", style: "tableHeader" },
|
|
],
|
|
],
|
|
},
|
|
},
|
|
],
|
|
styles: {
|
|
header: {
|
|
fontSize: 18,
|
|
bold: true,
|
|
margin: [0, 0, 0, 10],
|
|
},
|
|
subheader: {
|
|
fontSize: 14,
|
|
bold: true,
|
|
margin: [0, 10, 0, 5],
|
|
},
|
|
mainTable: {
|
|
margin: [0, 5, 0, 15],
|
|
},
|
|
tableHeader: {
|
|
bold: true,
|
|
fontSize: 13,
|
|
color: "black",
|
|
},
|
|
},
|
|
defaultStyle: {},
|
|
};
|
|
hisData.forEach((element) => {
|
|
// Removing extra fields
|
|
delete element.checkbox;
|
|
delete element.history_id;
|
|
delete element.instance_id;
|
|
dd.content[2].table.body.push(Object.values(element));
|
|
});
|
|
// Make PDF and start download
|
|
pdfMake.createPdf(dd).download();
|
|
}
|
|
});
|
|
|
|
$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();
|
|
});
|
|
|
|
$("body").on("click", ".his_file_save", function (e) {
|
|
e.preventDefault();
|
|
|
|
var $form = $(this).parents("form");
|
|
var data = $form.serializeArray();
|
|
|
|
var url = baseUrl + "Playouthistory/update-file-item/format/json";
|
|
|
|
$.post(
|
|
url,
|
|
data,
|
|
function (json) {
|
|
//TODO put errors on form.
|
|
if (json.error !== undefined) {
|
|
//makeHistoryDialog(json.dialog);
|
|
} else {
|
|
removeHistoryDialog();
|
|
redrawTables();
|
|
}
|
|
},
|
|
"json",
|
|
);
|
|
});
|
|
|
|
$("body").on("click", ".his_item_save", function (e) {
|
|
e.preventDefault();
|
|
|
|
var $form = $(this).parents("form"),
|
|
data = $form.serializeArray(),
|
|
id = data[0].value,
|
|
createUrl = baseUrl + "Playouthistory/create-list-item/format/json",
|
|
updateUrl = baseUrl + "Playouthistory/update-list-item/format/json",
|
|
url,
|
|
$select = $hisDialogEl.find("#his_instance_select"),
|
|
instance;
|
|
|
|
url = id === "" ? createUrl : updateUrl;
|
|
|
|
if (fnServerData.instance !== undefined) {
|
|
data.push({
|
|
name: "instance_id",
|
|
value: fnServerData.instance,
|
|
});
|
|
} else if ($select.length > 0) {
|
|
instance = $select.val();
|
|
|
|
if (instance > 0) {
|
|
data.push({
|
|
name: "instance_id",
|
|
value: instance,
|
|
});
|
|
}
|
|
}
|
|
|
|
$.post(
|
|
url,
|
|
data,
|
|
function (json) {
|
|
if (json.form !== undefined) {
|
|
var $newForm = $(json.form);
|
|
$newForm = processDialogHtml($newForm);
|
|
$hisDialogEl.html($newForm.html());
|
|
initializeDialog();
|
|
} else {
|
|
removeHistoryDialog();
|
|
redrawTables();
|
|
}
|
|
},
|
|
"json",
|
|
);
|
|
});
|
|
|
|
$historyContentDiv.on("click", ".his_checkbox input", function (e) {
|
|
var checked = e.currentTarget.checked,
|
|
$tr = $(e.currentTarget).parents("tr");
|
|
|
|
if (checked) {
|
|
addSelectedLogItem($tr);
|
|
} else {
|
|
removeSelectedLogItem($tr);
|
|
}
|
|
});
|
|
|
|
$("body").on("click", "#his_instance_retrieve", function (e) {
|
|
var startPicker = $hisDialogEl.find("#his_item_starts"),
|
|
endPicker = $hisDialogEl.find("#his_item_ends"),
|
|
url = baseUrl + "playouthistory/show-history-feed",
|
|
startDate = startPicker.val(),
|
|
endDate = endPicker.val(),
|
|
data;
|
|
|
|
data = {
|
|
start: startDate,
|
|
end: endDate,
|
|
format: "json",
|
|
};
|
|
|
|
$.get(url, data, function (json) {
|
|
var i,
|
|
$select = $("<select/>", {
|
|
id: "his_instance_select",
|
|
}),
|
|
$option,
|
|
show;
|
|
|
|
if (json.length > 0) {
|
|
for (i = 0; i < json.length; i++) {
|
|
show = json[i];
|
|
|
|
$option = $("<option/>")
|
|
.text(show.name)
|
|
.attr("value", show.instance_id);
|
|
|
|
$select.append($option);
|
|
}
|
|
}
|
|
|
|
$option = $("<option/>").text($.i18n._("No Show")).attr("value", 0);
|
|
|
|
$select.append($option);
|
|
|
|
$hisDialogEl.find("#his_instance_select").replaceWith($select);
|
|
});
|
|
});
|
|
|
|
function getStartEnd() {
|
|
return AIRTIME.utilities.fnGetScheduleRange(
|
|
dateStartId,
|
|
timeStartId,
|
|
dateEndId,
|
|
timeEndId,
|
|
);
|
|
}
|
|
|
|
function hisSubmit() {
|
|
var fn, info;
|
|
|
|
info = getStartEnd();
|
|
|
|
fn = fnServerData;
|
|
fn.start = info.start;
|
|
fn.end = info.end;
|
|
|
|
if (inShowsTab) {
|
|
showSummaryList(info.start, info.end);
|
|
} else {
|
|
redrawTables();
|
|
}
|
|
}
|
|
|
|
$historyContentDiv.find("#his_submit").click(function (ev) {
|
|
hisSubmit();
|
|
});
|
|
|
|
$historyContentDiv.on("click", ".his-select-page", selectCurrentPage);
|
|
$historyContentDiv.on("click", ".his-dselect-page", deselectCurrentPage);
|
|
$historyContentDiv.on("click", ".his-dselect-all", emptySelectedLogItems);
|
|
|
|
$historyContentDiv.on("click", "#his_trash", function (ev) {
|
|
var items = getSelectedLogItems(),
|
|
url = baseUrl + "playouthistory/delete-list-items";
|
|
|
|
$.post(url, { ids: items, format: "json" }, function () {
|
|
selectedLogItems = {};
|
|
redrawTables();
|
|
});
|
|
});
|
|
|
|
$historyContentDiv.find("#his-tabs").tabs({
|
|
show: function (event, ui) {
|
|
var href = $(ui.tab).attr("href");
|
|
var index = href.split("-").pop();
|
|
var tab = tabsInit[index - 1];
|
|
|
|
if (!tab.initialized) {
|
|
tab.initialize();
|
|
tab.initialized = true;
|
|
} else {
|
|
tab.navigate();
|
|
}
|
|
|
|
tab.always();
|
|
},
|
|
});
|
|
|
|
// begin context menu initialization.
|
|
$.contextMenu({
|
|
selector: "#history_content td:not(.his_checkbox)",
|
|
trigger: "left",
|
|
ignoreRightClick: true,
|
|
|
|
build: function ($el, e) {
|
|
var items = {},
|
|
callback,
|
|
$tr,
|
|
editUrl,
|
|
deleteUrl;
|
|
|
|
$tr = $el.parents("tr");
|
|
editUrl = $tr.data("url-edit");
|
|
deleteUrl = $tr.data("url-delete");
|
|
|
|
if (editUrl !== undefined) {
|
|
callback = function () {
|
|
$.post(
|
|
editUrl,
|
|
{ format: "json" },
|
|
function (json) {
|
|
makeHistoryDialog(json.dialog);
|
|
},
|
|
"json",
|
|
);
|
|
};
|
|
|
|
items["edit"] = {
|
|
name: $.i18n._("Edit"),
|
|
icon: "edit",
|
|
callback: callback,
|
|
};
|
|
}
|
|
|
|
if (deleteUrl !== undefined) {
|
|
callback = function () {
|
|
var c = confirm("Delete this entry?");
|
|
|
|
if (c) {
|
|
$.post(deleteUrl, { format: "json" }, function (json) {
|
|
redrawTables();
|
|
});
|
|
}
|
|
};
|
|
|
|
items["del"] = {
|
|
name: $.i18n._("Delete"),
|
|
icon: "delete",
|
|
callback: callback,
|
|
};
|
|
}
|
|
|
|
return {
|
|
items: items,
|
|
};
|
|
},
|
|
});
|
|
};
|
|
|
|
return AIRTIME;
|
|
})(AIRTIME || {});
|
|
|
|
$(document).ready(AIRTIME.history.onReady);
|