From 2bc7a3708244f6cae65e90b2e6101134fa3d0d97 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sat, 11 Jul 2026 11:45:18 +0330 Subject: [PATCH] taskphase crate and delete --- src/pages/taskmanager/components/Column.tsx | 23 +++++++++------ .../taskmanager/project/types/ProjectTypes.ts | 2 ++ .../task-phase/hooks/useTaskPhaseData.ts | 7 +++-- src/pages/taskmanager/workspace.tsx | 29 ++++++++++++++++--- 4 files changed, 45 insertions(+), 16 deletions(-) diff --git a/src/pages/taskmanager/components/Column.tsx b/src/pages/taskmanager/components/Column.tsx index 1e39afb..578df58 100644 --- a/src/pages/taskmanager/components/Column.tsx +++ b/src/pages/taskmanager/components/Column.tsx @@ -11,6 +11,7 @@ import Task from "./Task"; type Props = { column: ColumnType; + projectId: string; tasks: TaskType[]; draggedTaskId: string | null; draggedColumnId: string | null; @@ -26,6 +27,7 @@ type Props = { const Column: FC = ({ column, + projectId, tasks, draggedTaskId, draggedColumnId, @@ -129,16 +131,19 @@ const Column: FC = ({ }; const handleDeleteColumn = () => { - deleteTaskPhase.mutate(column.id, { - onSuccess: () => { - onColumnDeleted?.(column.id); - setIsDeleteConfirmOpen(false); - toast.success(t("taskmanager.column_deleted")); + deleteTaskPhase.mutate( + { id: column.id, projectId }, + { + onSuccess: () => { + onColumnDeleted?.(column.id); + setIsDeleteConfirmOpen(false); + toast.success(t("taskmanager.column_deleted")); + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error.message[0]); + }, }, - onError: (error: ErrorType) => { - toast.error(error.response?.data?.error.message[0]); - }, - }); + ); }; return ( diff --git a/src/pages/taskmanager/project/types/ProjectTypes.ts b/src/pages/taskmanager/project/types/ProjectTypes.ts index 5f97c05..fbda931 100644 --- a/src/pages/taskmanager/project/types/ProjectTypes.ts +++ b/src/pages/taskmanager/project/types/ProjectTypes.ts @@ -37,6 +37,8 @@ export type ProjectTaskType = unknown; export type ProjectTaskPhaseType = { id: string; name: string; + order: number; + color: string; tasks: ProjectTaskType[]; }; diff --git a/src/pages/taskmanager/task-phase/hooks/useTaskPhaseData.ts b/src/pages/taskmanager/task-phase/hooks/useTaskPhaseData.ts index 6c52fa3..2c62e35 100644 --- a/src/pages/taskmanager/task-phase/hooks/useTaskPhaseData.ts +++ b/src/pages/taskmanager/task-phase/hooks/useTaskPhaseData.ts @@ -11,6 +11,7 @@ export const useCreateTaskPhase = () => { queryClient.invalidateQueries({ queryKey: ["task-phases", variables.projectId], }); + queryClient.invalidateQueries({ queryKey: ["project", variables.projectId] }); }, }); }; @@ -19,9 +20,9 @@ export const useDeleteTaskPhase = () => { const queryClient = useQueryClient(); return useMutation({ - mutationFn: (id: string) => api.deleteTaskPhase(id), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["task-phases"] }); + mutationFn: ({ id }: { id: string; projectId: string }) => api.deleteTaskPhase(id), + onSuccess: (_data, variables) => { + queryClient.invalidateQueries({ queryKey: ["project", variables.projectId] }); }, }); }; diff --git a/src/pages/taskmanager/workspace.tsx b/src/pages/taskmanager/workspace.tsx index 98e314d..8905ab6 100644 --- a/src/pages/taskmanager/workspace.tsx +++ b/src/pages/taskmanager/workspace.tsx @@ -1,5 +1,6 @@ -import { useMemo, useState, type FC } from "react"; +import { useEffect, useMemo, useState, type FC } from "react"; import { useParams } from "react-router-dom"; +import PageLoading from "../../components/PageLoading"; import AddNewColumn from "./components/AddNewColumn"; import Column from "./components/Column"; import HeaderWorkspace from "./components/HeaderWorkspace"; @@ -7,14 +8,29 @@ import TaskDetailModal from "./components/task-detail/TaskDetailModal"; import tasksData from "./data/tasks.json"; import { useGetProject } from "./project/hooks/useProjectData"; import type { TaskPhaseItemType } from "./task-phase/types/TaskPhaseTypes"; -import type { Task, WorkspaceData } from "./types"; +import type { Column as ColumnType, Task } from "./types"; import { reorderColumns } from "./utils/reorderColumns"; import { reorderTasks } from "./utils/reorderTasks"; const Workspace: FC = () => { const { slug: projectId = "" } = useParams<{ slug: string }>(); - const { data: project } = useGetProject(projectId); - const [columns, setColumns] = useState((tasksData as WorkspaceData).columns); + const { data: project, isPending } = useGetProject(projectId); + const [columns, setColumns] = useState([]); + + useEffect(() => { + if (!project?.data?.taskPhases) return; + + setColumns( + [...project.data.taskPhases] + .sort((a, b) => a.order - b.order) + .map((phase) => ({ + id: phase.id, + title: phase.name, + color: phase.color, + order: phase.order, + })), + ); + }, [project?.data?.taskPhases]); const [tasks, setTasks] = useState(tasksData.tasks as Task[]); const [draggedTaskId, setDraggedTaskId] = useState(null); const [draggedColumnId, setDraggedColumnId] = useState(null); @@ -77,6 +93,10 @@ const Workspace: FC = () => { const selectedTaskColumn = selectedTask ? columns.find((column) => column.id === selectedTask.columnId) : null; + if (isPending) { + return ; + } + return (
@@ -86,6 +106,7 @@ const Workspace: FC = () => {