{% extends "basebuildpage.html" %}
{% block title %} Packages included - {{ target.target }} {{ target.build.machine }} - {{ target.build.project.name }} - Toaster {% endblock %}
{% block localbreadcrumb %}
<li>{{target.target}}</li>
{% endblock localbreadcrumb%}

{% load projecttags %}

{% block nav-target %}
  {% for t in build.get_sorted_target_list %}
    {% ifequal target.pk t.pk %}
      <li class="active"><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li>
    {% else %}
      <li><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li>
    {% endifequal %}
  {% endfor %}
{% endblock %}

{% block buildinfomain %}

<div class="row-fluid span10">
    <div class="page-header">
        <h1>
            {% if request.GET.search and objects.paginator.count > 0 %}
                {{objects.paginator.count}} package{{objects.paginator.count|pluralize}} found
            {% elif request.GET.search and objects.paginator.count == 0 %}
                No packages found
            {% else %}
                {{target.target}}
            {% endif %}
        </h1>
    </div>
</div>

<div class="row-fluid pull-right span10" id="navTab">
    <ul class="nav nav-pills">
        <li class="active">
            <a href="#target">
            <i class="icon-question-sign get-help" title="Of all the packages built, the subset installed in the root file system of this image"></i>
                Packages included ({{target.package_count}} - {{packages_sum|filtered_filesizeformat}})
            </a>
        </li>
        <li>
            <a href="{% url 'dirinfo' build.id target.id %}">
                <i class="icon-question-sign get-help" title="The directories and files in the root file system of this image"></i>
                Directory structure
            </a>
        </li>
    </ul>

    <div id="image-packages" class="tab-pane">

    {% 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 packages</button>
            </form>
        </div>
    </div>


    {% else %}
    {% include "basetable_top.html" %}
    {% for package in objects %}
    <tr>
      {# order of the table data must match the columns defined in template's context tablecols  #}
        <td class="package_name">
            <a href="{% url 'package_included_detail' build.id target.id package.id %}">
            {{package.name}}
            </a>
            {% if package.installed_name and package.name != package.installed_name %}
            <span class="muted"> as {{package.installed_name}}</span>
            <i class="icon-question-sign get-help hover-help" title='{{package.name|add:" was renamed at packaging time and was installed in your image as "|add:package.installed_name}}'></i>
            {% endif %}
        </td>
        <td class="package_version">
            <a href="{% url 'package_included_detail' build.id target.id package.id %}">
            {{package.version|filtered_packageversion:package.revision}}
            </a>
        </td>
        <td class="license">
            {{package.license}}
        </td>
        <td class="size sizecol">
            {{package.size|filtered_installedsize:package.installed_size|filtered_filesizeformat}}
        </td>

        <td class="size_over_total sizecol">
            {{package|filter_sizeovertotal:packages_sum}}
        </td>
       <td class="depends">
            {% with deps=package.runtime_dependencies %}
            {% with deps_count=deps|length %}
            {% if deps_count > 0 %}
            <a class="btn"
                title="<a href='{% url "package_included_dependencies" build.id target.id package.id %}'>{{package.name}}</a> dependencies"
                data-content="<ul class='unstyled'>
                  {% for i in deps|dictsort:'depends_on.name' %}
                    <li><a href='{% url "package_included_detail" build.pk target.id i.depends_on.pk %}'>{{i.depends_on.name}}</a></li>
                  {% endfor %}
                </ul>">
                {{deps_count}}
            </a>
            {% endif %}
            {% endwith %}
            {% endwith %}
        </td>
        <td class="brought_in_by">
            {% with rdeps=package.reverse_runtime_dependencies %}
            {% with rdeps_count=rdeps|length %}
            {% if rdeps_count > 0 %}
            <a class="btn"
                title="<a href='{% url "package_included_reverse_dependencies" build.id target.id package.id %}'>{{package.name}}</a> reverse dependencies"
                data-content="<ul class='unstyled'>
                  {% for i in rdeps|dictsort:'package.name' %}
                    <li><a href='{% url "package_included_detail" build.id target.id i.package.id %}'>{{i.package.name}}</a></li>
                  {% endfor %}
                </ul>">
                {{rdeps_count}}
            </a>
            {% endif %}
            {% endwith %}
            {% endwith %}
        </td>
        <td class="recipe_name">
            {% if package.recipe.version %}
            <a href="{% url 'recipe' build.id package.recipe_id %}">
            {{ package.recipe.name }}
            </a>
            {% endif %}
        </td>
        <td class="recipe_version">
            {% if package.recipe.version %}
            <a href="{% url 'recipe' build.id package.recipe_id %}">
            {{ package.recipe.version }}
            </a>
            {% endif %}
        </td>
        <td class="layer_name">
            {{ package.recipe.layer_version.layer.name }}
        </td>
        <td class="layer_branch">
            {{ package.recipe.layer_version.branch}}
        </td>
        <td class="layer_commit">
            <a class="btn"
                data-content="<ul class='unstyled'>
                  <li>{{package.recipe.layer_version.commit}}</li>
                </ul>">
                {{package.recipe.layer_version.commit|truncatechars:13}}
            </a>
        </td>
    </tr>
    {% endfor %}

    {% include "basetable_bottom.html" %}
    {% endif %}
    </div> <!-- tabpane -->
</div> <!--span 10-->
{% endblock buildinfomain %}
