import { useEffect, useMemo, useState } from 'react'; import type { FormEvent } from 'react'; import { useAuth } from '../auth/AuthContext'; import { Alert, LoadingBlock, errorMessage } from '../components/Feedback'; import { Icon } from '../components/Icon'; import { createRole, listPermissions, listRoles, replaceRolePermissions, updateRole, } from '../lib/api'; import type { AdministrativeRole, Permission } from '../lib/api'; const groupLabels: Record = { dashboard: 'Panel general', users: 'Usuarios', roles: 'Roles y permisos', audit: 'Auditoría', assets: 'Inventarios', asset_types: 'Tipos y atributos de inventario', asset_relations: 'Relaciones Área–Organización', asset_registry: 'Registro documental y legal', asset_imports: 'Importaciones de inventarios', inspections: 'Inspecciones', inspection_acts: 'Actas de inspección', inspection_findings: 'Hallazgos', inspection_verifications: 'Planificación de verificaciones', finding_catalog: 'Catálogo de hallazgos', surveys: 'Relevamientos', }; const permissionLabels: Record = { read: 'Consultar', create: 'Crear', update: 'Modificar', manage: 'Administrar', change_status: 'Cambiar estado', change_operational_status: 'Cambiar estado operativo', read_history: 'Ver historial', read_temporal: 'Consultar estado histórico', read_geometry: 'Ver ubicación', update_geometry: 'Modificar ubicación', read_media: 'Ver archivos', manage_media: 'Administrar archivos', read_provenance: 'Ver procedencia', manage_provenance: 'Administrar procedencia', verify_provenance: 'Validar procedencia', plan: 'Planificar', }; function permissionLabel(permission: Permission) { const action = permission.code.split('.').slice(1).join('_'); return permissionLabels[action] ?? permission.description ?? permission.code; } export function RolesPage() { const { hasPermission } = useAuth(); const canManage = hasPermission('roles.manage'); const [roles, setRoles] = useState([]); const [permissions, setPermissions] = useState([]); const [selectedId, setSelectedId] = useState(null); const [creating, setCreating] = useState(false); const [code, setCode] = useState(''); const [name, setName] = useState(''); const [description, setDescription] = useState(''); const [permissionIds, setPermissionIds] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(''); const [success, setSuccess] = useState(''); const selected = roles.find((role) => role.id === selectedId) ?? null; const grouped = useMemo(() => permissions.reduce>((result, permission) => { const group = permission.code.split('.')[0] ?? 'other'; (result[group] ??= []).push(permission); return result; }, {}), [permissions]); const selectRole = (role: AdministrativeRole) => { setCreating(false); setSelectedId(role.id); setCode(role.code); setName(role.name); setDescription(role.description); setPermissionIds(role.permissions.map((permission) => permission.id)); setError(''); setSuccess(''); }; const startCreate = () => { setCreating(true); setSelectedId(null); setCode(''); setName(''); setDescription(''); setPermissionIds([]); setError(''); setSuccess(''); }; const load = async (preferId?: string) => { const [loadedRoles, loadedPermissions] = await Promise.all([listRoles(), listPermissions()]); setRoles(loadedRoles); setPermissions(loadedPermissions); const next = loadedRoles.find((role) => role.id === preferId) ?? loadedRoles[0]; if (next) selectRole(next); }; useEffect(() => { load().catch((requestError) => setError(errorMessage(requestError))).finally(() => setLoading(false)); }, []); const togglePermission = (id: string) => setPermissionIds((current) => current.includes(id) ? current.filter((value) => value !== id) : [...current, id]); const save = async (event: FormEvent) => { event.preventDefault(); setError(''); setSuccess(''); setSaving(true); try { let saved: AdministrativeRole; if (creating) { saved = await createRole({ code, name, description, permissionIds }); } else if (selected) { await updateRole(selected.id, { name, description }); saved = await replaceRolePermissions(selected.id, permissionIds); } else return; await load(saved.id); setSuccess(creating ? 'Rol creado correctamente' : 'Rol y permisos actualizados'); setCreating(false); } catch (requestError) { setError(errorMessage(requestError)); } finally { setSaving(false); } }; if (loading) return ; return
ADMINISTRACIÓN

Roles y permisos

Elegí qué puede consultar o modificar cada perfil. Los códigos técnicos quedan como referencia secundaria.

{canManage && }
{error && {error}}{success && {success}}
{creating ? 'NUEVO ROL' : selected?.isSystem ? 'ROL DEL SISTEMA' : 'ROL PERSONALIZADO'}

{creating ? 'Crear rol' : name}

{selected?.isSystem && !creating && Sistema}