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/features/tasks/components/NewTriggerForm.tsx

174 lines
7.5 KiB
TypeScript
Raw Normal View History

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
2025-02-23 22:34:03 +03:00
onClose={onClose}
2025-02-22 16:45:48 +03:00
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'
label={globalize.translate('LabelTimeLimitHours')}
2025-03-26 10:33:35 +01:00
slotProps={{
htmlInput: {
min: 1,
step: 0.5
}
}}
2025-02-22 16:45:48 +03:00
/>
</Stack>
</DialogContent>
<DialogActions>
<Button
onClick={onClose}
color='error'
>{globalize.translate('ButtonCancel')}</Button>
<Button type='submit'>{globalize.translate('Add')}</Button>
</DialogActions>
</Dialog>
);
};
export default NewTriggerForm;