blob: ecb46bf7ab740aa2152deca540ab45d513b53b1a [file] [log] [blame]
{% extends "basebuildpage.html" %}
{% block title %} Directory structure - {{ target.target }} {{ build.machine }} - {{ build.project.name }} - Toaster {% endblock %}
{% block extraheadcontent %}
{% load static %}
<link rel="stylesheet" href="{% static 'css/jquery.treetable.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'css/jquery.treetable.theme.toaster.css' %}" type="text/css">
{% endblock extraheadcontent %}
{% block localbreadcrumb %}
<li>{{target.target}}</li>
{% endblock localbreadcrumb%}
{% block buildinfomain %}
{% load static %}
<script src="{% static 'js/jquery.treetable.js' %}">
</script>
{% load projecttags %}
<script type='text/javascript'>
function setupTreetable() {
$("#dirtable").treetable({
expandable: true,
branchAttr: "ttBranch",
clickableNodeNames: true,
onNodeCollapse: function() {
/* Do nothing, keep cached */
},
onNodeExpand: function() {
var start = this.id;
var n = $("#dirtable").treetable("node", start);
if (this.children.length > 0) {
/* already was expanded once */
$("#dirtable").treetable("reveal", start);
}
else {
var url = "{% url "dirinfo_ajax" build.id target.id %}";
$.ajax({
async: false,
type : "GET",
url : url,
data : "start=" + start,
success : function(response) {
addRows(n, response)
},
error : function(jqXHR, textStatus, errorThrown ) {alert(textStatus + ":" + errorThrown)},
});
}
},
});
}
function td(data) {
if (data == null) {
data = '';
}
return '<td>' + data + '</td>'
}
function formatRow(o) {
/* setup tr-wide formatting */
var tr = '<tr class="';
if (o.link_to != null) {
tr += 'muted ';
}
if (o.isdir && o.childcount) {
tr += 'branch" data-tt-branch="true" ';
}
else {
tr += 'leaf" data-tt-branch="false" ';
}
tr += ' data-tt-id="' + o.fullpath +'" ';
if (o.parent != "/") {
tr += ' data-tt-parent-id="' + o.parent +'" ';
}
tr += '>';
/* setup td specific formatting */
var link_to = td(o.link_to);
var size = '<td class = "sizecol">' + o.size + '</td>'
var permission = td(o.permission);
var owner = td(o.owner);
var group = td(o.group);
/* handle the name column */
var name = null;;
var namespan=1;
if (o.isdir) {
if (o.link_to == null) {
namespan = 2;
if (o.package == null) {
namespan = 3;
}
}
var colspan = 'colspan="' + namespan + '"';
name = '<td class="content-directory"' + colspan + '>';
if (o.childcount) {
name += '<a href="">';
}
name += '<i class="icon-folder-close"></i>';
name += '&nbsp;' + o.name;
if (o.childcount) {
name += '</a>';
}
name += '</td>';
}
else {
if (o.link_to == null) {
namespan = 2;
if (o.package == null) {
namespan = 3;
}
var colspan = 'colspan="' + namespan + '"';
name = '<td ' + colspan + '><i class="icon-file"></i>';
}
else {
name = '<td><i class="icon-hand-right"></i>';
}
name += '&nbsp;' + o.name;
name += '</td>';
}
/* handle the package column */
var package = null;
if (o.package != null) {
/* add link to included package page */
build_id = {{ build.id }};
target_id = {{ target.id }};
/* Create a url for a dummy package id of 0 */
dummy = "{% url 'package_included_detail' build.id target.id 0 %}"
/* fill in the package id */
url = dummy.substr(0, dummy.length-1) + o.package_id;
package = '<a href=' + url + '>' ;
package += o.package;
package += '</a>';
if (o.installed_package != o.package) {
/* make class muted and add hover help */
package += '<span class="muted"> as ' + o.installed_package + ' </span>';
package += '<i class="icon-question-sign get-help hover-help" ';
package += 'title="' + o.package + ' was renamed at packaging time and was installed in your image as ' + o.installed_package + '">';
package += '</i>';
}
}
package = td(package);
var cols1to3;
switch (namespan) {
case 3:
cols1to3 = name;
break;
case 2:
cols1to3 = name + package;
break;
default:
cols1to3 = name + link_to + package;
}
r = tr + cols1to3 + size + permission + owner + group + "</tr>"
return r;
}
function addRows(n, objs) {
rows = "";
for (i=0; i<objs.length; i++) {
rows += formatRow(objs[i]);
}
$("#dirtable").treetable("loadBranch", n, rows);
}
$.fn.isOffScreen = function(){
var win = $(window);
viewportBottom = win.scrollTop() + win.height();
var bounds = this.offset();
bounds.bottom = bounds.top + this.outerHeight();
return (bounds.bottom > viewportBottom);
};
function selectRow(path) {
var row = $('tr[data-tt-id="' + path + '"]');
row.addClass(" highlight");
if (row.isOffScreen()) {
$('html, body').animate({ scrollTop: row.offset().top - 150}, 2000);
}
}
</script>
<div class="span10">
<div class="page-header">
<h1> {{target.target}} </h1>
</div>
<ul class="nav nav-pills">
<li class="">
<a href="{% url 'target' build.id target.id %}">
<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 class="active">
<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="directory-structure" class="tab-pane active">
<table id="dirtable" class="table table-bordered table-hover treetable">
<thead>
<tr>
<th>Directory / File</th>
<th>Symbolic link to</th>
<th>Source package</th>
<th class="narrow-col">Size</th>
<th class="medium-col">Permissions</th>
<th class="narrow-col">Owner</th>
<th class="narrow-col">Group</th>
</tr>
</thead>
<tbody>
<script type='text/javascript'>
setupTreetable();
addRows(null, {{ objects|safe }} );
{% if file_path %}
{% comment %}
link from package_included_detail specifies file path
{% endcomment %}
{% for dir_elem in dir_list %}
$("#dirtable").treetable("expandNode", "{{dir_elem}}");
{% endfor %}
selectRow("{{file_path}}");
{% endif %}
</script>
</tbody>
</table>
</div> <!-- directory-structure -->
</div> <!-- span10 -->
{% endblock buildinfomain %}