##############################################################################}
{% macro JobList(jobs, show_arch_only=False) %}
- {% for job in jobs | sort %}
- {% set build = job.build %}
-
- <div class="block">
- <article class="panel
- {% if job.is_queued() %}
- is-info
- {% elif job.is_pending(installcheck=False) %}
- is-warning
- {% elif job.is_aborted() %}
- is-dark
- {% elif job.has_failed() %}
- is-danger
- {% elif job.has_finished() %}
- is-success
- {% else %}
- is-light
- {% endif %}
- ">
- <div class="panel-heading is-block">
- <div class="level is-mobile">
- <div class="level-left">
- <div class="level-item">
- {% if show_arch_only %}
- {{ job.arch }}
- {% else %}
- <a href="/builds/{{ build.uuid }}">
- {{ job }}
- </a>
+ <article class="panel">
+ {% for job in jobs | sort %}
+ <div class="panel-block is-block">
+ <div class="level">
+ <div class="level-left">
+ <div class="level-item">
+ <span class="icon is-medium">
+ {# Halted #}
+ {% if job.is_halted() %}
+ <i class="fa-solid fa-pause fa-2x"></i>
+
+ {# Queued #}
+ {% elif job.is_queued() %}
+ <i class="fa-solid fa-hourglass-start fa-2x"></i>
+
+ {# Dependency Problems #}
+ {% elif job.is_pending(installcheck=False) %}
+ <i class="fa-solid fa-arrows-turn-to-dots fa-2x"></i>
+
+ {# Pending #}
+ {% elif job.is_pending() %}
+ <i class="fa-solid fa-hourglass-start fa-2x"></i>
+
+ {# Running #}
+ {% elif job.is_running() %}
+ <i class="fa-solid fa-gear fa-spinner fa-2x"></i>
+
+ {# Aborted #}
+ {% elif job.is_aborted() %}
+ <i class="fa-solid fa-xmark fa-2x"></i>
+
+ {# Failed #}
+ {% elif job.has_failed() %}
+ <i class="fa-solid fa-xmark has-text-danger fa-2x"></i>
+
+ {# Finished #}
+ {% elif job.has_finished() %}
+ <i class="fa-solid fa-check has-text-success fa-2x"></i>
{% endif %}
- </div>
+ </span>
</div>
- <div class="level-right">
- {% if job.is_halted() %}
- <span class="tag">{{ _("Halted") }}</span>
- {% elif job.is_queued() %}
- <span class="tag">{{ _("Queued") }}</span>
- {% elif job.is_pending(installcheck=False) %}
- <span class="tag">{{ _("Dependency Problems") }}</span>
- {% elif job.is_pending() %}
- <span class="tag">{{ _("Pending") }}</span>
- {% elif job.is_running() %}
- <span class="tag">{{ _("Running...") }}</span>
- {% elif job.is_aborted() %}
- <span class="tag">{{ _("Aborted") }}</span>
- {% elif job.has_failed() %}
- <span class="tag">{{ _("Failed") }}</span>
- {% elif job.has_finished() %}
- <span class="tag">{{ _("Finished") }}</span>
- {% endif %}
+ <div class="level-item">
+ <div>
+ <h6 class="title is-6">
+ {% if show_arch_only %}
+ {{ job.arch }}
+ {% else %}
+ <a href="/builds/{{ job.build.uuid }}">
+ {{ job }}
+ </a>
+ {% endif %}
+ </h6>
+
+ {# Running #}
+ {% if job.is_running() %}
+ <p class="has-text-grey">
+ <small>
+ {{ _("Started %s...") % job.started_at | format_date(shorter=True) }}
+ </small>
+ </p>
+
+ {# Aborted #}
+ {% elif job.is_aborted() %}
+ <p class="has-text-danger">
+ <small>
+ {% set args = {
+ "when" : job.aborted_at | format_date(shorter=True),
+ "who" : job.aborted_by,
+ } %}
+
+ {% if job.aborted_by %}
+ {{ _("Was aborted %(when)s by %(who)s") % args }}
+ {% else %}
+ {{ _("Was automatically aborted %(when)s") % args }}
+ {% endif %}
+ </small>
+ </p>
+
+ {# Failed #}
+ {% elif job.has_failed() %}
+ <p class="has-text-danger">
+ <small>
+ {{ _("Failed %s") % job.finished_at | format_date(shorter=True) }}
+ </small>
+ </p>
+
+ {# Finished #}
+ {% elif job.has_finished() %}
+ <p class="has-text-success">
+ <small>
+ {{ _("Finished %s") % job.finished_at | format_date(shorter=True) }}
+ </small>
+ </p>
+ {% endif %}
+ </div>
</div>
</div>
- </div>
- {# Log #}
- {% if job.is_running() %}
- <div class="panel-block">
- {{ JobLogStream(job, limit=5) }}
- </div>
-
- {# Dependency Issues #}
- {% elif job.is_pending() and job.installcheck_succeeded is false %}
- <div class="panel-block">
- <ul>
- {% for line in job.message.splitlines() %}
- <li>{{ line }}</li>
- {% endfor %}
- </ul>
- </div>
- {% endif %}
-
- {% if job.is_running() or job.has_finished() %}
- <div class="panel-block is-block">
- <div class="level">
- <div class="level-left">
- <div class="level-item">
- {{ job.duration | format_time }}
-
- {# If the job is approaching its timeout, we will show a warning #}
- {% if job.times_out_in and job.times_out_in <= datetime.timedelta(hours=1) %}
- / {{ job.timeout | format_time }}
- {% endif %}
- </div>
+ <div class="level-right">
+ {# Retry? #}
+ {% if job.can_be_retried() %}
+ <div class="level-item">
+ <a class="button is-small is-warning" href="/jobs/{{ job.uuid }}/retry">
+ <span class="icon">
+ <i class="fa-solid fa-repeat"></i>
+ </span>
+
+ <span>
+ {{ _("Retry") }}
+ </span>
+ </a>
</div>
- <div class="level-right">
- <div class="level-item">
- <div class="buttons are-small">
- {% if job.show_log() %}
- {% if job.preceeding_jobs %}
- <div class="dropdown is-up is-right">
- <div class="dropdown-trigger">
- <a class="button is-light"
- aria-haspopup="true" aria-controls="dropdown-logs-{{ job.uuid }}">
- <span>{{ _("View Logs") }}</span>
-
- <span class="icon is-small">
- <i class="fas fa-angle-up" aria-hidden="true"></i>
- </span>
- </a>
- </div>
-
- <div class="dropdown-menu" id="dropdown-logs-{{ job.uuid }}" role="menu">
- <div class="dropdown-content">
- {% for j in job.all_jobs | reverse %}
- <a class="dropdown-item" href="/jobs/{{ j.uuid }}/log"
- {% if not j.has_log() %}disabled{% endif %}>
- {{ j.created_at | format_date }}
- </a>
- {% endfor %}
- </div>
- </div>
- </div>
- {% else %}
- <a class="button is-light" href="/jobs/{{ job.uuid }}/log">
- {{ _("View Log") }}
- </a>
- {% endif %}
- {% endif %}
+ {# Abort? #}
+ {% elif job.is_running() %}
+ <div class="level-item">
+ <a class="button is-small is-dark" href="/jobs/{{ job.uuid }}/abort">
+ <span class="icon">
+ <i class="fa-solid fa-stop"></i>
+ </span>
+
+ <span>
+ {{ _("Abort") }}
+ </span>
+ </a>
+ </div>
+ {% endif %}
- {% if job.can_be_retried() %}
- <a class="button is-warning" href="/jobs/{{ job.uuid }}/retry">
- {{ _("Retry") }}
- </a>
- {% elif job.is_running() %}
- <a class="button is-dark" href="/jobs/{{ job.uuid }}/abort">
- {{ _("Abort") }}
+ {# Logs #}
+ {% if job.show_log() %}
+ <div class="level-item">
+ {% if job.preceeding_jobs %}
+ <div class="dropdown is-up is-right">
+ <div class="dropdown-trigger">
+ <a class="button is-text" aria-haspopup="true"
+ aria-controls="dropdown-logs-{{ job.uuid }}">
+ <span class="icon">
+ <i class="fa-solid fa-file-lines"></i>
+ </span>
+
+ <span class="icon is-small">
+ <i class="fas fa-angle-up" aria-hidden="true"></i>
+ </span>
</a>
- {% endif %}
+ </div>
+
+ <div class="dropdown-menu" id="dropdown-logs-{{ job.uuid }}" role="menu">
+ <div class="dropdown-content">
+ {% for j in job.all_jobs | reverse %}
+ <a class="dropdown-item" href="/jobs/{{ j.uuid }}/log"
+ {% if not j.has_log() %}disabled{% endif %}>
+ {{ j.created_at | format_date }}
+ </a>
+ {% endfor %}
+ </div>
+ </div>
</div>
- </div>
+ {% else %}
+ <a class="button is-text" href="/jobs/{{ job.uuid }}/log">
+ <span class="icon">
+ <i class="fa-solid fa-file-lines"></i>
+ </span>
+ </a>
+ {% endif %}
</div>
- </div>
- </div>
- {% endif %}
- </article>
- </div>
- {% endfor %}
-{% endmacro %}
+ {% endif %}
-{% macro JobQueue(jobs) %}
- <nav class="panel has-background-white">
- {% for job in jobs %}
- <a class="panel-block is-block {% if job.is_running() %}is-active{% endif %}"
- href="/builds/{{ job.build.uuid }}">
- <span class="level">
- <span class="level-left">
- <span class="level-item">
- {% if job.is_running() %}
- <span class="icon">
- <i class="fa-solid fa-gear fa-spin" aria-hidden="true"></i>
- </span>
- {% elif job.is_queued() %}
- <span class="icon">
- <i class="fa-solid fa-clock" aria-hidden="true"></i>
- </span>
- {% elif job.has_failed() %}
- <span class="icon">
- <i class="fa-solid fa-xmark has-text-danger" aria-hidden="true"></i>
- </span>
- {% elif job.is_aborted() %}
- <span class="icon">
- <i class="fa-solid fa-xmark" aria-hidden="true"></i>
- </span>
- {% elif job.has_finished() %}
- <span class="icon">
- <i class="fa-solid fa-check has-text-success" aria-hidden="true"></i>
- </span>
- {% endif %}
- </span>
-
- <span class="level-item">
- {{ job }}
- </span>
- </span>
-
- <span class="level-right">
+ {# Runtime #}
{% if job.has_finished() %}
- <span class="level-item">
- <span class="tag is-pulled-right">
- {{ job.duration | format_time }}
- </span>
- </span>
+ <div class="level-item">
+ <div class="tag">
+ {{ job.duration | format_time }}
+ </div>
+ </div>
{% endif %}
- </span>
- </span>
- </a>
-
- {# Show a message if there were no jobs #}
- {% else %}
- <div class="notification has-text-centered">
- {{ _("The job queue is empty") }}
+ </div>
+ </div>
</div>
{% endfor %}
- </nav>
+ </article>
{% endmacro %}
{% macro JobLogStream(job, small=False, limit=None) %}