// File: frontend/app/(protected)/admin/_components/role-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 { Checkbox } from '@/components/ui/checkbox'; import { ScrollArea } from '@/components/ui/scroll-area'; export function RoleFormDialog({ role, allPermissions, isOpen, setIsOpen, onSuccess }) { const [formData, setFormData] = useState({ name: '', description: '' }); const [selectedPermissions, setSelectedPermissions] = useState(new Set()); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); const isEditMode = !!role; useEffect(() => { // Reset state ทุกครั้งที่ dialog เปิดขึ้นมาใหม่ if (isOpen) { if (isEditMode) { // โหมดแก้ไข: ตั้งค่าฟอร์มด้วยข้อมูล Role ที่มีอยู่ setFormData({ name: role.name, description: role.description || '' }); setSelectedPermissions(new Set(role.Permissions?.map(p => p.id) || [])); } else { // โหมดสร้างใหม่: เคลียร์ฟอร์ม setFormData({ name: '', description: '' }); setSelectedPermissions(new Set()); } setError(''); } }, [role, isOpen]); // ให้ re-run effect นี้เมื่อ role หรือ isOpen เปลี่ยน const handleInputChange = (e) => { const { id, value } = e.target; setFormData((prev) => ({ ...prev, [id]: value })); }; const handlePermissionChange = (permissionId) => { setSelectedPermissions(prev => { const newSet = new Set(prev); if (newSet.has(permissionId)) { newSet.delete(permissionId); } else { newSet.add(permissionId); } return newSet; }); }; const handleSubmit = async (e) => { e.preventDefault(); setIsLoading(true); setError(''); try { if (isEditMode) { // โหมดแก้ไข: อัปเดต Permissions ของ Role ที่มีอยู่ await api.put(`/rbac/roles/${role.id}/permissions`, { permissionIds: Array.from(selectedPermissions) }); } else { // โหมดสร้างใหม่: สร้าง Role ใหม่ก่อน const newRoleRes = await api.post('/rbac/roles', formData); // ถ้าสร้าง Role สำเร็จ และมีการเลือก Permission ไว้ ให้ทำการผูกสิทธิ์ทันที if (newRoleRes.data && selectedPermissions.size > 0) { await api.put(`/rbac/roles/${newRoleRes.data.id}/permissions`, { permissionIds: Array.from(selectedPermissions) }); } } onSuccess(); // บอกให้หน้าแม่ (roles/page.jsx) โหลดข้อมูลใหม่ setIsOpen(false); // ปิด Dialog } catch (err) { setError(err.response?.data?.message || 'An unexpected error occurred.'); } finally { setIsLoading(false); } }; return (
{isEditMode ? `Edit Permissions for: ${role.name}` : 'Create New Role'} {isEditMode ? 'Select the permissions for this role.' : 'Define a new role and its initial permissions.'}
{/* แสดงฟอร์มสำหรับชื่อและคำอธิบายเฉพาะตอนสร้างใหม่ */} {!isEditMode && ( <>
)}
{allPermissions.map(perm => (
handlePermissionChange(perm.id)} />
))}
{error &&

{error}

}
); }