'use client' import { useEffect, useState } from 'react' import { useSession } from 'next-auth/react' import { useRouter } from 'next/navigation' import { apiClient } from '@/lib/api-client' interface DepartmentTreeNode { id: number code: string name: string name_en?: string depth: number parent_id: number | null email_domain?: string effective_email_domain?: string email_address?: string email_quota_mb: number description?: string is_active: boolean is_top_level: boolean member_count: number children: DepartmentTreeNode[] } interface DepartmentFormData { name: string name_en: string code: string description: string email_domain: string email_address: string email_quota_mb: number parent_id: number | null } const EMPTY_FORM: DepartmentFormData = { name: '', name_en: '', code: '', description: '', email_domain: '', email_address: '', email_quota_mb: 5120, parent_id: null, } // ─── Modal:新增 / 編輯部門 ───────────────────────────────────────────── function DepartmentModal({ mode, parentDept, editTarget, onClose, onSaved, }: { mode: 'create_top' | 'create_child' | 'edit' parentDept?: DepartmentTreeNode // create_child 時的父部門 editTarget?: DepartmentTreeNode // edit 時的目標部門 onClose: () => void onSaved: () => void }) { const [form, setForm] = useState(() => { if (mode === 'edit' && editTarget) { return { name: editTarget.name, name_en: editTarget.name_en ?? '', code: editTarget.code, description: editTarget.description ?? '', email_domain: editTarget.email_domain ?? '', email_address: editTarget.email_address ?? '', email_quota_mb: editTarget.email_quota_mb, parent_id: editTarget.parent_id, } } if (mode === 'create_child' && parentDept) { return { ...EMPTY_FORM, parent_id: parentDept.id } } return { ...EMPTY_FORM } }) const [saving, setSaving] = useState(false) const [error, setError] = useState(null) const isTopLevel = mode === 'create_top' || (mode === 'edit' && editTarget?.depth === 0) const isEdit = mode === 'edit' const titleMap = { create_top: '新增第一層部門', create_child: `新增子部門 (隸屬: ${parentDept?.name})`, edit: `編輯部門:${editTarget?.name}`, } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setSaving(true) setError(null) try { const payload: Record = { name: form.name.trim(), code: form.code.trim().toUpperCase(), description: form.description.trim() || null, email_address: form.email_address.trim() || null, email_quota_mb: form.email_quota_mb, } if (form.name_en.trim()) payload.name_en = form.name_en.trim() if (isEdit) { // 編輯:PUT,只有第一層可更新 email_domain if (isTopLevel) payload.email_domain = form.email_domain.trim() || null await apiClient.put(`/departments/${editTarget!.id}`, payload) } else { // 新增:POST payload.parent_id = form.parent_id ?? null if (isTopLevel) payload.email_domain = form.email_domain.trim() || null await apiClient.post('/departments/', payload) } onSaved() onClose() } catch (err: unknown) { const msg = err instanceof Error ? err.message : '操作失敗,請稍後再試' setError(msg) } finally { setSaving(false) } } return (
{/* Header */}

{titleMap[mode]}

{/* Form */}
{error && (
{error}
)}
setForm({ ...form, name: e.target.value })} className="w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" placeholder="例:業務發展部" />
setForm({ ...form, name_en: e.target.value })} className="w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" placeholder="例:Business Development" />
setForm({ ...form, code: e.target.value.toUpperCase() })} className="w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:bg-gray-100 disabled:text-gray-500" placeholder="例:BD" />
{isTopLevel && (
setForm({ ...form, email_domain: e.target.value })} className="w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono" placeholder="ease.taipei" />
)}
setForm({ ...form, email_address: e.target.value })} className="w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono" placeholder="例:business@ease.taipei" />
setForm({ ...form, email_quota_mb: parseInt(e.target.value) || 5120 })} className="w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" />

{(form.email_quota_mb / 1024).toFixed(1)} GB