From 21a99d9ec13773b5062da16bbc90c3d00037b411 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Thu, 9 Jul 2026 10:17:33 +0330 Subject: [PATCH] edit and delete workspace --- src/langs/fa.json | 1 + src/pages/taskmanager/workspace/List.tsx | 34 +++- src/pages/taskmanager/workspace/Update.tsx | 171 ++++++++++++++++++ .../workspace/hooks/useWorkspaceData.ts | 42 ++++- .../workspace/service/WorkspaceService.ts | 20 +- .../workspace/types/WorkspaceTypes.ts | 11 ++ src/router/Main.tsx | 2 + 7 files changed, 274 insertions(+), 7 deletions(-) create mode 100644 src/pages/taskmanager/workspace/Update.tsx diff --git a/src/langs/fa.json b/src/langs/fa.json index a1eafc4..94f0107 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -976,6 +976,7 @@ "workspace_list": "لیست فضاهای کاری", "new_workspace": "ساخت فضای کاری جدید", "submit_workspace": "ثبت فضای کاری", + "workspace_deleted": "فضای کاری با موفقیت حذف شد", "workspacename": "نام", "workspacetype": "نوع", "workspace_info": "اطلاعات", diff --git a/src/pages/taskmanager/workspace/List.tsx b/src/pages/taskmanager/workspace/List.tsx index 923fc80..16f2708 100644 --- a/src/pages/taskmanager/workspace/List.tsx +++ b/src/pages/taskmanager/workspace/List.tsx @@ -2,22 +2,40 @@ import { FC } from "react"; import { Add, Edit } from "iconsax-react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; +import { toast } from "react-toastify"; import Button from "../../../components/Button"; import PageLoading from "../../../components/PageLoading"; import Td from "../../../components/Td"; +import TrashWithConfrim from "../../../components/TrashWithConfrim"; import { Pages } from "../../../config/Pages"; -import { useGetWorkspaces } from "./hooks/useWorkspaceData"; +import { ErrorType } from "../../../helpers/types"; +import { + useDeleteWorkspace, + useGetWorkspaces, +} from "./hooks/useWorkspaceData"; import { WorkspaceItemType } from "./types/WorkspaceTypes"; const WorkspaceList: FC = () => { const { t } = useTranslation("global"); const getWorkspaces = useGetWorkspaces(); + const deleteWorkspace = useDeleteWorkspace(); const workspaces: WorkspaceItemType[] = getWorkspaces.data?.data?.workspaces ?? getWorkspaces.data?.data ?? []; + const handleDelete = (id: string) => { + deleteWorkspace.mutate(id, { + onSuccess: () => { + toast.success(t("taskmanager.workspace_deleted")); + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error.message[0]); + }, + }); + }; + return (
@@ -42,7 +60,7 @@ const WorkspaceList: FC = () => { - + @@ -69,9 +87,15 @@ const WorkspaceList: FC = () => { } /> - - - +
+ + + + handleDelete(item.id)} + isLoading={deleteWorkspace.isPending} + /> +
))} diff --git a/src/pages/taskmanager/workspace/Update.tsx b/src/pages/taskmanager/workspace/Update.tsx new file mode 100644 index 0000000..feea07b --- /dev/null +++ b/src/pages/taskmanager/workspace/Update.tsx @@ -0,0 +1,171 @@ +import { FC, useEffect, useState } from "react"; +import { TickCircle } from "iconsax-react"; +import { useFormik } from "formik"; +import { useTranslation } from "react-i18next"; +import { useNavigate, useParams } from "react-router-dom"; +import { toast } from "react-toastify"; +import * as Yup from "yup"; +import Button from "../../../components/Button"; +import Input from "../../../components/Input"; +import PageLoading from "../../../components/PageLoading"; +import Textarea from "../../../components/Textarea"; +import { Pages } from "../../../config/Pages"; +import { ErrorType } from "../../../helpers/types"; +import { + useGetWorkspaceDetail, + useUpdateWorkspace, +} from "./hooks/useWorkspaceData"; +import { UpdateWorkspaceType, WorkspaceDetailType } from "./types/WorkspaceTypes"; +import CreateWorkspaceSidebar, { + SelectedUser, +} from "./components/CreateWorkspaceSidebar"; + +const UpdateWorkspace: FC = () => { + const { t } = useTranslation("global"); + const { id } = useParams(); + const navigate = useNavigate(); + const getWorkspaceDetail = useGetWorkspaceDetail(id || ""); + const updateWorkspace = useUpdateWorkspace(); + + const [isActive, setIsActive] = useState(true); + const [selectedColor, setSelectedColor] = useState("#A8E6CF"); + const [selectedUsers, setSelectedUsers] = useState([]); + + const workspace: WorkspaceDetailType | undefined = + getWorkspaceDetail.data?.data?.workspace ?? + getWorkspaceDetail.data?.data; + + const handleUpdateWorkspace = (values: UpdateWorkspaceType) => { + if (!id) return; + + updateWorkspace.mutate( + { + id, + params: values, + }, + { + onSuccess: () => { + toast.success(t("success")); + navigate(Pages.taskmanager.workspaceList); + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error.message[0]); + }, + }, + ); + }; + + const formik = useFormik>({ + initialValues: { + name: "", + description: "", + }, + validationSchema: Yup.object({ + name: Yup.string().required(t("errors.required")), + description: Yup.string(), + }), + onSubmit: (values) => { + handleUpdateWorkspace({ + ...values, + color: selectedColor, + isActive, + userIds: selectedUsers.map((user) => user.id), + }); + }, + }); + + useEffect(() => { + if (!workspace) return; + + formik.setValues({ + name: workspace.name, + description: workspace.description ?? "", + }); + setIsActive(workspace.isActive); + setSelectedColor(workspace.color); + + if (workspace.users?.length) { + setSelectedUsers( + workspace.users.map((user) => ({ + id: user.id, + name: `${user.firstName} ${user.lastName}`, + })), + ); + } else if (workspace.userIds?.length) { + setSelectedUsers( + workspace.userIds.map((userId) => ({ + id: userId, + name: userId, + })), + ); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [workspace]); + + if (getWorkspaceDetail.isPending) { + return ; + } + + return ( +
+
+
{t("edit")}
+
+ +
+
+ +
+
+
+
{t("taskmanager.workspace_info")}
+ +
+ +
+ +
+