define(["jQuery", "loading", "events", "globalize", "serverNotifications", "date-fns", "dfnshelper", "listViewStyle", "emby-button"], function ($, loading, events, globalize, serverNotifications, datefns, dfnshelper) {
"use strict";
function reloadList(page) {
ApiClient.getScheduledTasks({
isHidden: false
}).then(function(tasks) {
populateList(page, tasks);
loading.hide();
});
}
function populateList(page, tasks) {
tasks = tasks.sort(function(a, b) {
a = a.Category + " " + a.Name;
b = b.Category + " " + b.Name;
return a == b ? 0 : a < b ? -1 : 1;
});
var currentCategory;
var html = "";
for (var i = 0; i < tasks.length; i++) {
var task = tasks[i];
if (task.Category != currentCategory) {
currentCategory = task.Category;
if (currentCategory) {
html += "";
html += "";
}
html += '
";
}
page.querySelector(".divScheduledTasks").innerHTML = html;
}
function getTaskProgressHtml(task) {
var html = "";
if (task.State === "Idle") {
if (task.LastExecutionResult) {
var endtime = Date.parse(task.LastExecutionResult.EndTimeUtc);
var starttime = Date.parse(task.LastExecutionResult.StartTimeUtc);
html += globalize.translate("LabelScheduledTaskLastRan", datefns.formatDistanceToNow(endtime, dfnshelper.localeWithSuffix),
datefns.formatDistance(starttime, endtime, { locale: dfnshelper.getLocale() }));
if (task.LastExecutionResult.Status === "Failed") {
html += " (" + globalize.translate("LabelFailed") + ")";
} else if (task.LastExecutionResult.Status === "Cancelled") {
html += " (" + globalize.translate("LabelCancelled") + ")";
} else if (task.LastExecutionResult.Status === "Aborted") {
html += " " + globalize.translate("LabelAbortedByServerShutdown") + "";
}
}
} else if (task.State === "Running") {
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
html += '';
html += '
';
html += '
';
html += "
";
html += "
";
html += "
" + progress + "%";
html += "
";
} else {
html += "" + globalize.translate("LabelStopping") + "";
}
return html;
}
function setTaskButtonIcon(button, icon) {
var inner = button.querySelector("i");
inner.classList.remove("stop", "play_arrow");
inner.classList.add(icon);
}
function updateTaskButton(elem, state) {
if (state === "Running") {
elem.classList.remove("btnStartTask");
elem.classList.add("btnStopTask");
setTaskButtonIcon(elem, "stop");
elem.title = globalize.translate("ButtonStop");
} else if (state === "Idle") {
elem.classList.add("btnStartTask");
elem.classList.remove("btnStopTask");
setTaskButtonIcon(elem, "play_arrow");
elem.title = globalize.translate("ButtonStart");
}
$(elem).parents(".listItem")[0].setAttribute("data-status", state);
}
return function(view, params) {
function updateTasks(tasks) {
for (var i = 0; i < tasks.length; i++) {
var task = tasks[i];
view.querySelector("#taskProgress" + task.Id).innerHTML = getTaskProgressHtml(task);
updateTaskButton(view.querySelector("#btnTask" + task.Id), task.State);
}
}
function onPollIntervalFired() {
if (!ApiClient.isMessageChannelOpen()) {
reloadList(view);
}
}
function onScheduledTasksUpdate(e, apiClient, info) {
if (apiClient.serverId() === serverId) {
updateTasks(info);
}
}
function startInterval() {
ApiClient.sendMessage("ScheduledTasksInfoStart", "1000,1000");
pollInterval && clearInterval(pollInterval);
pollInterval = setInterval(onPollIntervalFired, 1e4);
}
function stopInterval() {
ApiClient.sendMessage("ScheduledTasksInfoStop");
pollInterval && clearInterval(pollInterval);
}
var pollInterval;
var serverId = ApiClient.serverId();
$(".divScheduledTasks", view).on("click", ".btnStartTask", function() {
var button = this;
var id = button.getAttribute("data-taskid");
ApiClient.startScheduledTask(id).then(function() {
updateTaskButton(button, "Running");
reloadList(view);
});
});
$(".divScheduledTasks", view).on("click", ".btnStopTask", function() {
var button = this;
var id = button.getAttribute("data-taskid");
ApiClient.stopScheduledTask(id).then(function() {
updateTaskButton(button, "");
reloadList(view);
});
});
view.addEventListener("viewbeforehide", function() {
events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate);
stopInterval();
});
view.addEventListener("viewshow", function() {
loading.show();
startInterval();
reloadList(view);
events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate);
});
};
});