- adding starred display and popups for test results with comments;

- improve wording of footer search for results marked as unclear;
- fix cut-n-paste error in Comment.pm and Resultbug.pm;
- improve default display of test results, and add explanatory blurb for navigation;
This commit is contained in:
ccooper%deadsquid.com 2005-10-19 01:06:34 +00:00
Родитель 1074e8d40b
Коммит 82119542af
10 изменённых файлов: 279 добавлений и 64 удалений

Просмотреть файл

@ -35,6 +35,8 @@ package Litmus::DB::Comment;
use strict;
use base 'Litmus::DBI';
use Time::Piece;
Litmus::DB::Comment->table('test_result_comments');
Litmus::DB::Comment->columns(All => qw/comment_id test_result_id last_updated submission_time user_id comment/);
@ -46,6 +48,7 @@ Litmus::DB::Comment->column_alias("user_id", "user");
Litmus::DB::Comment->has_a(test_result_id => "Litmus::DB::Testresult");
Litmus::DB::Comment->has_a(user => "Litmus::DB::User");
Litmus::DB::Testresult->autoinflate(dates => 'Time::Piece');
Litmus::DB::Comment->autoinflate(dates => 'Time::Piece');
1;

Просмотреть файл

@ -35,6 +35,8 @@ package Litmus::DB::Resultbug;
use strict;
use base 'Litmus::DBI';
use Time::Piece;
Litmus::DB::Resultbug->table('test_result_bugs');
Litmus::DB::Resultbug->columns(Primary => qw/test_result_id bug_id/);
@ -46,6 +48,6 @@ Litmus::DB::Resultbug->column_alias("user_id", "user");
Litmus::DB::Resultbug->has_a(test_result_id => "Litmus::DB::Testresult");
Litmus::DB::Resultbug->has_a(user => "Litmus::DB::User");
Litmus::DB::Testresult->autoinflate(dates => 'Time::Piece');
Litmus::DB::Resultbug->autoinflate(dates => 'Time::Piece');
1;

Просмотреть файл

