feat(webui): add dashboard stat details
ci / lint-prettier (push) Successful in 11s
ci / lint-ruff (push) Successful in 5s
ci / lint-yaml (push) Successful in 6s
ci / lint-dockerfiles (push) Successful in 8s
ci / validate (push) Successful in 7s
ci / publish (push) Successful in 30s

This commit is contained in:
2026-07-26 19:53:19 +02:00
parent 81e69865ce
commit 70ac1ce73e
3 changed files with 60 additions and 2 deletions
+8
View File
@@ -361,6 +361,8 @@ function renderChannels(accountId, channels) {
// Update channel count stat
panel.querySelector('.channel-count').textContent = String(channels.length);
panel.querySelector('.channel-active-count').textContent = String(channels.length);
panel.querySelector('.channel-inactive-count').textContent = '0';
}
function renderJobs(accountId, jobs) {
@@ -616,6 +618,7 @@ function renderSummary(accountId, data) {
const d = data.dashboard || data.state || {};
const health = data.health || {};
panel.querySelector('.forwarding-count').textContent = String((d.forwarding_rules || []).length);
panel.querySelector('.forwarding-active-count').textContent = String((d.forwarding_rules || []).length);
const toggle = panel.querySelector('.scrape-media-label');
toggle.textContent = d.scrape_media ? 'ON' : 'OFF';
const healthOk = health.api_credentials && health.session_ready && health.data_dir_exists;
@@ -626,6 +629,11 @@ function renderSummary(accountId, data) {
`${health.media_count || 0} media`,
health.active_job ? `active: ${health.active_job.status}` : 'idle',
].join(' | ');
const mediaCount = Number(health.media_count || 0);
panel.querySelector('.media-session-count').textContent = String(mediaCount);
panel.querySelector('.media-total-count').textContent = String(mediaCount);
panel.querySelector('.health-session-value').textContent = health.session_ready ? 'Valid' : 'Check';
panel.querySelector('.health-rate-value').textContent = health.active_job ? 'Busy' : 'OK';
}
/* ── Account data loading ───────────────────────────── */
+20
View File
@@ -196,18 +196,38 @@
<div class="panel stat-panel">
<div class="section-title">Channels</div>
<div class="stat-value channel-count">0</div>
<div class="stat-caption">Tracked channels</div>
<div class="stat-meta">
<span><strong class="channel-active-count">0</strong> Active</span
><span><strong class="channel-inactive-count">0</strong> Inactive</span>
</div>
</div>
<div class="panel stat-panel">
<div class="section-title">Media scraping</div>
<div class="stat-value stat-compact scrape-media-label">OFF</div>
<div class="stat-caption">Items downloaded</div>
<div class="stat-meta">
<span><strong class="media-session-count">0</strong> This session</span
><span><strong class="media-total-count">0</strong> Total</span>
</div>
</div>
<div class="panel stat-panel">
<div class="section-title">Forwarding rules</div>
<div class="stat-value forwarding-count">0</div>
<div class="stat-caption">Active rules</div>
<div class="stat-meta">
<span><strong class="forwarding-active-count">0</strong> Active</span
><span><strong>0</strong> Paused</span>
</div>
</div>
<div class="panel stat-panel">
<div class="section-title">Account health</div>
<div class="stat-value stat-compact account-health-label">-</div>
<div class="stat-caption">Session status</div>
<div class="stat-meta">
<span><strong class="health-session-value">-</strong> Session</span
><span><strong class="health-rate-value">-</strong> Rate limit</span>
</div>
<div class="muted small account-health-detail"></div>
</div>
</section>
+32 -2
View File
@@ -2100,11 +2100,41 @@ a.nav-link {
font-weight: 500;
}
.stat-panel .account-health-detail {
color: #c7c7c7;
.stat-caption {
margin-top: 3px;
color: #bdbdbd;
font-size: 12px;
}
.stat-meta {
position: absolute;
right: 18px;
bottom: 15px;
left: 18px;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
color: #bdbdbd;
font-size: 12px;
}
.stat-meta span + span {
padding-left: 12px;
border-left: 1px solid #363636;
}
.stat-meta strong {
display: block;
margin-bottom: 1px;
color: #ededed;
font-size: 14px;
font-weight: 500;
}
.stat-panel .account-health-detail {
display: none;
}
.panel {
padding: 0;
overflow: hidden;