* Add qd overview page.
This commit is contained in:
+16
-16
@@ -244,6 +244,11 @@ class block extends control
|
||||
{
|
||||
if($module == 'product' && common::hasPriv('product', 'create')) $block->actionLink = html::a($this->createLink('product', 'create'), "<i class='icon icon-sm icon-plus'></i> " . $this->lang->product->create, '', "class='btn btn-sm'");
|
||||
if($module == 'project' && common::hasPriv('project', 'create')) $block->actionLink = html::a($this->createLink('project', 'create'), "<i class='icon icon-sm icon-plus'></i> " . $this->lang->project->create, '', "class='btn btn-sm'");
|
||||
if($module == 'qa' && common::hasPriv('testcase', 'create'))
|
||||
{
|
||||
$this->app->loadLang('testcase');
|
||||
$block->actionLink = html::a($this->createLink('testcase', 'create', 'productID='), "<i class='icon icon-sm icon-plus'></i> " . $this->lang->testcase->create, '', "class='btn btn-sm'");
|
||||
}
|
||||
}
|
||||
|
||||
if($this->block->isLongBlock($block))
|
||||
@@ -1075,29 +1080,24 @@ class block extends control
|
||||
*/
|
||||
public function printQaOverviewBlock()
|
||||
{
|
||||
$projects = $this->loadModel('project')->getList();
|
||||
$casePairs = $this->dao->select('lastRunResult, COUNT(*) AS count')->from(TABLE_CASE)->groupBy('lastRunResult')->fetchPairs();
|
||||
$total = array_sum($casePairs);
|
||||
|
||||
$total = 0;
|
||||
foreach($projects as $project)
|
||||
$this->app->loadLang('testcase');
|
||||
foreach($this->lang->testcase->resultList as $result => $label)
|
||||
{
|
||||
if(!$this->project->checkPriv($project)) continue;
|
||||
|
||||
if(!isset($overview[$project->status])) $overview[$project->status] = 0;
|
||||
$overview[$project->status]++;
|
||||
$total++;
|
||||
if(!isset($casePairs[$result])) $casePairs[$result] = 0;
|
||||
}
|
||||
|
||||
|
||||
$overviewPercent = array();
|
||||
foreach($this->lang->project->statusList as $statusKey => $statusName)
|
||||
$casePercents = array();
|
||||
foreach($casePairs as $result => $count)
|
||||
{
|
||||
if(!isset($overview[$statusKey])) $overview[$statusKey] = 0;
|
||||
$overviewPercent[$statusKey] = round($overview[$statusKey] / $total, 2) * 100 . '%';
|
||||
$casePercents[$result] = $total ? round($count / $total * 100, 2) : 0;
|
||||
}
|
||||
|
||||
$this->view->total = $total;
|
||||
$this->view->overview = $overview;
|
||||
$this->view->overviewPercent = $overviewPercent;
|
||||
$this->view->total = $total;
|
||||
$this->view->casePairs = $casePairs;
|
||||
$this->view->casePercents = $casePercents;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+24
-2
@@ -403,6 +403,7 @@ class blockModel extends model
|
||||
{
|
||||
if($module == 'product') return $this->getProductStatisticParams($module);
|
||||
if($module == 'project') return $this->getProjectStatisticParams($module);
|
||||
if($module == 'qa') return $this->getQaStatisticParams($module);
|
||||
|
||||
$params = new stdclass();
|
||||
$params = $this->onlyNumParams($params);
|
||||
@@ -427,7 +428,7 @@ class blockModel extends model
|
||||
$params->orderBy['options'] = $this->lang->block->orderByList->product;
|
||||
$params->orderBy['control'] = 'select';
|
||||
|
||||
return json_encode($this->onlyNumParams($params));
|
||||
return json_encode($params);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -448,7 +449,28 @@ class blockModel extends model
|
||||
$params->orderBy['options'] = $this->lang->block->orderByList->project;
|
||||
$params->orderBy['control'] = 'select';
|
||||
|
||||
return json_encode($this->onlyNumParams($params));
|
||||
return json_encode($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get qa statistic params.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getQaStatisticParams()
|
||||
{
|
||||
$params = new stdclass();
|
||||
$params->type['name'] = $this->lang->block->type;
|
||||
$params->type['options'] = $this->lang->block->typeList->product;
|
||||
$params->type['control'] = 'select';
|
||||
|
||||
$params->orderBy['name'] = $this->lang->block->orderBy;
|
||||
$params->orderBy['default'] = 'id_desc';
|
||||
$params->orderBy['options'] = $this->lang->block->orderByList->product;
|
||||
$params->orderBy['control'] = 'select';
|
||||
|
||||
return json_encode($params);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -14,21 +14,19 @@
|
||||
.block-overview .tile-amount {font-size: 48px; margin-bottom: 10px;}
|
||||
</style>
|
||||
<div class="panel-body table-row">
|
||||
<div class="col-4 text-middle text-center">
|
||||
<div class="col-6 text-middle text-center">
|
||||
<div class="tile">
|
||||
<div class="tile-title"><?php echo $lang->project->allProject;?></div>
|
||||
<div class="tile-title"><?php echo $lang->testcase->allTestcases;?></div>
|
||||
<div class="tile-amount"><?php echo $total;?></div>
|
||||
<a class="btn btn-primary btn-circle btn-icon-right btn-sm" href="<?php echo $this->createLink('project', 'all');?>"><?php echo $lang->project->viewAll;?> <span class="label label-badge label-icon"><i class="icon icon-arrow-right"></i></span></a>
|
||||
<?php if(common::hasPriv('testcase', 'browse')):?>
|
||||
<a href='<?php echo $this->createLink('testcase', 'browse');?>' class="btn btn-primary btn-circle btn-icon-right btn-sm"><?php echo $lang->testcase->viewAll;?><span class="label label-badge label-icon"><i class="icon icon-arrow-right"></i></span></a>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-8 text-middle">
|
||||
<ul class="status-bars">
|
||||
<?php foreach($lang->project->statusList as $statusKey => $statusName):?>
|
||||
<li>
|
||||
<span class="value"><?php echo $overview[$statusKey];?></span>
|
||||
<span class="bar" style="height: <?php echo $overviewPercent[$statusKey];?>"></span>
|
||||
<span class="title"><?php echo $statusName;?></span>
|
||||
</li>
|
||||
<div class="col-6 text-middle">
|
||||
<ul class="status-bars-h">
|
||||
<?php foreach(array('pass', 'fail', 'blocked') as $result):?>
|
||||
<li><span class="bar" style="width: <?php echo $casePercents[$result];?>%"><span class="title"><?php echo $lang->testcase->resultList[$result];?></span><span class="value"><?php echo $casePairs[$result];?></span></span></li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -129,6 +129,7 @@ $lang->bug->resolvedByMeAB = '由我解決';
|
||||
$lang->bug->ditto = '同上';
|
||||
$lang->bug->dittoNotice = '該bug與上一bug不屬於同一產品!';
|
||||
$lang->bug->noAssigned = '未指派';
|
||||
$lang->bug->noBug = '暫時沒有BUG,您現在可以';
|
||||
|
||||
/* 頁面標籤。*/
|
||||
$lang->bug->lblAssignedTo = '當前指派';
|
||||
|
||||
@@ -279,20 +279,39 @@ $lang->bug->menu->caselib = array('link' => '用例庫|testsuite|library');
|
||||
|
||||
$lang->testcase = new stdclass();
|
||||
$lang->testcase->menu = new stdclass();
|
||||
|
||||
$lang->testcase->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->testcase->menu->testcase = array('link' => '用例|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,batchedit,showimport,groupcase,importfromlib', 'subModule' => 'tree');
|
||||
$lang->testcase->menu->testtask = array('link' => '測試單|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases,start,close,batchrun,groupcase,report');
|
||||
$lang->testcase->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s', 'alias' => 'view,create,edit,linkcase');
|
||||
$lang->testcase->menu->report = array('link' => '報告|testreport|browse|productID=%s', 'alias' => 'view,create,edit');
|
||||
$lang->testcase->menu->testtask = array('link' => '測試單|testtask|browse|productID=%s');
|
||||
$lang->testcase->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s');
|
||||
$lang->testcase->menu->report = array('link' => '報告|testreport|browse|productID=%s');
|
||||
$lang->testcase->menu->caselib = array('link' => '用例庫|testsuite|library');
|
||||
|
||||
$lang->testtask = new stdclass();
|
||||
$lang->testtask->menu = $lang->testcase->menu;
|
||||
$lang->testtask->menu = new stdclass();
|
||||
$lang->testtask->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->testtask->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->testtask->menu->testtask = array('link' => '測試單|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases,start,close,batchrun,groupcase,report');
|
||||
$lang->testtask->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s');
|
||||
$lang->testtask->menu->report = array('link' => '報告|testreport|browse|productID=%s');
|
||||
$lang->testtask->menu->caselib = array('link' => '用例庫|testsuite|library');
|
||||
|
||||
$lang->testsuite = new stdclass();
|
||||
$lang->testsuite->menu = $lang->testcase->menu;
|
||||
$lang->testsuite->menu = new stdclass();
|
||||
$lang->testsuite->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->testsuite->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->testsuite->menu->testtask = array('link' => '測試單|testtask|browse|productID=%s');
|
||||
$lang->testsuite->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s', 'alias' => 'view,create,edit,linkcase');
|
||||
$lang->testsuite->menu->report = array('link' => '報告|testreport|browse|productID=%s');
|
||||
$lang->testsuite->menu->caselib = array('link' => '用例庫|testsuite|library');
|
||||
|
||||
$lang->testreport = new stdclass();
|
||||
$lang->testreport->menu = $lang->testcase->menu;
|
||||
$lang->testreport->menu = new stdclass();
|
||||
$lang->testreport->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->testreport->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->testreport->menu->testtask = array('link' => '測試單|testtask|browse|productID=%s');
|
||||
$lang->testreport->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s');
|
||||
$lang->testreport->menu->report = array('link' => '報告|testreport|browse|productID=%s', 'alias' => 'view,create,edit');
|
||||
$lang->testreport->menu->caselib = array('link' => '用例庫|testsuite|library');
|
||||
|
||||
$lang->caselib = new stdclass();
|
||||
$lang->caselib->menu = new stdclass();
|
||||
@@ -765,11 +784,10 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
|
||||
|
||||
/* Adjust sub menu of caselib module. */
|
||||
$lang->caselib->menu = new stdclass();
|
||||
$lang->caselib->menu->lib = array('link' => '%s', 'fixed' => true);
|
||||
$lang->caselib->menu->all = '所有|testsuite|library|libID=%s&browseType=all';
|
||||
$lang->caselib->menu->wait = '待評審|testsuite|library|libID=%s&browseType=wait';
|
||||
$lang->caselib->menu->view = '概況|testsuite|libview|libID=%s';
|
||||
$lang->caselib->menu->create = array('link' => "<i class='icon-plus'></i> 創建庫|testsuite|createLib", 'float' => 'right');
|
||||
$lang->caselib->menu->lib = array('link' => '%s', 'fixed' => true);
|
||||
$lang->caselib->menu->all = '所有|testsuite|library|libID=%s&browseType=all';
|
||||
$lang->caselib->menu->wait = '待評審|testsuite|library|libID=%s&browseType=wait';
|
||||
$lang->caselib->menu->view = '概況|testsuite|libview|libID=%s';
|
||||
|
||||
$lang->caselib->menuOrder[5] = 'lib';
|
||||
$lang->caselib->menuOrder[10] = 'all';
|
||||
|
||||
@@ -102,6 +102,7 @@ $lang->testcase->group = 'Group';
|
||||
$lang->testcase->groupName = 'Group Name';
|
||||
$lang->testcase->step = 'Step';
|
||||
$lang->testcase->stepChild = 'Child';
|
||||
$lang->testcase->viewAll = 'View All';
|
||||
|
||||
$lang->testcase->new = 'New';
|
||||
|
||||
@@ -111,11 +112,12 @@ $lang->testcase->deleteStep = 'Delete';
|
||||
$lang->testcase->insertBefore = 'Inserted Before';
|
||||
$lang->testcase->insertAfter = 'Inserted After';
|
||||
|
||||
$lang->testcase->assignToMe = 'AssignedToMe';
|
||||
$lang->testcase->openedByMe = 'CreatedByMe';
|
||||
$lang->testcase->allCases = 'All';
|
||||
$lang->testcase->needConfirm = 'StoryChanged';
|
||||
$lang->testcase->bySearch = 'Search';
|
||||
$lang->testcase->assignToMe = 'AssignedToMe';
|
||||
$lang->testcase->openedByMe = 'CreatedByMe';
|
||||
$lang->testcase->allCases = 'All';
|
||||
$lang->testcase->allTestcases = 'All Cases';
|
||||
$lang->testcase->needConfirm = 'StoryChanged';
|
||||
$lang->testcase->bySearch = 'Search';
|
||||
|
||||
$lang->testcase->lblStory = 'Story';
|
||||
$lang->testcase->lblLastEdited = 'Last Edit';
|
||||
|
||||
@@ -102,6 +102,7 @@ $lang->testcase->group = '分组';
|
||||
$lang->testcase->groupName = '分组名称';
|
||||
$lang->testcase->step = '步骤';
|
||||
$lang->testcase->stepChild = '子步骤';
|
||||
$lang->testcase->viewAll = '查看所有';
|
||||
|
||||
$lang->testcase->new = '新增';
|
||||
|
||||
@@ -111,11 +112,12 @@ $lang->testcase->deleteStep = '删除';
|
||||
$lang->testcase->insertBefore = '之前添加';
|
||||
$lang->testcase->insertAfter = '之后添加';
|
||||
|
||||
$lang->testcase->assignToMe = '给我的用例';
|
||||
$lang->testcase->openedByMe = '我建的用例';
|
||||
$lang->testcase->allCases = '所有';
|
||||
$lang->testcase->needConfirm = '需求变动';
|
||||
$lang->testcase->bySearch = '搜索';
|
||||
$lang->testcase->assignToMe = '给我的用例';
|
||||
$lang->testcase->openedByMe = '我建的用例';
|
||||
$lang->testcase->allCases = '所有';
|
||||
$lang->testcase->allTestcases = '所有用例';
|
||||
$lang->testcase->needConfirm = '需求变动';
|
||||
$lang->testcase->bySearch = '搜索';
|
||||
|
||||
$lang->testcase->lblStory = '相关需求';
|
||||
$lang->testcase->lblLastEdited = '最后编辑';
|
||||
@@ -201,4 +203,3 @@ $lang->testcase->featureBar['browse']['group'] = '分组查看';
|
||||
$lang->testcase->featureBar['browse']['suite'] = '套件';
|
||||
$lang->testcase->featureBar['browse']['zerocase'] = '零用例需求';
|
||||
$lang->testcase->featureBar['groupcase'] = $lang->testcase->featureBar['browse'];
|
||||
|
||||
|
||||
@@ -102,6 +102,7 @@ $lang->testcase->group = '分組';
|
||||
$lang->testcase->groupName = '分組名稱';
|
||||
$lang->testcase->step = '步驟';
|
||||
$lang->testcase->stepChild = '子步驟';
|
||||
$lang->testcase->viewAll = '查看所有';
|
||||
|
||||
$lang->testcase->new = '新增';
|
||||
|
||||
@@ -111,11 +112,12 @@ $lang->testcase->deleteStep = '刪除';
|
||||
$lang->testcase->insertBefore = '之前添加';
|
||||
$lang->testcase->insertAfter = '之後添加';
|
||||
|
||||
$lang->testcase->assignToMe = '給我的用例';
|
||||
$lang->testcase->openedByMe = '我建的用例';
|
||||
$lang->testcase->allCases = '所有';
|
||||
$lang->testcase->needConfirm = '需求變動';
|
||||
$lang->testcase->bySearch = '搜索';
|
||||
$lang->testcase->assignToMe = '給我的用例';
|
||||
$lang->testcase->openedByMe = '我建的用例';
|
||||
$lang->testcase->allCases = '所有';
|
||||
$lang->testcase->allTestcases = '所有用例';
|
||||
$lang->testcase->needConfirm = '需求變動';
|
||||
$lang->testcase->bySearch = '搜索';
|
||||
|
||||
$lang->testcase->lblStory = '相關需求';
|
||||
$lang->testcase->lblLastEdited = '最後編輯';
|
||||
@@ -201,4 +203,3 @@ $lang->testcase->featureBar['browse']['group'] = '分組查看';
|
||||
$lang->testcase->featureBar['browse']['suite'] = '套件';
|
||||
$lang->testcase->featureBar['browse']['zerocase'] = '零用例需求';
|
||||
$lang->testcase->featureBar['groupcase'] = $lang->testcase->featureBar['browse'];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user