/** * TableView - DataView의 테이블 뷰 * - 기본 테이블 렌더링 * - 체크박스, 행 선택, 더블클릭 지원 */ "use client"; import React from "react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Checkbox } from "@/components/ui/checkbox"; import { Skeleton } from "@/components/ui/skeleton"; import { cn } from "@/lib/utils"; interface TableViewProps { data: any[]; columns: string[]; tableName: string; loading?: boolean; selectedRows?: Set; onRowSelect?: (rowId: string) => void; onRowDoubleClick?: (row: any) => void; } export function TableView({ data, columns, tableName, loading = false, selectedRows = new Set(), onRowSelect, onRowDoubleClick, }: TableViewProps) { // 로딩 스켈레톤 if (loading) { return (
{Array.from({ length: 5 }).map((_, i) => ( ))}
); } // 데이터 없음 if (data.length === 0) { return (
데이터가 없습니다

아직 등록된 항목이 없습니다

); } return (
{onRowSelect && ( 0} onCheckedChange={(checked) => { if (checked) { data.forEach((row) => onRowSelect(row.id || String(row))); } else { data.forEach((row) => onRowSelect(row.id || String(row))); } }} /> )} {columns.map((column) => ( {column} ))} {data.map((row, rowIndex) => { const rowId = row.id || String(rowIndex); const isSelected = selectedRows.has(rowId); return ( onRowDoubleClick?.(row)} > {onRowSelect && ( onRowSelect(rowId)} /> )} {columns.map((column) => ( {formatCellValue(row[column])} ))} ); })}
); } // 셀 값 포맷팅 function formatCellValue(value: any): string { if (value === null || value === undefined) { return ""; } if (typeof value === "boolean") { return value ? "O" : "X"; } if (value instanceof Date) { return value.toLocaleDateString("ko-KR"); } if (typeof value === "object") { return JSON.stringify(value); } return String(value); }