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 += '
'; html += '
'; html += '

'; html += currentCategory; html += "

"; if (i === 0) { html += '' + globalize.translate("Help") + ""; } html += "
"; html += '
'; } html += '
'; html += ""; html += 'schedule'; html += ""; html += '"; if (task.State === "Running") { html += ''; } else if (task.State === "Idle") { html += ''; } html += "
"; } if (tasks.length) { 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); }); }; });