1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/src/controllers/dashboard/scheduledtasks/scheduledtask.js

247 lines
10 KiB
JavaScript
Raw Normal View History

import $ from 'jQuery';
import loading from 'loading';
import datetime from 'datetime';
import dom from 'dom';
import globalize from 'globalize';
import 'emby-input';
import 'emby-button';
import 'emby-select';
/* eslint-disable indent */
2018-10-23 01:05:09 +03:00
function fillTimeOfDay(select) {
2020-07-18 21:51:48 +01:00
const options = [];
2020-07-18 21:51:48 +01:00
for (let i = 0; i < 86400000; i += 900000) {
options.push({
name: ScheduledTaskPage.getDisplayTime(i * 10000),
value: i * 10000
});
}
select.innerHTML = options.map(function (o) {
return '<option value="' + o.value + '">' + o.name + '</option>';
2020-05-04 12:44:12 +02:00
}).join('');
2018-10-23 01:05:09 +03:00
}
Array.prototype.remove = function (from, to) {
2020-07-18 21:51:48 +01:00
const rest = this.slice((to || from) + 1 || this.length);
this.length = from < 0 ? this.length + from : from;
return this.push.apply(this, rest);
2018-10-23 01:05:09 +03:00
};
2020-07-18 21:51:48 +01:00
const ScheduledTaskPage = {
refreshScheduledTask: function (view) {
2018-10-23 01:05:09 +03:00
loading.show();
2020-07-18 21:51:48 +01:00
let id = getParameterByName('id');
ApiClient.getScheduledTask(id).then(function (task) {
ScheduledTaskPage.loadScheduledTask(view, task);
});
2018-10-23 01:05:09 +03:00
},
loadScheduledTask: function (view, task) {
2020-05-04 12:44:12 +02:00
$('.taskName', view).html(task.Name);
$('#pTaskDescription', view).html(task.Description);
2020-07-21 13:25:50 +01:00
import('listViewStyle').then(() => {
ScheduledTaskPage.loadTaskTriggers(view, task);
});
loading.hide();
2018-10-23 01:05:09 +03:00
},
loadTaskTriggers: function (context, task) {
2020-07-18 21:51:48 +01:00
let html = '';
2018-10-23 01:05:09 +03:00
html += '<div class="paperList">';
2020-07-18 21:51:48 +01:00
for (let i = 0, length = task.Triggers.length; i < length; i++) {
const trigger = task.Triggers[i];
html += '<div class="listItem listItem-border">';
2020-04-26 02:37:28 +03:00
html += '<span class="material-icons listItemIcon schedule"></span>';
if (trigger.MaxRuntimeMs) {
html += '<div class="listItemBody two-line">';
} else {
html += '<div class="listItemBody">';
}
2020-05-04 12:44:12 +02:00
html += "<div class='listItemBodyText'>" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + '</div>';
if (trigger.MaxRuntimeMs) {
2018-10-23 01:05:09 +03:00
html += '<div class="listItemBodyText secondary">';
2020-07-18 21:51:48 +01:00
const hours = trigger.MaxRuntimeTicks / 36e9;
if (hours == 1) {
2020-05-04 12:44:12 +02:00
html += globalize.translate('ValueTimeLimitSingleHour');
} else {
2020-05-04 12:44:12 +02:00
html += globalize.translate('ValueTimeLimitMultiHour', hours);
}
2020-05-04 12:44:12 +02:00
html += '</div>';
2018-10-23 01:05:09 +03:00
}
2020-05-04 12:44:12 +02:00
html += '</div>';
html += '<button class="btnDeleteTrigger" data-index="' + i + '" type="button" is="paper-icon-button-light" title="' + globalize.translate('ButtonDelete') + '"><span class="material-icons delete"></span></button>';
html += '</div>';
2018-10-23 01:05:09 +03:00
}
2020-05-04 12:44:12 +02:00
html += '</div>';
context.querySelector('.taskTriggers').innerHTML = html;
2018-10-23 01:05:09 +03:00
},
// TODO: Replace this mess with date-fns and remove datetime completely
getTriggerFriendlyName: function (trigger) {
2020-05-04 12:44:12 +02:00
if ('DailyTrigger' == trigger.Type) {
return globalize.translate('DailyAt', ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks));
}
2020-05-04 12:44:12 +02:00
if ('WeeklyTrigger' == trigger.Type) {
// TODO: The day of week isn't localised as well
2020-05-04 12:44:12 +02:00
return globalize.translate('WeeklyAt', trigger.DayOfWeek, ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks));
}
2020-05-04 12:44:12 +02:00
if ('SystemEventTrigger' == trigger.Type && 'WakeFromSleep' == trigger.SystemEvent) {
return globalize.translate('OnWakeFromSleep');
}
2020-05-04 12:44:12 +02:00
if (trigger.Type == 'IntervalTrigger') {
2020-07-18 21:51:48 +01:00
const hours = trigger.IntervalTicks / 36e9;
if (hours == 0.25) {
2020-05-04 12:44:12 +02:00
return globalize.translate('EveryXMinutes', '15');
}
if (hours == 0.5) {
2020-05-04 12:44:12 +02:00
return globalize.translate('EveryXMinutes', '30');
}
if (hours == 0.75) {
2020-05-04 12:44:12 +02:00
return globalize.translate('EveryXMinutes', '45');
}
if (hours == 1) {
2020-05-04 12:44:12 +02:00
return globalize.translate('EveryHour');
}
2020-05-04 12:44:12 +02:00
return globalize.translate('EveryXHours', hours);
}
2020-05-04 12:44:12 +02:00
if (trigger.Type == 'StartupTrigger') {
return globalize.translate('OnApplicationStartup');
2018-10-23 01:05:09 +03:00
}
return trigger.Type;
2018-10-23 01:05:09 +03:00
},
getDisplayTime: function (ticks) {
2020-07-18 21:51:48 +01:00
const ms = ticks / 1e4;
const now = new Date();
now.setHours(0, 0, 0, 0);
now.setTime(now.getTime() + ms);
return datetime.getDisplayTime(now);
2018-10-23 01:05:09 +03:00
},
showAddTriggerPopup: function (view) {
2020-05-04 12:44:12 +02:00
$('#selectTriggerType', view).val('DailyTrigger');
view.querySelector('#selectTriggerType').dispatchEvent(new CustomEvent('change', {}));
$('#popupAddTrigger', view).removeClass('hide');
2018-10-23 01:05:09 +03:00
},
confirmDeleteTrigger: function (view, index) {
2020-07-21 13:25:50 +01:00
import('confirm').then(({default: confirm}) => {
2020-06-18 22:41:43 +03:00
confirm.default(globalize.translate('MessageDeleteTaskTrigger'), globalize.translate('HeaderDeleteTaskTrigger')).then(function () {
ScheduledTaskPage.deleteTrigger(view, index);
});
});
2018-10-23 01:05:09 +03:00
},
deleteTrigger: function (view, index) {
2018-10-23 01:05:09 +03:00
loading.show();
2020-07-18 21:51:48 +01:00
let id = getParameterByName('id');
ApiClient.getScheduledTask(id).then(function (task) {
task.Triggers.remove(index);
ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
ScheduledTaskPage.refreshScheduledTask(view);
});
});
2018-10-23 01:05:09 +03:00
},
refreshTriggerFields: function (page, triggerType) {
2020-05-04 12:44:12 +02:00
if (triggerType == 'DailyTrigger') {
$('#fldTimeOfDay', page).show();
$('#fldDayOfWeek', page).hide();
$('#fldSelectSystemEvent', page).hide();
$('#fldSelectInterval', page).hide();
$('#selectTimeOfDay', page).attr('required', 'required');
} else if (triggerType == 'WeeklyTrigger') {
$('#fldTimeOfDay', page).show();
$('#fldDayOfWeek', page).show();
$('#fldSelectSystemEvent', page).hide();
$('#fldSelectInterval', page).hide();
$('#selectTimeOfDay', page).attr('required', 'required');
} else if (triggerType == 'SystemEventTrigger') {
$('#fldTimeOfDay', page).hide();
$('#fldDayOfWeek', page).hide();
$('#fldSelectSystemEvent', page).show();
$('#fldSelectInterval', page).hide();
$('#selectTimeOfDay', page).removeAttr('required');
} else if (triggerType == 'IntervalTrigger') {
$('#fldTimeOfDay', page).hide();
$('#fldDayOfWeek', page).hide();
$('#fldSelectSystemEvent', page).hide();
$('#fldSelectInterval', page).show();
$('#selectTimeOfDay', page).removeAttr('required');
} else if (triggerType == 'StartupTrigger') {
$('#fldTimeOfDay', page).hide();
$('#fldDayOfWeek', page).hide();
$('#fldSelectSystemEvent', page).hide();
$('#fldSelectInterval', page).hide();
$('#selectTimeOfDay', page).removeAttr('required');
}
2018-10-23 01:05:09 +03:00
},
getTriggerToAdd: function (page) {
2020-07-18 21:51:48 +01:00
const trigger = {
2020-05-04 12:44:12 +02:00
Type: $('#selectTriggerType', page).val()
2018-10-23 01:05:09 +03:00
};
2020-05-04 12:44:12 +02:00
if (trigger.Type == 'DailyTrigger') {
trigger.TimeOfDayTicks = $('#selectTimeOfDay', page).val();
} else if (trigger.Type == 'WeeklyTrigger') {
trigger.DayOfWeek = $('#selectDayOfWeek', page).val();
trigger.TimeOfDayTicks = $('#selectTimeOfDay', page).val();
} else if (trigger.Type == 'SystemEventTrigger') {
trigger.SystemEvent = $('#selectSystemEvent', page).val();
} else if (trigger.Type == 'IntervalTrigger') {
trigger.IntervalTicks = $('#selectInterval', page).val();
}
2020-07-18 21:51:48 +01:00
let timeLimit = $('#txtTimeLimit', page).val() || '0';
timeLimit = parseFloat(timeLimit) * 3600000;
trigger.MaxRuntimeMs = timeLimit || null;
return trigger;
2018-10-23 01:05:09 +03:00
}
};
export default function (view, params) {
2018-10-23 01:05:09 +03:00
function onSubmit(e) {
loading.show();
2020-07-18 21:51:48 +01:00
let id = getParameterByName('id');
ApiClient.getScheduledTask(id).then(function (task) {
task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view));
ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
2020-05-04 12:44:12 +02:00
$('#popupAddTrigger').addClass('hide');
ScheduledTaskPage.refreshScheduledTask(view);
});
});
e.preventDefault();
2018-10-23 01:05:09 +03:00
}
2020-05-04 12:44:12 +02:00
view.querySelector('.addTriggerForm').addEventListener('submit', onSubmit);
fillTimeOfDay(view.querySelector('#selectTimeOfDay'));
$(view.querySelector('#popupAddTrigger').parentNode).trigger('create');
view.querySelector('.selectTriggerType').addEventListener('change', function () {
ScheduledTaskPage.refreshTriggerFields(view, this.value);
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnAddTrigger').addEventListener('click', function () {
ScheduledTaskPage.showAddTriggerPopup(view);
});
2020-05-04 12:44:12 +02:00
view.addEventListener('click', function (e) {
2020-07-18 21:51:48 +01:00
const btnDeleteTrigger = dom.parentWithClass(e.target, 'btnDeleteTrigger');
if (btnDeleteTrigger) {
2020-05-04 12:44:12 +02:00
ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute('data-index')));
}
});
2020-05-04 12:44:12 +02:00
view.addEventListener('viewshow', function () {
ScheduledTaskPage.refreshScheduledTask(view);
});
}
/* eslint-enable indent */