"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 ( >>>>>> 8c19d57ced949bde4c9ffcce6544791d3e4b051f // 고정 컬럼 스타일 column.fixed === "left" && "sticky z-10 border-r border-gray-200/40 bg-gradient-to-r from-slate-50/90 to-gray-50/70 shadow-sm", column.fixed === "right" && "sticky z-10 border-l border-gray-200/40 bg-gradient-to-r from-slate-50/90 to-gray-50/70 shadow-sm", // 숨김 컬럼 스타일 (디자인 모드에서만) isDesignMode && column.hidden && "bg-gray-100/50 opacity-40", )} style={{ width: getColumnWidth(column), minWidth: "100px", // 최소 너비 보장 maxWidth: "300px", // 최대 너비 제한 boxSizing: "border-box", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", // 텍스트 줄바꿈 방지 // sticky 위치 설정 ...(column.fixed === "left" && { left: leftFixedWidth }), ...(column.fixed === "right" && { right: rightFixedWidth }), }} onClick={() => 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"} ); })} )) )}
); };