{% extends "base.html" %} {% import "_run_macros.html" as rm %} {% import "_macros.html" as m %} {% block title %}Run #{{ run.id }} — rosbackup-ng{% endblock %} {% block head %}{% endblock %} {% block page_title %}Run #{{ run.id }}{% if run.dry_run %} · dry-run{% endif %}{% endblock %} {% block head_actions %} {% if live %}Live view ▸{% endif %} ← 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 %} {{ rm.run_summary(summary) }}
{{ run.trigger }} · started {{ run.started_at | datetime }} {%- if not live and run.duration_s is not none %} · {{ run.duration_s | duration }}{% endif %} {%- if not live and not run.dry_run %} · {{ total_bytes | filesize }} total{% endif %}
{% if skipped_offline %}
⊘ Skipped {{ skipped_offline|length }} device(s) monitored offline: {{ skipped_offline|join(', ') }}
{% endif %}
{% if live %} {# htmx SSE: each event OOB-swaps the matching row / the summary; the named "done" event closes the stream without reconnecting. #}
{# When the run finishes, refresh into the full per-target detail view (same as history). #}
{% for row in rows %}{{ rm.run_row(row.name, row.status, false, row.since, row.elapsed) }}{% endfor %}
DeviceStatusElapsed
{% else %} {% for r in detail_rows %} {%- if r.outputs %} {%- endif %} {% else %} {% endfor %}
DeviceHostVersionModelStatusDurationSizeFilesError
{{ r.name }} {{ r.host }} {{ r.version_change or r.ros_version or '—' }} {{ r.model or '—' }} {% if r.ok %}OK{% else %}Failed{% endif %} {{ r.duration_s | duration }} {% if r.ok %}{{ r.total_bytes | filesize }}{% else %}{% endif %} {{ r.file_count }} {% if r.error %}{{ r.error }}{% else %}{% endif %}
Command log — {{ r.name }} ({{ r.outputs|length }} step{{ '' if r.outputs|length == 1 else 's' }})
{% for o in r.outputs %}{{ o }}
{% endfor %}
No per-device detail recorded.
{% endif %}
{% endblock %}