// ════════════════════════════════════════════════════════════════ // /admin/audit — журнал событий // ════════════════════════════════════════════════════════════════ function AuditLog({ currentUser }) { const A = window.SDH_ADMIN; const isSuperAdmin = currentUser.role === 'super_admin'; // Admin видит только свои действия const baseEvents = isSuperAdmin ? A.auditLog : A.auditLog.filter(e => e.user === currentUser.email.split('@')[0] || e.user.includes(currentUser.name.split(' ')[0].toLowerCase())); const [actionFilter, setActionFilter] = React.useState('all'); const [userFilter, setUserFilter] = React.useState('all'); const [range, setRange] = React.useState('7d'); const allActions = [...new Set(baseEvents.map(e => e.kind))].sort(); const allUsers = [...new Set(baseEvents.map(e => e.user))].sort(); let events = baseEvents; if (actionFilter !== 'all') events = events.filter(e => e.kind === actionFilter); if (userFilter !== 'all') events = events.filter(e => e.user === userFilter); return (
Экспорт CSV } /> период {['24h', '7d', '30d', 'all'].map(r => ( ))} } right={ <> {isSuperAdmin && ( )} } />
{events.length} событий в выборке
{/* head */}
время
кто
действие
детали
ip
{events.length === 0 ? ( ) : ( events.slice(0, 80).map(ev => ) )} {events.length > 80 && (
показаны первые 80 · ещё {events.length - 80}
)}
); } window.AuditLog = AuditLog;