From 53ad72732f781e6c6d5ddb3776ea47aec010af8e Mon Sep 17 00:00:00 2001 From: dujinkim Date: Mon, 4 Aug 2025 09:39:21 +0000 Subject: (최겸) PQ/실사 수정 및 개발 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pq/table/pq-lists-table.tsx | 170 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 lib/pq/table/pq-lists-table.tsx (limited to 'lib/pq/table/pq-lists-table.tsx') diff --git a/lib/pq/table/pq-lists-table.tsx b/lib/pq/table/pq-lists-table.tsx new file mode 100644 index 00000000..c5fd82a5 --- /dev/null +++ b/lib/pq/table/pq-lists-table.tsx @@ -0,0 +1,170 @@ +"use client" + +import * as React from "react" +import { useRouter } from "next/navigation" +import { toast } from "sonner" + +import { useDataTable } from "@/hooks/use-data-table" +import { DataTable } from "@/components/data-table/data-table" +import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar" +import { createPQListsColumns, type PQList } from "./pq-lists-columns" +import { + createPQListAction, + deletePQListsAction, + copyPQListAction, + togglePQListsAction, +} from "@/lib/pq/service" +import { CopyPqDialog } from "./copy-pq-list-dialog" +import { AddPqDialog } from "./add-pq-list-dialog" +import { PQListsToolbarActions } from "./pq-lists-toolbar" +import type { DataTableRowAction } from "@/types/table" + +interface Project { + id: number + name: string + code: string +} + +interface PqListsTableProps { + promises: Promise<[{ data: PQList[]; pageCount: number }, Project[]]> +} + +export function PqListsTable({ promises }: PqListsTableProps) { + const router = useRouter() + const [rowAction, setRowAction] = React.useState | null>(null) + const [createDialogOpen, setCreateDialogOpen] = React.useState(false) + const [copyDialogOpen, setCopyDialogOpen] = React.useState(false) + const [isPending, startTransition] = React.useTransition() + + const [{ data, pageCount }, projects] = React.use(promises) + const activePqLists = data.filter((item) => !item.isDeleted) + + const columns = React.useMemo(() => createPQListsColumns({ setRowAction }), [setRowAction]) + + const { table } = useDataTable({ + data, + columns, + pageCount, + enablePinning: true, + enableAdvancedFilter: false, + initialState: { + sorting: [{ id: "createdAt", desc: true }], + columnPinning: { right: ["actions"] }, + }, + getRowId: (row) => String(row.id), + shallow: false, + clearOnDefault: true, + }) + + const handleCreate = async (formData: { + name: string + type: "GENERAL" | "PROJECT" | "NON_INSPECTION" + projectId?: number | null + validTo?: Date | null + }) => { + startTransition(async () => { + const result = await createPQListAction(formData) + if (result.success) { + toast.success("PQ 목록이 생성되었습니다") + setCreateDialogOpen(false) + router.refresh() + } else { + toast.error(result.error || "PQ 목록 생성 실패") + } + }) + } + + const handleToggleActive = async (ids: number[], newIsDeleted: boolean) => { + startTransition(async () => { + const result = await togglePQListsAction(ids, newIsDeleted) + if (result.success) { + toast.success(newIsDeleted ? "PQ 목록이 비활성화되었습니다" : "PQ 목록이 활성화되었습니다") + router.refresh() + } else { + toast.error("PQ 목록 상태 변경 실패") + } + }) + } + + const handleDelete = async (ids: number[]) => { + startTransition(async () => { + const result = await deletePQListsAction(ids) + if (result.success) { + toast.success("PQ 목록이 삭제되었습니다") + router.refresh() + } else { + toast.error("PQ 목록 삭제 실패") + } + }) + } + + const handleCopy = async (copyData: { + sourcePqListId: number + targetProjectId: number + newName?: string + validTo?: Date | null + }) => { + startTransition(async () => { + const result = await copyPQListAction(copyData) + if (result.success) { + toast.success("PQ 목록이 복사되었습니다") + setCopyDialogOpen(false) + router.refresh() + } else { + toast.error("PQ 목록 복사 실패") + } + }) + } + + React.useEffect(() => { + if (!rowAction) return + const id = rowAction.row.original.id + switch (rowAction.type) { + case "view": + router.push(`/evcp/pq-criteria/${id}`) + break + case "delete": + handleDelete([id]) + break + } + setRowAction(null) + }, [rowAction]) + + return ( + <> + + + setCreateDialogOpen(true)} + onCopyClick={() => setCopyDialogOpen(true)} + onToggleActive={(rows, newIsDeleted) => + handleToggleActive(rows.map((r) => r.id), newIsDeleted) + } + /> + + + + + + + + ) +} -- cgit v1.2.3