| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- <!doctype html>
- <html lang="en">
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Admin — PPS Quarantine</title>
- <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
- <link rel="stylesheet" href="{{ url_for('static', filename='admin.css') }}">
- </head>
- <body class="admin-page">
- <header class="topbar">
- <span class="brand">PPS Quarantine — Admin</span>
- <nav class="admin-nav" id="admin-nav"></nav>
- <span class="spacer"></span>
- <a class="topbar-link" href="/">← Back to quarantine</a>
- <a class="logout" href="{{ url_for('auth.logout') }}">Sign out</a>
- </header>
- <div id="toast" class="toast hidden"></div>
- <main class="admin-main">
- <section id="sec-access" class="admin-section">
- <h2>Access</h2>
- <div id="auth-mode-banner" class="banner hidden"></div>
- <table class="admin-table" id="users-table">
- <thead><tr><th>Email</th><th>Role</th><th></th></tr></thead>
- <tbody id="users-body"></tbody>
- </table>
- <div class="row">
- <input id="new-user-email" type="email" placeholder="new.user@example.com">
- <select id="new-user-role"><option value="user">user</option><option value="admin">admin</option></select>
- <button class="btn" id="add-user-btn">Add user</button>
- </div>
- <label class="field-block">Denied message
- <textarea id="denied-message" rows="2"></textarea>
- </label>
- <button class="btn primary" data-save="access">Save access</button>
- </section>
- <section id="sec-pps" class="admin-section">
- <h2>PPS connection</h2>
- <label class="field-block">Base URL <input id="pps-base_url" type="text"></label>
- <label class="field-block">Username <input id="pps-username" type="text"></label>
- <label class="field-block">Password
- <input id="pps-password" type="password" placeholder="••••••">
- <span id="pps-password-state" class="hint"></span>
- </label>
- <label class="field-inline"><input id="pps-verify_tls" type="checkbox"> Verify TLS</label>
- <label class="field-block">Timeout (s) <input id="pps-timeout" type="number" min="5" max="600"></label>
- <label class="field-block">Client cert <input id="pps-client_cert" type="text"></label>
- <label class="field-block">Client key <input id="pps-client_key" type="text"></label>
- <div class="row">
- <button class="btn" id="pps-test-btn">Test connection</button>
- <span id="pps-test-result" class="hint"></span>
- </div>
- <button class="btn primary" data-save="pps">Save connection</button>
- </section>
- <section id="sec-folders" class="admin-section">
- <h2>Folders</h2>
- <p class="hint">Names must match PPS exactly (case- and space-sensitive).</p>
- <ul id="folders-list" class="chip-list"></ul>
- <div class="row">
- <input id="new-folder" type="text" placeholder="Exact folder name">
- <button class="btn" id="add-folder-btn">Add folder</button>
- </div>
- <label class="field-block">Default folder <select id="q-default_folder"></select></label>
- <label class="field-block">Deleted folder <select id="q-deleted_folder"></select></label>
- <button class="btn primary" data-save="folders">Save folders</button>
- </section>
- <section id="sec-defaults" class="admin-section">
- <h2>Defaults</h2>
- <label class="field-block">Default show limit <input id="q-default_limit" type="number" min="1" max="1000"></label>
- <label class="field-block">Days back <input id="q-default_days_back" type="number" min="1"></label>
- <label class="field-block">List query <input id="q-list_query" type="text"></label>
- <label class="field-block">Chunk size <input id="q-chunk_size" type="number" min="1" max="500"></label>
- <label class="field-block">Default sort field <select id="q-default_sort_field"></select></label>
- <label class="field-block">Default sort dir <select id="q-default_sort_dir"></select></label>
- <p class="hint">Show limit and sort are user-overridable.</p>
- <button class="btn primary" data-save="defaults">Save defaults</button>
- </section>
- <section id="sec-rr" class="admin-section">
- <h2>Report & Release</h2>
- <div id="rr-steps" class="rr-steps"></div>
- <label class="field-block">Move target <select id="rr-move_target"></select></label>
- <label class="field-block">Delay between steps (seconds)
- <input id="rr-step_delay_seconds" type="number" min="0" max="3600" step="1">
- </label>
- <p class="hint">Waits this long between actions on the same message so PPS's backend settles (e.g. before moving a just-released message). 0 disables.</p>
- <p class="rr-sentence" id="rr-sentence"></p>
- <button class="btn primary" data-save="rr">Save Report & Release</button>
- </section>
- <section id="sec-jobs" class="admin-section">
- <h2>Background jobs</h2>
- <button class="btn" id="jobs-refresh">Refresh</button>
- <table class="admin-table" id="jobs-table">
- <thead><tr><th>#</th><th>User</th><th>Action</th><th>Folder</th><th>Status</th><th>Progress</th><th></th></tr></thead>
- <tbody id="jobs-body"></tbody>
- </table>
- </section>
- <section id="sec-logs" class="admin-section">
- <h2>Logs</h2>
- <div class="row">
- <select id="log-source"><option value="ops">Operations (worker)</option><option value="app">Application</option></select>
- <input id="log-filter" type="text" placeholder="filter…">
- <label class="field-inline"><input id="log-auto" type="checkbox" checked> Auto-refresh</label>
- <button class="btn" id="log-refresh">Refresh</button>
- </div>
- <pre id="log-view" class="log-view"></pre>
- </section>
- </main>
- <script src="{{ url_for('static', filename='admin.js') }}"></script>
- </body>
- </html>
|