{# Individual task item for composite jobs with streaming support #} {% if task.status == TaskStatusEnum.COMPLETED %} {% set task_status_class = "bg-green-100 text-green-800" %} {% set task_status_icon = "✓" %} {% elif task.status == TaskStatusEnum.FAILED %} {% set task_status_class = "bg-red-100 text-red-800" %} {% set task_status_icon = "✗" %} {% elif task.status == TaskStatusEnum.RUNNING %} {% set task_status_class = "bg-blue-100 text-blue-800" %} {% set task_status_icon = "⟳" %} {% elif task.status == TaskStatusEnum.SKIPPED %} {% set task_status_class = "bg-yellow-100 text-yellow-800" %} {% set task_status_icon = "⏸" %} {% else %} {% set task_status_class = "bg-gray-100 text-gray-800" %} {% set task_status_icon = "◦" %} {% endif %} {% set task_started = task.started_at | format_datetime_browser("%H:%M:%S", browser_tz_offset) if task.started_at else "N/A" %} {% set task_finished = task.completed_at | format_datetime_browser("%H:%M:%S", browser_tz_offset) if task.completed_at else "N/A" %} {% set task_duration = "" %} {% if task.started_at and task.completed_at %} {% set duration = task.completed_at - task.started_at %} {% set task_duration = "({:.1f}s)".format(duration.total_seconds()) %} {% endif %}
{{ task_status_icon }} {% if task.status == TaskStatusEnum.SKIPPED %} Cancelled {% else %} {{ task.status.title() }} {% endif %} {{ task.task_name }} {{ task_duration }}
{{ task_started }} - {{ task_finished }}
{% if task_expanded %}
{# Task details for streaming/running tasks #} {% if task.status == TaskStatusEnum.RUNNING %} {# Create SSE connection specifically for this task #}
Live Output:
Streaming
Connecting to task output...
{# Auto-refresh to static view when task completes #}
{% else %} {# Static task output #} {% if task.output and task.output.strip() %}
Output:
{{ task.output.strip() }}
{% if task.error %}
Error: {{ task.error }}
{% endif %}
{% elif task.error %}
Error: {{ task.error }}
{% else %}
No output available
{% endif %} {% endif %}
{% endif %}