Merge branch 'master' of https://git.zcorp.cc/zentaopms
This commit is contained in:
@@ -40,15 +40,7 @@ if(!$selfCall) die(include('./todolist.html.php'));
|
||||
<div class="todo-form-trigger"><input type="text" placeholder="<?php echo $lang->todo->lblClickCreate?>" autocomplete="off" class="form-control"></div>
|
||||
<form class="form-horizontal todoes-form layer" method='post' target='hiddenwin' action='<?php echo $this->createLink('todo', 'create', 'date=today&userID=&from=block');?>'>
|
||||
<h3><?php echo $lang->todo->create;?></h3>
|
||||
<div class="form-group">
|
||||
<?php $leftWidth = common::checkNotCN() ? 'col-sm-3' : 'col-sm-2';?>
|
||||
<label for="todoName" class="<?php echo $leftWidth;?>"><?php echo $lang->todo->name?></label>
|
||||
<div class="col-sm-9 required"><input type="text" class="form-control" autocomplete="off" name="name"></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="todoPri" class="<?php echo $leftWidth;?>"><?php echo $lang->todo->pri?></label>
|
||||
<div class="col-sm-4"><?php echo html::select('pri', $lang->todo->priList, '', "class='form-control chosen'");?></div>
|
||||
</div>
|
||||
<?php $leftWidth = common::checkNotCN() ? 'col-sm-3' : 'col-sm-2';?>
|
||||
<div class="form-group">
|
||||
<label for="todoDate" class="<?php echo $leftWidth;?>"><?php echo $lang->todo->date?></label>
|
||||
<div class="col-sm-9">
|
||||
@@ -58,6 +50,14 @@ if(!$selfCall) die(include('./todolist.html.php'));
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="todoPri" class="<?php echo $leftWidth;?>"><?php echo $lang->todo->pri?></label>
|
||||
<div class="col-sm-4"><?php echo html::select('pri', $lang->todo->priList, '', "class='form-control chosen'");?></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="todoName" class="<?php echo $leftWidth;?>"><?php echo $lang->todo->name?></label>
|
||||
<div class="col-sm-9 required"><input type="text" class="form-control" autocomplete="off" name="name"></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="todoBegin" class="<?php echo $leftWidth;?>"><?php echo $lang->todo->beginAndEnd?></label>
|
||||
<div class="col-sm-4">
|
||||
|
||||
@@ -33,7 +33,7 @@ class bug extends control
|
||||
$this->loadModel('task');
|
||||
|
||||
$this->view->products = $this->products = $this->product->getProductPairsByProject($this->session->PRJ);
|
||||
if(empty($this->products)) die($this->locate($this->createLink('product', 'showErrorNone', "fromModule=bug")));
|
||||
if($this->session->PRJ and empty($this->products)) die($this->locate($this->createLink('product', 'showErrorNone', "fromModule=bug")));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -980,8 +980,7 @@ class bug extends control
|
||||
}
|
||||
$this->loadModel('score')->create('ajax', 'batchOther');
|
||||
}
|
||||
if($type == 'product') die(js::locate($this->session->bugList, 'parent'));
|
||||
if($type == 'my') die(js::locate($this->createLink('my', 'bug')));
|
||||
if($type == 'product' || $type == 'my') die(js::locate($this->session->bugList, 'parent'));
|
||||
die(js::locate($this->createLink('project', 'bug', "projectID=$projectID")));
|
||||
}
|
||||
|
||||
|
||||
@@ -59,6 +59,7 @@ $lang->bug->resolvedDate = 'Gelöst am';
|
||||
$lang->bug->resolvedDateAB = 'Gelöst';
|
||||
$lang->bug->deadline = 'Fällig am';
|
||||
$lang->bug->plan = 'Plan';
|
||||
$lang->bug->close = 'Close';
|
||||
$lang->bug->closedBy = 'Geschlossen von';
|
||||
$lang->bug->closedDate = 'Geschlossen am';
|
||||
$lang->bug->duplicateBug = 'Dublette';
|
||||
|
||||
@@ -59,6 +59,7 @@ $lang->bug->resolvedDate = 'Resolved Date';
|
||||
$lang->bug->resolvedDateAB = 'ResolvedDate';
|
||||
$lang->bug->deadline = 'Deadline';
|
||||
$lang->bug->plan = 'Plan';
|
||||
$lang->bug->close = 'Close';
|
||||
$lang->bug->closedBy = 'ClosedBy';
|
||||
$lang->bug->closedDate = 'ClosedDate';
|
||||
$lang->bug->duplicateBug = 'Duplicated Bug ID';
|
||||
|
||||
@@ -59,6 +59,7 @@ $lang->bug->resolvedDate = 'Date Correction';
|
||||
$lang->bug->resolvedDateAB = 'Date Correction';
|
||||
$lang->bug->deadline = 'Date Butoir';
|
||||
$lang->bug->plan = 'Plan';
|
||||
$lang->bug->close = 'Close';
|
||||
$lang->bug->closedBy = 'Fermé par';
|
||||
$lang->bug->closedDate = 'Date Fermeture';
|
||||
$lang->bug->duplicateBug = 'Bug ID en doublon';
|
||||
|
||||
@@ -59,6 +59,7 @@ $lang->bug->resolvedDate = 'Ngày giải quyết';
|
||||
$lang->bug->resolvedDateAB = 'Ngày giải quyết';
|
||||
$lang->bug->deadline = 'Hạn chót';
|
||||
$lang->bug->plan = 'Kế hoạch';
|
||||
$lang->bug->close = 'Close';
|
||||
$lang->bug->closedBy = 'Người đóng';
|
||||
$lang->bug->closedDate = 'Ngày đóng';
|
||||
$lang->bug->duplicateBug = 'ID Bug đã nhân bản';
|
||||
|
||||
@@ -59,6 +59,7 @@ $lang->bug->resolvedDate = '解决日期';
|
||||
$lang->bug->resolvedDateAB = '解决日期';
|
||||
$lang->bug->deadline = '截止日期';
|
||||
$lang->bug->plan = '所属' . '计划';
|
||||
$lang->bug->close = '关闭';
|
||||
$lang->bug->closedBy = '由谁关闭';
|
||||
$lang->bug->closedDate = '关闭日期';
|
||||
$lang->bug->duplicateBug = '重复ID';
|
||||
|
||||
@@ -59,6 +59,7 @@ $lang->bug->resolvedDate = '解決日期';
|
||||
$lang->bug->resolvedDateAB = '解決日期';
|
||||
$lang->bug->deadline = '截止日期';
|
||||
$lang->bug->plan = '所屬計劃';
|
||||
$lang->bug->close = '關閉';
|
||||
$lang->bug->closedBy = '由誰關閉';
|
||||
$lang->bug->closedDate = '關閉日期';
|
||||
$lang->bug->duplicateBug = '重複ID';
|
||||
|
||||
@@ -34,11 +34,10 @@
|
||||
<?php else:?>
|
||||
<form id='myBugForm' class="main-table table-bug" data-ride="table" method="post" action='<?php echo $this->createLink('bug', 'batchEdit', "productID=0");?>'>
|
||||
<?php
|
||||
$canBatchEdit = common::hasPriv('bug', 'batchEdit');
|
||||
$canBatchConfirm = common::hasPriv('bug', 'batchConfirm');
|
||||
$canBatchClose = (common::hasPriv('bug', 'batchClose') and strtolower($type) != 'closedby');
|
||||
$canBatchAssignTo = common::hasPriv('bug', 'batchAssignTo');
|
||||
$canBatchAction = ($canBatchEdit or $canBatchConfirm or $canBatchClose or $canBatchAssignTo);
|
||||
$canBatchAction = ($canBatchConfirm or $canBatchClose or $canBatchAssignTo);
|
||||
?>
|
||||
<table class="table has-sort-head table-fixed" id='bugList'>
|
||||
<?php $vars = "mode=$mode&type=$type&orderBy=%s&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID"; ?>
|
||||
@@ -59,7 +58,7 @@
|
||||
<th class='w-type'> <?php common::printOrderLink('type', $orderBy, $vars, $lang->typeAB);?></th>
|
||||
<th class='w-90px'> <?php common::printOrderLink('openedBy', $orderBy, $vars, $lang->openedByAB);?></th>
|
||||
<?php if($type != 'assignedTo'): ?>
|
||||
<th class='w-110px'><?php common::printOrderLink('assignedTo', $orderBy, $vars, $lang->bug->assignedTo);?></th>
|
||||
<th class='w-110px c-assignedTo'><?php common::printOrderLink('assignedTo', $orderBy, $vars, $lang->bug->assignedTo);?></th>
|
||||
<?php endif;?>
|
||||
<th class='w-100px'><?php common::printOrderLink('resolvedBy', $orderBy, $vars, $lang->bug->resolvedByAB);?></th>
|
||||
<th class='w-100px'><?php common::printOrderLink('resolution', $orderBy, $vars, $lang->bug->resolutionAB);?></th>
|
||||
@@ -129,11 +128,6 @@
|
||||
<div class="checkbox-primary check-all"><label><?php echo $lang->selectAll?></label></div>
|
||||
<?php endif;?>
|
||||
<div class="table-actions btn-toolbar">
|
||||
<?php
|
||||
$actionLink = $this->createLink('bug', 'batchEdit');
|
||||
$misc = $canBatchEdit ? "onclick=\"setFormAction('$actionLink')\"" : "disabled='disabled'";
|
||||
echo html::commonButton($lang->edit, $misc);
|
||||
?>
|
||||
<?php
|
||||
if($canBatchConfirm)
|
||||
{
|
||||
|
||||
@@ -20,11 +20,9 @@
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
$recTotalLabel = " <span class='label label-light label-badge'>{$pager->recTotal}</span>";
|
||||
echo "<span class='nav-title'>{$lang->testtask->common}: </span>";
|
||||
if($app->rawMethod == 'work') echo html::a(inlink($app->rawMethod, "mode=testtask&type=wait"), "<span class='text'>{$lang->testtask->wait}</span>", '', "class='btn btn-link'");
|
||||
if($app->rawMethod == 'contribute') echo html::a(inlink($app->rawMethod, "mode=testtask&type=done"), "<span class='text'>{$lang->testtask->done}</span>", '', "class='btn btn-link'");
|
||||
echo "<span class='divider'></span>";
|
||||
echo "<span class='nav-title'>{$lang->testcase->common}: </span>";
|
||||
echo html::a(inlink($app->rawMethod, "mode=$mode&type=assigntome"), "<span class='text'>{$lang->testcase->assignToMe}</span>" . ($type == 'assigntome' ? $recTotalLabel : ''), '', "class='btn btn-link" . ($type == 'assigntome' ? ' btn-active-text' : '') . "'");
|
||||
echo html::a(inlink($app->rawMethod, "mode=$mode&type=openedbyme"), "<span class='text'>{$lang->testcase->openedByMe}</span>" . ($type == 'openedbyme' ? $recTotalLabel : ''), '', "class='btn btn-link" . ($type == 'openedbyme' ? ' btn-active-text' : '') . "'");
|
||||
?>
|
||||
|
||||
@@ -17,11 +17,9 @@
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
$recTotalLabel = " <span class='label label-light label-badge'>{$pager->recTotal}</span>";
|
||||
echo "<span class='nav-title'>{$lang->testtask->common}: </span>";
|
||||
if($app->rawMethod == 'work') echo html::a(inlink($app->rawMethod, "mode=$mode&type=wait"), "<span class='text'>{$lang->testtask->wait}</span>" . ($type == 'wait' ? $recTotalLabel : ''), '', "class='btn btn-link" . ($type == 'wait' ? ' btn-active-text' : '') . "'");
|
||||
if($app->rawMethod == 'contribute') echo html::a(inlink($app->rawMethod, "mode=$mode&type=done"), "<span class='text'>{$lang->testtask->done}</span>" . ($type == 'done' ? $recTotalLabel : ''), '', "class='btn btn-link" . ($type == 'done' ? ' btn-active-text' : '') . "'");
|
||||
echo "<span class='divider'></span>";
|
||||
echo "<span class='nav-title'>{$lang->testcase->common}: </span>";
|
||||
echo html::a(inlink($app->rawMethod, "mode=testcase&type=assigntome"), "<span class='text'>{$lang->testcase->assignToMe}</span>", '', "class='btn btn-link'");
|
||||
echo html::a(inlink($app->rawMethod, "mode=testcase&type=openedbyme"), "<span class='text'>{$lang->testcase->openedByMe}</span>", '', "class='btn btn-link'");
|
||||
?>
|
||||
|
||||
@@ -246,10 +246,11 @@ class product extends control
|
||||
/**
|
||||
* Create a product.
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function create()
|
||||
public function create($programID = 0)
|
||||
{
|
||||
$this->lang->product->switcherMenu = $this->product->getSwitcher();
|
||||
|
||||
@@ -265,6 +266,15 @@ class product extends control
|
||||
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $locate));
|
||||
}
|
||||
|
||||
if($programID)
|
||||
{
|
||||
$this->app->rawModule = 'program';
|
||||
$this->app->rawMethod = 'pgmproduct';
|
||||
$this->lang->navGroup->program = 'program';
|
||||
$this->loadModel('program')->setPGMViewMenu($programID);
|
||||
$this->lang->program->switcherMenu = $this->program->getPGMCommonAction() . $this->program->getPGMSwitcher($programID, true);
|
||||
}
|
||||
|
||||
$this->loadModel('user');
|
||||
$poUsers = $this->user->getPairs('nodeleted|pofirst|noclosed', '', $this->config->maxCount);
|
||||
if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PO"] = $this->config->user->moreLink;
|
||||
|
||||
@@ -1102,10 +1102,18 @@ class productModel extends model
|
||||
->page($pager)
|
||||
->fetchAll('id');
|
||||
|
||||
$stories = $this->dao->select('product, status, count(status) AS count')
|
||||
$stories = $this->dao->select('product, status, type, count(status) AS count')
|
||||
->from(TABLE_STORY)
|
||||
->where('deleted')->eq(0)
|
||||
->andWhere('type')->eq($storyType)
|
||||
->andWhere('type')->eq('story')
|
||||
->andWhere('product')->in($productKeys)
|
||||
->groupBy('product, status')
|
||||
->fetchGroup('product', 'status');
|
||||
|
||||
$requirements = $this->dao->select('product, status, type, count(status) AS count')
|
||||
->from(TABLE_STORY)
|
||||
->where('deleted')->eq(0)
|
||||
->andWhere('type')->eq('requirement')
|
||||
->andWhere('product')->in($productKeys)
|
||||
->groupBy('product, status')
|
||||
->fetchGroup('product', 'status');
|
||||
@@ -1114,7 +1122,8 @@ class productModel extends model
|
||||
$emptyStory = array_keys($this->lang->story->statusList);
|
||||
foreach($productKeys as $productID)
|
||||
{
|
||||
if(!isset($stories[$productID])) $stories[$productID] = $emptyStory;
|
||||
if(!isset($stories[$productID])) $stories[$productID] = $emptyStory;
|
||||
if(!isset($requirements[$productID])) $requirements[$productID] = $emptyStory;
|
||||
}
|
||||
|
||||
/* Padding the stories to sure all status have records. */
|
||||
@@ -1126,6 +1135,16 @@ class productModel extends model
|
||||
}
|
||||
$stories[$key] = $story;
|
||||
}
|
||||
foreach($requirements as $key => $requirement)
|
||||
{
|
||||
foreach(array_keys($this->lang->story->statusList) as $status)
|
||||
{
|
||||
$requirement[$status] = isset($requirement[$status]) ? $requirement[$status]->count : 0;
|
||||
}
|
||||
$requirements[$key] = $requirement;
|
||||
}
|
||||
|
||||
if($storyType == 'requirement') $stories = $requirements;
|
||||
|
||||
$plans = $this->dao->select('product, count(*) AS count')
|
||||
->from(TABLE_PRODUCTPLAN)
|
||||
@@ -1157,6 +1176,14 @@ class productModel extends model
|
||||
->groupBy('product')
|
||||
->fetchPairs();
|
||||
|
||||
$closedBugs = $this->dao->select('product,count(*) AS count')
|
||||
->from(TABLE_BUG)
|
||||
->where('deleted')->eq(0)
|
||||
->andwhere('status')->eq('closed')
|
||||
->andWhere('product')->in($productKeys)
|
||||
->groupBy('product')
|
||||
->fetchPairs();
|
||||
|
||||
$assignToNull = $this->dao->select('product,count(*) AS count')
|
||||
->from(TABLE_BUG)
|
||||
->where('deleted')->eq(0)
|
||||
@@ -1180,12 +1207,14 @@ class productModel extends model
|
||||
$stats = array();
|
||||
foreach($products as $key => $product)
|
||||
{
|
||||
$product->stories = $stories[$product->id];
|
||||
$product->plans = isset($plans[$product->id]) ? $plans[$product->id] : 0;
|
||||
$product->releases = isset($releases[$product->id]) ? $releases[$product->id] : 0;
|
||||
$product->stories = $stories[$product->id];
|
||||
$product->requirements = $requirements[$product->id];
|
||||
$product->plans = isset($plans[$product->id]) ? $plans[$product->id] : 0;
|
||||
$product->releases = isset($releases[$product->id]) ? $releases[$product->id] : 0;
|
||||
|
||||
$product->bugs = isset($bugs[$product->id]) ? $bugs[$product->id] : 0;
|
||||
$product->unResolved = isset($unResolved[$product->id]) ? $unResolved[$product->id] : 0;
|
||||
$product->closedBugs = isset($closedBugs[$product->id]) ? $closedBugs[$product->id] : 0;
|
||||
$product->assignToNull = isset($assignToNull[$product->id]) ? $assignToNull[$product->id] : 0;
|
||||
$stats[] = $product;
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
.main-table thead>tr:first-of-type>th {border-left: 1px solid #ddd;}
|
||||
@@ -197,6 +197,7 @@ $lang->program->unlinkStakeholder = 'Unlink Stakeholder';
|
||||
$lang->program->importStakeholder = 'Import program';
|
||||
$lang->program->PGMManageMembers = 'Program Team';
|
||||
$lang->program->PGMParentBudget = "Parent program budget:%s";
|
||||
$lang->program->beyondParentBudget = 'The remaining budget has been exceeded.';
|
||||
$lang->program->PGMBeginLetterParent = "Parent begin date: %s, begin date should be >= parent begin date.";
|
||||
$lang->program->PGMEndGreaterParent = "Parent end date: %s, end date should be <= parent end date.";
|
||||
$lang->program->PGMBeginGreateChild = "Child earliest begin: %s, parent begin date <= child earliest begin date.";
|
||||
|
||||
@@ -197,6 +197,7 @@ $lang->program->unlinkStakeholder = 'Unlink Stakeholder';
|
||||
$lang->program->importStakeholder = 'Import program';
|
||||
$lang->program->PGMManageMembers = 'Program Team';
|
||||
$lang->program->PGMParentBudget = "Parent program budget:%s";
|
||||
$lang->program->beyondParentBudget = 'The remaining budget has been exceeded.';
|
||||
$lang->program->PGMBeginLetterParent = "Parent begin date: %s, begin date should be >= parent begin date.";
|
||||
$lang->program->PGMEndGreaterParent = "Parent end date: %s, end date should be <= parent end date.";
|
||||
$lang->program->PGMBeginGreateChild = "Child earliest begin: %s, parent begin date <= child earliest begin date.";
|
||||
|
||||
@@ -197,6 +197,7 @@ $lang->program->unlinkStakeholder = 'Unlink Stakeholder';
|
||||
$lang->program->importStakeholder = 'Import program';
|
||||
$lang->program->PGMManageMembers = 'Program Team';
|
||||
$lang->program->PGMParentBudget = "Parent program budget:%s";
|
||||
$lang->program->beyondParentBudget = 'The remaining budget has been exceeded.';
|
||||
$lang->program->PGMBeginLetterParent = "Parent begin date: %s, begin date should be >= parent begin date.";
|
||||
$lang->program->PGMEndGreaterParent = "Parent end date: %s, end date should be <= parent end date.";
|
||||
$lang->program->PGMBeginGreateChild = "Child earliest begin: %s, parent begin date <= child earliest begin date.";
|
||||
|
||||
@@ -197,6 +197,7 @@ $lang->program->unlinkStakeholder = 'Unlink Stakeholder';
|
||||
$lang->program->importStakeholder = 'Import program';
|
||||
$lang->program->PGMManageMembers = 'Program Team';
|
||||
$lang->program->PGMParentBudget = "Parent program budget:%s";
|
||||
$lang->program->beyondParentBudget = 'The remaining budget has been exceeded.';
|
||||
$lang->program->PGMBeginLetterParent = "Parent begin date: %s, begin date should be >= parent begin date.";
|
||||
$lang->program->PGMEndGreaterParent = "Parent end date: %s, end date should be <= parent end date.";
|
||||
$lang->program->PGMBeginGreateChild = "Child earliest begin: %s, parent begin date <= child earliest begin date.";
|
||||
|
||||
@@ -197,6 +197,7 @@ $lang->program->unlinkStakeholder = '移除干系人';
|
||||
$lang->program->importStakeholder = '从父项目集导入';
|
||||
$lang->program->PGMManageMembers = '项目集团队';
|
||||
$lang->program->PGMParentBudget = "父项目集预算:%s";
|
||||
$lang->program->beyondParentBudget = '已超出剩余预算';
|
||||
$lang->program->PGMBeginLetterParent = "父项目集的开始日期:%s,开始日期不能小于父项目集的开始日期";
|
||||
$lang->program->PGMEndGreaterParent = "父项目集的完成日期:%s,完成日期不能大于父项目集的完成日期";
|
||||
$lang->program->PGMBeginGreateChild = "子项目集的最小开始日期:%s,父项目集的开始日期不能大于子项目集的最小开始日期";
|
||||
|
||||
@@ -200,6 +200,7 @@ $lang->program->unlinkStakeholder = '移除干係人';
|
||||
$lang->program->importStakeholder = '從父項目集導入';
|
||||
$lang->program->PGMManageMembers = '項目集團隊';
|
||||
$lang->program->PGMParentBudget = "父項目集預算:%s";
|
||||
$lang->program->beyondParentBudget = '已超出剩餘預算';
|
||||
$lang->program->PGMBeginLetterParent = "父項目集的開始日期:%s,開始日期不能小於父項目集的開始日期";
|
||||
$lang->program->PGMEndGreaterParent = "父項目集的完成日期:%s,完成日期不能大於父項目集的完成日期";
|
||||
$lang->program->PGMBeginGreateChild = "子項目集的最小開始日期:%s,父項目集的開始日期不能大於子項目集的最小開始日期";
|
||||
|
||||
@@ -143,6 +143,18 @@ class programModel extends model
|
||||
/* When parent set end then child program cannot set longTime. */
|
||||
if(empty($program->end) and $this->post->delta == 999 and $parentProgram->end != '0000-00-00') dao::$errors['end'] = sprintf($this->lang->program->PGMEndGreaterParent, $parentProgram->end);
|
||||
|
||||
/* The budget of a child program cannot beyond the remaining budget of the parent program. */
|
||||
if(isset($program->budget) and $parentProgram->budget != 0)
|
||||
{
|
||||
$childGrade = $parentProgram->grade + 1;
|
||||
$childSumBudget = $this->dao->select("sum(budget) as sumBudget")->from(TABLE_PROJECT)
|
||||
->where('path')->like("%{$program->parent}%")
|
||||
->andWhere('grade')->eq($childGrade)
|
||||
->fetch('sumBudget');
|
||||
|
||||
if($program->budget > $parentProgram->budget - $childSumBudget) dao::$errors['budget'] = $this->lang->program->beyondParentBudget;
|
||||
}
|
||||
|
||||
if(dao::isError()) return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<?php $vars = "programID=$program->id&browseType=$browseType&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";?>
|
||||
<thead>
|
||||
<tr class="text-center">
|
||||
<th class='c-id text-left'>
|
||||
<th class='c-id text-left' rowspan='2'>
|
||||
<?php if($canBatchEdit):?>
|
||||
<div class="checkbox-primary check-all" title="<?php echo $lang->selectAll;?>">
|
||||
<label></label>
|
||||
@@ -40,43 +40,60 @@
|
||||
<?php endif;?>
|
||||
<?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?>
|
||||
</th>
|
||||
<th class="text-left"><?php common::printOrderLink('name', $orderBy, $vars, $lang->product->name);?></th>
|
||||
<th class='w-120px' title='<?php echo $lang->product->activeStoriesTitle;?>'><?php echo $lang->product->activeStories;?></th>
|
||||
<th class='w-120px' title='<?php echo $lang->product->changedStoriesTitle;?>'><?php echo $lang->product->changedStories;?></th>
|
||||
<th class='w-100px' title='<?php echo $lang->product->draftStoriesTitle;?>'><?php echo $lang->product->draftStories;?></th>
|
||||
<th class='w-120px' title='<?php echo $lang->product->closedStoriesTitle;?>'><?php echo $lang->product->closedStories;?></th>
|
||||
<th class='w-70px' title='<?php echo $lang->product->plans;?>'><?php echo $lang->product->plans;?></th>
|
||||
<th class='w-70px' title='<?php echo $lang->product->releases;?>'><?php echo $lang->product->releases;?></th>
|
||||
<th class='w-80px' title='<?php echo $lang->product->unResolvedBugsTitle;?>'><?php echo $lang->product->unResolvedBugs;?></th>
|
||||
<th class='w-110px' title='<?php echo $lang->product->assignToNullBugsTitle;?>'><?php echo $lang->product->assignToNullBugs;?></th>
|
||||
<th rowspan="2"><?php common::printOrderLink('name', $orderBy, $vars, $lang->product->name);?></th>
|
||||
<th class="w-300px" colspan="4"><?php echo $lang->story->requirement;?></th>
|
||||
<th class="w-300px" colspan="4"><?php echo $lang->story->story;?></th>
|
||||
<th class="w-150px" colspan="2"><?php echo $lang->bug->common;?></th>
|
||||
<th class="w-80px" rowspan="2"><?php echo $lang->product->release;?></th>
|
||||
<th class="w-80px" rowspan="2"><?php echo $lang->product->plan;?></th>
|
||||
<?php if($canOrder):?>
|
||||
<th class='w-70px sort-default'><?php common::printOrderLink('order', $orderBy, $vars, $lang->product->updateOrder);?></th>
|
||||
<th class='w-70px sort-default' rowspan="2"><?php common::printOrderLink('order', $orderBy, $vars, $lang->product->updateOrder);?></th>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<tr class="text-center">
|
||||
<th><?php echo $lang->story->activate;?></th>
|
||||
<th><?php echo $lang->story->close;?></th>
|
||||
<th><?php echo $lang->story->draft;?></th>
|
||||
<th><?php echo $lang->story->completeRate;?></th>
|
||||
<th style="border-left: 1px solid #ddd;"><?php echo $lang->story->activate;?></th>
|
||||
<th><?php echo $lang->story->close;?></th>
|
||||
<th><?php echo $lang->story->draft;?></th>
|
||||
<th><?php echo $lang->story->completeRate;?></th>
|
||||
<th style="border-left: 1px solid #ddd;"><?php echo $lang->bug->activate;?></th>
|
||||
<th><?php echo $lang->bug->close;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="sortable" id="productTableList">
|
||||
<?php foreach($products as $product):?>
|
||||
<tr class="text-center" data-id='<?php echo $product->id ?>' data-order='<?php echo $product->code;?>'>
|
||||
<td class='c-id text-left'>
|
||||
<?php if($canBatchEdit):?>
|
||||
<?php echo html::checkbox('productIDList', array($product->id => sprintf('%03d', $product->id)));?>
|
||||
<?php else:?>
|
||||
<?php printf('%03d', $product->id);?>
|
||||
<?php
|
||||
$totalStories = $product->stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changed'];
|
||||
$totalRequirements = $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changed'];
|
||||
?>
|
||||
<tr class="text-center" data-id='<?php echo $product->id ?>' data-order='<?php echo $product->code;?>'>
|
||||
<td class='c-id text-left'>
|
||||
<?php if($canBatchEdit):?>
|
||||
<?php echo html::checkbox('productIDList', array($product->id => sprintf('%03d', $product->id)));?>
|
||||
<?php else:?>
|
||||
<?php printf('%03d', $product->id);?>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
<td class="c-name" title='<?php echo $product->name?>'><?php echo html::a($this->createLink('product', 'browse', 'product=' . $product->id), $product->name);?></td>
|
||||
<td><?php echo $product->requirements['active'];?></td>
|
||||
<td><?php echo $product->requirements['closed'];?></td>
|
||||
<td><?php echo $product->requirements['draft'];?></td>
|
||||
<td><?php echo $totalRequirements == 0 ? 0 : round($product->requirements['closed'] / $totalRequirements, 3) * 100;?>%</td>
|
||||
<td><?php echo $product->stories['active'];?></td>
|
||||
<td><?php echo $product->stories['closed'];?></td>
|
||||
<td><?php echo $product->stories['draft'];?></td>
|
||||
<td><?php echo $totalStories == 0 ? 0 : round($product->stories['closed'] / $totalStories, 3) * 100;?>%</td>
|
||||
<td><?php echo $product->unResolved;?></td>
|
||||
<td><?php echo $product->closedBugs;?></td>
|
||||
<td><?php echo $product->releases;?></td>
|
||||
<td><?php echo $product->plans;?></td>
|
||||
<?php if($canOrder):?>
|
||||
<td class='c-actions sort-handler'><i class="icon icon-move"></i></td>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
<td class="c-name" title='<?php echo $product->name?>'><?php echo html::a($this->createLink('product', 'browse', 'product=' . $product->id), $product->name);?></td>
|
||||
<td><?php echo $product->stories['active'];?></td>
|
||||
<td><?php echo $product->stories['changed'];?></td>
|
||||
<td><?php echo $product->stories['draft'];?></td>
|
||||
<td><?php echo $product->stories['closed'];?></td>
|
||||
<td><?php echo $product->plans;?></td>
|
||||
<td><?php echo $product->releases;?></td>
|
||||
<td><?php echo $product->unResolved;?></td>
|
||||
<td><?php echo $product->assignToNull;?></td>
|
||||
<?php if($canOrder):?>
|
||||
<td class='c-actions sort-handler'><i class="icon icon-move"></i></td>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -140,6 +140,7 @@ $lang->story->files = 'Dateien';
|
||||
$lang->story->copy = "Story kopieren";
|
||||
$lang->story->total = "Total Storys";
|
||||
$lang->story->allStories = 'Alle';
|
||||
$lang->story->draft = 'Entwurf';
|
||||
$lang->story->unclosed = 'Nicht geschlossen';
|
||||
$lang->story->deleted = 'Gelöscht';
|
||||
$lang->story->released = 'Released Linked Stories';
|
||||
@@ -151,6 +152,7 @@ $lang->story->repoCommit = 'Commits';
|
||||
$lang->story->noRequirement = 'No Requirements';
|
||||
$lang->story->one = 'One';
|
||||
$lang->story->field = 'Synchronized fields';
|
||||
$lang->story->completeRate = 'Completion Rate';
|
||||
|
||||
$lang->story->ditto = 'Dito';
|
||||
$lang->story->dittoNotice = 'Die Story gehört nicht zum Projekt wie die vorherige!';
|
||||
|
||||
@@ -140,6 +140,7 @@ $lang->story->files = 'Files';
|
||||
$lang->story->copy = "Copy Story";
|
||||
$lang->story->total = "Total Stories";
|
||||
$lang->story->allStories = 'All Stories';
|
||||
$lang->story->draft = 'Draft';
|
||||
$lang->story->unclosed = 'Unclosed';
|
||||
$lang->story->deleted = 'Deleted';
|
||||
$lang->story->released = 'Released Stories';
|
||||
@@ -151,6 +152,7 @@ $lang->story->repoCommit = 'Commits';
|
||||
$lang->story->noRequirement = 'No Requirements';
|
||||
$lang->story->one = 'One';
|
||||
$lang->story->field = 'Synchronized fields';
|
||||
$lang->story->completeRate = 'Completion Rate';
|
||||
|
||||
$lang->story->ditto = 'Ditto';
|
||||
$lang->story->dittoNotice = 'This story is not linked to the same product as the last one is!';
|
||||
|
||||
@@ -140,6 +140,7 @@ $lang->story->files = 'Fichiers';
|
||||
$lang->story->copy = "Copier Story";
|
||||
$lang->story->total = "Stories Total";
|
||||
$lang->story->allStories = 'Toutes les Stories';
|
||||
$lang->story->draft = 'Brouillon';
|
||||
$lang->story->unclosed = 'Non Fermées';
|
||||
$lang->story->deleted = 'Supprimée';
|
||||
$lang->story->released = 'Stories Versionnées';
|
||||
@@ -151,6 +152,7 @@ $lang->story->repoCommit = 'Commits';
|
||||
$lang->story->noRequirement = 'No Requirements';
|
||||
$lang->story->one = 'One';
|
||||
$lang->story->field = 'Synchronized fields';
|
||||
$lang->story->completeRate = 'Completion Rate';
|
||||
|
||||
$lang->story->ditto = 'Idem';
|
||||
$lang->story->dittoNotice = "La story n'est pas associée au même product que la précédente !";
|
||||
|
||||
@@ -140,6 +140,7 @@ $lang->story->files = 'Files';
|
||||
$lang->story->copy = "Copy";
|
||||
$lang->story->total = "Tổng câu chuyện";
|
||||
$lang->story->allStories = 'Tất cả câu chuyện';
|
||||
$lang->story->draft = 'Nháp';
|
||||
$lang->story->unclosed = 'Chưa đóng';
|
||||
$lang->story->deleted = 'Đã xóa';
|
||||
$lang->story->released = 'Đã phát hành';
|
||||
@@ -151,6 +152,7 @@ $lang->story->repoCommit = 'Commits';
|
||||
$lang->story->noRequirement = 'No Requirements';
|
||||
$lang->story->one = 'One';
|
||||
$lang->story->field = 'Synchronized fields';
|
||||
$lang->story->completeRate = 'Completion Rate';
|
||||
|
||||
$lang->story->ditto = 'Như trên';
|
||||
$lang->story->dittoNotice = 'Câu chuyện này chưa liên kết tới cùng sản phẩm bởi bởi vì nó là cuối cùng!';
|
||||
|
||||
@@ -140,6 +140,7 @@ $lang->story->files = '附件';
|
||||
$lang->story->copy = "复制{$lang->productSRCommon}";
|
||||
$lang->story->total = "总{$lang->productSRCommon}";
|
||||
$lang->story->allStories = "所有{$lang->productSRCommon}";
|
||||
$lang->story->draft = '草稿';
|
||||
$lang->story->unclosed = '未关闭';
|
||||
$lang->story->deleted = '已删除';
|
||||
$lang->story->released = "已发布{$lang->productSRCommon}数";
|
||||
@@ -151,6 +152,7 @@ $lang->story->repoCommit = '相关提交';
|
||||
$lang->story->noRequirement = '无需求';
|
||||
$lang->story->one = '一个';
|
||||
$lang->story->field = '同步的字段';
|
||||
$lang->story->completeRate = '完成率';
|
||||
|
||||
$lang->story->ditto = '同上';
|
||||
$lang->story->dittoNotice = "该{$lang->productSRCommon}与上一{$lang->productSRCommon}不属于同一产品!";
|
||||
|
||||
@@ -140,6 +140,7 @@ $lang->story->files = '附件';
|
||||
$lang->story->copy = "複製{$lang->productSRCommon}";
|
||||
$lang->story->total = "總{$lang->productSRCommon}";
|
||||
$lang->story->allStories = "所有{$lang->productSRCommon}";
|
||||
$lang->story->draft = '草稿';
|
||||
$lang->story->unclosed = '未關閉';
|
||||
$lang->story->deleted = '已刪除';
|
||||
$lang->story->released = "已發佈{$lang->productSRCommon}數";
|
||||
@@ -151,6 +152,7 @@ $lang->story->repoCommit = '相關提交';
|
||||
$lang->story->noRequirement = '無需求';
|
||||
$lang->story->one = '一個';
|
||||
$lang->story->field = '同步的欄位';
|
||||
$lang->story->completeRate = '完成率';
|
||||
|
||||
$lang->story->ditto = '同上';
|
||||
$lang->story->dittoNotice = "該{$lang->productSRCommon}與上一{$lang->productSRCommon}不屬於同一產品!";
|
||||
|
||||
@@ -365,7 +365,7 @@ class testtaskModel extends model
|
||||
->where('t1.deleted')->eq(0)
|
||||
->andWhere('t1.auto')->ne('unit')
|
||||
->andWhere('t1.owner')->eq($account)
|
||||
->andWhere('t2.id')->in($this->app->user->view->projects)
|
||||
->andWhere('t2.id')->in($this->app->user->view->sprints)
|
||||
->beginIF($type == 'wait')->andWhere('t1.status')->ne('done')->fi()
|
||||
->beginIF($type == 'done')->andWhere('t1.status')->eq('done')->fi()
|
||||
->orderBy($orderBy)
|
||||
|
||||
Reference in New Issue
Block a user