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.
22 lines
1.0 KiB
HTML
22 lines
1.0 KiB
HTML
<section class="card" id="cache-card" hx-get="/cache" hx-trigger="every 5s, ci:refresh from:body" hx-swap="outerHTML">
|
|
<h2><svg class="icon" aria-hidden="true"><use href="#i-file"></use></svg>Cargo cache</h2>
|
|
{% if cache %}
|
|
{# Read-only info card -- the destructive "Purge" action lives in the
|
|
Maintenance card at the bottom of the dashboard (Stage E). #}
|
|
<dl>
|
|
<dt>Root</dt><dd><code>{{ cache.root }}</code></dd>
|
|
<dt>Total size</dt><dd>{{ cache.total_bytes | humanbytes }}</dd>
|
|
<dt>Entries</dt><dd>{{ cache.entry_count | thousands }}</dd>
|
|
<dt>Oldest entry</dt>
|
|
<dd>{{ cache.oldest_age_days ~ " day(s)" if cache.oldest_age_days is not none else "-" }}</dd>
|
|
<dt>Retention</dt><dd>{{ cache.retention_days }} day(s)</dd>
|
|
</dl>
|
|
<p class="field-hint">
|
|
“Purge (max age)” in Maintenance removes only entries older than this
|
|
retention window; “Empty all” clears the cache regardless of age.
|
|
</p>
|
|
{% else %}
|
|
<p class="notice notice-warn" role="alert">Cargo cache status unavailable.</p>
|
|
{% endif %}
|
|
</section>
|