feat(admin): cancel buttons for in-flight scans + cancelled state UI

- per-row Cancel button in the scan-progress card; listeners are bound
  after the TS island renders its rows (module scope has no inline
  handlers), and the button is removed once its job turns terminal
- cancel-all icon button in the card header: resolves the server's
  active job list first, so it also covers scans this page never
  started (e.g. started before a refresh), then cancels each one
- polling treats cancelled as terminal, averages overall progress
  only over jobs that can still advance (so the bar can reach 100%),
  and the results panel reports cancelled scans instead of claiming
  "Scan Complete!"
- sidebar spinner resets on the scan_cancelled websocket event (same
  quiet handling as scan_error)
- setup wizard shows "Cancelled" as a terminal status in its poller

No new innerHTML assignment sites - rendering-ownership baseline
unchanged.
This commit is contained in:
John O'Keefe committed 2026-10-18 18:02:34 -04:00
1 parent 5b81e19f2f
commit e1153b2c4b
5 files changed
+156 -13

No files matched your search

+8 -3
View File
@@ -97,9 +97,14 @@ templ Admin(user User, stats AdminStats) {
@Icon("refresh", "h-5 w-5")
Scanning Libraries
</h3>
<button @click="hideScanProgress()" class="icon-btn" aria-label="Close">
@Icon("close", "h-5 w-5")
</button>
<div class="flex items-center gap-2">
<button id="scan-cancel-all-btn" @click="cancelAllScans()" class="hidden icon-btn" aria-label="Cancel all scans" title="Cancel all scans">
@Icon("x-circle", "h-5 w-5")
</button>
<button @click="hideScanProgress()" class="icon-btn" aria-label="Close">
@Icon("close", "h-5 w-5")
</button>
</div>
</div>
<div class="mb-4">
<div class="flex justify-between text-sm mb-2">