{% load static %}
{% load projecttags %}
{% load project_url_tag %}
{% load humanize %}
<script src="{% static 'js/mrbsection.js' %}"></script>
<script>
  $(document).ready(function () {
    var ctx = {
      mrbType : "{{mrb_type}}",
    }

    try {
      mrbSectionInit(ctx);
    } catch (e) {
      document.write("Sorry, An error has occurred loading this page");
      console.warn(e);
    }
  });
</script>

{%if mru and mru.count > 0%}

  {%if mrb_type == 'project' %}
      <h2 class="page-header">
      Latest project builds

      {% if project.is_default %}
          <i class="icon-question-sign get-help heading-help" title="" data-original-title="Builds in this project cannot be started from Toaster: they are started from the command line"></i>
      {% endif %}
      </h2>
  {% else %}
    <div class="page-header top-air">
      <h1>
      Latest builds
      </h1>
    </div>
  {% endif %}
  <div id="latest-builds">
  {% for build in mru %}
  <div data-latest-build-result="{{ build.id }}" class="alert build-result {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}{% if mrb_type != 'project' %} project-name{% endif %}">
      {% if mrb_type != 'project' %}
        <span class="label {%if build.outcome == build.SUCCEEDED%}label-success{%elif build.outcome == build.FAILED%}label-important{%else%}label-info{%endif%}">
            <a href={% project_url build.project %}>
                {{build.project.name}}
            </a>
        </span>
      {% endif %}
        <div class="row-fluid">
          <div class="span3 lead">
    {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
              <a href="{%url 'builddashboard' build.pk%}" class="{%if build.outcome == build.SUCCEEDED %}success{%else%}error{%endif%}">
    {% endif %}
            {% if build.target_set.all.count > 0 %}
                <span data-toggle="tooltip"
                  {% if build.target_set.all.count > 1 %}
                    {{build.get_sorted_target_list.0.target}}
                    title="Recipes:
                    {% for target in build.get_sorted_target_list %}
                        {% if target.task %}
                            {{target.target}}:{{target.task}}
                        {% else %}
                            {{target.target}}
                        {% endif %}
                    {% endfor %}"
                  {% endif %}
                >
                {% if build.target_set.all.0.task %}
                    {{build.get_sorted_target_list.0.target}}:{{build.target_set.all.0.task}}
                {% else %}
                    {{build.get_sorted_target_list.0.target}}
                {% endif %}
                {% if build.target_set.all.count > 1 %}
                    (+{{build.target_set.all.count|add:"-1"}})
                {% endif %}
                </span>
             {% endif %}
    {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
                </a>
    {% endif %}
            </div>
    {% if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
            <div class="span2 lead">
                {% if build.completed_on|format_build_date  %}
                    {{ build.completed_on|date:'d/m/y H:i' }}
                {% else %}
                    {{ build.completed_on|date:'H:i' }}
                {% endif %}
            </div>
    {% endif %}
    {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
            <div class="span2 lead">
      {% if  build.errors.count %}
                <i class="icon-minus-sign red"></i> <a href="{%url 'builddashboard' build.pk%}#errors" class="error">{{build.errors.count}} error{{build.errors.count|pluralize}}</a>
      {% endif %}
            </div>
            <div class="span2 lead">
      {% if  build.warnings.count %}
                <i class="icon-warning-sign yellow"></i> <a href="{%url 'builddashboard' build.pk%}#warnings" class="warning">{{build.warnings.count}} warning{{build.warnings.count|pluralize}}</a>
      {% endif %}
            </div>
            <div class="lead ">
              <span class="lead">
                  Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent_seconds|sectohms }}</a>
              </span>
              {% if build.project.is_default %}
                  <i class="pull-right icon-question-sign get-help
                  {% if build.outcome == build.SUCCEEDED %}
                      get-help-green
                  {% elif build.outcome == build.FAILED %}
                      get-help-red
                  {% else %}
                      get-help-blue
                  {% endif %}
                  " title="Builds in this project cannot be started from Toaster: they are started from the command line">
                  </i>
              {% else %}
                  <button class="run-again-btn btn
                      {% if build.outcome == build.SUCCEEDED %}
                          btn-success
                      {% elif build.outcome == build.FAILED %}
                          btn-danger
                      {% else %}
                          btn-info
                      {%endif%}
                      pull-right"
                      data-request-url="{% url 'xhr_buildrequest' build.project.pk %}"
                      data-target='{{build.target_set.all|get_tasks|json}}'>


                        Rebuild
                  </button>
              {% endif %}
            </div>
    {%endif%}
    {%if build.outcome == build.IN_PROGRESS %}
    <div class="span4" style="display:none" id="cancelling-msg-{{build.buildrequest.pk}}">
      <p class="lead">Cancelling the build ...</p>
    </div>
    <div class="span4 offset1 progress-info">
      <div class="progress" id="build-pc-done-title-{{build.pk}}" style="margin-top:5px;" data-toggle="tooltip" title="{{build.completeper}}% of tasks complete">
        <div id="build-pc-done-bar-{{build.pk}}" style="width: {{build.completeper}}%;" class="bar"></div>
      </div>
    </div>
    <div class="lead span3 progress-info"><span id="build-pc-done-{{build.pk}}">{{build.completeper}}</span>% of tasks complete</div>
    {# No build cancel for command line builds project #}
    {% if build.project.is_default %}
    <i class="icon-question-sign get-help get-help-blue pull-right" title="" data-original-title="Builds in this project cannot be cancelled from Toaster: they can only be cancalled from the command line"></i>
    {% else %}
    <div class="lead pull-right progress-info">
      <button class="cancel-build-btn btn btn-info pull-right"
          data-buildrequest-id={{build.buildrequest.pk}}
          data-request-url="{% url 'xhr_buildrequest' build.project.pk %}" >
        Cancel
      </button>
    </div>
    {% endif %}

    {%endif%} {# end if in progress #}

    {% if build.outcome == build.CANCELLED %}
    <div class="span4">
      <p class="lead">Build cancelled</p>
    </div>
    <button class="btn btn-info pull-right run-again-btn"
        data-request-url="{% url 'xhr_buildrequest' build.project.pk %}"
        data-target='{{build.target_set.all|get_tasks|json}}'>
      Rebuild

    </button>
    {% endif %}
  </div>
</div>

  {% endfor %}
  </div>

{%endif%}

