"use client" import * as React from "react" import { useReactTable, getCoreRowModel, getPaginationRowModel, getSortedRowModel, getFilteredRowModel, type ColumnDef } from "@tanstack/react-table" import { DataTable } from "@/components/data-table/data-table" import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" import { Input } from "@/components/ui/input" import { Search } from "lucide-react" import { getVendorPools } from "../../vendor-pool/service" import { GetVendorPoolSchema } from "../../vendor-pool/validations" import { VendorPool } from "../../vendor-pool/types" // Vendor Pool 데이터 타입 (실제 VendorPool 타입 사용) export type VendorPoolItem = VendorPool interface VendorPoolTableProps { onSelectionChange?: (count: number) => void resetCounter?: number } // Vendor Pool 테이블 컬럼 const vendorPoolColumns: ColumnDef[] = [ { id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} aria-label="Select all" /> ), cell: ({ row, table }) => { // Vendor Pool 테이블의 단일 선택 핸들러 const handleRowSelection = (checked: boolean) => { if (checked) { // 다른 모든 행의 선택 해제 table.getRowModel().rows.forEach(r => { if (r !== row && r.getIsSelected()) { r.toggleSelected(false) } }) } // 현재 행 선택/해제 row.toggleSelected(checked) } return ( ) }, enableSorting: false, enableHiding: false, size: 50, }, { accessorKey: "no", header: "No.", size: 60, }, { accessorKey: "designCategory", header: "설계공종", size: 120, }, { accessorKey: "avlVendorName", header: "AVL 등재업체명", size: 140, }, { accessorKey: "materialGroupCode", header: "자재그룹코드", size: 130, }, { accessorKey: "materialGroupName", header: "자재그룹명", size: 130, }, { accessorKey: "vendorName", header: "협력업체 정보", size: 130, }, { accessorKey: "tier", header: "업체분류", size: 100, }, { accessorKey: "faStatus", header: "FA현황", size: 100, }, { accessorKey: "recentQuoteNumber", header: "최근견적번호", size: 130, }, { accessorKey: "recentOrderNumber", header: "최근발주번호", size: 130, }, ] // 실제 데이터는 API에서 가져옴 export function VendorPoolTable({ onSelectionChange, resetCounter }: VendorPoolTableProps) { const [data, setData] = React.useState([]) const [loading, setLoading] = React.useState(false) const [pageCount, setPageCount] = React.useState(0) // 검색 상태 const [searchText, setSearchText] = React.useState("") const [showAll, setShowAll] = React.useState(false) // 데이터 로드 함수 const loadData = React.useCallback(async (searchParams: Partial) => { try { setLoading(true) const params: GetVendorPoolSchema = { page: searchParams.page ?? 1, perPage: searchParams.perPage ?? 10, sort: searchParams.sort ?? [{ id: "registrationDate", desc: true }], search: searchText || "", ...searchParams, } const result = await getVendorPools(params) setData(result.data) setPageCount(result.pageCount) } catch (error) { console.error("Vendor Pool 데이터 로드 실패:", error) setData([]) setPageCount(0) } finally { setLoading(false) } }, [searchText]) // 검색 핸들러 const handleSearch = React.useCallback(() => { if (showAll) { // 전체보기 모드에서는 페이징 없이 전체 데이터 로드 loadData({ perPage: 1000 }) // 충분히 큰 숫자로 전체 데이터 가져오기 } else { loadData({}) } }, [loadData, showAll]) // 전체보기 토글 핸들러 const handleShowAllToggle = React.useCallback((checked: boolean) => { setShowAll(checked) if (checked) { // 전체보기 활성화 시 전체 데이터 로드 loadData({ perPage: 1000 }) setSearchText("") } else { // 전체보기 비활성화 시 일반 페이징으로 전환 loadData({}) } }, [loadData]) // 초기 데이터 로드 React.useEffect(() => { loadData({}) }, [loadData]) const table = useReactTable({ data, columns: vendorPoolColumns, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), manualPagination: !showAll, // 전체보기 시에는 수동 페이징 비활성화 pageCount: showAll ? 1 : pageCount, // 전체보기 시 1페이지, 일반 모드에서는 API에서 받은 pageCount 사용 initialState: { pagination: { pageSize: showAll ? data.length : 10, // 전체보기 시 모든 데이터 표시 }, }, onPaginationChange: (updater) => { if (!showAll) { // 전체보기가 아닐 때만 페이징 변경 처리 const newState = typeof updater === 'function' ? updater(table.getState().pagination) : updater loadData({ page: newState.pageIndex + 1, perPage: newState.pageSize, }) } }, }) // 선택 상태 변경 시 콜백 호출 React.useEffect(() => { onSelectionChange?.(table.getFilteredSelectedRowModel().rows.length) }, [table.getFilteredSelectedRowModel().rows.length, onSelectionChange]) // 선택 해제 요청이 오면 모든 선택 해제 React.useEffect(() => { if (resetCounter && resetCounter > 0) { table.toggleAllPageRowsSelected(false) } }, [resetCounter, table]) return (

Vendor Pool

{/* */}
{/* 검색 UI */}
{/* 전체보기 체크박스 */}
{/* 검색어 입력 */} {!showAll && (
setSearchText(e.target.value)} className="flex-1" onKeyPress={(e) => { if (e.key === 'Enter') { handleSearch() } }} />
)} {/* 검색 결과 정보 */}
{showAll ? ( `전체 ${data.length}개 항목 표시 중` ) : ( `${data.length}개 항목${searchText ? ` (검색어: "${searchText}")` : ""}` )}
) }