Webapp redesign: fixes from the functional regression test

- Unattend: a command's '...' menu stayed open after Move up/down and
  covered the next row's menu, so the next click could stage removing the
  wrong command. The menu now closes and focus returns to its button.
- '...' menus close on an outside click, on Escape and when another
  opens (static/app.js), for every page.
- Drivers: Remove asks to confirm again, as before the redesign. Long zip
  paths in a row body wrap (the page scrolled sideways at 390 px).
- Rollback review returns to the page it was opened from (Dell page or
  Updates overview), for both Cancel and the rollback itself.
- To-do: the ServiceNow period offers a year again (366 days).
- Imaging floor: a search that matches a log-only bay opens that group;
  its open state survives the live refresh. 'Clear all' states the
  number of session files it deletes, hidden finished ones included.
- Dashboard: the image key pattern is valid under the browser's v flag
  (client-side validation was silently skipped).
- Import: allowed_import_source() compares real paths, so
  '<upload dir>/../..' is refused. This path traversal predates the
  redesign; the import moves the source tree, so it mattered.
This commit is contained in:
cproudlock
2026-10-14 14:48:10 -04:00
parent 2bcc9d8016
commit 2ed2cbe2e9
11 changed files with 61 additions and 15 deletions

View File

@@ -993,7 +993,11 @@ def imaging_dashboard():
hidden = 0
if not show_all:
sessions, hidden = imaging_status.hide_stale(sessions)
# Clear all deletes every session file, hidden finished ones included;
# log-only bays have no file. The confirm states that number.
clear_count = len(imaging_status.list_sessions(include_inferred=False))
return render_template("imaging.html", sessions=imaging_status.floor_order(sessions), hidden=hidden,
clear_count=clear_count,
show_all=show_all, window_hours=imaging_status.ACTIVE_WINDOW_HOURS)