From b0f47ea01aed854a7fe4fabb9d73a01c9294c9e2 Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Wed, 18 Mar 2020 22:36:19 -0700 Subject: [PATCH] Add support for creating a new task --- .../server/schedules/NewTaskButton.tsx | 29 +++++++++++++++++++ .../schedules/ScheduleEditContainer.tsx | 10 +++++-- .../server/schedules/TaskDetailsModal.tsx | 9 ++++++ 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 resources/scripts/components/server/schedules/NewTaskButton.tsx diff --git a/resources/scripts/components/server/schedules/NewTaskButton.tsx b/resources/scripts/components/server/schedules/NewTaskButton.tsx new file mode 100644 index 000000000..f7c776e8b --- /dev/null +++ b/resources/scripts/components/server/schedules/NewTaskButton.tsx @@ -0,0 +1,29 @@ +import React, { useState } from 'react'; +import { Task } from '@/api/server/schedules/getServerSchedules'; +import TaskDetailsModal from '@/components/server/schedules/TaskDetailsModal'; + +interface Props { + scheduleId: number; + onTaskAdded: (task: Task) => void; +} + +export default ({ scheduleId, onTaskAdded }: Props) => { + const [visible, setVisible] = useState(false); + + return ( + <> + {visible && + { + task && onTaskAdded(task); + setVisible(false); + }} + /> + } + + + ); +}; diff --git a/resources/scripts/components/server/schedules/ScheduleEditContainer.tsx b/resources/scripts/components/server/schedules/ScheduleEditContainer.tsx index 7ee73ab26..3c2481912 100644 --- a/resources/scripts/components/server/schedules/ScheduleEditContainer.tsx +++ b/resources/scripts/components/server/schedules/ScheduleEditContainer.tsx @@ -11,6 +11,7 @@ import { httpErrorToHuman } from '@/api/http'; import ScheduleRow from '@/components/server/schedules/ScheduleRow'; import ScheduleTaskRow from '@/components/server/schedules/ScheduleTaskRow'; import EditScheduleModal from '@/components/server/schedules/EditScheduleModal'; +import NewTaskButton from '@/components/server/schedules/NewTaskButton'; interface Params { id: string; @@ -65,9 +66,12 @@ export default ({ match, location: { state } }: RouteComponentProps setShowEditModal(true)}> Edit - + setSchedule(s => ({ + ...s!, tasks: [ ...s!.tasks, task ], + }))} + /> {schedule?.tasks.length > 0 ? <> diff --git a/resources/scripts/components/server/schedules/TaskDetailsModal.tsx b/resources/scripts/components/server/schedules/TaskDetailsModal.tsx index dbe819338..216c6163e 100644 --- a/resources/scripts/components/server/schedules/TaskDetailsModal.tsx +++ b/resources/scripts/components/server/schedules/TaskDetailsModal.tsx @@ -10,6 +10,7 @@ import { httpErrorToHuman } from '@/api/http'; import Field from '@/components/elements/Field'; import FormikFieldWrapper from '@/components/elements/FormikFieldWrapper'; import FlashMessageRender from '@/components/FlashMessageRender'; +import { number, object, string } from 'yup'; interface Props { scheduleId: number; @@ -52,6 +53,14 @@ export default ({ task, scheduleId, onDismissed }: Props) => { payload: task?.payload || '', timeOffset: task?.timeOffset.toString() || '0', }} + validationSchema={object().shape({ + action: string().required().oneOf(['command', 'power']), + payload: string().required('A task payload must be provided.'), + timeOffset: number().typeError('The time offset must be a valid number between 0 and 900.') + .required('A time offset value must be provided.') + .min(0, 'The time offset must be at least 0 seconds.') + .max(900, 'The time offset must be less than 900 seconds.'), + })} > {({ values, isSubmitting }) => (