"use client"; /** * PivotGrid 컨텍스트 메뉴 컴포넌트 * 우클릭 시 정렬, 필터, 확장/축소 등의 옵션 제공 */ import React from "react"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, } from "@/components/ui/context-menu"; import { ArrowUpAZ, ArrowDownAZ, Filter, ChevronDown, ChevronRight, Copy, Eye, EyeOff, BarChart3, } from "lucide-react"; import { PivotFieldConfig, AggregationType } from "../types"; interface PivotContextMenuProps { children: React.ReactNode; // 현재 컨텍스트 정보 cellType: "header" | "data" | "rowHeader" | "columnHeader"; field?: PivotFieldConfig; rowPath?: string[]; columnPath?: string[]; value?: any; // 콜백 onSort?: (field: string, direction: "asc" | "desc") => void; onFilter?: (field: string) => void; onExpand?: (path: string[]) => void; onCollapse?: (path: string[]) => void; onExpandAll?: () => void; onCollapseAll?: () => void; onCopy?: (value: any) => void; onHideField?: (field: string) => void; onChangeSummary?: (field: string, summaryType: AggregationType) => void; onDrillDown?: (rowPath: string[], columnPath: string[]) => void; } export const PivotContextMenu: React.FC = ({ children, cellType, field, rowPath, columnPath, value, onSort, onFilter, onExpand, onCollapse, onExpandAll, onCollapseAll, onCopy, onHideField, onChangeSummary, onDrillDown, }) => { const handleCopy = () => { if (value !== undefined && value !== null) { navigator.clipboard.writeText(String(value)); onCopy?.(value); } }; return ( {children} {/* 정렬 옵션 (헤더에서만) */} {(cellType === "rowHeader" || cellType === "columnHeader") && field && ( <> 정렬 onSort?.(field.field, "asc")}> 오름차순 onSort?.(field.field, "desc")}> 내림차순 )} {/* 확장/축소 옵션 */} {(cellType === "rowHeader" || cellType === "columnHeader") && ( <> {rowPath && rowPath.length > 0 && ( <> onExpand?.(rowPath)}> 확장 onCollapse?.(rowPath)}> 축소 )} 전체 확장 전체 축소 )} {/* 필터 옵션 */} {field && onFilter && ( <> onFilter(field.field)}> 필터 )} {/* 집계 함수 변경 (데이터 필드에서만) */} {cellType === "data" && field && onChangeSummary && ( <> 집계 함수 onChangeSummary(field.field, "sum")} > 합계 onChangeSummary(field.field, "count")} > 개수 onChangeSummary(field.field, "avg")} > 평균 onChangeSummary(field.field, "min")} > 최소 onChangeSummary(field.field, "max")} > 최대 )} {/* 드릴다운 (데이터 셀에서만) */} {cellType === "data" && rowPath && columnPath && onDrillDown && ( <> onDrillDown(rowPath, columnPath)}> 상세 데이터 보기 )} {/* 필드 숨기기 */} {field && onHideField && ( onHideField(field.field)}> 필드 숨기기 )} {/* 복사 */} 복사 ); }; export default PivotContextMenu;