diff --git a/frontend/src/App.js b/frontend/src/App.js index 1cfcd516e..0015db3a4 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -12,6 +12,7 @@ import CoursesEditPage from "main/pages/CoursesEditPage"; import AdminUsersPage from "main/pages/AdminUsersPage"; import AdminJobsPage from "main/pages/AdminJobsPage"; import SchoolIndexPage from "main/pages/SchoolIndexPage"; +import SchoolEditPage from "main/pages/SchoolEditPage"; import CoursesCreatePage from "main/pages/CoursesCreatePage"; import CourseIndexPage from "main/pages/CourseIndexPage"; @@ -25,6 +26,7 @@ function App() { const adminRoutes = hasRole(currentUser, "ROLE_ADMIN") ? ( <> } /> + } /> } /> } /> diff --git a/frontend/src/main/components/School/SchoolTable.js b/frontend/src/main/components/School/SchoolTable.js index eb9c77909..b000aad31 100644 --- a/frontend/src/main/components/School/SchoolTable.js +++ b/frontend/src/main/components/School/SchoolTable.js @@ -13,7 +13,7 @@ import React from "react"; const navigate = useNavigate(); const editCallback = (cell) => { - navigate(`/schools/edit/${cell.row.values.abbrev}`); + navigate(`/admin/schools/edit/${cell.row.values.abbrev}`); }; // Stryker disable all : hard to test for query caching diff --git a/frontend/src/main/pages/SchoolEditPage.js b/frontend/src/main/pages/SchoolEditPage.js new file mode 100644 index 000000000..4282a8f04 --- /dev/null +++ b/frontend/src/main/pages/SchoolEditPage.js @@ -0,0 +1,70 @@ +import BasicLayout from "main/layouts/BasicLayout/BasicLayout"; +import { useParams } from "react-router-dom"; +import SchoolForm from "main/components/School/SchoolForm"; +import { Navigate } from 'react-router-dom' +import { useBackend, useBackendMutation } from "main/utils/useBackend"; +import { toast } from "react-toastify"; + +export default function SchoolEditPage({storybook=false}) { + let { abbrev } = useParams(); + + const { data: school, _error, _status } = + useBackend( + // Stryker disable next-line all : don't test internal caching of React Query + [`/api/schools?abbrev=${abbrev}`], + { // Stryker disable next-line all : GET is the default, so changing this to "" doesn't introduce a bug + method: "GET", + url: `/api/schools`, + params: { + abbrev + } + } + ); + + + const objectToAxiosPutParams = (school) => ({ + url: "/api/schools/update", + method: "PUT", + params: { + abbrev: school.abbrev, + }, + data: { + name: school.name, + termRegex: school.termRegex, + termDescription: school.termDescription, + termError: school.termError + }, + }); + + const onSuccess = (school) => { + toast(`School Updated - abbrev: ${school.abbrev} name: ${school.name}`); + } + + const mutation = useBackendMutation( + objectToAxiosPutParams, + { onSuccess }, + // Stryker disable next-line all : hard to set up test for caching + [`/api/schools/update?abbrev=${abbrev}`] + ); + + const { isSuccess } = mutation + + const onSubmit = async (data) => { + mutation.mutate(data); + } + + if (isSuccess && !storybook) { + return + } + + return ( + +
+

Edit School

+ { + school && + } +
+
+ ) +} diff --git a/frontend/src/main/pages/SchoolIndexPage.js b/frontend/src/main/pages/SchoolIndexPage.js index f292e729e..12d4291eb 100644 --- a/frontend/src/main/pages/SchoolIndexPage.js +++ b/frontend/src/main/pages/SchoolIndexPage.js @@ -15,7 +15,7 @@ export default function SchoolIndexPage() { return (