jellyfin-web/dashboard-ui/scripts/scheduledtaskspage.js

241 lines
7.3 KiB
JavaScript
Raw Normal View History

(function ($, document, window) {
2013-02-20 18:33:05 -07:00
2014-05-10 10:28:03 -07:00
function reloadList(page) {
2013-02-20 18:33:05 -07:00
2014-05-30 12:23:56 -07:00
ApiClient.getScheduledTasks({ isHidden: false }).done(function (tasks) {
2014-05-10 10:28:03 -07:00
populateList(page, tasks);
2013-04-16 19:56:16 -07:00
2013-02-20 18:33:05 -07:00
Dashboard.hideLoadingMsg();
});
}
2013-02-20 18:33:05 -07:00
function populateList(page, tasks) {
2013-02-20 18:33:05 -07:00
tasks = tasks.sort(function (a, b) {
a = a.Category + " " + a.Name;
b = b.Category + " " + b.Name;
if (a == b) {
return 0;
}
if (a < b) {
return -1;
}
return 1;
});
var html = "";
2015-06-22 08:43:19 -07:00
html += '<ul data-role="listview" data-inset="true" data-auto-enhanced="false" data-split-icon="action">';
2013-02-20 18:33:05 -07:00
var currentCategory;
for (var i = 0, length = tasks.length; i < length; i++) {
var task = tasks[i];
if (task.Category != currentCategory) {
currentCategory = task.Category;
html += "<li data-role='list-divider'>" + currentCategory + "</li>";
}
2013-04-16 20:05:09 -07:00
html += "<li title='" + task.Description + "'>";
2013-02-20 18:33:05 -07:00
2013-03-28 17:10:15 -07:00
html += "<a href='scheduledtask.html?id=" + task.Id + "'>";
2013-02-20 18:33:05 -07:00
html += "<h3>" + task.Name + "</h3>";
html += "<p id='" + task.Id + "'>" + getTaskProgressHtml(task) + "</p>";
2013-02-20 18:33:05 -07:00
if (task.State == "Idle") {
2015-06-22 08:43:19 -07:00
html += "<a id='btnTask" + task.Id + "' class='btnStartTask' href='#' data-taskid='" + task.Id + "' data-icon='action'>" + Globalize.translate('ButtonStart') + "</a>";
}
else if (task.State == "Running") {
2013-02-20 18:33:05 -07:00
2015-06-22 08:43:19 -07:00
html += "<a id='btnTask" + task.Id + "' class='btnStopTask' href='#' data-taskid='" + task.Id + "' data-icon='delete'>" + Globalize.translate('ButtonStop') + "</a>";
2013-02-20 18:33:05 -07:00
} else {
2013-02-20 18:33:05 -07:00
2015-06-22 08:43:19 -07:00
html += "<a id='btnTask" + task.Id + "' class='btnStartTask' href='#' data-taskid='" + task.Id + "' data-icon='action' style='display:none;'>" + Globalize.translate('ButtonStart') + "</a>";
}
html += "</a>";
html += "</li>";
}
2013-02-20 18:33:05 -07:00
html += "</ul>";
2015-06-23 15:13:06 -07:00
$('.divScheduledTasks', page).html(html).trigger('create');
}
function getTaskProgressHtml(task) {
var html = '';
if (task.State == "Idle") {
if (task.LastExecutionResult) {
2014-05-30 12:23:56 -07:00
html += Globalize.translate('LabelScheduledTaskLastRan').replace("{0}", humane_date(task.LastExecutionResult.EndTimeUtc))
.replace("{1}", humane_elapsed(task.LastExecutionResult.StartTimeUtc, task.LastExecutionResult.EndTimeUtc));
if (task.LastExecutionResult.Status == "Failed") {
2014-05-30 12:23:56 -07:00
html += " <span style='color:#FF0000;'>" + Globalize.translate('LabelFailed') + "</span>";
}
else if (task.LastExecutionResult.Status == "Cancelled") {
2014-05-30 12:23:56 -07:00
html += " <span style='color:#0026FF;'>" + Globalize.translate('LabelCancelled') + "</span>";
}
else if (task.LastExecutionResult.Status == "Aborted") {
2014-05-30 12:23:56 -07:00
html += " <span style='color:#FF0000;'>" + Globalize.translate('LabelAbortedByServerShutdown') + "</span>";
}
2013-02-20 18:33:05 -07:00
}
}
else if (task.State == "Running") {
var progress = (task.CurrentProgressPercentage || 0).toFixed(1);
html += '<progress max="100" value="' + progress + '" title="' + progress + '%">';
html += '' + progress + '%';
html += '</progress>';
html += "<span style='color:#009F00;margin-left:5px;'>" + progress + "%</span>";
2013-02-20 18:33:05 -07:00
} else {
2014-05-30 12:23:56 -07:00
html += "<span style='color:#FF0000;'>" + Globalize.translate('LabelStopping') + "</span>";
}
return html;
}
function onWebSocketMessage(e, msg) {
if (msg.MessageType == "ScheduledTasksInfo") {
var tasks = msg.Data;
var page = $.mobile.activePage;
2013-04-16 19:56:16 -07:00
updateTasks(page, tasks);
}
}
2013-04-16 19:56:16 -07:00
function updateTasks(page, tasks) {
for (var i = 0, length = tasks.length; i < length; i++) {
2013-04-16 19:56:16 -07:00
var task = tasks[i];
2013-04-16 19:56:16 -07:00
$('#' + task.Id, page).html(getTaskProgressHtml(task));
var btnTask = $('#btnTask' + task.Id, page);
updateTaskButton(btnTask, task.State);
}
}
2013-04-16 19:56:16 -07:00
function updateTaskButton(btnTask, state) {
2013-04-16 19:56:16 -07:00
var elem;
if (state == "Idle") {
2013-02-20 18:33:05 -07:00
2015-06-22 08:43:19 -07:00
elem = btnTask.addClass('btnStartTask').removeClass('btnStopTask').show().data("icon", "action").attr("title", Globalize.translate('ButtonStart'));
2013-04-16 19:56:16 -07:00
2015-06-22 08:43:19 -07:00
elem.removeClass('ui-icon-delete').addClass('ui-icon-action');
}
else if (state == "Running") {
2013-02-20 18:33:05 -07:00
2015-06-22 08:43:19 -07:00
elem = btnTask.addClass('btnStopTask').removeClass('btnStartTask').show().data("icon", "delete").attr("title", Globalize.translate('ButtonStop'));
2013-04-16 19:56:16 -07:00
2015-06-22 08:43:19 -07:00
elem.removeClass('ui-icon-action').addClass('ui-icon-delete');
2013-02-20 18:33:05 -07:00
} else {
2013-02-20 18:33:05 -07:00
2015-06-22 08:43:19 -07:00
elem = btnTask.addClass('btnStartTask').removeClass('btnStopTask').hide().data("icon", "action").attr("title", Globalize.translate('ButtonStart'));
2013-04-16 19:56:16 -07:00
2015-06-23 15:13:06 -07:00
elem.removeClass('ui-icon-delete').addClass('ui-icon-action');
}
}
2013-02-20 18:33:05 -07:00
2014-05-10 10:28:03 -07:00
function onWebSocketConnectionOpen() {
2014-05-30 12:23:56 -07:00
2014-05-10 10:28:03 -07:00
startInterval();
reloadList($.mobile.activePage);
}
2013-02-20 18:33:05 -07:00
2015-07-14 09:39:34 -07:00
var pollInterval;
function onPollIntervalFired() {
if (!ApiClient.isWebSocketOpen()) {
reloadList($.mobile.activePage);
}
}
function startInterval() {
if (ApiClient.isWebSocketOpen()) {
2014-05-10 10:28:03 -07:00
ApiClient.sendWebSocketMessage("ScheduledTasksInfoStart", "1000,1000");
2013-02-20 18:33:05 -07:00
}
2015-07-14 09:39:34 -07:00
if (pollInterval) {
clearInterval(pollInterval);
}
pollInterval = setInterval(onPollIntervalFired, 1500);
}
2013-02-20 18:33:05 -07:00
function stopInterval() {
if (ApiClient.isWebSocketOpen()) {
ApiClient.sendWebSocketMessage("ScheduledTasksInfoStop");
}
2015-07-14 09:39:34 -07:00
if (pollInterval) {
clearInterval(pollInterval);
}
}
2015-09-01 07:01:59 -07:00
$(document).on('pageinit', "#scheduledTasksPage", function () {
2013-02-20 18:33:05 -07:00
var page = this;
2013-02-20 18:33:05 -07:00
2015-06-23 15:13:06 -07:00
$('.divScheduledTasks', page).on('click', '.btnStartTask', function () {
var button = this;
var id = button.getAttribute('data-taskid');
ApiClient.startScheduledTask(id).done(function () {
2013-02-20 18:33:05 -07:00
updateTaskButton($(button), "Running");
reloadList(page);
});
2013-02-20 18:33:05 -07:00
}).on('click', '.btnStopTask', function () {
2013-02-20 18:33:05 -07:00
var button = this;
var id = button.getAttribute('data-taskid');
ApiClient.stopScheduledTask(id).done(function () {
2013-02-20 18:33:05 -07:00
updateTaskButton($(button), "");
reloadList(page);
});
2013-02-20 18:33:05 -07:00
});
2015-06-07 18:23:56 -07:00
}).on('pageshowready', "#scheduledTasksPage", function () {
var page = this;
Dashboard.showLoadingMsg();
startInterval();
reloadList(page);
$(ApiClient).on("websocketmessage", onWebSocketMessage).on("websocketopen", onWebSocketConnectionOpen);
2015-06-20 17:49:42 -07:00
}).on('pagebeforehide', "#scheduledTasksPage", function () {
var page = this;
2014-05-10 10:28:03 -07:00
$(ApiClient).off("websocketmessage", onWebSocketMessage).off("websocketopen", onWebSocketConnectionOpen);
stopInterval();
});
})(jQuery, document, window);