// File: frontend/app/(protected)/admin/users/_components/user-form-dialog.jsx 'use client'; import { useState, useEffect } from 'react'; import api from '@/lib/api'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Switch } from '@/components/ui/switch'; import { Checkbox } from "@/components/ui/checkbox" export function UserFormDialog({ user, isOpen, setIsOpen, onSuccess }) { const [formData, setFormData] = useState({}); const [allRoles, setAllRoles] = useState([]); const [selectedRoles, setSelectedRoles] = useState(new Set()); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); const isEditMode = !!user; useEffect(() => { // ดึงข้อมูล Role ทั้งหมดมาเตรียมไว้ const fetchRoles = async () => { try { const res = await api.get('/rbac/roles'); setAllRoles(res.data); } catch (err) { console.error('Failed to fetch roles', err); } }; fetchRoles(); }, []); useEffect(() => { // เมื่อ user prop เปลี่ยน (เปิด dialog เพื่อแก้ไข) ให้ตั้งค่าฟอร์ม if (isEditMode) { setFormData({ username: user.username, email: user.email, first_name: user.first_name || '', last_name: user.last_name || '', is_active: user.is_active, }); setSelectedRoles(new Set(user.Roles?.map(role => role.id) || [])); } else { // ถ้าเป็นการสร้างใหม่ ให้เคลียร์ฟอร์ม setFormData({ username: '', email: '', password: '', first_name: '', last_name: '', is_active: true, }); setSelectedRoles(new Set()); } setError(''); }, [user, isOpen]); const handleInputChange = (e) => { const { id, value } = e.target; setFormData((prev) => ({ ...prev, [id]: value })); }; const handleRoleChange = (roleId) => { setSelectedRoles(prev => { const newSet = new Set(prev); if (newSet.has(roleId)) { newSet.delete(roleId); } else { newSet.add(roleId); } return newSet; }); }; const handleSubmit = async (e) => { e.preventDefault(); setIsLoading(true); setError(''); const payload = { ...formData, roles: Array.from(selectedRoles) }; try { if (isEditMode) { await api.put(`/users/${user.id}`, payload); } else { await api.post('/users', payload); } onSuccess(); // บอกให้หน้าหลัก refresh ข้อมูล setIsOpen(false); // ปิด Dialog } catch (err) { setError(err.response?.data?.message || 'An unexpected error occurred.'); } finally { setIsLoading(false); } }; return (
{isEditMode ? 'Edit User' : 'Create New User'} {isEditMode ? `Editing ${user.username}` : 'Fill in the details for the new user.'}
{!isEditMode && (
)}
{allRoles.map(role => (
handleRoleChange(role.id)} />
))}
setFormData(prev => ({...prev, is_active: checked}))} />
{error &&

{error}

}
); }