"use client"; import React, { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { GripVertical, Eye, EyeOff } from "lucide-react"; interface ColumnConfig { columnName: string; label: string; visible: boolean; width?: number; frozen?: boolean; } interface TableOptionsModalProps { isOpen: boolean; onClose: () => void; columns: ColumnConfig[]; onSave: (config: { columns: ColumnConfig[]; showGridLines: boolean; viewMode: "table" | "card" | "grouped-card"; }) => void; tableName: string; userId?: string; } export function TableOptionsModal({ isOpen, onClose, columns: initialColumns, onSave, tableName, userId = "guest", }: TableOptionsModalProps) { const [columns, setColumns] = useState(initialColumns); const [showGridLines, setShowGridLines] = useState(true); const [viewMode, setViewMode] = useState<"table" | "card" | "grouped-card">("table"); const [draggedIndex, setDraggedIndex] = useState(null); const [dragOverIndex, setDragOverIndex] = useState(null); // localStorage에서 설정 불러오기 useEffect(() => { if (isOpen) { const storageKey = `table_options_${tableName}_${userId}`; const savedConfig = localStorage.getItem(storageKey); if (savedConfig) { try { const parsed = JSON.parse(savedConfig); setColumns(parsed.columns || initialColumns); setShowGridLines(parsed.showGridLines ?? true); setViewMode(parsed.viewMode || "table"); } catch (error) { console.error("설정 불러오기 실패:", error); } } else { setColumns(initialColumns); } } }, [isOpen, tableName, userId, initialColumns]); // 컬럼 표시/숨기기 토글 const toggleColumnVisibility = (index: number) => { const newColumns = [...columns]; newColumns[index].visible = !newColumns[index].visible; setColumns(newColumns); }; // 컬럼 틀고정 토글 const toggleColumnFrozen = (index: number) => { const newColumns = [...columns]; newColumns[index].frozen = !newColumns[index].frozen; setColumns(newColumns); }; // 컬럼 너비 변경 const updateColumnWidth = (index: number, width: number) => { const newColumns = [...columns]; newColumns[index].width = width; setColumns(newColumns); }; // 드래그 앤 드롭 핸들러 const handleDragStart = (index: number) => { setDraggedIndex(index); }; const handleDragOver = (e: React.DragEvent, index: number) => { e.preventDefault(); setDragOverIndex(index); }; const handleDrop = (e: React.DragEvent, dropIndex: number) => { e.preventDefault(); if (draggedIndex === null || draggedIndex === dropIndex) { setDraggedIndex(null); setDragOverIndex(null); return; } const newColumns = [...columns]; const [draggedColumn] = newColumns.splice(draggedIndex, 1); newColumns.splice(dropIndex, 0, draggedColumn); setColumns(newColumns); setDraggedIndex(null); setDragOverIndex(null); }; const handleDragEnd = () => { setDraggedIndex(null); setDragOverIndex(null); }; // 저장 const handleSave = () => { const config = { columns, showGridLines, viewMode, }; // localStorage에 저장 const storageKey = `table_options_${tableName}_${userId}`; localStorage.setItem(storageKey, JSON.stringify(config)); onSave(config); onClose(); }; // 초기화 const handleReset = () => { setColumns(initialColumns); setShowGridLines(true); setViewMode("table"); }; return ( 테이블 옵션 컬럼 표시/숨기기, 순서 변경, 틀고정 등을 설정할 수 있습니다. 컬럼 설정 표시 설정 보기 모드 {/* 컬럼 설정 탭 */}
드래그하여 순서를 변경하거나, 아이콘을 클릭하여 표시/숨기기를 설정하세요.
{columns.map((column, index) => (
handleDragStart(index)} onDragOver={(e) => handleDragOver(e, index)} onDrop={(e) => handleDrop(e, index)} onDragEnd={handleDragEnd} className={`flex items-center gap-2 p-2 sm:p-3 border rounded-md bg-card hover:bg-accent/50 transition-colors cursor-move ${ dragOverIndex === index ? "border-primary" : "border-border" }`} > {/* 드래그 핸들 */} {/* 컬럼명 */}
{column.label}
{column.columnName}
{/* 너비 설정 */}
updateColumnWidth(index, parseInt(e.target.value) || 150)} className="h-7 w-16 sm:h-8 sm:w-20 text-xs" min={50} max={500} />
{/* 틀고정 */} {/* 표시/숨기기 */}
))}
{/* 표시 설정 탭 */}

테이블의 셀 구분선을 표시합니다

{/* 보기 모드 탭 */}
); }