// lib/vendor-rfq-response/vendor-tbe-table/tbe-table.tsx "use client" import * as React from "react" import { useRouter } from "next/navigation" import { type DataTableAdvancedFilterField } from "@/types/table" 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 { getColumns } from "./tbe-table-columns" import { TbeLastView } from "@/db/schema" import { getTBESessionDetail } from "@/lib/tbe-last/service" import { Button } from "@/components/ui/button" import { Download, RefreshCw, Upload } from "lucide-react" import { exportTableToExcel } from "@/lib/export" // Import Vendor-specific Dialogs import { VendorDocumentUploadDialog } from "./vendor-document-upload-dialog" import { VendorQADialog } from "./vendor-comment-dialog" import { VendorDocumentsSheet } from "./vendor-documents-sheet" import { VendorPrItemsDialog } from "./vendor-pr-items-dialog" import { getTBEforVendor } from "../vendor-tbe-service" interface TbeVendorTableProps { promises: Promise<[ Awaited>, ]> } export function TbeVendorTable({ promises }: TbeVendorTableProps) { const router = useRouter() const [{ data, pageCount }] = React.use(promises) // Dialog states const [documentUploadOpen, setDocumentUploadOpen] = React.useState(false) const [qaDialogOpen, setQADialogOpen] = React.useState(false) const [evaluationViewOpen, setEvaluationViewOpen] = React.useState(false) const [documentsOpen, setDocumentsOpen] = React.useState(false) const [prItemsOpen, setPrItemsOpen] = React.useState(false) const [selectedSessionId, setSelectedSessionId] = React.useState(null) const [selectedRfqId, setSelectedRfqId] = React.useState(null) const [selectedSession, setSelectedSession] = React.useState(null) const [sessionDetail, setSessionDetail] = React.useState(null) const [isLoadingDetail, setIsLoadingDetail] = React.useState(false) // Load session detail when needed const loadSessionDetail = React.useCallback(async (sessionId: number) => { setIsLoadingDetail(true) try { const detail = await getTBESessionDetail(sessionId) setSessionDetail(detail) } catch (error) { console.error("Failed to load session detail:", error) } finally { setIsLoadingDetail(false) } }, []) // Handlers const handleOpenDocumentUpload = React.useCallback((sessionId: number) => { setSelectedSessionId(sessionId) setDocumentUploadOpen(true) loadSessionDetail(sessionId) }, [loadSessionDetail]) const handleOpenComment = React.useCallback((sessionId: number) => { setSelectedSessionId(sessionId) setQADialogOpen(true) loadSessionDetail(sessionId) }, [loadSessionDetail]) const handleOpenEvaluationView = React.useCallback((session: TbeLastView) => { setSelectedSession(session) setEvaluationViewOpen(true) loadSessionDetail(session.tbeSessionId) }, [loadSessionDetail]) const handleOpenDocuments = React.useCallback((sessionId: number) => { setSelectedSessionId(sessionId) setDocumentsOpen(true) loadSessionDetail(sessionId) }, [loadSessionDetail]) const handleOpenPrItems = React.useCallback((rfqId: number) => { setSelectedRfqId(rfqId) setPrItemsOpen(true) }, []) const handleRefresh = React.useCallback(() => { router.refresh() }, [router]) // Table columns const columns = React.useMemo( () => getColumns({ onOpenDocumentUpload: handleOpenDocumentUpload, onOpenComment: handleOpenComment, onOpenEvaluationView: handleOpenEvaluationView, onOpenDocuments: handleOpenDocuments, onOpenPrItems: handleOpenPrItems, }), [handleOpenDocumentUpload, handleOpenComment, handleOpenEvaluationView, handleOpenDocuments, handleOpenPrItems] ) // Filter fields const filterFields: DataTableAdvancedFilterField[] = [ { id: "sessionStatus", label: "Status", type: "select", options: [ { label: "준비중", value: "준비중" }, { label: "진행중", value: "진행중" }, { label: "검토중", value: "검토중" }, { label: "보류", value: "보류" }, { label: "완료", value: "완료" }, ], }, { id: "evaluationResult", label: "Result", type: "select", options: [ { label: "Pass", value: "pass" }, { label: "Conditional Pass", value: "conditional_pass" }, { label: "Non-Pass", value: "non_pass" }, { label: "Pending", value: "pending" }, ], }, ] // Data table const { table } = useDataTable({ data, columns, pageCount, filterFields, enablePinning: true, enableAdvancedFilter: true, initialState: { sorting: [{ id: "createdAt", desc: true }], columnPinning: { right: ["actions"] }, }, getRowId: (originalRow) => String(originalRow.tbeSessionId), shallow: false, clearOnDefault: true, }) return ( <>
{/* Document Upload Dialog */} {/* Q&A Dialog */} {/* Documents Sheet */} {/* PR Items Dialog */} ) }