{% from "_partials/job_card.html" import status_badge, duration_fmt, timestamp_cell %} {# Sortable column header macro #} {% macro sort_header(label, field, current_sort, current_order) %} {% set is_active = (current_sort == field) %} {% set next_order = 'asc' if (is_active and current_order == 'desc') else 'desc' %} {% set indicator = '' %} {% if is_active %} {% set indicator = ' ▲' if current_order == 'asc' else ' ▼' %} {% endif %} {{ label }}{{ indicator }} {% endmacro %} {% if jobs %}
| ID | {{ sort_header('Actor', 'actor', sort, order) }} | {{ sort_header('Queue', 'queue', sort, order) }} | {{ sort_header('Status', 'status', sort, order) }} | {% if tab == 'live' %}Progress | {% endif %}{{ sort_header('Created', 'created_at', sort, order) }} | Started | {{ sort_header('Finished', 'finished_at', sort, order) if tab == 'archived' else 'Finished' }} | Duration | {{ sort_header('Attempt', 'attempt', sort, order) }} | Tags | {% if tab == 'archived' %}Archived | {% endif %}Actions |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ job.id[:8] }} | {{ job.actor }} | {{ job.queue }} | {{ status_badge(job.status) }} | {% if tab == 'live' %}
{% set ps = job.progress_state or {} %}
{% if ps is mapping and (ps.get('percent') or ps.get('step')) %}
|
{% endif %}
{{ timestamp_cell(job.created_at) }} | {{ timestamp_cell(job.started_at) }} | {{ timestamp_cell(job.finished_at) }} | {% if job.duration_ms is not none %}{{ duration_fmt(job.duration_ms) }}{% else %}—{% endif %} | {{ job.attempt }}/{{ job.max_attempts }} |
{% for tag in (job.tags or [])[:3] %}
{{ tag }}
{% endfor %}
{% if (job.tags or []) | length > 3 %}
+{{ job.tags | length - 3 }}
{% endif %}
|
{% if tab == 'archived' %}
{% if job.get('archived_at') %}{{ job.archived_at[:19] }}{% else %}—{% endif %} | {% endif %}
No jobs found matching the current filters.
Clear all filters