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

237 lines
10 KiB
JavaScript
Raw Normal View History

2025-01-23 17:24:58 -05:00
import loading from 'components/loading/loading';
import datetime from 'scripts/datetime';
import dom from 'scripts/dom';
import globalize from 'lib/globalize';
import 'elements/emby-input/emby-input';
import 'elements/emby-button/emby-button';
import 'elements/emby-select/emby-select';
import confirm from 'components/confirm/confirm';
import { getParameterByName } from 'utils/url.ts';
2023-04-19 01:56:05 -04:00
function fillTimeOfDay(select) {
const options = [];
2018-10-23 01:05:09 +03:00
2023-04-19 01:56:05 -04:00
for (let i = 0; i < 86400000; i += 900000) {
options.push({
name: ScheduledTaskPage.getDisplayTime(i * 10000),
value: i * 10000
});
2018-10-23 01:05:09 +03:00
}
2023-04-19 01:56:05 -04:00
select.innerHTML = options.map(function (o) {
return '<option value="' + o.value + '">' + o.name + '</option>';
}).join('');
}
const ScheduledTaskPage = {
refreshScheduledTask: function (view) {
loading.show();
const id = getParameterByName('id');
ApiClient.getScheduledTask(id).then(function (task) {
ScheduledTaskPage.loadScheduledTask(view, task);
});
},
loadScheduledTask: function (view, task) {
view.querySelector('.taskName').innerHTML = task.Name;
view.querySelector('#pTaskDescription').innerHTML = task.Description;
2025-01-23 17:24:58 -05:00
import('components/listview/listview.scss').then(() => {
2023-04-19 01:56:05 -04:00
ScheduledTaskPage.loadTaskTriggers(view, task);
});
2023-04-19 01:56:05 -04:00
loading.hide();
},
loadTaskTriggers: function (context, task) {
let html = '';
html += '<div class="paperList">';
for (let i = 0, length = task.Triggers.length; i < length; i++) {
const trigger = task.Triggers[i];
html += '<div class="listItem listItem-border">';
html += '<span class="material-icons listItemIcon schedule" aria-hidden="true"></span>';
2023-06-16 19:17:06 +05:30
if (trigger.MaxRuntimeTicks) {
2023-04-19 01:56:05 -04:00
html += '<div class="listItemBody two-line">';
} else {
html += '<div class="listItemBody">';
}
html += "<div class='listItemBodyText'>" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + '</div>';
2023-06-16 19:17:06 +05:30
if (trigger.MaxRuntimeTicks) {
2023-04-19 01:56:05 -04:00
html += '<div class="listItemBodyText secondary">';
const hours = trigger.MaxRuntimeTicks / 36e9;
if (hours == 1) {
html += globalize.translate('ValueTimeLimitSingleHour');
} else {
2023-04-19 01:56:05 -04:00
html += globalize.translate('ValueTimeLimitMultiHour', hours);
2018-10-23 01:05:09 +03:00
}
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>';
2023-04-19 01:56:05 -04:00
html += '<button class="btnDeleteTrigger" data-index="' + i + '" type="button" is="paper-icon-button-light" title="' + globalize.translate('Delete') + '"><span class="material-icons delete" aria-hidden="true"></span></button>';
html += '</div>';
}
2023-04-19 01:56:05 -04:00
html += '</div>';
context.querySelector('.taskTriggers').innerHTML = html;
},
// TODO: Replace this mess with date-fns and remove datetime completely
getTriggerFriendlyName: function (trigger) {
if (trigger.Type == 'DailyTrigger') {
return globalize.translate('DailyAt', ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks));
}
2023-04-19 01:56:05 -04:00
if (trigger.Type == 'WeeklyTrigger') {
// TODO: The day of week isn't localised as well
return globalize.translate('WeeklyAt', trigger.DayOfWeek, ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks));
}
2023-04-19 01:56:05 -04:00
if (trigger.Type == 'SystemEventTrigger' && trigger.SystemEvent == 'WakeFromSleep') {
return globalize.translate('OnWakeFromSleep');
}
2023-04-19 01:56:05 -04:00
if (trigger.Type == 'IntervalTrigger') {
const hours = trigger.IntervalTicks / 36e9;
2023-04-19 01:56:05 -04:00
if (hours == 0.25) {
return globalize.translate('EveryXMinutes', '15');
}
2023-04-19 01:56:05 -04:00
if (hours == 0.5) {
return globalize.translate('EveryXMinutes', '30');
2018-10-23 01:05:09 +03:00
}
2023-04-19 01:56:05 -04:00
if (hours == 0.75) {
return globalize.translate('EveryXMinutes', '45');
}
2023-04-19 01:56:05 -04:00
if (hours == 1) {
return globalize.translate('EveryHour');
}
2023-04-19 01:56:05 -04:00
return globalize.translate('EveryXHours', hours);
2018-10-23 01:05:09 +03:00
}
2023-04-19 01:56:05 -04:00
if (trigger.Type == 'StartupTrigger') {
return globalize.translate('OnApplicationStartup');
2018-10-23 01:05:09 +03:00
}
2023-04-19 01:56:05 -04:00
return trigger.Type;
},
getDisplayTime: function (ticks) {
const ms = ticks / 1e4;
const now = new Date();
now.setHours(0, 0, 0, 0);
now.setTime(now.getTime() + ms);
return datetime.getDisplayTime(now);
},
showAddTriggerPopup: function (view) {
view.querySelector('#selectTriggerType').value = 'DailyTrigger';
2023-04-19 01:56:05 -04:00
view.querySelector('#selectTriggerType').dispatchEvent(new CustomEvent('change', {}));
view.querySelector('#popupAddTrigger').classList.remove('hide');
2023-04-19 01:56:05 -04:00
},
confirmDeleteTrigger: function (view, index) {
confirm(globalize.translate('MessageDeleteTaskTrigger'), globalize.translate('HeaderDeleteTaskTrigger')).then(function () {
ScheduledTaskPage.deleteTrigger(view, index);
});
2023-04-19 01:56:05 -04:00
},
deleteTrigger: function (view, index) {
loading.show();
const id = getParameterByName('id');
ApiClient.getScheduledTask(id).then(function (task) {
2023-07-06 14:46:14 -04:00
task.Triggers.splice(index, 1);
2023-04-19 01:56:05 -04:00
ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
ScheduledTaskPage.refreshScheduledTask(view);
});
});
2023-04-19 01:56:05 -04:00
},
refreshTriggerFields: function (page, triggerType) {
if (triggerType == 'DailyTrigger') {
page.querySelector('#fldTimeOfDay').classList.remove('hide');
page.querySelector('#fldDayOfWeek').classList.add('hide');
page.querySelector('#fldSelectSystemEvent').classList.add('hide');
page.querySelector('#fldSelectInterval').classList.add('hide');
page.querySelector('#selectTimeOfDay').setAttribute('required', 'required');
2023-04-19 01:56:05 -04:00
} else if (triggerType == 'WeeklyTrigger') {
page.querySelector('#fldTimeOfDay').classList.remove('hide');
page.querySelector('#fldDayOfWeek').classList.remove('hide');
page.querySelector('#fldSelectSystemEvent').classList.add('hide');
page.querySelector('#fldSelectInterval').classList.add('hide');
page.querySelector('#selectTimeOfDay').setAttribute('required', 'required');
2023-04-19 01:56:05 -04:00
} else if (triggerType == 'SystemEventTrigger') {
page.querySelector('#fldTimeOfDay').classList.add('hide');
page.querySelector('#fldDayOfWeek').classList.add('hide');
page.querySelector('#fldSelectSystemEvent').classList.remove('hide');
page.querySelector('#fldSelectInterval').classList.add('hide');
page.querySelector('#selectTimeOfDay').removeAttribute('required');
2023-04-19 01:56:05 -04:00
} else if (triggerType == 'IntervalTrigger') {
page.querySelector('#fldTimeOfDay').classList.add('hide');
page.querySelector('#fldDayOfWeek').classList.add('hide');
page.querySelector('#fldSelectSystemEvent').classList.add('hide');
page.querySelector('#fldSelectInterval').classList.remove('hide');
page.querySelector('#selectTimeOfDay').removeAttribute('required');
2023-04-19 01:56:05 -04:00
} else if (triggerType == 'StartupTrigger') {
page.querySelector('#fldTimeOfDay').classList.add('hide');
page.querySelector('#fldDayOfWeek').classList.add('hide');
page.querySelector('#fldSelectSystemEvent').classList.add('hide');
page.querySelector('#fldSelectInterval').classList.add('hide');
page.querySelector('#selectTimeOfDay').removeAttribute('required');
2023-04-19 01:56:05 -04:00
}
},
getTriggerToAdd: function (page) {
const trigger = {
Type: page.querySelector('#selectTriggerType').value
2023-04-19 01:56:05 -04:00
};
if (trigger.Type == 'DailyTrigger') {
trigger.TimeOfDayTicks = page.querySelector('#selectTimeOfDay').value;
2023-04-19 01:56:05 -04:00
} else if (trigger.Type == 'WeeklyTrigger') {
trigger.DayOfWeek = page.querySelector('#selectDayOfWeek').value;
trigger.TimeOfDayTicks = page.querySelector('#selectTimeOfDay').value;
2023-04-19 01:56:05 -04:00
} else if (trigger.Type == 'SystemEventTrigger') {
trigger.SystemEvent = page.querySelector('#selectSystemEvent').value;
2023-04-19 01:56:05 -04:00
} else if (trigger.Type == 'IntervalTrigger') {
trigger.IntervalTicks = page.querySelector('#selectInterval').value;
2023-04-19 01:56:05 -04:00
}
let timeLimit = page.querySelector('#txtTimeLimit').value || '0';
2023-04-19 01:56:05 -04:00
timeLimit = parseFloat(timeLimit) * 3600000;
2023-06-16 19:17:06 +05:30
trigger.MaxRuntimeTicks = timeLimit * 1e4 || null;
2023-04-19 01:56:05 -04:00
return trigger;
}
};
export default function (view) {
function onSubmit(e) {
loading.show();
const id = getParameterByName('id');
ApiClient.getScheduledTask(id).then(function (task) {
task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view));
ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () {
document.querySelector('#popupAddTrigger').classList.add('hide');
2023-04-19 01:56:05 -04:00
ScheduledTaskPage.refreshScheduledTask(view);
});
});
2023-04-19 01:56:05 -04:00
e.preventDefault();
}
2023-04-19 01:56:05 -04:00
view.querySelector('.addTriggerForm').addEventListener('submit', onSubmit);
fillTimeOfDay(view.querySelector('#selectTimeOfDay'));
view.querySelector('#popupAddTrigger').parentNode.trigger(new Event('create'));
2023-04-19 01:56:05 -04:00
view.querySelector('.selectTriggerType').addEventListener('change', function () {
ScheduledTaskPage.refreshTriggerFields(view, this.value);
});
view.querySelector('.btnAddTrigger').addEventListener('click', function () {
ScheduledTaskPage.showAddTriggerPopup(view);
});
view.addEventListener('click', function (e) {
const btnDeleteTrigger = dom.parentWithClass(e.target, 'btnDeleteTrigger');
if (btnDeleteTrigger) {
ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute('data-index'), 10));
}
});
view.addEventListener('viewshow', function () {
ScheduledTaskPage.refreshScheduledTask(view);
});
}