{% extends "base.html" %}

{% load static %}
{% load projecttags %}
{% load project_url_tag %}
{% load humanize %}

{% block title %} All builds - Toaster {% endblock %}
{% block extraheadcontent %}
<link rel="stylesheet" href="/static/css/jquery-ui.min.css" type='text/css'>
<link rel="stylesheet" href="/static/css/jquery-ui.structure.min.css" type='text/css'>
<link rel="stylesheet" href="/static/css/jquery-ui.theme.min.css" type='text/css'>
<script src="/static/js/jquery-ui.min.js"></script>
<script src="/static/js/filtersnippet.js"></script>
{% endblock %}

{% block pagecontent %}

{% if last_date_from and last_date_to %}
<script>
    // initialize the date range controls
    $(document).ready(function () {
        date_init('started_on','{{last_date_from}}','{{last_date_to}}','{{dateMin_started_on}}','{{dateMax_started_on}}','{{daterange_selected}}');
        date_init('completed_on','{{last_date_from}}','{{last_date_to}}','{{dateMin_completed_on}}','{{dateMax_completed_on}}','{{daterange_selected}}');
    });
</script>
{%endif%} {# last_date_from and last_date_to #}

<div class="row-fluid">

  {% include "mrb_section.html" %}

  <div class="page-header top-air">
     <h1>
      {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
          {{objects.paginator.count}} build{{objects.paginator.count|pluralize}} found
      {%elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
          No builds found
      {%else%}
          All builds
      {%endif%}
     </h1>
  </div>

  {% if objects.paginator.count == 0 %}
    <div class="row-fluid">
      <div class="alert">
        <form class="no-results input-append" id="searchform">
            <input id="search" name="search" class="input-xxlarge" type="text" value="
            {% if request.GET.search %}
                {{request.GET.search}}
        {% endif %}"/>
            {% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
            <button class="btn" type="submit" value="Search">Search</button>
            <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all builds</button>
        </form>
      </div>
    </div>
  {% else %}
  {% include "basetable_top.html" %}
        <!-- Table data rows; the order needs to match the order of "tablecols" definitions; and the <td class value needs to match the tablecols clclass value for show/hide buttons to work -->
        {% for build in objects %}
        <tr class="data" data-table-build-result="{{ build.id }}">
            <td class="outcome">
                <a href="{% url "builddashboard" build.id %}">{%if build.outcome == build.SUCCEEDED%}<i class="icon-ok-sign success"></i>{%elif build.outcome == build.FAILED%}<i class="icon-minus-sign error"></i>{%else%}{%endif%}</a> &nbsp;
            </td>
            <td class="target">
                {% for t in build.target_set.all %}
                    <a href="{% url "builddashboard" build.id %}">
                        {% if t.task %}
                            {{t.target}}:{{t.task}}
                        {% else %}
                            {{t.target}}
                        {% endif %}
                    </a> <br />
                {% endfor %}
            </td>
            <td class="machine"><a href="{% url "builddashboard" build.id %}">{{build.machine}}</a></td>
            <td class="started_on"><a href="{% url "builddashboard" build.id %}">{{build.started_on|date:"d/m/y H:i"}}</a></td>
            <td class="completed_on"><a href="{% url "builddashboard" build.id %}">{{build.completed_on|date:"d/m/y H:i"}}</a></td>
            <td class="failed_tasks error">
                {% query build.task_build outcome=4 order__gt=0 as exectask%}
                    {% if exectask.count == 1 %}
                        <a href="{% url "task" build.id exectask.0.id %}">{{exectask.0.recipe.name}}.{{exectask.0.task_name}}</a>
                        <a href="{% url 'build_artifact' build.id "tasklogfile" exectask.0.id %}">
                            <i class="icon-download-alt" title="" data-original-title="Download task log file"></i>
                        </a>
                    {% elif exectask.count > 1%}
                        <a href="{% url "tasks" build.id %}?filter=outcome%3A4">{{exectask.count}} task{{exectask.count|pluralize}}</a>
                    {%endif%}
            </td>
            <td class="errors.count errors_no">
                {% if  build.errors.count %}
                    <a class="errors.count error" href="{% url "builddashboard" build.id %}#errors">{{build.errors.count}} error{{build.errors.count|pluralize}}</a>
                {%endif%}
            </td>
            <td class="warnings.count warnings_no">{% if  build.warnings.count %}<a class="warnings.count warning" href="{% url "builddashboard" build.id %}#warnings">{{build.warnings.count}} warning{{build.warnings.count|pluralize}}</a>{%endif%}</td>
            <td class="time"><a href="{% url "buildtime" build.id %}">{{build.timespent_seconds|sectohms}}</a></td>
            <td class="output">
              {% if build.outcome == build.SUCCEEDED %}
              <a href="{%url "builddashboard" build.id%}#images">{{fstypes|get_dict_value:build.id}}</a>
              {% endif %}
            </td>
            <td class="project-name">
                <a href="{% project_url build.project %}">{{build.project.name}}</a>
                {% if build.project.is_default %}
                    <i class="icon-question-sign get-help hover-help" title="" data-original-title="This project shows information about the builds you start from the command line while Toaster is running" style="visibility: hidden;"></i>
                {% endif %}
            </td>
        </tr>

        {% endfor %}


  {% include "basetable_bottom.html" %}
  {% endif %} {# objects.paginator.count #}
</div><!-- end row-fluid-->

{% endblock %}
