"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[]; data: Record[]; columnLabels: Record; sortColumn: string | null; sortDirection: "asc" | "desc"; tableConfig: any; isDesignMode: boolean; isAllSelected: boolean; handleSort: (columnName: string) => void; handleSelectAll: (checked: boolean) => void; handleRowClick: (row: any) => void; renderCheckboxCell: (row: any, index: number) => React.ReactNode; formatCellValue: (value: any, format?: string, columnName?: string) => string; getColumnWidth: (column: ColumnConfig) => number; containerWidth?: string; // 컨테이너 너비 설정 } export const SingleTableWithSticky: React.FC = ({ visibleColumns, data, columnLabels, sortColumn, sortDirection, tableConfig, isDesignMode, isAllSelected, handleSort, handleSelectAll, handleRowClick, renderCheckboxCell, formatCellValue, getColumnWidth, containerWidth, }) => { const checkboxConfig = tableConfig.checkbox || {}; return (
{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.sortable && handleSort(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) || "\u00A0"} ); })} )) )}
); };