Fix the special case of a empty issue tracker, for the issue summary.
This commit is contained in:
parent
69ae1c08ef
commit
ef5b93e3f7
@ -84,53 +84,66 @@ class IDF_Views_Issue
|
||||
public $summary_precond = array('IDF_Precondition::accessIssues');
|
||||
public function summary($request, $match)
|
||||
{
|
||||
$tagStatistics = array();
|
||||
$ownerStatistics = array();
|
||||
$status = array();
|
||||
$isTrackerEmpty = false;
|
||||
|
||||
$prj = $request->project;
|
||||
$opened = $prj->getIssueCountByStatus('open');
|
||||
$closed = $prj->getIssueCountByStatus('closed');
|
||||
$otags = implode(',', $prj->getTagIdsByStatus('open'));
|
||||
|
||||
// Issue status statistics
|
||||
$status = array();
|
||||
$status['Open'] = array($opened, (int)(100 * $opened / ($opened + $closed)));
|
||||
$status['Closed'] = array($closed, (int)(100 * $closed / ($opened + $closed)));
|
||||
|
||||
// Issue owner statistics
|
||||
$sqlIssueTable = Pluf::factory('IDF_Issue')->getSqlTable();
|
||||
$sqlUsersTable = Pluf::factory('Pluf_User')->getSqlTable();
|
||||
$query = <<<"QUERY"
|
||||
// Check if the tracker is empty
|
||||
if ($opened === 0 && $closed === 0) {
|
||||
$isTrackerEmpty = true;
|
||||
} else {
|
||||
if ($opened > 0 || $closed > 0) {
|
||||
// Issue status statistics
|
||||
$status['Open'] = array($opened, (int)(100 * $opened / ($opened + $closed)));
|
||||
$status['Closed'] = array($closed, (int)(100 * $closed / ($opened + $closed)));
|
||||
}
|
||||
|
||||
if ($opened > 0) {
|
||||
// Issue owner statistics
|
||||
$sqlIssueTable = Pluf::factory('IDF_Issue')->getSqlTable();
|
||||
$sqlUsersTable = Pluf::factory('Pluf_User')->getSqlTable();
|
||||
$otags = implode(',', $prj->getTagIdsByStatus('open'));
|
||||
$query = <<<"QUERY"
|
||||
SELECT CONCAT(first_name, " ", last_name) as name, nb FROM (SELECT uid as id,count(uid) as nb FROM (SELECT ifnull(owner, -1) as uid FROM $sqlIssueTable WHERE status IN ($otags)) as ff group by uid) AS ff LEFT JOIN $sqlUsersTable using(id)
|
||||
QUERY;
|
||||
$db = Pluf::db();
|
||||
$dbData = $db->select($query);
|
||||
$ownerStatistics = array();
|
||||
foreach ($dbData as $k => $v) {
|
||||
$key = ($v['name'] === null) ? __('Not assigned') : $v['name'];
|
||||
$ownerStatistics[$key] = array($v['nb'], (int)(100 * $v['nb'] / $opened));
|
||||
}
|
||||
$db = Pluf::db();
|
||||
$dbData = $db->select($query);
|
||||
foreach ($dbData as $k => $v) {
|
||||
$key = ($v['name'] === null) ? __('Not assigned') : $v['name'];
|
||||
$ownerStatistics[$key] = array($v['nb'], (int)(100 * $v['nb'] / $opened));
|
||||
}
|
||||
|
||||
// Issue class tag statistics
|
||||
$tags = $prj->getTagCloud();
|
||||
$tagStatistics = array();
|
||||
foreach ($tags as $t) {
|
||||
$tagStatistics[$t->class][$t->name] = array($t->nb_use, $t->id);
|
||||
}
|
||||
foreach($tagStatistics as $k => $v) {
|
||||
$nbIssueInClass = 0;
|
||||
foreach ($v as $val) {
|
||||
$nbIssueInClass += $val[0];
|
||||
}
|
||||
foreach ($v as $kk => $vv) {
|
||||
$tagStatistics[$k][$kk] = array($vv[0], (int)(100 * $vv[0] / $nbIssueInClass), $vv[1]);
|
||||
// Issue class tag statistics
|
||||
$tags = $prj->getTagCloud();
|
||||
foreach ($tags as $t) {
|
||||
$tagStatistics[$t->class][$t->name] = array($t->nb_use, $t->id);
|
||||
}
|
||||
foreach($tagStatistics as $k => $v) {
|
||||
$nbIssueInClass = 0;
|
||||
foreach ($v as $val) {
|
||||
$nbIssueInClass += $val[0];
|
||||
}
|
||||
foreach ($v as $kk => $vv) {
|
||||
$tagStatistics[$k][$kk] = array($vv[0], (int)(100 * $vv[0] / $nbIssueInClass), $vv[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// Sort
|
||||
krsort($tagStatistics);
|
||||
arsort($ownerStatistics);
|
||||
}
|
||||
}
|
||||
|
||||
// Sort
|
||||
krsort($tagStatistics);
|
||||
arsort($ownerStatistics);
|
||||
|
||||
$title = sprintf(__('Summary of tracked issues in %s.'), (string) $prj);
|
||||
|
||||
return Pluf_Shortcuts_RenderToResponse('idf/issues/summary.html',
|
||||
array('page_title' => $title,
|
||||
'trackerEmpty' => $isTrackerEmpty,
|
||||
'project' => $prj,
|
||||
'tagStatistics' => $tagStatistics,
|
||||
'ownerStatistics' => $ownerStatistics,
|
||||
|
@ -3,87 +3,93 @@
|
||||
{block docclass}yui-t2{assign $inSummaryIssues=true}{/block}
|
||||
|
||||
{block body}
|
||||
{if $trackerEmpty}
|
||||
{aurl 'create_url', 'IDF_Views_Issue::create', array($project.shortname)}
|
||||
<p>{blocktrans}The issue tracker is empty<br />You can create your first issue <a href="{$create_url}">here</a>.{/blocktrans}</p>
|
||||
{else}
|
||||
<div class='issue-summary'>
|
||||
{foreach $tagStatistics as $key => $class}
|
||||
<div>
|
||||
<h2>Unresolved: By {$key}</h2>
|
||||
<table class='issue-summary'>
|
||||
<tbody>
|
||||
{foreach $class as $key => $value}
|
||||
<tr>
|
||||
<td class="name"><a href="{url 'IDF_Views_Issue::listLabel', array($project.shortname, $value[2], 'open')}">{$key}</a></td>
|
||||
<td class="count">{$value[0]}</td>
|
||||
<td class="graph">
|
||||
<table class='graph'>
|
||||
<tbody><tr>
|
||||
<td style="width:{$value[1] * 0.8}%" class="graph-color" valign="center">
|
||||
<div class="colour-bar"></div>
|
||||
</td>
|
||||
<td> {$value[1]}%</td>
|
||||
</tr>
|
||||
<div>
|
||||
<h2>Unresolved: By {$key}</h2>
|
||||
<table class='issue-summary'>
|
||||
<tbody>
|
||||
{foreach $class as $key => $value}
|
||||
<tr>
|
||||
<td class="name"><a href="{url 'IDF_Views_Issue::listLabel', array($project.shortname, $value[2], 'open')}">{$key}</a></td>
|
||||
<td class="count">{$value[0]}</td>
|
||||
<td class="graph">
|
||||
<table class='graph'>
|
||||
<tbody><tr>
|
||||
<td style="width:{$value[1] * 0.8}%" class="graph-color" valign="center">
|
||||
<div class="colour-bar"></div>
|
||||
</td>
|
||||
<td> {$value[1]}%</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
|
||||
<div class='issue-summary'>
|
||||
|
||||
<div>
|
||||
<h2>Status Summary</h2>
|
||||
<table class='issue-summary'>
|
||||
<tbody>
|
||||
{foreach $status as $key => $value}
|
||||
<tr>
|
||||
<td class="name"><a href="{url 'IDF_Views_Issue::listStatus', array($project.shortname, $key)}">{$key}</a></td>
|
||||
<td class="count">{$value[0]}</td>
|
||||
<td class="graph">
|
||||
<table class='graph'>
|
||||
<tbody><tr>
|
||||
<td style="width:{$value[1] * 0.8}%" class="graph-color" valign="center">
|
||||
<div class="colour-bar"></div>
|
||||
</td>
|
||||
<td> {$value[1]}%</td>
|
||||
</tr>
|
||||
{if $status}
|
||||
<div>
|
||||
<h2>Status Summary</h2>
|
||||
<table class='issue-summary'>
|
||||
<tbody>
|
||||
{foreach $status as $key => $value}
|
||||
<tr>
|
||||
<td class="name"><a href="{url 'IDF_Views_Issue::listStatus', array($project.shortname, $key)}">{$key}</a></td>
|
||||
<td class="count">{$value[0]}</td>
|
||||
<td class="graph">
|
||||
<table class='graph'>
|
||||
<tbody><tr>
|
||||
<td style="width:{$value[1] * 0.8}%" class="graph-color" valign="center">
|
||||
<div class="colour-bar"></div>
|
||||
</td>
|
||||
<td> {$value[1]}%</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div>
|
||||
<h2>Unresolved: By Assignee</h2>
|
||||
<table class='issue-summary'>
|
||||
<tbody>
|
||||
{foreach $ownerStatistics as $key => $value}
|
||||
<tr>
|
||||
<td class="name">{$key}</td>
|
||||
<td class="count">{$value[0]}</td>
|
||||
<td class="graph">
|
||||
<table class='graph'>
|
||||
<tbody><tr>
|
||||
<td style="width:{$value[1] * 0.8}%" class="graph-color" valign="center">
|
||||
<div class="colour-bar"></div>
|
||||
</td>
|
||||
<td> {$value[1]}%</td>
|
||||
</tr>
|
||||
{if $ownerStatistics}
|
||||
<div>
|
||||
<h2>Unresolved: By Assignee</h2>
|
||||
<table class='issue-summary'>
|
||||
<tbody>
|
||||
{foreach $ownerStatistics as $key => $value}
|
||||
<tr>
|
||||
<td class="name">{$key}</td>
|
||||
<td class="count">{$value[0]}</td>
|
||||
<td class="graph">
|
||||
<table class='graph'>
|
||||
<tbody><tr>
|
||||
<td style="width:{$value[1] * 0.8}%" class="graph-color" valign="center">
|
||||
<div class="colour-bar"></div>
|
||||
</td>
|
||||
<td> {$value[1]}%</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{/if}
|
||||
{/block}
|
||||
|
@ -1128,7 +1128,7 @@ table.issue-summary {
|
||||
|
||||
table.issue-summary tr td {
|
||||
border: 0;
|
||||
padding: .1em;
|
||||
padding: .1em .005em;
|
||||
}
|
||||
|
||||
table.issue-summary td.graph {
|
||||
|
Loading…
Reference in New Issue
Block a user