"use client" import * as React from "react" import { useRouter } from "next/navigation" import { useSession } from "next-auth/react" import type { DataTableAdvancedFilterField, DataTableFilterField, DataTableRowAction, } 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 { getBiddingsSelectionColumns } from "./biddings-selection-columns" import { getBiddingsForSelection } from "@/lib/bidding/service" import { biddingStatusLabels, contractTypeLabels, } from "@/db/schema" import { SpecificationMeetingDialog, PrDocumentsDialog } from "../list/bidding-detail-dialogs" import { toast } from "@/hooks/use-toast" type BiddingSelectionItem = { id: number biddingNumber: string originalBiddingNumber: string | null title: string status: string contractType: string prNumber: string | null submissionStartDate: Date | null submissionEndDate: Date | null bidPicName: string | null supplyPicName: string | null createdBy: string | null createdAt: Date | null updatedAt: Date | null // 입찰 결과 정보 (개찰 이후에만 의미 있음) participantCount?: number submittedCount?: number avgBidPrice?: number | null minBidPrice?: number | null maxBidPrice?: number | null targetPrice?: number | null currency?: string | null } interface BiddingsSelectionTableProps { promises: Promise< [ Awaited> ] > } export function BiddingsSelectionTable({ promises }: BiddingsSelectionTableProps) { const [biddingsResult] = React.use(promises) // biddingsResult에서 data와 pageCount 추출 const { data, pageCount } = biddingsResult const [isCompact, setIsCompact] = React.useState(false) const [specMeetingDialogOpen, setSpecMeetingDialogOpen] = React.useState(false) const [prDocumentsDialogOpen, setPrDocumentsDialogOpen] = React.useState(false) const [selectedBidding, setSelectedBidding] = React.useState(null) const [rowAction, setRowAction] = React.useState | null>(null) const router = useRouter() const { data: session } = useSession() const columns = React.useMemo( () => getBiddingsSelectionColumns({ setRowAction }), [setRowAction] ) // rowAction 변경 감지하여 해당 다이얼로그 열기 React.useEffect(() => { if (rowAction) { setSelectedBidding(rowAction.row.original) switch (rowAction.type) { case "view": // 상세 페이지로 이동 // 입찰평가중, 업체선정, 차수증가, 재입찰 상태일 때 상세보기 가능 if (['evaluation_of_bidding', 'vendor_selected', 'round_increase', 'rebidding'].includes(rowAction.row.original.status)) { router.push(`/evcp/bid-selection/${rowAction.row.original.id}/detail`) } else { toast({ title: '접근 제한', description: '상세보기가 불가능한 상태입니다.', variant: 'destructive', }) } break } } }, [rowAction]) const filterFields: DataTableFilterField[] = [ { id: "biddingNumber", label: "입찰번호", type: "text", placeholder: "입찰번호를 입력하세요", }, { id: "prNumber", label: "P/R번호", type: "text", placeholder: "P/R번호를 입력하세요", }, { id: "title", label: "입찰명", type: "text", placeholder: "입찰명을 입력하세요", }, ] const advancedFilterFields: DataTableAdvancedFilterField[] = [ { id: "title", label: "입찰명", type: "text" }, { id: "biddingNumber", label: "입찰번호", type: "text" }, { id: "bidPicName", label: "입찰담당자", type: "text" }, { id: "status", label: "진행상태", type: "multi-select", options: Object.entries(biddingStatusLabels).map(([value, label]) => ({ label, value, })), }, { id: "contractType", label: "계약구분", type: "select", options: Object.entries(contractTypeLabels).map(([value, label]) => ({ label, value, })), }, { id: "createdAt", label: "등록일", type: "date" }, { id: "submissionStartDate", label: "제출시작일", type: "date" }, { id: "submissionEndDate", label: "제출마감일", type: "date" }, ] const { table } = useDataTable({ data, columns, pageCount, filterFields, enablePinning: true, enableAdvancedFilter: true, initialState: { sorting: [{ id: "createdAt", desc: true }], columnPinning: { right: ["actions"] }, }, getRowId: (originalRow) => String(originalRow.id), shallow: false, clearOnDefault: true, }) const handleCompactChange = React.useCallback((compact: boolean) => { setIsCompact(compact) }, []) const handleSpecMeetingDialogClose = React.useCallback(() => { setSpecMeetingDialogOpen(false) setRowAction(null) setSelectedBidding(null) }, []) const handlePrDocumentsDialogClose = React.useCallback(() => { setPrDocumentsDialogOpen(false) setRowAction(null) setSelectedBidding(null) }, []) return ( <> {/* 사양설명회 다이얼로그 */} {/* PR 문서 다이얼로그 */} ) }