fix(dashboard): командный центр — навигация ведёт в /admin, дни в «висит»

Кнопки инбокса (Открыть/Разблокировать/Разобрать) и ссылки
все алерты/все сессии вели на голый #hash и оставались на /dashboard.
Теперь ведут в /admin#sessions|#users. fmtSince показывает дни для
сессий старше 48ч (1888ч → 78д 16ч).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-31 11:01:14 +03:00
parent 8629616a04
commit ca5dc3a4f3
+6 -5
View File
@@ -83,6 +83,7 @@
let min = Math.floor((Date.now() - d.getTime()) / 60000);
if (min < 0) min = 0;
const hr = Math.floor(min / 60);
if (hr >= 48) return Math.floor(hr / 24) + 'д ' + (hr % 24) + 'ч';
return hr > 0 ? hr + 'ч ' + (min % 60) + 'м' : min + 'м';
}
function fmtBannedDate(s) {
@@ -187,7 +188,7 @@
sev: 'rose', kind: 'block', kindLabel: 'Блокировка',
title: u.name || '—',
meta: `<span class="acc-mono">${e(u.email || '')}</span> · ${fmtBannedDate(u.banned_at)}`,
act: 'Разблокировать', actHash: '#users', solid: false,
act: 'Разблокировать', actHash: '/admin#users', solid: false,
});
});
(d.stuckSessions || []).forEach((s) => {
@@ -195,7 +196,7 @@
sev: 'amber', kind: 'stuck', kindLabel: 'Зависла',
title: s.user_name || '—',
meta: `${e(s.subject_name || '—')} · висит <span class="acc-mono">${fmtSince(s.started_at)}</span>`,
act: 'Открыть', actHash: '#sessions', solid: true,
act: 'Открыть', actHash: '/admin#sessions', solid: true,
});
});
const ab = d.abandonedSessions24h || 0;
@@ -204,7 +205,7 @@
sev: 'amber', kind: 'stuck', kindLabel: 'Брошено',
title: 'Всплеск брошенных сессий',
meta: `<span class="acc-mono">${ab}</span> сессий прервано за 24ч`,
act: 'Разобрать', actHash: '#sessions', solid: false,
act: 'Разобрать', actHash: '/admin#sessions', solid: false,
});
}
return items;
@@ -246,7 +247,7 @@
<div class="acc-ttl-ic"><svg class="acc-ic sm" viewBox="0 0 24 24"><path d="M12 3l9 16H3z"/><path d="M12 10v4M12 17h.01"/></svg></div>
<h2>Требует внимания</h2>
<span class="acc-count">${items.length} ${items.length === 1 ? 'событие' : 'событий'}</span>
<span class="acc-more" data-go="#sessions">все алерты <svg class="acc-ic xs" viewBox="0 0 24 24"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
<span class="acc-more" data-go="/admin#sessions">все алерты <svg class="acc-ic xs" viewBox="0 0 24 24"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</div>
<div class="acc-attn-tabs">
<button class="acc-attn-tab${_tab === 'all' ? ' on' : ''}" data-tab="all">Все <span class="acc-tag">${items.length}</span></button>
@@ -303,7 +304,7 @@
<div class="acc-card-head">
<div class="acc-ttl-ic" style="background:var(--acc-green-50)"><svg class="acc-ic sm" style="stroke:var(--acc-green)" viewBox="0 0 24 24"><path d="M4 18V7M9 18V4M14 18v-7M19 18V9"/></svg></div>
<h2>Топ сегодня</h2>
<span class="acc-more" data-go="#sessions">все сессии <svg class="acc-ic xs" viewBox="0 0 24 24"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
<span class="acc-more" data-go="/admin#sessions">все сессии <svg class="acc-ic xs" viewBox="0 0 24 24"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
</div>
<div class="acc-feed">${feedHtml}</div>
${subjBlock}