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
61 lines
2.4 KiB
HTML
61 lines
2.4 KiB
HTML
<div class="panel-header-row">
|
|
<div>
|
|
<h1>Moderation</h1>
|
|
<p>Create moderation actions and review the recent immutable audit log.</p>
|
|
</div>
|
|
<div class="button-row">
|
|
<button id="reload-moderation-btn" type="button" class="btn btn-secondary">Reload logs</button>
|
|
<button id="export-chat-log-btn" type="button" class="btn btn-secondary">Export CSV</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="moderation-grid">
|
|
<section class="panel-card">
|
|
<h2>New Action</h2>
|
|
<form id="moderation-form" class="form-stack">
|
|
<label>Action
|
|
<select id="mod-action" class="text-input">
|
|
<option value="mute">mute</option>
|
|
<option value="ban">ban</option>
|
|
<option value="delete">delete</option>
|
|
<option value="timeout">timeout</option>
|
|
</select>
|
|
</label>
|
|
<label>Target
|
|
<input id="mod-target" class="text-input" type="text" placeholder="username or message id" required />
|
|
</label>
|
|
<label>Moderator
|
|
<input id="mod-moderator" class="text-input" type="text" placeholder="admin" />
|
|
</label>
|
|
<label>Room
|
|
<input id="mod-room" class="text-input" type="text" placeholder="main" />
|
|
</label>
|
|
<label>Reason
|
|
<textarea id="mod-reason" class="text-input text-area" placeholder="Explain why this action is needed" required></textarea>
|
|
</label>
|
|
<button id="mod-submit" type="submit" class="btn btn-primary">Submit action</button>
|
|
<p id="moderation-status" class="status-line" aria-live="polite">Loading moderation logs...</p>
|
|
</form>
|
|
</section>
|
|
|
|
<section class="panel-card">
|
|
<div class="panel-header-row">
|
|
<h2>Recent Audit Log</h2>
|
|
<p class="small-muted">Latest entries</p>
|
|
</div>
|
|
<div class="table-wrap">
|
|
<table class="data-table">
|
|
<thead>
|
|
<tr>
|
|
<th>When</th>
|
|
<th>Action</th>
|
|
<th>Target</th>
|
|
<th>Moderator</th>
|
|
<th>Reason</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="moderation-table-body"></tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
</div> |