'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { Card, Button, Input, Textarea, Switch } from '@zen/core/shared/components'; import { useToast } from '@zen/core/toast'; import { getPermissionGroups } from '@zen/core/users/constants'; const PERMISSION_GROUPS = getPermissionGroups(); const isNewRole = (roleId) => roleId === 'new'; const RoleEditPage = ({ roleId }) => { const router = useRouter(); const toast = useToast(); const [loading, setLoading] = useState(!isNewRole(roleId)); const [saving, setSaving] = useState(false); const [isSystem, setIsSystem] = useState(false); const [name, setName] = useState(''); const [description, setDescription] = useState(''); const [color, setColor] = useState('#6b7280'); const [selectedPerms, setSelectedPerms] = useState([]); useEffect(() => { if (isNewRole(roleId)) return; const fetchRole = async () => { try { const response = await fetch(`/zen/api/roles/${roleId}`, { credentials: 'include' }); if (!response.ok) { toast.error('Rôle introuvable'); router.push('/admin/roles'); return; } const data = await response.json(); const role = data.role; setName(role.name || ''); setDescription(role.description || ''); setColor(role.color || '#6b7280'); setSelectedPerms(role.permission_keys || []); setIsSystem(role.is_system || false); } catch { toast.error('Impossible de charger ce rôle'); router.push('/admin/roles'); } finally { setLoading(false); } }; fetchRole(); }, [roleId]); const togglePerm = (key) => { setSelectedPerms(prev => prev.includes(key) ? prev.filter(k => k !== key) : [...prev, key] ); }; const handleSubmit = async (e) => { e.preventDefault(); if (!name.trim()) { toast.error('Le nom du rôle est requis'); return; } setSaving(true); try { const isCreating = isNewRole(roleId); const url = isCreating ? '/zen/api/roles' : `/zen/api/roles/${roleId}`; const method = isCreating ? 'POST' : 'PUT'; const body = { name: name.trim(), description: description.trim() || null, color, permissionKeys: selectedPerms, }; const response = await fetch(url, { method, credentials: 'include', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }); const data = await response.json(); if (!response.ok) { toast.error(data.message || 'Impossible de sauvegarder ce rôle'); return; } toast.success(isCreating ? 'Rôle créé' : 'Rôle mis à jour'); router.push('/admin/roles'); } catch { toast.error('Impossible de sauvegarder ce rôle'); } finally { setSaving(false); } }; if (loading) { return (
Rôle système — le nom ne peut pas être modifié
)}