Merge branch 'master' of https://github.com/easysoft/zentaopms
This commit is contained in:
@@ -25,6 +25,7 @@ $lang->action->undelete = 'Restore';
|
||||
$lang->action->hideOne = 'Hide';
|
||||
$lang->action->hideAll = 'Hide All';
|
||||
$lang->action->editComment = 'Edit';
|
||||
$lang->action->create = 'Create Comment';
|
||||
$lang->action->comment = 'Comment';
|
||||
|
||||
$lang->action->trashTips = 'Note: All Deletion in ZenTao are logical.';
|
||||
@@ -53,6 +54,14 @@ $lang->action->dynamic->all = 'All';
|
||||
$lang->action->dynamic->hidden = 'Hidden';
|
||||
$lang->action->dynamic->search = 'Search';
|
||||
|
||||
$lang->action->periods['all'] = $lang->action->dynamic->all;
|
||||
$lang->action->periods['today'] = $lang->action->dynamic->today;
|
||||
$lang->action->periods['yesterday'] = $lang->action->dynamic->yesterday;
|
||||
$lang->action->periods['thisweek'] = $lang->action->dynamic->thisWeek;
|
||||
$lang->action->periods['lastweek'] = $lang->action->dynamic->lastWeek;
|
||||
$lang->action->periods['thismonth'] = $lang->action->dynamic->thisMonth;
|
||||
$lang->action->periods['lastmonth'] = $lang->action->dynamic->lastMonth;
|
||||
|
||||
$lang->action->objectTypes['product'] = $lang->productCommon;
|
||||
$lang->action->objectTypes['story'] = 'Story';
|
||||
$lang->action->objectTypes['productplan'] = 'Plan';
|
||||
|
||||
@@ -54,6 +54,14 @@ $lang->action->dynamic->all = '所有';
|
||||
$lang->action->dynamic->hidden = '已隐藏';
|
||||
$lang->action->dynamic->search = '搜索';
|
||||
|
||||
$lang->action->periods['all'] = $lang->action->dynamic->all;
|
||||
$lang->action->periods['today'] = $lang->action->dynamic->today;
|
||||
$lang->action->periods['yesterday'] = $lang->action->dynamic->yesterday;
|
||||
$lang->action->periods['thisweek'] = $lang->action->dynamic->thisWeek;
|
||||
$lang->action->periods['lastweek'] = $lang->action->dynamic->lastWeek;
|
||||
$lang->action->periods['thismonth'] = $lang->action->dynamic->thisMonth;
|
||||
$lang->action->periods['lastmonth'] = $lang->action->dynamic->lastMonth;
|
||||
|
||||
$lang->action->objectTypes['product'] = $lang->productCommon;
|
||||
$lang->action->objectTypes['story'] = '需求';
|
||||
$lang->action->objectTypes['productplan'] = '计划';
|
||||
|
||||
@@ -967,25 +967,6 @@ class actionModel extends model
|
||||
$this->file->updateObjectID($this->post->uid, $action->objectID, $action->objectType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get action count.
|
||||
*
|
||||
* @param string $type
|
||||
* @param string $id
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
public function getCount($type = 'account', $id = '')
|
||||
{
|
||||
if($type == 'account' and empty($id)) $id = $this->app->user->account;
|
||||
return $this->dao->select('count(*) AS count')->from(TABLE_ACTION)
|
||||
->where('1=1')
|
||||
->beginIF($type == 'account')->andWhere('actor')->eq($id)->fi()
|
||||
->beginIF($type == 'product')->andWhere('product')->like("%,$id,%")->fi()
|
||||
->beginIF($type == 'project')->andWhere('project')->eq($id)->fi()
|
||||
->fetch('count');
|
||||
}
|
||||
|
||||
/**
|
||||
* Build date group by actions
|
||||
*
|
||||
|
||||
+137
-2
@@ -696,16 +696,30 @@ class block extends control
|
||||
|
||||
/**
|
||||
* Print statistic block.
|
||||
*
|
||||
* @param string $module
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function printStatisticBlock($module = 'product')
|
||||
{
|
||||
$func = 'print' . ucfirst($module) . 'StatisticBlock';
|
||||
$this->view->module = $module;
|
||||
$this->$func();
|
||||
}
|
||||
|
||||
/**
|
||||
* Print product statistic block.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function printStatisticBlock()
|
||||
public function printProductStatisticBlock()
|
||||
{
|
||||
if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
|
||||
|
||||
$status = isset($this->params->type) ? $this->params->type : '';
|
||||
$orderBy = isset($this->params->type) ? $this->params->orderBy : 'id_asc';
|
||||
$orderBy = isset($this->params->orderBy) ? $this->params->orderBy : 'id_asc';
|
||||
$num = isset($this->params->num) ? (int)$this->params->num : 0;
|
||||
|
||||
/* Get products. */
|
||||
@@ -830,6 +844,127 @@ class block extends control
|
||||
$this->view->products = $products;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print project statistic block.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function printProjectStatisticBlock()
|
||||
{
|
||||
if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
|
||||
|
||||
$status = isset($this->params->type) ? $this->params->type : '';
|
||||
$orderBy = isset($this->params->orderBy) ? $this->params->orderBy : 'id_asc';
|
||||
$num = isset($this->params->num) ? (int)$this->params->num : 0;
|
||||
|
||||
/* Get projects. */
|
||||
$projects = $this->loadModel('project')->getList($status);
|
||||
foreach($projects as $projectID => $project)
|
||||
{
|
||||
if(!$this->project->checkPriv($project)) unset($projects[$projectID]);
|
||||
}
|
||||
$projectIDList = array_keys($projects);
|
||||
if(!$projectIDList)
|
||||
{
|
||||
$this->view->projects = $projects;
|
||||
return false;
|
||||
}
|
||||
$projects = $this->dao->select('*')->from(TABLE_PROJECT)
|
||||
->where('id')->in($projectIDList)
|
||||
->orderBy($orderBy)
|
||||
->beginIF($this->viewType != 'json')->limit($num)->fi()
|
||||
->fetchAll('id');
|
||||
|
||||
|
||||
/* Get tasks. */
|
||||
$yesterday = date('Y-m-d', strtotime('-1 day'));
|
||||
$tasks = $this->dao->select("project, count(id) as totalTasks, count(status not in ('wait,doing,pause') or null) as undoneTasks, count(finishedDate like '{$yesterday}%' or null) as yesterdayFinished, sum(if(status != 'cancel', estimate, 0)) as totalEstimate, sum(if(status != 'cancel', consumed, 0)) as totalConsumed, sum(if(status != 'cancel', `left`, 0)) as totalLeft")->from(TABLE_TASK)
|
||||
->where('project')->in($projectIDList)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->andWhere('parent')->eq(0)
|
||||
->groupBy('project')
|
||||
->fetchAll('project');
|
||||
|
||||
foreach($tasks as $projectID => $task)
|
||||
{
|
||||
foreach($task as $key => $value)
|
||||
{
|
||||
if($key == 'project') continue;
|
||||
$projects[$projectID]->$key = $value;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get stories. */
|
||||
$stories = $this->dao->select("t1.project, count(t2.status) as totalStories, count(t2.status != 'closed' or null) as unclosedStories, count(t2.stage = 'released' or null) as releasedStories")->from(TABLE_PROJECTSTORY)->alias('t1')
|
||||
->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id')
|
||||
->where('t1.project')->in($projectIDList)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->groupBy('project')
|
||||
->fetchAll('project');
|
||||
|
||||
foreach($stories as $projectID => $story)
|
||||
{
|
||||
foreach($story as $key => $value)
|
||||
{
|
||||
if($key == 'project') continue;
|
||||
$projects[$projectID]->$key = $value;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get bugs. */
|
||||
$bugs = $this->dao->select("project, status, count(status) as totalBugs, count(status = 'active' or null) as activeBugs, count(resolvedDate like '{$yesterday}%' or null) as yesterdayResolved")->from(TABLE_BUG)
|
||||
->where('project')->in($projectIDList)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->groupBy('project')
|
||||
->fetchAll('project');
|
||||
|
||||
foreach($bugs as $projectID => $bug)
|
||||
{
|
||||
foreach($bug as $key => $value)
|
||||
{
|
||||
if($key == 'project') continue;
|
||||
$projects[$projectID]->$key = $value;
|
||||
}
|
||||
}
|
||||
|
||||
foreach($projects as $project)
|
||||
{
|
||||
if(!isset($projects[$project->id]->totalTasks))
|
||||
{
|
||||
$projects[$project->id]->totalTasks = 0;
|
||||
$projects[$project->id]->undoneTasks = 0;
|
||||
$projects[$project->id]->yesterdayFinished = 0;
|
||||
$projects[$project->id]->totalEstimate = 0;
|
||||
$projects[$project->id]->totalConsumed = 0;
|
||||
$projects[$project->id]->totalLeft = 0;
|
||||
}
|
||||
if(!isset($projects[$project->id]->totalBugs))
|
||||
{
|
||||
$projects[$project->id]->totalBugs = 0;
|
||||
$projects[$project->id]->activeBugs = 0;
|
||||
$projects[$project->id]->yesterdayResolved = 0;
|
||||
}
|
||||
if(!isset($projects[$project->id]->totalStories))
|
||||
{
|
||||
$projects[$project->id]->totalStories = 0;
|
||||
$projects[$project->id]->unclosedStories = 0;
|
||||
$projects[$project->id]->releasedStories = 0;
|
||||
}
|
||||
|
||||
$projects[$project->id]->progress = ($project->totalConsumed || $project->totalLeft) ? round($project->totalConsumed / ($project->totalConsumed + $project->totalLeft), 2) * 100 : 0;
|
||||
$projects[$project->id]->taskProgress = $project->totalTasks ? round(($project->totalTasks - $project->undoneTasks) / $project->totalTasks, 2) * 100 : 0;
|
||||
$projects[$project->id]->storyProgress = $project->totalStories ? round(($project->totalStories - $project->unclosedStories) / $project->totalStories, 2) * 100 : 0;
|
||||
$projects[$project->id]->bugProgress = $project->totalBugs ? round(($project->totalBugs - $project->activeBugs) / $project->totalBugs, 2) * 100 : 0;
|
||||
}
|
||||
|
||||
$this->app->loadLang('task');
|
||||
$this->app->loadLang('story');
|
||||
$this->app->loadLang('bug');
|
||||
|
||||
$this->view->projects = $projects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print overview block.
|
||||
*
|
||||
|
||||
@@ -266,6 +266,12 @@ $lang->block->orderByList->product['id_desc'] = 'ID Descending';
|
||||
$lang->block->orderByList->product['status_asc'] = 'Status Ascending';
|
||||
$lang->block->orderByList->product['status_desc'] = 'Status Descending';
|
||||
|
||||
$lang->block->orderByList->project = array();
|
||||
$lang->block->orderByList->project['id_asc'] = 'ID Ascending';
|
||||
$lang->block->orderByList->project['id_desc'] = 'ID Descending';
|
||||
$lang->block->orderByList->project['status_asc'] = 'Status Ascending';
|
||||
$lang->block->orderByList->project['status_desc'] = 'Status Descending';
|
||||
|
||||
$lang->block->orderByList->task = array();
|
||||
$lang->block->orderByList->task['id_asc'] = 'ID Ascending';
|
||||
$lang->block->orderByList->task['id_desc'] = 'ID Descending';
|
||||
|
||||
@@ -266,6 +266,12 @@ $lang->block->orderByList->product['id_desc'] = 'ID 递减';
|
||||
$lang->block->orderByList->product['status_asc'] = '状态正序';
|
||||
$lang->block->orderByList->product['status_desc'] = '状态倒序';
|
||||
|
||||
$lang->block->orderByList->project = array();
|
||||
$lang->block->orderByList->project['id_asc'] = 'ID 递增';
|
||||
$lang->block->orderByList->project['id_desc'] = 'ID 递减';
|
||||
$lang->block->orderByList->project['status_asc'] = '状态正序';
|
||||
$lang->block->orderByList->project['status_desc'] = '状态倒序';
|
||||
|
||||
$lang->block->orderByList->task = array();
|
||||
$lang->block->orderByList->task['id_asc'] = 'ID 递增';
|
||||
$lang->block->orderByList->task['id_desc'] = 'ID 递减';
|
||||
|
||||
+39
-2
@@ -394,12 +394,28 @@ class blockModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* Get product statistic params.
|
||||
* Get statistic params.
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getStatisticParams()
|
||||
public function getStatisticParams($module = 'product')
|
||||
{
|
||||
if($module == 'product') return $this->getProductStatisticParams($module);
|
||||
if($module == 'project') return $this->getProjectStatisticParams($module);
|
||||
|
||||
$params = new stdclass();
|
||||
$params = $this->onlyNumParams($params);
|
||||
return json_encode($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get product statistic params.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getProductStatisticParams()
|
||||
{
|
||||
$params = new stdclass();
|
||||
$params->type['name'] = $this->lang->block->type;
|
||||
@@ -414,6 +430,27 @@ class blockModel extends model
|
||||
return json_encode($this->onlyNumParams($params));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get project statistic params.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getProjectStatisticParams()
|
||||
{
|
||||
$params = new stdclass();
|
||||
$params->type['name'] = $this->lang->block->type;
|
||||
$params->type['options'] = $this->lang->block->typeList->project;
|
||||
$params->type['control'] = 'select';
|
||||
|
||||
$params->orderBy['name'] = $this->lang->block->orderBy;
|
||||
$params->orderBy['default'] = 'id_desc';
|
||||
$params->orderBy['options'] = $this->lang->block->orderByList->project;
|
||||
$params->orderBy['control'] = 'select';
|
||||
|
||||
return json_encode($this->onlyNumParams($params));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get product overview pararms.
|
||||
*
|
||||
|
||||
@@ -0,0 +1,164 @@
|
||||
<?php
|
||||
/**
|
||||
* The report block view file of block module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2018 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Gang Liu <liugang@cnezsoft.com>
|
||||
* @package block
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<style>
|
||||
.types-line {display: table; padding: 0; margin: 0 auto;}
|
||||
.types-line > li {display: table-cell;}
|
||||
.types-line > li > div {position: relative; padding: 18px 5px 5px; text-align: center;}
|
||||
.types-line > li > div:before {content: ''; display: block; background: #eee; width: 100%; height: 2px; position: absolute; left: 50%; top: 4px;}
|
||||
.types-line > li:last-child > div:before {display: none;}
|
||||
.types-line > li > div:after {content: ''; display: block; background: #FFFFFF; box-shadow: 0 2px 4px 0 rgba(170,170,170,0.50), 0 0 5px 0 rgba(0,0,0,0.1); width: 10px; height: 10px; position: absolute; border-radius: 50%; top: 0; left: 50%; margin-left: -2px;}
|
||||
.types-line > li > div > small {display: block; color: #A6AAB8;}
|
||||
.types-line > li > div > span {display: block; color: #CBD0DB; font-size: 16px;}
|
||||
.product-info {position: relative; padding: 10px 10px 10px 200px;}
|
||||
.product-info + .product-info {margin-top: 10px;}
|
||||
.product-info .progress {position: absolute; left: 10px; top: 35px; width: 180px;}
|
||||
.product-info .progress-info {position: absolute; left: 8px; top: 10px; width: 180px; font-size: 12px;}
|
||||
.product-info .type-info {color: #A6AAB8; text-align: center;}
|
||||
.product-info .type-label {font-size: 12px;}
|
||||
.product-info .type-value {font-size: 14px;}
|
||||
.product-info .type-value > strong {font-size: 20px; color: #3C4353;}
|
||||
.product-info .actions {position: absolute; left: 10px; top: 14px;}
|
||||
.block-statistic .tile {margin-bottom: 30px;}
|
||||
.block-statistic .tile-title {font-size: 18px; color: #A6AAB8;}
|
||||
.block-statistic .tile-amount {font-size: 48px; margin-bottom: 10px;}
|
||||
.block-statistic .col-nav {border-left: 1px solid #EBF2FB; width: 260px; padding-left: 0;}
|
||||
.block-statistic .nav-secondary > li > a {font-size: 16px; color: #838A9D; position: relative; box-shadow: none; padding-left: 20px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; transition: all .2s;}
|
||||
.block-statistic .nav-secondary > li.active > a {font-size: 20px; color: #3C4353; background: transparent; box-shadow: none;}
|
||||
.block-statistic .nav-secondary > li.active > a:hover,
|
||||
.block-statistic .nav-secondary > li.active > a:focus,
|
||||
.block-statistic .nav-secondary > li > a:hover {box-shadow: none;}
|
||||
.block-statistic .nav-secondary > li.active > a:before {content: ' '; display: block; left: -1px; top: 10px; bottom: 10px; width: 4px; background: #006af1; position: absolute;}
|
||||
</style>
|
||||
<div class="panel-body">
|
||||
<div class="table-row">
|
||||
<div class="col tab-content">
|
||||
<?php foreach($products as $product):?>
|
||||
<div class="tab-pane fade <?php if($product == reset($products)) echo 'active';?> in" id="tab<?php echo $product->code;?>">
|
||||
<div class="table-row">
|
||||
<div class="col-6 text-middle">
|
||||
<div class="tile">
|
||||
<div class="tile-title"><?php echo $lang->story->total;?></div>
|
||||
<?php if($product->stories):?>
|
||||
<div class="tile-amount"><?php echo array_sum($product->stories);?></div>
|
||||
<?php common::printLink('product', 'browse', "productID={$product->id}", $lang->story->viewAll . '<span class="label label-badge label-icon"><i class="icon icon-arrow-right"></i></span>', '', 'class="btn btn-primary btn-circle btn-icon-right btn-sm"');?>
|
||||
<?php else:?>
|
||||
<div class="tile-amount">0</div>
|
||||
<?php common::printLink('story', 'create', "productID={$product->id}", '<span class="label label-badge label-icon"><i class="icon icon-plus"></i></span>' . $lang->story->create, '', 'class="btn btn-primary btn-circle btn-icon-left btn-sm"');?>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<ul class="types-line">
|
||||
<?php foreach($config->statistic->storyStages as $stage):?>
|
||||
<li>
|
||||
<div>
|
||||
<small><?php echo zget($lang->story->stageList, $stage);?></small>
|
||||
<span><?php echo $product->stories ? zget($product->stories, $stage, 0) : 0;?></span>
|
||||
</div>
|
||||
</li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php if($product->stories):?>
|
||||
<div class="col-6">
|
||||
<div class="product-info">
|
||||
<?php $totalPlan = $product->plans ? array_sum($product->plans) : 0;?>
|
||||
<?php $unexpiredPlan = $product->plans ? zget($product->plans, 'unexpired', 0) : 0;?>
|
||||
<?php $unexpiredRate = $totalPlan ? round($unexpiredPlan / $totalPlan * 100, 2) : 0;?>
|
||||
<?php if($totalPlan):?>
|
||||
<div class="progress-info"></div>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $unexpiredRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $unexpiredRate;?>%"></div>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<div class="actions">
|
||||
<?php common::printLink('productplan', 'create', "productID={$product->id}", "<i class='icon icon-plus'></i>" . $lang->productplan->create, '', "class='btn btn-info'");?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->story->planAB;?></span> / <span><?php echo $lang->productplan->featureBar['browse']['unexpired'];?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<small><?php echo $totalPlan;?></small> / <strong><?php echo $unexpiredPlan;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="product-info">
|
||||
<?php $totalProject = $product->projects ? array_sum($product->projects) : 0;?>
|
||||
<?php $doingProject = $product->projects ? zget($product->projects, 'doing', 0) : 0;?>
|
||||
<?php $delayProject = $product->projects ? zget($product->projects, 'delay', 0) : 0;?>
|
||||
<?php $doingRate = $totalProject ? round($doingProject / $totalProject * 100, 2) : 0;?>
|
||||
<?php if($totalProject):?>
|
||||
<div class="progress-info">
|
||||
<?php if($delayProject):?>
|
||||
<i class="icon icon-exclamation-sign text-danger icon-sm"></i> <span class="text-muted"><?php echo $lang->project->delayed;?></span> <strong><?php echo $delayProject;?></strong>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $doingRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $doingRate;?>%"></div>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<div class="actions">
|
||||
<?php common::printLink('project', 'create', "productID={$product->id}", "<i class='icon icon-plus'></i>" . $lang->project->create, '', "class='btn btn-info'");?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->projectCommon;?></span> / <span><?php echo $lang->project->statusList['doing'];?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<small><?php echo $totalProject;?></small> / <strong><?php echo $doingProject;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="product-info">
|
||||
<?php $totalRelease = $product->releases ? array_sum($product->releases) : 0;?>
|
||||
<?php $normalRelease = $product->releases ? zget($product->releases, 'normal', 0) : 0;?>
|
||||
<?php $normalRate = $totalRelease ? round($normalRelease / $totalRelease * 100, 2) : 0;?>
|
||||
<?php if($totalRelease):?>
|
||||
<div class="progress-info">
|
||||
<?php if($product->lastRelease):?>
|
||||
<i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->release->yesterday;?></span> <strong><?php echo $product->lastRelease;?></strong>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $normalRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $normalRate;?>%"></div>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<div class="actions">
|
||||
<?php common::printLink('release', 'create', "productID={$product->id}", "<i class='icon icon-plus'></i>" . $lang->release->create, '', "class='btn btn-info'");?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->release->common;?></span> / <span><?php echo $lang->release->statusList['normal'];?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<small><?php echo $totalRelease;?></small> / <strong><?php echo $normalRelease;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
<div class="col col-nav">
|
||||
<ul class="nav nav-stacked nav-secondary">
|
||||
<?php foreach($products as $product):?>
|
||||
<li <?php if($product == reset($products)) echo "class='active'";?>><a href="javascript:;" data-target="#tab<?php echo $product->code;?>" data-toggle="tab" title='<?php echo $product->name;?>'><?php echo $product->name;?></a></li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,121 @@
|
||||
<div class="panel-body">
|
||||
<div class="table-row">
|
||||
<div class="col tab-content">
|
||||
<?php foreach($projects as $project):?>
|
||||
<div class="tab-pane fade<?php if($project == reset($projects)) echo ' active in';?>" id="tab3Content<?php echo $project->id;?>">
|
||||
<div class="table-row">
|
||||
<div class="col-5 text-middle text-center">
|
||||
<div class="progress-pie inline-block space" data-value="<?php echo $project->progress;?>" data-doughnut-size="84">
|
||||
<canvas width="120" height="120"></canvas>
|
||||
<div class="progress-info">
|
||||
<small><?php echo $lang->task->statusList['done'];?></small>
|
||||
<strong><?php echo $project->progress;?><small><?php echo $lang->percent;?></small></strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-row text-center small text-muted with-padding">
|
||||
<div class="col-4 text-bottom">
|
||||
<div><?php echo $lang->project->totalEstimate;?></div>
|
||||
<div><?php echo $project->totalEstimate;?> <span class="muted"><?php echo $lang->task->hour;?></span></div>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<span class="label label-dot label-primary"></span>
|
||||
<div><?php echo $lang->project->totalConsumed;?></div>
|
||||
<div><?php echo $project->totalConsumed;?> <span class="muted"><?php echo $lang->task->hour;?></span></div>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<span class="label label-dot label-pale"></span>
|
||||
<div><?php echo $lang->project->totalLeft;?></div>
|
||||
<div><?php echo $project->totalLeft;?> <span class="muted"><?php echo $lang->task->hour;?></span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-7">
|
||||
<div class="product-info">
|
||||
<div class="progress-info"><i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->task->yesterdayFinished;?></span> <strong><?php echo $project->yesterdayFinished;?></strong></div>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $project->taskProgress;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $project->taskProgress;?>%">
|
||||
</div>
|
||||
</div>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->task->allTasks;?></span> <?php echo DS;?> <span><?php echo $lang->task->noFinished;?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<small><?php echo $project->totalTasks;?></small> <?php echo DS;?> <strong><?php echo $project->undoneTasks;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="product-info">
|
||||
<div class="progress-info"><i class="icon icon-exclamation-sign text-danger icon-sm"></i> <span class="text-muted"><?php echo $lang->story->stageList['released'];?></span> <strong><?php echo $project->releasedStories;?></strong></div>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $project->storyProgress;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $project->storyProgress;?>%"></div>
|
||||
</div>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->story->total;?></span> <?php echo DS;?> <span><?php echo $lang->story->unclosed;?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<small><?php echo $project->totalStories;?></small> <?php echo DS;?> <strong><?php echo $project->unclosedStories;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="product-info">
|
||||
<div class="progress-info"><i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayResolved;?></span> <strong><?php echo $project->yesterdayResolved;?></strong></div>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $project->bugProgress;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $project->bugProgress;?>%">
|
||||
</div>
|
||||
</div>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->bug->allBugs;?></span> <?php echo DS;?> <span><?php echo $lang->bug->unResolved;?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<small><?php echo $project->totalBugs;?></small> <?php echo DS;?> <strong><?php echo $project->activeBugs;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
<div class="col col-nav">
|
||||
<ul class="nav nav-stacked nav-secondary">
|
||||
<?php foreach($projects as $project):?>
|
||||
<li <?php if($project == reset($projects)) echo "class='active'";?>><a href="###" data-target="#tab3Content<?php echo $project->id;?>" data-toggle="tab"><?php echo $project->name;?></a></li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.types-line {display: table; padding: 0; margin: 0 auto;}
|
||||
.types-line > li {display: table-cell;}
|
||||
.types-line > li > div {position: relative; padding: 18px 5px 5px; text-align: center;}
|
||||
.types-line > li > div:before {content: ''; display: block; background: #eee; width: 100%; height: 2px; position: absolute; left: 50%; top: 4px;}
|
||||
.types-line > li:last-child > div:before {display: none;}
|
||||
.types-line > li > div:after {content: ''; display: block; background: #FFFFFF; box-shadow: 0 2px 4px 0 rgba(170,170,170,0.50), 0 0 5px 0 rgba(0,0,0,0.1); width: 10px; height: 10px; position: absolute; border-radius: 50%; top: 0; left: 50%; margin-left: -2px;}
|
||||
.types-line > li > div > small {display: block; color: #A6AAB8;}
|
||||
.types-line > li > div > span {display: block; color: #CBD0DB; font-size: 16px;}
|
||||
.product-info {position: relative; padding: 10px 10px 10px 200px;}
|
||||
.product-info + .product-info {margin-top: 10px;}
|
||||
.product-info .progress {position: absolute; left: 10px; top: 33px; width: 180px;}
|
||||
.product-info .progress-info {position: absolute; left: 8px; top: 8px; width: 180px; font-size: 12px;}
|
||||
.product-info .type-info {color: #A6AAB8; text-align: center;}
|
||||
.product-info .type-label {font-size: 12px;}
|
||||
.product-info .type-value {font-size: 14px;}
|
||||
.product-info .type-value > strong {font-size: 20px; color: #3C4353;}
|
||||
.product-info .actions {position: absolute; left: 10px; top: 14px;}
|
||||
.block-statistic .tile {margin-bottom: 30px;}
|
||||
.block-statistic .tile-title {font-size: 18px; color: #A6AAB8;}
|
||||
.block-statistic .tile-amount {font-size: 48px; margin-bottom: 10px;}
|
||||
.block-statistic .col-nav {border-left: 1px solid #EBF2FB; width: 260px; padding-left: 0;}
|
||||
.block-statistic .nav-secondary > li > a {font-size: 16px; color: #838A9D; position: relative; box-shadow: none; padding-left: 20px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; transition: all .2s;}
|
||||
.block-statistic .nav-secondary > li.active > a {font-size: 20px; color: #3C4353; background: transparent; box-shadow: none;}
|
||||
.block-statistic .nav-secondary > li.active > a:hover,
|
||||
.block-statistic .nav-secondary > li.active > a:focus,
|
||||
.block-statistic .nav-secondary > li > a:hover {box-shadow: none;}
|
||||
.block-statistic .nav-secondary > li.active > a:before {content: ' '; display: block; left: -1px; top: 10px; bottom: 10px; width: 4px; background: #006af1; position: absolute;}
|
||||
.block-statistic .nav-stacked {overflow: auto; max-height: 220px;}
|
||||
</style>
|
||||
@@ -10,155 +10,4 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<style>
|
||||
.types-line {display: table; padding: 0; margin: 0 auto;}
|
||||
.types-line > li {display: table-cell;}
|
||||
.types-line > li > div {position: relative; padding: 18px 5px 5px; text-align: center;}
|
||||
.types-line > li > div:before {content: ''; display: block; background: #eee; width: 100%; height: 2px; position: absolute; left: 50%; top: 4px;}
|
||||
.types-line > li:last-child > div:before {display: none;}
|
||||
.types-line > li > div:after {content: ''; display: block; background: #FFFFFF; box-shadow: 0 2px 4px 0 rgba(170,170,170,0.50), 0 0 5px 0 rgba(0,0,0,0.1); width: 10px; height: 10px; position: absolute; border-radius: 50%; top: 0; left: 50%; margin-left: -2px;}
|
||||
.types-line > li > div > small {display: block; color: #A6AAB8;}
|
||||
.types-line > li > div > span {display: block; color: #CBD0DB; font-size: 16px;}
|
||||
.product-info {position: relative; padding: 10px 10px 10px 200px;}
|
||||
.product-info + .product-info {margin-top: 10px;}
|
||||
.product-info .progress {position: absolute; left: 10px; top: 35px; width: 180px;}
|
||||
.product-info .progress-info {position: absolute; left: 8px; top: 10px; width: 180px; font-size: 12px;}
|
||||
.product-info .type-info {color: #A6AAB8; text-align: center;}
|
||||
.product-info .type-label {font-size: 12px;}
|
||||
.product-info .type-value {font-size: 14px;}
|
||||
.product-info .type-value > strong {font-size: 20px; color: #3C4353;}
|
||||
.product-info .actions {position: absolute; left: 10px; top: 14px;}
|
||||
.block-statistic .tile {margin-bottom: 30px;}
|
||||
.block-statistic .tile-title {font-size: 18px; color: #A6AAB8;}
|
||||
.block-statistic .tile-amount {font-size: 48px; margin-bottom: 10px;}
|
||||
.block-statistic .col-nav {border-left: 1px solid #EBF2FB; width: 260px; padding-left: 0;}
|
||||
.block-statistic .nav-secondary > li > a {font-size: 16px; color: #838A9D; position: relative; box-shadow: none; padding-left: 20px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; transition: all .2s;}
|
||||
.block-statistic .nav-secondary > li.active > a {font-size: 20px; color: #3C4353; background: transparent; box-shadow: none;}
|
||||
.block-statistic .nav-secondary > li.active > a:hover,
|
||||
.block-statistic .nav-secondary > li.active > a:focus,
|
||||
.block-statistic .nav-secondary > li > a:hover {box-shadow: none;}
|
||||
.block-statistic .nav-secondary > li.active > a:before {content: ' '; display: block; left: -1px; top: 10px; bottom: 10px; width: 4px; background: #006af1; position: absolute;}
|
||||
</style>
|
||||
<div class="panel-body">
|
||||
<div class="table-row">
|
||||
<div class="col tab-content">
|
||||
<?php foreach($products as $product):?>
|
||||
<div class="tab-pane fade <?php if($product == reset($products)) echo 'active';?> in" id="tab<?php echo $product->code;?>">
|
||||
<div class="table-row">
|
||||
<div class="col-6 text-middle">
|
||||
<div class="tile">
|
||||
<div class="tile-title"><?php echo $lang->story->total;?></div>
|
||||
<?php if($product->stories):?>
|
||||
<div class="tile-amount"><?php echo array_sum($product->stories);?></div>
|
||||
<?php common::printLink('product', 'browse', "productID={$product->id}", $lang->story->viewAll . '<span class="label label-badge label-icon"><i class="icon icon-arrow-right"></i></span>', '', 'class="btn btn-primary btn-circle btn-icon-right btn-sm"');?>
|
||||
<?php else:?>
|
||||
<div class="tile-amount">0</div>
|
||||
<?php common::printLink('story', 'create', "productID={$product->id}", '<span class="label label-badge label-icon"><i class="icon icon-plus"></i></span>' . $lang->story->create, '', 'class="btn btn-primary btn-circle btn-icon-left btn-sm"');?>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<ul class="types-line">
|
||||
<?php foreach($config->statistic->storyStages as $stage):?>
|
||||
<li>
|
||||
<div>
|
||||
<small><?php echo zget($lang->story->stageList, $stage);?></small>
|
||||
<span><?php echo $product->stories ? zget($product->stories, $stage, 0) : 0;?></span>
|
||||
</div>
|
||||
</li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php if($product->stories):?>
|
||||
<div class="col-6">
|
||||
<div class="product-info">
|
||||
<?php $totalPlan = $product->plans ? array_sum($product->plans) : 0;?>
|
||||
<?php $unexpiredPlan = $product->plans ? zget($product->plans, 'unexpired', 0) : 0;?>
|
||||
<?php $unexpiredRate = $totalPlan ? round($unexpiredPlan / $totalPlan * 100, 2) : 0;?>
|
||||
<?php if($totalPlan):?>
|
||||
<div class="progress-info"></div>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $unexpiredRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $unexpiredRate;?>%"></div>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<div class="actions">
|
||||
<?php common::printLink('productplan', 'create', "productID={$product->id}", "<i class='icon icon-plus'></i>" . $lang->productplan->create, '', "class='btn btn-info'");?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->story->planAB;?></span> / <span><?php echo $lang->productplan->featureBar['browse']['unexpired'];?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<small><?php echo $totalPlan;?></small> / <strong><?php echo $unexpiredPlan;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="product-info">
|
||||
<?php $totalProject = $product->projects ? array_sum($product->projects) : 0;?>
|
||||
<?php $doingProject = $product->projects ? zget($product->projects, 'doing', 0) : 0;?>
|
||||
<?php $delayProject = $product->projects ? zget($product->projects, 'delay', 0) : 0;?>
|
||||
<?php $doingRate = $totalProject ? round($doingProject / $totalProject * 100, 2) : 0;?>
|
||||
<?php if($totalProject):?>
|
||||
<div class="progress-info">
|
||||
<?php if($delayProject):?>
|
||||
<i class="icon icon-exclamation-sign text-danger icon-sm"></i> <span class="text-muted"><?php echo $lang->project->delayed;?></span> <strong><?php echo $delayProject;?></strong>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $doingRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $doingRate;?>%"></div>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<div class="actions">
|
||||
<?php common::printLink('project', 'create', "productID={$product->id}", "<i class='icon icon-plus'></i>" . $lang->project->create, '', "class='btn btn-info'");?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->projectCommon;?></span> / <span><?php echo $lang->project->statusList['doing'];?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<small><?php echo $totalProject;?></small> / <strong><?php echo $doingProject;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="product-info">
|
||||
<?php $totalRelease = $product->releases ? array_sum($product->releases) : 0;?>
|
||||
<?php $normalRelease = $product->releases ? zget($product->releases, 'normal', 0) : 0;?>
|
||||
<?php $normalRate = $totalRelease ? round($normalRelease / $totalRelease * 100, 2) : 0;?>
|
||||
<?php if($totalRelease):?>
|
||||
<div class="progress-info">
|
||||
<?php if($product->lastRelease):?>
|
||||
<i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->release->yesterday;?></span> <strong><?php echo $product->lastRelease;?></strong>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $normalRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $normalRate;?>%"></div>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<div class="actions">
|
||||
<?php common::printLink('release', 'create', "productID={$product->id}", "<i class='icon icon-plus'></i>" . $lang->release->create, '', "class='btn btn-info'");?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->release->common;?></span> / <span><?php echo $lang->release->statusList['normal'];?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<small><?php echo $totalRelease;?></small> / <strong><?php echo $normalRelease;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
<div class="col col-nav">
|
||||
<ul class="nav nav-stacked nav-secondary">
|
||||
<?php foreach($products as $product):?>
|
||||
<li <?php if($product == reset($products)) echo "class='active'";?>><a href="javascript:;" data-target="#tab<?php echo $product->code;?>" data-toggle="tab" title='<?php echo $product->name;?>'><?php echo $product->name;?></a></li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php include "./{$module}statisticblock.html.php";?>
|
||||
|
||||
+18
-17
@@ -103,23 +103,24 @@ $lang->bug->copy = '复制Bug';
|
||||
$lang->bug->search = '搜索';
|
||||
|
||||
/* 查询条件列表。*/
|
||||
$lang->bug->assignToMe = '指派给我';
|
||||
$lang->bug->openedByMe = '由我创建';
|
||||
$lang->bug->resolvedByMe = '由我解决';
|
||||
$lang->bug->closedByMe = '由我关闭';
|
||||
$lang->bug->assignToNull = '未指派';
|
||||
$lang->bug->unResolved = '未解决';
|
||||
$lang->bug->toClosed = '待关闭';
|
||||
$lang->bug->unclosed = '未关闭';
|
||||
$lang->bug->unconfirmed = '未确认';
|
||||
$lang->bug->longLifeBugs = '久未处理';
|
||||
$lang->bug->postponedBugs = '被延期';
|
||||
$lang->bug->overdueBugs = '过期Bug';
|
||||
$lang->bug->allBugs = '所有Bug';
|
||||
$lang->bug->byQuery = '搜索';
|
||||
$lang->bug->needConfirm = '需求变动';
|
||||
$lang->bug->allProduct = '所有' . $lang->productCommon;
|
||||
$lang->bug->my = '我的';
|
||||
$lang->bug->assignToMe = '指派给我';
|
||||
$lang->bug->openedByMe = '由我创建';
|
||||
$lang->bug->resolvedByMe = '由我解决';
|
||||
$lang->bug->closedByMe = '由我关闭';
|
||||
$lang->bug->assignToNull = '未指派';
|
||||
$lang->bug->unResolved = '未解决';
|
||||
$lang->bug->toClosed = '待关闭';
|
||||
$lang->bug->unclosed = '未关闭';
|
||||
$lang->bug->unconfirmed = '未确认';
|
||||
$lang->bug->longLifeBugs = '久未处理';
|
||||
$lang->bug->postponedBugs = '被延期';
|
||||
$lang->bug->overdueBugs = '过期Bug';
|
||||
$lang->bug->allBugs = '所有';
|
||||
$lang->bug->byQuery = '搜索';
|
||||
$lang->bug->needConfirm = '需求变动';
|
||||
$lang->bug->allProduct = '所有' . $lang->productCommon;
|
||||
$lang->bug->my = '我的';
|
||||
$lang->bug->yesterdayResolved = '昨天解决';
|
||||
|
||||
$lang->bug->assignToMeAB = '指派给我';
|
||||
$lang->bug->openedByMeAB = '由我创建';
|
||||
|
||||
@@ -17,6 +17,7 @@ $lang->at = ' 于 ';
|
||||
$lang->downArrow = '↓';
|
||||
$lang->null = '空';
|
||||
$lang->ellipsis = '…';
|
||||
$lang->percent = '%';
|
||||
|
||||
$lang->zentaoPMS = '禅道';
|
||||
$lang->welcome = "%s项目管理系统";
|
||||
@@ -241,7 +242,7 @@ $lang->project->subMenu->list->groupTask = '分组视图|project|groupTask|proje
|
||||
$lang->project->subMenu->qa = new stdclass();
|
||||
$lang->project->subMenu->qa->bug = 'Bug|project|bug|projectID=%s';
|
||||
$lang->project->subMenu->qa->build = '版本|project|build|projectID=%s';
|
||||
$lang->project->subMenu->qa->testtask = '测试单|project|testtask|projectID=%s';
|
||||
$lang->project->subMenu->qa->testtask = array('link' => '测试单|project|testtask|projectID=%s', 'subModule' => 'testreport');
|
||||
|
||||
$lang->project->subMenu->action = new stdclass();
|
||||
$lang->project->subMenu->action->dynamic = '动态|project|dynamic|projectID=%s';
|
||||
|
||||
@@ -235,7 +235,6 @@ class company extends control
|
||||
$this->view->pager = $pager;
|
||||
$this->view->param = $param;
|
||||
$this->view->dateGroups = $this->action->buildDateGroup($actions, $direction);
|
||||
$this->view->allCount = $this->action->getCount('all');
|
||||
$this->view->direction = $direction;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -13,15 +13,18 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
echo html::a(inlink('dynamic', "browseType=all"), "<span class='text'>{$lang->action->dynamic->all}<span> <span class='label label-light label-badge'>{$allCount}</span>", '', "class='btn btn-link " . ($browseType == 'all' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "browseType=today"), "<span class='text'>{$lang->action->dynamic->today}<span>", '', "class='btn btn-link " . ($browseType == 'today' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "browseType=yesterday"), "<span class='text'>{$lang->action->dynamic->yesterday}<span>", '', "class='btn btn-link " . ($browseType == 'yesterday' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "browseType=thisweek"), "<span class='text'>{$lang->action->dynamic->thisWeek}<span>", '', "class='btn btn-link " . ($browseType == 'thisweek' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "browseType=lastweek"), "<span class='text'>{$lang->action->dynamic->lastWeek}<span>", '', "class='btn btn-link " . ($browseType == 'lastweek' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "browseType=thismonth"), "<span class='text'>{$lang->action->dynamic->thisMonth}<span>", '', "class='btn btn-link " . ($browseType == 'thismonth' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "browseType=lastmonth"), "<span class='text'>{$lang->action->dynamic->lastMonth}<span>", '', "class='btn btn-link " . ($browseType == 'lastmonth' ? 'btn-active-text' : '') . "'");
|
||||
<?php foreach($lang->action->periods as $period => $label):?>
|
||||
<?php
|
||||
$label = "<span class='text'>$label</span>";
|
||||
$active = '';
|
||||
if($period == $browseType)
|
||||
{
|
||||
$active = 'btn-active-text';
|
||||
$label .= " <span class='label label-light label-badge'>{$pager->recTotal}</span>";
|
||||
}
|
||||
echo html::a(inlink('dynamic', "browseType=$period"), $label, '', "class='btn btn-link $active' id='{$period}'")
|
||||
?>
|
||||
<?php endforeach;?>
|
||||
<div class="input-control space w-150px"><?php echo html::select('account', $users, $account, 'onchange=changeUser(this.value) class="form-control chosen"');?></div>
|
||||
<div class="input-control space w-150px"><?php echo html::select('product', $products, $product, 'onchange=changeProduct(this.value) class="form-control chosen"');?></div>
|
||||
<?php if($this->config->global->flow != 'onlyTest'):?>
|
||||
|
||||
@@ -112,79 +112,78 @@ $(document).ready(function()
|
||||
<?php endif;?>
|
||||
});
|
||||
</script>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
<span class='prefix'><?php echo html::icon($lang->icons['export']);?></span>
|
||||
<strong><?php echo $lang->export;?></strong>
|
||||
<div class='main-content'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->export;?></h2>
|
||||
</div>
|
||||
</div>
|
||||
<?php $isCustomExport = (!empty($customExport) and !empty($allExportFields));?>
|
||||
<form class='form-condensed' method='post' target='hiddenwin' style='padding: 40px 1% 50px'>
|
||||
<table class='w-p100 table-fixed'>
|
||||
<tr>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->setFileName;?></span>
|
||||
<?php echo html::input('fileName', '', "class='form-control' autocomplete='off'");?>
|
||||
</div>
|
||||
</td>
|
||||
<td class='w-60px'>
|
||||
<?php echo html::select('fileType', $lang->exportFileTypeList, '', 'onchange=switchEncode(this.value) class="form-control"');?>
|
||||
</td>
|
||||
<td class='w-80px'>
|
||||
<?php echo html::select('encode', $config->charsets[$this->cookie->lang], 'utf-8', key($lang->exportFileTypeList) == 'csv' ? "class='form-control'" : "class='form-control'");?>
|
||||
</td>
|
||||
<td class='w-90px'>
|
||||
<?php echo html::select('exportType', $lang->exportTypeList, 'all', "class='form-control'");?>
|
||||
</td>
|
||||
<?php if($isCustomExport):?>
|
||||
<td class='w-110px' style='overflow:visible'>
|
||||
<span id='tplBox'><?php echo $this->fetch('file', 'buildExportTPL', 'module=' . $this->moduleName);?></span>
|
||||
</td>
|
||||
<?php endif?>
|
||||
<td style='width:<?php echo $isCustomExport ? '130px' : '70px'?>'>
|
||||
<div class='input-group'>
|
||||
<?php echo html::submitButton($lang->export, "onclick='setDownloading();' ");?>
|
||||
<?php if($isCustomExport):?>
|
||||
<button type='button' onclick='setExportTPL()' class='btn'><?php echo $lang->file->setExportTPL?></button>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php if($isCustomExport):?>
|
||||
<?php
|
||||
$allExportFields = explode(',', $allExportFields);
|
||||
$hasDefaultField = isset($selectedFields);
|
||||
$selectedFields = $hasDefaultField ? explode(',', $selectedFields) : array();
|
||||
$exportFieldPairs = array();
|
||||
$moduleName = $this->moduleName;
|
||||
$moduleLang = $lang->$moduleName;
|
||||
foreach($allExportFields as $key => $field)
|
||||
{
|
||||
$field = trim($field);
|
||||
$exportFieldPairs[$field] = isset($moduleLang->$field) ? $moduleLang->$field : (isset($lang->$field) ? $lang->$field : $field);
|
||||
if(!$hasDefaultField)$selectedFields[] = $field;
|
||||
}
|
||||
?>
|
||||
<div class='panel' id='customFields' style='margin-bottom:150px;display:none'>
|
||||
<div class='panel-heading'><strong><?php echo $lang->file->exportFields?></strong></div>
|
||||
<div class='panel-body'>
|
||||
<p><?php echo html::select('exportFields[]', $exportFieldPairs, $selectedFields, "class='form-control chosen' multiple")?></p>
|
||||
<div>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->file->tplTitle;?></span>
|
||||
<?php echo html::input('title', '', "class='form-control' autocomplete='off'")?>
|
||||
<?php if(common::hasPriv('file', 'setPublic')):?>
|
||||
<span class='input-group-addon'><?php echo html::checkbox('public', array(1 => $lang->public));?></span>
|
||||
<?php endif?>
|
||||
<span class='input-group-btn'><button id='saveTpl' type='button' onclick='saveTemplate()' class='btn btn-primary'><?php echo $lang->save?></button></span>
|
||||
<span class='input-group-btn'><button type='button' onclick='deleteTemplate()' class='btn'><?php echo $lang->delete?></button></span>
|
||||
<?php $isCustomExport = (!empty($customExport) and !empty($allExportFields));?>
|
||||
<form method='post' target='hiddenwin' style='padding: 40px 1% 50px'>
|
||||
<table class='w-p100 table-fixed'>
|
||||
<tr>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->setFileName;?></span>
|
||||
<?php echo html::input('fileName', '', "class='form-control' autocomplete='off'");?>
|
||||
</div>
|
||||
</td>
|
||||
<td class='w-80px'>
|
||||
<?php echo html::select('fileType', $lang->exportFileTypeList, '', 'onchange=switchEncode(this.value) class="form-control"');?>
|
||||
</td>
|
||||
<td class='w-90px'>
|
||||
<?php echo html::select('encode', $config->charsets[$this->cookie->lang], 'utf-8', key($lang->exportFileTypeList) == 'csv' ? "class='form-control'" : "class='form-control'");?>
|
||||
</td>
|
||||
<td class='w-110px'>
|
||||
<?php echo html::select('exportType', $lang->exportTypeList, 'all', "class='form-control'");?>
|
||||
</td>
|
||||
<?php if($isCustomExport):?>
|
||||
<td class='w-110px' style='overflow:visible'>
|
||||
<span id='tplBox'><?php echo $this->fetch('file', 'buildExportTPL', 'module=' . $this->moduleName);?></span>
|
||||
</td>
|
||||
<?php endif?>
|
||||
<td style='width:<?php echo $isCustomExport ? '130px' : '70px'?>'>
|
||||
<div class='input-group'>
|
||||
<?php echo html::submitButton($lang->export, "onclick='setDownloading();' ");?>
|
||||
<?php if($isCustomExport):?>
|
||||
<button type='button' onclick='setExportTPL()' class='btn'><?php echo $lang->file->setExportTPL?></button>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php if($isCustomExport):?>
|
||||
<?php
|
||||
$allExportFields = explode(',', $allExportFields);
|
||||
$hasDefaultField = isset($selectedFields);
|
||||
$selectedFields = $hasDefaultField ? explode(',', $selectedFields) : array();
|
||||
$exportFieldPairs = array();
|
||||
$moduleName = $this->moduleName;
|
||||
$moduleLang = $lang->$moduleName;
|
||||
foreach($allExportFields as $key => $field)
|
||||
{
|
||||
$field = trim($field);
|
||||
$exportFieldPairs[$field] = isset($moduleLang->$field) ? $moduleLang->$field : (isset($lang->$field) ? $lang->$field : $field);
|
||||
if(!$hasDefaultField)$selectedFields[] = $field;
|
||||
}
|
||||
?>
|
||||
<div class='panel' id='customFields' style='margin-bottom:150px;display:none'>
|
||||
<div class='panel-heading'><strong><?php echo $lang->file->exportFields?></strong></div>
|
||||
<div class='panel-body'>
|
||||
<p><?php echo html::select('exportFields[]', $exportFieldPairs, $selectedFields, "class='form-control chosen' multiple")?></p>
|
||||
<div>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->file->tplTitle;?></span>
|
||||
<?php echo html::input('title', '', "class='form-control' autocomplete='off'")?>
|
||||
<?php if(common::hasPriv('file', 'setPublic')):?>
|
||||
<span class='input-group-addon'><?php echo html::checkbox('public', array(1 => $lang->public));?></span>
|
||||
<?php endif?>
|
||||
<span class='input-group-btn'><button id='saveTpl' type='button' onclick='saveTemplate()' class='btn btn-primary'><?php echo $lang->save?></button></span>
|
||||
<span class='input-group-btn'><button type='button' onclick='deleteTemplate()' class='btn'><?php echo $lang->delete?></button></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php js::set('defaultExportFields', join(',', $selectedFields));?>
|
||||
<?php endif?>
|
||||
</form>
|
||||
<?php js::set('defaultExportFields', join(',', $selectedFields));?>
|
||||
<?php endif?>
|
||||
</form>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.lite.html.php';?>
|
||||
|
||||
@@ -104,7 +104,6 @@ class my extends control
|
||||
|
||||
/* Assign. */
|
||||
$this->view->todos = $this->loadModel('todo')->getList($type, $account, $status, 0, $pager, $sort);
|
||||
$this->view->todoCount = $this->todo->getCount();
|
||||
$this->view->date = (int)$type == 0 ? date(DT_DATE1) : date(DT_DATE1, strtotime($type));
|
||||
$this->view->type = $type;
|
||||
$this->view->recTotal = $recTotal;
|
||||
@@ -568,7 +567,6 @@ class my extends control
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->pager = $pager;
|
||||
$this->view->dateGroups = $this->action->buildDateGroup($actions, $direction);
|
||||
$this->view->allCount = $this->action->getCount();
|
||||
$this->view->direction = $direction;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -13,15 +13,18 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php foreach($lang->action->periods as $period => $label):?>
|
||||
<?php
|
||||
echo html::a(inlink('dynamic', "type=all"), "<span class='text'>{$lang->action->dynamic->all}</span> <span class='label label-light label-badge'>{$allCount}</span>", '', "class='btn btn-link " . ($type == 'all' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "type=today"), "<span class='text'>{$lang->action->dynamic->today}</span>", '', "class='btn btn-link " . ($type == 'today' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "type=yesterday"), "<span class='text'>{$lang->action->dynamic->yesterday}</span>", '', "class='btn btn-link " . ($type == 'yesterday' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "type=thisweek"), "<span class='text'>{$lang->action->dynamic->thisWeek}</span>", '', "class='btn btn-link " . ($type == 'thisweek' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "type=lastweek"), "<span class='text'>{$lang->action->dynamic->lastWeek}</span>", '', "class='btn btn-link " . ($type == 'lastweek' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "type=thismonth"), "<span class='text'>{$lang->action->dynamic->thisMonth}</span>", '', "class='btn btn-link " . ($type == 'thismonth' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "type=lastmonth"), "<span class='text'>{$lang->action->dynamic->lastMonth}</span>", '', "class='btn btn-link " . ($type == 'lastmonth' ? 'btn-active-text' : '') . "'");
|
||||
$label = "<span class='text'>$label</span>";
|
||||
$active = '';
|
||||
if($period == $type)
|
||||
{
|
||||
$active = 'btn-active-text';
|
||||
$label .= " <span class='label label-light label-badge'>{$pager->recTotal}</span>";
|
||||
}
|
||||
echo html::a(inlink('dynamic', "type=$period"), $label, '', "class='btn btn-link $active' id='{$period}'")
|
||||
?>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
</div>
|
||||
<div id="mainContent" class="main-content">
|
||||
|
||||
@@ -19,8 +19,13 @@
|
||||
<?php
|
||||
$vars = "date=$period";
|
||||
if($period == 'before') $vars .= "&account={$app->user->account}&status=undone";
|
||||
$label = $period == 'all' ? "<span class='text'>$label</span> <span class='label label-light label-badge'>{$todoCount}</span>" : "<span class='text'>$label</span>";
|
||||
$active = $period == $type ? 'btn-active-text' : '';
|
||||
$label = "<span class='text'>$label</span>";
|
||||
$active = '';
|
||||
if($period == $type)
|
||||
{
|
||||
$active = 'btn-active-text';
|
||||
$label .= " <span class='label label-light label-badge'>{$pager->recTotal}</span>";
|
||||
}
|
||||
echo html::a(inlink('todo', $vars), $label, '', "class='btn btn-link $active' id='{$period}'")
|
||||
?>
|
||||
<?php endforeach;?>
|
||||
|
||||
@@ -204,7 +204,6 @@ class product extends control
|
||||
$this->view->storyCases = $storyCases;
|
||||
$this->view->param = $param;
|
||||
$this->view->products = $this->products;
|
||||
$this->view->allCount = $this->story->getCount($productID);
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -516,7 +515,6 @@ class product extends control
|
||||
$this->view->param = $param;
|
||||
$this->view->pager = $pager;
|
||||
$this->view->dateGroups = $this->action->buildDateGroup($actions, $direction);
|
||||
$this->view->allCount = $this->action->getCount('product', $productID);
|
||||
$this->view->direction = $direction;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
echo '</ul></div>';
|
||||
?>
|
||||
<?php else:?>
|
||||
<?php echo html::a($this->inlink('browse', "productID=$productID&branch=$branch&browseType=$menuBrowseType" . $queryParam), "<span class='text'>$menuItem->text</span>" . ($menuItem->name == 'allstory' ? ' <span class="label label-light label-badge">' . $allCount . '</span>' : ''), '', "id='{$menuItem->name}Tab' class='btn btn-link" . ($this->session->storyBrowseType == $menuItem->name ? ' btn-active-text' : '') . "'");?>
|
||||
<?php echo html::a($this->inlink('browse', "productID=$productID&branch=$branch&browseType=$menuBrowseType" . $queryParam), "<span class='text'>$menuItem->text</span>" . ($menuItem->name == $this->session->storyBrowseType ? ' <span class="label label-light label-badge">' . $pager->recTotal . '</span>' : ''), '', "id='{$menuItem->name}Tab' class='btn btn-link" . ($this->session->storyBrowseType == $menuItem->name ? ' btn-active-text' : '') . "'");?>
|
||||
<?php endif;?>
|
||||
<?php endforeach;?>
|
||||
<a class="btn btn-link querybox-toggle" id='bysearchTab'><i class="icon icon-search muted"></i> <?php echo $lang->product->searchStory;?></a>
|
||||
|
||||
@@ -13,15 +13,18 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php foreach($lang->action->periods as $period => $label):?>
|
||||
<?php
|
||||
echo html::a(inlink('dynamic', "productID=$productID&type=all"), "<span class='text'>{$lang->action->dynamic->all}</span> <span class='label label-light label-badge'>{$allCount}</span>", '', "class='btn btn-link " . ($type == 'all' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "productID=$productID&type=today"), "<span class='text'>{$lang->action->dynamic->today}</span>", '', "class='btn btn-link " . ($type == 'today' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "productID=$productID&type=yesterday"), "<span class='text'>{$lang->action->dynamic->yesterday}</span>", '', "class='btn btn-link " . ($type == 'yesterday' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "productID=$productID&type=thisweek"), "<span class='text'>{$lang->action->dynamic->thisWeek}</span>", '', "class='btn btn-link " . ($type == 'thisweek' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "productID=$productID&type=lastweek"), "<span class='text'>{$lang->action->dynamic->lastWeek}</span>", '', "class='btn btn-link " . ($type == 'lastweek' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "productID=$productID&type=thismonth"), "<span class='text'>{$lang->action->dynamic->thisMonth}</span>", '', "class='btn btn-link " . ($type == 'thismonth' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "productID=$productID&type=lastmonth"), "<span class='text'>{$lang->action->dynamic->lastMonth}</span>", '', "class='btn btn-link " . ($type == 'lastmonth' ? 'btn-active-text' : '') . "'");
|
||||
$label = "<span class='text'>$label</span>";
|
||||
$active = '';
|
||||
if($period == $type)
|
||||
{
|
||||
$active = 'btn-active-text';
|
||||
$label .= " <span class='label label-light label-badge'>{$pager->recTotal}</span>";
|
||||
}
|
||||
echo html::a(inlink('dynamic', "productID=$productID&type=$period"), $label, '', "class='btn btn-link $active' id='{$period}'")
|
||||
?>
|
||||
<?php endforeach;?>
|
||||
<div class="input-control space w-150px">
|
||||
<?php echo html::select('account', $users, $account, "onchange='changeUser(this.value, $productID)' class='form-control chosen'");?>
|
||||
</div>
|
||||
|
||||
@@ -1346,6 +1346,7 @@ class project extends control
|
||||
$this->view->realnames = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->projectID = $projectID;
|
||||
$this->view->browseType = '';
|
||||
$this->view->project = $project;
|
||||
$this->view->type = $type;
|
||||
$this->view->kanbanGroup = $kanbanGroup;
|
||||
@@ -1965,7 +1966,6 @@ class project extends control
|
||||
$this->view->pager = $pager;
|
||||
$this->view->param = $param;
|
||||
$this->view->dateGroups = $this->action->buildDateGroup($actions, $direction);
|
||||
$this->view->allCount = $this->action->getCount('project', $projectID);
|
||||
$this->view->direction = $direction;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
table th.col-closed {width:14%}
|
||||
#kanbanHeader{margin-bottom:0px;}
|
||||
#kanbanHeader th{border: 1px solid #ddd; padding:8px;}
|
||||
#kanbanHeader .dropdown {display: inline-block;}
|
||||
#kanbanHeader .dropdown > a {color: #036}
|
||||
#kanbanHeader th{position: relative}
|
||||
#kanbanHeader .actions {position: absolute; right: 0; top: 0; padding: 0px; background: #f1f1f1; border-left: 1px solid #ccc}
|
||||
#kanbanHeader .actions .btn {display: block; border-radius: 0; width: 34px; height: 36px; position: relative; text-align: center; padding: 5px 0; color: #036}
|
||||
#kanbanHeader .actions .btn-text {display: none}
|
||||
|
||||
#kanbanWrapper {table-layout: fixed; border-top: none}
|
||||
#kanbanWrapper > tbody > tr:first-child > td {border-top: none}
|
||||
|
||||
@@ -127,13 +127,19 @@ class projectModel extends model
|
||||
$replace = "<ul class='dropdown-menu'>";
|
||||
foreach($this->lang->project->subMenu->$key as $subMenuKey => $subMenuLink)
|
||||
{
|
||||
$subModule = '';
|
||||
if(is_array($subMenuLink))
|
||||
{
|
||||
if(isset($subMenuLink['subModule'])) $subModule = $subMenuLink['subModule'];
|
||||
$subMenuLink = $subMenuLink['link'];
|
||||
}
|
||||
list($subMenuName, $subMenuModule, $subMenuMethod, $subMenuParams) = explode('|', $subMenuLink);
|
||||
if(!commonModel::hasPriv($subMenuModule, $subMenuMethod)) continue;
|
||||
|
||||
if(empty($dropTitle)) $dropTitle = $subMenuName;
|
||||
|
||||
$active = '';
|
||||
if($moduleName == $subMenuModule and $methodName == $subMenuMethod)
|
||||
if(($moduleName == $subMenuModule and $methodName == $subMenuMethod) or strpos(",$subModule,", ",$moduleName,") !== false)
|
||||
{
|
||||
$active = "class='active'";
|
||||
$dropTitle = $subMenuName;
|
||||
@@ -145,8 +151,8 @@ class projectModel extends model
|
||||
$replace .= '</ul>';
|
||||
$replace = "<a data-toggle='dropdown'>$dropTitle <span class='caret'></span></a>" . $replace;
|
||||
|
||||
$this->lang->project->menu->$key['class'] = 'dropdown';
|
||||
if($hasActive) $this->lang->project->menu->$key['class'] .= ' active';
|
||||
$this->lang->project->menu->{$key}['class'] = 'dropdown';
|
||||
if($hasActive) $this->lang->project->menu->{$key}['class'] .= ' active';
|
||||
}
|
||||
common::setMenuVars($this->lang->project->menu, $key, $replace);
|
||||
}
|
||||
|
||||
@@ -11,52 +11,48 @@
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.lite.html.php';?>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
<strong><?php echo $lang->project->kanbanSetting;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
<form target='hiddenwin' method='post'>
|
||||
<table class='table'>
|
||||
<?php if(common::hasPriv('project', 'kanbanHideCols')):?>
|
||||
<tr>
|
||||
<th class='text-right'><?php echo $lang->project->kanbanHideCols?></th>
|
||||
<td><?php echo html::radio('allCols', $lang->kanbanSetting->optionList, $allCols)?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<th class='w-180px text-right'><?php echo $lang->project->kanbanShowOption?></th>
|
||||
<td><?php echo html::radio('showOption', $lang->kanbanSetting->optionList, $showOption)?></td>
|
||||
</tr>
|
||||
<?php if(common::hasPriv('project', 'kanbanColsColor')):?>
|
||||
<tr>
|
||||
<th class='text-right'><?php echo $lang->project->kanbanColsColor?></th>
|
||||
<td>
|
||||
<div class='row-table'>
|
||||
<?php foreach($colorList as $status => $color):?>
|
||||
<div class='col-table'>
|
||||
<input type='hidden' id='color<?php echo $status?>' name="colorList[<?php echo $status?>]" data-provide='colorpicker' data-wrapper='input-group-btn' value='<?php echo $color;?>' data-colors='#333,#2B529C,#E48600,#D2323D,#229F24,#777,#D2691E,#008B8B,#2E8B57,#4169E1,#4B0082,#FA8072,#BA55D3,#2E8B57,#6B8E23'>
|
||||
<?php echo $lang->task->statusList[$status];?>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<td colspan='2' class='text-center'>
|
||||
<?php
|
||||
echo html::submitButton();
|
||||
echo html::a(inlink('ajaxResetKanban', "projectID=$projectID"), $lang->project->resetKanban, 'hiddenwin', "class='btn'");
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$('.col-table .colorpicker:last .dropdown-menu').addClass('pull-right');
|
||||
})
|
||||
</script>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='center-block'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->project->kanbanSetting;?></h2>
|
||||
</div>
|
||||
<form target='hiddenwin' method='post'>
|
||||
<table class='table'>
|
||||
<?php if(common::hasPriv('project', 'kanbanHideCols')):?>
|
||||
<tr>
|
||||
<th class='text-right'><?php echo $lang->project->kanbanHideCols?></th>
|
||||
<td><?php echo html::radio('allCols', $lang->kanbanSetting->optionList, $allCols)?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<th class='w-200px text-right'><?php echo $lang->project->kanbanShowOption?></th>
|
||||
<td><?php echo html::radio('showOption', $lang->kanbanSetting->optionList, $showOption)?></td>
|
||||
</tr>
|
||||
<?php if(common::hasPriv('project', 'kanbanColsColor')):?>
|
||||
<tr>
|
||||
<th class='text-right'><?php echo $lang->project->kanbanColsColor?></th>
|
||||
<td>
|
||||
<div class='row'>
|
||||
<?php foreach($colorList as $status => $color):?>
|
||||
<div class='col-sm-2'>
|
||||
<input type='hidden' id='color<?php echo $status?>' name="colorList[<?php echo $status?>]" data-provide='colorpicker' data-wrapper='input-group-btn' value='<?php echo $color;?>' data-colors='#333,#2B529C,#E48600,#D2323D,#229F24,#777,#D2691E,#008B8B,#2E8B57,#4169E1,#4B0082,#FA8072,#BA55D3,#2E8B57,#6B8E23'>
|
||||
<?php echo $lang->task->statusList[$status];?>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<td colspan='2' class='text-center'>
|
||||
<?php
|
||||
echo html::submitButton();
|
||||
echo html::a(inlink('ajaxResetKanban', "projectID=$projectID"), $lang->project->resetKanban, 'hiddenwin', "class='btn'");
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.lite.html.php';?>
|
||||
|
||||
@@ -13,15 +13,18 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
echo html::a(inlink('dynamic', "projectID=$projectID&type=all"), "<span class='text'>{$lang->action->dynamic->all}</span> <span class='label label-light label-badge'>{$allCount}</span>", '', "class='btn btn-link " . ($type == 'all' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "projectID=$projectID&type=today"), "<span class='text'>{$lang->action->dynamic->today}</span>", '', "class='btn btn-link " . ($type == 'today' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "projectID=$projectID&type=yesterday"), "<span class='text'>{$lang->action->dynamic->yesterday}</span>", '', "class='btn btn-link " . ($type == 'yesterday' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "projectID=$projectID&type=thisweek"), "<span class='text'>{$lang->action->dynamic->thisWeek}</span>", '', "class='btn btn-link " . ($type == 'thisweek' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "projectID=$projectID&type=lastweek"), "<span class='text'>{$lang->action->dynamic->lastWeek}</span>", '', "class='btn btn-link " . ($type == 'lastweek' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "projectID=$projectID&type=thismonth"), "<span class='text'>{$lang->action->dynamic->thisMonth}</span>", '', "class='btn btn-link " . ($type == 'thismonth' ? 'btn-active-text' : '') . "'");
|
||||
echo html::a(inlink('dynamic', "projectID=$projectID&type=lastmonth"), "<span class='text'>{$lang->action->dynamic->lastMonth}</span>", '', "class='btn btn-link " . ($type == 'lastmonth' ? 'btn-active-text' : '') . "'");
|
||||
<?php foreach($lang->action->periods as $period => $label):?>
|
||||
<?php
|
||||
$label = "<span class='text'>$label</span>";
|
||||
$active = '';
|
||||
if($period == $type)
|
||||
{
|
||||
$active = 'btn-active-text';
|
||||
$label .= " <span class='label label-light label-badge'>{$pager->recTotal}</span>";
|
||||
}
|
||||
echo html::a(inlink('dynamic', "projectID=$projectID&type=$period"), $label, '', "class='btn btn-link $active' id='{$period}'")
|
||||
?>
|
||||
<?php endforeach;?>
|
||||
<div class="input-control space w-150px">
|
||||
<?php echo html::select('account', $users, $account, "onchange='changeUser(this.value, $projectID)' class='form-control chosen'");?>
|
||||
</div>
|
||||
|
||||
@@ -9,7 +9,47 @@
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include './taskheader.html.php';?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-right'>
|
||||
<?php echo html::a($this->createLink('project', 'ajaxKanbanSetting', "projectID=$projectID"), "<i class='icon-cog'></i> " . $lang->project->kanbanSetting, '', "class='iframe btn btn-link'");?>
|
||||
<?php if(common::hasPriv('project', 'printKanban')) echo html::a('###', "<i class='icon-print'></i> " . $lang->project->printKanban, '', "class='btn btn-link' id='printKanban' title='{$lang->project->printKanban}'");?>
|
||||
<div class='btn-group'>
|
||||
<button type='button' class='btn btn-link dropdown-toggle' data-toggle='dropdown' id='exportAction'>
|
||||
<i class='icon-download-alt'></i> <?php echo $lang->export ?>
|
||||
<span class='caret'></span>
|
||||
</button>
|
||||
<ul class='dropdown-menu' id='exportActionMenu'>
|
||||
<?php
|
||||
$misc = common::hasPriv('task', 'export') ? "class='export iframe' data-width='700'" : "class=disabled";
|
||||
$link = common::hasPriv('task', 'export') ? $this->createLink('task', 'export', "project=$projectID&orderBy=$orderBy&type=$browseType") : '#';
|
||||
echo "<li>" . html::a($link, $lang->task->export, '', $misc) . "</li>";
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<div class='btn-group'>
|
||||
<button type='button' class='btn btn-link dropdown-toggle' data-toggle='dropdown' id='importAction'>
|
||||
<i class='icon-upload-alt'></i> <?php echo $lang->import ?>
|
||||
<span class='caret'></span>
|
||||
</button>
|
||||
<ul class='dropdown-menu' id='importActionMenu'>
|
||||
<?php
|
||||
$misc = common::hasPriv('project', 'importTask') ? '' : "class=disabled";
|
||||
$link = common::hasPriv('project', 'importTask') ? $this->createLink('project', 'importTask', "project=$project->id") : '#';
|
||||
echo "<li>" . html::a($link, $lang->project->importTask, '', $misc) . "</li>";
|
||||
|
||||
$misc = common::hasPriv('project', 'importBug') ? '' : "class=disabled";
|
||||
$link = common::hasPriv('project', 'importBug') ? $this->createLink('project', 'importBug', "project=$project->id") : '#';
|
||||
echo "<li>" . html::a($link, $lang->project->importBug, '', $misc) . "</li>";
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php
|
||||
$misc = common::hasPriv('task', 'create', $project) ? "class='btn btn-primary'" : "class='btn btn-primary disabled'";
|
||||
$link = common::hasPriv('task', 'create', $project) ? $this->createLink('task', 'create', "project=$projectID" . (isset($moduleID) ? "&storyID=&moduleID=$moduleID" : '')) : '#';
|
||||
echo html::a($link, "<i class='icon icon-plus'></i>" . $lang->task->create, '', $misc);
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
<?php foreach($colorList as $status => $color):?>
|
||||
<?php echo ".board-bug-$status, .board-task-$status {background: " . ($color ? $color : '#000') . ";}\n"?>
|
||||
@@ -20,7 +60,7 @@ $taskCols = array('wait', 'doing', 'pause', 'done');
|
||||
if($allCols) $taskCols = array('wait', 'doing', 'pause', 'done', 'cancel', 'closed');
|
||||
$account = $this->app->user->account
|
||||
?>
|
||||
<div id='kanban'>
|
||||
<div id='kanban' class='main-content'>
|
||||
<table class='boards-layout table' id='kanbanHeader'>
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -53,17 +93,6 @@ $account = $this->app->user->account
|
||||
<th class='col-<?php echo $col?>'><?php echo $lang->task->statusList[$col];?></th>
|
||||
<?php endforeach;?>
|
||||
<th class='col-<?php echo $lastCol?>'><?php echo $lang->task->statusList[$lastCol];?>
|
||||
<div class='actions'>
|
||||
<div class="dropdown">
|
||||
<button type="button" class="btn btn-mini btn-link dropdown-toggle" data-toggle="dropdown">
|
||||
<span class="icon-ellipsis-h"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right">
|
||||
<?php echo '<li>' . html::a($this->createLink('project', 'ajaxKanbanSetting', "projectID=$projectID"), "<i class='icon-cog'></i> " . $lang->project->kanbanSetting, '', "class='iframe'") . '</li>';?>
|
||||
<?php if(common::hasPriv('project', 'printKanban')) echo '<li>' . html::a('###', "<i class='icon-print'></i> " . $lang->project->printKanban, '', "id='printKanban' title='{$lang->project->printKanban}'") . '</li>';?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
@@ -10,19 +10,21 @@
|
||||
?>
|
||||
<?php if($_POST) die(include 'preview.html.php')?>
|
||||
<?php include '../../common/view/header.lite.html.php';?>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
<?php echo html::icon($lang->icons['task']);?> <strong><?php echo $lang->printKanban->common;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
<form target='_blank' method='post'>
|
||||
<table class='table'>
|
||||
<tr>
|
||||
<td align='center' class='text-middle'>
|
||||
<?php echo $lang->printKanban->content . ' : ' . html::radio('content', $lang->printKanban->typeList, 'all')?>
|
||||
<?php echo html::submitButton($lang->printKanban->print)?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='center-block'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->printKanban->common;?></h2>
|
||||
</div>
|
||||
<form target='_blank' method='post'>
|
||||
<table class='table'>
|
||||
<tr>
|
||||
<td class='text-center text-middle'>
|
||||
<?php echo $lang->printKanban->content . ' : ' . html::radio('content', $lang->printKanban->typeList, 'all')?>
|
||||
<?php echo html::submitButton($lang->printKanban->print)?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.lite.html.php';?>
|
||||
|
||||
@@ -95,6 +95,7 @@ $lang->story->files = '附件';
|
||||
$lang->story->copy = "复制需求";
|
||||
$lang->story->total = '总需求';
|
||||
$lang->story->allStories = '所有需求';
|
||||
$lang->story->unclosed = '未关闭';
|
||||
|
||||
$lang->story->ditto = '同上';
|
||||
$lang->story->dittoNotice = '该需求与上一需求不属于同一产品!';
|
||||
|
||||
@@ -2614,16 +2614,4 @@ class storyModel extends model
|
||||
|
||||
return array($toList, $ccList);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get story count.
|
||||
*
|
||||
* @param int $productID
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
public function getCount($productID)
|
||||
{
|
||||
return $this->dao->select('count(*) as count')->from(TABLE_STORY)->where('deleted')->eq(0)->andWhere('product')->eq($productID)->fetch('count');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,11 +114,17 @@
|
||||
break;
|
||||
}
|
||||
}
|
||||
$priList = $lang->story->priList;
|
||||
if(end($priList))
|
||||
{
|
||||
unset($priList[0]);
|
||||
$priList[0] = '';
|
||||
}
|
||||
?>
|
||||
<?php if($hasCustomPri):?>
|
||||
<?php echo html::select('pri', (array)$lang->story->priList, $pri, "class='form-control chosen'");?>
|
||||
<?php echo html::select('pri', (array)$priList, $pri, "class='form-control chosen'");?>
|
||||
<?php else: ?>
|
||||
<?php echo html::select('pri', (array)$lang->story->priList, $pri, "class='form-control' data-provide='labelSelector'");?>
|
||||
<?php echo html::select('pri', (array)$priList, $pri, "class='form-control' data-provide='labelSelector'");?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -137,7 +143,7 @@
|
||||
<td>
|
||||
<div class='checkbox-primary'>
|
||||
<input id='needNotReview' name='needNotReview' value='1' type='checkbox' class='no-margin' <?php echo $needReview;?>/>
|
||||
<label for='marker'><?php echo $lang->story->needNotReview;?></label>
|
||||
<label for='needNotReview'><?php echo $lang->story->needNotReview;?></label>
|
||||
</div>
|
||||
</td>
|
||||
<?php endif;?>
|
||||
|
||||
@@ -317,54 +317,52 @@
|
||||
</div>
|
||||
|
||||
<div id="mainActions">
|
||||
<?php common::printPreAndNext($preAndNext);?>
|
||||
<div class="btn-toolbar">
|
||||
<?php if(!$story->deleted):?>
|
||||
<?php
|
||||
common::printIcon('story', 'change', "storyID=$story->id", $story);
|
||||
common::printIcon('story', 'review', "storyID=$story->id", $story);
|
||||
if($story->status != 'closed' and !isonlybody())
|
||||
{
|
||||
$misc = "class='btn' data-toggle='modal' data-type='iframe' data-width='95%'";
|
||||
$link = $this->createLink('story', 'batchCreate', "productID=$story->product&branch=$story->branch&moduleID=$story->module&storyID=$story->id", '', true);
|
||||
if(common::hasPriv('story', 'batchCreate')) echo html::a($link, "<i class='icon icon-sitemap'></i> " . $lang->story->subdivide, '', $misc);
|
||||
}
|
||||
<?php common::printPreAndNext($preAndNext);?>
|
||||
<div class="btn-toolbar">
|
||||
<?php common::printBack($browseLink);?>
|
||||
<?php if(!$story->deleted):?>
|
||||
<div class='divider'></div>
|
||||
<?php
|
||||
common::printIcon('story', 'change', "storyID=$story->id", $story);
|
||||
common::printIcon('story', 'review', "storyID=$story->id", $story);
|
||||
if($story->status != 'closed' and !isonlybody())
|
||||
{
|
||||
$misc = "class='btn' data-toggle='modal' data-type='iframe' data-width='95%'";
|
||||
$link = $this->createLink('story', 'batchCreate', "productID=$story->product&branch=$story->branch&moduleID=$story->module&storyID=$story->id", '', true);
|
||||
if(common::hasPriv('story', 'batchCreate')) echo html::a($link, "<i class='icon icon-sitemap'></i> " . $lang->story->subdivide, '', $misc);
|
||||
}
|
||||
|
||||
common::printIcon('story', 'close', "storyID=$story->id", $story, 'button', '', '', 'iframe', true);
|
||||
common::printIcon('story', 'activate', "storyID=$story->id", $story, 'button', '', '', 'iframe', true);
|
||||
common::printIcon('story', 'close', "storyID=$story->id", $story, 'button', '', '', 'iframe', true);
|
||||
common::printIcon('story', 'activate', "storyID=$story->id", $story, 'button', '', '', 'iframe', true);
|
||||
|
||||
if($this->config->global->flow != 'onlyStory' and !isonlybody() and (common::hasPriv('testcase', 'create') or common::hasPriv('testcase', 'batchCreate')))
|
||||
{
|
||||
$this->app->loadLang('testcase');
|
||||
echo "<div class='btn-group dropup'>";
|
||||
echo "<button type='button' class='btn btn-default dropdown-toggle' data-toggle='dropdown'><i class='icon icon-sitemap'></i> " . $lang->testcase->common . " <span class='caret'></span></button>";
|
||||
echo "<ul class='dropdown-menu' id='createCaseActionMenu'>";
|
||||
if($this->config->global->flow != 'onlyStory' and !isonlybody() and (common::hasPriv('testcase', 'create') or common::hasPriv('testcase', 'batchCreate')))
|
||||
{
|
||||
$this->app->loadLang('testcase');
|
||||
echo "<div class='btn-group dropup'>";
|
||||
echo "<button type='button' class='btn btn-default dropdown-toggle' data-toggle='dropdown'><i class='icon icon-sitemap'></i> " . $lang->testcase->common . " <span class='caret'></span></button>";
|
||||
echo "<ul class='dropdown-menu' id='createCaseActionMenu'>";
|
||||
|
||||
$misc = "data-toggle='modal' data-type='iframe' data-width='95%'";
|
||||
$link = $this->createLink('testcase', 'create', "productID=$story->product&branch=$story->branch&moduleID=0&from=¶m=0&storyID=$story->id", '', true);
|
||||
if(common::hasPriv('testcase', 'create', $story)) echo "<li>" . html::a($link, $lang->testcase->create, '', $misc) . "</li>";
|
||||
$misc = "data-toggle='modal' data-type='iframe' data-width='95%'";
|
||||
$link = $this->createLink('testcase', 'create', "productID=$story->product&branch=$story->branch&moduleID=0&from=¶m=0&storyID=$story->id", '', true);
|
||||
if(common::hasPriv('testcase', 'create', $story)) echo "<li>" . html::a($link, $lang->testcase->create, '', $misc) . "</li>";
|
||||
|
||||
$misc = "data-toggle='modal' data-type='iframe' data-width='95%'";
|
||||
$link = $this->createLink('testcase', 'batchCreate', "productID=$story->product&branch=$story->branch&moduleID=0&storyID=$story->id", '', true);
|
||||
if(common::hasPriv('testcase', 'batchCreate')) echo "<li>" . html::a($link, $lang->testcase->batchCreate, '', $misc) . "</li>";
|
||||
$misc = "data-toggle='modal' data-type='iframe' data-width='95%'";
|
||||
$link = $this->createLink('testcase', 'batchCreate', "productID=$story->product&branch=$story->branch&moduleID=0&storyID=$story->id", '', true);
|
||||
if(common::hasPriv('testcase', 'batchCreate')) echo "<li>" . html::a($link, $lang->testcase->batchCreate, '', $misc) . "</li>";
|
||||
|
||||
echo "</ul>";
|
||||
echo "</div>";
|
||||
}
|
||||
echo "</ul>";
|
||||
echo "</div>";
|
||||
}
|
||||
|
||||
if($from == 'project') common::printIcon('task', 'create', "project=$param&storyID=$story->id&moduleID=$story->module", $story, 'button', 'smile');
|
||||
if($from == 'project') common::printIcon('task', 'create', "project=$param&storyID=$story->id&moduleID=$story->module", $story, 'button', 'smile');
|
||||
|
||||
echo "<div class='divider'></div>";
|
||||
common::printIcon('story', 'edit', "storyID=$story->id", $story);
|
||||
common::printIcon('story', 'create', "productID=$story->product&branch=$story->branch&moduleID=$story->module&storyID=$story->id", $story, 'button', 'copy');
|
||||
common::printIcon('story', 'delete', "storyID=$story->id", $story, 'button', '', 'hiddenwin');
|
||||
|
||||
echo "<div class='divider'></div>";
|
||||
common::printBack($browseLink);
|
||||
?>
|
||||
<?php else:?>
|
||||
<?php common::printBack($browseLink);?>
|
||||
<?php endif;?>
|
||||
echo "<div class='divider'></div>";
|
||||
common::printIcon('story', 'edit', "storyID=$story->id", $story);
|
||||
common::printIcon('story', 'create', "productID=$story->product&branch=$story->branch&moduleID=$story->module&storyID=$story->id", $story, 'button', 'copy');
|
||||
common::printIcon('story', 'delete', "storyID=$story->id", $story, 'button', '', 'hiddenwin');
|
||||
?>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
js::set('canCreate', common::hasPriv('story', 'story'));
|
||||
|
||||
@@ -109,13 +109,15 @@ $lang->task->lblPri = 'P';
|
||||
$lang->task->lblHour = '(h)';
|
||||
$lang->task->deniedNotice = '此任务只允许由团队第一人开始。';
|
||||
|
||||
$lang->task->ditto = '同上';
|
||||
$lang->task->dittoNotice = "该任务与上一任务不属于同一项目!";
|
||||
$lang->task->selectAllUser = '全部';
|
||||
$lang->task->noStory = '无需求';
|
||||
$lang->task->noAssigned = '未指派';
|
||||
$lang->task->noFinished = '未完成';
|
||||
$lang->task->noClosed = '未关闭';
|
||||
$lang->task->ditto = '同上';
|
||||
$lang->task->dittoNotice = "该任务与上一任务不属于同一项目!";
|
||||
$lang->task->selectAllUser = '全部';
|
||||
$lang->task->noStory = '无需求';
|
||||
$lang->task->noAssigned = '未指派';
|
||||
$lang->task->noFinished = '未完成';
|
||||
$lang->task->noClosed = '未关闭';
|
||||
$lang->task->yesterdayFinished = '昨日完成';
|
||||
$lang->task->allTasks = '总任务';
|
||||
|
||||
$lang->task->statusList[''] = '';
|
||||
$lang->task->statusList['wait'] = '未开始';
|
||||
|
||||
@@ -452,6 +452,7 @@ class testreport extends control
|
||||
{
|
||||
$this->projects = $this->project->getPairs('nocode');
|
||||
$projectID = $this->project->saveState($objectID, $this->projects);
|
||||
$this->lang->testreport->dividerMenu = $this->lang->project->dividerMenu;
|
||||
$this->project->setMenu($this->projects, $projectID);
|
||||
$this->lang->testreport->menu = $this->lang->project->menu;
|
||||
$this->lang->testreport->menu->testtask['subModule'] = 'testreport';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php $sysURL = $this->session->notHead ? common::getSysURL() : '';?>
|
||||
<table class='table' id='bugs'>
|
||||
<table class='table main-table' id='bugs'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='w-id'> <?php echo $lang->idAB;?></th>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?php $sysURL = $this->session->notHead ? common::getSysURL() : '';?>
|
||||
<table class='table' id='builds'>
|
||||
<table class='table main-table' id='builds'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='w-id'> <?php echo $lang->build->id;?></th>
|
||||
<th> <?php echo $lang->build->name;?></th>
|
||||
<th class='w-user'><?php echo $lang->build->builder;?></th>
|
||||
<th class='w-date'><?php echo $lang->build->date;?></th>
|
||||
<th class='w-100px'><?php echo $lang->build->date;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<?php if($builds):?>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php $sysURL = $this->session->notHead ? common::getSysURL() : '';?>
|
||||
<table class='table' id='cases'>
|
||||
<table class='table main-table' id='cases'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='w-id'> <?php echo $lang->idAB;?></th>
|
||||
@@ -8,9 +8,9 @@
|
||||
<th class='w-type'> <?php echo $lang->testcase->type;?></th>
|
||||
<th class='w-user'> <?php echo $lang->testtask->assignedTo;?></th>
|
||||
<th class='w-user'> <?php echo $lang->testtask->lastRunAccount;?></th>
|
||||
<th class='w-130px'> <?php echo $lang->testtask->lastRunTime;?></th>
|
||||
<th class='w-150px'> <?php echo $lang->testtask->lastRunTime;?></th>
|
||||
<th class='w-80px'> <?php echo $lang->testtask->lastRunResult;?></th>
|
||||
<th class='w-status'><?php echo $lang->statusAB;?></th>
|
||||
<th class='w-100px'><?php echo $lang->statusAB;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<?php if($cases):?>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php $sysURL = $this->session->notHead ? common::getSysURL() : '';?>
|
||||
<table class='table' id='legacyBugs'>
|
||||
<table class='table main-table' id='legacyBugs'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='w-id'> <?php echo $lang->idAB;?></th>
|
||||
@@ -7,8 +7,8 @@
|
||||
<th> <?php echo $lang->bug->title;?></th>
|
||||
<th class='w-user'> <?php echo $lang->openedByAB;?></th>
|
||||
<th class='w-user'> <?php echo $lang->bug->resolvedBy;?></th>
|
||||
<th class='w-130px'><?php echo $lang->bug->resolvedDate;?></th>
|
||||
<th class='w-80px'> <?php echo $lang->statusAB;?></th>
|
||||
<th class='w-150px'><?php echo $lang->bug->resolvedDate;?></th>
|
||||
<th class='w-100px'> <?php echo $lang->statusAB;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<?php if($legacyBugs):?>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php $sysURL = $this->session->notHead ? common::getSysURL() : '';?>
|
||||
<table class='table' id='stories'>
|
||||
<table class='table main-table' id='stories'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='w-id'> <?php echo $lang->idAB;?></th>
|
||||
@@ -8,8 +8,8 @@
|
||||
<th class='w-user'><?php echo $lang->openedByAB;?></th>
|
||||
<th class='w-80px'><?php echo $lang->assignedToAB;?></th>
|
||||
<th class='w-hour'><?php echo $lang->story->estimateAB;?></th>
|
||||
<th class='w-hour'><?php echo $lang->statusAB;?></th>
|
||||
<th class='w-70px'><?php echo $lang->story->stageAB;?></th>
|
||||
<th class='w-80px'><?php echo $lang->statusAB;?></th>
|
||||
<th class='w-80px'><?php echo $lang->story->stageAB;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<?php if($stories):?>
|
||||
|
||||
@@ -11,51 +11,55 @@
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
<strong><?php echo $lang->testreport->browse;?></strong>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='pull-left btn-toolbar'>
|
||||
<span class='btn btn-link btn-active-text'><span class='text'><?php echo $lang->testreport->browse;?></span></span>
|
||||
</div>
|
||||
</div>
|
||||
<table class='table table-condensed table-hover table-striped tablesorter table-fixed table-selectable' id='reportList'>
|
||||
<?php $vars = "objectID=$objectID&objectType=$objectType&extra=$extra&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}";?>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='w-id'> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
|
||||
<th> <?php common::printOrderLink('title', $orderBy, $vars, $lang->testreport->title);?></th>
|
||||
<th class='w-user'> <?php common::printOrderLink('createdBy', $orderBy, $vars, $lang->openedByAB);?></th>
|
||||
<th class='w-120px'><?php common::printOrderLink('createdDate', $orderBy, $vars, $lang->testreport->createdDate);?></th>
|
||||
<th class='w-250px'><?php common::printOrderLink('project', $orderBy, $vars, $lang->testreport->project);?></th>
|
||||
<th class='w-250px'><?php echo $lang->testreport->testtask;?></th>
|
||||
<th class='w-60px'> <?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<?php if($reports):?>
|
||||
<tbody class='text-center'>
|
||||
<?php foreach($reports as $report):?>
|
||||
<tr>
|
||||
<td><?php echo $report->id?></td>
|
||||
<td class='text-left' title='<?php $report->title?>'><?php echo html::a(inlink('view', "reportID=$report->id&from=$objectType"), $report->title)?></td>
|
||||
<td><?php echo zget($users, $report->createdBy);?></td>
|
||||
<td><?php echo substr($report->createdDate, 2);?></td>
|
||||
<?php $projectName = '#' . $report->project . $projects[$report->project];?>
|
||||
<td class='text-left' title='<?php echo $projectName?>'><?php echo $projectName;?></td>
|
||||
<?php
|
||||
$taskName = '';
|
||||
foreach(explode(',', $report->tasks) as $taskID) $taskName .= '#' . $taskID . $tasks[$taskID] . ' ';
|
||||
?>
|
||||
<td class='text-left' title='<?php echo $taskName?>'><?php echo $taskName;?></td>
|
||||
<td>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<table class='table has-sort-head main-table table-fixed' id='reportList'>
|
||||
<?php $vars = "objectID=$objectID&objectType=$objectType&extra=$extra&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}";?>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='w-id'> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
|
||||
<th> <?php common::printOrderLink('title', $orderBy, $vars, $lang->testreport->title);?></th>
|
||||
<th class='w-user'> <?php common::printOrderLink('createdBy', $orderBy, $vars, $lang->openedByAB);?></th>
|
||||
<th class='w-150px'><?php common::printOrderLink('createdDate', $orderBy, $vars, $lang->testreport->createdDate);?></th>
|
||||
<th class='w-250px'><?php common::printOrderLink('project', $orderBy, $vars, $lang->testreport->project);?></th>
|
||||
<th class='w-250px'><?php echo $lang->testreport->testtask;?></th>
|
||||
<th class='w-80px'> <?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<?php if($reports):?>
|
||||
<tbody class='text-center'>
|
||||
<?php foreach($reports as $report):?>
|
||||
<tr>
|
||||
<td><?php echo $report->id?></td>
|
||||
<td class='text-left' title='<?php $report->title?>'><?php echo html::a(inlink('view', "reportID=$report->id&from=$objectType"), $report->title)?></td>
|
||||
<td><?php echo zget($users, $report->createdBy);?></td>
|
||||
<td><?php echo substr($report->createdDate, 2);?></td>
|
||||
<?php $projectName = '#' . $report->project . $projects[$report->project];?>
|
||||
<td class='text-left' title='<?php echo $projectName?>'><?php echo $projectName;?></td>
|
||||
<?php
|
||||
common::printIcon('testreport', 'edit', "id=$report->id", '', 'list');
|
||||
common::printIcon('testreport', 'delete', "id=$report->id", '', 'list', 'remove', 'hiddenwin');
|
||||
$taskName = '';
|
||||
foreach(explode(',', $report->tasks) as $taskID) $taskName .= '#' . $taskID . $tasks[$taskID] . ' ';
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<tfoot><tr><td colspan='7'><?php $pager->show();?></td></tr></tfoot>
|
||||
<?php else:?>
|
||||
<tbody><tr><td colspan='7'><?php echo $lang->testreport->noReport;?></td></tr></tbody>
|
||||
<td class='text-left' title='<?php echo $taskName?>'><?php echo $taskName;?></td>
|
||||
<td class='c-actions'>
|
||||
<?php
|
||||
common::printIcon('testreport', 'edit', "id=$report->id", '', 'list');
|
||||
common::printIcon('testreport', 'delete', "id=$report->id", '', 'list', 'trash', 'hiddenwin');
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<?php else:?>
|
||||
<tbody><tr><td colspan='7'><?php echo $lang->testreport->noReport;?></td></tr></tbody>
|
||||
<?php endif;?>
|
||||
</table>
|
||||
<?php if($reports):?>
|
||||
<div class='table-footer'><?php $pager->show('right', 'pagerjs');?></div>
|
||||
<?php endif;?>
|
||||
</table>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -14,101 +14,95 @@
|
||||
<?php include '../../common/view/datepicker.html.php';?>
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
<?php include '../../common/view/chart.html.php';?>
|
||||
<div class='container mw-1400px'>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
<strong><small class='text-muted'><?php echo html::icon($lang->icons['create']);?></small> <?php echo $lang->testreport->create;?></strong>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='center-block mw-1400px'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->testreport->create;?></h2>
|
||||
<div class='pull-right btn-toolbar'><?php echo html::backButton();?></div>
|
||||
</div>
|
||||
<div class='actions'>
|
||||
<?php
|
||||
echo html::backButton();
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
<div class='main'>
|
||||
<form class='form-condensed' method='post' enctype='multipart/form-data' target='hiddenwin'>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendBasic?></legend>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-80px'><?php echo $lang->testreport->startEnd?></th>
|
||||
<td class='w-p50'>
|
||||
<div class='input-group'>
|
||||
<?php echo html::input('begin', $begin, "class='form-control form-date'")?>
|
||||
<span class='input-group-addon'> ~ </span>
|
||||
<?php echo html::input('end', $end, "class='form-control form-date'")?>
|
||||
<?php
|
||||
echo html::hidden('product', $productIdList) . html::hidden('project', $project->id) . html::hidden('tasks', $tasks);
|
||||
echo html::hidden('objectID', $objectID) . html::hidden('objectType', $objectType);
|
||||
?>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->testreport->owner?></span>
|
||||
<?php echo html::select('owner', $users, $owner, "class='form-control chosen'")?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->members?></th>
|
||||
<td colspan='2'><?php echo html::select('members[]', $users, $members, "class='form-control chosen' multiple")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->title?></th>
|
||||
<td colspan='2'><?php echo html::input('title', $reportTitle, "class='form-control'")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->goal?></th>
|
||||
<td colspan='2'><?php echo $project->desc?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->profile?></th>
|
||||
<td colspan='2'>
|
||||
<?php
|
||||
echo '<p>' . $storySummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->buildSummary, empty($builds) ? 1 : count($builds)) . $caseSummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->bugSummary, $bugInfo['foundBugs'], count($legacyBugs), $bugInfo['countBugByTask'], $bugInfo['bugConfirmedRate'] . '%', $bugInfo['bugCreateByCaseRate'] . '%') . '</p>';
|
||||
unset($bugInfo['countBugByTask']); unset($bugInfo['bugConfirmedRate']); unset($bugInfo['bugCreateByCaseRate']); unset($bugInfo['foundBugs']);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->report?></th>
|
||||
<td colspan='2'><?php echo html::textarea('report', '', "class='form-control'")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->files?></th>
|
||||
<td colspan='2'><?php echo $this->fetch('file', 'buildform');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<td><?php echo html::submitButton() . html::backButton();?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendStoryAndBug?></legend>
|
||||
<?php include './blockstories.html.php'?>
|
||||
<?php include './blockbugs.html.php'?>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendBuild?></legend>
|
||||
<?php include './blockbuilds.html.php'?>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendCase?></legend>
|
||||
<?php include './blockcases.html.php'?>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendLegacyBugs?></legend>
|
||||
<?php include './blocklegacybugs.html.php'?>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendReport?></legend>
|
||||
<?php include './blockbugreport.html.php'?>
|
||||
</fieldset>
|
||||
</form>
|
||||
<form method='post' enctype='multipart/form-data' target='hiddenwin'>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendBasic?></div>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-80px'><?php echo $lang->testreport->startEnd?></th>
|
||||
<td class='w-p50'>
|
||||
<div class='input-group'>
|
||||
<?php echo html::input('begin', $begin, "class='form-control form-date'")?>
|
||||
<span class='input-group-addon'> ~ </span>
|
||||
<?php echo html::input('end', $end, "class='form-control form-date'")?>
|
||||
<?php
|
||||
echo html::hidden('product', $productIdList) . html::hidden('project', $project->id) . html::hidden('tasks', $tasks);
|
||||
echo html::hidden('objectID', $objectID) . html::hidden('objectType', $objectType);
|
||||
?>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->testreport->owner?></span>
|
||||
<?php echo html::select('owner', $users, $owner, "class='form-control chosen'")?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->members?></th>
|
||||
<td colspan='2'><?php echo html::select('members[]', $users, $members, "class='form-control chosen' multiple")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->title?></th>
|
||||
<td colspan='2'><?php echo html::input('title', $reportTitle, "class='form-control'")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->goal?></th>
|
||||
<td colspan='2'><?php echo $project->desc?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->profile?></th>
|
||||
<td colspan='2'>
|
||||
<?php
|
||||
echo '<p>' . $storySummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->buildSummary, empty($builds) ? 1 : count($builds)) . $caseSummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->bugSummary, $bugInfo['foundBugs'], count($legacyBugs), $bugInfo['countBugByTask'], $bugInfo['bugConfirmedRate'] . '%', $bugInfo['bugCreateByCaseRate'] . '%') . '</p>';
|
||||
unset($bugInfo['countBugByTask']); unset($bugInfo['bugConfirmedRate']); unset($bugInfo['bugCreateByCaseRate']); unset($bugInfo['foundBugs']);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->report?></th>
|
||||
<td colspan='2'><?php echo html::textarea('report', '', "class='form-control'")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->files?></th>
|
||||
<td colspan='2'><?php echo $this->fetch('file', 'buildform');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<td><?php echo html::submitButton() . html::backButton();?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendStoryAndBug?></div>
|
||||
<?php include './blockstories.html.php'?>
|
||||
<?php include './blockbugs.html.php'?>
|
||||
</div>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendBuild?></div>
|
||||
<?php include './blockbuilds.html.php'?>
|
||||
</div>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendCase?></div>
|
||||
<?php include './blockcases.html.php'?>
|
||||
</div>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendLegacyBugs?></div>
|
||||
<?php include './blocklegacybugs.html.php'?>
|
||||
</div>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendReport?></div>
|
||||
<?php include './blockbugreport.html.php'?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -14,96 +14,94 @@
|
||||
<?php include '../../common/view/datepicker.html.php';?>
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
<?php include '../../common/view/chart.html.php';?>
|
||||
<div class='container mw-1400px'>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
<strong><small class='text-muted'><?php echo html::icon($lang->icons['edit']);?></small> <?php echo $lang->testreport->edit;?></strong>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='center-block mw-1400px'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->testreport->edit;?></h2>
|
||||
<div class='btn-toolbar pull-right'><?php echo html::backButton();?></div>
|
||||
</div>
|
||||
<div class='actions'><?php echo html::backButton();?></div>
|
||||
</div>
|
||||
<div class='main'>
|
||||
<form class='form-condensed' method='post' enctype='multipart/form-data' target='hiddenwin'>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendBasic?></legend>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-80px'><?php echo $lang->testreport->startEnd?></th>
|
||||
<td class='w-p50'>
|
||||
<div class='input-group'>
|
||||
<?php echo html::input('begin', $report->begin, "class='form-control form-date'")?>
|
||||
<span class='input-group-addon'> ~ </span>
|
||||
<?php echo html::input('end', $report->end, "class='form-control form-date'")?>
|
||||
<?php
|
||||
echo html::hidden('product', $productIdList) . html::hidden('project', $report->project) . html::hidden('tasks', $tasks);
|
||||
?>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->testreport->owner?></span>
|
||||
<?php echo html::select('owner', $users, $report->owner, "class='form-control chosen'")?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->members?></th>
|
||||
<td colspan='2'><?php echo html::select('members[]', $users, $report->members, "class='form-control chosen' multiple")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->title?></th>
|
||||
<td colspan='2'><?php echo html::input('title', $report->title, "class='form-control'")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->goal?></th>
|
||||
<td colspan='2'><?php echo $project->desc?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->profile?></th>
|
||||
<td colspan='2'>
|
||||
<?php
|
||||
echo '<p>' . $storySummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->buildSummary, empty($builds) ? 1 : count($builds)) . $caseSummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->bugSummary, $bugInfo['foundBugs'], count($legacyBugs), $bugInfo['countBugByTask'], $bugInfo['bugConfirmedRate'] . '%', $bugInfo['bugCreateByCaseRate'] . '%') . '</p>';
|
||||
unset($bugInfo['countBugByTask']); unset($bugInfo['bugConfirmedRate']); unset($bugInfo['bugCreateByCaseRate']); unset($bugInfo['foundBugs']);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->report?></th>
|
||||
<td colspan='2'><?php echo html::textarea('report', $report->report, "class='form-control'")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->files?></th>
|
||||
<td colspan='2'><?php echo $this->fetch('file', 'buildform');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<td><?php echo html::submitButton() . html::backButton();?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendStoryAndBug?></legend>
|
||||
<?php include './blockstories.html.php'?>
|
||||
<?php include './blockbugs.html.php'?>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendBuild?></legend>
|
||||
<?php include './blockbuilds.html.php'?>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendCase?></legend>
|
||||
<?php include './blockcases.html.php'?>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendLegacyBugs?></legend>
|
||||
<?php include './blocklegacybugs.html.php'?>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testreport->legendReport?></legend>
|
||||
<?php include './blockbugreport.html.php'?>
|
||||
</fieldset>
|
||||
</form>
|
||||
<form method='post' enctype='multipart/form-data' target='hiddenwin'>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendBasic?></div>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-80px'><?php echo $lang->testreport->startEnd?></th>
|
||||
<td class='w-p50'>
|
||||
<div class='input-group'>
|
||||
<?php echo html::input('begin', $report->begin, "class='form-control form-date'")?>
|
||||
<span class='input-group-addon'> ~ </span>
|
||||
<?php echo html::input('end', $report->end, "class='form-control form-date'")?>
|
||||
<?php
|
||||
echo html::hidden('product', $productIdList) . html::hidden('project', $report->project) . html::hidden('tasks', $tasks);
|
||||
?>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->testreport->owner?></span>
|
||||
<?php echo html::select('owner', $users, $report->owner, "class='form-control chosen'")?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->members?></th>
|
||||
<td colspan='2'><?php echo html::select('members[]', $users, $report->members, "class='form-control chosen' multiple")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->title?></th>
|
||||
<td colspan='2'><?php echo html::input('title', $report->title, "class='form-control'")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->goal?></th>
|
||||
<td colspan='2'><?php echo $project->desc?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->profile?></th>
|
||||
<td colspan='2'>
|
||||
<?php
|
||||
echo '<p>' . $storySummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->buildSummary, empty($builds) ? 1 : count($builds)) . $caseSummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->bugSummary, $bugInfo['foundBugs'], count($legacyBugs), $bugInfo['countBugByTask'], $bugInfo['bugConfirmedRate'] . '%', $bugInfo['bugCreateByCaseRate'] . '%') . '</p>';
|
||||
unset($bugInfo['countBugByTask']); unset($bugInfo['bugConfirmedRate']); unset($bugInfo['bugCreateByCaseRate']); unset($bugInfo['foundBugs']);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->report?></th>
|
||||
<td colspan='2'><?php echo html::textarea('report', $report->report, "class='form-control'")?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->files?></th>
|
||||
<td colspan='2'><?php echo $this->fetch('file', 'buildform');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<td><?php echo html::submitButton() . html::backButton();?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendStoryAndBug?></div>
|
||||
<?php include './blockstories.html.php'?>
|
||||
<?php include './blockbugs.html.php'?>
|
||||
</div>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendBuild?></div>
|
||||
<?php include './blockbuilds.html.php'?>
|
||||
</div>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendCase?></div>
|
||||
<?php include './blockcases.html.php'?>
|
||||
</div>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendLegacyBugs?></div>
|
||||
<?php include './blocklegacybugs.html.php'?>
|
||||
</div>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->testreport->legendReport?></div>
|
||||
<?php include './blockbugreport.html.php'?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -13,108 +13,102 @@
|
||||
<?php if(!$this->session->notHead):?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/chart.html.php';?>
|
||||
<div class='container mw-1400px'>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
<span class='prefix'><strong><?php echo $report->id;?></strong></span>
|
||||
<strong><?php echo $report->title;?></strong>
|
||||
</div>
|
||||
<div class='actions'>
|
||||
<?php
|
||||
$browseLink = $this->session->reportList != false ? $app->session->reportList : $browseLink;
|
||||
$actionLinks = '';
|
||||
ob_start();
|
||||
|
||||
echo "<div class='btn-group'>";
|
||||
if(common::hasPriv('testreport', 'create')) echo html::a(inLink('create', "objectID=$report->objectID&objectType=$report->objectType"), "<i class='icon-refresh'></i>", '', "class='btn' title='{$lang->testreport->recreate}'");
|
||||
common::printIcon('testreport', 'edit', "reportID=$report->id", '', 'button');
|
||||
common::printIcon('testreport', 'delete', "reportID=$report->id", '', 'button', '', 'hiddenwin');
|
||||
echo '</div>';
|
||||
|
||||
echo "<div class='btn-group'>";
|
||||
common::printRPN($browseLink);
|
||||
echo '</div>';
|
||||
|
||||
$actionLinks = ob_get_contents();
|
||||
ob_end_clean();
|
||||
echo $actionLinks;
|
||||
?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php $browseLink = $this->session->reportList != false ? $app->session->reportList : $browseLink;?>
|
||||
<?php echo html::a($browseLink, "<i class='icon icon-back icon-sm'></i>" . $lang->goback, '', "class='btn btn-link'");?>
|
||||
<div class='divider'></div>
|
||||
<div class='page-title'>
|
||||
<span class='label label-id'><?php echo $report->id;?></span>
|
||||
<span class='text'><?php echo $report->title;?></span>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class='main'>
|
||||
<ul class='nav nav-tabs'>
|
||||
<li class='active'><?php echo html::a('###', $lang->testreport->legendBasic, '', "data-toggle='tab' data-target='#basic'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendStoryAndBug, '', "data-toggle='tab' data-target='#storyAndBug'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendBuild, '', "data-toggle='tab' data-target='#tabBuild'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendCase, '', "data-toggle='tab' data-target='#tabCase'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendLegacyBugs, '', "data-toggle='tab' data-target='#tabLegacyBugs'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendReport, '', "data-toggle='tab' data-target='#tabReport'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendComment, '', "data-toggle='tab' data-target='#tabComment'")?></li>
|
||||
<?php if(!$this->session->notHead):?>
|
||||
<li><?php echo html::a('###', $lang->history, '', "data-toggle='tab' data-target='#tabHistory'")?></li>
|
||||
<?php if($this->app->user->admin):?>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendMore, '', "data-toggle='tab' data-target='#tabMore'")?></li>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
</ul>
|
||||
<div class='tab-content'>
|
||||
<div class='tab-pane' id='basic'>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-100px'><?php echo $lang->testreport->startEnd?></th>
|
||||
<td class='w-p50'> <?php echo $report->begin . ' ~ ' . $report->end;?></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->owner?></th>
|
||||
<td><?php echo zget($users, $report->owner);?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->members?></th>
|
||||
<td colspan='2'><?php foreach(explode(',', $report->members) as $member)echo zget($users, $member) . ' ';?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->goal?></th>
|
||||
<td colspan='2'><?php echo $project->desc?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->profile?></th>
|
||||
<td colspan='2'>
|
||||
<?php
|
||||
echo '<p>' . $storySummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->buildSummary, empty($builds) ? 1 : count($builds)) . $caseSummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->bugSummary, $bugInfo['foundBugs'], count($legacyBugs), $bugInfo['countBugByTask'], $bugInfo['bugConfirmedRate'] . '%', $bugInfo['bugCreateByCaseRate'] . '%') . '</p>';
|
||||
unset($bugInfo['countBugByTask']); unset($bugInfo['bugConfirmedRate']); unset($bugInfo['bugCreateByCaseRate']); unset($bugInfo['foundBugs']);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if(!$this->session->notHead):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->files?></th>
|
||||
<td><?php echo $this->fetch('file', 'printFiles', array('files' => $report->files, 'fieldset' => 'false'));?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
</table>
|
||||
</div>
|
||||
<div class='tab-pane' id='storyAndBug'>
|
||||
<?php include './blockstories.html.php'?>
|
||||
<?php include './blockbugs.html.php'?>
|
||||
</div>
|
||||
<div class='tab-pane' id='tabBuild'><?php include './blockbuilds.html.php'?></div>
|
||||
<div class='tab-pane' id='tabCase'><?php include './blockcases.html.php'?></div>
|
||||
<div class='tab-pane' id='tabLegacyBugs'><?php include './blocklegacybugs.html.php'?></div>
|
||||
<div class='tab-pane active' id='tabReport'><?php include './blockbugreport.html.php'?></div>
|
||||
<div class='tab-pane' id='tabComment'><div class='article-content'><?php echo empty($report->report) ? $lang->testreport->none : $report->report;?></div></div>
|
||||
<?php if(!$this->session->notHead):?>
|
||||
<div class='tab-pane' id='tabHistory'><?php include '../../common/view/action.html.php';?></div>
|
||||
<?php if($this->app->user->admin):?>
|
||||
<div class='tab-pane' id='tabMore'><div class='article-content'><?php echo $lang->testreport->moreNotice;?></div></div>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<ul class='nav nav-tabs'>
|
||||
<li class='active'><?php echo html::a('###', $lang->testreport->legendBasic, '', "data-toggle='tab' data-target='#basic'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendStoryAndBug, '', "data-toggle='tab' data-target='#storyAndBug'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendBuild, '', "data-toggle='tab' data-target='#tabBuild'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendCase, '', "data-toggle='tab' data-target='#tabCase'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendLegacyBugs, '', "data-toggle='tab' data-target='#tabLegacyBugs'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendReport, '', "data-toggle='tab' data-target='#tabReport'")?></li>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendComment, '', "data-toggle='tab' data-target='#tabComment'")?></li>
|
||||
<?php if(!$this->session->notHead):?>
|
||||
<li><?php echo html::a('###', $lang->history, '', "data-toggle='tab' data-target='#tabHistory'")?></li>
|
||||
<?php if($this->app->user->admin):?>
|
||||
<li><?php echo html::a('###', $lang->testreport->legendMore, '', "data-toggle='tab' data-target='#tabMore'")?></li>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
</ul>
|
||||
<div class='tab-content'>
|
||||
<div class='tab-pane' id='basic'>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-100px'><?php echo $lang->testreport->startEnd?></th>
|
||||
<td class='w-p50'> <?php echo $report->begin . ' ~ ' . $report->end;?></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->owner?></th>
|
||||
<td><?php echo zget($users, $report->owner);?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->members?></th>
|
||||
<td colspan='2'><?php foreach(explode(',', $report->members) as $member)echo zget($users, $member) . ' ';?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->goal?></th>
|
||||
<td colspan='2'><?php echo $project->desc?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testreport->profile?></th>
|
||||
<td colspan='2'>
|
||||
<?php
|
||||
echo '<p>' . $storySummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->buildSummary, empty($builds) ? 1 : count($builds)) . $caseSummary . '</p>';
|
||||
echo '<p>' . sprintf($lang->testreport->bugSummary, $bugInfo['foundBugs'], count($legacyBugs), $bugInfo['countBugByTask'], $bugInfo['bugConfirmedRate'] . '%', $bugInfo['bugCreateByCaseRate'] . '%') . '</p>';
|
||||
unset($bugInfo['countBugByTask']); unset($bugInfo['bugConfirmedRate']); unset($bugInfo['bugCreateByCaseRate']); unset($bugInfo['foundBugs']);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if(!$this->session->notHead):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->files?></th>
|
||||
<td><?php echo $this->fetch('file', 'printFiles', array('files' => $report->files, 'fieldset' => 'false'));?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
</table>
|
||||
</div>
|
||||
<div class='tab-pane' id='storyAndBug'>
|
||||
<?php include './blockstories.html.php'?>
|
||||
<?php include './blockbugs.html.php'?>
|
||||
</div>
|
||||
<div class='tab-pane' id='tabBuild'><?php include './blockbuilds.html.php'?></div>
|
||||
<div class='tab-pane' id='tabCase'><?php include './blockcases.html.php'?></div>
|
||||
<div class='tab-pane' id='tabLegacyBugs'><?php include './blocklegacybugs.html.php'?></div>
|
||||
<div class='tab-pane active' id='tabReport'><?php include './blockbugreport.html.php'?></div>
|
||||
<div class='tab-pane' id='tabComment'><div class='article-content'><?php echo empty($report->report) ? $lang->testreport->none : $report->report;?></div></div>
|
||||
<?php if(!$this->session->notHead):?>
|
||||
<div class='tab-pane' id='tabHistory'><?php include '../../common/view/action.html.php';?></div>
|
||||
<?php if($this->app->user->admin):?>
|
||||
<div class='tab-pane' id='tabMore'><div class='article-content'><?php echo $lang->testreport->moreNotice;?></div></div>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(!$this->session->notHead):?>
|
||||
<div id='mainActions'>
|
||||
<nav class='container'></nav>
|
||||
<div class='btn-toolbar'>
|
||||
<?php common::printBack($browseLink);?>
|
||||
<div class='divider'></div>
|
||||
<?php
|
||||
if(common::hasPriv('testreport', 'create')) echo html::a(inLink('create', "objectID=$report->objectID&objectType=$report->objectType"), "<i class='icon-refresh'></i>", '', "class='btn' title='{$lang->testreport->recreate}'");
|
||||
common::printIcon('testreport', 'edit', "reportID=$report->id", '', 'button');
|
||||
common::printIcon('testreport', 'delete', "reportID=$report->id", '', 'button', '', 'hiddenwin');
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
<?php endif;?>
|
||||
|
||||
+1
-1
@@ -1945,7 +1945,7 @@ $(document).ready(function()
|
||||
setSearchBox();
|
||||
setOuterBox();
|
||||
|
||||
setRequiredFields();
|
||||
//setRequiredFields();
|
||||
setPlaceholder();
|
||||
|
||||
setModalTriggerLink();
|
||||
|
||||
+4
-4
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -81,12 +81,12 @@
|
||||
<glyph unicode="" glyph-name="back" d="M160.311 501.081h470.224c185.496 0 335.875-150.376 335.875-335.875v0c0-185.496-150.376-335.875-335.875-335.875h-470.224v671.751zM160.311 366.732v-403.049h470.224c111.3 0 201.527 90.226 201.527 201.527s-90.226 201.527-201.527 201.527v0h-470.224zM227.487-103.491c0-37.097-30.073-67.176-67.176-67.176s-67.176 30.073-67.176 67.176c0 37.097 30.073 67.176 67.176 67.176s67.176-30.073 67.176-67.176zM81.047 484.906l293.273 251.415c5.634 4.828 14.116 4.179 18.944-1.456 2.785-3.249 3.857-7.628 2.884-11.799l-67.463-289.161 67.463-289.161c1.688-7.224-2.808-14.451-10.030-16.136-4.168-0.97-8.549 0.099-11.799 2.884l-293.273 251.415c-28.168 24.147-31.426 66.552-7.279 94.721 2.235 2.61 4.671 5.043 7.279 7.279z" />
|
||||
<glyph unicode="" glyph-name="chat-line" d="M875.173 88.887h-419.049l-111.746-67.050v67.050h-195.557v502.858h726.35v-502.858zM65.016 563.81v-446.984c0-61.717 50.029-111.746 111.746-111.746h89.396v-111.746l189.968 111.746h391.112c61.717 0 111.746 50.029 111.746 111.746v446.984c0 61.717-50.029 111.746-111.746 111.746h-670.476c-61.717 0-111.746-50.029-111.746-111.746zM288.508 368.255h446.984v83.811h-446.984zM288.508 200.633h446.984v83.811h-446.984z" />
|
||||
<glyph unicode="" glyph-name="person" d="M780.194 361.041l-0.032-0.014c10.366 29.5 16.283 61.056 16.283 94.084 0 157.097-127.333 284.444-284.444 284.444s-284.444-127.348-284.444-284.444c0-33.028 5.916-64.583 16.277-94.084v0.014c-110.834-56.375-186.944-171.209-186.944-304.084v-170.652c0-31.472 25.5-56.972 56.972-56.972h796.277c31.472 0 56.972 25.5 56.972 56.972v170.652c0 132.875-76.084 247.708-186.917 304.084zM512 625.777c94.112 0 170.667-76.555 170.667-170.667s-76.555-170.667-170.667-170.667c-94.112 0-170.667 76.555-170.667 170.667s76.555 170.667 170.667 170.667zM853.333-56.889h-682.667v113.847c0 91.264 54.167 169.945 131.89 206.153 52-56.695 126.444-92.444 209.444-92.444 83.001 0 157.444 35.749 209.444 92.444 77.723-36.208 131.89-114.889 131.89-206.153v-113.847z" />
|
||||
<glyph unicode="" glyph-name="cube" horiz-adv-x="951" d="M512.001-97.842l365.714 199.429v363.429l-365.714-133.143v-429.714zM475.43 396.444l398.857 145.143-398.857 145.143-398.857-145.143zM950.858 540.444v-438.857c0-26.857-14.857-51.429-38.286-64l-402.286-219.429c-10.857-6.286-22.857-9.143-34.857-9.143s-24 2.857-34.857 9.143l-402.286 219.429c-23.429 12.571-38.286 37.143-38.286 64v438.857c0 30.857 19.429 58.286 48 68.571l402.286 146.286c8 2.857 16.571 4.571 25.143 4.571s17.143-1.714 25.143-4.571l402.286-146.286c28.571-10.286 48-37.714 48-68.571z" />
|
||||
<glyph unicode="" glyph-name="folder-account" d="M870.4 28.445h-409.6v51.199c0 68.095 136.705 102.4 204.8 102.4s204.8-34.305 204.8-102.4zM665.598 438.042c56.32 0 102.4-46.080 102.4-102.4s-46.080-102.4-102.4-102.4c-56.32 0-102.4 46.080-102.4 102.4 0 56.831 46.080 102.4 102.4 102.4zM921.6 591.645h-409.6l-102.4 102.4h-307.201c-56.831 0-102.4-45.568-102.4-102.4v-614.398c0-56.32 46.080-102.4 102.4-102.4h819.199c56.32 0 102.4 46.080 102.4 102.4v511.999c0 56.831-46.080 102.4-102.4 102.4z" />
|
||||
<glyph unicode="" glyph-name="stack" d="M1024 476.444l-512 256-512-256 512-256 512 256zM512 647.474l342.058-171.030-342.058-171.030-342.058 171.030 342.058 171.030zM921.444 335.722l102.556-51.278-512-256-512 256 102.556 51.278 409.444-204.722zM921.444 143.722l102.556-51.278-512-256-512 256 102.556 51.278 409.444-204.722z" />
|
||||
<glyph unicode="" glyph-name="folder" horiz-adv-x="951" d="M950.857 449.015v-402.286c0-70.286-57.714-128-128-128h-694.857c-70.286 0-128 57.714-128 128v548.571c0 70.286 57.714 128 128 128h182.857c70.286 0 128-57.714 128-128v-18.286h384c70.286 0 128-57.714 128-128z" />
|
||||
<glyph unicode="" glyph-name="folder-o" horiz-adv-x="951" d="M877.714 46.73v402.286c0 30.286-24.571 54.857-54.857 54.857h-402.286c-30.286 0-54.857 24.571-54.857 54.857v36.571c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-548.571c0-30.286 24.571-54.857 54.857-54.857h694.857c30.286 0 54.857 24.571 54.857 54.857zM950.857 449.015v-402.286c0-70.286-57.714-128-128-128h-694.857c-70.286 0-128 57.714-128 128v548.571c0 70.286 57.714 128 128 128h182.857c70.286 0 128-57.714 128-128v-18.286h384c70.286 0 128-57.714 128-128z" />
|
||||
<glyph unicode="" glyph-name="folder-open-o" horiz-adv-x="1091" d="M1017.714 264.444c0 16-17.714 20-30.286 20h-621.714c-30.286 0-70.286-18.857-89.714-42.286l-168-207.429c-5.143-6.857-10.286-14.286-10.286-22.857 0-16 17.714-20 30.286-20h621.714c30.286 0 70.286 18.857 89.714 42.857l168 207.429c5.143 6.286 10.286 13.714 10.286 22.286zM365.714 357.587h438.857v91.429c0 30.286-24.571 54.857-54.857 54.857h-329.143c-30.286 0-54.857 24.571-54.857 54.857v36.571c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-487.429l146.286 180c33.143 40.571 94.286 69.714 146.286 69.714zM1090.857 264.444c0-25.143-10.857-49.143-26.286-68.571l-168.571-207.429c-32.571-40-94.857-69.714-146.286-69.714h-621.714c-70.286 0-128 57.714-128 128v548.571c0 70.286 57.714 128 128 128h182.857c70.286 0 128-57.714 128-128v-18.286h310.857c70.286 0 128-57.714 128-128v-91.429h109.714c38.857 0 77.714-17.714 94.857-54.286 5.714-12 8.571-25.143 8.571-38.857z" />
|
||||
<glyph unicode="" glyph-name="folder-open" horiz-adv-x="1074" d="M1073.714 252.444c0-13.714-8.571-27.429-17.714-37.714l-192-226.286c-33.143-38.857-100.571-69.714-150.857-69.714h-621.714c-20.571 0-49.714 6.286-49.714 32 0 13.714 8.571 27.429 17.714 37.714l192 226.286c33.143 38.857 100.571 69.714 150.857 69.714h621.714c20.571 0 49.714-6.286 49.714-32zM877.714 449.015v-91.429h-475.429c-71.429 0-160-40.571-206.286-95.429l-195.429-229.714c0 4.571-0.571 9.714-0.571 14.286v548.571c0 70.286 57.714 128 128 128h182.857c70.286 0 128-57.714 128-128v-18.286h310.857c70.286 0 128-57.714 128-128z" />
|
||||
<glyph unicode="" glyph-name="folder" d="M409.598 694.045h-307.201c-56.831 0-102.4-45.568-102.4-102.4v-614.398c0-56.32 46.080-102.4 102.4-102.4h819.199c56.32 0 102.4 46.080 102.4 102.4v511.999c0 56.831-46.080 102.4-102.4 102.4h-409.601l-102.4 102.4z" />
|
||||
<glyph unicode="" glyph-name="folder-o" horiz-adv-x="951" d="M877.714 46.729v402.286c0 30.288-24.572 54.857-54.857 54.857h-402.286c-30.288 0-54.857 24.572-54.857 54.857v36.571c0 30.288-24.572 54.857-54.857 54.857h-182.858c-30.288 0-54.857-24.572-54.857-54.857v-548.573c0-30.288 24.572-54.857 54.857-54.857h694.859c30.288 0 54.857 24.572 54.857 54.857zM950.859 449.016v-402.286c0-70.286-57.714-128.002-128.002-128.002h-694.859c-70.286 0-128.002 57.714-128.002 128.002v548.573c0 70.286 57.714 128.002 128.002 128.002h182.858c70.286 0 128.002-57.714 128.002-128.002v-18.286h383.999c70.286 0 128.002-57.714 128.002-128.002z" />
|
||||
<glyph unicode="" glyph-name="folder-open-o" horiz-adv-x="1091" d="M1017.716 227.873c0 16.001-17.715 20.001-30.288 20.001h-621.719c-30.288 0-70.286-18.858-89.716-42.286l-168-207.429c-5.142-6.856-10.287-14.286-10.287-22.858 0-16.001 17.715-20.001 30.288-20.001h621.719c30.288 0 70.286 18.858 89.716 42.858l168 207.429c5.142 6.287 10.287 13.713 10.287 22.285zM365.71 321.016h438.862v91.429c0 30.288-24.572 54.856-54.856 54.856h-329.145c-30.288 0-54.856 24.572-54.856 54.856v36.57c0 30.288-24.572 54.856-54.856 54.856h-182.859c-30.288 0-54.856-24.572-54.856-54.856v-487.432l146.288 180.002c33.145 40.57 94.286 69.715 146.288 69.715zM1090.859 227.873c0-25.142-10.856-49.142-26.285-68.573l-168.573-207.429c-32.571-40.001-94.859-69.715-146.288-69.715h-621.719c-70.286 0-128.001 57.713-128.001 128.001v548.576c0 70.286 57.713 128.001 128.001 128.001h182.859c70.286 0 128.001-57.713 128.001-128.001v-18.286h310.859c70.286 0 128.001-57.713 128.001-128.001v-91.429h109.714c38.858 0 77.715-17.715 94.859-54.288 5.714-12.001 8.571-25.142 8.571-38.858z" />
|
||||
<glyph unicode="" glyph-name="folder-open" d="M820.743-101.788h-724.187c-53.589 0-96.558 43.451-96.558 96.558v579.346c0 53.589 42.969 96.558 96.558 96.558h289.676l96.558-96.558h337.953c53.107 0 96.558-43.451 96.558-96.558v0h-820.743v-482.789l103.318 386.232h824.123l-110.074-410.373c-11.103-42.004-48.762-72.42-93.18-72.42z" />
|
||||
<glyph unicode="" glyph-name="bars" d="M113.776 682.668h796.444v-113.778h-796.444v113.778zM113.776 341.333h796.444v-113.778h-796.444v113.778zM113.776-0.002h796.444v-113.778h-796.444v113.778z" />
|
||||
<glyph unicode="" glyph-name="cards-view" d="M170.667 682.666h284.444v-341.333h-341.333v284.444c0 31.419 25.47 56.889 56.889 56.889zM113.778 227.555h341.333v-341.333h-284.444c-31.419 0-56.889 25.47-56.889 56.889v284.444zM568.889 682.666h284.444c31.419 0 56.889-25.47 56.889-56.889v-284.444h-341.333v341.333zM568.889 227.555h341.333v-284.444c0-31.419-25.47-56.889-56.889-56.889h-284.444v341.333z" />
|
||||
<glyph unicode="" glyph-name="star-empty" d="M470.699 732.995l0.544-0.792c-0.184 0.262-0.365 0.526-0.544 0.792zM77.153 423.114l0.508-0.728c-0.167 0.244-0.336 0.487-0.508 0.728zM200.729-145.098l0.941 0.325c-0.315-0.105-0.629-0.213-0.941-0.325zM824.385-145.389c-0.338 0.12-0.676 0.237-1.014 0.35l1.014-0.35zM757.134-190.319l-0.003 0.953c-0.003-0.318-0.002-0.636 0.003-0.953zM644.954 479.437l-132.36 192.597-148.368-215.689-251.154-84.722 155.067-222.304-0.080-26.96-0.725-244.475 244.818 84.478 244.785-84.475-0.794 271.434 155.064 222.292-250.146 84.389zM841.552 122.612l0.915-312.681c0.18-12.182-5.080-22.937-13.389-29.807-11.038-7.887-22.398-9.799-33.372-5.883l-283.557 97.851-283.585-97.855c-10.969-3.918-22.318-2.005-31.082 4.146-10.595 8.595-15.848 19.364-15.681 31.547l0.923 312.681-175.56 251.683c-6.94 9.732-8.716 21.66-5.859 32.304 4.526 13.219 12.658 21.795 23.75 25.386l284.967 96.134 173.667 252.467c6.679 9.949 16.966 15.422 27.534 15.858 13.34-0.428 23.602-5.89 30.286-15.831l173.77-252.844 283.926-95.786c11.092-3.585 19.228-12.167 22.879-22.577 3.737-13.442 1.965-25.367-4.973-35.116l-175.56-251.68z" />
|
||||
@@ -109,6 +109,16 @@
|
||||
<glyph unicode="" glyph-name="chart-pie" d="M967.112 335.012h-404.543v404.543c223.511 0 404.543-181.033 404.543-404.543zM865.976 233.876c0-140.579-71.807-264.471-180.527-337.288l-194.687 337.288h375.214zM461.432-170.668c-140.579 0-264.471 71.807-337.288 180.527l328.185 189.629 189.124-328.185c-53.603-26.801-115.295-41.971-180.022-41.971zM56.888 233.876c0 223.511 181.033 404.543 404.543 404.543v-375.214l-362.571-209.352c-26.801 53.603-41.971 115.295-41.971 180.022z" />
|
||||
<glyph unicode="" glyph-name="chart-line" d="M691.516 294.318l190.287 328.964 77.64-44.879-234.719-406.155-292.162 168.296-214.072-370.252h742.299v-89.758h-897.58v807.822h89.758v-652.54l246.835 428.146 291.714-169.642z" />
|
||||
<glyph unicode="" glyph-name="chart-bar" d="M960.791-119.47h-897.58v807.822h89.758v-718.065h89.758v403.914h179.516v-403.914h89.758v583.43h179.516v-583.43h89.758v224.397h179.516v-314.155z" />
|
||||
<glyph unicode="" glyph-name="restart" d="M512.158 564.412c90.579 0 180.724-34.025 249.653-102.953 138.305-138.305 137.858-360.999-0.443-499.746-80.858-82.187-191.768-114.883-297.372-100.748l23.42 86.603c75.561-7.073 154.208 18.56 212.093 76.443 103.397 103.397 103.397 271.301 0 374.697-52.14 52.14-119.746 77.327-187.35 77.327v-202.373l-219.164 218.723 219.164 218.723v-146.697zM262.062-38.728c-116.649 117.096-134.327 293.841-54.353 429.050l65.393-64.956c-48.163-98.536-30.046-220.045 51.257-301.352 22.976-22.976 49.493-41.093 77.327-53.904l-22.091-86.166c-44.184 17.678-83.069 42.863-117.533 77.327z" />
|
||||
<glyph unicode="" glyph-name="history" d="M590.559 441.565h-58.919v-196.404l168.119-99.77 28.282 47.531-137.48 81.702v166.942zM570.92 637.969c-195.222 0-353.525-158.299-353.525-353.525h-117.841l155.55-158.299 158.694 158.299h-117.841c0 152.016 122.951 274.964 274.964 274.964s274.964-122.951 274.964-274.964c0-152.016-122.951-274.964-274.964-274.964-75.81 0-144.55 31.030-194.041 80.916l-55.777-55.777c64.027-64.42 151.622-103.699 249.821-103.699 195.222 0 353.525 158.299 353.525 353.525s-158.299 353.525-353.525 353.525z" />
|
||||
<glyph unicode="" glyph-name="folder-move" d="M614.398-22.758v153.598h-204.8v204.8h204.8v153.598l255.999-255.999zM921.6 591.646h-409.6l-102.4 102.4h-307.202c-56.831 0-102.4-45.569-102.4-102.4v-614.398c0-56.32 46.080-102.4 102.4-102.4h819.2c56.32 0 102.4 46.080 102.4 102.4v511.999c0 56.831-46.080 102.4-102.4 102.4z" />
|
||||
<glyph unicode="" glyph-name="folder-plus" d="M409.601 694.045l102.4-102.4h409.601c56.32 0 102.4-46.080 102.4-102.4v-511.999c0-56.32-46.080-102.4-102.4-102.4h-819.199c-56.831 0-102.4 46.080-102.4 102.4v614.398c0 56.831 45.568 102.4 102.4 102.4h307.201zM665.6 438.042v-153.598h-153.598v-102.4h153.598v-153.598h102.4v153.598h153.598v102.4h-153.598v153.598h-102.4z" />
|
||||
<glyph unicode="" glyph-name="folder-upload" d="M921.6 591.645c56.32 0 102.4-46.080 102.4-102.4v-511.999c0-56.32-46.080-102.4-102.4-102.4h-819.2c-56.32 0-102.4 46.080-102.4 102.4v614.398c0 56.32 46.080 102.4 102.4 102.4h307.201l102.4-102.4h409.6zM448 233.245h166.399v-204.801h102.4v204.801h166.399l-217.6 217.6z" />
|
||||
<glyph unicode="" glyph-name="folder-star" d="M921.6 591.645h-409.6l-102.4 102.4h-307.201c-56.32 0-102.4-46.080-102.4-102.4v-614.398c0-56.32 46.080-102.4 102.4-102.4h819.199c56.32 0 102.4 46.080 102.4 102.4v511.999c0 56.32-46.080 102.4-102.4 102.4zM816.126 28.445l-150.529 88.063-150.529-88.063 39.937 170.496-132.607 114.688 174.592 14.848 68.608 160.768 68.608-160.768 174.592-14.848-132.607-114.688 39.937-170.496z" />
|
||||
<glyph unicode="" glyph-name="folder-edit" d="M93.666 682.523c-51.985 0-93.664-41.682-93.664-93.664v-561.993c0-51.516 42.149-93.664 93.664-93.664h374.662v88.513l468.328 468.328v5.151c0 51.985-42.149 93.664-93.664 93.664h-374.662l-93.664 93.664h-280.997zM938.53 348.603c-6.556 0-13.114-2.809-18.265-7.96l-46.835-46.835 96.009-96.009 46.835 46.835c10.305 9.834 10.305 26.226 0 36.060l-59.947 59.947c-5.151 5.151-11.241 7.96-17.794 7.96zM846.267 266.648l-284.275-283.808v-96.474h96.474l283.808 284.275-96.009 96.009z" />
|
||||
<glyph unicode="" glyph-name="folder-download" d="M921.6 591.645c56.32 0 102.4-46.080 102.4-102.4v-511.999c0-56.32-46.080-102.4-102.4-102.4h-819.2c-56.831 0-102.4 46.080-102.4 102.4v614.398c0 56.831 45.568 102.4 102.4 102.4h307.201l102.4-102.4h409.6zM883.199 233.245h-166.399v204.801h-102.4v-204.801h-166.399l217.6-217.6z" />
|
||||
<glyph unicode="" glyph-name="folder-outline" d="M921.6-22.757h-819.199v511.999h819.199zM921.6 591.645h-409.6l-102.4 102.4h-307.201c-56.831 0-102.4-45.568-102.4-102.4v-614.398c0-56.32 46.080-102.4 102.4-102.4h819.199c56.32 0 102.4 46.080 102.4 102.4v511.999c0 56.831-46.080 102.4-102.4 102.4z" />
|
||||
<glyph unicode="" glyph-name="cube" d="M921.598 79.645c0-17.293-9.56-32.312-24.12-40.050l-359.537-202.071c-7.283-5.464-16.384-8.192-25.944-8.192s-18.661 2.728-25.944 8.192l-359.537 202.071c-14.565 7.736-24.12 22.757-24.12 40.050v409.598c0 17.293 9.56 32.312 24.12 40.050l359.537 202.071c7.283 5.464 16.384 8.192 25.944 8.192s18.661-2.728 25.944-8.192l359.537-202.071c14.565-7.736 24.12-22.757 24.12-40.050v-409.598zM512 641.702l-271.243-152.459 271.243-152.459 271.243 152.459-271.243 152.459zM193.423 106.498l273.064-153.827v305.378l-273.064 153.37v-304.921zM830.577 106.498v304.921l-273.064-153.37v-305.378l273.064 153.827z" />
|
||||
<glyph unicode="" glyph-name="spinner-indicator" d="M416-131.556c0 53.020 42.98 96 96 96s96-42.98 96-96c0-53.020-42.98-96-96-96s-96 42.98-96 96zM0 284.444c0 53.020 42.982 96 96 96s96-42.98 96-96c0-53.020-42.98-96-96-96s-96 42.98-96 96zM832 284.444c0 53.020 42.98 96 96 96s96-42.98 96-96c0-53.020-42.98-96-96-96s-96 42.98-96 96zM121.844 578.6c0 53.020 42.98 96 96 96s96-42.98 96-96c0-53.020-42.98-96-96-96s-96 42.98-96 96zM710.156-9.712c0 53.020 42.98 96 96 96s96-42.98 96-96c0-53.020-42.98-96-96-96s-96 42.98-96 96zM121.844-9.712c0 53.020 42.98 96 96 96s96-42.98 96-96c0-53.020-42.98-96-96-96s-96 42.98-96 96zM710.156 578.6c0 53.020 42.98 96 96 96s96-42.98 96-96c0-53.020-42.98-96-96-96s-96 42.98-96 96z" />
|
||||
<glyph unicode="" glyph-name="caret-down" d="M821.728 419.95c0-10.284-4.235-19.964-11.494-27.223l-271.013-271.013c-7.26-7.26-16.939-11.494-27.223-11.494s-19.964 4.235-27.223 11.494l-271.013 271.013c-7.26 7.26-11.494 16.939-11.494 27.223 0 21.172 17.543 38.715 38.715 38.715h542.025c21.172 0 38.715-17.543 38.715-38.715z" />
|
||||
<glyph unicode="" glyph-name="caret-up" d="M821.728 148.938c0-21.172-17.543-38.715-38.715-38.715h-542.026c-21.172 0-38.715 17.543-38.715 38.715 0 10.283 4.235 19.964 11.494 27.223l271.013 271.013c7.26 7.26 16.939 11.494 27.223 11.494s19.964-4.235 27.223-11.494l271.013-271.013c7.26-7.26 11.494-16.939 11.494-27.223z" />
|
||||
|
||||
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 70 KiB |
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user