import 'jquery';
import loading from '../../../components/loading/loading';
import { Events } from 'jellyfin-apiclient';
import globalize from '../../../scripts/globalize';
import serverNotifications from '../../../scripts/serverNotifications';
import { formatDistance, formatDistanceToNow } from 'date-fns';
import { getLocale, localeWithSuffix } from '../../../scripts/dfnshelper';
import '../../../components/listview/listview.css';
import '../../../elements/emby-button/emby-button';
/* eslint-disable indent */
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;
});
let currentCategory;
let html = '';
for (let i = 0; i < tasks.length; i++) {
const task = tasks[i];
if (task.Category != currentCategory) {
currentCategory = task.Category;
if (currentCategory) {
html += '';
html += '';
}
html += '
';
}
page.querySelector('.divScheduledTasks').innerHTML = html;
}
function getTaskProgressHtml(task) {
let html = '';
if (task.State === 'Idle') {
if (task.LastExecutionResult) {
const endtime = Date.parse(task.LastExecutionResult.EndTimeUtc);
const starttime = Date.parse(task.LastExecutionResult.StartTimeUtc);
html += globalize.translate('LabelScheduledTaskLastRan', formatDistanceToNow(endtime, localeWithSuffix),
formatDistance(starttime, endtime, { locale: 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') {
const 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) {
const inner = button.querySelector('.material-icons');
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);
}
export default function(view, params) {
function updateTasks(tasks) {
for (let i = 0; i < tasks.length; i++) {
const 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);
}
let pollInterval;
const serverId = ApiClient.serverId();
$('.divScheduledTasks', view).on('click', '.btnStartTask', function() {
const button = this;
const id = button.getAttribute('data-taskid');
ApiClient.startScheduledTask(id).then(function() {
updateTaskButton(button, 'Running');
reloadList(view);
});
});
$('.divScheduledTasks', view).on('click', '.btnStopTask', function() {
const button = this;
const 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);
});
}
/* eslint-enable indent */