'use client'; import { useEffect, useRef, useState } from 'react'; import { X } from 'lucide-react'; import { getIconComponent } from '@/components/admin/MenuIconPicker'; interface CreateDashboardModalProps { open: boolean; onClose: () => void; onSubmit: (payload: { name: string; icon: string; is_personal: boolean }) => Promise | void; /** 'create' (기본) 는 새 대시보드 생성, 'edit' 은 기존 항목 수정 — 제목/버튼/공유범위 분기 */ mode?: 'create' | 'edit'; defaultName?: string; defaultIcon?: string; defaultIsPersonal?: boolean; submitting?: boolean; } const ICON_PRESETS = [ 'ClipboardList', 'BarChart3', 'TrendingUp', 'TrendingDown', 'Package', 'Truck', 'Factory', 'Compass', 'Map', 'Wrench', 'Settings', 'Folder', 'Boxes', 'Users', 'Calendar', 'LayoutDashboard', ]; export function CreateDashboardModal({ open, onClose, onSubmit, mode = 'create', defaultName = '', defaultIcon = 'ClipboardList', defaultIsPersonal = false, submitting = false, }: CreateDashboardModalProps) { const isEdit = mode === 'edit'; const [name, setName] = useState(defaultName); const [icon, setIcon] = useState(defaultIcon); const [isPersonal, setIsPersonal] = useState(defaultIsPersonal); const nameRef = useRef(null); useEffect(() => { if (open) { setName(defaultName); setIcon(defaultIcon); setIsPersonal(defaultIsPersonal); setTimeout(() => nameRef.current?.focus(), 30); } }, [open, defaultName, defaultIcon, defaultIsPersonal]); if (!open) return null; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const trimmed = name.trim(); if (!trimmed || submitting) return; await onSubmit({ name: trimmed, icon, is_personal: isPersonal }); }; return (
{ if (e.target === e.currentTarget) onClose(); }} >

{isEdit ? '대시보드 수정' : '새 대시보드 만들기'}

setName(e.target.value)} placeholder="예: 수주 관리" className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground outline-none focus:border-[var(--v5-primary)]" required />
{ICON_PRESETS.map((iconName) => { const Ico = getIconComponent(iconName); const selected = icon === iconName; return ( ); })}
); }