1*4882a593Smuzhiyun{% extends "basebuildpage.html" %} 2*4882a593Smuzhiyun{% block title %} Directory structure - {{ target.target }} {{ build.machine }} - {{ build.project.name }} - Toaster {% endblock %} 3*4882a593Smuzhiyun{% block extraheadcontent %} 4*4882a593Smuzhiyun{% load static %} 5*4882a593Smuzhiyun<link rel="stylesheet" href="{% static 'css/jquery.treetable.css' %}" type="text/css"> 6*4882a593Smuzhiyun<link rel="stylesheet" href="{% static 'css/jquery.treetable.theme.toaster.css' %}" type="text/css"> 7*4882a593Smuzhiyun{% endblock extraheadcontent %} 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun{% block localbreadcrumb %} 10*4882a593Smuzhiyun<li>{{target.target}}</li> 11*4882a593Smuzhiyun{% endblock localbreadcrumb%} 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun{% block buildinfomain %} 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun{% load static %} 16*4882a593Smuzhiyun<script src="{% static 'js/jquery.treetable.js' %}"> 17*4882a593Smuzhiyun</script> 18*4882a593Smuzhiyun{% load projecttags %} 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun<script type='text/javascript'> 21*4882a593Smuzhiyun var ctx = {}; 22*4882a593Smuzhiyun ctx.target = "{{target.target}}"; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun $(document).ready(function(){ 25*4882a593Smuzhiyun $("#menu-"+ctx.target).addClass("active"); 26*4882a593Smuzhiyun }); 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun function setupTreetable() { 29*4882a593Smuzhiyun $("#dirtable").treetable({ 30*4882a593Smuzhiyun expandable: true, 31*4882a593Smuzhiyun branchAttr: "ttBranch", 32*4882a593Smuzhiyun clickableNodeNames: true, 33*4882a593Smuzhiyun onNodeCollapse: function() { 34*4882a593Smuzhiyun /* Do nothing, keep cached */ 35*4882a593Smuzhiyun }, 36*4882a593Smuzhiyun onNodeExpand: function() { 37*4882a593Smuzhiyun var start = this.id; 38*4882a593Smuzhiyun var n = $("#dirtable").treetable("node", start); 39*4882a593Smuzhiyun if (this.children.length > 0) { 40*4882a593Smuzhiyun /* already was expanded once */ 41*4882a593Smuzhiyun $("#dirtable").treetable("reveal", start); 42*4882a593Smuzhiyun } 43*4882a593Smuzhiyun else { 44*4882a593Smuzhiyun var url = "{% url "dirinfo_ajax" build.id target.id %}"; 45*4882a593Smuzhiyun $.ajax({ 46*4882a593Smuzhiyun async: false, 47*4882a593Smuzhiyun type : "GET", 48*4882a593Smuzhiyun url : url, 49*4882a593Smuzhiyun data : "start=" + start, 50*4882a593Smuzhiyun success : function(response) { 51*4882a593Smuzhiyun addRows(n, response) 52*4882a593Smuzhiyun }, 53*4882a593Smuzhiyun error : function(jqXHR, textStatus, errorThrown ) {alert(textStatus + ":" + errorThrown)}, 54*4882a593Smuzhiyun }); 55*4882a593Smuzhiyun } 56*4882a593Smuzhiyun }, 57*4882a593Smuzhiyun }); 58*4882a593Smuzhiyun } 59*4882a593Smuzhiyun function td(data) { 60*4882a593Smuzhiyun if (data == null) { 61*4882a593Smuzhiyun data = ''; 62*4882a593Smuzhiyun } 63*4882a593Smuzhiyun return '<td>' + data + '</td>' 64*4882a593Smuzhiyun } 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun function formatRow(o) { 67*4882a593Smuzhiyun /* setup tr-wide formatting */ 68*4882a593Smuzhiyun var tr = '<tr class="'; 69*4882a593Smuzhiyun if (o.isdir && o.childcount) { 70*4882a593Smuzhiyun tr += 'branch" data-tt-branch="true" '; 71*4882a593Smuzhiyun } 72*4882a593Smuzhiyun else { 73*4882a593Smuzhiyun tr += 'leaf" data-tt-branch="false" '; 74*4882a593Smuzhiyun } 75*4882a593Smuzhiyun tr += ' data-tt-id="' + o.fullpath +'" '; 76*4882a593Smuzhiyun if (o.parent != "/") { 77*4882a593Smuzhiyun tr += ' data-tt-parent-id="' + o.parent +'" '; 78*4882a593Smuzhiyun } 79*4882a593Smuzhiyun tr += '>'; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* setup td specific formatting */ 82*4882a593Smuzhiyun var link_to = '<td class="text-muted">' + o.link_to + '</td>'; 83*4882a593Smuzhiyun var size = '<td class = "sizecol">' + o.size + '</td>' 84*4882a593Smuzhiyun var permission = td(o.permission); 85*4882a593Smuzhiyun var owner = td(o.owner); 86*4882a593Smuzhiyun var group = td(o.group); 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* handle the name column */ 89*4882a593Smuzhiyun var name = null;; 90*4882a593Smuzhiyun var namespan=1; 91*4882a593Smuzhiyun if (o.isdir) { 92*4882a593Smuzhiyun if (o.link_to == null) { 93*4882a593Smuzhiyun namespan = 2; 94*4882a593Smuzhiyun if (o.package == null) { 95*4882a593Smuzhiyun namespan = 3; 96*4882a593Smuzhiyun } 97*4882a593Smuzhiyun } 98*4882a593Smuzhiyun var colspan = 'colspan="' + namespan + '"'; 99*4882a593Smuzhiyun name = '<td class="content-directory"' + colspan + '>'; 100*4882a593Smuzhiyun if (o.childcount) { 101*4882a593Smuzhiyun name += '<a href="">'; 102*4882a593Smuzhiyun } 103*4882a593Smuzhiyun name += '<span class="glyphicon glyphicon-folder-close"></span>'; 104*4882a593Smuzhiyun name += ' ' + o.name; 105*4882a593Smuzhiyun if (o.childcount) { 106*4882a593Smuzhiyun name += '</a>'; 107*4882a593Smuzhiyun } 108*4882a593Smuzhiyun name += '</td>'; 109*4882a593Smuzhiyun } 110*4882a593Smuzhiyun else { 111*4882a593Smuzhiyun if (o.link_to == null) { 112*4882a593Smuzhiyun namespan = 2; 113*4882a593Smuzhiyun if (o.package == null) { 114*4882a593Smuzhiyun namespan = 3; 115*4882a593Smuzhiyun } 116*4882a593Smuzhiyun var colspan = 'colspan="' + namespan + '"'; 117*4882a593Smuzhiyun name = '<td ' + colspan + '><span class="glyphicon glyphicon-file"></span>'; 118*4882a593Smuzhiyun } 119*4882a593Smuzhiyun else { 120*4882a593Smuzhiyun name = '<td class="text-muted"><span class="glyphicon glyphicon-hand-right"></span>'; 121*4882a593Smuzhiyun } 122*4882a593Smuzhiyun name += ' ' + o.name; 123*4882a593Smuzhiyun name += '</td>'; 124*4882a593Smuzhiyun } 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* handle the package column */ 127*4882a593Smuzhiyun var package = null; 128*4882a593Smuzhiyun if (o.package != null) { 129*4882a593Smuzhiyun /* add link to included package page */ 130*4882a593Smuzhiyun build_id = {{ build.id }}; 131*4882a593Smuzhiyun target_id = {{ target.id }}; 132*4882a593Smuzhiyun /* Create a url for a dummy package id of 0 */ 133*4882a593Smuzhiyun dummy = "{% url 'package_included_detail' build.id target.id 0 %}" 134*4882a593Smuzhiyun /* fill in the package id */ 135*4882a593Smuzhiyun url = dummy.substr(0, dummy.length-1) + o.package_id; 136*4882a593Smuzhiyun package = '<a href=' + url + '>' ; 137*4882a593Smuzhiyun package += o.package; 138*4882a593Smuzhiyun package += '</a>'; 139*4882a593Smuzhiyun if (o.installed_package != o.package) { 140*4882a593Smuzhiyun /* make class muted and add hover help */ 141*4882a593Smuzhiyun package += '<span class="text-muted"> as ' + o.installed_package + ' </span>'; 142*4882a593Smuzhiyun package += '<span class="glyphicon glyphicon-question-sign get-help hover-help" '; 143*4882a593Smuzhiyun package += 'title="' + o.package + ' was renamed at packaging time and was installed in your image as ' + o.installed_package + '">'; 144*4882a593Smuzhiyun package += '</span>'; 145*4882a593Smuzhiyun } 146*4882a593Smuzhiyun } 147*4882a593Smuzhiyun package = td(package); 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun var cols1to3; 150*4882a593Smuzhiyun switch (namespan) { 151*4882a593Smuzhiyun case 3: 152*4882a593Smuzhiyun cols1to3 = name; 153*4882a593Smuzhiyun break; 154*4882a593Smuzhiyun case 2: 155*4882a593Smuzhiyun cols1to3 = name + package; 156*4882a593Smuzhiyun break; 157*4882a593Smuzhiyun default: 158*4882a593Smuzhiyun cols1to3 = name + link_to + package; 159*4882a593Smuzhiyun } 160*4882a593Smuzhiyun r = tr + cols1to3 + size + permission + owner + group + "</tr>" 161*4882a593Smuzhiyun return r; 162*4882a593Smuzhiyun } 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun function addRows(n, objs) { 165*4882a593Smuzhiyun rows = ""; 166*4882a593Smuzhiyun for (i=0; i<objs.length; i++) { 167*4882a593Smuzhiyun rows += formatRow(objs[i]); 168*4882a593Smuzhiyun } 169*4882a593Smuzhiyun $("#dirtable").treetable("loadBranch", n, rows); 170*4882a593Smuzhiyun } 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun $.fn.isOffScreen = function(){ 173*4882a593Smuzhiyun var win = $(window); 174*4882a593Smuzhiyun viewportBottom = win.scrollTop() + win.height(); 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun var bounds = this.offset(); 177*4882a593Smuzhiyun bounds.bottom = bounds.top + this.outerHeight(); 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun return (bounds.bottom > viewportBottom); 180*4882a593Smuzhiyun }; 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun function selectRow(path) { 183*4882a593Smuzhiyun var row = $('tr[data-tt-id="' + path + '"]'); 184*4882a593Smuzhiyun row.addClass(" highlight"); 185*4882a593Smuzhiyun if (row.isOffScreen()) { 186*4882a593Smuzhiyun $('html, body').animate({ scrollTop: row.offset().top - 150}, 2000); 187*4882a593Smuzhiyun } 188*4882a593Smuzhiyun } 189*4882a593Smuzhiyun</script> 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun<div class="col-md-10"> 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun <div class="page-header build-data"> 194*4882a593Smuzhiyun <h1> {{target.target}} </h1> 195*4882a593Smuzhiyun </div> 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun <ul class="nav nav-tabs"> 198*4882a593Smuzhiyun <li> 199*4882a593Smuzhiyun <a href="{% url 'target' build.id target.id %}"> 200*4882a593Smuzhiyun <span class="glyphicon glyphicon-question-sign get-help" title="Of all the packages built, the subset installed in the root file system of this image"></span> 201*4882a593Smuzhiyun Packages included ({{target.package_count}} - {{packages_sum|filtered_filesizeformat}}) 202*4882a593Smuzhiyun </a> 203*4882a593Smuzhiyun </li> 204*4882a593Smuzhiyun <li class="active"> 205*4882a593Smuzhiyun <a href="{% url 'dirinfo' build.id target.id %}"> 206*4882a593Smuzhiyun <span class="glyphicon glyphicon-question-sign get-help" title="The directories and files in the root file system of this image"></span> 207*4882a593Smuzhiyun Directory structure 208*4882a593Smuzhiyun </a> 209*4882a593Smuzhiyun </li> 210*4882a593Smuzhiyun </ul> 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun <div id="directory-structure" class="tab-pane active"> 213*4882a593Smuzhiyun <table id="dirtable" class="table table-bordered table-hover treetable"> 214*4882a593Smuzhiyun <thead> 215*4882a593Smuzhiyun <tr> 216*4882a593Smuzhiyun <th>Directory / File</th> 217*4882a593Smuzhiyun <th>Symbolic link to</th> 218*4882a593Smuzhiyun <th>Source package</th> 219*4882a593Smuzhiyun <th class="narrow-col">Size</th> 220*4882a593Smuzhiyun <th class="medium-col">Permissions</th> 221*4882a593Smuzhiyun <th class="narrow-col">Owner</th> 222*4882a593Smuzhiyun <th class="narrow-col">Group</th> 223*4882a593Smuzhiyun </tr> 224*4882a593Smuzhiyun </thead> 225*4882a593Smuzhiyun <tbody> 226*4882a593Smuzhiyun <script type='text/javascript'> 227*4882a593Smuzhiyun setupTreetable(); 228*4882a593Smuzhiyun addRows(null, {{ objects|safe }} ); 229*4882a593Smuzhiyun {% if file_path %} 230*4882a593Smuzhiyun {% comment %} 231*4882a593Smuzhiyun link from package_included_detail specifies file path 232*4882a593Smuzhiyun {% endcomment %} 233*4882a593Smuzhiyun {% for dir_elem in dir_list %} 234*4882a593Smuzhiyun $("#dirtable").treetable("expandNode", "{{dir_elem}}"); 235*4882a593Smuzhiyun {% endfor %} 236*4882a593Smuzhiyun selectRow("{{file_path}}"); 237*4882a593Smuzhiyun {% endif %} 238*4882a593Smuzhiyun </script> 239*4882a593Smuzhiyun </tbody> 240*4882a593Smuzhiyun </table> 241*4882a593Smuzhiyun </div> <!-- directory-structure --> 242*4882a593Smuzhiyun</div> <!-- col-md-10 --> 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun{% endblock buildinfomain %} 245*4882a593Smuzhiyun 246