{% extends "base.html" %} {% import "_run_macros.html" as rm %} {% import "_macros.html" as m %} {% block title %}Run #{{ run.id }} (live) — rosbackup-ng{% endblock %} {% block head %}{% endblock %} {% block page_title %}Run #{{ run.id }}{% if live %} · live{% endif %}{% if run.dry_run %} · dry-run{% endif %}{% endblock %} {% block head_actions %} Table view ← History {% endblock %} {% block content %}
{{ m.scope_link(run.scope_kind, run.scope_value) }} {% if run.dry_run %}dry-run{% endif %} {% if run.status == 'running' %}running{% endif %}
{{ run.trigger }} · started {{ run.started_at | datetime }}
{% if skipped_offline %}
⊘ Skipped {{ skipped_offline|length }} device(s) monitored offline: {{ skipped_offline|join(', ') }}
{% endif %}
{% if live %} {# Same SSE feed as the table view, rendered as compose-style rows (view=compose) — a faithful copy of the CLI's `-x` output. Each event OOB-swaps the matching row in place; the run keeps going server-side if this browser disconnects, and reopening re-attaches. #}
{% endif %} {% set op = run.scope_kind if run.scope_kind in ('upgrade', 'downgrade') else 'backup' %}
{% if aggregate %} {%- set _verb = {'upgrade': 'Upgrading', 'downgrade': 'Downgrading'}.get(op, 'Backing up') %} {{ rm.compose_aggregate(stats, false, _verb) }} {% else %}
[+] Executing {{ op }} for {{ rows|length }} device{{ '' if rows|length == 1 else 's' }} ...
{% for r in rows %}{{ rm.compose_row(r.name, r.status, false, r.since, r.elapsed, r.detail) }}{% endfor %}
{% endif %} {% if summary %}{{ rm.compose_summary(summary, size_str) }}{% else %}
{% endif %}
{% endblock %}