admin.html 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>Admin — PPS Quarantine</title>
  7. <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
  8. <link rel="stylesheet" href="{{ url_for('static', filename='admin.css') }}">
  9. </head>
  10. <body class="admin-page">
  11. <header class="topbar">
  12. <span class="brand">PPS Quarantine — Admin</span>
  13. <nav class="admin-nav" id="admin-nav"></nav>
  14. <span class="spacer"></span>
  15. <a class="topbar-link" href="/">← Back to quarantine</a>
  16. <a class="logout" href="{{ url_for('auth.logout') }}">Sign out</a>
  17. </header>
  18. <div id="toast" class="toast hidden"></div>
  19. <main class="admin-main">
  20. <section id="sec-access" class="admin-section">
  21. <h2>Access</h2>
  22. <div id="auth-mode-banner" class="banner hidden"></div>
  23. <table class="admin-table" id="users-table">
  24. <thead><tr><th>Email</th><th>Role</th><th></th></tr></thead>
  25. <tbody id="users-body"></tbody>
  26. </table>
  27. <div class="row">
  28. <input id="new-user-email" type="email" placeholder="new.user@example.com">
  29. <select id="new-user-role"><option value="user">user</option><option value="admin">admin</option></select>
  30. <button class="btn" id="add-user-btn">Add user</button>
  31. </div>
  32. <label class="field-block">Denied message
  33. <textarea id="denied-message" rows="2"></textarea>
  34. </label>
  35. <button class="btn primary" data-save="access">Save access</button>
  36. </section>
  37. <section id="sec-pps" class="admin-section">
  38. <h2>PPS connection</h2>
  39. <label class="field-block">Base URL <input id="pps-base_url" type="text"></label>
  40. <label class="field-block">Username <input id="pps-username" type="text"></label>
  41. <label class="field-block">Password
  42. <input id="pps-password" type="password" placeholder="••••••">
  43. <span id="pps-password-state" class="hint"></span>
  44. </label>
  45. <label class="field-inline"><input id="pps-verify_tls" type="checkbox"> Verify TLS</label>
  46. <label class="field-block">Timeout (s) <input id="pps-timeout" type="number" min="5" max="600"></label>
  47. <label class="field-block">Client cert <input id="pps-client_cert" type="text"></label>
  48. <label class="field-block">Client key <input id="pps-client_key" type="text"></label>
  49. <div class="row">
  50. <button class="btn" id="pps-test-btn">Test connection</button>
  51. <span id="pps-test-result" class="hint"></span>
  52. </div>
  53. <button class="btn primary" data-save="pps">Save connection</button>
  54. </section>
  55. <section id="sec-folders" class="admin-section">
  56. <h2>Folders</h2>
  57. <p class="hint">Names must match PPS exactly (case- and space-sensitive).</p>
  58. <ul id="folders-list" class="chip-list"></ul>
  59. <div class="row">
  60. <input id="new-folder" type="text" placeholder="Exact folder name">
  61. <button class="btn" id="add-folder-btn">Add folder</button>
  62. </div>
  63. <label class="field-block">Default folder <select id="q-default_folder"></select></label>
  64. <label class="field-block">Deleted folder <select id="q-deleted_folder"></select></label>
  65. <button class="btn primary" data-save="folders">Save folders</button>
  66. </section>
  67. <section id="sec-defaults" class="admin-section">
  68. <h2>Defaults</h2>
  69. <label class="field-block">Default show limit <input id="q-default_limit" type="number" min="1" max="1000"></label>
  70. <label class="field-block">Days back <input id="q-default_days_back" type="number" min="1"></label>
  71. <label class="field-block">List query <input id="q-list_query" type="text"></label>
  72. <label class="field-block">Chunk size <input id="q-chunk_size" type="number" min="1" max="500"></label>
  73. <label class="field-block">Default sort field <select id="q-default_sort_field"></select></label>
  74. <label class="field-block">Default sort dir <select id="q-default_sort_dir"></select></label>
  75. <p class="hint">Show limit and sort are user-overridable.</p>
  76. <button class="btn primary" data-save="defaults">Save defaults</button>
  77. </section>
  78. <section id="sec-rr" class="admin-section">
  79. <h2>Report &amp; Release</h2>
  80. <div id="rr-steps" class="rr-steps"></div>
  81. <label class="field-block">Move target <select id="rr-move_target"></select></label>
  82. <label class="field-block">Delay between steps (seconds)
  83. <input id="rr-step_delay_seconds" type="number" min="0" max="3600" step="1">
  84. </label>
  85. <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>
  86. <p class="rr-sentence" id="rr-sentence"></p>
  87. <button class="btn primary" data-save="rr">Save Report &amp; Release</button>
  88. </section>
  89. <section id="sec-jobs" class="admin-section">
  90. <h2>Background jobs</h2>
  91. <button class="btn" id="jobs-refresh">Refresh</button>
  92. <table class="admin-table" id="jobs-table">
  93. <thead><tr><th>#</th><th>User</th><th>Action</th><th>Folder</th><th>Status</th><th>Progress</th><th></th></tr></thead>
  94. <tbody id="jobs-body"></tbody>
  95. </table>
  96. </section>
  97. <section id="sec-logs" class="admin-section">
  98. <h2>Logs</h2>
  99. <div class="row">
  100. <select id="log-source"><option value="ops">Operations (worker)</option><option value="app">Application</option></select>
  101. <input id="log-filter" type="text" placeholder="filter…">
  102. <label class="field-inline"><input id="log-auto" type="checkbox" checked> Auto-refresh</label>
  103. <button class="btn" id="log-refresh">Refresh</button>
  104. </div>
  105. <pre id="log-view" class="log-view"></pre>
  106. </section>
  107. </main>
  108. <script src="{{ url_for('static', filename='admin.js') }}"></script>
  109. </body>
  110. </html>