@ -9,7 +9,7 @@ body {
font-size: 0.9em;
}
body, td, th, h3, input { /* redundant rules for bad browsers */
body, td, th, h3, input, pre { /* redundant rules for bad browsers */
font-family: verdana, sans-serif;
voice-family: "\"}\"";
voice-family: inherit;
@ -32,7 +32,7 @@ h1.firstHeading, h1.errorHeading {
border-bottom: none;
margin-top: 0;
font-size: 1.8em;
line-height: 1.8em;
line-height: 1.2em;
text-transform: lowercase;
}
@ -712,6 +712,39 @@ div.t_link a {
padding: 2px 2px 10px 0px;
}
/* 12 Popup divs (comments) ****************************************************************************** */
#popup {
position: absolute;
margin: -5em 0 0 -5em;
opacity: 0.8;
}
.who#popup{
border: 0px;
height: 8em;
width: 16em;
}
.comment#popup {
width: 25em;
}
.log#popup {
width: 25em;
}
.comment#popup, .log#popup {
border: solid #bbbbbb 1px;
background-color: #ffffff;
color: #000000;
padding: 0.25em;
text-align: center;
}
p.comment {
font-size: 0.9em;
}
/* ****************************************************************************** */
fieldset {
@ -769,10 +802,23 @@ textarea {
font-weight: normal;
}
#content ul {
list-style: none;
margin: 0;
padding: 5px;
/* #content ul {
* list-style-type: none;
* margin: 0;
* padding: 5px;
*}
*/
div.instructions {
padding: 10px;
font-size: 0.8em;
}
ul.instructions {
list-style-type: circle;
list-style-position: inside;
padding-left: 5px;
padding-right: 5px;
}
ol {
@ -801,7 +847,7 @@ ol {
background-color: #666666;
}
div.section-full {
div.section-full, div.instructions {
border: solid #bbbbbb 1px;
margin-bottom: 5px;
background-color: #dddddd;
@ -845,4 +891,8 @@ table.section td.subsection {
vertical-align: top;
}
img.icon {
vertical-align: middle;
border: 0;
padding: 5px;
}

Двоичные данные
webtools/litmus/images/star1.gif Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 332 B

Просмотреть файл

@ -30,8 +30,8 @@
use strict;
$|++;
use Time::HiRes qw( gettimeofday tv_interval );
my $t0 = [gettimeofday];
#use Time::HiRes qw( gettimeofday tv_interval );
#my $t0 = [gettimeofday];
use Litmus;
use Litmus::Auth;
@ -67,7 +67,7 @@ my $vars = {
# Only include results if we have them.
if ($results and scalar @$results > 0) {
$vars->{results} = $results;
$vars->{results} = $results;
}
my $cookie = Litmus::Auth::getCookie();
@ -75,10 +75,10 @@ $vars->{"defaultemail"} = $cookie;
$vars->{"show_admin"} = Litmus::Auth::istrusted($cookie);
Litmus->template()->process("index.tmpl", $vars) ||
internalError(Litmus->template()->error());
internalError(Litmus->template()->error());
my $elapsed = tv_interval ( $t0 );
printf "<div id='pageload'>Page took %f seconds to load.</div>", $elapsed;
#my $elapsed = tv_interval ( $t0 );
#printf "<div id='pageload'>Page took %f seconds to load.</div>", $elapsed;
exit 0;

150
webtools/litmus/js/Comments.js Executable file
Просмотреть файл

@ -0,0 +1,150 @@
var noDHTML = false;
if (parseInt(navigator.appVersion) < 4) {
window.event = 0;
noDHTML = true;
} else if (navigator.userAgent.indexOf("MSIE") > 0 ) {
noDHTML = true;
}
if (document.body && document.body.addEventListener) {
document.body.addEventListener("click",maybeclosepopup,false);
}
setTimeout('location.reload()',900000);
function nodewrite(n,t) {
var r = document.createRange();
r.setStart(n,0);
n.appendChild(r.createContextualFragment(t));
}
function closepopup() {
var p = document.getElementById("popup");
if (p && p.parentNode) {
p.parentNode.removeChild(p);
}
}
function maybeclosepopup(e) {
var n = e.target;
var close = true;
while(close && n && (n != document)) {
close = (n.id != "popup") && !(n.tagName && (n.tagName.toLowerCase() == "a"));
n = n.parentNode;
}
if (close) closepopup();
}
function who(d) {
if (noDHTML) {
return true;
}
if (typeof document.layers != 'undefined') {
var l = document.layers['popup'];
l.src = d.target.href;
l.top = d.target.y - 6;
l.left = d.target.x - 6;
if (l.left + l.clipWidth > window.width) {
l.left = window.width - l.clipWidth;
}
l.visibility="show";
} else {
var t = d.target;
while (t.nodeType != 1) {
t = t.parentNode;
}
closepopup()
l = document.createElement("iframe");
l.setAttribute("src", t.href);
l.setAttribute("id", "popup");
l.className = "who";
t.appendChild(l);
}
return false;
}
function log_url(report_id) {
return "display_report.pl?report_id=" + report_id;
}
function comment(d,commentid,logfile) {
if (noDHTML) {
document.location = log_url(logfile);
return false;
}
if (typeof document.layers != 'undefined') {
var l = document.layers['popup'];
l.document.write("<table border=1 cellspacing=1><tr><td>"
+ comments[commentid] + "</tr></table>");
l.document.close();
l.top = d.y-10;
var zz = d.x;
if (zz + l.clip.right > window.innerWidth) {
zz = (window.innerWidth-30) - l.clip.right;
if (zz < 0) { zz = 0; }
}
l.left = zz;
l.visibility="show";
} else {
var t = d.target;
while (t.nodeType != 1) {
t = t.parentNode;
}
closepopup()
l = document.createElement("div");
nodewrite(l,comments[commentid]);
l.setAttribute("id", "popup");
l.style.position = "absolute";
l.className = "comment";
t.parentNode.parentNode.appendChild(l);
}
return false;
}
function log(e,buildindex,logfile) {
var logurl = log_url(logfile);
var commenturl = "add_comment.pl?log=" + buildtree + "/" + logfile;
if (noDHTML) {
document.location = logurl;
return false;
}
if (typeof document.layers != 'undefined') {
var q = document.layers["logpopup"];
q.top = e.target.y - 6;
var yy = e.target.x;
if ( yy + q.clip.right > window.innerWidth) {
yy = (window.innerWidth-30) - q.clip.right;
if (yy < 0) { yy = 0; }
}
q.left = yy;
q.visibility="show";
q.document.write("<TABLE BORDER=1><TR><TD><B>"
+ builds[buildindex] + "</B><BR>"
+ "<A HREF=" + logurl + ">View Brief Log</A><BR>"
+ "<A HREF=" + logurl + "&fulltext=1"+">View Full Log</A><BR>"
+ "<A HREF=" + commenturl + ">Add a Comment</A>"
+ "</TD></TR></TABLE>");
q.document.close();
} else {
var t = e.target;
while (t.nodeType != 1) {
t = t.parentNode;
}
closepopup();
var l = document.createElement("div");
nodewrite(l,"<B>" + builds[buildindex] + "</B><BR>"
+ "<A HREF=" + logurl + ">View Brief Log</A><BR>"
+ "<A HREF=" + logurl + "&fulltext=1"+">View Full Log</A><BR>"
+ "<A HREF=" + commenturl + ">Add a Comment</A><BR>");
l.setAttribute("id", "popup");
l.className = "log";
t.parentNode.appendChild(l);
}
return false;
}
function empty_comparison_text() {
if (document.buffalo_search.comparison_text.value == "Enter comparison text") {
document.buffalo_search.comparison_text.value = "";
}
}

Просмотреть файл

@ -1,5 +1,5 @@
<div id="footer">
Search: <a href="search_results.cgi?order_by_created=DESC&amp;timespan=all&amp;result_status=fail&amp;limit=50">Recent Failures</a> | <a href="common_failures.cgi">Most Common Failures</a> | <a href="search_results.cgi?order_by_created=DESC&timespan=all&result_status=unclear&limit=100" title="Test Results Marked As Unclear">Unclear Results</a> | Test Runs In Progress
Search: <a href="search_results.cgi?order_by_created=DESC&amp;timespan=all&amp;result_status=fail&amp;limit=50">Recent Failures</a> | <a href="common_failures.cgi">Most Common Failures</a> | <a href="search_results.cgi?order_by_created=DESC&timespan=all&result_status=unclear&limit=100" title="Test Results Marked As Unclear">Results Marked As Unclear</a> | Test Runs In Progress
</div>
</div>

Просмотреть файл

@ -8,7 +8,7 @@
<div id="content">
<h1 class="firstHeading">Recent Test Results</h1>
[% INCLUDE reporting/test_results.tmpl include_limit_criteria=1 %]
[% INCLUDE reporting/test_results.tmpl show_instructions=1 %]
</div> <!--END content-->

Просмотреть файл

@ -1,32 +1,56 @@
[% icon="<img class=icon src='images/star1.gif' title='This result has comments' alt='*'>" %]
[% IF results %]
<script src="js/Comments.js"></script>
<script>
var comments = new Array();
[% subscript=0 %]
[% FOREACH result=results %]
comments[[% subscript %]] = "[% IF result.comments %][% FOREACH comment=result.comments %][% IF loop.count>1 %]<hr/>[% END %]<p class='comment'><b>[% IF comment.user.email %]<a href=\"mailto:[% comment.user.email.replace('\@','&#64;') %]\">[% comment.user.email.replace('\@','&#64;') %]</a>[% ELSE %]Anonymous[% END %]<br/>[% comment.submission_time.strftime("%Y-%m-%d&nbsp;%T %Z") %]</b><br/>[% icon %]&nbsp;[% comment.comment %]<br/></p>[% END %][% END %]";
[% subscript=subscript+1 %]
[% END %]
</script>
[% END %]
[% IF show_instructions==1 %]
<div class="instructions"><strong>Navigation:</strong>
<ul class="instructions">
<li>results marked with the star icon ([% icon %]) have comments associated with them. Clicking on the star will display the comments in-page;</li>
<li>click on the number in the "result id#" column to see a full listing of the test result, including comments;</li>
<li>click on the number at the start of the "testcase id#: summary" column to see a more detailed description of that particular testcase;</li>
</ul>
</div>
[% END %]
<table class="test-results">
<tr>
<td colspan="2" class="header">Date</td>
<td colspan="2" class="header">Submission Date</td>
<td class="header">Result ID#</td>
<td class="header">Testcase ID#: Summary</td>
<td class="header">Testgroup</td>
<td class="header">Product</td>
<td class="header">Platform</td>
<td class="header">Testgroup</td>
<td class="header">Testcase ID#</td>
<td class="header">Summary</td>
<td class="header">Status</td>
<td class="header">Branch</td>
</tr>
<tr>
[% IF results AND results.size > 0 %]
[% subscript=0 %]
[% FOREACH result=results %]
<tr class="[% result.result_status_class %]">
<td colspan="2" align="center">[% result.created %]</td>
<td align="center">[% IF result.comments %]<a href="" onclick="return comment(event,[% subscript %],'');">[% icon %]</a>[% END %]<a href="single_result.cgi?id=[% result.testresult_id %]">[% result.testresult_id %]</a></td>
<td align="left"><a href="show_test.cgi?id=[% result.test_id %]">[% result.test_id %]</a>: [% result.summary %]</td>
<td align="center">[% result.test_group_name %]</td>
<td align="center">[% result.product_name %]</td>
<td align="center">[% result.platform_name %]</td>
<td align="center">[% result.test_group_name %]</td>
<td align="center"><a href="show_test.cgi?id=[% result.test_id %]">[% result.test_id %]</a></td>
<td>[% result.summary %]</td>
<td align="center"><a href="single_result.cgi?id=[% result.testresult_id %]">[% result.result_status_class %]</a></td>
<td align="center">[% result.branch_name %]</td>
</tr>
[% subscript=subscript+1 %]
[% END %]
[% ELSE %]
<tr>
<td class="no-results" colspan="9">No test results match the search criteria.</td>
<td class="no-results" colspan="8">No test results match the search criteria.</td>
</tr>
[% END %]
@ -35,9 +59,4 @@
[% END %]
</table>
</form>
</form>

Просмотреть файл

@ -18,37 +18,34 @@ function init()
<option[% IF order_bys.created == 'ASC' %] selected[% END %] value="ASC">A->Z</option>
<option[% IF order_bys.created == 'DESC' %] selected[% END %] value="DESC">Z->A</option>
</select></td>
<td class="search"></td>
<td class="search"><select name="order_by_summary">
<option value="">-Sort-</option>
<option[% IF order_bys.summary == 'ASC' %] selected[% END %] value="ASC">A->Z</option>
<option[% IF order_bys.summary == 'DESC' %] selected[% END %] value="DESC">Z->A</option>
</select></td>
<td class="search"><select name="order_by_test_group">
<option value="">-Sort-</option>
<option[% IF order_bys.test_group == 'ASC' %] selected[% END %] value="ASC">A->Z</option>
<option[% IF order_bys.test_group == 'DESC' %] selected[% END %] value="DESC">Z->A</option>
</select></td>
<td class="search"><select name="order_by_product">
<option value="">-Sort-</option>
<option[% IF order_bys.product == 'ASC' %] selected[% END %]
value="ASC">A->Z</option>
<option[% IF order_bys.product == 'DESC' %] selected[% END %] value="DESC">Z->A</option>
</select></td>
<td class="search"><select name="order_by_platform">
<option value="">-Sort-</option>
<option[% IF order_bys.platform == 'ASC' %] selected[% END %] value="ASC">A->Z</option>
<option[% IF order_bys.platform == 'DESC' %] selected[% END %] value="DESC">Z->A</option>
</select></td>
<td class="search"><select name="order_by_test_group">
<option value="">-Sort-</option>
<option[% IF order_bys.test_group == 'ASC' %] selected[% END %] value="ASC">A->Z</option>
<option[% IF order_bys.test_group == 'DESC' %] selected[% END %] value="DESC">Z->A</option>
</select></td>
<td class="search"><select name="order_by_test_id">
<option value="">-Sort-</option>
<option[% IF order_bys.test_id == 'ASC' %] selected[% END %] value="ASC">A->Z</option>
<option[% IF order_bys.test_id == 'DESC' %] selected[% END %] value="DESC">Z->A</option>
</select></td>
<td class="search"><select name="order_by_summary">
<option value="">-Sort-</option>
<option[% IF order_bys.summary == 'ASC' %] selected[% END %] value="ASC">A->Z</option>
<option[% IF order_bys.summary == 'DESC' %] selected[% END %] value="DESC">Z->A</option>
</select></td>
<td class="search"><select name="order_by_result_status">
<option value="">-Sort-</option>
<option[% IF order_bys.result_status == 'ASC' %] selected[% END %] value="ASC">A->Z</option>
<option[% IF order_bys.result_status == 'DESC' %] selected[% END %] value="DESC">Z->A</option>
</select></td>
<td class="search"><select name="order_by_branch">
<option value="">-Sort-</option>
<option[% IF order_bys.branch == 'ASC' %] selected[% END %] value="ASC">A->Z</option>
@ -60,12 +57,11 @@ function init()
<tr class="search">
<td class="search-heading" align="center">Limit by</td>
<td class="search">[% INCLUDE form_widgets/select_timespan.tmpl %]</td>
<td class="search"></td>
<td class="search">[% INCLUDE form_widgets/input_summary.tmpl %]</td>
<td class="search">[% INCLUDE form_widgets/select_test_group.tmpl %]</td>
<td class="search">[% INCLUDE form_widgets/select_product.tmpl %]</td>
<td class="search">[% INCLUDE form_widgets/select_platform.tmpl %]</td>
<td class="search">[% INCLUDE form_widgets/select_test_group.tmpl %]</td>
<td class="search">[% INCLUDE form_widgets/input_test_id.tmpl %]</td>
<td class="search">[% INCLUDE form_widgets/input_summary.tmpl %]</td>
<td class="search">[% INCLUDE form_widgets/select_result_status.tmpl%]</td>
<td class="search">[% INCLUDE form_widgets/select_branch.tmpl %]</td>
</tr>
@ -73,13 +69,8 @@ function init()
<td class="search-heading" align="center">
Limit to</td>
<td class="search"><input type="text" name="limit" value="[% limit %]" size="5"> results</td>
<td class="search-submit" colspan="7"><input type="reset" onclick="FormInit(this.parent, '');">&nbsp;<input type="submit" value="Show Results">
<td class="search-submit" colspan="6"><input type="reset" onclick="FormInit(this.parent, '');">&nbsp;<input type="submit" value="Show Results">
</td>
</tr>
</form>