// components/data-table/table-preset-manager.tsx import React, { useState } from 'react' import { Button } from '@/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, } from '@/components/ui/dropdown-menu' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Checkbox } from '@/components/ui/checkbox' import { Settings, Save, Star, Edit, Trash2, Plus, Check, Loader2, ChevronDown, Bookmark } from 'lucide-react' import { TableSettings } from '@/db/schema' interface TablePreset { id: string name: string isDefault: boolean isActive: boolean settings: TableSettings } interface TablePresetManagerProps { presets: TablePreset[] activePresetId: string | null currentSettings: TableSettings hasUnsavedChanges: boolean isLoading: boolean onCreatePreset: (name: string, settings: TableSettings, isDefault: boolean) => Promise onUpdatePreset: (presetId: string, settings: TableSettings) => Promise onDeletePreset: (presetId: string) => Promise onApplyPreset: (presetId: string) => Promise onSetDefaultPreset: (presetId: string) => Promise onRenamePreset: (presetId: string, newName: string) => Promise } export function TablePresetManager({ presets, activePresetId, currentSettings, hasUnsavedChanges, isLoading, onCreatePreset, onUpdatePreset, onDeletePreset, onApplyPreset, onSetDefaultPreset, onRenamePreset, }: TablePresetManagerProps) { const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false) const [isRenameDialogOpen, setIsRenameDialogOpen] = useState(false) const [newPresetName, setNewPresetName] = useState('') const [isDefaultPreset, setIsDefaultPreset] = useState(false) const [renamingPresetId, setRenamingPresetId] = useState(null) const [processingPresetId, setProcessingPresetId] = useState(null) const activePreset = presets.find(p => p.id === activePresetId) const handleCreatePreset = async () => { if (!newPresetName.trim()) return const success = await onCreatePreset(newPresetName, currentSettings, isDefaultPreset) if (success) { setIsCreateDialogOpen(false) setNewPresetName('') setIsDefaultPreset(false) } } const handleRenamePreset = async () => { if (renamingPresetId && newPresetName.trim()) { const success = await onRenamePreset(renamingPresetId, newPresetName) if (success) { setIsRenameDialogOpen(false) setNewPresetName('') setRenamingPresetId(null) } } } const openRenameDialog = (preset: TablePreset) => { setRenamingPresetId(preset.id) setNewPresetName(preset.name) setIsRenameDialogOpen(true) } const handleUpdateCurrentPreset = async () => { if (activePresetId) { await onUpdatePreset(activePresetId, currentSettings) } } const handleApplyPreset = async (presetId: string) => { setProcessingPresetId(presetId) await onApplyPreset(presetId) setProcessingPresetId(null) } if (isLoading) { return ( ) } return ( <> 테이블 맞춤 설정 {/* 활성 맞춤 설정 표시 */} {activePreset && ( <>
현재 활성
{activePreset.name}
{activePreset.isDefault && } {hasUnsavedChanges && 수정됨}
)} {/* 빠른 액션 */} setIsCreateDialogOpen(true)}> 현재 설정으로 새 맞춤 설정 만들기 {activePresetId && ( {hasUnsavedChanges ? '변경 내용 저장' : '현재 설정 업데이트'} )} {/* 맞춤 설정 목록 */} 저장된 맞춤 설정 {presets.length === 0 ? (
저장된 프리셋이 없습니다
) : ( presets.map((preset) => (
{preset.id === activePresetId ? ( ) : (
)} {preset.name} {preset.isDefault && }
handleApplyPreset(preset.id)}> {processingPresetId === preset.id ? ( ) : ( )} 적용 openRenameDialog(preset)}> 이름 변경 onSetDefaultPreset(preset.id)}> {preset.isDefault ? '기본 해제' : '기본으로 설정'} {presets.length > 1 && ( onDeletePreset(preset.id)} className="text-red-600 focus:text-red-600" > 삭제 )} )) )} {/* Create Dialog */} 새 맞춤 설정 저장 현재 테이블 설정을 새로운 프리셋으로 저장합니다.
setNewPresetName(e.target.value)} placeholder="맞춤 설정 이름을 입력하세요" onKeyDown={(e) => { if (e.key === 'Enter') { handleCreatePreset() } }} />
setIsDefaultPreset(checked as boolean)} />

기본 프리셋은 테이블 로드 시 자동으로 적용됩니다.

{/* Rename Dialog */} 맞춤 설정 이름 변경 '{presets.find(p => p.id === renamingPresetId)?.name}' 프리셋의 이름을 변경합니다.
setNewPresetName(e.target.value)} placeholder="새 맞춤 설정 이름을 입력하세요" onKeyDown={(e) => { if (e.key === 'Enter') { handleRenamePreset() } }} />
) }