2025-02-22 16:45:48 +03:00
|
|
|
import React, { FunctionComponent, useCallback, useMemo, useState } from 'react';
|
|
|
|
import Dialog from '@mui/material/Dialog';
|
|
|
|
import Button from '@mui/material/Button';
|
|
|
|
import DialogActions from '@mui/material/DialogActions';
|
|
|
|
import DialogContent from '@mui/material/DialogContent';
|
|
|
|
import DialogTitle from '@mui/material/DialogTitle';
|
|
|
|
import MenuItem from '@mui/material/MenuItem';
|
|
|
|
import Stack from '@mui/material/Stack';
|
|
|
|
import TextField from '@mui/material/TextField';
|
|
|
|
import type { TaskTriggerInfo } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info';
|
|
|
|
import { TaskTriggerInfoType } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info-type';
|
|
|
|
import { DayOfWeek } from '@jellyfin/sdk/lib/generated-client/models/day-of-week';
|
|
|
|
import globalize from 'lib/globalize';
|
2025-02-23 14:39:15 +03:00
|
|
|
import { getIntervalOptions, getTimeOfDayOptions } from '../utils/edit';
|
2025-02-22 16:45:48 +03:00
|
|
|
import { useLocale } from 'hooks/useLocale';
|
|
|
|
|
|
|
|
type IProps = {
|
|
|
|
open: boolean,
|
|
|
|
title: string,
|
|
|
|
onClose?: () => void,
|
2025-02-23 14:54:25 +03:00
|
|
|
onAdd?: (trigger: TaskTriggerInfo) => void
|
2025-02-22 16:45:48 +03:00
|
|
|
};
|
|
|
|
|
2025-02-23 14:54:25 +03:00
|
|
|
const NewTriggerForm: FunctionComponent<IProps> = ({ open, title, onClose, onAdd }: IProps) => {
|
2025-02-22 16:45:48 +03:00
|
|
|
const { dateFnsLocale } = useLocale();
|
2025-02-23 17:13:56 +03:00
|
|
|
const [triggerType, setTriggerType] = useState<TaskTriggerInfoType>(TaskTriggerInfoType.DailyTrigger);
|
2025-02-22 16:45:48 +03:00
|
|
|
|
|
|
|
const timeOfDayOptions = useMemo(() => getTimeOfDayOptions(dateFnsLocale), [dateFnsLocale]);
|
2025-02-23 14:39:15 +03:00
|
|
|
const intervalOptions = useMemo(() => getIntervalOptions(dateFnsLocale), [dateFnsLocale]);
|
|
|
|
|
2025-02-22 16:45:48 +03:00
|
|
|
const onTriggerTypeChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
|
2025-02-23 17:13:56 +03:00
|
|
|
setTriggerType(e.target.value as TaskTriggerInfoType);
|
2025-02-22 16:45:48 +03:00
|
|
|
}, []);
|
|
|
|
|
2025-02-23 14:54:25 +03:00
|
|
|
const onSubmit = useCallback((e: React.FormEvent<HTMLFormElement>) => {
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
|
|
const formData = new FormData(e.currentTarget);
|
|
|
|
const data = Object.fromEntries(formData.entries());
|
|
|
|
const trigger: TaskTriggerInfo = {
|
|
|
|
Type: data.TriggerType.toString() as TaskTriggerInfoType
|
|
|
|
};
|
|
|
|
|
|
|
|
if (trigger.Type == TaskTriggerInfoType.WeeklyTrigger) {
|
|
|
|
trigger.DayOfWeek = data.DayOfWeek.toString() as DayOfWeek;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (trigger.Type == TaskTriggerInfoType.DailyTrigger || trigger.Type == TaskTriggerInfoType.WeeklyTrigger) {
|
|
|
|
trigger.TimeOfDayTicks = parseInt(data.TimeOfDay.toString(), 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (trigger.Type == TaskTriggerInfoType.IntervalTrigger) {
|
|
|
|
trigger.IntervalTicks = parseInt(data.Interval.toString(), 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data.TimeLimit.toString()) {
|
2025-02-23 17:13:56 +03:00
|
|
|
trigger.MaxRuntimeTicks = parseFloat(data.TimeLimit.toString()) * 36e9;
|
2025-02-23 14:54:25 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (onAdd) {
|
|
|
|
onAdd(trigger);
|
|
|
|
}
|
2025-02-23 17:13:56 +03:00
|
|
|
}, [ onAdd ]);
|
2025-02-23 14:54:25 +03:00
|
|
|
|
2025-02-22 16:45:48 +03:00
|
|
|
return (
|
|
|
|
<Dialog
|
|
|
|
open={open}
|
|
|
|
maxWidth={'xs'}
|
|
|
|
fullWidth
|
|
|
|
PaperProps={{
|
|
|
|
component: 'form',
|
2025-02-23 14:54:25 +03:00
|
|
|
onSubmit: onSubmit
|
2025-02-22 16:45:48 +03:00
|
|
|
}}
|
|
|
|
>
|
|
|
|
<DialogTitle>{title}</DialogTitle>
|
|
|
|
|
|
|
|
<DialogContent>
|
|
|
|
<Stack spacing={3}>
|
|
|
|
<TextField
|
|
|
|
name='TriggerType'
|
|
|
|
select
|
|
|
|
fullWidth
|
|
|
|
value={triggerType}
|
|
|
|
onChange={onTriggerTypeChange}
|
|
|
|
label={globalize.translate('LabelTriggerType')}
|
|
|
|
>
|
2025-02-23 17:13:56 +03:00
|
|
|
<MenuItem value={TaskTriggerInfoType.DailyTrigger}>{globalize.translate('OptionDaily')}</MenuItem>
|
|
|
|
<MenuItem value={TaskTriggerInfoType.WeeklyTrigger}>{globalize.translate('OptionWeekly')}</MenuItem>
|
|
|
|
<MenuItem value={TaskTriggerInfoType.IntervalTrigger}>{globalize.translate('OptionOnInterval')}</MenuItem>
|
|
|
|
<MenuItem value={TaskTriggerInfoType.StartupTrigger}>{globalize.translate('OnApplicationStartup')}</MenuItem>
|
2025-02-22 16:45:48 +03:00
|
|
|
</TextField>
|
|
|
|
|
2025-02-23 17:13:56 +03:00
|
|
|
{triggerType == TaskTriggerInfoType.WeeklyTrigger && (
|
2025-02-22 16:45:48 +03:00
|
|
|
<TextField
|
|
|
|
name='DayOfWeek'
|
|
|
|
select
|
|
|
|
fullWidth
|
2025-02-23 17:13:56 +03:00
|
|
|
defaultValue={DayOfWeek.Sunday}
|
2025-02-22 16:45:48 +03:00
|
|
|
label={globalize.translate('LabelDay')}
|
|
|
|
>
|
2025-02-23 17:13:56 +03:00
|
|
|
<MenuItem value={DayOfWeek.Sunday}>{globalize.translate('Sunday')}</MenuItem>
|
|
|
|
<MenuItem value={DayOfWeek.Monday}>{globalize.translate('Monday')}</MenuItem>
|
|
|
|
<MenuItem value={DayOfWeek.Tuesday}>{globalize.translate('Tuesday')}</MenuItem>
|
|
|
|
<MenuItem value={DayOfWeek.Wednesday}>{globalize.translate('Wednesday')}</MenuItem>
|
|
|
|
<MenuItem value={DayOfWeek.Thursday}>{globalize.translate('Thursday')}</MenuItem>
|
|
|
|
<MenuItem value={DayOfWeek.Friday}>{globalize.translate('Friday')}</MenuItem>
|
|
|
|
<MenuItem value={DayOfWeek.Saturday}>{globalize.translate('Saturday')}</MenuItem>
|
2025-02-22 16:45:48 +03:00
|
|
|
</TextField>
|
|
|
|
)}
|
|
|
|
|
2025-02-23 17:13:56 +03:00
|
|
|
{(triggerType == TaskTriggerInfoType.DailyTrigger || triggerType == TaskTriggerInfoType.WeeklyTrigger) && (
|
2025-02-22 16:45:48 +03:00
|
|
|
<TextField
|
|
|
|
name='TimeOfDay'
|
|
|
|
select
|
|
|
|
fullWidth
|
|
|
|
defaultValue={'0'}
|
|
|
|
label={globalize.translate('LabelTime')}
|
|
|
|
>
|
|
|
|
{timeOfDayOptions.map((option) => {
|
2025-02-23 14:54:25 +03:00
|
|
|
return <MenuItem
|
|
|
|
key={option.value}
|
|
|
|
value={option.value}
|
|
|
|
>{option.name}</MenuItem>;
|
2025-02-22 16:45:48 +03:00
|
|
|
})}
|
|
|
|
</TextField>
|
|
|
|
)}
|
|
|
|
|
2025-02-23 17:13:56 +03:00
|
|
|
{triggerType == TaskTriggerInfoType.IntervalTrigger && (
|
2025-02-22 16:45:48 +03:00
|
|
|
<TextField
|
|
|
|
name='Interval'
|
|
|
|
select
|
|
|
|
fullWidth
|
2025-02-23 14:39:15 +03:00
|
|
|
defaultValue={intervalOptions[0].value}
|
2025-02-22 16:45:48 +03:00
|
|
|
label={globalize.translate('LabelEveryXMinutes')}
|
|
|
|
>
|
2025-02-23 14:39:15 +03:00
|
|
|
{intervalOptions.map((option) => {
|
2025-02-23 14:54:25 +03:00
|
|
|
return <MenuItem
|
|
|
|
key={option.value}
|
|
|
|
value={option.value}
|
|
|
|
>{option.name}</MenuItem>;
|
2025-02-23 14:39:15 +03:00
|
|
|
})}
|
2025-02-22 16:45:48 +03:00
|
|
|
</TextField>
|
|
|
|
)}
|
|
|
|
|
|
|
|
<TextField
|
|
|
|
name='TimeLimit'
|
|
|
|
fullWidth
|
|
|
|
defaultValue={''}
|
|
|
|
type='number'
|
|
|
|
inputProps={{
|
|
|
|
min: 1,
|
|
|
|
step: 0.5
|
|
|
|
}}
|
|
|
|
label={globalize.translate('LabelTimeLimitHours')}
|
|
|
|
/>
|
|
|
|
</Stack>
|
|
|
|
</DialogContent>
|
|
|
|
|
|
|
|
<DialogActions>
|
|
|
|
<Button
|
|
|
|
onClick={onClose}
|
|
|
|
color='error'
|
|
|
|
>{globalize.translate('ButtonCancel')}</Button>
|
|
|
|
<Button type='submit'>{globalize.translate('Add')}</Button>
|
|
|
|
</DialogActions>
|
|
|
|
</Dialog>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default NewTriggerForm;
|