Skip to content

Commit b0f47ea

Browse files
committed
Add support for creating a new task
1 parent ef38a51 commit b0f47ea

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import React, { useState } from 'react';
2+
import { Task } from '@/api/server/schedules/getServerSchedules';
3+
import TaskDetailsModal from '@/components/server/schedules/TaskDetailsModal';
4+
5+
interface Props {
6+
scheduleId: number;
7+
onTaskAdded: (task: Task) => void;
8+
}
9+
10+
export default ({ scheduleId, onTaskAdded }: Props) => {
11+
const [visible, setVisible] = useState(false);
12+
13+
return (
14+
<>
15+
{visible &&
16+
<TaskDetailsModal
17+
scheduleId={scheduleId}
18+
onDismissed={task => {
19+
task && onTaskAdded(task);
20+
setVisible(false);
21+
}}
22+
/>
23+
}
24+
<button className={'btn btn-primary btn-sm ml-4'} onClick={() => setVisible(true)}>
25+
New Task
26+
</button>
27+
</>
28+
);
29+
};

resources/scripts/components/server/schedules/ScheduleEditContainer.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { httpErrorToHuman } from '@/api/http';
1111
import ScheduleRow from '@/components/server/schedules/ScheduleRow';
1212
import ScheduleTaskRow from '@/components/server/schedules/ScheduleTaskRow';
1313
import EditScheduleModal from '@/components/server/schedules/EditScheduleModal';
14+
import NewTaskButton from '@/components/server/schedules/NewTaskButton';
1415

1516
interface Params {
1617
id: string;
@@ -65,9 +66,12 @@ export default ({ match, location: { state } }: RouteComponentProps<Params, {},
6566
<button className={'btn btn-secondary btn-sm'} onClick={() => setShowEditModal(true)}>
6667
Edit
6768
</button>
68-
<button className={'btn btn-primary btn-sm ml-4'}>
69-
New Task
70-
</button>
69+
<NewTaskButton
70+
scheduleId={schedule.id}
71+
onTaskAdded={task => setSchedule(s => ({
72+
...s!, tasks: [ ...s!.tasks, task ],
73+
}))}
74+
/>
7175
</div>
7276
{schedule?.tasks.length > 0 ?
7377
<>

resources/scripts/components/server/schedules/TaskDetailsModal.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { httpErrorToHuman } from '@/api/http';
1010
import Field from '@/components/elements/Field';
1111
import FormikFieldWrapper from '@/components/elements/FormikFieldWrapper';
1212
import FlashMessageRender from '@/components/FlashMessageRender';
13+
import { number, object, string } from 'yup';
1314

1415
interface Props {
1516
scheduleId: number;
@@ -52,6 +53,14 @@ export default ({ task, scheduleId, onDismissed }: Props) => {
5253
payload: task?.payload || '',
5354
timeOffset: task?.timeOffset.toString() || '0',
5455
}}
56+
validationSchema={object().shape({
57+
action: string().required().oneOf(['command', 'power']),
58+
payload: string().required('A task payload must be provided.'),
59+
timeOffset: number().typeError('The time offset must be a valid number between 0 and 900.')
60+
.required('A time offset value must be provided.')
61+
.min(0, 'The time offset must be at least 0 seconds.')
62+
.max(900, 'The time offset must be less than 900 seconds.'),
63+
})}
5564
>
5665
{({ values, isSubmitting }) => (
5766
<Modal

0 commit comments

Comments
 (0)