{% if scan.cancelled %}
{{ scan.started_at[:19] | replace("T", " ") }} UTCcancelled
{% else %}
{{ scan.started_at[:19] | replace("T", " ") }} UTC
{% for tid in scan.tools_run %}{{ tool_names[tid].display_name if tid in tool_names else tid }}{% if not loop.last %}, {% endif %}{% endfor %}
{{ scan.findings_count }} finding{{ "s" if scan.findings_count != 1 else "" }}
{% if scan.narrated_by %}
{{ scan.narrated_by }}
{% else %}
{% endif %}
{% endif %}
{% if scan.warnings %}
{{ scan.warnings | length }} warning{{ "s" if scan.warnings | length != 1 else "" }}
{% for w in scan.warnings %}
{{ w }}
{% endfor %}
{% else %}
{# Holds the warning column open so the Delete button below lines up with
the Delete button of every other row, warned or not. #}
{% endif %}
{# After the warning column, not before it: the pill's width varies with
its own content, so anything left of it shifts between a warned and an
unwarned row. Keeping both action controls to its right lets them share
one straight edge down the list. #}
Re-run
{% if scan.surface %}
{# Last child, spanning every column, so it occupies its own grid row.
Inline it competed with six other cells for horizontal space and, on a
row that also carried a narration badge, pushed Delete clean off the
right edge. #}
{% for entity_type, count in scan.surface %}{{ surface_label(entity_type, count) }}{% if not loop.last %} · {% endif %}{% endfor %}
{% endif %}
{% endmacro %}
{% block content %}
Scan history
{% if pending %}
In progress ({{ pending | length }})
{% for scan in pending %}
{{ scan.target }}
{% if scan.started %}
running
{% else %}
queued — waiting for a free slot
{% endif %}
{% if scan.elapsed_minutes < 1 %}just submitted{% else %}{{ scan.elapsed_minutes }}m ago{% endif %}
{% endfor %}
At most {{ max_concurrent_scans }} scan(s) run at once; the rest wait their turn.