// 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 }], shallow: false, }); 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)} /> )} ); }