"use client" import * as React from "react" import { Loader, Database, Check } from "lucide-react" import { toast } from "sonner" import { useReactTable, getCoreRowModel, getPaginationRowModel, getFilteredRowModel, ColumnDef, flexRender, } from "@tanstack/react-table" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table" import { Checkbox } from "@/components/ui/checkbox" import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area" import { getCPVWWabQustListViewData, CPVWWabQustListView } from "@/lib/basic-contract/cpvw-service" interface CPVWWabQustListViewDialogProps { onConfirm?: (selectedRows: CPVWWabQustListView[]) => void requireSingleSelection?: boolean triggerDisabled?: boolean triggerTitle?: string } export function CPVWWabQustListViewDialog({ onConfirm, requireSingleSelection = false, triggerDisabled = false, triggerTitle, }: CPVWWabQustListViewDialogProps) { const [open, setOpen] = React.useState(false) const [isLoading, setIsLoading] = React.useState(false) const [data, setData] = React.useState([]) const [error, setError] = React.useState(null) const [rowSelection, setRowSelection] = React.useState>({}) const loadData = async () => { setIsLoading(true) setError(null) try { const result = await getCPVWWabQustListViewData() if (result.success) { setData(result.data) if (result.isUsingFallback) { toast.info("테스트 데이터를 표시합니다.") } } else { setError(result.error || "데이터 로딩 실패") toast.error(result.error || "데이터 로딩 실패") } } catch (err) { const errorMessage = err instanceof Error ? err.message : "알 수 없는 오류" setError(errorMessage) toast.error(errorMessage) } finally { setIsLoading(false) } } React.useEffect(() => { if (open) { loadData() } else { // 다이얼로그 닫힐 때 데이터 초기화 setData([]) setError(null) setRowSelection({}) } }, [open]) // 테이블 컬럼 정의 (동적 생성) const columns = React.useMemo[]>(() => { if (data.length === 0) return [] const dataKeys = Object.keys(data[0]) return [ { id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} aria-label="모든 행 선택" /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="행 선택" /> ), enableSorting: false, enableHiding: false, }, ...dataKeys.map((key) => ({ accessorKey: key, header: key, cell: ({ getValue }: any) => { const value = getValue() return value !== null && value !== undefined ? String(value) : "" }, })), ] }, [data]) // 테이블 인스턴스 생성 const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), getFilteredRowModel: getFilteredRowModel(), onRowSelectionChange: setRowSelection, state: { rowSelection, }, }) // 선택된 행들 가져오기 const selectedRows = table.getFilteredSelectedRowModel().rows.map(row => row.original) // 확인 버튼 핸들러 const handleConfirm = () => { if (selectedRows.length === 0) { toast.error("행을 선택해주세요.") return } if (requireSingleSelection && selectedRows.length !== 1) { toast.error("하나의 행만 선택해주세요.") return } if (onConfirm) { onConfirm(selectedRows) toast.success( requireSingleSelection ? "선택한 행으로 준법문의 상태를 동기화합니다." : `${selectedRows.length}개의 행을 선택했습니다.` ) } else { // 임시로 선택된 데이터 콘솔 출력 console.log("선택된 행들:", selectedRows) toast.success(`${selectedRows.length}개의 행이 선택되었습니다. (콘솔 확인)`) } setOpen(false) } return ( 준법문의 요청 데이터 준법문의 요청 데이터를 조회합니다. {data.length > 0 && ` (${data.length}건, ${selectedRows.length}개 선택됨)`}
{isLoading ? (
데이터 로딩 중...
) : error ? (
오류: {error}
) : data.length === 0 ? (
데이터가 없습니다.
) : (
{/* 테이블 영역 - 스크롤 가능 */} {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )} ))} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext() )} ))} )) ) : ( 데이터가 없습니다. )}
{/* 페이지네이션 컨트롤 - 고정 영역 */}
{table.getFilteredSelectedRowModel().rows.length}개 행 선택됨

페이지당 행 수

{table.getState().pagination.pageIndex + 1} /{" "} {table.getPageCount()}
)}
) }