feat(web): Stage E dashboard — wide cards, per-item actions, toast stack
A large, cohesive redesign of the web dashboard (all pieces depend on each other, so this lands as one commit): Layout / display: - Host/Runners/VMware/Cache split into a Host-VMware-Runners-Cache info row; Host card keeps uptime/load/cores/mem-total now that CPU%/RAM are promoted to the status-header tiles (new gauge tiles, red/amber/ green thresholds shared with the existing disk tile). - VMware modules rendered as a table; Live VMs/Templates/Artifacts/ Services/Maintenance span the full grid width (card--wide). - Backups moved from a standalone Files-panel table into an expandable per-template row on the Templates panel (backups_by_template), with a per-backup Delete action and a per-row Backup button replacing the old host-card template dropdown. - New Maintenance card: cleanup-orphans and cache-purge forms consolidated into one danger-zone card (red rule + row separators), each op's max-age control on its own row so it reads as the op's parameter, not decoration; cache purge gets an explicit "Empty all" button alongside the age-based "Purge". - Artifacts gain a per-row Delete action. Action/feedback layer: - Every mutating route now sets HX-Trigger: ci:refresh on its result, so polled panels reload immediately instead of waiting for their next poll interval; _result_partial takes an explicit level (ok/info/error) independent of the ok bool, so e.g. an age-based purge that finds nothing to remove reads as neutral "info" instead of a misleading green "ok" or a red "error". - Results render as toasts appended to a fixed #toast-stack (base.html) instead of swapping a single #action-slot -- concurrent actions (two backups running at once) now each keep their own toast instead of the later one clobbering the earlier. Per-state colour is a left stripe + tint (result-ok/info/error), fixing a cascade bug where the plain .toast background silently beat the state class. - The confirm dialog is a real modal <dialog> (app.js: showModal(), Cancel/ESC clear the slot); confirming closes it immediately and shows a busy spinner toast in the stack (since a real backup can run for minutes) instead of leaving the dialog open with no feedback. - host_backup now runs backup_template via asyncio.to_thread so a multi-GB 7z run no longer blocks the event loop (and every other dashboard poll) for its whole duration. - Static assets are served with a mtime-based ?v= query param so a redeploy is picked up without a hard refresh.
This commit is contained in:
@@ -27,6 +27,24 @@
|
||||
<rect x="19.5" y="10" width="3" height="4"></rect>
|
||||
</symbol>
|
||||
|
||||
<symbol id="i-memory" viewBox="0 0 24 24">
|
||||
<rect x="2" y="7" width="20" height="10" rx="1.5"></rect>
|
||||
<line x1="6" y1="17" x2="6" y2="20"></line>
|
||||
<line x1="12" y1="17" x2="12" y2="20"></line>
|
||||
<line x1="18" y1="17" x2="18" y2="20"></line>
|
||||
<line x1="7" y1="11" x2="9" y2="11"></line>
|
||||
<line x1="11" y1="11" x2="13" y2="11"></line>
|
||||
<line x1="15" y1="11" x2="17" y2="11"></line>
|
||||
</symbol>
|
||||
|
||||
<symbol id="i-trash" viewBox="0 0 24 24">
|
||||
<path d="M3 6h18"></path>
|
||||
<path d="M8 6V4a1 1 0 011-1h6a1 1 0 011 1v2"></path>
|
||||
<path d="M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6"></path>
|
||||
<line x1="10" y1="11" x2="10" y2="17"></line>
|
||||
<line x1="14" y1="11" x2="14" y2="17"></line>
|
||||
</symbol>
|
||||
|
||||
<symbol id="i-box" viewBox="0 0 24 24">
|
||||
<path d="M21 8l-9-5-9 5 9 5 9-5z"></path>
|
||||
<path d="M3 8v8l9 5 9-5V8"></path>
|
||||
|
||||
Reference in New Issue
Block a user