import React, { useState } from "react"; import { useTableOptions } from "@/contexts/TableOptionsContext"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { ScrollArea } from "@/components/ui/scroll-area"; import { ArrowRight, GripVertical, X } from "lucide-react"; interface Props { isOpen: boolean; onClose: () => void; } export const GroupingPanel: React.FC = ({ isOpen, onClose, }) => { const { getTable, selectedTableId } = useTableOptions(); const table = selectedTableId ? getTable(selectedTableId) : undefined; const [selectedColumns, setSelectedColumns] = useState([]); const [draggedIndex, setDraggedIndex] = useState(null); const toggleColumn = (columnName: string) => { if (selectedColumns.includes(columnName)) { setSelectedColumns(selectedColumns.filter((c) => c !== columnName)); } else { setSelectedColumns([...selectedColumns, columnName]); } }; const removeColumn = (columnName: string) => { setSelectedColumns(selectedColumns.filter((c) => c !== columnName)); }; const moveColumn = (fromIndex: number, toIndex: number) => { const newColumns = [...selectedColumns]; const [movedItem] = newColumns.splice(fromIndex, 1); newColumns.splice(toIndex, 0, movedItem); setSelectedColumns(newColumns); }; const handleDragStart = (index: number) => { setDraggedIndex(index); }; const handleDragOver = (e: React.DragEvent, index: number) => { e.preventDefault(); if (draggedIndex === null || draggedIndex === index) return; moveColumn(draggedIndex, index); setDraggedIndex(index); }; const handleDragEnd = () => { setDraggedIndex(null); }; const applyGrouping = () => { table?.onGroupChange(selectedColumns); onClose(); }; const clearGrouping = () => { setSelectedColumns([]); table?.onGroupChange([]); }; return ( 그룹 설정 데이터를 그룹화할 컬럼을 선택하세요
{/* 선택된 컬럼 (드래그 가능) */} {selectedColumns.length > 0 && (
그룹화 순서 ({selectedColumns.length}개)
{selectedColumns.map((colName, index) => { const col = table?.columns.find( (c) => c.columnName === colName ); if (!col) return null; return (
handleDragStart(index)} onDragOver={(e) => handleDragOver(e, index)} onDragEnd={handleDragEnd} className="flex items-center gap-2 rounded-lg border bg-primary/5 p-2 sm:p-3 transition-colors hover:bg-primary/10 cursor-move" >
{index + 1}
{col.columnLabel}
); })}
{/* 그룹화 순서 미리보기 */}
{selectedColumns.map((colName, index) => { const col = table?.columns.find( (c) => c.columnName === colName ); return ( {col?.columnLabel} {index < selectedColumns.length - 1 && ( )} ); })}
)} {/* 사용 가능한 컬럼 */}
사용 가능한 컬럼
0 ? "h-[280px] sm:h-[320px]" : "h-[400px] sm:h-[450px]"}>
{table?.columns .filter((col) => !selectedColumns.includes(col.columnName)) .map((col) => { return (
toggleColumn(col.columnName)} > toggleColumn(col.columnName)} className="flex-shrink-0" />
{col.columnLabel}
{col.columnName}
); })}
); };