diff --git a/resources/scripts/api/server/schedules/getServerSchedule.ts b/resources/scripts/api/server/schedules/getServerSchedule.ts new file mode 100644 index 00000000..e69de29b diff --git a/resources/scripts/components/server/schedules/EditScheduleModal.tsx b/resources/scripts/components/server/schedules/EditScheduleModal.tsx new file mode 100644 index 00000000..76a1e910 --- /dev/null +++ b/resources/scripts/components/server/schedules/EditScheduleModal.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { Schedule } from '@/api/server/schedules/getServerSchedules'; +import Modal, { RequiredModalProps } from '@/components/elements/Modal'; + +type Props = { + schedule?: Schedule; +} & RequiredModalProps; + +export default ({ schedule, ...props }: Props) => { + return ( + +

Testing

+
+ ); +}; diff --git a/resources/scripts/components/server/schedules/ScheduleContainer.tsx b/resources/scripts/components/server/schedules/ScheduleContainer.tsx index 02772c57..332bb9f0 100644 --- a/resources/scripts/components/server/schedules/ScheduleContainer.tsx +++ b/resources/scripts/components/server/schedules/ScheduleContainer.tsx @@ -1,24 +1,25 @@ -import React, { useEffect, useState } from 'react'; +import React, { useMemo, useState } from 'react'; import getServerSchedules, { Schedule } from '@/api/server/schedules/getServerSchedules'; import { ServerContext } from '@/state/server'; import Spinner from '@/components/elements/Spinner'; -import { Link } from 'react-router-dom'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faCalendarAlt } from '@fortawesome/free-solid-svg-icons/faCalendarAlt'; -import classNames from 'classnames'; -import format from 'date-fns/format'; +import { Link, RouteComponentProps } from 'react-router-dom'; import FlashMessageRender from '@/components/FlashMessageRender'; +import ScheduleRow from '@/components/server/schedules/ScheduleRow'; +import { httpErrorToHuman } from '@/api/http'; import { Actions, useStoreActions } from 'easy-peasy'; import { ApplicationStore } from '@/state'; -import { httpErrorToHuman } from '@/api/http'; +import EditScheduleModal from '@/components/server/schedules/EditScheduleModal'; -export default () => { +interface Params { + schedule?: string; +} + +export default ({ history, match, location: { hash } }: RouteComponentProps) => { const { id, uuid } = ServerContext.useStoreState(state => state.server.data!); const [ schedules, setSchedules ] = useState(null); + const { clearFlashes, addError } = useStoreActions((actions: Actions) => actions.flashes); - const { addError, clearFlashes } = useStoreActions((actions: Actions) => actions.flashes); - - useEffect(() => { + useMemo(() => { clearFlashes('schedules'); getServerSchedules(uuid) .then(schedules => setSchedules(schedules)) @@ -26,7 +27,9 @@ export default () => { addError({ message: httpErrorToHuman(error), key: 'schedules' }); console.error(error); }); - }, [ uuid, setSchedules ]); + }, [ setSchedules ]); + + const matched = (schedules || []).find(schedule => schedule.id === Number(hash.match(/\d+$/) || 0)); return (
@@ -35,49 +38,23 @@ export default () => { : schedules.map(schedule => ( - -
- -
-
-

{schedule.name}

-

- Last run at: {schedule.lastRunAt ? format(schedule.lastRunAt, 'MMM Do [at] h:mma') : 'never'} -

-
-
-
-

{schedule.cron.minute}

-

Minute

-
-
-

{schedule.cron.hour}

-

Hour

-
-
-

{schedule.cron.dayOfMonth}

-

Day (Month)

-
-
-

*

-

Month

-
-
-

{schedule.cron.dayOfWeek}

-

Day (Week)

-
-
-
-

- {schedule.isActive ? 'Active' : 'Inactive'} -

-
+ + )) } + {matched && + history.push(match.url)} + /> + }
); }; diff --git a/resources/scripts/components/server/schedules/ScheduleRow.tsx b/resources/scripts/components/server/schedules/ScheduleRow.tsx new file mode 100644 index 00000000..2636906f --- /dev/null +++ b/resources/scripts/components/server/schedules/ScheduleRow.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { Schedule } from '@/api/server/schedules/getServerSchedules'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faCalendarAlt } from '@fortawesome/free-solid-svg-icons/faCalendarAlt'; +import format from 'date-fns/format'; +import classNames from 'classnames'; + +export default ({ schedule }: { schedule: Schedule }) => ( + <> +
+ +
+
+

{schedule.name}

+

+ Last run + at: {schedule.lastRunAt ? format(schedule.lastRunAt, 'MMM Do [at] h:mma') : 'never'} +

+
+
+
+

{schedule.cron.minute}

+

Minute

+
+
+

{schedule.cron.hour}

+

Hour

+
+
+

{schedule.cron.dayOfMonth}

+

Day (Month)

+
+
+

*

+

Month

+
+
+

{schedule.cron.dayOfWeek}

+

Day (Week)

+
+
+
+

+ {schedule.isActive ? 'Active' : 'Inactive'} +

+
+ +);