Merge branch 'sprint_liuhong' into 'master'

Sprint liuhong

See merge request easycorp/zentaopms!5040
This commit is contained in:
王怡栋
2022-08-22 01:31:06 +00:00
23 changed files with 95 additions and 26 deletions
+2 -1
View File
@@ -95,7 +95,8 @@
}
else
{
echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', '', $task->project), $task->name, null, "style='color: $task->color'");
$class = ($task->executionType == 'kanban') ? 'iframe' : '';
echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', true, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'");
}
?>
<?php if(!empty($task->children)) echo '<a class="task-toggle" data-id="' . $task->id . '"><i class="icon icon-angle-double-right"></i></a>';?>
+2 -1
View File
@@ -44,7 +44,8 @@
<tr>
<td class='c-id-xs'><?php echo sprintf('%03d', $task->id);?></td>
<td class='c-pri <?php if($longBlock) echo "c-pri-long"?>'><span class='label-pri label-pri-<?php echo $task->pri;?>' title='<?php echo zget($lang->task->priList, $task->pri, $task->pri)?>'><?php echo zget($lang->task->priList, $task->pri, $task->pri)?></span></td>
<td class='c-name' style='color: <?php echo $task->color?>' title='<?php echo $task->name?>'><?php echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', '', $task->project), $task->name)?></td>
<?php $class = ($task->executionType == 'kanban') ? 'iframe' : '';?>
<td class='c-name' style='color: <?php echo $task->color?>' title='<?php echo $task->name?>'><?php echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', true, $task->project), $task->name, null, "class='$class' data-width='80%' data-toggle='modal'")?></td>
<?php if($longBlock):?>
<td class='c-estimate text-center' title="<?php echo $task->estimate . ' ' . $lang->execution->workHour;?>"><?php echo $task->estimate . $lang->execution->workHourUnit;?></td>
<td class='c-deadline'><?php if(substr($task->deadline, 0, 4) > 0) echo $task->deadline;?></td>
+1 -1
View File
@@ -54,7 +54,7 @@
<td><?php echo zget($users, $story->openedBy);?></td>
<td><?php echo zget($users, $story->assignedTo);?></td>
<td class='w-right' title="<?php echo $story->estimate . ' ' . $lang->hourCommon;?>"><?php echo $story->estimate . $config->hourUnit;?></td>
<td>
<td style='padding-right:10px;'>
<span class='status-story status-<?php echo $story->status?>'>
<?php echo $this->processStatus('story', $story);?>
</span>
+4 -4
View File
@@ -204,9 +204,9 @@ tbody tr td:first-child input {display: none;}
</span>
</td>
<td><?php echo zget($users, $bug->openedBy);?></td>
<td><?php echo substr($bug->openedDate, 5, 11)?></td>
<td><?php echo helper::isZeroDate($bug->openedDate) ? '' : substr($bug->openedDate, 5, 11);?></td>
<td><?php echo zget($users, $bug->resolvedBy);?></td>
<td><?php echo substr($bug->resolvedDate, 5, 11)?></td>
<td><?php echo helper::isZeroDate($bug->resolvedDate) ? '' : substr($bug->resolvedDate, 5, 11);?></td>
<td class='c-actions'>
<?php
if($canBeChanged and common::hasPriv('build', 'unlinkBug'))
@@ -286,9 +286,9 @@ tbody tr td:first-child input {display: none;}
</span>
</td>
<td><?php echo zget($users, $bug->openedBy);?></td>
<td><?php echo substr($bug->openedDate, 5, 11)?></td>
<td><?php echo helper::isZeroDate($bug->openedDate) ? '' : substr($bug->openedDate, 5, 11);?></td>
<td><?php echo zget($users, $bug->resolvedBy);?></td>
<td><?php echo substr($bug->resolvedDate, 5, 11)?></td>
<td><?php echo helper::isZeroDate($bug->resolvedDate) ? '' : substr($bug->resolvedDate, 5, 11);?></td>
</tr>
<?php endforeach;?>
</tbody>
+2 -1
View File
@@ -1578,7 +1578,8 @@ class executionModel extends model
->beginIF($projectID)->andWhere('project')->eq((int)$projectID)->fi()
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->sprints)->fi()
->beginIF($status == 'undone')->andWhere('status')->notIN('done,closed')->fi()
->beginIF($status != 'all' and $status != 'undone')->andWhere('status')->in($status)->fi()
->beginIF($status != 'all' and $status != 'undone' and $status != 'noclosed')->andWhere('status')->in($status)->fi()
->beginIF($status == 'noclosed')->andWhere('status')->ne('closed')->fi()
->beginIF($devel === true)->andWhere('attribute')->in('dev,qa,release')->fi()
->orderBy($orderBy)
->beginIF($limit)->limit($limit)->fi()
+2 -2
View File
@@ -132,9 +132,9 @@
</td>
<td class='c-pri'><span class='label-pri <?php echo 'label-pri-' . $child->pri;?>' title='<?php echo zget($lang->story->priList, $child->pri, $child->pri);?>'><?php echo zget($lang->story->priList, $child->pri, $child->pri);?></span></td>
<td class='c-name nobr'>
<?php echo '<span class="label label-badge label-light" title="' . $this->lang->story->children .'">' . $this->lang->story->childrenAB . '</span> ' . html::a($storyLink, $child->title, null, "style='color: $child->color' data-group='product'");?>
<?php echo '<span class="label label-badge label-light" title="' . $this->lang->story->children .'">' . $this->lang->story->childrenAB . '</span> ' . html::a($storyLink, $child->title, null, "style='color: $child->color' data-group='product' title='$child->title'");?>
</td>
<td class='c-product'><?php echo $child->productTitle;?></td>
<td class='c-product' title='<?php echo $child->productTitle;?>'><?php echo $child->productTitle;?></td>
<td class='c-plan'><?php echo $child->planTitle;?></td>
<td class='c-user'><?php echo zget($users, $child->openedBy);?></td>
<td class='c-hours'><?php echo $child->estimate . $config->hourUnit;?></td>
+2 -1
View File
@@ -108,7 +108,8 @@
}
else
{
echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', '', $task->project), $task->name, null, "style='color: $task->color'");
$class = ($task->executionType == 'kanban') ? 'iframe' : '';
echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', true, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'");
}
?>
<?php if(!empty($task->children)) echo '<a class="task-toggle" data-id="' . $task->id . '"><i class="icon icon-angle-double-right"></i></a>';?>
+2
View File
@@ -38,6 +38,7 @@ $config->product->search['fields']['category'] = $lang->story->category;
$config->product->search['fields']['openedBy'] = $lang->story->openedBy;
$config->product->search['fields']['reviewedBy'] = $lang->story->reviewedBy;
$config->product->search['fields']['result'] = $lang->story->reviewResultAB;
$config->product->search['fields']['assignedTo'] = $lang->story->assignedTo;
$config->product->search['fields']['closedBy'] = $lang->story->closedBy;
$config->product->search['fields']['lastEditedBy'] = $lang->story->lastEditedBy;
@@ -73,6 +74,7 @@ $config->product->search['params']['category'] = array('operator' => '=',
$config->product->search['params']['openedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
$config->product->search['params']['reviewedBy'] = array('operator' => 'include', 'control' => 'select', 'values' => 'users');
$config->product->search['params']['result'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->story->reviewResultList);
$config->product->search['params']['assignedTo'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
$config->product->search['params']['closedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
$config->product->search['params']['lastEditedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
+3 -1
View File
@@ -1156,16 +1156,18 @@ class productModel extends model
* @param int $productID
* @param int $branch
* @param int $appendProject
* @param string $status all|closed|unclosed
* @access public
* @return array
*/
public function getProjectPairsByProduct($productID, $branch = 0, $appendProject = 0)
public function getProjectPairsByProduct($productID, $branch = 0, $appendProject = 0, $status = '')
{
$product = $this->getById($productID);
$projects = $this->dao->select('t2.id,t2.name')->from(TABLE_PROJECTPRODUCT)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
->where('t1.product')->eq($productID)
->beginIF($status == 'closed')->andWhere('t2.status')->ne('closed')->fi()
->beginIF($this->config->systemMode == 'new')->andWhere('t2.type')->eq('project')->fi()
->beginIF($this->config->systemMode == 'classic')->andWhere('t2.type')->eq('sprint')->fi()
->beginIF(!$this->app->user->admin and $this->config->systemMode == 'new')->andWhere('t2.id')->in($this->app->user->view->projects)->fi()
+2 -2
View File
@@ -362,7 +362,7 @@ class productplan extends control
$this->view->orderBy = $orderBy;
$this->view->plans = $this->productplan->getList($productID, $branch, $browseType, $pager, $sort, "", $queryID);
$this->view->pager = $pager;
$this->view->projects = $this->product->getProjectPairsByProduct($productID, $branch);
$this->view->projects = $this->product->getProjectPairsByProduct($productID, $branch, '', $status = 'closed');
$this->view->statusList = $this->lang->productplan->featureBar['browse'];
$this->view->queryID = $queryID;
$this->display();
@@ -615,7 +615,7 @@ class productplan extends control
*/
public function ajaxGetProjects($productID, $branch = 0)
{
$projects = $this->loadModel('product')->getProjectPairsByProduct($productID, $branch);
$projects = $this->loadModel('product')->getProjectPairsByProduct($productID, $branch, '', $status = 'closed');
echo html::select('project', $projects, key($projects), "class='form-control chosen'");
}
@@ -32,7 +32,7 @@
<th class='c-user'><?php echo $lang->openedByAB;?></th>
<th class='c-user'><?php echo $lang->assignedToAB;?></th>
<th class='c-estimate text-right'><?php echo $lang->story->estimateAB;?></th>
<th class='c-status'><?php echo $lang->statusAB;?></th>
<th class='c-status text-center'><?php echo $lang->statusAB;?></th>
<th class='c-stage'><?php echo $lang->story->stageAB;?></th>
</tr>
</thead>
@@ -57,7 +57,7 @@
<td><?php echo zget($users, $story->openedBy);?></td>
<td><?php echo zget($users, $story->assignedTo);?></td>
<td class='text-right' title="<?php echo $story->estimate . ' ' . $lang->hourCommon;?>"><?php echo $story->estimate . $config->hourUnit;?></td>
<td><span class='status-story status-<?php echo $story->status?>'><?php echo $this->processStatus('story', $story);?></span></td>
<td class='text-center' style='padding-right:10px'><span class='status-story status-<?php echo $story->status?>'><?php echo $this->processStatus('story', $story);?></span></td>
<td><?php echo zget($lang->story->stageList, $story->stage);?></td>
</tr>
<?php $unlinkedCount++;?>
+4 -4
View File
@@ -72,7 +72,7 @@
<th class='c-pri' title='<?php echo $lang->pri;?>'><?php common::printOrderLink('pri', $orderBy, $vars, $lang->priAB);?></th>
<th class="text-left"><?php common::printOrderLink('title', $orderBy, $vars, $lang->story->title);?></th>
<th class='c-user'> <?php common::printOrderLink('openedBy', $orderBy, $vars, $lang->openedByAB);?></th>
<th class='w-80px text-right'><?php common::printOrderLink('estimate', $orderBy, $vars, $lang->story->estimateAB);?></th>
<th class='w-80px text-right' style='padding-right:20px'><?php common::printOrderLink('estimate', $orderBy, $vars, $lang->story->estimateAB);?></th>
<th class='w-90px'> <?php common::printOrderLink('status', $orderBy, $vars, $lang->statusAB);?></th>
<th class='w-100px'><?php common::printOrderLink('stage', $orderBy, $vars, $lang->story->stageAB);?></th>
<th class='c-actions-1'><?php echo $lang->actions?></th>
@@ -99,7 +99,7 @@
?>
</td>
<td><?php echo zget($users, $story->openedBy);?></td>
<td class='text-right' title="<?php echo $story->estimate . ' ' . $lang->hourCommon;?>"><?php echo $story->estimate . $config->hourUnit;?></td>
<td class='text-right' style='padding-right:25px' title="<?php echo $story->estimate . ' ' . $lang->hourCommon;?>"><?php echo $story->estimate . $config->hourUnit;?></td>
<td>
<span class='status-story status-<?php echo $story->status;?>'><?php echo $this->processStatus('story', $story);?></span>
</td>
@@ -192,9 +192,9 @@
<span class='status-bug status-<?php echo $bug->status?>'><?php echo $this->processStatus('bug', $bug);?></span>
</td>
<td><?php echo zget($users, $bug->openedBy);?></td>
<td><?php echo substr($bug->openedDate, 5, 11)?></td>
<td><?php echo helper::isZeroDate($bug->openedDate) ? '' : substr($bug->openedDate, 5, 11);?></td>
<td><?php echo zget($users, $bug->resolvedBy);?></td>
<td><?php echo substr($bug->resolvedDate, 5, 11)?></td>
<td><?php echo helper::isZeroDate($bug->resolvedDate) ? '' : substr($bug->resolvedDate, 5, 11);?></td>
<td class='c-actions'>
<?php
if(common::hasPriv('projectrelease', 'unlinkBug') and $canBeChanged)
+1 -1
View File
@@ -57,7 +57,7 @@
<td><?php echo zget($users, $story->openedBy);?></td>
<td><?php echo zget($users, $story->assignedTo);?></td>
<td class='text-right' title="<?php echo $story->estimate . ' ' . $lang->hourCommon;?>"><?php echo $story->estimate . $config->hourUnit;?></td>
<td class='text-center'><span class='status-story status-<?php echo $story->status?>'><?php echo $this->processStatus('story', $story);?></span></td>
<td class='text-center' style='padding-right:10px;'><span class='status-story status-<?php echo $story->status?>'><?php echo $this->processStatus('story', $story);?></span></td>
<td><?php echo zget($lang->story->stageList, $story->stage);?></td>
</tr>
<?php $unlinkedCount++;?>
+1
View File
@@ -148,6 +148,7 @@ $lang->story->linkRequirements = "Linked {$lang->URCommon}";
$lang->story->childStories = 'Story aufteilen';
$lang->story->duplicateStory = 'Story ID kopieren';
$lang->story->reviewResult = 'Ergbnis prüfen';
$lang->story->reviewResultAB = 'Bewertungsergebnisse';
$lang->story->preVersion = 'Frühere Version';
$lang->story->keywords = 'Tags';
$lang->story->newStory = 'Weitere Story';
+1
View File
@@ -148,6 +148,7 @@ $lang->story->linkRequirements = "Linked {$lang->URCommon}";
$lang->story->childStories = 'Decomposed Story';
$lang->story->duplicateStory = 'Duplicated Story ID';
$lang->story->reviewResult = 'Review Result';
$lang->story->reviewResultAB = 'Assessment results';
$lang->story->preVersion = 'Last Version';
$lang->story->keywords = 'Tags';
$lang->story->newStory = 'Continue adding';
+1
View File
@@ -148,6 +148,7 @@ $lang->story->linkRequirements = "{$lang->URCommon} Lié es";
$lang->story->childStories = 'Stories Décomposées';
$lang->story->duplicateStory = 'Story ID Dupliquées';
$lang->story->reviewResult = 'Résultat Validation';
$lang->story->reviewResultAB = 'Résultats de lévaluation';
$lang->story->preVersion = 'Dernière Version';
$lang->story->keywords = 'Tags';
$lang->story->newStory = "Continuer d'ajouter";
+1
View File
@@ -141,6 +141,7 @@ $lang->story->linkStories = 'Câu chuyện liên kết';
$lang->story->childStories = 'Câu chuyện được phân rã';
$lang->story->duplicateStory = 'ID câu chuyện được nhân bản';
$lang->story->reviewResult = 'Duyệt kết quả';
$lang->story->reviewResultAB = 'Kết quả đánh giá';
$lang->story->preVersion = 'Phiên bản mới nhất';
$lang->story->keywords = 'Tags';
$lang->story->newStory = 'Tiếp tục thêm';
+1
View File
@@ -148,6 +148,7 @@ $lang->story->linkRequirements = "相关{$lang->URCommon}";
$lang->story->childStories = "细分需求";
$lang->story->duplicateStory = "重复需求ID";
$lang->story->reviewResult = '评审意见';
$lang->story->reviewResultAB = '评审结果';
$lang->story->preVersion = '之前版本';
$lang->story->keywords = '关键词';
$lang->story->newStory = "继续添加{$lang->SRCommon}";
+1
View File
@@ -139,6 +139,7 @@ $lang->story->linkStories = "相關{$lang->SRCommon}";
$lang->story->childStories = "細分需求";
$lang->story->duplicateStory = "重複需求ID";
$lang->story->reviewResult = '評審意見';
$lang->story->reviewResultAB = '評審結果';
$lang->story->preVersion = '之前版本';
$lang->story->keywords = '關鍵詞';
$lang->story->newStory = "繼續添加{$lang->SRCommon}";
+54
View File
@@ -2973,6 +2973,26 @@ class storyModel extends model
return $this->getBySQL($queryProductID, $storyQuery, $orderBy, $pager, $type);
}
/**
* Get Story changed Revert ObjectID.
*
* @param int $productID
* @access public
* @return array
*/
public function getRevertStoryIDList($productID)
{
$review = $this->dao->select('objectID')->from(TABLE_ACTION)
->where('product')->like("%,$productID,%")
->andWhere('action')->eq('reviewed')
->andWhere('objectType')->eq('story')
->andWhere('extra')->eq('Revert')
->groupBy('objectID')
->orderBy('id_desc')
->fetchPairs();
return $review;
}
/**
* Get stories by a sql.
*
@@ -2992,9 +3012,24 @@ class storyModel extends model
->beginIF($productID != 'all' and $productID != '')->andWhere('product')->eq((int)$productID)->fi()
->fetchPairs();
$review = $this->getRevertStoryIDList($productID);
$sql = str_replace(array('`product`', '`version`', '`branch`'), array('t1.`product`', 't1.`version`', 't1.`branch`'), $sql);
if(strpos($sql,'result')!== false)
{
if(strpos($sql,'revert')!== false)
{
$sql = str_replace("AND `result` = 'revert'", '', $sql);
$sql .= " AND t1.`id` " . helper::dbIN($review);
}
else
{
$sql = str_replace(array('`result`'), array('t3.`result`'), $sql);
}
}
$tmpStories = $this->dao->select('DISTINCT t1.*')->from(TABLE_STORY)->alias('t1')
->leftJoin(TABLE_PROJECTSTORY)->alias('t2')->on('t1.id=t2.story')
->beginIF(strpos($sql,'result')!== false)->leftJoin(TABLE_STORYREVIEW)->alias('t3')->on('t1.id = t3.story and t1.version = t3.version')->fi()
->where($sql)
->beginIF($productID != 'all' and $productID != '')->andWhere('t1.`product`')->eq((int)$productID)->fi()
->andWhere('t1.deleted')->eq(0)
@@ -3014,6 +3049,7 @@ class storyModel extends model
foreach($storyPlans as $planID) $story->planTitle .= zget($plans, $planID, '') . ' ';
$stories[$story->id] = $story;
}
return $stories;
}
@@ -3074,9 +3110,27 @@ class storyModel extends model
}
$storyQuery = preg_replace('/`(\w+)`/', 't2.`$1`', $storyQuery);
$products = $this->loadModel('product')->getProducts($executionID);
if($products) $productID = key($products);
$review = $this->getRevertStoryIDList($productID);
if(strpos($storyQuery,'result')!== false)
{
if(strpos($storyQuery,'revert')!== false)
{
$storyQuery = str_replace("AND t2.`result` = 'revert'", '', $storyQuery);
$storyQuery .= " AND t2.`id` " . helper::dbIN($review);
}
else
{
$storyQuery = str_replace(array('t2.`result`'), array('t4.`result`'), $storyQuery);
}
}
$stories = $this->dao->select('distinct t1.*, t2.*, t3.type as productType, t2.version as version')->from(TABLE_PROJECTSTORY)->alias('t1')
->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id')
->leftJoin(TABLE_PRODUCT)->alias('t3')->on('t2.product = t3.id')
->beginIF(strpos($storyQuery,'result')!== false)->leftJoin(TABLE_STORYREVIEW)->alias('t4')->on('t2.id = t4.story and t2.version = t4.version')->fi()
->where($storyQuery)
->andWhere('t1.project')->eq((int)$executionID)
->andWhere('t2.deleted')->eq(0)
+2 -2
View File
@@ -45,7 +45,7 @@ class task extends control
parse_str($extra, $output);
if(!empty($executionID)) $execution = $this->execution->getById($executionID);
$executions = $this->execution->getPairs(0, 'all', isset($execution) ? (!common::canModify('execution', $execution) ? 'noclosed' : '') : 'noclosed');
$executions = $this->execution->getPairs(0, 'all', 'noclosed');
$executionID = $this->execution->saveState($executionID, $executions);
$execution = $this->execution->getById($executionID);
$this->execution->setMenu($executionID);
@@ -291,7 +291,7 @@ class task extends control
/* Set Custom*/
foreach(explode(',', $this->config->task->customCreateFields) as $field) $customFields[$field] = $this->lang->task->$field;
$executions = $this->config->systemMode == 'classic' ? $executions : $this->execution->getByProject($projectID, !common::canModify('execution', $execution) ? 'noclosed' : 'all', 0, true);
$executions = $this->config->systemMode == 'classic' ? $executions : $this->execution->getByProject($projectID, 'noclosed', 0, true);
$this->view->customFields = $customFields;
$this->view->showFields = $this->config->task->custom->createFields;
+2 -2
View File
@@ -3464,7 +3464,7 @@ class taskModel extends model
$storyChanged = (!empty($task->storyStatus) and $task->storyStatus == 'active' and $task->latestStoryVersion > $task->storyVersion and !in_array($task->status, array('cancel', 'closed')));
$canView = common::hasPriv('task', 'view');
$taskLink = helper::createLink('task', 'view', "taskID=$task->id");
$taskLink = helper::createLink('task', 'view', "taskID=$task->id", '', true);
$account = $this->app->user->account;
$id = $col->id;
if($col->show)
@@ -3522,7 +3522,7 @@ class taskModel extends model
if($task->module and isset($modulePairs[$task->module])) echo "<span class='label label-gray label-badge'>" . $modulePairs[$task->module] . '</span> ';
if($task->parent > 0) echo '<span class="label label-badge label-light" title="' . $this->lang->task->children . '">' . $this->lang->task->childrenAB . '</span> ';
if(!empty($task->team)) echo '<span class="label label-badge label-light" title="' . $this->lang->task->multiple . '">' . $this->lang->task->multipleAB . '</span> ';
echo $canView ? html::a($taskLink, $task->name, null, "style='color: $task->color' title='$task->name'") : "<span style='color: $task->color'>$task->name</span>";
echo $canView ? html::a($taskLink, $task->name, null, "style='color: $task->color' title='$task->name' class='iframe'") : "<span style='color: $task->color'>$task->name</span>";
if(!empty($task->children)) echo '<a class="task-toggle" data-id="' . $task->id . '"><i class="icon icon-angle-double-right"></i></a>';
if($task->fromBug) echo html::a(helper::createLink('bug', 'view', "id=$task->fromBug"), "[BUG#$task->fromBug]", '', "class='bug'");
break;
+2 -1
View File
@@ -61,7 +61,8 @@
<td class='text-left nobr'>
<?php if(!empty($task->team)) echo '<span class="label label-badge label-light">' . $this->lang->task->multipleAB . '</span> ';?>
<?php if($task->parent > 0) echo '<span class="label label-badge label-light">' . $this->lang->task->childrenAB . '</span> ';?>
<?php echo html::a($this->createLink('task', 'view', "taskID=$task->id"), $task->name, null, "style='color: $task->color'");?>
<?php $class = ($task->executionType == 'kanban') ? 'iframe' : '';?>
<?php echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', true, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'");?>
</td>
<td class='hours' title="<?php echo $task->estimate . ' ' . $lang->execution->workHour;?>"><?php echo $task->estimate . $lang->execution->workHourUnit;?></td>
<td class='hours' title="<?php echo $task->consumed . ' ' . $lang->execution->workHour;?>"><?php echo $task->consumed . $lang->execution->workHourUnit;?></td>