Playout: slate fallback, strict ffprobe validation, Prometheus metrics Chat: history on join, DM offline delivery, env-config rate limits, Redis auto-reconnect, heartbeat, ban/mute enforcement, DM metrics Viewer: presence indicators, schedule overlay, public /api/schedule Admin: playlist drag-reorder, schedule overrides CRUD, user actions, inline mod buttons, CSV export, config editor, restart buttons, upload normalization gate, analytics time range nginx: CORS preflight, JSON health, stub_status Docs: test-lab vs production distinction across all configs/docs Infra: Redis maxmemory, CD health IP-agnostic, slate volume mount
54 lines
1.8 KiB
HTML
54 lines
1.8 KiB
HTML
<div class="panel-header-row">
|
|
<div>
|
|
<h1>Analytics</h1>
|
|
<p>Basic activity counters from chat history and moderation audit logs.</p>
|
|
</div>
|
|
<div class="button-row">
|
|
<select id="analytics-range" class="text-input" style="width:auto">
|
|
<option value="1h">Last hour</option>
|
|
<option value="6h">Last 6 hours</option>
|
|
<option value="24h" selected>Last 24 hours</option>
|
|
<option value="7d">Last 7 days</option>
|
|
</select>
|
|
<button id="reload-analytics-btn" type="button" class="btn btn-secondary">Reload analytics</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="stat-grid">
|
|
<article class="stat-card">
|
|
<h2>Total Messages</h2>
|
|
<p id="analytics-total-messages" class="stat-value">0</p>
|
|
</article>
|
|
<article class="stat-card">
|
|
<h2>Last 24 Hours</h2>
|
|
<p id="analytics-messages-24h" class="stat-value">0</p>
|
|
</article>
|
|
<article class="stat-card">
|
|
<h2>Distinct Rooms</h2>
|
|
<p id="analytics-distinct-rooms" class="stat-value">0</p>
|
|
</article>
|
|
<article class="stat-card">
|
|
<h2>Moderation Actions</h2>
|
|
<p id="analytics-moderation-actions" class="stat-value">0</p>
|
|
</article>
|
|
</div>
|
|
|
|
<div class="panel-card">
|
|
<div class="panel-header-row">
|
|
<h2>Top Rooms</h2>
|
|
<p id="analytics-generated-at" class="small-muted">loading...</p>
|
|
</div>
|
|
<div class="table-wrap">
|
|
<table class="data-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Room</th>
|
|
<th>Messages</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="analytics-table-body"></tbody>
|
|
</table>
|
|
</div>
|
|
<p id="analytics-status" class="status-line" aria-live="polite">Loading analytics...</p>
|
|
</div>
|