1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
This commit is contained in:
viown 2025-02-23 14:54:25 +03:00
parent 934a05cffa
commit 145c0700b1
7 changed files with 48 additions and 46 deletions

View file

@ -13,11 +13,6 @@ const fetchTask = async (
params: ScheduledTasksApiGetTaskRequest, params: ScheduledTasksApiGetTaskRequest,
options?: AxiosRequestConfig options?: AxiosRequestConfig
) => { ) => {
if (!api) {
console.warn('[fetchTasks] No API instance available');
return;
}
const response = await getScheduledTasksApi(api).getTask(params, options); const response = await getScheduledTasksApi(api).getTask(params, options);
return response.data; return response.data;

View file

@ -22,7 +22,7 @@ export const useTasks = (params?: ScheduledTasksApiGetTasksRequest) => {
const { api } = useApi(); const { api } = useApi();
return useQuery({ return useQuery({
queryKey: [QUERY_KEY], queryKey: [ QUERY_KEY ],
queryFn: ({ signal }) => queryFn: ({ signal }) =>
fetchTasks(api!, params, { signal }), fetchTasks(api!, params, { signal }),
enabled: !!api enabled: !!api

View file

@ -3,7 +3,7 @@ import { getScheduledTasksApi } from '@jellyfin/sdk/lib/utils/api/scheduled-task
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi'; import { useApi } from 'hooks/useApi';
import { queryClient } from 'utils/query/queryClient'; import { queryClient } from 'utils/query/queryClient';
import { QUERY_KEY } from './useTasks'; import { QUERY_KEY } from './useTask';
export const useUpdateTask = () => { export const useUpdateTask = () => {
const { api } = useApi(); const { api } = useApi();

View file

@ -18,21 +18,50 @@ type IProps = {
open: boolean, open: boolean,
title: string, title: string,
onClose?: () => void, onClose?: () => void,
onSubmit?: (trigger: TaskTriggerInfo) => void onAdd?: (trigger: TaskTriggerInfo) => void
}; };
const NewTriggerForm: FunctionComponent<IProps> = ({ open, title, onClose, onSubmit }: IProps) => { const NewTriggerForm: FunctionComponent<IProps> = ({ open, title, onClose, onAdd }: IProps) => {
const { dateFnsLocale } = useLocale(); const { dateFnsLocale } = useLocale();
const [triggerType, setTriggerType] = useState('DailyTrigger'); const [triggerType, setTriggerType] = useState('DailyTrigger');
const timeOfDayOptions = useMemo(() => getTimeOfDayOptions(dateFnsLocale), [dateFnsLocale]); const timeOfDayOptions = useMemo(() => getTimeOfDayOptions(dateFnsLocale), [dateFnsLocale]);
const intervalOptions = useMemo(() => getIntervalOptions(dateFnsLocale), [dateFnsLocale]); const intervalOptions = useMemo(() => getIntervalOptions(dateFnsLocale), [dateFnsLocale]);
const onTriggerTypeChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => { const onTriggerTypeChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
setTriggerType(e.target.value); setTriggerType(e.target.value);
}, []); }, []);
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()) {
trigger.MaxRuntimeTicks = parseFloat(data.TimeLimit.toString()) * 3600000 * 1e4;
}
if (onAdd) {
onAdd(trigger);
}
}, [onAdd]);
return ( return (
<Dialog <Dialog
open={open} open={open}
@ -40,35 +69,7 @@ const NewTriggerForm: FunctionComponent<IProps> = ({ open, title, onClose, onSub
fullWidth fullWidth
PaperProps={{ PaperProps={{
component: 'form', component: 'form',
onSubmit: (e: React.FormEvent<HTMLFormElement>) => { onSubmit: onSubmit
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()) {
trigger.MaxRuntimeTicks = parseFloat(data.TimeLimit.toString()) * 3600000 * 1e4;
}
if (onSubmit) {
onSubmit(trigger);
}
}
}} }}
> >
<DialogTitle>{title}</DialogTitle> <DialogTitle>{title}</DialogTitle>
@ -116,7 +117,10 @@ const NewTriggerForm: FunctionComponent<IProps> = ({ open, title, onClose, onSub
label={globalize.translate('LabelTime')} label={globalize.translate('LabelTime')}
> >
{timeOfDayOptions.map((option) => { {timeOfDayOptions.map((option) => {
return <MenuItem key={option.value} value={option.value}>{option.name}</MenuItem>; return <MenuItem
key={option.value}
value={option.value}
>{option.name}</MenuItem>;
})} })}
</TextField> </TextField>
)} )}
@ -130,7 +134,10 @@ const NewTriggerForm: FunctionComponent<IProps> = ({ open, title, onClose, onSub
label={globalize.translate('LabelEveryXMinutes')} label={globalize.translate('LabelEveryXMinutes')}
> >
{intervalOptions.map((option) => { {intervalOptions.map((option) => {
return <MenuItem key={option.value} value={option.value}>{option.name}</MenuItem>; return <MenuItem
key={option.value}
value={option.value}
>{option.name}</MenuItem>;
})} })}
</TextField> </TextField>
)} )}

View file

@ -1,4 +1,4 @@
export const INTERVAL_DURATION: number[] = [ export const INTERVAL_DURATIONS: number[] = [
9000000000, // 15 minutes 9000000000, // 15 minutes
18000000000, // 30 minutes 18000000000, // 30 minutes
27000000000, // 45 minutes 27000000000, // 45 minutes

View file

@ -1,7 +1,7 @@
import type { TaskTriggerInfo } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info'; import type { TaskTriggerInfo } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info';
import { format, formatDistanceStrict, Locale, parse } from 'date-fns'; import { format, formatDistanceStrict, Locale, parse } from 'date-fns';
import globalize from 'lib/globalize'; import globalize from 'lib/globalize';
import { INTERVAL_DURATION } from '../constants/intervalDuration'; import { INTERVAL_DURATIONS } from '../constants/intervalDurations';
function getDisplayTime(ticks: number, locale: Locale) { function getDisplayTime(ticks: number, locale: Locale) {
const ms = ticks / 1e4; const ms = ticks / 1e4;
@ -27,7 +27,7 @@ export function getTimeOfDayOptions(locale: Locale) {
export function getIntervalOptions(locale: Locale) { export function getIntervalOptions(locale: Locale) {
const options = []; const options = [];
for (const ticksDuration of INTERVAL_DURATION) { for (const ticksDuration of INTERVAL_DURATIONS) {
const durationMs = Math.floor(ticksDuration / 1e4); const durationMs = Math.floor(ticksDuration / 1e4);
const unit = durationMs < 36e5 ? 'minute' : 'hour'; const unit = durationMs < 36e5 ? 'minute' : 'hour';
options.push({ options.push({

View file

@ -60,7 +60,7 @@ const TaskEdit = () => {
setIsAddTriggerDialogOpen(false); setIsAddTriggerDialogOpen(false);
}, []); }, []);
const onNewTriggerSubmit = useCallback((trigger: TaskTriggerInfo) => { const onNewTriggerAdd = useCallback((trigger: TaskTriggerInfo) => {
if (task?.Triggers && task?.Id) { if (task?.Triggers && task?.Id) {
const triggers = [...task.Triggers, trigger]; const triggers = [...task.Triggers, trigger];
@ -150,7 +150,7 @@ const TaskEdit = () => {
open={isAddTriggerDialogOpen} open={isAddTriggerDialogOpen}
title={globalize.translate('ButtonAddScheduledTaskTrigger')} title={globalize.translate('ButtonAddScheduledTaskTrigger')}
onClose={handleNewTriggerDialogClose} onClose={handleNewTriggerDialogClose}
onSubmit={onNewTriggerSubmit} onAdd={onNewTriggerAdd}
/> />
<Box className='content-primary'> <Box className='content-primary'>
<Box className='readOnlyContent'> <Box className='readOnlyContent'>