From eda518fd948e2c0998ef5f52bf247dbe3ea8e647 Mon Sep 17 00:00:00 2001 From: Tymoteusz Czech <2625371+Tymek@users.noreply.github.com> Date: Tue, 13 Aug 2024 17:05:58 +0200 Subject: [PATCH] feat: dialogs for project revive and delete --- .../NewProjectCard/ProjectArchiveCard.tsx | 61 +++++++---------- .../ProjectCardFooter/ProjectCardFooter.tsx | 1 - .../ProjectModeBadge/ProjectModeBadge.tsx | 2 +- .../ProjectList/ArchiveProjectList.tsx | 66 ++++++++++++++++++- .../DeleteProjectDialog.tsx | 30 +++++++++ .../ReviveProjectDialog.tsx | 30 +++++++++ 6 files changed, 150 insertions(+), 40 deletions(-) create mode 100644 frontend/src/component/project/ProjectList/DeleteProjectDialog/DeleteProjectDialog.tsx create mode 100644 frontend/src/component/project/ProjectList/ReviveProjectDialog/ReviveProjectDialog.tsx diff --git a/frontend/src/component/project/NewProjectCard/ProjectArchiveCard.tsx b/frontend/src/component/project/NewProjectCard/ProjectArchiveCard.tsx index 8a7a3421582a..6545b15a7fc9 100644 --- a/frontend/src/component/project/NewProjectCard/ProjectArchiveCard.tsx +++ b/frontend/src/component/project/NewProjectCard/ProjectArchiveCard.tsx @@ -22,26 +22,25 @@ import TimeAgo from 'react-timeago'; import { Box, Link, Tooltip } from '@mui/material'; import { Link as RouterLink } from 'react-router-dom'; import { - CREATE_PROJECT, DELETE_PROJECT, + UPDATE_PROJECT, } from 'component/providers/AccessProvider/permissions'; import Undo from '@mui/icons-material/Undo'; import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton'; import Delete from '@mui/icons-material/Delete'; -interface IProjectArchiveCardProps { +export type ProjectArchiveCardProps = { id: string; name: string; - createdAt?: string; archivedAt?: string; featureCount: number; onRevive: () => void; onDelete: () => void; - mode: string; + mode?: string; owners?: ProjectSchemaOwners; -} +}; -export const ProjectArchiveCard: FC = ({ +export const ProjectArchiveCard: FC = ({ id, name, archivedAt, @@ -52,29 +51,6 @@ export const ProjectArchiveCard: FC = ({ owners, }) => { const { locationSettings } = useLocationSettings(); - const Actions: FC<{ - id: string; - }> = ({ id }) => ( - - - - - - - - - ); return ( @@ -131,13 +107,26 @@ export const ProjectArchiveCard: FC = ({ /> - - + + + + + + + + + ); diff --git a/frontend/src/component/project/NewProjectCard/ProjectCardFooter/ProjectCardFooter.tsx b/frontend/src/component/project/NewProjectCard/ProjectCardFooter/ProjectCardFooter.tsx index 002339b17a7b..b1947feb0033 100644 --- a/frontend/src/component/project/NewProjectCard/ProjectCardFooter/ProjectCardFooter.tsx +++ b/frontend/src/component/project/NewProjectCard/ProjectCardFooter/ProjectCardFooter.tsx @@ -10,7 +10,6 @@ interface IProjectCardFooterProps { id: string; isFavorite?: boolean; children?: React.ReactNode; - Actions?: FC<{ id: string; isFavorite?: boolean }>; disabled?: boolean; owners: IProjectOwnersProps['owners']; } diff --git a/frontend/src/component/project/NewProjectCard/ProjectModeBadge/ProjectModeBadge.tsx b/frontend/src/component/project/NewProjectCard/ProjectModeBadge/ProjectModeBadge.tsx index f3e46ea67d9f..243b34544155 100644 --- a/frontend/src/component/project/NewProjectCard/ProjectModeBadge/ProjectModeBadge.tsx +++ b/frontend/src/component/project/NewProjectCard/ProjectModeBadge/ProjectModeBadge.tsx @@ -5,7 +5,7 @@ import { HtmlTooltip } from 'component/common/HtmlTooltip/HtmlTooltip'; import { Badge } from 'component/common/Badge/Badge'; interface IProjectModeBadgeProps { - mode: 'private' | 'protected' | 'public' | string; + mode?: 'private' | 'protected' | 'public' | string; } export const ProjectModeBadge: FC = ({ mode }) => { diff --git a/frontend/src/component/project/ProjectList/ArchiveProjectList.tsx b/frontend/src/component/project/ProjectList/ArchiveProjectList.tsx index 1a4feeb9def3..ec49f861ac4e 100644 --- a/frontend/src/component/project/ProjectList/ArchiveProjectList.tsx +++ b/frontend/src/component/project/ProjectList/ArchiveProjectList.tsx @@ -9,7 +9,12 @@ import { styled, useMediaQuery } from '@mui/material'; import theme from 'themes/theme'; import { Search } from 'component/common/Search/Search'; import { ProjectGroup } from './ProjectGroup'; -import { ProjectArchiveCard } from '../NewProjectCard/ProjectArchiveCard'; +import { + ProjectArchiveCard, + type ProjectArchiveCardProps, +} from '../NewProjectCard/ProjectArchiveCard'; +import { ReviveProjectDialog } from './ReviveProjectDialog/ReviveProjectDialog'; +import { DeleteProjectDialogue } from '../Project/DeleteProject/DeleteProjectDialogue'; const StyledApiError = styled(ApiError)(({ theme }) => ({ maxWidth: '500px', @@ -32,6 +37,15 @@ export const ArchiveProjectList: FC = () => { const [searchValue, setSearchValue] = useState( searchParams.get('search') || '', ); + const [reviveProject, setReviveProject] = useState<{ + isOpen: boolean; + id?: string; + name?: string; + }>({ isOpen: false }); + const [deleteProject, setDeleteProject] = useState<{ + isOpen: boolean; + id?: string; + }>({ isOpen: false }); useEffect(() => { const tableState: PageQueryType = {}; @@ -44,6 +58,31 @@ export const ArchiveProjectList: FC = () => { }); }, [searchValue, setSearchParams]); + const onRevive = (id: string) => { + setReviveProject({ + isOpen: true, + id, + name: projects?.find((project) => project.id === id)?.name, + }); + }; + const onDelete = (id: string) => { + setDeleteProject({ + id, + isOpen: true, + }); + }; + + const ProjectCard: FC< + Omit + > = ({ id, ...props }) => ( + onRevive(id)} + onDelete={() => onDelete(id)} + id={id} + {...props} + /> + ); + return ( { searchValue={searchValue} projects={projects} placeholder='No archived projects found' - ProjectCardComponent={ProjectArchiveCard} + ProjectCardComponent={ProjectCard} link={false} /> + + setReviveProject((state) => ({ ...state, isOpen: false })) + } + onSubmit={() => { + // TODO: toast + setReviveProject((state) => ({ ...state, isOpen: false })); + }} + /> + { + setDeleteProject((state) => ({ ...state, isOpen: false })); + }} + onSuccess={() => { + // TODO: toast + setDeleteProject((state) => ({ ...state, isOpen: false })); + }} + /> ); }; diff --git a/frontend/src/component/project/ProjectList/DeleteProjectDialog/DeleteProjectDialog.tsx b/frontend/src/component/project/ProjectList/DeleteProjectDialog/DeleteProjectDialog.tsx new file mode 100644 index 000000000000..638ed3356226 --- /dev/null +++ b/frontend/src/component/project/ProjectList/DeleteProjectDialog/DeleteProjectDialog.tsx @@ -0,0 +1,30 @@ +import { Dialogue } from 'component/common/Dialogue/Dialogue'; + +type DeleteProjectDialogProps = { + name?: string; + id?: string; + open: boolean; + onClose: () => void; + onSubmit: () => void; +}; + +export const DeleteProjectDialog = ({ + name, + id, + open, + onClose, + onSubmit, +}: DeleteProjectDialogProps) => ( + + Are you sure you'd like to delete project {name} (id:{' '} + {id})? + {/* TODO: more explanation */} + +); diff --git a/frontend/src/component/project/ProjectList/ReviveProjectDialog/ReviveProjectDialog.tsx b/frontend/src/component/project/ProjectList/ReviveProjectDialog/ReviveProjectDialog.tsx new file mode 100644 index 000000000000..48157d4b1420 --- /dev/null +++ b/frontend/src/component/project/ProjectList/ReviveProjectDialog/ReviveProjectDialog.tsx @@ -0,0 +1,30 @@ +import { Dialogue } from 'component/common/Dialogue/Dialogue'; + +type ReviveProjectDialogProps = { + name?: string; + id?: string; + open: boolean; + onClose: () => void; + onSubmit: () => void; +}; + +export const ReviveProjectDialog = ({ + name, + id, + open, + onClose, + onSubmit, +}: ReviveProjectDialogProps) => ( + + Are you sure you'd like to restore project {name} (id:{' '} + {id})? + {/* TODO: more explanation */} + +);