synergy/client/app/partials/public/view/statistics.html (208 lines of code) (raw):
<div class="custom" id="specpool_partial">
<div class="row-fluid">
<h1>Statistics for {{data.testRun.title}} <small><a href="#/run/{{id}}">back to test run</a></small></h1>
<div class="span6">
<select data-ng-model="timeView" data-ng-change="getAllTimeData()">
<option value="all">All time</option>
<option value="filter">Specific time period</option>
</select>
<div style="margin: 0 0 0em 2em" class="well well-small" data-ng-hide="timeView == 'all'">
<form name="myForm2" class="form form-inline" >
<span>From: </span>
<input class="input-medium" type="text" name="pid" required="required" id="start" />
<span>To: </span>
<input class="input-medium" type="text" name="pid" required="required" id="end" />
<button type="button" data-ng-click="filterStatistics()" class="btn btn-primary pull-right">Filter</button><br/>
<small>local time</small>
</form>
</div>
<br/>
</div>
</div>
<div class="row-fluid">
<div class="span11">
<div class="pull-left"><h6>Test cases</h6>
<canvas id="canvas1" width="260" height="150"></canvas>
<canvas id="canvas2" width="260" height="150"></canvas>
</div>
<div class="pull-right"> <h6>Issues</h6>
<canvas id="issuesResolution" width="260" height="150"></canvas>
<canvas id="issuesPriority" width="260" height="150"></canvas> </div>
</div>
<div class="span5"></div>
</div>
<h2>Test assignments</h2>
<div class="row-fluid">
<div class="span7">
<ul>
<li><b>Test run: </b>{{data.testRun.title}}</li>
<li><b>Number of testers: </b>{{computed.testersCount}}</li>
<li><b>Contributed hours: </b>{{computed.time}}</li>
<li><b>Executed test cases: </b>{{data.testRun.completed}} out of {{data.testRun.total}} ({{computed.completedRelative}} %)</li>
<li><b>Pass rate: </b>{{computed.passRate}} % </li>
</ul>
</div>
<div class="span4">
<div class="well well-large pull-left {{issueColor}}">
<b>Found bugs</b>
<span data-ng-switch="issuesTotal">
<span data-ng-switch-when="0">0</span>
<span data-ng-switch-default>
<a data-ng-href="{{issuesUrl}}">{{issuesTotal}}</a>
<br/>
<span data-ng-hide="unresolvedIssues.length == 0"><a data-ng-href="{{SYNERGY.issues.viewLinkObjects(data.testRun.projectName,unresolvedIssues)}}">Unresolved issues: {{unresolvedIssues.length}}</a><br/></span>
<span data-ng-hide="P1Issues.length == 0"><a data-ng-href="{{SYNERGY.issues.viewLinkObjects(data.testRun.projectName,P1Issues)}}">P1 issues {{P1Issues.length}}</a><br/></span>
<span data-ng-hide="P2Issues.length == 0"><a data-ng-href="{{SYNERGY.issues.viewLinkObjects(data.testRun.projectName,P2Issues)}}">P2 issues: {{P2Issues.length}}</a><br/></span>
<span data-ng-hide="P3Issues.length == 0"><a data-ng-href="{{SYNERGY.issues.viewLinkObjects(data.testRun.projectName,P3Issues)}}">P3 issues: {{P3Issues.length}}</a><br/></span>
<span data-ng-hide="unknownIssues.length == 0"><a data-ng-href="{{SYNERGY.issues.viewLinkObjects(data.testRun.projectName,unknownIssues)}}">Unknown issues: {{unknownIssues.length}}</a><br/></span>
</span>
</span>
</div>
</div>
</div>
<div class="row-fluid">
<div class="span5">
<div data-ng-hide="computed.testers.length < 1"> <h3>Testers</h3>
<table class="table-condensed table-bordered table-hover table-striped">
<thead>
<tr>
<th>#</th>
<th>Tester
<br/>
<small><span data-ng-click="sortUsers('name')" style="cursor: pointer"> <i class="icon-arrow-up user{{orderPropU.prop == 'name' && !orderPropU.descending}}"></i>/<i class="user{{orderPropU.prop == 'name' && orderPropU.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Username
<br/>
<small><span data-ng-click="sortUsers('username')" style="cursor: pointer"> <i class="icon-arrow-up user{{orderPropU.prop == 'username' && !orderPropU.descending}}"></i>/<i class="user{{orderPropU.prop == 'username' && orderPropU.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Completed TC
<br/>
<small><span data-ng-click="sortUsers('completedCases')" style="cursor: pointer"> <i class="icon-arrow-up compl{{orderPropU.prop == 'completedCases' && !orderPropU.descending}}"></i>/<i class="compl{{orderPropU.prop == 'completedCases' && orderPropU.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Time
<br/>
<small><span data-ng-click="sortUsers('time')" style="cursor: pointer"> <i class="icon-arrow-up ttime{{orderPropU.prop == 'time' && !orderPropU.descending}}"></i>/<i class="ttime{{orderPropU.prop == 'time' && orderPropU.descending}} icon-arrow-down"></i> </span></small>
</th>
</tr>
</thead>
<tbody>
<tr data-ng-repeat="tester in computed.testers|orderBy:orderPropU.prop:orderPropU.descending">
<td>{{$index + 1}}</td>
<td><a data-ng-href="#/user/{{tester.username}}">{{tester.name}}</a></td>
<td>{{tester.username}}</td>
<td>{{tester.completedCases}}</td>
<td>{{tester.prettyTime}}</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="span7">
<div data-ng-hide="tribes.length < 1">
<h3>Tribes</h3>
<table class="table-condensed table-bordered table-hover table-striped">
<thead>
<tr>
<th>#</th>
<th>Tribe<br/>
<small><span data-ng-click="sortTribes('name')" style="cursor: pointer"> <i class="icon-arrow-up tribe{{orderProp.prop == 'name' && !orderProp.descending}}"></i>/<i class="tribe{{orderProp.prop == 'name' && orderProp.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Passed<br/>
<small><span data-ng-click="sortTribes('passedRate')" style="cursor: pointer"> <i class="icon-arrow-up passed{{orderProp.prop == 'passedRate' && !orderProp.descending}}"></i>/<i class="passed{{orderProp.prop == 'passedRate' && orderProp.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Tested TC<br/>
<small><span data-ng-click="sortTribes('testedTotal')" style="cursor: pointer"> <i class="icon-arrow-up tested{{orderProp.prop == 'testedTotal' && !orderProp.descending}}"></i>/<i class="tested{{orderProp.prop == 'testedTotal' && orderProp.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Time<br/>
<small><span data-ng-click="sortTribes('time')" style="cursor: pointer"> <i class="icon-arrow-up time{{orderProp.prop == 'time' && !orderProp.descending}}"></i>/<i class="time{{orderProp.prop == 'time' && orderProp.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Testers<br/>
<small><span data-ng-click="sortTribes('users')" style="cursor: pointer"> <i class="icon-arrow-up testers{{orderProp.prop == 'users' && !orderProp.descending}}"></i>/<i class="testers{{orderProp.prop == 'users' && orderProp.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Tested TC/Testers<br/>
<small><span data-ng-click="sortTribes('productivity')" style="cursor: pointer"> <i class="icon-arrow-up productivity{{orderProp.prop == 'productivity' && orderProp.descending}}"></i>/<i class="productivity{{orderProp.prop == 'productivity' && !orderProp.descending}} icon-arrow-down"></i> </span></small>
</th>
</tr>
</thead>
<tbody>
<tr data-ng-repeat="tribe in tribes|orderBy:orderProp.prop:orderProp.descending">
<td>{{$index + 1}}</td>
<td><a data-ng-href="#/tribe/{{tribe.id}}">{{tribe.name}}</a></td>
<td>{{tribe.passedRate}} %</td>
<td>{{tribe.testedTotal}}</td>
<td>{{tribe.prettyTime}}</td>
<td>{{tribe.users}}</td>
<td>{{(tribe.testedTotal / tribe.users)|number:1}}</td>
</tr>
</tbody>
</table></div>
</div>
</div>
<div class="row-fluid" data-ng-hide="data.reviews.length < 1">
<h2>Review assignments</h2>
<div class="span7">
<ul>
<li><b>Test run: </b>{{data.testRun.title}}</li>
<li><b>Number of reviewers </b>{{reviewTotal.reviewers}}</li>
<li><b>Contributed hours: </b>{{reviewTotal.time}}</li>
<li><b>Reviewed documents: </b>{{reviewTotal.completed}} completed out of {{reviewTotal.total}} started ({{reviewTotal.finishRate}} %)</li>
<li><b>Total comments: </b>{{reviewTotal.comments}} </li>
</ul>
</div>
<div class="span4">
</div>
</div>
<div class="row-fluid" data-ng-hide="data.reviews.length < 1">
<div class="span7">
<h3>Reviewers</h3>
<table class="table-condensed table-bordered table-hover table-striped">
<thead>
<tr>
<th>#</th>
<th>Tester
<br/>
<small><span data-ng-click="sortReviewers('name')" style="cursor: pointer"> <i class="icon-arrow-up reviewer{{orderPropR.prop == 'name' && !orderPropR.descending}}"></i>/<i class="reviewer{{orderPropR.prop == 'name' && orderPropR.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Username
<br/>
<small><span data-ng-click="sortReviewers('username')" style="cursor: pointer"> <i class="icon-arrow-up reviewerR{{orderPropR.prop == 'username' && !orderPropR.descending}}"></i>/<i class="reviewerR{{orderPropR.prop == 'username' && orderPropR.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Completed reviews
<br/>
<small><span data-ng-click="sortReviewers('completed')" style="cursor: pointer"> <i class="icon-arrow-up complR{{orderPropR.prop == 'completed' && !orderPropR.descending}}"></i>/<i class="complR{{orderPropR.prop == 'completed' && orderPropR.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Started reviews
<br/>
<small><span data-ng-click="sortReviewers('started')" style="cursor: pointer"> <i class="icon-arrow-up startedR{{orderPropR.prop == 'started' && !orderPropR.descending}}"></i>/<i class="startedR{{orderPropR.prop == 'started' && orderPropR.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Comments
<br/>
<small><span data-ng-click="sortReviewers('comments')" style="cursor: pointer"> <i class="icon-arrow-up commentsR{{orderPropR.prop == 'comments' && !orderPropR.descending}}"></i>/<i class="commentsR{{orderPropR.prop == 'comments' && orderPropR.descending}} icon-arrow-down"></i> </span></small>
</th>
<th title="Based on number of words in reviewed document">Score
<br/>
<small><span data-ng-click="sortReviewers('weight')" style="cursor: pointer"> <i class="icon-arrow-up weightR{{orderPropR.prop == 'weight' && !orderPropR.descending}}"></i>/<i class="weightR{{orderPropR.prop == 'weight' && orderPropR.descending}} icon-arrow-down"></i> </span></small>
</th>
<th>Time
<br/>
<small><span data-ng-click="sortReviewers('time')" style="cursor: pointer"> <i class="icon-arrow-up timeR{{orderPropR.prop == 'time' && !orderPropR.descending}}"></i>/<i class="timeR{{orderPropR.prop == 'time' && orderPropR.descending}} icon-arrow-down"></i> </span></small>
</th>
</tr>
</thead>
<tbody>
<tr data-ng-repeat="tester in reviews|orderBy:orderPropR.prop:orderPropR.descending">
<td>{{$index + 1}}</td>
<td><a data-ng-href="#/user/{{tester.username}}">{{tester.name}}</a></td>
<td>{{tester.username}}</td>
<td>{{tester.completed}}</td>
<td>{{tester.total}}</td>
<td>{{tester.comments}}</td>
<td>{{tester.weight}}</td>
<td>{{tester.prettyTime}}</td>
</tr>
</tbody>
</table>
</div>
<div class="span5"> </div>
</div>
</div>