'use client'; import { registerPage } from '../registry.js'; import { useState, useEffect } from 'react'; import { Card, Table, Button, Badge } from '@zen/core/shared/components'; import { PencilEdit01Icon, Cancel01Icon } from '@zen/core/shared/icons'; import { useToast } from '@zen/core/toast'; import AdminHeader from '../components/AdminHeader.js'; import RoleEditModal from '../components/RoleEditModal.client.js'; const RolesPageClient = ({ canManage }) => { const toast = useToast(); const [roles, setRoles] = useState([]); const [loading, setLoading] = useState(true); const [editingRoleId, setEditingRoleId] = useState(null); const [modalOpen, setModalOpen] = useState(false); const openEdit = (roleId) => { setEditingRoleId(roleId); setModalOpen(true); }; const closeModal = () => { setModalOpen(false); setEditingRoleId(null); }; const columns = [ { key: 'name', label: 'Rôle', sortable: false, render: (role) => (
{role.name}
{role.description && (
{role.description}
)}
), skeleton: { height: 'h-4', width: '60%' }, }, { key: 'permission_count', label: 'Permissions', sortable: false, render: (role) => ( {role.permission_count} ), skeleton: { height: 'h-4', width: '40px' }, }, { key: 'user_count', label: 'Utilisateurs', sortable: false, render: (role) => ( {role.user_count} ), skeleton: { height: 'h-4', width: '40px' }, }, { key: 'is_system', label: 'Système', sortable: false, render: (role) => role.is_system ? système : null, skeleton: { height: 'h-4', width: '60px' }, }, ...(canManage ? [{ key: 'actions', label: '', sortable: false, noWrap: true, align: 'right', render: (role) => (
{!role.is_system && ( )}
), skeleton: { height: 'h-8', width: '80px', className: 'rounded-lg' }, }] : []), ]; const fetchRoles = async () => { setLoading(true); try { const response = await fetch('/zen/api/roles', { credentials: 'include' }); if (!response.ok) throw new Error(`Error: ${response.status}`); const data = await response.json(); setRoles(data.roles); } catch (err) { toast.error(err.message || 'Impossible de charger les rôles'); } finally { setLoading(false); } }; const handleDelete = async (role) => { if (!confirm(`Supprimer le rôle "${role.name}" ?`)) return; try { const response = await fetch(`/zen/api/roles/${role.id}`, { method: 'DELETE', credentials: 'include', }); const data = await response.json(); if (!response.ok) { toast.error(data.message || 'Impossible de supprimer ce rôle'); return; } toast.success('Rôle supprimé'); fetchRoles(); } catch { toast.error('Impossible de supprimer ce rôle'); } }; useEffect(() => { fetchRoles(); }, []); return ( <> ); }; const RolesPage = ({ user }) => { const canManage = user?.permissions?.includes('roles.manage'); return (
); }; const RolesPageHeader = ({ canManage }) => { const [modalOpen, setModalOpen] = useState(false); return ( <> setModalOpen(true)}> Nouveau rôle )} /> {canManage && ( setModalOpen(false)} /> )} ); }; export default RolesPage; registerPage({ slug: 'roles', title: 'Rôles', Component: RolesPage });