diff --git a/src/config/Pages.ts b/src/config/Pages.ts index 45db021..c329c1f 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -169,7 +169,9 @@ export const Pages = { }, taskmanager: { workspace: "/taskmanager/workspace/", + workspaceList: "/workspace/list", createWorkspace: "/workspace/create", + updateWorkspace: "/workspace/update/", createProject: "/project/create", projectList: "/project/list", }, diff --git a/src/langs/fa.json b/src/langs/fa.json index b12c21a..a1eafc4 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -145,6 +145,7 @@ "access_logs_stats": "آمار لاگ‌ها", "access_logs_errors": "لاگ‌های خطا", "taskmanager_workspace": "فضای کاری", + "taskmanager_workspace_list": "لیست فضاهای کاری", "taskmanager_create_workspace": "ساخت فضای کاری جدید", "taskmanager_project_list": "لیست پروژه‌ها", "taskmanager_create_project": "افزودن پروژه" @@ -972,6 +973,7 @@ }, "cancel": "لغو", "taskmanager": { + "workspace_list": "لیست فضاهای کاری", "new_workspace": "ساخت فضای کاری جدید", "submit_workspace": "ثبت فضای کاری", "workspacename": "نام", diff --git a/src/pages/taskmanager/workspace/Create.tsx b/src/pages/taskmanager/workspace/Create.tsx index f3261b4..b4a5c9d 100644 --- a/src/pages/taskmanager/workspace/Create.tsx +++ b/src/pages/taskmanager/workspace/Create.tsx @@ -29,7 +29,7 @@ const CreateWorkspace: FC = () => { createWorkspace.mutate(values, { onSuccess: () => { toast.success(t("success")); - navigate(Pages.taskmanager.workspace + "dpage"); + navigate(Pages.taskmanager.workspaceList); }, onError: (error: ErrorType) => { toast.error(error.response?.data?.error.message[0]); diff --git a/src/pages/taskmanager/workspace/List.tsx b/src/pages/taskmanager/workspace/List.tsx new file mode 100644 index 0000000..923fc80 --- /dev/null +++ b/src/pages/taskmanager/workspace/List.tsx @@ -0,0 +1,86 @@ +import { FC } from "react"; +import { Add, Edit } from "iconsax-react"; +import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; +import Button from "../../../components/Button"; +import PageLoading from "../../../components/PageLoading"; +import Td from "../../../components/Td"; +import { Pages } from "../../../config/Pages"; +import { useGetWorkspaces } from "./hooks/useWorkspaceData"; +import { WorkspaceItemType } from "./types/WorkspaceTypes"; + +const WorkspaceList: FC = () => { + const { t } = useTranslation("global"); + const getWorkspaces = useGetWorkspaces(); + + const workspaces: WorkspaceItemType[] = + getWorkspaces.data?.data?.workspaces ?? + getWorkspaces.data?.data ?? + []; + + return ( +
+
+
{t("taskmanager.workspace_list")}
+ + + +
+ + {getWorkspaces.isPending ? ( + + ) : ( +
+ + + + + + + {workspaces.map((item) => ( + + + + + ))} + +
+ + + +
+
+
+ + {item.name} + +
+
+ + + + + +
+
+ )} +
+ ); +}; + +export default WorkspaceList; diff --git a/src/pages/taskmanager/workspace/hooks/useWorkspaceData.ts b/src/pages/taskmanager/workspace/hooks/useWorkspaceData.ts index 44df8ab..29ea12e 100644 --- a/src/pages/taskmanager/workspace/hooks/useWorkspaceData.ts +++ b/src/pages/taskmanager/workspace/hooks/useWorkspaceData.ts @@ -1,7 +1,14 @@ -import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import * as api from "../service/WorkspaceService"; import { CreateWorkspaceType } from "../types/WorkspaceTypes"; +export const useGetWorkspaces = () => { + return useQuery({ + queryKey: ["workspaces"], + queryFn: api.getWorkspacesByUser, + }); +}; + export const useCreateWorkspace = () => { const queryClient = useQueryClient(); diff --git a/src/pages/taskmanager/workspace/service/WorkspaceService.ts b/src/pages/taskmanager/workspace/service/WorkspaceService.ts index 5529c62..80cce22 100644 --- a/src/pages/taskmanager/workspace/service/WorkspaceService.ts +++ b/src/pages/taskmanager/workspace/service/WorkspaceService.ts @@ -1,6 +1,11 @@ import axios from "../../../../config/axios"; import { CreateWorkspaceType } from "../types/WorkspaceTypes"; +export const getWorkspacesByUser = async () => { + const { data } = await axios.get(`/task-manager/workspaces/byuser`); + return data; +}; + export const createWorkspace = async (params: CreateWorkspaceType) => { const { data } = await axios.post(`/task-manager/workspaces`, params); return data; diff --git a/src/pages/taskmanager/workspace/types/WorkspaceTypes.ts b/src/pages/taskmanager/workspace/types/WorkspaceTypes.ts index 4c790e7..524ae57 100644 --- a/src/pages/taskmanager/workspace/types/WorkspaceTypes.ts +++ b/src/pages/taskmanager/workspace/types/WorkspaceTypes.ts @@ -5,3 +5,13 @@ export type CreateWorkspaceType = { isActive: boolean; userIds: string[]; }; + +export type WorkspaceItemType = { + id: string; + name: string; + description?: string; + color: string; + isActive: boolean; +}; + +export type UpdateWorkspaceType = CreateWorkspaceType; diff --git a/src/router/Main.tsx b/src/router/Main.tsx index 7cb7399..0e72759 100644 --- a/src/router/Main.tsx +++ b/src/router/Main.tsx @@ -82,6 +82,7 @@ import CreateProject from "../pages/taskmanager/project/Create.tsx"; import ProjectList from "../pages/taskmanager/project/List.tsx"; import Workspace from "../pages/taskmanager/workspace.tsx"; import CreateWorkspace from "../pages/taskmanager/workspace/Create.tsx"; +import WorkspaceList from "../pages/taskmanager/workspace/List.tsx"; import TicketCategory from "../pages/ticket/Category"; import CreateTicket from "../pages/ticket/CreateTicket"; import TicketDetail from "../pages/ticket/Detail"; @@ -217,6 +218,7 @@ const MainRouter: FC = () => { } /> } /> + } /> } /> } /> } /> diff --git a/src/shared/SideBar.tsx b/src/shared/SideBar.tsx index a1b8225..6736fd0 100644 --- a/src/shared/SideBar.tsx +++ b/src/shared/SideBar.tsx @@ -73,6 +73,8 @@ const SideBar: FC = () => { const split = location.pathname.split("/"); const isTaskManagerRoute = location.pathname.startsWith(Pages.taskmanager.workspace) || + location.pathname === Pages.taskmanager.workspaceList || + location.pathname.startsWith(Pages.taskmanager.updateWorkspace) || location.pathname === Pages.taskmanager.createWorkspace || location.pathname === Pages.taskmanager.createProject || location.pathname === Pages.taskmanager.projectList; @@ -473,14 +475,14 @@ const SideBar: FC = () => { } - title={t("submenu.taskmanager_workspace")} - isActive={location.pathname.startsWith(Pages.taskmanager.workspace)} - link={Pages.taskmanager.workspace + "dpage"} + title={t("submenu.taskmanager_workspace_list")} + isActive={location.pathname === Pages.taskmanager.workspaceList} + link={Pages.taskmanager.workspaceList} name="taskmanager" activeName="" /> diff --git a/src/shared/components/TaskManagerSubMenu.tsx b/src/shared/components/TaskManagerSubMenu.tsx index 37eac21..de42db8 100644 --- a/src/shared/components/TaskManagerSubMenu.tsx +++ b/src/shared/components/TaskManagerSubMenu.tsx @@ -1,4 +1,4 @@ -import { Add, Category, Task } from "iconsax-react"; +import { Task } from "iconsax-react"; import { FC } from "react"; import { useTranslation } from "react-i18next"; import { useLocation } from "react-router-dom"; @@ -9,7 +9,10 @@ const TaskManagerSubMenu: FC = () => { const { t } = useTranslation("global"); const location = useLocation(); - const isWorkspaceActive = location.pathname.startsWith(Pages.taskmanager.workspace); + const isWorkspaceListActive = location.pathname === Pages.taskmanager.workspaceList; + const isKanbanActive = + location.pathname.startsWith(Pages.taskmanager.workspace) && + !isWorkspaceListActive; const isCreateWorkspaceActive = location.pathname === Pages.taskmanager.createWorkspace; const isProjectListActive = location.pathname === Pages.taskmanager.projectList; const isCreateProjectActive = location.pathname === Pages.taskmanager.createProject; @@ -22,9 +25,14 @@ const TaskManagerSubMenu: FC = () => {
+