diff --git a/src/frontend/src/api/CreateProjectService.ts b/src/frontend/src/api/CreateProjectService.ts index e6b192e517..493eb946a4 100755 --- a/src/frontend/src/api/CreateProjectService.ts +++ b/src/frontend/src/api/CreateProjectService.ts @@ -1,4 +1,5 @@ import axios from 'axios'; +import { API } from '@/api'; import { CreateProjectActions } from '@/store/slices/CreateProjectSlice'; import { ProjectDetailsModel, @@ -519,6 +520,46 @@ const ValidateCustomForm: Function = (url: string, formUpload: any) => { await validateCustomForm(url, formUpload); }; }; + +const DeleteProjectService: Function = (url: string) => { + return async (dispatch) => { + const deleteProject = async (url: string) => { + try { + await API.delete(url); + dispatch( + CommonActions.SetSnackBar({ + open: true, + message: 'Project deleted. Redirecting...', + variant: 'success', + duration: 2000, + }), + ); + // Redirect to homepage + setTimeout(() => { + window.location.href = '/'; + }, 2000); + } catch (error) { + if (error.response.status === 404) { + dispatch( + CommonActions.SetSnackBar({ + open: true, + message: 'Project already deleted', + variant: 'success', + duration: 2000, + }), + ); + } else { + console.log(error); + console.log('Project deletion failed.'); + } + } + }; + + await deleteProject(url); + // TODO extra cleanup required? + }; +}; + export { UploadAreaService, CreateProjectService, @@ -534,4 +575,5 @@ export { PostFormUpdate, EditProjectBoundaryService, ValidateCustomForm, + DeleteProjectService, }; diff --git a/src/frontend/src/components/MapDescriptionComponents.jsx b/src/frontend/src/components/MapDescriptionComponents.jsx index 98f738dff2..83b3501a38 100755 --- a/src/frontend/src/components/MapDescriptionComponents.jsx +++ b/src/frontend/src/components/MapDescriptionComponents.jsx @@ -5,7 +5,7 @@ import CoreModules from '@/shared/CoreModules'; const MapDescriptionComponents = ({ type, state, defaultTheme }) => { const descriptionData = [ { - value: 'Descriptions', + value: 'Description', element: {state.projectInfo.description}, }, // { diff --git a/src/frontend/src/components/editproject/DeleteProject.tsx b/src/frontend/src/components/editproject/DeleteProject.tsx new file mode 100644 index 0000000000..ebe679a641 --- /dev/null +++ b/src/frontend/src/components/editproject/DeleteProject.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import CoreModules from '@/shared/CoreModules'; +import { DeleteProjectService } from '@/api/CreateProjectService'; + +const DeleteProject = ({ projectId }) => { + const dispatch = CoreModules.useAppDispatch(); + + const handleSubmit = (e) => { + e.preventDefault(); + dispatch(DeleteProjectService(`/projects/${projectId}`)); + }; + + return ( +
+ + + + } + variant="contained" + color="error" + > + Delete + + + + +
+ ); +}; + +export default DeleteProject; diff --git a/src/frontend/src/constants/EditProjectSidebarContent.ts b/src/frontend/src/constants/EditProjectSidebarContent.ts index cd93e9fcbc..f4886d9cef 100644 --- a/src/frontend/src/constants/EditProjectSidebarContent.ts +++ b/src/frontend/src/constants/EditProjectSidebarContent.ts @@ -21,6 +21,11 @@ const SidebarContent: ISidebarContent[] = [ name: 'Update Project Boundary', slug: 'update-project-boundary', }, + { + id: 4, + name: 'Delete Project', + slug: 'delete-project', + }, ]; export default SidebarContent; diff --git a/src/frontend/src/routes.jsx b/src/frontend/src/routes.jsx index c900c4b48f..3cb51b0e03 100755 --- a/src/frontend/src/routes.jsx +++ b/src/frontend/src/routes.jsx @@ -315,6 +315,18 @@ const routes = createBrowserRouter([ ), }, + { + path: 'edit-project/delete/:projectId', + element: ( + + Loading...}> + + + + + + ), + }, { path: '/osmauth/', element: ( diff --git a/src/frontend/src/views/EditProject.tsx b/src/frontend/src/views/EditProject.tsx index 41ae4f2032..6cb0678bb5 100755 --- a/src/frontend/src/views/EditProject.tsx +++ b/src/frontend/src/views/EditProject.tsx @@ -9,6 +9,7 @@ import SidebarContent from '@/constants/EditProjectSidebarContent'; import { useNavigate } from 'react-router-dom'; import UpdateForm from '@/components/editproject/UpdateForm'; import UpdateProjectArea from '@/components/editproject/UpdateProjectArea'; +import DeleteProject from '@/components/editproject/DeleteProject'; const EditProject: React.FC = () => { const dispatch = CoreModules.useAppDispatch(); @@ -86,6 +87,7 @@ const EditProject: React.FC = () => { {selectedTab === 'project-description' ? : null} {selectedTab === 'form-update' ? : null} {selectedTab === 'update-project-boundary' ? : null} + {selectedTab === 'delete-project' ? : null}