From 06cf51e5dd14e118fa8dbb8c666d78ace61cbf9b Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Tue, 28 Oct 2025 14:26:44 +0900 Subject: (김준회) fix: 공통컴포넌트: 데이터 그리드: 중첩헤더 있는 경우의 width 계산 및 스타일 적용문제 해결 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/data-table/data-table-detail.tsx | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'components/data-table/data-table-detail.tsx') diff --git a/components/data-table/data-table-detail.tsx b/components/data-table/data-table-detail.tsx index f3f09fe2..016b9f42 100644 --- a/components/data-table/data-table-detail.tsx +++ b/components/data-table/data-table-detail.tsx @@ -60,6 +60,19 @@ export function DataTableDetail({ useAutoSizeColumns(table, autoSizeColumns) + // nested header 감지: columns 속성을 가진 헤더가 있는지 확인 + const hasNestedHeader = React.useMemo(() => { + return table.getHeaderGroups().some(headerGroup => + headerGroup.headers.some(header => 'columns' in header.column.columnDef) + ) + }, [table]) + + // 🎯 테이블 총 너비 계산 (nested header가 있을 때만 사용) + const getTableWidth = React.useCallback(() => { + const totalSize = table.getCenterTotalSize() + table.getLeftTotalSize() + table.getRightTotalSize() + return Math.max(totalSize, 800) // 최소 800px 보장 + }, [table]) + // ✅ compactStyles를 useMemo로 메모이제이션 const compactStyles = React.useMemo(() => compact ? COMPACT_STYLES : NORMAL_STYLES, @@ -70,7 +83,12 @@ export function DataTableDetail({
{children}
- +
thead]:sticky [&>thead]:top-0 [&>thead]:z-10", + !hasNestedHeader && "table-fixed" + )} + style={{ minWidth: hasNestedHeader ? getTableWidth() : undefined }}> {/* 테이블 헤더 */} {table.getHeaderGroups().map((headerGroup) => ( @@ -93,7 +111,11 @@ export function DataTableDetail({ }), // 부모 그룹 헤더는 colSpan으로 너비가 결정되므로 width 설정하지 않음 // 자식 헤더만 개별 width 설정 - ...(!('columns' in header.column.columnDef) && { width: header.getSize() }), + ...(!('columns' in header.column.columnDef) && { + width: header.getSize(), + minWidth: header.getSize(), + maxWidth: header.column.columnDef.maxSize, + }), }} >
@@ -190,6 +212,8 @@ export function DataTableDetail({ style={{ ...getCommonPinningStylesWithBorder({ column: cell.column }), width: cell.column.getSize(), + minWidth: cell.column.getSize(), + maxWidth: cell.column.columnDef.maxSize, }} > {flexRender( -- cgit v1.2.3