55 lines
2.8 KiB
HTML
55 lines
2.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="ru">
|
|
<head>
|
|
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
<title>Дашборд · {%title%}</title>
|
|
<link rel="stylesheet" href="/web/css/admin.css">
|
|
</head>
|
|
<body>
|
|
<div class="admin-bg"></div>
|
|
<div class="admin-wrap">
|
|
<header class="admin-header">
|
|
<div class="header-left">
|
|
<h1>📊 Дашборд</h1>
|
|
</div>
|
|
<div class="header-right">
|
|
<a href="/admin/users" class="nav-link">👥 Пользователи</a>
|
|
</div>
|
|
</header>
|
|
|
|
<div class="stat-grid">
|
|
<div class="stat-card"><div class="stat-lbl">Всего</div><div class="stat-val" style="color:var(--accent)">{%total_users%}</div></div>
|
|
<div class="stat-card"><div class="stat-lbl">Free</div><div class="stat-val" style="color:var(--green)">{%free_users%}</div></div>
|
|
<div class="stat-card"><div class="stat-lbl">Test</div><div class="stat-val" style="color:var(--amber)">{%test_users%}</div></div>
|
|
<div class="stat-card"><div class="stat-lbl">Premium</div><div class="stat-val" style="color:var(--green)">{%paid_users%}</div></div>
|
|
<div class="stat-card"><div class="stat-lbl">Онлайн</div><div class="stat-val" style="color:var(--accent)">{%online_count%}</div><div class="stat-sub">на всех серверах</div></div>
|
|
<div class="stat-card"><div class="stat-lbl">Выручка</div><div class="stat-val" style="color:var(--green)">{%total_revenue%}₽</div><div class="stat-sub">всего оплат</div></div>
|
|
<div class="stat-card"><div class="stat-lbl">Серверов</div><div class="stat-val" style="color:var(--amber)">{%server_count%}</div></div>
|
|
<div class="stat-card"><div class="stat-lbl">Инбаундов</div><div class="stat-val" style="color:var(--rose)">{%inbound_count%}</div></div>
|
|
</div>
|
|
|
|
<div class="srv-section">
|
|
<h2>🖥 Серверы</h2>
|
|
{%servers_rows%}
|
|
</div>
|
|
</div>
|
|
<script>
|
|
function syncServer(name) {
|
|
if (!confirm('Синхронизировать пользователей на ' + name + '?\nБудут добавлены только те, кто есть на большинстве других серверов.')) return;
|
|
var btn = event.target;
|
|
var orig = btn.textContent;
|
|
btn.disabled = true;
|
|
btn.textContent = '...';
|
|
fetch('/admin/api/propagate/' + encodeURIComponent(name), {method:'POST'})
|
|
.then(function(r) { return r.json(); })
|
|
.then(function(d) {
|
|
var msg = 'Сервер: ' + d.server + '\n Всего: ' + d.total + '\nУже были: ' + d.already_on_server + '\nДобавлено: ' + d.added + '\nПропущено (мало серверов): ' + d.skipped + '\nОшибок: ' + d.failed;
|
|
alert(msg);
|
|
location.reload();
|
|
})['catch'](function(e) { alert('Ошибка: ' + e); })
|
|
['finally'](function() { btn.disabled = false; btn.textContent = orig; });
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|