// Admin view: audit log function AdminView({ user }) { const [tab, setTab] = React.useState('audit'); const [audit, setAudit] = React.useState([]); const [loading, setLoading] = React.useState(true); React.useEffect(() => { let cancelled = false; async function fetchAudit() { try { const res = await fetch('/audit?limit=100'); if (!res.ok) return; const data = await res.json(); if (!cancelled) setAudit(data); } catch (_) {} if (!cancelled) setLoading(false); } fetchAudit(); const t = setInterval(fetchAudit, 5000); return () => { cancelled = true; clearInterval(t); }; }, []); const tabs = [ { id: 'audit', label: 'Auditoría', icon: 'terminal', count: audit.length }, ]; return (
Administración
Registro de auditoría de acciones de usuarios y comandos enviados a paneles.
{tabs.map(t => ( ))}
{tab === 'audit' && (
Registro de auditoría
Acciones de usuarios y comandos enviados a paneles.
{loading ? (
Cargando…
) : (
{audit.length === 0 && ( )} {audit.map(a => { const isError = !a.success; return ( ); })}
FechaAcciónUsuarioPanelMensajeResultado
Sin registros de auditoría.
{formatTs(a.at, { full:true })} {a.action} {a.user} {a.client_description || '—'} {a.message || '—'} {isError ? 'Error' : 'OK'}
)}
)}
); } window.AdminView = AdminView;