{% extends "basebuildpage.html" %}
{% load humanize %}
{% load projecttags %}

{% block title %} {{mainheading}} - {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - {{build.project.name}} - Toaster{% endblock %}
{% block localbreadcrumb %}
<li>{{mainheading}}</li>
{% endblock %}

{% block nav-tasks %}
  {% if 'Tasks' == mainheading %}
    <li class="active"><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
  {% else %}
    <li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
  {% endif %}
{% endblock %}
{% block nav-buildtime %}
  {% if 'Time' == mainheading %}
    <li class="active"><a href="{% url 'buildtime' build.pk %}">Time</a></li>
  {% else %}
    <li><a href="{% url 'buildtime' build.pk %}">Time</a></li>
  {% endif %}
{% endblock %}

{% block nav-cputime %}
  {% if 'CPU time' == mainheading %}
    <li class="active"><a href="{% url 'cputime' build.pk %}">CPU time</a></li>
  {% else %}
    <li><a href="{% url 'cputime' build.pk %}">CPU time</a></li>
  {% endif %}
{% endblock %}

{% block nav-diskio %}
  {% if 'Disk I/O' == mainheading %}
    <li class="active"><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
  {% else %}
    <li><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
  {% endif %}
{% endblock %}

{% block buildinfomain %}
<div class="span10">
{% if not request.GET.filter and not request.GET.search and not objects.paginator.count %}
  <!-- Empty - no data in database -->
  <div class="page-header">
  <h1>{{mainheading}}</h1>
  </div>
  <div class="alert alert-info lead">
  No data was recorded for this build.
  </div>

{% else %}

  <div class="page-header">
  <h1>
  {% if  request.GET.filter and objects.paginator.count >  0 or request.GET.search and objects.paginator.count >  0 %}
      {{objects.paginator.count}} task{{objects.paginator.count|pluralize}} found
  {%elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
      No tasks found
  {%else%}
      {{mainheading}}
  {%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="{{request.GET.search}}"/>{% 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 tasks</button>
        </form>
      </div>
  </div>


  {% else %}
  {% include "basetable_top.html" %}

    {% for task in objects %}
        <tr {{ task|task_color }} id="{{task.order}}">
            <td class="order">
                <a href="{%url "task" build.pk task.pk%}">{{task.order}}</a>
            </td>
            <td class="recipe_name" >
                <a href="{% url "recipe" build.pk task.recipe.pk %}">{{task.recipe.name}}</a>
            </td>
            <td class="recipe_version">
                <a href="{% url "recipe" build.pk task.recipe.pk %}">{{task.recipe.version}}</a>
            </td>
            <td class="task_name">
                <a href="{%url "task" build.pk task.pk%}">{{task.task_name}}</a> {% if task.get_description %}<i class="icon-question-sign get-help hover-help" title="{{task.get_description}}"></i> {% endif %}
            </td>
            <td class="executed">
                <a href="{%url "task" build.pk task.pk%}">{{task.get_executed_display}}</a>
            </td>
            <td class="outcome">
                <a href="{%url "task" build.pk task.pk%}">{{task.get_outcome_display}} </a>
                {% if task.outcome = task.OUTCOME_FAILED %}
                    <a href="{% url 'build_artifact' build.pk "tasklogfile" task.pk %}">
                        <i class="icon-download-alt" title="Download task log file"></i>
                    </a>
                {% endif %}
                <i class="icon-question-sign get-help hover-help" title="{{task.get_outcome_help}}"></i>
            </td>
            <td class="cache_attempt">
                <a href="{%url "task" build.pk task.pk%}">{{task.get_sstate_result_display|format_none_and_zero}}</a>
            </td>
            <td class="time_taken">
                {{task.elapsed_time|format_none_and_zero|floatformat:2}}
            </td>
            <td class="cpu_time_system">
                {{task.cpu_time_system|format_none_and_zero|floatformat:2}}
            </td>
            <td class="cpu_time_user">
                {{task.cpu_time_user|format_none_and_zero|floatformat:2}}
            </td>
            <td class="disk_io">
                {{task.disk_io|format_none_and_zero|intcomma}}
            </td>

        </tr>
    {% endfor %}

  {% include "basetable_bottom.html" %}
  {% endif %} {# objects.paginator.count #}
{% endif %} {# empty #}
</div>

<script type="text/javascript">

    $(document).ready(function() {
        // highlight heading on the column for the field used for ordering
        if (location.href.search('#') > -1) {
            var task_order = location.href.split('#')[1];
            $("#" + task_order).addClass("highlight");
        }
    });

</script>

{% endblock %}
