index: add fold-out failure summary
authorMans Rullgard <mans@mansr.com>
Wed, 4 Aug 2010 21:35:54 +0000 (22:35 +0100)
committerMans Rullgard <mans@mansr.com>
Wed, 4 Aug 2010 21:35:54 +0000 (22:35 +0100)
fate.css
index.cgi

index bb90e90..8d067ee 100644 (file)
--- a/fate.css
+++ b/fate.css
@@ -83,6 +83,29 @@ th {
     border-color: white;
 }
 
+#index .toggle {
+    cursor: pointer;
+    text-align: center;
+    color: black;
+}
+
+tr.slotfail {
+    display: none;
+}
+
+tr.slotfail > td {
+    padding: 0.5em;
+}
+
+table.minirep {
+    width: 100%;
+}
+
+.minirep th {
+    padding: 0 0.5em;
+    text-align: left;
+}
+
 /* config summary */
 
 #config td:first-child {
@@ -113,7 +136,7 @@ th {
     text-align: center;
 }
 
-#tests .errcode {
+.errcode {
     width: 3em;
     text-align: center;
 }
index 677a87e..bca39a1 100755 (executable)
--- a/index.cgi
+++ b/index.cgi
@@ -44,6 +44,20 @@ tag 'link', rel  => 'stylesheet',
             type => 'text/css',
             href => 'fate.css';
 print "<title>FATE</title>\n";
+print <<EOF;
+<script type="text/javascript">
+  function toggle(id, arr) {
+      var e = document.getElementById(id);
+      if (e.style.display == 'table-row') {
+          e.style.display = 'none';
+          arr.textContent = '\\u25ba'
+      } else {
+          e.style.display = 'table-row';
+          arr.textContent = '\\u25bc'
+      }
+  }
+</script>
+EOF
 end 'head';
 
 start 'body';
@@ -52,13 +66,20 @@ h1 'FATE';
 start 'table', id => 'index', class => 'replist';
 start 'thead';
 start 'tr';
-start 'td', colspan => 6, id => 'failometer';
+start 'td', colspan => 7, id => 'failometer';
 span '&nbsp;', class => 'pass', style => "width: ${allpass}%";
 span '&nbsp;', class => 'warn', style => "width: ${warn}%";
 span '&nbsp;', class => 'fail', style => "width: ${allfail}%";
 end 'td';
 end 'tr';
-trowh 'Time', 'Arch', 'OS', 'Compiler', 'Rev', 'Result';
+start 'tr';
+th 'Time';
+th 'Arch';
+th 'OS';
+th 'Compiler';
+th 'Rev';
+th 'Result', colspan => 2;
+end 'tr';
 end 'thead';
 start 'tbody';
 for my $rep (sort { $$a{slot} cmp $$b{slot} } @reps) {
@@ -71,6 +92,7 @@ for my $rep (sort { $$a{slot} cmp $$b{slot} } @reps) {
     my $rtext;
     my $rclass;
     my $alert = ('rejoice', '', 'alert')[$$rep{alert} + 1];
+    (my $slotid = $$rep{slot}) =~ s/[^a-z0-9_-]/_/ig;
 
     if ($age < $recent_age) {
         $ageclass = 'recent';
@@ -96,8 +118,40 @@ for my $rep (sort { $$a{slot} cmp $$b{slot} } @reps) {
     start 'td', class => $rclass;
     anchor $rtext, href => "report.cgi?slot=$$rep{slot}&amp;time=$$rep{date}";
     end 'td';
+    start 'td', class => $rclass;
+    if ($npass < $ntest) {
+        span '&#9658;', class => 'toggle', onclick => "toggle('$slotid', this)";
+    }
+    end 'td';
     end 'tr';
     print "\n";
+    if ($npass < $ntest) {
+        my $report = load_report $$rep{slot}, $$rep{date};
+        my @fail = grep $$_{status} ne '0', @{$$report{recs}};
+        my $nfail = @fail;
+        start 'tr', id => $slotid, class => 'slotfail';
+        start 'td', colspan => 7;
+        start 'table', class => 'minirep';
+        start 'thead';
+        start 'tr';
+        th "$nfail failed tests";
+        th 'Status', class => 'errcode';
+        end 'tr';
+        end 'thead';
+        start 'tbody';
+        for (sort { $$a{name} cmp $$b{name} } @fail) {
+            start 'tr', class => 'alt hilight';
+            td $$_{name};
+            td $$_{status}, class => 'errcode';
+            end 'tr';
+        }
+        end 'tbody';
+        end 'table';
+        end 'td';
+        end 'tr';
+        print "\n";
+        trowa { style => 'display: none' }, '';
+    }
 }
 end 'tbody';
 end 'table';