* Code for task #41775.
This commit is contained in:
@@ -114,7 +114,7 @@ $lang->my->dividerMenu = ',work,dynamic,';
|
||||
/* Program menu. */
|
||||
$lang->program->homeMenu = new stdclass();
|
||||
$lang->program->homeMenu->browse = array('link' => "{$lang->program->list}|program|browse|", 'alias' => 'create,edit');
|
||||
$lang->program->homeMenu->kanban = array('link' => "{$lang->program->kanban}|program|kanban|", 'alias' => 'create,edit');
|
||||
$lang->program->homeMenu->kanban = array('link' => "{$lang->program->kanban}|program|kanban|");
|
||||
|
||||
$lang->program->menu = new stdclass();
|
||||
$lang->program->menu->product = array('link' => "{$lang->product->common}|program|product|programID=%s", 'alias' => 'view');
|
||||
|
||||
@@ -162,6 +162,7 @@ if($config->systemMode == 'new')
|
||||
/* Program. */
|
||||
$lang->resource->program = new stdclass();
|
||||
$lang->resource->program->browse = 'browse';
|
||||
$lang->resource->program->kanban = 'kanbanAction';
|
||||
$lang->resource->program->view = 'view';
|
||||
$lang->resource->program->product = 'product';
|
||||
$lang->resource->program->create = 'create';
|
||||
@@ -180,25 +181,26 @@ if($config->systemMode == 'new')
|
||||
$lang->resource->program->export = 'export';
|
||||
$lang->resource->program->updateOrder = 'updateOrder';
|
||||
|
||||
$lang->program->methodOrder[5] = 'browse';
|
||||
$lang->program->methodOrder[10] = 'view';
|
||||
$lang->program->methodOrder[15] = 'product';
|
||||
$lang->program->methodOrder[20] = 'create';
|
||||
$lang->program->methodOrder[25] = 'edit';
|
||||
$lang->program->methodOrder[30] = 'view';
|
||||
$lang->program->methodOrder[35] = 'start';
|
||||
$lang->program->methodOrder[40] = 'suspend';
|
||||
$lang->program->methodOrder[45] = 'activate';
|
||||
$lang->program->methodOrder[50] = 'close';
|
||||
$lang->program->methodOrder[55] = 'delete';
|
||||
$lang->program->methodOrder[60] = 'project';
|
||||
$lang->program->methodOrder[65] = 'stakeholder';
|
||||
$lang->program->methodOrder[70] = 'createStakeholder';
|
||||
$lang->program->methodOrder[75] = 'unlinkStakeholder';
|
||||
$lang->program->methodOrder[80] = 'batchUnlinkStakeholders';
|
||||
$lang->program->methodOrder[85] = 'unbindWhitelist';
|
||||
$lang->program->methodOrder[90] = 'export';
|
||||
$lang->program->methodOrder[95] = 'updateOrder';
|
||||
$lang->program->methodOrder[5] = 'browse';
|
||||
$lang->program->methodOrder[10] = 'kanban';
|
||||
$lang->program->methodOrder[15] = 'view';
|
||||
$lang->program->methodOrder[20] = 'product';
|
||||
$lang->program->methodOrder[25] = 'create';
|
||||
$lang->program->methodOrder[30] = 'edit';
|
||||
$lang->program->methodOrder[35] = 'view';
|
||||
$lang->program->methodOrder[40] = 'start';
|
||||
$lang->program->methodOrder[45] = 'suspend';
|
||||
$lang->program->methodOrder[50] = 'activate';
|
||||
$lang->program->methodOrder[55] = 'close';
|
||||
$lang->program->methodOrder[60] = 'delete';
|
||||
$lang->program->methodOrder[65] = 'project';
|
||||
$lang->program->methodOrder[70] = 'stakeholder';
|
||||
$lang->program->methodOrder[75] = 'createStakeholder';
|
||||
$lang->program->methodOrder[80] = 'unlinkStakeholder';
|
||||
$lang->program->methodOrder[85] = 'batchUnlinkStakeholders';
|
||||
$lang->program->methodOrder[90] = 'unbindWhitelist';
|
||||
$lang->program->methodOrder[95] = 'export';
|
||||
$lang->program->methodOrder[100] = 'updateOrder';
|
||||
|
||||
/* Project. */
|
||||
$lang->resource->project = new stdclass();
|
||||
|
||||
@@ -69,6 +69,9 @@ class program extends control
|
||||
|
||||
public function kanban()
|
||||
{
|
||||
$this->app->loadLang('release');
|
||||
|
||||
$this->view->title = $this->lang->program->kanban->common;
|
||||
$this->view->kanbanGroup = $this->program->getKanbanGroup();
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
.main-table .table {cursor: default;}
|
||||
.main-table .table td {background: #f5f5f5;}
|
||||
|
||||
.lane-name {overflow: hidden; text-overflow: ellipsis}
|
||||
|
||||
.board-item {border: 1px solid #EBEBEB; padding: 5px 10px; cursor: default; border-radius: 2px; background-color: #fff;}
|
||||
.board-item:hover {border-color: #ccc;}
|
||||
.board-item + .board-item {margin-top: 10px;}
|
||||
@@ -11,4 +13,14 @@
|
||||
#kanban thead > tr:first-child > th:not(:first-child) {border-right: 3px solid #fff; border-bottom: 3px solid #fff;}
|
||||
#kanban thead > tr:last-child > th {border: 3px solid #fff;}
|
||||
|
||||
.doing-td, .wait-project, .normal-plan, .normal-release {vertical-align: top !important;}
|
||||
|
||||
.doing-td > .board-doing > .table-row+.table-row {margin-top: 10px;}
|
||||
|
||||
.board-doing-project {padding-right: 6px}
|
||||
.board-doing-execution{padding-left: 6px}
|
||||
.board-doing-project .table-row .table-col:last-child, .c-progress {width: 30px;}
|
||||
.board-doing-execution .table-row .table-col:last-child, .c-progress {width: 30px;}
|
||||
.table-row .table-col:first-child {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
|
||||
.table-grouped tbody > tr > td:first-child, .table-grouped thead > tr > th:first-child {padding-left: 3px;}
|
||||
|
||||
@@ -24,6 +24,7 @@ $lang->program->create = 'Create Program';
|
||||
$lang->program->createGuide = 'Select Template';
|
||||
$lang->program->edit = 'Edit Program';
|
||||
$lang->program->browse = 'Programs';
|
||||
$lang->program->kanbanAction = 'Kanban';
|
||||
$lang->program->product = 'Products';
|
||||
$lang->program->project = 'Program Project List';
|
||||
$lang->program->all = 'All Programs';
|
||||
@@ -95,3 +96,17 @@ $lang->program->statusList['suspended'] = 'Suspended';
|
||||
$lang->program->statusList['closed'] = 'Closed';
|
||||
|
||||
$lang->program->featureBar['all'] = 'All';
|
||||
|
||||
$lang->program->kanban = new stdclass();
|
||||
$lang->program->kanban->common = 'Program Kanban';
|
||||
$lang->program->kanban->typeList['my'] = 'My Programs';
|
||||
$lang->program->kanban->typeList['others'] = 'Others';
|
||||
|
||||
$lang->program->kanban->openProducts = 'Open Products';
|
||||
$lang->program->kanban->unexpiredPlans = 'Unexpired Plans';
|
||||
$lang->program->kanban->waitingProjects = 'Waiting Projects';
|
||||
$lang->program->kanban->doingProjects = 'Ongoing Projects';
|
||||
$lang->program->kanban->doingExecutions = 'Ongoing Executions';
|
||||
$lang->program->kanban->normalReleases = 'Normal Releases';
|
||||
|
||||
$lang->program->kanban->laneColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#FFC20E', '#00A78E', '#7FBB00', '#424BAC', '#C0E9FF', '#EC2761');
|
||||
|
||||
@@ -36,6 +36,7 @@ $lang->program->create = 'Create Program';
|
||||
$lang->program->createGuide = 'Select Template';
|
||||
$lang->program->edit = 'Edit Program';
|
||||
$lang->program->browse = 'Programs';
|
||||
$lang->program->kanbanAction = 'Kanban';
|
||||
$lang->program->view = 'Program Detail';
|
||||
$lang->program->copy = 'Copy Program';
|
||||
$lang->program->product = 'Products';
|
||||
@@ -118,3 +119,17 @@ $lang->program->statusList['suspended'] = 'Suspended';
|
||||
$lang->program->statusList['closed'] = 'Closed';
|
||||
|
||||
$lang->program->featureBar['all'] = 'All';
|
||||
|
||||
$lang->program->kanban = new stdclass();
|
||||
$lang->program->kanban->common = 'Program Kanban';
|
||||
$lang->program->kanban->typeList['my'] = 'My Programs';
|
||||
$lang->program->kanban->typeList['others'] = 'Others';
|
||||
|
||||
$lang->program->kanban->openProducts = 'Open Products';
|
||||
$lang->program->kanban->unexpiredPlans = 'Unexpired Plans';
|
||||
$lang->program->kanban->waitingProjects = 'Waiting Projects';
|
||||
$lang->program->kanban->doingProjects = 'Ongoing Projects';
|
||||
$lang->program->kanban->doingExecutions = 'Ongoing Executions';
|
||||
$lang->program->kanban->normalReleases = 'Normal Releases';
|
||||
|
||||
$lang->program->kanban->laneColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#FFC20E', '#00A78E', '#7FBB00', '#424BAC', '#C0E9FF', '#EC2761');
|
||||
|
||||
@@ -24,6 +24,7 @@ $lang->program->create = 'Create Program';
|
||||
$lang->program->createGuide = 'Select Template';
|
||||
$lang->program->edit = 'Edit Program';
|
||||
$lang->program->browse = 'Programs';
|
||||
$lang->program->kanbanAction = 'Kanban';
|
||||
$lang->program->product = 'Products';
|
||||
$lang->program->project = 'Program Project List';
|
||||
$lang->program->all = 'All Programs';
|
||||
@@ -95,3 +96,17 @@ $lang->program->statusList['suspended'] = 'Suspended';
|
||||
$lang->program->statusList['closed'] = 'Closed';
|
||||
|
||||
$lang->program->featureBar['all'] = 'All';
|
||||
|
||||
$lang->program->kanban = new stdclass();
|
||||
$lang->program->kanban->common = 'Program Kanban';
|
||||
$lang->program->kanban->typeList['my'] = 'My Programs';
|
||||
$lang->program->kanban->typeList['others'] = 'Others';
|
||||
|
||||
$lang->program->kanban->openProducts = 'Open Products';
|
||||
$lang->program->kanban->unexpiredPlans = 'Unexpired Plans';
|
||||
$lang->program->kanban->waitingProjects = 'Waiting Projects';
|
||||
$lang->program->kanban->doingProjects = 'Ongoing Projects';
|
||||
$lang->program->kanban->doingExecutions = 'Ongoing Executions';
|
||||
$lang->program->kanban->normalReleases = 'Normal Releases';
|
||||
|
||||
$lang->program->kanban->laneColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#FFC20E', '#00A78E', '#7FBB00', '#424BAC', '#C0E9FF', '#EC2761');
|
||||
|
||||
@@ -24,6 +24,7 @@ $lang->program->create = 'Create Program';
|
||||
$lang->program->createGuide = 'Select Template';
|
||||
$lang->program->edit = 'Edit Program';
|
||||
$lang->program->browse = 'Programs';
|
||||
$lang->program->kanbanAction = 'Kanban';
|
||||
$lang->program->product = 'Products';
|
||||
$lang->program->project = 'Program Project List';
|
||||
$lang->program->all = 'All Programs';
|
||||
@@ -95,3 +96,17 @@ $lang->program->statusList['suspended'] = 'Suspended';
|
||||
$lang->program->statusList['closed'] = 'Closed';
|
||||
|
||||
$lang->program->featureBar['all'] = 'All';
|
||||
|
||||
$lang->program->kanban = new stdclass();
|
||||
$lang->program->kanban->common = 'Program Kanban';
|
||||
$lang->program->kanban->typeList['my'] = 'My Programs';
|
||||
$lang->program->kanban->typeList['others'] = 'Others';
|
||||
|
||||
$lang->program->kanban->openProducts = 'Open Products';
|
||||
$lang->program->kanban->unexpiredPlans = 'Unexpired Plans';
|
||||
$lang->program->kanban->waitingProjects = 'Waiting Projects';
|
||||
$lang->program->kanban->doingProjects = 'Ongoing Projects';
|
||||
$lang->program->kanban->doingExecutions = 'Ongoing Executions';
|
||||
$lang->program->kanban->normalReleases = 'Normal Releases';
|
||||
|
||||
$lang->program->kanban->laneColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#FFC20E', '#00A78E', '#7FBB00', '#424BAC', '#C0E9FF', '#EC2761');
|
||||
|
||||
@@ -36,6 +36,7 @@ $lang->program->create = '添加项目集';
|
||||
$lang->program->createGuide = '选择项目模板';
|
||||
$lang->program->edit = '编辑项目集';
|
||||
$lang->program->browse = '项目集列表';
|
||||
$lang->program->kanbanAction = '项目集看板';
|
||||
$lang->program->view = '项目集详情';
|
||||
$lang->program->copy = '复制项目集';
|
||||
$lang->program->product = '产品列表';
|
||||
@@ -117,12 +118,13 @@ $lang->program->statusList['closed'] = '已关闭';
|
||||
$lang->program->featureBar['all'] = '所有';
|
||||
|
||||
$lang->program->kanban = new stdclass();
|
||||
$lang->program->kanban->common = '项目集看板';
|
||||
$lang->program->kanban->typeList['my'] = '我参与的项目集';
|
||||
$lang->program->kanban->typeList['others'] = '其他项目集';
|
||||
|
||||
$lang->program->kanban->activeProducts = '未关闭的产品';
|
||||
$lang->program->kanban->activePlans = '未过期的计划';
|
||||
$lang->program->kanban->waitProjects = '未开始的项目';
|
||||
$lang->program->kanban->openProducts = '未关闭的产品';
|
||||
$lang->program->kanban->unexpiredPlans = '未过期的计划';
|
||||
$lang->program->kanban->waitingProjects = '未开始的项目';
|
||||
$lang->program->kanban->doingProjects = '进行中的项目';
|
||||
$lang->program->kanban->doingExecutions = '进行中的执行';
|
||||
$lang->program->kanban->normalReleases = '正常的发布';
|
||||
|
||||
@@ -188,7 +188,7 @@ class programModel extends model
|
||||
->fetchGroup('product');
|
||||
|
||||
/* Get all products linked projects and executions. */
|
||||
$projectGroup = $this->dao->select('t1.product, t2.id, t2.name, t2.status')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
$projectGroup = $this->dao->select('t1.product, t2.id, t2.name, t2.status, t2.end')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')
|
||||
->on('t1.project = t2.id')
|
||||
->where('t2.deleted')->eq(0)
|
||||
@@ -203,22 +203,15 @@ class programModel extends model
|
||||
foreach($projects as $project) $projectPairs[$project->id] = $project->id;
|
||||
}
|
||||
|
||||
$tasks = $this->dao->select('id, project, estimate, consumed, `left`, status, closedReason, execution')
|
||||
->from(TABLE_TASK)
|
||||
->where('project')->in($projectPairs)
|
||||
->andWhere('parent')->lt(1)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->fetchGroup('project', 'id');
|
||||
|
||||
$projectHours = $this->computeProgress($tasks);
|
||||
|
||||
$releases = $this->dao->select('product, id, name')->from(TABLE_RELEASE)
|
||||
/* Get all releases under products. */
|
||||
$releases = $this->dao->select('product, id, name, marker')->from(TABLE_RELEASE)
|
||||
->where('product')->in($productPairs)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->andWhere('status')->eq('normal')
|
||||
->fetchGroup('product');
|
||||
|
||||
$doingExecutions = $this->dao->select('id, project, name')->from(TABLE_EXECUTION)
|
||||
/* Get doing executions. */
|
||||
$doingExecutions = $this->dao->select('id, project, name, end')->from(TABLE_EXECUTION)
|
||||
->where('type')->in('sprint,stage')
|
||||
->andWhere('status')->eq('doing')
|
||||
->andWhere('deleted')->eq(0)
|
||||
@@ -228,15 +221,19 @@ class programModel extends model
|
||||
$executionPairs = array();
|
||||
foreach($doingExecutions as $execution) $executionPairs[$execution->id] = $execution->id;
|
||||
|
||||
/* Compute executions and projects progress. */
|
||||
$tasks = $this->dao->select('id, project, estimate, consumed, `left`, status, closedReason, execution')
|
||||
->from(TABLE_TASK)
|
||||
->where('execution')->in($executionPairs)
|
||||
->where('(execution')->in($executionPairs)
|
||||
->orWhere('project')->in($projectPairs)
|
||||
->markRight(1)
|
||||
->andWhere('parent')->lt(1)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->fetchGroup('execution', 'id');
|
||||
|
||||
$executionHours = $this->computeProgress($tasks);
|
||||
$hours = $this->computeProgress($tasks);
|
||||
|
||||
/* Group data. */
|
||||
foreach($productGroup as $programID => $products)
|
||||
{
|
||||
foreach($products as $productID => $product)
|
||||
@@ -246,18 +243,25 @@ class programModel extends model
|
||||
$projects = zget($projectGroup, $productID, array());
|
||||
foreach($projects as $project)
|
||||
{
|
||||
if(helper::diffDate(helper::today(), $project->end) > 0) $project->delay = 1;
|
||||
|
||||
$status = $project->status == 'wait' ? 'wait' : 'doing';
|
||||
$execution = zget($doingExecutions, $project->id, array());
|
||||
if(!empty($execution)) $execution->hours = zget($executionHours, $execution->id, array());
|
||||
|
||||
if(!empty($execution))
|
||||
{
|
||||
$execution->hours = zget($hours, $execution->id, array());
|
||||
if(helper::diffDate(helper::today(), $execution->end) > 0) $execution->delay = 1;
|
||||
}
|
||||
|
||||
$project->execution = $execution;
|
||||
$project->hours = zget($projectHours, $project->id, array());
|
||||
$project->hours = zget($hours, $project->id, array());
|
||||
$product->projects[$status][] = $project;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//区分出其他项目集
|
||||
/* Group data. */
|
||||
foreach($programs as $programID => $program)
|
||||
{
|
||||
$program->products = zget($productGroup, $programID, array());
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th rowspan='2' class='w-20px' style='background: #32C5FF; border-bottom: none'></th>
|
||||
<th rowspan='2'><?php echo $lang->program->kanban->activeProducts;?></th>
|
||||
<th rowspan='2'><?php echo $lang->program->kanban->activePlans;?></th>
|
||||
<th rowspan='2'><?php echo $lang->program->kanban->waitProjects;?></th>
|
||||
<th rowspan='2'><?php echo $lang->program->kanban->openProducts;?></th>
|
||||
<th rowspan='2'><?php echo $lang->program->kanban->unexpiredPlans;?></th>
|
||||
<th rowspan='2'><?php echo $lang->program->kanban->waitingProjects;?></th>
|
||||
<th colspan='2'><?php echo $lang->program->statusList['doing'];?></th>
|
||||
<th rowspan='2'><?php echo $lang->program->kanban->normalReleases;?></th>
|
||||
</tr>
|
||||
@@ -35,13 +35,13 @@
|
||||
<tbody>
|
||||
<?php foreach($programGroup as $programID => $program):?>
|
||||
<tr>
|
||||
<td style='background: <?php echo $lang->program->kanban->laneColorList[$colorIndex];?>; color: #fff; border-right: none;' rowspan='<?php echo count($program->products);?>'><?php echo $program->name;?></td>
|
||||
<td class='lane-name' style='background: <?php echo $lang->program->kanban->laneColorList[$colorIndex];?>; color: #fff; border-right: none;' rowspan='<?php echo count($program->products);?>' title=<?php echo $program->name;?>><?php echo $program->name;?></td>
|
||||
<?php $i = 0;?>
|
||||
<?php if(!empty($program->products)):?>
|
||||
<?php foreach($program->products as $productID => $product):?>
|
||||
<?php if($i != 0) echo '<tr>';?>
|
||||
<td><?php echo $product->name;?></td>
|
||||
<td>
|
||||
<td title=<?php echo $product->name;?>><?php echo $product->name;?></td>
|
||||
<td class='normal-plan'>
|
||||
<?php foreach($product->plans as $planID => $plan):?>
|
||||
<div class='board-item'>
|
||||
<div class='table-row'>
|
||||
@@ -52,53 +52,72 @@
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
</td>
|
||||
<td>
|
||||
<td class='wait-project'>
|
||||
<?php if(isset($product->projects['wait'])):?>
|
||||
<?php foreach($product->projects['wait'] as $projectID => $project):?>
|
||||
<div class='board-item'>
|
||||
<div class='board-item' style='border-left: 3px solid #ccc'>
|
||||
<div class='table-row'>
|
||||
<div class='table-col'>
|
||||
<?php echo html::a($this->createLink('project', 'view', "projectID=$projectID"), $project->name);?>
|
||||
<?php echo html::a($this->createLink('project', 'view', "projectID=$project->id"), $project->name);?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
<td class='doing-project'>
|
||||
<?php if(isset($product->projects['doing'])):?>
|
||||
<?php foreach($product->projects['doing'] as $projectID => $project):?>
|
||||
<div class='board-item'>
|
||||
<td colspan='2' class='doing-td'>
|
||||
<div class='board-doing'>
|
||||
<?php if(isset($product->projects['doing'])):?>
|
||||
<?php foreach($product->projects['doing'] as $projectID => $project):?>
|
||||
<div class='table-row'>
|
||||
<div class='table-col'>
|
||||
<?php echo html::a($this->createLink('project', 'view', "projectID=$projectID"), $project->name);?>
|
||||
<div class='table-col board-doing-project'>
|
||||
<div class='board-item' <?php echo "style='border-left: 3px solid " . (isset($project->delay) ? 'red' : "#0BD986") . "'";?>>
|
||||
<div class='table-row'>
|
||||
<div class='table-col'>
|
||||
<?php echo html::a($this->createLink('project', 'view', "projectID=$project->id"), $project->name);?>
|
||||
</div>
|
||||
<div class='table-col'>
|
||||
<div class="c-progress">
|
||||
<?php $projectProgress = isset($project->hours->progress) ? $project->hours->progress : 0;?>
|
||||
<div class='progress-pie' data-doughnut-size='90' data-color='#3CB371' data-value='<?php echo round($projectProgress);?>' data-width='24' data-height='24' data-back-color='#e8edf3'>
|
||||
<div class='progress-info'><?php echo round($projectProgress);?></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
<td class='doing-execution'>
|
||||
<?php if(isset($product->projects['doing'])):?>
|
||||
<?php foreach($product->projects['doing'] as $projectID => $project):?>
|
||||
<div class='board-item'>
|
||||
<div class='table-row'>
|
||||
<div class='table-col'>
|
||||
<div class='table-col board-doing-execution'>
|
||||
<?php if(!empty($project->execution)):?>
|
||||
<?php echo html::a($this->createLink('execution', 'view', "executionID={$project->execution->id}"), $project->execution->name);?>
|
||||
<div class='board-item' <?php echo "style='border-left: 3px solid " . (isset($project->execution->delay) ? 'red' : "#0BD986") . "'";?>>
|
||||
<div class='table-row'>
|
||||
<div class='table-col'>
|
||||
<?php echo html::a($this->createLink('execution', 'view', "executionID={$project->execution->id}"), $project->execution->name);?>
|
||||
</div>
|
||||
<div class='table-col'>
|
||||
<div class="c-progress">
|
||||
<?php $executionProgress = isset($project->execution->hours->progress) ? $project->execution->hours->progress : 0;?>
|
||||
<div class='progress-pie' data-doughnut-size='90' data-color='#3CB371' data-value='<?php echo round($executionProgress);?>' data-width='24' data-height='24' data-back-color='#e8edf3'>
|
||||
<div class='progress-info'><?php echo round($executionProgress);?></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
<td>
|
||||
<td class='normal-release'>
|
||||
<?php foreach($product->releases as $releaseID => $release):?>
|
||||
<div class='board-item'>
|
||||
<div class='table-row'>
|
||||
<div class='table-col'>
|
||||
<?php echo html::a($this->createLink('release', 'view', "releaseID=$release->id"), $release->name);?>
|
||||
<?php $flag = $release->marker ? " <icon class='icon icon-flag red' title='{$lang->release->marker}'></icon> " : '';?>
|
||||
<?php echo html::a($this->createLink('release', 'view', "releaseID=$release->id"), $release->name . $flag);?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user