From cf8dac0c6490469dab88a560004b0c07dbd48612 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Thu, 18 Sep 2025 00:23:40 +0000 Subject: (대표님) rfq, 계약, 서명 등 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/itb/table/purchase-requests-table.tsx | 229 ++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 lib/itb/table/purchase-requests-table.tsx (limited to 'lib/itb/table/purchase-requests-table.tsx') diff --git a/lib/itb/table/purchase-requests-table.tsx b/lib/itb/table/purchase-requests-table.tsx new file mode 100644 index 00000000..88f27666 --- /dev/null +++ b/lib/itb/table/purchase-requests-table.tsx @@ -0,0 +1,229 @@ +// components/purchase-requests/purchase-requests-table.tsx +"use client"; + +import * as React from "react"; +import { useRouter } from "next/navigation"; +import { Button } from "@/components/ui/button"; +import { Plus, RefreshCw, FileText } from "lucide-react"; +import { DataTable } from "@/components/data-table/data-table"; +import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar"; +import { useDataTable } from "@/hooks/use-data-table"; +import { getPurchaseRequestColumns } from "./purchase-request-columns"; +import { CreatePurchaseRequestDialog } from "./create-purchase-request-dialog"; +import { EditPurchaseRequestSheet } from "./edit-purchase-request-sheet"; +import { DeletePurchaseRequestDialog } from "./delete-purchase-request-dialog"; +import { ViewPurchaseRequestSheet } from "./view-purchase-request-sheet"; +// import { AttachmentsDialog } from "./attachments-dialog"; +import { ItemsDialog } from "./items-dialog"; +import type { DataTableRowAction } from "@/types/table"; +import type { PurchaseRequestView } from "@/db/schema"; +import { CreateRfqDialog } from "./create-rfq-dialog"; +import { toast } from "sonner"; + +interface PurchaseRequestsTableProps { + promises: Promise<[ + { + data: PurchaseRequestView[]; + pageCount: number; + }, + any + ]>; +} + +export function PurchaseRequestsTable({ promises }: PurchaseRequestsTableProps) { + const router = useRouter(); + const [{ data, pageCount }] = React.use(promises); + const [isCreateDialogOpen, setIsCreateDialogOpen] = React.useState(false); + const [isCreateRfqDialogOpen, setIsCreateRfqDialogOpen] = React.useState(false); + const [selectedRequestsForRfq, setSelectedRequestsForRfq] = React.useState([]); + const [rowAction, setRowAction] = React.useState | null>(null); + + const columns = React.useMemo( + () => getPurchaseRequestColumns({ setRowAction }), + [setRowAction] + ); + + const { table } = useDataTable({ + data, + columns, + pageCount, + enablePinning: true, + enableAdvancedFilter: true, + defaultPerPage: 10, + defaultSort: [{ id: "createdAt", desc: true }], + }); + + const refreshData = () => { + router.refresh(); + }; + + // 선택된 행들 가져오기 + const selectedRows = table.getSelectedRowModel().rows + .map(row => row.original) + .filter(row => row.status === "작성중") + ; + + // 선택된 행들로 RFQ 생성 다이얼로그 열기 + const handleBulkCreateRfq = () => { + const selectedRequests = selectedRows + + if (selectedRequests.length === 0) { + toast.error("RFQ를 생성할 구매 요청을 선택해주세요"); + return; + } + + setSelectedRequestsForRfq(selectedRequests); + setIsCreateRfqDialogOpen(true); + }; + + // 개별 행 액션 처리 + React.useEffect(() => { + if (rowAction?.type === "createRfq") { + setSelectedRequestsForRfq([rowAction.row.original]); + setIsCreateRfqDialogOpen(true); + setRowAction(null); + } + }, [rowAction]); + + // RFQ 생성 성공 후 처리 + const handleRfqSuccess = () => { + table.resetRowSelection(); // 선택 초기화 + refreshData(); + }; + + return ( + <> + + +
+ + + {/* 선택된 항목들로 RFQ 일괄 생성 버튼 */} + {selectedRows.length > 0 && ( + + )} + + +
+
+
+ + {/* 다이얼로그들 */} + + + {/* RFQ 생성 다이얼로그 */} + { + setIsCreateRfqDialogOpen(open); + if (!open) { + setSelectedRequestsForRfq([]); + } + }} + onSuccess={handleRfqSuccess} + /> + + {rowAction?.type === "view" && ( + setRowAction(null)} + /> + )} + + {rowAction?.type === "update" && ( + setRowAction(null)} + onSuccess={refreshData} + /> + )} + + {rowAction?.type === "delete" && ( + setRowAction(null)} + onSuccess={refreshData} + /> + )} + + {rowAction?.type === "items" && ( + setRowAction(null)} + /> + )} + + ); +} \ No newline at end of file -- cgit v1.2.3