diff --git a/public/admin.css b/public/admin.css index 60ff4e4..feff405 100644 --- a/public/admin.css +++ b/public/admin.css @@ -353,6 +353,10 @@ body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;b .audit-table tr:last-child td{border-bottom:none} .audit-table tr:hover td{background:rgba(37,99,235,.04)} .audit-wrap{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);overflow-x:auto} +.audit-details{background:none;border:none;padding:0;margin:0;color:var(--accent);font-size:.8rem;text-align:left;cursor:pointer;max-width:360px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +.audit-details:hover{text-decoration:underline} +.audit-details-body{background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:12px;max-height:60vh;overflow:auto} +.audit-details-body pre{margin:0;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.78rem;line-height:1.45;color:var(--text)} /* --- AI Correction --- */ .ai-btn{background:none;border:none;color:var(--muted);cursor:pointer;font-size:1.1rem;padding:4px 8px;border-radius:6px;transition:color .15s,background .15s;vertical-align:middle;margin-left:6px} diff --git a/public/audit.html b/public/audit.html index a3fadc5..501149a 100644 --- a/public/audit.html +++ b/public/audit.html @@ -38,6 +38,15 @@ +
diff --git a/public/js/audit.js b/public/js/audit.js index 35b2da1..5f9c1db 100644 --- a/public/js/audit.js +++ b/public/js/audit.js @@ -1,16 +1,28 @@ const ACTION_LABELS = { + 'auth.login': 'Вход в систему', 'settings.update': 'Изменены настройки', + 'user.create': 'Создан пользователь', + 'user.update': 'Изменён пользователь', + 'user.delete': 'Удалён пользователь', 'group.create': 'Создана группа', 'group.update': 'Изменена группа', 'group.delete': 'Удалена группа', 'group.photo.create': 'Загружена фото группы', 'group.photo.update': 'Изменено фото группы', + 'group.photo.reorder': 'Изменён порядок фото группы', + 'group.photo.set_cover': 'Обновлена обложка группы', 'group.photo.delete': 'Удалено фото группы', + 'branch.create': 'Создан филиал', + 'branch.update': 'Изменён филиал', + 'branch.delete': 'Удалён филиал', 'student.create': 'Добавлен ученик', 'student.update': 'Изменён ученик', 'student.delete': 'Удалён ученик', 'student.batch-group': 'Ученики перенесены в группу', 'entry.update': 'Изменена запись', + 'entry.photo.update': 'Изменено фото записи', + 'entry.photo.set_main': 'Главное фото записи', + 'entry.photo.delete': 'Удалено фото записи', 'entry.soft-delete': 'Запись в корзину', 'entry.restore': 'Запись восстановлена', 'entry.permanent-delete': 'Запись удалена безвозвратно', @@ -32,6 +44,7 @@ const ACTION_LABELS = { const AUDIT_PAGE_SIZE = 50; let auditPage = 1; let auditTotal = 0; +let auditRows = []; function fmtTime(t) { try { return new Date(t).toLocaleString('ru'); } catch { return t || ''; } @@ -48,6 +61,14 @@ function dt(t) { } catch { return esc(String(t).slice(0, 120)); } } +function fullTarget(t) { + if (!t) return ''; + if (typeof t === 'object') return JSON.stringify(t, null, 2); + try { + return JSON.stringify(JSON.parse(t), null, 2); + } catch { return String(t); } +} + function renderPager(container, page, totalPages, onPageChange) { if (totalPages <= 1) { container.innerHTML = ''; return; } const pages = []; @@ -86,11 +107,12 @@ async function loadAudit() { el.innerHTML = ''; } else { document.getElementById('auditEmpty').style.display = 'none'; - el.innerHTML = filtered.map(r => ` + auditRows = filtered; + el.innerHTML = filtered.map((r, i) => `