"use client"; import React from "react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Checkbox } from "@/components/ui/checkbox"; import { ArrowUp, ArrowDown, ArrowUpDown } from "lucide-react"; import { cn } from "@/lib/utils"; import { ColumnConfig } from "./types"; interface SingleTableWithStickyProps { visibleColumns?: ColumnConfig[]; columns?: ColumnConfig[]; data: Record[]; columnLabels: Record; sortColumn: string | null; sortDirection: "asc" | "desc"; tableConfig?: any; isDesignMode?: boolean; isAllSelected?: boolean; handleSort?: (columnName: string) => void; onSort?: (columnName: string) => void; handleSelectAll?: (checked: boolean) => void; handleRowClick?: (row: any) => void; renderCheckboxCell?: (row: any, index: number) => React.ReactNode; renderCheckboxHeader?: () => React.ReactNode; formatCellValue: (value: any, format?: string, columnName?: string, rowData?: Record) => string; getColumnWidth: (column: ColumnConfig) => number; containerWidth?: string; // 컨테이너 너비 설정 loading?: boolean; error?: string | null; } export const SingleTableWithSticky: React.FC = ({ visibleColumns, columns, data, columnLabels, sortColumn, sortDirection, tableConfig, isDesignMode = false, isAllSelected = false, handleSort, onSort, handleSelectAll, handleRowClick, renderCheckboxCell, renderCheckboxHeader, formatCellValue, getColumnWidth, containerWidth, loading = false, error = null, }) => { const checkboxConfig = tableConfig?.checkbox || {}; const actualColumns = visibleColumns || columns || []; const sortHandler = onSort || handleSort || (() => {}); return (
{actualColumns.map((column, colIndex) => { // 왼쪽 고정 컬럼들의 누적 너비 계산 const leftFixedWidth = actualColumns .slice(0, colIndex) .filter((col) => col.fixed === "left") .reduce((sum, col) => sum + getColumnWidth(col), 0); // 오른쪽 고정 컬럼들의 누적 너비 계산 const rightFixedColumns = actualColumns.filter((col) => col.fixed === "right"); const rightFixedIndex = rightFixedColumns.findIndex((col) => col.columnName === column.columnName); const rightFixedWidth = rightFixedIndex >= 0 ? rightFixedColumns.slice(rightFixedIndex + 1).reduce((sum, col) => sum + getColumnWidth(col), 0) : 0; return ( column.sortable && sortHandler(column.columnName)} >
{column.columnName === "__checkbox__" ? ( checkboxConfig.selectAll && ( ) ) : ( <> {columnLabels[column.columnName] || column.displayName || column.columnName} {column.sortable && sortColumn === column.columnName && ( {sortDirection === "asc" ? ( ) : ( )} )} )}
); })}
{data.length === 0 ? (
데이터가 없습니다 조건을 변경하여 다시 검색해보세요
) : ( data.map((row, index) => ( handleRowClick(row)} > {visibleColumns.map((column, colIndex) => { // 왼쪽 고정 컬럼들의 누적 너비 계산 const leftFixedWidth = visibleColumns .slice(0, colIndex) .filter((col) => col.fixed === "left") .reduce((sum, col) => sum + getColumnWidth(col), 0); // 오른쪽 고정 컬럼들의 누적 너비 계산 const rightFixedColumns = visibleColumns.filter((col) => col.fixed === "right"); const rightFixedIndex = rightFixedColumns.findIndex((col) => col.columnName === column.columnName); const rightFixedWidth = rightFixedIndex >= 0 ? rightFixedColumns.slice(rightFixedIndex + 1).reduce((sum, col) => sum + getColumnWidth(col), 0) : 0; return ( {column.columnName === "__checkbox__" ? renderCheckboxCell(row, index) : formatCellValue(row[column.columnName], column.format, column.columnName, row) || "\u00A0"} ); })} )) )}
); };