"use client"; import React from "react"; import { ChevronDown, ChevronRight, Minus } from "lucide-react"; import { Checkbox } from "@/components/ui/checkbox"; import { cn } from "@/lib/utils"; import { GroupState, TableGroupedConfig } from "../types"; interface GroupHeaderProps { /** 그룹 상태 */ group: GroupState; /** 설정 */ config: TableGroupedConfig; /** 그룹 토글 핸들러 */ onToggle: () => void; /** 그룹 선택 토글 핸들러 */ onSelectToggle?: () => void; /** 그룹 헤더 스타일 */ style?: "default" | "compact" | "card"; /** 컬럼 개수 (colspan용) */ columnCount?: number; } /** * 그룹 헤더 컴포넌트 * 그룹 펼치기/접기, 체크박스, 요약 정보 표시 */ export function GroupHeader({ group, config, onToggle, onSelectToggle, style = "default", columnCount = 1, }: GroupHeaderProps) { const { showCheckbox } = config; const { summary } = group; // 일부 선택 여부 const isIndeterminate = group.selectedItemIds && group.selectedItemIds.length > 0 && group.selectedItemIds.length < group.items.length; // 요약 텍스트 생성 const summaryText = React.useMemo(() => { const parts: string[] = []; // 개수 if (config.groupConfig?.summary?.showCount !== false) { parts.push(`${summary.count}건`); } // 합계 if (summary.sum) { for (const [col, value] of Object.entries(summary.sum)) { const displayName = config.columns?.find((c) => c.columnName === col)?.displayName || col; parts.push(`${displayName}: ${value.toLocaleString()}`); } } return parts.join(" | "); }, [summary, config]); // 스타일별 클래스 const headerClasses = cn( "flex items-center gap-2 cursor-pointer select-none transition-colors", { // default 스타일 "px-3 py-2 bg-muted/50 hover:bg-muted border-b": style === "default", // compact 스타일 "px-2 py-1 bg-muted/30 hover:bg-muted/50 border-b text-sm": style === "compact", // card 스타일 "px-4 py-3 bg-card border rounded-t-lg shadow-sm hover:shadow": style === "card", } ); return (