Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms into zin
This commit is contained in:
@@ -126,7 +126,7 @@ class branchModel extends model
|
||||
|
||||
if($executionID)
|
||||
{
|
||||
if(isset($executionBranches['0'])) $branches = array('0' => $this->lang->branch->main) + $branches;
|
||||
$branches = array('all' => $this->lang->branch->all, '0' => $this->lang->branch->main) + $branches;
|
||||
return $branches;
|
||||
}
|
||||
|
||||
|
||||
+27
-13
@@ -1869,7 +1869,7 @@ class bugModel extends model
|
||||
->where('t1.deleted')->eq(0)
|
||||
->beginIF(empty($build))->andWhere('t1.project')->eq($projectID)->fi()
|
||||
->beginIF(!empty($productID))->andWhere('t1.product')->eq($productID)->fi()
|
||||
->beginIF(!empty($productID))->andWhere('t1.branch')->eq($branchID)->fi()
|
||||
->beginIF(!empty($productID) and $branchID != 'all')->andWhere('t1.branch')->eq($branchID)->fi()
|
||||
->beginIF($type == 'unresolved')->andWhere('t1.status')->eq('active')->fi()
|
||||
->beginIF($type == 'noclosed')->andWhere('t1.status')->ne('closed')->fi()
|
||||
->beginIF($type == 'assignedtome')->andWhere('t1.assignedTo')->eq($this->app->user->account)->fi()
|
||||
@@ -1888,19 +1888,19 @@ class bugModel extends model
|
||||
/**
|
||||
* Get bugs of a execution.
|
||||
*
|
||||
* @param int $executionID
|
||||
* @param int $productID
|
||||
* @param int $branchID
|
||||
* @param int $build
|
||||
* @param string $type
|
||||
* @param int $param
|
||||
* @param string $orderBy
|
||||
* @param string $excludeBugs
|
||||
* @param object $pager
|
||||
* @param int $executionID
|
||||
* @param int $productID
|
||||
* @param int $branchID
|
||||
* @param string|array $builds
|
||||
* @param string $type
|
||||
* @param int $param
|
||||
* @param string $orderBy
|
||||
* @param string $excludeBugs
|
||||
* @param object $pager
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getExecutionBugs($executionID, $productID = 0, $branchID = 'all', $build = 0, $type = '', $param = 0, $orderBy = 'id_desc', $excludeBugs = '', $pager = null)
|
||||
public function getExecutionBugs($executionID, $productID = 0, $branchID = 'all', $builds = 0, $type = '', $param = 0, $orderBy = 'id_desc', $excludeBugs = '', $pager = null)
|
||||
{
|
||||
$type = strtolower($type);
|
||||
if(strpos($orderBy, 'pri_') !== false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy);
|
||||
@@ -1935,15 +1935,28 @@ class bugModel extends model
|
||||
}
|
||||
else
|
||||
{
|
||||
$condition = '';
|
||||
if($builds)
|
||||
{
|
||||
if(!is_array($builds)) $builds = explode(',', $builds);
|
||||
|
||||
$conditions = array();
|
||||
foreach($builds as $build)
|
||||
{
|
||||
if($build) $conditions[] = "FIND_IN_SET('$build', t1.openedBuild)";
|
||||
}
|
||||
$condition = join(' OR ', $conditions);
|
||||
$condition = "($condition)";
|
||||
}
|
||||
$bugs = $this->dao->select("t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, IF(t1.`severity` = 0, {$this->config->maxPriValue}, t1.`severity`) as severityOrder")->from(TABLE_BUG)->alias('t1')
|
||||
->leftJoin(TABLE_MODULE)->alias('t2')->on('t1.module=t2.id')
|
||||
->where('t1.deleted')->eq(0)
|
||||
->beginIF(!empty($productID) and $branchID !== 'all')->andWhere('t1.branch')->eq($branchID)->fi()
|
||||
->beginIF(empty($build))->andWhere('t1.execution')->eq($executionID)->fi()
|
||||
->beginIF(empty($builds))->andWhere('t1.execution')->eq($executionID)->fi()
|
||||
->beginIF(!empty($productID))->andWhere('t1.product')->eq($productID)->fi()
|
||||
->beginIF($type == 'unresolved')->andWhere('t1.status')->eq('active')->fi()
|
||||
->beginIF($type == 'noclosed')->andWhere('t1.status')->ne('closed')->fi()
|
||||
->beginIF($build)->andWhere("CONCAT(',', t1.openedBuild, ',') like '%,$build,%'")->fi()
|
||||
->beginIF($condition)->andWhere("$condition")->fi()
|
||||
->beginIF(!empty($param))->andWhere('t2.path')->like("%,$param,%")->andWhere('t2.deleted')->eq(0)->fi()
|
||||
->beginIF($excludeBugs)->andWhere('t1.id')->notIN($excludeBugs)->fi()
|
||||
->orderBy($orderBy)
|
||||
@@ -2089,6 +2102,7 @@ class bugModel extends model
|
||||
->leftJoin(TABLE_BUILD)->alias('t2')->on('t1.id = t2.execution')
|
||||
->where('t2.id')->in($buildID)
|
||||
->fetchAll('id');
|
||||
if(empty($executions)) return array();
|
||||
|
||||
$condition = 'execution NOT ' . helper::dbIN(array_keys($executions));
|
||||
$minBegin = '';
|
||||
|
||||
@@ -123,7 +123,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class='<?php if($product->shadow and zget($project, 'model') != 'scrum') echo 'hide'?>'>
|
||||
<tr class='<?php if(!($product->shadow and zget($project, 'model') == 'scrum' and $project->multiple)) echo 'hide'?>'>
|
||||
<th><?php echo $lang->bug->productplan;?></th>
|
||||
<td>
|
||||
<span id="planIdBox"><?php echo html::select('plan', $plans, $bug->plan, "class='form-control chosen'");?></span>
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
* @version $Id: view.html.php 4728 2013-05-03 06:14:34Z chencongzhi520@gmail.com $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
@@ -161,7 +162,7 @@
|
||||
<th><?php echo $lang->bug->fromCase;?></th>
|
||||
<td><?php if($bug->case) echo html::a(helper::createLink('testcase', 'view', "caseID=$bug->case&version=$bug->caseVersion", '', true), "<i class='icon icon-sitemap'></i> {$lang->bug->fromCase}$lang->colon$bug->case", '', isonlybody() ? '' : "data-toggle='modal' data-type='iframe' data-width='80%'");?></td>
|
||||
</tr>
|
||||
<tr valign='middle' class='<?php if($product->shadow and zget($project, 'model') != 'scrum') echo 'hide'?>'>
|
||||
<tr valign='middle' class='<?php if(!($product->shadow and zget($project, 'model') == 'scrum' and $project->multiple)) echo 'hide'?>'>
|
||||
<th><?php echo $lang->bug->productplan;?></th>
|
||||
<td><?php if(!$bug->plan or !common::printLink('productplan', 'view', "planID=$bug->plan&type=bug", $bug->planName)) echo $bug->planName;?></td>
|
||||
</tr>
|
||||
|
||||
@@ -292,7 +292,7 @@ class build extends control
|
||||
$this->view->storyPager = $storyPager;
|
||||
|
||||
$generatedBugPager = new pager($type == 'generatedBug' ? $recTotal : 0, $recPerPage, $type == 'generatedBug' ? $pageID : 1);
|
||||
$this->view->generatedBugs = $this->bug->getExecutionBugs($build->execution, $build->product, 'all', $build->id, $type, $param, $type == 'generatedBug' ? $sort : 'status_desc,id_desc', '', $generatedBugPager);
|
||||
$this->view->generatedBugs = $this->bug->getExecutionBugs($build->execution, $build->product, 'all', "$build->id,{$build->builds}", $type, $param, $type == 'generatedBug' ? $sort : 'status_desc,id_desc', '', $generatedBugPager);
|
||||
$this->view->generatedBugPager = $generatedBugPager;
|
||||
|
||||
$this->executeHooks($buildID);
|
||||
|
||||
@@ -57,6 +57,7 @@ $lang->build->notice = new stdclass();
|
||||
$lang->build->notice->changeProduct = "The {$lang->SRCommon}, bug, or the version of the submitted test order has been linked, and its {$lang->productCommon} cannot be modified";
|
||||
$lang->build->notice->changeExecution = "The version of the submitted test order cannot be modified {$lang->executionCommon}";
|
||||
$lang->build->notice->changeBuilds = "The version of the submitted test order cannot be modified builds";
|
||||
$lang->build->notice->autoRelation = "The completed requirements, resolved bugs, and generated bugs under the relevant version will be automatically associated with the project version";
|
||||
|
||||
$lang->build->finishStories = " %s {$lang->SRCommon} sind abgeschlossen.";
|
||||
$lang->build->resolvedBugs = ' %s Bugs sind gelöst.';
|
||||
|
||||
@@ -57,6 +57,7 @@ $lang->build->notice = new stdclass();
|
||||
$lang->build->notice->changeProduct = "The {$lang->SRCommon}, bug, or the version of the submitted test order has been linked, and its {$lang->productCommon} cannot be modified";
|
||||
$lang->build->notice->changeExecution = "The version of the submitted test order cannot be modified {$lang->executionCommon}";
|
||||
$lang->build->notice->changeBuilds = "The version of the submitted test order cannot be modified builds";
|
||||
$lang->build->notice->autoRelation = "The completed requirements, resolved bugs, and generated bugs under the relevant version will be automatically associated with the project version";
|
||||
|
||||
$lang->build->finishStories = " Finished {$lang->SRCommon} %s";
|
||||
$lang->build->resolvedBugs = ' Resolved Bug %s';
|
||||
|
||||
@@ -57,6 +57,7 @@ $lang->build->notice = new stdclass();
|
||||
$lang->build->notice->changeProduct = "The {$lang->SRCommon}, bug, or the version of the submitted test order has been linked, and its {$lang->productCommon} cannot be modified";
|
||||
$lang->build->notice->changeExecution = "The version of the submitted test order cannot be modified {$lang->executionCommon}";
|
||||
$lang->build->notice->changeBuilds = "The version of the submitted test order cannot be modified builds";
|
||||
$lang->build->notice->autoRelation = "The completed requirements, resolved bugs, and generated bugs under the relevant version will be automatically associated with the project version";
|
||||
|
||||
$lang->build->finishStories = " {$lang->SRCommon} Terminées %s";
|
||||
$lang->build->resolvedBugs = ' Bugs Résolus %s';
|
||||
|
||||
@@ -53,6 +53,7 @@ $lang->build->notice = new stdclass();
|
||||
$lang->build->notice->changeProduct = "The {$lang->SRCommon}, bug, or the version of the submitted test order has been linked, and its {$lang->productCommon} cannot be modified";
|
||||
$lang->build->notice->changeExecution = "The version of the submitted test order cannot be modified {$lang->executionCommon}";
|
||||
$lang->build->notice->changeBuilds = "The version of the submitted test order cannot be modified builds";
|
||||
$lang->build->notice->autoRelation = "The completed requirements, resolved bugs, and generated bugs under the relevant version will be automatically associated with the project version";
|
||||
|
||||
$lang->build->finishStories = " {$lang->SRCommon} đã kết thúc %s";
|
||||
$lang->build->resolvedBugs = ' Bug đã giải quyết %s';
|
||||
|
||||
@@ -57,6 +57,7 @@ $lang->build->notice = new stdclass();
|
||||
$lang->build->notice->changeProduct = "已经关联{$lang->SRCommon}、Bug或提交测试单的版本,不能修改其所属{$lang->productCommon}";
|
||||
$lang->build->notice->changeExecution = "提交测试单的版本,不能修改其所属{$lang->executionCommon}";
|
||||
$lang->build->notice->changeBuilds = "提交测试单的版本,不能修改关联版本";
|
||||
$lang->build->notice->autoRelation = "相关版本下完成的需求、解决的Bug、产生的Bug将会自动关联到项目版本中";
|
||||
|
||||
$lang->build->finishStories = " 本次共完成 %s 个{$lang->SRCommon}";
|
||||
$lang->build->resolvedBugs = ' 本次共解决 %s 个Bug';
|
||||
|
||||
@@ -347,6 +347,7 @@ class buildModel extends model
|
||||
if(!dao::isError())
|
||||
{
|
||||
$buildID = $this->dao->lastInsertID();
|
||||
$this->linkChildBuilds($buildID, $build->builds);
|
||||
$this->file->updateObjectID($this->post->uid, $buildID, 'build');
|
||||
$this->file->saveUpload('build', $buildID);
|
||||
$this->loadModel('score')->create('build', 'create', $buildID);
|
||||
@@ -386,6 +387,8 @@ class buildModel extends model
|
||||
if(isset($build->branch) and $oldBuild->branch != $build->branch) $this->dao->update(TABLE_RELEASE)->set('branch')->eq($build->branch)->where('build')->eq($buildID)->exec();
|
||||
if(!dao::isError())
|
||||
{
|
||||
$addBuilds = array_diff(explode(',', $build->builds), explode(',', $oldBuild->builds));
|
||||
if($addBuilds) $this->linkChildBuilds($buildID, $addBuilds);
|
||||
$this->file->updateObjectID($this->post->uid, $buildID, 'build');
|
||||
return common::createChanges($oldBuild, $build);
|
||||
}
|
||||
@@ -561,6 +564,33 @@ class buildModel extends model
|
||||
foreach($this->post->unlinkBugs as $unlinkBugID) $this->action->create('bug', $unlinkBugID, 'unlinkedfrombuild', '', $buildID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Bugs and stories associated with child builds.
|
||||
*
|
||||
* @param int $buildID
|
||||
* @param string $childBuilds
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function linkChildBuilds($buildID, $childBuilds)
|
||||
{
|
||||
$build = $this->dao->select('bugs, stories')->from(TABLE_BUILD)->where('id')->eq($buildID)->fetch();
|
||||
$buildList = $this->dao->select('bugs, stories')->from(TABLE_BUILD)->where('id')->in($childBuilds)->fetchAll();
|
||||
|
||||
foreach($buildList as $buildInfo)
|
||||
{
|
||||
if($buildInfo->bugs) $build->bugs .= ",{$buildInfo->bugs}";
|
||||
if($buildInfo->stories) $build->stories .= ",{$buildInfo->stories}";
|
||||
}
|
||||
|
||||
$build->bugs = explode(',', $build->bugs);
|
||||
$build->bugs = join(',', array_filter($build->bugs));
|
||||
$build->stories = explode(',', $build->stories);
|
||||
$build->stories = join(',', array_filter($build->stories));
|
||||
|
||||
$this->dao->update(TABLE_BUILD)->data($build)->where('id')->eq($buildID)->exec();
|
||||
}
|
||||
|
||||
/**
|
||||
* Build action menu.
|
||||
*
|
||||
|
||||
@@ -45,7 +45,8 @@
|
||||
<?php if($app->tab == 'project' && !empty($multipleProject)):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->build->builds;?></th>
|
||||
<td id='buildBox'><?php echo html::select('builds', array(), '', "class='form-control chosen' multiple");?></td>
|
||||
<td id='buildBox'><?php echo html::select('builds[]', array(), '', "class='form-control chosen' multiple");?></td>
|
||||
<td><?php echo $lang->build->notice->autoRelation;?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
|
||||
@@ -47,7 +47,13 @@
|
||||
<tr>
|
||||
<th><?php echo $lang->build->builds;?></th>
|
||||
<td id='buildBox'><?php echo html::select('builds[]', $builds, $build->builds, "class='form-control chosen' multiple $disabled");?></td>
|
||||
<td><?php if($disabled) echo $lang->build->notice->changeBuilds;?></td>
|
||||
<td>
|
||||
<?php if($disabled):?>
|
||||
<?php echo $lang->build->notice->changeBuilds;?>
|
||||
<?php else:?>
|
||||
<?php echo $lang->build->notice->autoRelation;?>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php elseif(!empty($multipleProject)):?>
|
||||
<th><?php echo $lang->build->execution;?></th>
|
||||
|
||||
@@ -334,7 +334,7 @@ tbody tr td:first-child input {display: none;}
|
||||
</tr>
|
||||
<?php if($build->execution):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->build->execution;?></th>
|
||||
<th><?php echo empty($multipleProject) ? $lang->build->project : $lang->build->execution;?></th>
|
||||
<td><?php echo zget($executions, $build->execution);?></td>
|
||||
</tr>
|
||||
<?php else:?>
|
||||
@@ -343,7 +343,7 @@ tbody tr td:first-child input {display: none;}
|
||||
<td>
|
||||
<?php $builds = '';?>
|
||||
<?php foreach(explode(',', $build->builds) as $buildID):?>
|
||||
<?php $builds .= html::a($this->createLink('build', 'view', "buildID=$buildID") . "#app={$app->tab}", zget($buildPairs, $buildID)) . $lang->comma;?>
|
||||
<?php if($buildID) $builds .= html::a($this->createLink('build', 'view', "buildID=$buildID") . "#app={$app->tab}", zget($buildPairs, $buildID)) . $lang->comma;?>
|
||||
<?php endforeach;?>
|
||||
<?php echo rtrim($builds, $lang->comma);?>
|
||||
</td>
|
||||
|
||||
@@ -215,7 +215,7 @@ $lang->scrum->menu->devops = array('link' => "{$lang->repo->common}|repo|br
|
||||
$lang->scrum->menu->build = array('link' => "{$lang->build->common}|project|build|project=%s", 'subModule' => 'projectbuild');
|
||||
$lang->scrum->menu->release = array('link' => "{$lang->release->common}|projectrelease|browse|project=%s", 'subModule' => 'projectrelease');
|
||||
$lang->scrum->menu->dynamic = array('link' => "$lang->dynamic|project|dynamic|project=%s");
|
||||
$lang->scrum->menu->settings = array('link' => "$lang->settings|project|view|project=%s", 'subModule' => 'tree,stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist,team,managerepo');
|
||||
$lang->scrum->menu->settings = array('link' => "$lang->settings|project|view|project=%s", 'subModule' => 'tree,stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist,team,managerepo', 'exclude' => 'tree-browsetask');
|
||||
|
||||
$lang->scrum->menu->storyGroup['dropMenu'] = new stdclass();
|
||||
$lang->scrum->menu->storyGroup['dropMenu']->story = array('link' => "{$lang->SRCommon}|projectstory|story|projectID=%s&productID=%s", 'subModule' => 'projectstory,tree');
|
||||
@@ -343,7 +343,7 @@ $lang->execution->menu->view = array('link' => "$lang->view|execution|grouptas
|
||||
if($config->edition != 'open') $lang->execution->menu->view = array('link' => "$lang->view|execution|gantt|executionID=%s", 'alias' => 'grouptask,tree,taskeffort,gantt,calendar,relation,maintainrelation');
|
||||
|
||||
$lang->execution->menu->storyGroup = array('link' => "{$lang->common->story}|execution|story|executionID=%s",'class' => 'dropdown dropdown-hover', 'subModule' => 'story', 'alias' => 'batchcreate,storykanban');
|
||||
$lang->execution->menu->story = array('link' => "$lang->SRCommon|execution|story|executionID=%s", 'subModule' => 'story', 'alias' => 'storykanban');
|
||||
$lang->execution->menu->story = array('link' => "$lang->SRCommon|execution|story|executionID=%s", 'subModule' => 'story', 'alias' => 'storykanban,linkstory');
|
||||
$lang->execution->menu->qa = array('link' => "{$lang->qa->common}|execution|bug|executionID=%s", 'subModule' => 'bug,testcase,testtask,testreport', 'alias' => 'qa,bug,testcase,testtask,testreport');
|
||||
$lang->execution->menu->devops = array('link' => "{$lang->repo->common}|repo|browse|repoID=0&branchID=&objectID=%s", 'subModule' => 'repo');
|
||||
$lang->execution->menu->doc = array('link' => "{$lang->doc->common}|doc|tableContents|type=execution&objectID=%s", 'subModule' => 'doc');
|
||||
@@ -791,6 +791,7 @@ if(!helper::hasFeature('devops'))
|
||||
unset($lang->mainNav->devops, $lang->mainNav->menuOrder[35]);
|
||||
unset($lang->scrum->menu->devops, $lang->scrum->menuOrder[25]);
|
||||
unset($lang->waterfall->menu->devops, $lang->waterfall->menuOrder[35]);
|
||||
unset($lang->execution->menu->devops, $lang->execution->menuOrder[45]);
|
||||
}
|
||||
|
||||
if(!helper::hasFeature('kanban'))
|
||||
|
||||
@@ -180,7 +180,7 @@ class execution extends control
|
||||
|
||||
/* Save to session. */
|
||||
$uri = $this->app->getURI(true);
|
||||
$this->app->session->set('taskList', $uri, 'execution');
|
||||
$this->app->session->set('taskList', $uri . "#app={$this->app->tab}", 'execution');
|
||||
|
||||
/* Process the order by field. */
|
||||
if(!$orderBy) $orderBy = $this->cookie->executionTaskOrder ? $this->cookie->executionTaskOrder : 'status,id_desc';
|
||||
@@ -685,12 +685,12 @@ class execution extends control
|
||||
unset($this->config->bug->search['fields']['resolvedDate']);
|
||||
unset($this->config->bug->search['fields']['closedDate']);
|
||||
unset($this->config->bug->search['fields']['branch']);
|
||||
if(empty($execution->multiple) && empty($execution->hasProduct)) unset($this->config->bug->search['fields']['plan']);
|
||||
if(empty($project->hasProduct))
|
||||
{
|
||||
unset($this->config->bug->search['fields']['product']);
|
||||
if($project->model !== 'scrum') unset($this->config->bug->search['fields']['plan']);
|
||||
}
|
||||
|
||||
unset($this->config->bug->search['params']['resolvedBy']);
|
||||
unset($this->config->bug->search['params']['closedBy']);
|
||||
unset($this->config->bug->search['params']['status']);
|
||||
@@ -998,7 +998,7 @@ class execution extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function bug($executionID = 0, $productID = 0, $branch = 0, $orderBy = 'status,id_desc', $build = 0, $type = 'all', $param = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
public function bug($executionID = 0, $productID = 0, $branch = 'all', $orderBy = 'status,id_desc', $build = 0, $type = 'all', $param = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
/* Load these two models. */
|
||||
$this->loadModel('bug');
|
||||
@@ -1165,7 +1165,7 @@ class execution extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function testcase($executionID = 0, $productID = 0, $branchID = 0, $type = 'all', $moduleID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
public function testcase($executionID = 0, $productID = 0, $branchID = 'all', $type = 'all', $moduleID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
$this->loadModel('testcase');
|
||||
$this->loadModel('testtask');
|
||||
@@ -1733,10 +1733,28 @@ class execution extends control
|
||||
$this->view->linkedBranches = $linkedBranches;
|
||||
}
|
||||
|
||||
if(!empty($project->hasProduct))
|
||||
{
|
||||
$shadowProduct = $this->loadModel('product')->getShadowProductByProject($project->id);
|
||||
$productPlan = $this->loadModel('productplan')->getPairs($shadowProduct->id, '0,0', 'noclosed,unexpired', true);
|
||||
}
|
||||
|
||||
if(!empty($_POST))
|
||||
{
|
||||
if(isset($_POST['attribute']) and in_array($_POST['attribute'], array('request', 'design', 'review'))) unset($_POST['plans']);
|
||||
|
||||
/* No product execution link plans. */
|
||||
if(!empty($project->hasProduct) and !empty($_POST['plans']))
|
||||
{
|
||||
$plansItem = array();
|
||||
foreach($_POST['plans'] as $planItem)
|
||||
{
|
||||
if(empty($planItem[0][0])) continue;
|
||||
$plansItem[] = $planItem[0][0];
|
||||
}
|
||||
$_POST['plans'] = array($_POST['products'][0] => array(0 => $plansItem));
|
||||
}
|
||||
|
||||
$executionID = $this->execution->create($copyExecutionID);
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
|
||||
@@ -1808,7 +1826,7 @@ class execution extends control
|
||||
|
||||
$this->loadModel('product');
|
||||
$allProducts = $this->product->getProductPairsByProject($projectID, 'noclosed');
|
||||
$copyProjects = $this->loadModel('project')->getPairsByProgram(isset($project->parent) ? $project->parent : '', 'noclosed', '', 'order_asc', '', isset($project->model) ? $project->model : '', true);
|
||||
$copyProjects = $this->loadModel('project')->getPairsByProgram(isset($project->parent) ? $project->parent : '', 'noclosed', '', 'order_asc', '', isset($project->model) ? $project->model : '', 'multiple');
|
||||
$copyProjectID = ($projectID == 0) ? key($copyProjects) : $projectID;
|
||||
|
||||
if(!empty($project->hasProduct)) $allProducts = array(0 => '') + $allProducts;
|
||||
@@ -1826,7 +1844,7 @@ class execution extends control
|
||||
$this->view->code = $code;
|
||||
$this->view->team = $team;
|
||||
$this->view->teams = array(0 => '') + $this->execution->getCanCopyObjects((int)$projectID);
|
||||
$this->view->allProjects = array(0 => '') + $this->project->getPairsByModel('all', 0, 'noclosed');
|
||||
$this->view->allProjects = array(0 => '') + $this->project->getPairsByModel('all', 0, 'noclosed,multiple');
|
||||
$this->view->copyProjects = $copyProjects;
|
||||
$this->view->copyExecutions = array('' => '') + $this->execution->getList($copyProjectID);
|
||||
$this->view->executionID = $executionID;
|
||||
|
||||
@@ -345,6 +345,7 @@ $lang->execution->wbs = "Aufgaben aufteilen";
|
||||
$lang->execution->batchWBS = "Mehrere aufteilen";
|
||||
$lang->execution->howToUpdateBurn = "<a href='http://api.zentao.net/goto.php?item=burndown&lang=zh-cn' target='_blank' title='Wie wird der Burndown Chart aktualisiert?' class='btn btn-link'>Hilfe <i class='icon icon-help'></i></a>";
|
||||
$lang->execution->whyNoStories = "Keine Story kann verknüpft werden. Bitte prüfen Sie ob ein Story mit {$lang->executionCommon} verknüpft ist {$lang->productCommon} und stellen Sie sicher das diese geprüft ist.";
|
||||
$lang->execution->projectNoStories = "No story can be linked. Please check whether there is any story in project and make sure it has been reviewed.";
|
||||
$lang->execution->productStories = "{$lang->executionCommon} verknüpfte Story ist ein Subset von {$lang->productCommon}, welche nur nach überprüfung verknüpft werden kann. Bitte <a href='%s'> Story verknüpfen</a>。";
|
||||
$lang->execution->haveDraft = "There are %s draft stories can't be linked.";
|
||||
$lang->execution->doneExecutions = 'Erledigt';
|
||||
|
||||
@@ -345,6 +345,7 @@ $lang->execution->wbs = "Create Task";
|
||||
$lang->execution->batchWBS = "Batch Create Tasks";
|
||||
$lang->execution->howToUpdateBurn = "<a href='https://api.zentao.pm/goto.php?item=burndown' target='_blank' title='How to update the Burndown Chart?' class='btn btn-link'>Help <i class='icon icon-help'></i></a>";
|
||||
$lang->execution->whyNoStories = "No story can be linked. Please check whether there is any story in {$lang->executionCommon} which is linked to {$lang->productCommon} and make sure it has been reviewed.";
|
||||
$lang->execution->projectNoStories = "No story can be linked. Please check whether there is any story in project and make sure it has been reviewed.";
|
||||
$lang->execution->productStories = "Stories linked to {$lang->executionCommon} are the subeset of stories linked to {$lang->productCommon}. Stories can only be linked after they pass the review. <a href='%s'> Link Stories</a> now.";
|
||||
$lang->execution->haveDraft = "%s stories in draft, so they can't be linked.";
|
||||
$lang->execution->doneExecutions = 'Finished';
|
||||
|
||||
@@ -345,6 +345,7 @@ $lang->execution->wbs = "Créer Tâche";
|
||||
$lang->execution->batchWBS = "Créer Tâche en lot";
|
||||
$lang->execution->howToUpdateBurn = "<a href='https://api.zentao.pm/goto.php?item=burndown' target='_blank' title='Comment mettre à jour le Graphe d´atterrissage ?' class='btn btn-link'>Mise à jour <i class='icon icon-help'></i></a>";
|
||||
$lang->execution->whyNoStories = "Aucune story ne peut être associée. Vérifiez s'il existe des stories dans {$lang->executionCommon} qui sont associées à {$lang->productCommon} et vérifiez qu'elles ont bien été validées.";
|
||||
$lang->execution->projectNoStories = "No story can be linked. Please check whether there is any story in project and make sure it has been reviewed.";
|
||||
$lang->execution->productStories = "Les stories associées au {$lang->executionCommon} sont une portion des stories associées au {$lang->productCommon}. Les stories ne peuvent être associées à un {$lang->executionCommon} qu'après avoir été validées. <a href='%s'> Associer Stories</a> maintenant.";
|
||||
$lang->execution->haveDraft = "%s stories sont encore en conception, elles ne peuvent pas être associées au {$lang->executionCommon} actuellement.";
|
||||
$lang->execution->doneExecutions = 'Terminé';
|
||||
|
||||
@@ -281,6 +281,7 @@ $lang->execution->wbs = "Tạo nhiệm vụ";
|
||||
$lang->execution->batchWBS = "Tạo nhiệm vụ hàng loạt";
|
||||
$lang->execution->howToUpdateBurn = "<a href='https://api.zentao.pm/goto.php?item=burndown' target='_blank' title='Làm thế nào để cập nhật biểu đồ Burndown?' class='btn btn-link'>Giúp<i class='icon icon-help'></i></a>";
|
||||
$lang->execution->whyNoStories = "Không có câu chuyện có thể liên kết. Vui lòng kiểm tra có câu chuyện trong {$lang->executionCommon} cái liên kết tới {$lang->productCommon} và chắc chắn nó đã được duyệt.";
|
||||
$lang->execution->projectNoStories = "No story can be linked. Please check whether there is any story in project and make sure it has been reviewed.";
|
||||
$lang->execution->productStories = "Câu chuyện liên kết tới {$lang->executionCommon} là tập hợp con của câu chuyện liên kết tới {$lang->productCommon}. Các câu chuyện chỉ có thể liên kết sau khi chúng đã được duyệt. <a href='%s'> Liên kết câu chuyện</a> now.";
|
||||
$lang->execution->haveDraft = "%s câu chuyện đang nháp, bởi vậy chúng không thể liên kết.";
|
||||
$lang->execution->doneExecutions = 'Kết thúc';
|
||||
|
||||
@@ -345,6 +345,7 @@ $lang->execution->wbs = "分解任务";
|
||||
$lang->execution->batchWBS = "批量分解";
|
||||
$lang->execution->howToUpdateBurn = "<a href='https://api.zentao.net/goto.php?item=burndown&lang=zh-cn' target='_blank' title='如何更新燃尽图?' class='btn btn-link'>帮助 <i class='icon icon-help'></i></a>";
|
||||
$lang->execution->whyNoStories = "看起来没有{$lang->SRCommon}可以关联。请检查下{$lang->executionCommon}关联的{$lang->productCommon}中有没有{$lang->SRCommon},而且要确保它们已经审核通过。";
|
||||
$lang->execution->projectNoStories = "看起来没有{$lang->SRCommon}可以关联。请检查下项目中有没有{$lang->SRCommon},而且要确保它们已经审核通过。";
|
||||
$lang->execution->productStories = "{$lang->executionCommon}关联的{$lang->SRCommon}是{$lang->productCommon}{$lang->SRCommon}的子集,并且只有评审通过的{$lang->SRCommon}才能关联。请<a href='%s'>关联{$lang->SRCommon}</a>。";
|
||||
$lang->execution->haveDraft = "有%s条草稿状态的{$lang->SRCommon}无法关联到该执行";
|
||||
$lang->execution->doneExecutions = '已结束';
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
<th class="c-id-sm"><?php echo $lang->build->id;?></th>
|
||||
<th class="c-name w-200px text-left <?php echo $hidden;?>"><?php echo $lang->build->product;?></th>
|
||||
<th class="c-name text-left"><?php echo $lang->build->name;?></th>
|
||||
<th class="c-name w-200px text-left"><?php echo $lang->build->product;?></th>
|
||||
<th class="c-url"><?php echo $lang->build->scmPath;?></th>
|
||||
<th class="c-url"><?php echo $lang->build->filePath;?></th>
|
||||
<th class="c-date"><?php echo $lang->build->date;?></th>
|
||||
@@ -69,7 +68,6 @@
|
||||
<?php if($build->branchName) echo "<span class='label label-outline label-badge'>{$build->branchName}</span>"?>
|
||||
<?php echo html::a($this->createLink('build', 'view', "build=$build->id"), $build->name);?>
|
||||
</td>
|
||||
<td class="c-name text-left" title='<?php echo $build->productName;?>'><?php echo $build->productName;?></td>
|
||||
<td class="c-url" title="<?php echo $build->scmPath?>"><?php echo strpos($build->scmPath, 'http') === 0 ? html::a($build->scmPath) : $build->scmPath;?></td>
|
||||
<td class="c-url" title="<?php echo $build->filePath?>"><?php echo strpos($build->filePath, 'http') === 0 ? html::a($build->filePath) : $build->filePath;?></td>
|
||||
<td class="c-date"><?php echo $build->date?></td>
|
||||
|
||||
@@ -74,7 +74,7 @@ $canBatchCreateBug = ($productID and common::hasPriv('bug', 'batchCreate') and
|
||||
$canImportBug = ($productID and common::hasPriv('execution', 'importBug'));
|
||||
$canCreateStory = ($productID and common::hasPriv('story', 'create'));
|
||||
$canBatchCreateStory = ($productID and common::hasPriv('story', 'batchCreate'));
|
||||
$canLinkStory = ($productID and common::hasPriv('execution', 'linkStory'));
|
||||
$canLinkStory = ($productID and common::hasPriv('execution', 'linkStory') and !empty($execution->hasProduct));
|
||||
$canLinkStoryByPlan = ($productID and common::hasPriv('execution', 'importplanstories') and !empty($project->hasProduct));
|
||||
$hasStoryButton = ($canCreateStory or $canBatchCreateStory or $canLinkStory or $canLinkStoryByPlan);
|
||||
$hasTaskButton = ($canCreateTask or $canBatchCreateTask or $canImportBug);
|
||||
|
||||
@@ -105,7 +105,8 @@
|
||||
</div>
|
||||
<?php else:?>
|
||||
<div class="table-empty-tip">
|
||||
<p><span class="text-muted"><?php echo $lang->{$app->rawModule}->whyNoStories;?></p>
|
||||
<?php $emptyTips = ($app->rawModule == 'execution' and !$project->hasProduct) ? 'projectNoStories' : 'whyNoStories';?>
|
||||
<p><span class="text-muted"><?php echo $lang->{$app->rawModule}->{$emptyTips};?></p>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</form>
|
||||
|
||||
@@ -79,9 +79,9 @@
|
||||
<?php endif;?>
|
||||
<?php
|
||||
if($productID) common::printIcon('story', 'report', "productID=$productID&branchID=&storyType=$storyType&browseType=$type&moduleID=$param&chartType=pie&projectID=$execution->id", '', 'button', 'bar-chart muted');
|
||||
common::printLink('story', 'export', "productID=$productID&orderBy=id_desc&executionID=$execution->id", "<i class='icon icon-export muted'></i> " . $lang->story->export, '', "class='btn btn-link export iframe'");
|
||||
common::printLink('story', 'export', "productID=$productID&orderBy=id_desc&executionID=$execution->id&browseType=$type&storyType=$storyType", "<i class='icon icon-export muted'></i> " . $lang->story->export, '', "class='btn btn-link export iframe'");
|
||||
|
||||
$canLinkStory = $execution->hasProduct or $execution->multiple;
|
||||
$canLinkStory = $execution->multiple;
|
||||
if(common::canModify('execution', $execution))
|
||||
{
|
||||
$this->lang->story->create = $this->lang->execution->createStory;
|
||||
@@ -221,7 +221,7 @@
|
||||
<?php
|
||||
$datatableId = $this->moduleName . ucfirst($this->methodName);
|
||||
$useDatatable = (isset($config->datatable->$datatableId->mode) and $config->datatable->$datatableId->mode == 'datatable');
|
||||
$vars = "executionID={$execution->id}&orderBy=%s&type=$type¶m=$param&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}";
|
||||
$vars = "executionID={$execution->id}&storyType=$storyType&orderBy=%s&type=$type¶m=$param&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}";
|
||||
|
||||
if($useDatatable) include '../../common/view/datatable.html.php';
|
||||
if(!$execution->hasProduct and !$execution->multiple)
|
||||
@@ -253,6 +253,8 @@
|
||||
foreach($setting as $key => $value)
|
||||
{
|
||||
if(!$execution->hasProduct and !$execution->multiple and $value->id == 'plan') continue;
|
||||
if(!$execution->hasProduct and !$execution->multiple and $value->id == 'stage') continue;
|
||||
if(!$execution->hasProduct and !$execution->multiple and $storyType == 'requirement' and $value->id == 'taskCount') continue;
|
||||
if($value->show)
|
||||
{
|
||||
$this->datatable->printHead($value, $orderBy, $vars, $canBatchAction);
|
||||
@@ -271,6 +273,8 @@
|
||||
<?php foreach($setting as $key => $value)
|
||||
{
|
||||
if(!$execution->hasProduct and !$execution->multiple and $value->id == 'plan') continue;
|
||||
if(!$execution->hasProduct and !$execution->multiple and $value->id == 'stage') continue;
|
||||
if(!$execution->hasProduct and !$execution->multiple and $storyType == 'requirement' and $value->id == 'taskCount') continue;
|
||||
$this->story->printCell($value, $story, $users, $branchOption, $storyStages, $modulePairs, $storyTasks, $storyBugs, $storyCases, $useDatatable ? 'datatable' : 'table', $storyType, $execution, $showBranch);
|
||||
}
|
||||
?>
|
||||
@@ -285,6 +289,8 @@
|
||||
<?php foreach($setting as $key => $value)
|
||||
{
|
||||
if(!$execution->hasProduct and !$execution->multiple and $value->id == 'plan') continue;
|
||||
if(!$execution->hasProduct and !$execution->multiple and $value->id == 'stage') continue;
|
||||
if(!$execution->hasProduct and !$execution->multiple and $storyType == 'requirement' and $value->id == 'taskCount') continue;
|
||||
$this->story->printCell($value, $child, $users, $branchOption, $storyStages, $modulePairs, $storyTasks, $storyBugs, $storyCases, $useDatatable ? 'datatable' : 'table', $storyType, $execution);
|
||||
}?>
|
||||
</tr>
|
||||
|
||||
@@ -12,8 +12,9 @@
|
||||
<?php js::set('confirmUnlinkStory', $lang->execution->confirmUnlinkStory)?>
|
||||
<?php js::set('canBeChanged', $canBeChanged)?>
|
||||
<?php
|
||||
$cols = array('projected', 'developing', 'developed', 'testing', 'tested', 'verified', 'released');
|
||||
$account = $this->app->user->account;
|
||||
$cols = array('projected', 'developing', 'developed', 'testing', 'tested', 'verified', 'released');
|
||||
$account = $this->app->user->account;
|
||||
$canLinkStory = $execution->hasProduct or $execution->multiple;
|
||||
?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
@@ -59,9 +60,24 @@ $account = $this->app->user->account;
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->story->noStory;?></span>
|
||||
<?php if($canBeChanged and common::hasPriv('execution', 'linkStory')):?>
|
||||
<?php echo html::a($this->createLink('execution', 'linkStory', "execution=$execution->id"), "<i class='icon icon-link'></i> " . $lang->execution->linkStory, '', "class='btn btn-info'");?>
|
||||
<?php endif;?>
|
||||
<?php
|
||||
if(common::canModify('execution', $execution))
|
||||
{
|
||||
if($canLinkStory and $canBeChanged and common::hasPriv('execution', 'linkStory'))
|
||||
{
|
||||
echo html::a($this->createLink('execution', 'linkStory', "execution=$execution->id"), "<i class='icon icon-link'></i> " . $lang->execution->linkStory, '', "class='btn btn-info'");
|
||||
}
|
||||
else
|
||||
{
|
||||
$storyModuleID = (int)$this->cookie->storyModuleParam;
|
||||
if(common::hasPriv('story', 'create'))
|
||||
{
|
||||
$createStoryLink = $this->createLink('story', 'create', "productID=$productID&branch=0&moduleID={$storyModuleID}&story=0&execution=$execution->id");
|
||||
echo html::a($createStoryLink, "<i class='icon icon-plus'></i> " . $lang->execution->createStory, '', "class='btn btn-info' data-app=$app->tab");
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
</p>
|
||||
</div>
|
||||
<?php else:?>
|
||||
|
||||
@@ -90,8 +90,8 @@
|
||||
$canImportBug = ($productID and common::hasPriv('execution', 'importBug'));
|
||||
$canCreateStory = ($productID and common::hasPriv('story', 'create'));
|
||||
$canBatchCreateStory = ($productID and common::hasPriv('story', 'batchCreate'));
|
||||
$canLinkStory = ($productID and common::hasPriv('execution', 'linkStory'));
|
||||
$canLinkStoryByPlan = ($productID and common::hasPriv('execution', 'importplanstories') and !$hiddenPlan);
|
||||
$canLinkStory = ($productID and common::hasPriv('execution', 'linkStory') and !empty($execution->hasProduct));
|
||||
$canLinkStoryByPlan = ($productID and common::hasPriv('execution', 'importplanstories') and !$hiddenPlan and !empty($execution->hasProduct));
|
||||
$hasStoryButton = ($canCreateStory or $canBatchCreateStory or $canLinkStory or $canLinkStoryByPlan);
|
||||
$hasTaskButton = ($canCreateTask or $canBatchCreateTask or $canImportBug);
|
||||
$hasBugButton = ($canCreateBug or $canBatchCreateBug);
|
||||
|
||||
@@ -51,24 +51,6 @@ class installModel extends model
|
||||
return PHP_VERSION;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get latest release.
|
||||
*
|
||||
* @access public
|
||||
* @return string or bool
|
||||
*/
|
||||
public function getLatestRelease()
|
||||
{
|
||||
if(!function_exists('json_decode')) return false;
|
||||
$result = file_get_contents('https://www.zentao.net/misc-getlatestrelease.json');
|
||||
if($result)
|
||||
{
|
||||
$result = json_decode($result);
|
||||
if(isset($result->release) and $this->config->version != $result->release->version) return $result->release;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check php version.
|
||||
*
|
||||
|
||||
@@ -1378,7 +1378,7 @@ class kanban extends control
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
$this->view->projects = array($this->lang->kanban->allProjects) + $this->project->getPairsByProgram();
|
||||
$this->view->projects = array($this->lang->kanban->allProjects) + $this->project->getPairsByProgram('', 'all', false, '', '', '', 'multiple');
|
||||
$this->view->selectedProjectID = $selectedProjectID;
|
||||
$this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID);
|
||||
$this->view->executions2Imported = $this->execution->getStatData($selectedProjectID, 'undone', 0, 0, false, '', 'id_asc', $pager);
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
#releaseList > tbody > tr:hover{background-color: unset!important;}
|
||||
#product_chosen {width: 45% !important}
|
||||
@@ -33,7 +33,7 @@
|
||||
</div>
|
||||
<?php if($releases2Imported):?>
|
||||
<form class='main-table' method='post' data-ride='table' target='hiddenwin' id='importReleaseForm'>
|
||||
<table class='table table-fixed' id='releaseList'>
|
||||
<table class='table table-bordered table-fixed' id='releaseList'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="c-id">
|
||||
@@ -43,32 +43,41 @@
|
||||
<?php echo $lang->idAB;?>
|
||||
</th>
|
||||
<th class='c-name'><?php echo $lang->release->name;?></th>
|
||||
<th class='c-name'><?php echo $lang->release->project;?></th>
|
||||
<th class='c-name'><?php echo $lang->release->build;?></th>
|
||||
<th class='c-name'><?php echo $lang->release->includedBuild;?></th>
|
||||
<th class='c-name'><?php echo $lang->release->relatedProject;?></th>
|
||||
<th class='c-date'><?php echo $lang->release->date;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($releases2Imported as $release):?>
|
||||
<?php $i = 1;?>
|
||||
<?php $buildCount = count($release->builds);?>
|
||||
<?php foreach($release->builds as $build):?>
|
||||
<tr>
|
||||
<td class='c-id'>
|
||||
<?php if($i == 1):?>
|
||||
<td rowspan="<?php echo $buildCount;?>" class='c-id'>
|
||||
<div class="checkbox-primary">
|
||||
<input type='checkbox' name='releases[]' value='<?php echo $release->id;?>'/>
|
||||
<label></label>
|
||||
</div>
|
||||
<?php printf('%03d', $release->id);?>
|
||||
</td>
|
||||
<?php if(common::hasPriv('release', 'view')):?>
|
||||
<td title='<?php echo $release->name;?>'>
|
||||
<td rowspan="<?php echo $buildCount;?>" title='<?php echo $release->name;?>'>
|
||||
<?php if(common::hasPriv('release', 'view')):?>
|
||||
<a href='javascript:void(0);' onclick="locateView('release', <?php echo $release->id;?>)"><?php echo $release->name;?></a>
|
||||
<?php else:?>
|
||||
<?php echo $release->name;?>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
<?php else:?>
|
||||
<td title='<?php echo $release->name;?>'><?php echo $release->name;?></td>
|
||||
<?php endif;?>
|
||||
<td title='<?php echo $release->projectName;?>'><?php echo $release->projectName;?></td>
|
||||
<td title='<?php echo $release->buildName;?>'><?php echo $release->buildName;?></td>
|
||||
<td title='<?php echo $release->date;?>'><?php echo $release->date;?></td>
|
||||
<td title='<?php echo $build->name;?>'><?php echo $build->name;?></td>
|
||||
<td title='<?php echo $build->projectName;?>'><?php echo $build->projectName;?></td>
|
||||
<?php if($i == 1):?>
|
||||
<td rowspan="<?php echo $buildCount;?>" title='<?php echo $release->date;?>'><?php echo $release->date;?></td>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<?php $i++;?>
|
||||
<?php endforeach;?>
|
||||
<?php endforeach;?>
|
||||
<tr><?php echo html::hidden('targetLane', key($lanePairs));?></tr>
|
||||
</tbody>
|
||||
@@ -83,5 +92,4 @@
|
||||
<div class='table-empty-tip'><?php echo $lang->noData;?></div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<style>#product_chosen {width: 45% !important}</style>
|
||||
<?php include '../../common/view/footer.lite.html.php';?>
|
||||
|
||||
@@ -66,6 +66,8 @@ class messageModel extends model
|
||||
*/
|
||||
public function send($objectType, $objectID, $actionType, $actionID, $actor = '', $extra = '')
|
||||
{
|
||||
if(defined('TUTORIAL')) return;
|
||||
|
||||
$objectType = strtolower($objectType);
|
||||
$messageSetting = $this->config->message->setting;
|
||||
if(is_string($messageSetting)) $messageSetting = json_decode($messageSetting, true);
|
||||
|
||||
@@ -47,8 +47,8 @@ $lang->misc->zentao->cowin['feedback'] = "Feedback";
|
||||
$lang->misc->zentao->cowin['recommend'] = "More";
|
||||
|
||||
$lang->misc->zentao->service['zentaotrain'] = 'ZenTao Training';
|
||||
$lang->misc->zentao->service['idc'] = 'Zentao Cloud';
|
||||
$lang->misc->zentao->service['custom'] = 'Zentao Custom';
|
||||
$lang->misc->zentao->service['idc'] = 'ZenTao Cloud';
|
||||
$lang->misc->zentao->service['custom'] = 'ZenTao Custom';
|
||||
|
||||
global $config;
|
||||
$lang->misc->zentao->others['chanzhi'] = "<img src='{$config->webRoot}theme/default/images/main/chanzhi.ico' /> Zsite";
|
||||
@@ -100,7 +100,7 @@ $lang->misc->feature->close = 'Close';
|
||||
$lang->misc->feature->downloadFile = 'Download introduction';
|
||||
$lang->misc->feature->tutorialDesc = '<p>ZenTao 15.0 has new functions, and you know how to use it through the "<strong>Tutorial</strong>".</p><p>Click your [<span style="color: #0c60e1">Avatar-Theme-Young Blue</span>] to set it.</p>';
|
||||
$lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme, the pages are more beautiful and the experience is more friendly.</p><p>Click your [<span style="color: #0c60e1">Avatar-Theme-Young Blue</span>] to set it.</p>';
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[Full Feature Interface]</span> and daily office affairs in <span style='color: #0c60e1'>[Operation Management Interface]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['17.8'] = '2022-11-02';
|
||||
@@ -225,7 +225,7 @@ $lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc'
|
||||
$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust details,Fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust details, fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.rc2'][] = array('title' => 'Fix Bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.rc1'][] = array('title' => 'Upgrade to 15,reframe menu, add program.', 'desc' => '');
|
||||
$lang->misc->feature->all['12.5.3'][] = array('title' => 'Adjust annual data.', 'desc' => '');
|
||||
|
||||
@@ -100,7 +100,7 @@ $lang->misc->feature->close = 'Close';
|
||||
$lang->misc->feature->downloadFile = 'Download introduction';
|
||||
$lang->misc->feature->tutorialDesc = '<p>ZenTao 15.0 has new functions, and you know how to use it through the "<strong>Tutorial</strong>".</p><p>Click your [<span style="color: #0c60e1">Avatar-Theme-Young Blue</span>] to set it.</p>';
|
||||
$lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme, the pages are more beautiful and the experience is more friendly.</p><p>Click your [<span style="color: #0c60e1">Avatar-Theme-Young Blue</span>] to set it.</p>';
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[Full Feature Interface]</span> and daily office affairs in <span style='color: #0c60e1'>[Operation Management Interface]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['17.8'] = '2022-11-02';
|
||||
@@ -223,9 +223,9 @@ $lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new v
|
||||
|
||||
$lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0'][] = array('title' => 'Fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust details,Fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust details, fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.rc2'][] = array('title' => 'Fix Bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.rc1'][] = array('title' => 'Upgrade to 15,reframe menu, add program.', 'desc' => '');
|
||||
$lang->misc->feature->all['12.5.3'][] = array('title' => 'Adjust annual data.', 'desc' => '');
|
||||
|
||||
@@ -47,8 +47,8 @@ $lang->misc->zentao->cowin['feedback'] = "Feedback";
|
||||
$lang->misc->zentao->cowin['recommend'] = "Plus...";
|
||||
|
||||
$lang->misc->zentao->service['zentaotrain'] = 'ZenTao Training';
|
||||
$lang->misc->zentao->service['idc'] = 'Zentao Cloud';
|
||||
$lang->misc->zentao->service['custom'] = 'Zentao Custom';
|
||||
$lang->misc->zentao->service['idc'] = 'ZenTao Cloud';
|
||||
$lang->misc->zentao->service['custom'] = 'ZenTao Custom';
|
||||
|
||||
global $config;
|
||||
$lang->misc->zentao->others['chanzhi'] = "<img src='{$config->webRoot}theme/default/images/main/chanzhi.ico' /> Zsite";
|
||||
@@ -100,7 +100,7 @@ $lang->misc->feature->close = 'Close';
|
||||
$lang->misc->feature->downloadFile = 'Download introduction';
|
||||
$lang->misc->feature->tutorialDesc = '<p>ZenTao 15.0 has new functions, and you know how to use it through the "<strong>Tutorial</strong>".</p><p>Click your [<span style="color: #0c60e1">Avatar-Theme-Young Blue</span>] to set it.</p>';
|
||||
$lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme, the pages are more beautiful and the experience is more friendly.</p><p>Click your [<span style="color: #0c60e1">Avatar-Theme-Young Blue</span>] to set it.</p>';
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[Full Feature Interface]</span> and daily office affairs in <span style='color: #0c60e1'>[Operation Management Interface]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['17.8'] = '2022-11-02';
|
||||
|
||||
@@ -100,7 +100,7 @@ $lang->misc->feature->close = '关闭';
|
||||
$lang->misc->feature->downloadFile = '下载新版本功能介绍文档';
|
||||
$lang->misc->feature->tutorialDesc = "<p>禅道15系列新增了多项功能,您可以通过“<strong>新手引导教程</strong>”快速了解禅道的基本使用方法。</p><p>通过鼠标经过 [<span style='color: #0c60e1'>头像-新手引导</span>],点击新手引导,即可进入新手引导教程。</p>";
|
||||
$lang->misc->feature->themeDesc = "<p>禅道15系列上线了全新的“青春蓝”主题,页面呈现更加美观,体验更加友好。</p><p>通过鼠标经过 [<span style='color: #0c60e1'>头像-主题-青春蓝</span>],点击青春蓝,即可设置成功。</p>";
|
||||
$lang->misc->feature->visionsDesc = "<p>从16.5开始增加了界面概念,用户可以在<span style='color:#0c60e1'>[研发综合界面]</span>中处理研发事务、在<span style='color:#0c60e1'>[迅捷界面]</span>处理日常办公事务。</p><p>在头像右侧即可查看当前所处界面,点击当前界面名称可查看和切换其他的界面。</p>";
|
||||
$lang->misc->feature->visionsDesc = "<p>从16.5开始增加了界面概念,用户可以在<span style='color:#0c60e1'>[研发综合界面]</span>中处理研发事务、在<span style='color:#0c60e1'>[运营管理界面]</span>处理日常办公事务。</p><p>在头像右侧即可查看当前所处界面,点击当前界面名称可查看和切换其他的界面。</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions.png';
|
||||
|
||||
$lang->misc->releaseDate['17.8'] = '2022-11-02';
|
||||
|
||||
@@ -1301,6 +1301,7 @@ class myModel extends model
|
||||
$review->time = $action->date;
|
||||
$review->result = strtolower($action->extra);
|
||||
$review->status = $objectType == 'attend' ? $object->reviewStatus : $object->status;
|
||||
if(strpos($review->result, ',') !== false) list($review->result) = explode(',', $review->result);
|
||||
|
||||
if($review->type == 'review') $review->type = 'project';
|
||||
if($review->type == 'case') $review->type = 'testcase';
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
$type = $review->type;
|
||||
if($type == 'project') $type = 'review';
|
||||
|
||||
$typeName = $lang->$type->common;
|
||||
$typeName = $lang->{$review->type}->common;
|
||||
if($type == 'story') $typeName = $lang->my->auditMenu->audit->story;
|
||||
|
||||
$statusList = $lang->$type->statusList;
|
||||
|
||||
@@ -104,15 +104,16 @@
|
||||
<td class='c-name <?php if(!empty($task->children)) echo 'has-child';?>' title='<?php echo $task->name?>'>
|
||||
<?php if(!empty($task->team)) echo '<span class="label label-badge label-light">' . $this->lang->task->multipleAB . '</span> ';?>
|
||||
<?php
|
||||
$dataApp = empty($task->executionMultiple) ? 'project' : 'execution';
|
||||
if($task->parent > 0)
|
||||
{
|
||||
echo '<span class="label label-badge label-light">' . $this->lang->task->childrenAB . '</span> ' . html::a($this->createLink('task', 'view', "taskID=$task->id", '', '', $task->project), $task->parentName . ' / '. $task->name, '', "title='{$task->parentName} / {$task->name}'");
|
||||
echo '<span class="label label-badge label-light">' . $this->lang->task->childrenAB . '</span> ' . html::a($this->createLink('task', 'view', "taskID=$task->id", '', '', $task->project), $task->parentName . ' / '. $task->name, '', "title='{$task->parentName} / {$task->name}' data-app='$dataApp'");
|
||||
}
|
||||
else
|
||||
{
|
||||
$onlybody = $task->executionType == 'kanban' ? true : '';
|
||||
$class = $task->executionType == 'kanban' ? 'iframe' : '';
|
||||
echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', $onlybody, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'");
|
||||
echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', $onlybody, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color' data-app='$dataApp'");
|
||||
}
|
||||
?>
|
||||
<?php if(!empty($task->children)) echo '<a class="task-toggle" data-id="' . $task->id . '"><i class="icon icon-angle-right"></i></a>';?>
|
||||
@@ -189,8 +190,9 @@
|
||||
<?php printf('%03d', $child->id);?>
|
||||
</td>
|
||||
<td class='c-name' title='<?php echo $child->name?>'>
|
||||
<?php $dataApp = empty($child->executionMultiple) ? 'project' : 'execution';?>
|
||||
<?php if($child->parent > 0) echo '<span class="label label-badge label-light">' . $this->lang->task->childrenAB . '</span> ';?>
|
||||
<?php echo html::a($this->createLink('task', 'view', "taskID=$child->id", '', '', $child->project), $child->name, null, "style='color: $child->color'");?>
|
||||
<?php echo html::a($this->createLink('task', 'view', "taskID=$child->id", '', '', $child->project), $child->name, null, "style='color: $child->color' data-app='$dataApp'");?>
|
||||
</td>
|
||||
<td class="c-pri"><span class='label-pri <?php echo 'label-pri-' . $child->pri;?>' title='<?php echo zget($lang->task->priList, $child->pri);?>'><?php echo zget($lang->task->priList, $child->pri);?></span></td>
|
||||
<td class='c-status'>
|
||||
|
||||
@@ -3,13 +3,13 @@ $config->product = new stdclass();
|
||||
$config->product->orderBy = 'isClosed,program_asc,order_asc';
|
||||
$config->product->showAllProjects = 0;
|
||||
|
||||
$config->product->customBatchEditFields = 'line,PO,QD,RD,status,type,acl';
|
||||
if($config->systemMode == 'ALM') $config->product->customBatchEditFields = 'program,' . $config->product->customBatchEditFields;
|
||||
$config->product->customBatchEditFields = 'PO,QD,RD,status,type,acl';
|
||||
if($config->systemMode == 'ALM') $config->product->customBatchEditFields = 'program,line,' . $config->product->customBatchEditFields;
|
||||
|
||||
$config->product->browse = new stdclass();
|
||||
$config->product->custom = new stdclass();
|
||||
$config->product->custom->batchEditFields = 'line,PO,QD,RD';
|
||||
if($config->systemMode == 'ALM') $config->product->custom->batchEditFields .= ',program';
|
||||
$config->product->custom->batchEditFields = 'PO,QD,RD';
|
||||
if($config->systemMode == 'ALM') $config->product->custom->batchEditFields .= ',program,line';
|
||||
|
||||
$config->product->list = new stdclass();
|
||||
$config->product->list->exportFields = 'id,program,line,name,manager,draftStories,activeStories,changedStories,reviewingStories,closedStories,storyCompleteRate,bugs,unResolvedBugs,assignToNullBugs,bugFixedRate,plans,releases';
|
||||
@@ -115,8 +115,11 @@ $config->product->all->search['fields']['createdBy'] = $lang->product->created
|
||||
$config->product->all->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
|
||||
if(!isset($config->setCode) or $config->setCode == 1) $config->product->all->search['params']['code'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
|
||||
$config->product->all->search['params']['id'] = array('operator' => '=', 'control' => 'input', 'values' => '');
|
||||
if($config->systemMode == 'ALM') $config->product->all->search['params']['program'] = array('operator' => '=', 'control' => 'select', 'values' => '');
|
||||
$config->product->all->search['params']['line'] = array('operator' => '=', 'control' => 'select', 'values' => '');
|
||||
if($config->systemMode == 'ALM')
|
||||
{
|
||||
$config->product->all->search['params']['program'] = array('operator' => '=', 'control' => 'select', 'values' => '');
|
||||
$config->product->all->search['params']['line'] = array('operator' => '=', 'control' => 'select', 'values' => '');
|
||||
}
|
||||
$config->product->all->search['params']['desc'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
|
||||
$config->product->all->search['params']['PO'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
|
||||
$config->product->all->search['params']['QD'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
|
||||
|
||||
@@ -100,7 +100,7 @@ class product extends control
|
||||
$accounts = array();
|
||||
$projectStats = $this->product->getProjectStatsByProduct($productID, $status, $branch, $involved, $orderBy, $pager);
|
||||
$product = $this->product->getByID($productID);
|
||||
$projects = $this->project->getPairsByProgram($product->program, 'all', false, 'order_asc');
|
||||
$projects = $this->project->getPairsByProgram($product->program, 'all', false, 'order_asc', '', '', 'product');
|
||||
|
||||
foreach($projectStats as $project)
|
||||
{
|
||||
@@ -110,8 +110,6 @@ class product extends control
|
||||
$PMList = $this->user->getListByAccounts($accounts, 'account');
|
||||
|
||||
$this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->product->project;
|
||||
$this->view->position[] = $this->products[$productID];
|
||||
$this->view->position[] = $this->lang->product->project;
|
||||
$this->view->projectStats = $projectStats;
|
||||
$this->view->PMList = $PMList;
|
||||
$this->view->productID = $productID;
|
||||
|
||||
@@ -1235,10 +1235,11 @@ class productModel extends model
|
||||
* @param int $branch
|
||||
* @param int $appendProject
|
||||
* @param string $status all|closed|unclosed
|
||||
* @param string $param multiple|
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProjectPairsByProduct($productID, $branch = 0, $appendProject = 0, $status = '')
|
||||
public function getProjectPairsByProduct($productID, $branch = 0, $appendProject = 0, $status = '', $param = '')
|
||||
{
|
||||
$product = $this->getById($productID);
|
||||
|
||||
@@ -1246,6 +1247,7 @@ class productModel extends model
|
||||
->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(strpos($param, 'multiple') !== false)->andWhere('t2.multiple')->ne('0')->fi()
|
||||
->andWhere('t2.type')->eq('project')
|
||||
->beginIF(!$this->app->user->admin)->andWhere('t2.id')->in($this->app->user->view->projects)->fi()
|
||||
->beginIF($product->type != 'normal' and $branch !== '')->andWhere('t1.branch')->in($branch)->fi()
|
||||
|
||||
@@ -370,7 +370,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, '', $status = 'closed');
|
||||
$this->view->projects = $this->product->getProjectPairsByProduct($productID, $branch, '', $status = 'closed', 'multiple');
|
||||
$this->view->statusList = $this->lang->productplan->featureBar['browse'];
|
||||
$this->view->queryID = $queryID;
|
||||
$this->display();
|
||||
@@ -627,7 +627,7 @@ class productplan extends control
|
||||
*/
|
||||
public function ajaxGetProjects($productID, $branch = 0)
|
||||
{
|
||||
$projects = $this->loadModel('product')->getProjectPairsByProduct($productID, $branch, '', $status = 'closed');
|
||||
$projects = $this->loadModel('product')->getProjectPairsByProduct($productID, $branch, '', $status = 'closed', 'multiple');
|
||||
echo html::select('project', $projects, key($projects), "class='form-control chosen'");
|
||||
}
|
||||
|
||||
|
||||
+12
-43
@@ -67,10 +67,11 @@ class programModel extends model
|
||||
* @param string $status all|noclosed
|
||||
* @param string|array $append
|
||||
* @param string|int $shadow all | 0 | 1
|
||||
* @param bool $withProgram
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProductPairs($programID = 0, $mode = 'assign', $status = 'all', $append = '', $shadow = 0)
|
||||
public function getProductPairs($programID = 0, $mode = 'assign', $status = 'all', $append = '', $shadow = 0, $withProgram = false)
|
||||
{
|
||||
/* Get the top programID. */
|
||||
if($programID)
|
||||
@@ -84,72 +85,40 @@ class programModel extends model
|
||||
if(!empty($append) and is_array($append)) $append = implode(',', $append);
|
||||
$views = empty($append) ? $this->app->user->view->products : $this->app->user->view->products . ",$append";
|
||||
|
||||
return $this->dao->select('*')->from(TABLE_PRODUCT)
|
||||
$dao = $this->dao->select('id, name, program')->from(TABLE_PRODUCT)
|
||||
->where('deleted')->eq(0)
|
||||
->andWhere('vision')->eq($this->config->vision)
|
||||
->beginIF($shadow !== 'all')->andWhere('shadow')->eq((int)$shadow)->fi()
|
||||
->beginIF($mode == 'assign')->andWhere('program')->eq($programID)->fi()
|
||||
->beginIF(strpos($status, 'noclosed') !== false)->andWhere('status')->ne('closed')->fi()
|
||||
->beginIF(!$this->app->user->admin)->andWhere('id')->in($views)->fi()
|
||||
->fetchPairs('id', 'name');
|
||||
}
|
||||
->beginIF(!$this->app->user->admin)->andWhere('id')->in($views)->fi();
|
||||
|
||||
/**
|
||||
* Get product pairs which name with program.
|
||||
*
|
||||
* @param int $programID
|
||||
* @param string $mode
|
||||
* @param string $status
|
||||
* @param string $append
|
||||
* @param int $shadow
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProductPairsWithProgram($programID = 0, $mode = 'assign', $status = 'all', $append = '', $shadow = 0)
|
||||
{
|
||||
/* Get the top programID. */
|
||||
if($programID)
|
||||
{
|
||||
$program = $this->getByID($programID);
|
||||
$path = array_filter(explode(',', $program->path));
|
||||
$programID = current($path);
|
||||
}
|
||||
if(!$withProgram) return $dao->fetchPairs('id', 'name');
|
||||
|
||||
/* When mode equals assign and programID equals 0, you can query the standalone product. */
|
||||
if(!empty($append) and is_array($append)) $append = implode(',', $append);
|
||||
$views = empty($append) ? $this->app->user->view->products : $this->app->user->view->products . ",$append";
|
||||
|
||||
$products = $this->dao->select("t1.id, t1.program, CONCAT(IF(t2.name IS NOT NULL, t2.name, ''), '/', t1.name) AS name")->from(TABLE_PRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.program = t2.id')
|
||||
->where('t1.deleted')->eq('0')
|
||||
->andWhere('t1.vision')->eq($this->config->vision)
|
||||
->beginIF($shadow !== 'all')->andWhere('t1.shadow')->eq((int)$shadow)->fi()
|
||||
->beginIF($mode == 'assign')->andWhere('t1.program')->eq($programID)->fi()
|
||||
->beginIF(strpos($status, 'noclosed') !== false)->andWhere('t1.status')->ne('closed')->fi()
|
||||
->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($views)->fi()
|
||||
->orderBy('t1.program, t1.order_asc')
|
||||
->fetchGroup('program');
|
||||
$products = $dao->orderBy('program,order')->fetchGroup('program');
|
||||
$productPrograms = $this->dao->select('id, name')->from(TABLE_PROJECT)->where('type')->eq('program')->andWhere('deleted')->eq('0')->fetchPairs();
|
||||
|
||||
/* Put products of current program first.*/
|
||||
if($mode != 'assign' && $programID)
|
||||
{
|
||||
$currentProgramProducts = $products[$programID];
|
||||
|
||||
unset($products[$programID]);
|
||||
|
||||
array_unshift($products, $currentProgramProducts);
|
||||
}
|
||||
|
||||
$productPairs = array();
|
||||
foreach($products as $programProducts)
|
||||
{
|
||||
foreach($programProducts as $product) $productPairs[$product->id] = $product->name;
|
||||
foreach($programProducts as $product)
|
||||
{
|
||||
$programName = zget($productPrograms, $product->program, '') . '/';
|
||||
$productPairs[$product->id] = $programName . $product->name;
|
||||
}
|
||||
}
|
||||
|
||||
return $productPairs;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get program by id.
|
||||
*
|
||||
|
||||
@@ -11,7 +11,8 @@ $config->project->editor->activate = array('id' => 'comment', 'tools' => 'simple
|
||||
$config->project->editor->view = array('id' => 'lastComment', 'tools' => 'simpleTools');
|
||||
|
||||
$config->project->list = new stdclass();
|
||||
$config->project->list->exportFields = 'id,parent,code,name,hasProduct,linkedProducts,status,begin,end,budget,PM,end,desc';
|
||||
$config->project->list->exportFields = 'id,code,name,hasProduct,linkedProducts,status,begin,end,budget,PM,end,desc';
|
||||
if($config->systemMode == 'ALM') $config->project->list->exportFields = substr_replace($config->project->list->exportFields, ',parent', 2, 0);
|
||||
|
||||
$config->project->create = new stdclass();
|
||||
$config->project->edit = new stdclass();
|
||||
|
||||
+42
-32
@@ -283,7 +283,8 @@ class project extends control
|
||||
|
||||
if($objectType == 'program')
|
||||
{
|
||||
$allProducts = array(0 => '') + $this->program->getProductPairsWithProgram($selectedProgramID, 'all', 'noclosed');
|
||||
$withProgram = $this->config->systemMode == 'ALM' ? true : false;
|
||||
$allProducts = array(0 => '') + $this->program->getProductPairs($selectedProgramID, 'all', 'noclosed', '', 0, $withProgram);
|
||||
$data['allProducts'] = html::select("products[]", $allProducts, '', "class='form-control chosen' onchange='loadBranches(this)'");
|
||||
$data['plans'] = html::select('plans[][][]', '', '', 'class=\'form-control chosen\' multiple');
|
||||
}
|
||||
@@ -603,13 +604,16 @@ class project extends control
|
||||
$this->config->executionCommonList[$this->app->getClientLang()][0] :
|
||||
$this->config->executionCommonList[$this->app->getClientLang()][1];
|
||||
|
||||
$withProgram = $this->config->systemMode == 'ALM' ? true : false;
|
||||
$allProducts = array('0' => '') + $this->program->getProductPairs($programID, 'all', 'noclosed', '', $shadow, $withProgram);
|
||||
|
||||
$this->view->title = $this->lang->project->create;
|
||||
$this->view->gobackLink = (isset($output['from']) and $output['from'] == 'global') ? $this->createLink('project', 'browse') : '';
|
||||
$this->view->pmUsers = $this->loadModel('user')->getPairs('noclosed|nodeleted|pmfirst');
|
||||
$this->view->users = $this->user->getPairs('noclosed|nodeleted');
|
||||
$this->view->copyProjects = $this->project->getPairsByModel($model);
|
||||
$this->view->products = $products;
|
||||
$this->view->allProducts = array('0' => '') + $this->program->getProductPairsWithProgram(0, 'all', 'noclosed', '', $shadow);
|
||||
$this->view->allProducts = $allProducts;
|
||||
$this->view->productPlans = array('0' => '') + $productPlans;
|
||||
$this->view->branchGroups = $this->loadModel('branch')->getByProducts(array_keys($products), 'noclosed');
|
||||
$this->view->programID = $programID;
|
||||
@@ -713,12 +717,14 @@ class project extends control
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $locateLink));
|
||||
}
|
||||
|
||||
$withProgram = $this->config->systemMode == 'ALM' ? true : false;
|
||||
|
||||
$linkedBranches = array();
|
||||
$linkedBranchList = array();
|
||||
$productPlans = array(0 => '');
|
||||
$branches = $this->project->getBranchesByProject($projectID);
|
||||
$linkedProductIdList = empty($branches) ? '' : array_keys($branches);
|
||||
$allProducts = $this->program->getProductPairsWithProgram($project->parent, 'all', 'noclosed');
|
||||
$allProducts = $this->program->getProductPairs($project->parent, 'all', 'noclosed', '', 0, $withProgram);
|
||||
$linkedProducts = $this->loadModel('product')->getProducts($projectID, 'all', '', true, $linkedProductIdList);
|
||||
$parentProject = $this->program->getByID($project->parent);
|
||||
$plans = $this->productplan->getGroupByProduct(array_keys($linkedProducts), 'skipParent|unexpired');
|
||||
@@ -1148,7 +1154,7 @@ class project extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function bug($projectID = 0, $productID = 0, $branchID = 0, $orderBy = 'status,id_desc', $build = 0, $type = 'all', $param = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
public function bug($projectID = 0, $productID = 0, $branchID = 'all', $orderBy = 'status,id_desc', $build = 0, $type = 'all', $param = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
/* Load these two models. */
|
||||
$this->loadModel('bug');
|
||||
@@ -1307,7 +1313,7 @@ class project extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function testcase($projectID = 0, $productID = 0, $branch = 0, $browseType = 'all', $param = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
public function testcase($projectID = 0, $productID = 0, $branch = 'all', $browseType = 'all', $param = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
$this->loadModel('product');
|
||||
$this->session->set('bugList', $this->app->getURI(true), 'project');
|
||||
@@ -2228,43 +2234,48 @@ class project extends control
|
||||
}
|
||||
}
|
||||
|
||||
$branchGroups = $this->loadModel('branch')->getByProducts(array_keys($allProducts), 'ignoreNormal|noclosed');
|
||||
$productsGroupByProgram = $this->product->getProductsGroupByProgram();
|
||||
|
||||
$currentProducts = array();
|
||||
$otherProducts = array();
|
||||
foreach($productsGroupByProgram as $programID => $programProducts)
|
||||
$branchGroups = $this->loadModel('branch')->getByProducts(array_keys($allProducts), 'ignoreNormal|noclosed');
|
||||
if($this->config->systemMode == 'ALM')
|
||||
{
|
||||
if($programID != $project->parent)
|
||||
{
|
||||
foreach($programProducts as $productID => $productName)
|
||||
{
|
||||
if(!empty($branchGroups[$productID]))
|
||||
{
|
||||
foreach($branchGroups[$productID] as $branchID => $branchName)
|
||||
{
|
||||
if(isset($linkedProducts[$productID]) and isset($linkedBranches[$productID][$branchID])) continue;
|
||||
$productsGroupByProgram = $this->product->getProductsGroupByProgram();
|
||||
|
||||
$otherProducts["{$productID}_{$branchID}"] = $productName . '_' . $branchName;
|
||||
$currentProducts = array();
|
||||
$otherProducts = array();
|
||||
foreach($productsGroupByProgram as $programID => $programProducts)
|
||||
{
|
||||
if($programID != $project->parent)
|
||||
{
|
||||
foreach($programProducts as $productID => $productName)
|
||||
{
|
||||
if(!empty($branchGroups[$productID]))
|
||||
{
|
||||
foreach($branchGroups[$productID] as $branchID => $branchName)
|
||||
{
|
||||
if(isset($linkedProducts[$productID]) and isset($linkedBranches[$productID][$branchID])) continue;
|
||||
|
||||
$otherProducts["{$productID}_{$branchID}"] = $productName . '_' . $branchName;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isset($linkedProducts[$productID])) continue;
|
||||
$otherProducts[$productID] = $productName;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isset($linkedProducts[$productID])) continue;
|
||||
$otherProducts[$productID] = $productName;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$currentProducts += $programProducts;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$currentProducts += $programProducts;
|
||||
}
|
||||
|
||||
$this->view->currentProducts = $currentProducts;
|
||||
$this->view->otherProducts = $otherProducts;
|
||||
}
|
||||
|
||||
/* Assign. */
|
||||
$this->view->title = $this->lang->project->manageProducts . $this->lang->colon . $project->name;
|
||||
$this->view->project = $project;
|
||||
$this->view->currentProducts = $currentProducts;
|
||||
$this->view->linkedProducts = $linkedProducts;
|
||||
$this->view->linkedBranches = $linkedBranches;
|
||||
$this->view->branches = $branches;
|
||||
@@ -2275,7 +2286,6 @@ class project extends control
|
||||
$this->view->branchGroups = $branchGroups;
|
||||
$this->view->allBranches = $this->branch->getByProducts(array_keys($allProducts), 'ignoreNormal');
|
||||
$this->view->allProducts = $allProducts;
|
||||
$this->view->otherProducts = $otherProducts;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
Regular → Executable
+1
@@ -28,3 +28,4 @@
|
||||
.futureBox {vertical-align: top !important; padding-top: 13px !important;}
|
||||
#linkPlan {padding-top: 25px !important;}
|
||||
#projectType {padding-top: 7px !important;}
|
||||
.division .icon-help {margin-left: 15px}
|
||||
|
||||
@@ -134,7 +134,7 @@ $lang->project->realBeganAB = 'Actual Begin';
|
||||
$lang->project->realEndAB = 'Actual End';
|
||||
$lang->project->realBegan = 'Actual Began';
|
||||
$lang->project->realEnd = 'Actual End';
|
||||
$lang->project->division = 'Create Stages by Product';
|
||||
$lang->project->division = 'Stage Type';
|
||||
$lang->project->bygrid = 'Kanban';
|
||||
$lang->project->bylist = 'List';
|
||||
$lang->project->bycard = 'Card';
|
||||
@@ -190,8 +190,8 @@ $lang->project->typeList = array();
|
||||
$lang->project->typeList['my'] = 'Projects Ownedbyme';
|
||||
$lang->project->typeList['other'] = 'Other Projects';
|
||||
|
||||
$lang->project->divisionList['1'] = 'Enable';
|
||||
$lang->project->divisionList['0'] = 'Disable';
|
||||
$lang->project->divisionList['1'] = 'Create by project';
|
||||
$lang->project->divisionList['0'] = 'Create by product';
|
||||
|
||||
$lang->project->waitProjects = 'Waiting Projects';
|
||||
$lang->project->doingProjects = 'Ongoing Projects';
|
||||
@@ -208,7 +208,7 @@ $lang->project->changeProgram = '%s > Change project';
|
||||
$lang->project->changeProgramTip = 'After modifying the project set, the products linked with the project will also modify the project set to which it belongs. Please confirm whether to modify it.';
|
||||
$lang->project->linkedProjectsTip = 'Linked projects are as follows';
|
||||
$lang->project->multiLinkedProductsTip = 'The following products linked to this project are also linked to other projects, please unlink before proceeding.';
|
||||
$lang->project->noticeDivsion = "The current project is associated with multiple products, you can click Confirm to open the mode by {$lang->productCommon} creation stage, click Cancel to keep the status quo.";
|
||||
$lang->project->noticeDivsion = "The current project is a single stage, click [Create by project] to change to multiple stages, each stage is only associated with one product.";
|
||||
$lang->project->linkStoryByPlanTips = "This action will associate all {$lang->SRCommon} under the selected plan to this project";
|
||||
$lang->project->createExecution = "There is no {$lang->executionCommon} under this project, please create {$lang->executionCommon} first";
|
||||
$lang->project->unlinkExecutionMember = "The user participated in %s executions such as %s%s. Do you want to remove the user from those executions as well? (The data related to this user will not be deleted.)";
|
||||
@@ -373,6 +373,7 @@ $lang->project->begigLetterExecution = 'The start date of project should be ≤
|
||||
$lang->project->endGreateExecution = 'The finish date of the project should be ≥ the maximum finish date of the execution: %s.';
|
||||
$lang->project->childLongTime = "If a child as long-term projects, the parent should be long-term too.";
|
||||
$lang->project->confirmUnlinkMember = "Do you want to remove this user from project?";
|
||||
$lang->project->divisionTips = "Created by project as a single set of stages, and the stage is associated with all products; created by product as multiple sets of stages, each set of stages is associated with a product";
|
||||
|
||||
$lang->project->action = new stdclass();
|
||||
$lang->project->action->managed = '$date, managed by <strong>$actor</strong>. $extra' . "\n";
|
||||
|
||||
@@ -134,7 +134,7 @@ $lang->project->realBeganAB = 'Actual Begin';
|
||||
$lang->project->realEndAB = 'Actual End';
|
||||
$lang->project->realBegan = 'Actual Begin';
|
||||
$lang->project->realEnd = 'Actual End';
|
||||
$lang->project->division = 'Create Stages by Product';
|
||||
$lang->project->division = 'Stage Type';
|
||||
$lang->project->bygrid = 'Kanban';
|
||||
$lang->project->bylist = 'List';
|
||||
$lang->project->bycard = 'Card';
|
||||
@@ -190,8 +190,8 @@ $lang->project->typeList = array();
|
||||
$lang->project->typeList['my'] = 'Projects Ownedbyme';
|
||||
$lang->project->typeList['other'] = 'Other Projects';
|
||||
|
||||
$lang->project->divisionList['1'] = 'Enable';
|
||||
$lang->project->divisionList['0'] = 'Disable';
|
||||
$lang->project->divisionList['1'] = 'Create by project';
|
||||
$lang->project->divisionList['0'] = 'Create by product';
|
||||
|
||||
$lang->project->waitProjects = 'Waiting Projects';
|
||||
$lang->project->doingProjects = 'Ongoing Projects';
|
||||
@@ -208,7 +208,7 @@ $lang->project->changeProgram = '%s > Change project';
|
||||
$lang->project->changeProgramTip = 'Once the program is edited, the product that is linked to this program will be changed. Do you want to edit it?';
|
||||
$lang->project->linkedProjectsTip = 'Linked projects are as follows';
|
||||
$lang->project->multiLinkedProductsTip = 'The following products linked to this project are also linked to other projects, please unlink before proceeding.';
|
||||
$lang->project->noticeDivsion = "The current project is associated with multiple products, you can click Confirm to open the mode by {$lang->productCommon} creation stage, click Cancel to keep the status quo.";
|
||||
$lang->project->noticeDivsion = "The current project is a single stage, click [Create by project] to change to multiple stages, each stage is only associated with one product.";
|
||||
$lang->project->linkStoryByPlanTips = "This action will associate all {$lang->SRCommon} under the selected plan to this project";
|
||||
$lang->project->createExecution = "There is no {$lang->executionCommon} under this project, please create {$lang->executionCommon} first";
|
||||
$lang->project->unlinkExecutionMember = "The user participated in %s executions such as %s%s. Do you want to remove the user from those executions as well? (The data related to this user will not be deleted.)";
|
||||
@@ -373,6 +373,7 @@ $lang->project->begigLetterExecution = 'The start date of project should be ≤
|
||||
$lang->project->endGreateExecution = 'The finish date of the project should be ≥ the maximum finish date of the execution: %s.';
|
||||
$lang->project->childLongTime = "There are long-term projects in the child project, and the parent project should also be a long-term project.";
|
||||
$lang->project->confirmUnlinkMember = "Do you want to remove this user from project?";
|
||||
$lang->project->divisionTips = "Created by project as a single set of stages, and the stage is associated with all products; created by product as multiple sets of stages, each set of stages is associated with a product";
|
||||
|
||||
$lang->project->action = new stdclass();
|
||||
$lang->project->action->managed = '$date, managed by <strong>$actor</strong>. $extra' . "\n";
|
||||
|
||||
@@ -134,7 +134,7 @@ $lang->project->realBeganAB = 'Actual Begin';
|
||||
$lang->project->realEndAB = 'Actual End';
|
||||
$lang->project->realBegan = 'Actual Began';
|
||||
$lang->project->realEnd = 'Actual End';
|
||||
$lang->project->division = 'Create Stages by Product';
|
||||
$lang->project->division = 'Stage Type';
|
||||
$lang->project->bygrid = 'Kanban';
|
||||
$lang->project->bylist = 'List';
|
||||
$lang->project->bycard = 'Card';
|
||||
@@ -190,8 +190,8 @@ $lang->project->typeList = array();
|
||||
$lang->project->typeList['my'] = 'Projects Ownedbyme';
|
||||
$lang->project->typeList['other'] = 'Other Projects';
|
||||
|
||||
$lang->project->divisionList['1'] = 'Enable';
|
||||
$lang->project->divisionList['0'] = 'Disable';
|
||||
$lang->project->divisionList['1'] = 'Create by project';
|
||||
$lang->project->divisionList['0'] = 'Create by product';
|
||||
|
||||
$lang->project->waitProjects = 'Waiting Projects';
|
||||
$lang->project->doingProjects = 'Ongoing Projects';
|
||||
@@ -208,7 +208,7 @@ $lang->project->changeProgram = '%s > Change project';
|
||||
$lang->project->changeProgramTip = 'After modifying the project set, the products linked with the project will also modify the project set to which it belongs. Please confirm whether to modify it.';
|
||||
$lang->project->linkedProjectsTip = 'Linked projects are as follows';
|
||||
$lang->project->multiLinkedProductsTip = 'The following products linked to this project are also linked to other projects, please unlink before proceeding.';
|
||||
$lang->project->noticeDivsion = "The current project is associated with multiple products, you can click Confirm to open the mode by {$lang->productCommon} creation stage, click Cancel to keep the status quo.";
|
||||
$lang->project->noticeDivsion = "The current project is a single stage, click [Create by project] to change to multiple stages, each stage is only associated with one product.";
|
||||
$lang->project->linkStoryByPlanTips = "This action will associate all {$lang->SRCommon} under the selected plan to this project";
|
||||
$lang->project->createExecution = "There is no {$lang->executionCommon} under this project, please create {$lang->executionCommon} first";
|
||||
$lang->project->unlinkExecutionMember = "The user participated in %s executions such as %s%s. Do you want to remove the user from those executions as well? (The data related to this user will not be deleted.)";
|
||||
@@ -373,6 +373,7 @@ $lang->project->begigLetterExecution = 'La date de début du projet "%s" doit ê
|
||||
$lang->project->endGreateExecution = 'La date de fin du projet "%s" doit être ≥ à la date de fin maximale d\'exécution: %s.';
|
||||
$lang->project->childLongTime = "If a child as long-term projects, the parent should be long-term too.";
|
||||
$lang->project->confirmUnlinkMember = "Do you want to remove this user from project?";
|
||||
$lang->project->divisionTips = "Created by project as a single set of stages, and the stage is associated with all products; created by product as multiple sets of stages, each set of stages is associated with a product";
|
||||
|
||||
$lang->project->action = new stdclass();
|
||||
$lang->project->action->managed = '$date, managed by <strong>$actor</strong>. $extra' . "\n";
|
||||
|
||||
+231
-107
@@ -1,85 +1,140 @@
|
||||
<?php
|
||||
/* Actions. */
|
||||
$lang->project->createGuide = 'Select Template';
|
||||
$lang->project->index = 'Dashboard';
|
||||
$lang->project->home = 'Home';
|
||||
$lang->project->create = 'Create Project';
|
||||
$lang->project->edit = 'Edit';
|
||||
$lang->project->batchEdit = 'Batch Edit Projects';
|
||||
$lang->project->view = 'Project View';
|
||||
$lang->project->batchEdit = 'Batch Edit';
|
||||
$lang->project->browse = 'Projects';
|
||||
$lang->project->all = 'All';
|
||||
$lang->project->start = 'Start';
|
||||
$lang->project->finish = 'Finish';
|
||||
$lang->project->suspend = 'Suspend';
|
||||
$lang->project->delete = 'Delete';
|
||||
$lang->project->close = 'Close';
|
||||
$lang->project->activate = 'Activate';
|
||||
$lang->project->group = 'Privilege Group';
|
||||
$lang->project->createGroup = 'Create Group';
|
||||
$lang->project->editGroup = 'Edit Group';
|
||||
$lang->project->copyGroup = 'Copy Group';
|
||||
$lang->project->manageView = 'Manage View';
|
||||
$lang->project->managePriv = 'Manage Privilege';
|
||||
$lang->project->manageMembers = 'Manage Team';
|
||||
$lang->project->export = 'Export';
|
||||
$lang->project->addProduct = 'Add Product';
|
||||
$lang->project->manageGroupMember = 'Manage Group';
|
||||
$lang->project->moduleSetting = 'List Settings';
|
||||
$lang->project->moduleOpen = 'Program Name';
|
||||
$lang->project->dynamic = 'Dynamic';
|
||||
$lang->project->execution = 'Execution';
|
||||
$lang->project->qa = 'QA';
|
||||
$lang->project->bug = 'Bug List';
|
||||
$lang->project->testcase = 'Case List';
|
||||
$lang->project->testtask = 'Test Task';
|
||||
$lang->project->build = 'Build';
|
||||
$lang->project->updateOrder = 'Order';
|
||||
$lang->project->sort = 'Order';
|
||||
$lang->project->whitelist = 'Project Whitelist';
|
||||
$lang->project->addWhitelist = 'Project Add Whitelist';
|
||||
$lang->project->unbindWhitelist = 'Project Remove Whitelist';
|
||||
$lang->project->manageProducts = 'Manage Products';
|
||||
$lang->project->copyTitle = 'Please select an project to copy';
|
||||
$lang->project->errorSameProducts = 'Project cannot be associated with multiple identical products.';
|
||||
$lang->project->errorNoProducts = 'At least one product is associated';
|
||||
$lang->project->copyNoProject = 'There are no items available to copy.';
|
||||
$lang->project->searchByName = 'Enter the project name to retrieve';
|
||||
$lang->project->linkedProducts = "Linked {$lang->productCommon}s";
|
||||
$lang->project->unlinkedProducts = "Unlinked {$lang->productCommon}s";
|
||||
$lang->project->testreport = 'Testreport';
|
||||
$lang->project->selectProgram = 'Program filtering';
|
||||
$lang->project->teamMember = 'Team Member';
|
||||
$lang->project->manageRepo = 'Manage Repo';
|
||||
$lang->project->linkedRepo = 'Link Repo';
|
||||
$lang->project->unlinkedRepo = 'Unlink Repo';
|
||||
$lang->project->createGuide = 'Select Template';
|
||||
$lang->project->index = 'Dashboard';
|
||||
$lang->project->home = 'Home';
|
||||
$lang->project->create = 'Create Project';
|
||||
$lang->project->edit = 'Edit';
|
||||
$lang->project->batchEdit = 'Batch Edit Projects';
|
||||
$lang->project->view = 'Project View';
|
||||
$lang->project->batchEdit = 'Batch Edit';
|
||||
$lang->project->browse = 'Projects';
|
||||
$lang->project->all = 'All';
|
||||
$lang->project->start = 'Start';
|
||||
$lang->project->finish = 'Finish';
|
||||
$lang->project->suspend = 'Suspend';
|
||||
$lang->project->delete = 'Delete';
|
||||
$lang->project->close = 'Close';
|
||||
$lang->project->activate = 'Activate';
|
||||
$lang->project->group = 'Privilege Group';
|
||||
$lang->project->createGroup = 'Create Group';
|
||||
$lang->project->editGroup = 'Edit Group';
|
||||
$lang->project->copyGroup = 'Copy Group';
|
||||
$lang->project->manageView = 'Manage View';
|
||||
$lang->project->managePriv = 'Manage Privilege';
|
||||
$lang->project->manageMembers = 'Manage Team';
|
||||
$lang->project->export = 'Export';
|
||||
$lang->project->addProduct = 'Add Product';
|
||||
$lang->project->manageGroupMember = 'Manage Group';
|
||||
$lang->project->moduleSetting = 'List Settings';
|
||||
$lang->project->moduleOpen = 'Program Name';
|
||||
$lang->project->dynamic = 'Dynamic';
|
||||
$lang->project->execution = 'Execution';
|
||||
$lang->project->qa = 'QA';
|
||||
$lang->project->bug = 'Bug List';
|
||||
$lang->project->testcase = 'Case List';
|
||||
$lang->project->testtask = 'Test Task';
|
||||
$lang->project->build = 'Build';
|
||||
$lang->project->updateOrder = 'Order';
|
||||
$lang->project->sort = 'Order';
|
||||
$lang->project->whitelist = 'Project Whitelist';
|
||||
$lang->project->addWhitelist = 'Project Add Whitelist';
|
||||
$lang->project->unbindWhitelist = 'Project Remove Whitelist';
|
||||
$lang->project->manageProducts = 'Manage Products';
|
||||
$lang->project->manageOtherProducts = 'Manage Other Products';
|
||||
$lang->project->copyTitle = 'Please select an project to copy';
|
||||
$lang->project->errorSameProducts = 'Project cannot be associated with multiple identical products.';
|
||||
$lang->project->errorSameBranches = 'Project cannot be associated with multiple identical branches.';
|
||||
$lang->project->errorSamePlans = 'Project cannot be associated with multiple identical plans.';
|
||||
$lang->project->errorNoProducts = 'At least one product is associated';
|
||||
$lang->project->copyNoProject = 'There are no items available to copy.';
|
||||
$lang->project->searchByName = 'Enter the project name to retrieve';
|
||||
$lang->project->deleted = 'Deleted';
|
||||
$lang->project->linkedProducts = "Linked {$lang->productCommon}s";
|
||||
$lang->project->unlinkedProducts = "Unlinked {$lang->productCommon}s";
|
||||
$lang->project->testreport = 'Test Report';
|
||||
$lang->project->selectProgram = 'Program filtering';
|
||||
$lang->project->teamMember = 'Team Member';
|
||||
$lang->project->unlinkMember = 'Remove Member';
|
||||
$lang->project->copyTeamTitle = 'Select a project team to copy';
|
||||
$lang->project->daysGreaterProject = 'Days cannot be greater than days of project『%s』';
|
||||
$lang->project->errorHours = 'Hours/Day cannot be greater than『24』';
|
||||
$lang->project->workdaysExceed = 'No more than『%s』working days';
|
||||
$lang->project->teamMembersCount = ', there are %s team members.';
|
||||
$lang->project->budgetNumber = '『Budget』must be numbers.';
|
||||
$lang->project->budgetGe0 = '『Budget』must be greater than or equal to 0.';
|
||||
$lang->project->allProjects = 'All Projects';
|
||||
$lang->project->ignore = 'Ignore';
|
||||
$lang->project->manageRepo = 'Manage Repo';
|
||||
$lang->project->linkedRepo = 'Link Repo';
|
||||
$lang->project->unlinkedRepo = 'Unlink Repo';
|
||||
$lang->project->disableExecution = 'Project of disable iteration';
|
||||
$lang->project->selectProduct = 'Select Product';
|
||||
|
||||
/* Fields. */
|
||||
$lang->project->common = 'Project';
|
||||
$lang->project->id = 'ID';
|
||||
$lang->project->project = 'Project';
|
||||
$lang->project->stage = 'Stage';
|
||||
$lang->project->model = 'Model';
|
||||
$lang->project->PM = 'Manager';
|
||||
$lang->project->PO = 'Project Owner';
|
||||
$lang->project->QD = 'Test Leader';
|
||||
$lang->project->RD = 'Releaser';
|
||||
$lang->project->name = 'Name';
|
||||
$lang->project->category = 'Category';
|
||||
$lang->project->desc = 'Description';
|
||||
$lang->project->code = 'Code';
|
||||
$lang->project->hasProduct = 'Has Product';
|
||||
$lang->project->copy = 'Copy';
|
||||
$lang->project->begin = 'Begin';
|
||||
$lang->project->end = 'End';
|
||||
$lang->project->begin = 'Planned Begin';
|
||||
$lang->project->end = 'Planned End';
|
||||
$lang->project->status = 'Status';
|
||||
$lang->project->PM = 'Manager';
|
||||
$lang->project->subStatus = 'Sub Status';
|
||||
$lang->project->type = 'Type';
|
||||
$lang->project->lifetime = 'Project Cycle';
|
||||
$lang->project->attribute = 'Stage Type';
|
||||
$lang->project->percent = 'Workload %';
|
||||
$lang->project->milestone = 'Milestone';
|
||||
$lang->project->output = 'Output';
|
||||
$lang->project->path = 'Path';
|
||||
$lang->project->grade = 'Grade';
|
||||
$lang->project->version = 'Version';
|
||||
$lang->project->parentVersion = 'Parent Version';
|
||||
$lang->project->planDuration = 'Plan Duration';
|
||||
$lang->project->realDuration = 'Real Duration';
|
||||
$lang->project->openedVersion = 'Opened Version';
|
||||
$lang->project->pri = 'Priority';
|
||||
$lang->project->openedBy = 'OpenedBy';
|
||||
$lang->project->openedDate = 'OpenedDate';
|
||||
$lang->project->lastEditedBy = 'Last EditedBy';
|
||||
$lang->project->lastEditedDate = 'Last EditedDate';
|
||||
$lang->project->closedBy = 'ClosedBy';
|
||||
$lang->project->closedDate = 'ClosedDate';
|
||||
$lang->project->canceledBy = 'CanceledBy';
|
||||
$lang->project->canceledDate = 'CanceledDate';
|
||||
$lang->project->team = 'Team';
|
||||
$lang->project->teamAction = 'Team List';
|
||||
$lang->project->order = 'Rank';
|
||||
$lang->project->budget = 'Budget';
|
||||
$lang->project->budgetUnit = 'Budget Unit';
|
||||
$lang->project->suspendedDate = 'SuspendedDate';
|
||||
$lang->project->vision = 'Vision';
|
||||
$lang->project->displayCards = 'Max cards per column';
|
||||
$lang->project->fluidBoard = 'Column Width';
|
||||
$lang->project->template = 'Template';
|
||||
$lang->project->estimate = 'Estimates';
|
||||
$lang->project->consume = 'Cost';
|
||||
$lang->project->surplus = 'Left';
|
||||
$lang->project->progress = 'Progress';
|
||||
$lang->project->dateRange = 'Duration';
|
||||
$lang->project->weekProgress = 'This Week Progress';
|
||||
$lang->project->dateRange = 'Plan Duration';
|
||||
$lang->project->to = ' to ';
|
||||
$lang->project->realBeganAB = 'Actual Begin';
|
||||
$lang->project->realEndAB = 'Actual End';
|
||||
$lang->project->realBegan = 'Actual Begin';
|
||||
$lang->project->realEnd = 'Actual End';
|
||||
$lang->project->realBegan = 'Actual Began';
|
||||
$lang->project->division = 'Create Stages by Product';
|
||||
$lang->project->division = 'Stage Type';
|
||||
$lang->project->bygrid = 'Kanban';
|
||||
$lang->project->bylist = 'List';
|
||||
$lang->project->bycard = 'Card';
|
||||
@@ -90,14 +145,12 @@ $lang->project->acl = 'ACL';
|
||||
$lang->project->setPlanduration = 'Set Duration';
|
||||
$lang->project->auth = 'Privileges';
|
||||
$lang->project->durationEstimation = 'Estimated Workload';
|
||||
$lang->project->teamCount = 'Man';
|
||||
$lang->project->teamSumCount = '%s people in total';
|
||||
$lang->project->leftStories = 'Left Stories';
|
||||
$lang->project->leftTasks = 'Left Tasks';
|
||||
$lang->project->leftBugs = 'Left Bugs';
|
||||
$lang->project->leftHours = 'Left Hours';
|
||||
$lang->project->children = 'Child Project';
|
||||
$lang->project->parent = 'Parent Project';
|
||||
$lang->project->parent = 'Parent Program';
|
||||
$lang->project->allStories = 'All Stories';
|
||||
$lang->project->doneStories = 'Finished Stories';
|
||||
$lang->project->doneProjects = 'Finished';
|
||||
@@ -108,48 +161,89 @@ $lang->project->ev = 'EV';
|
||||
$lang->project->sv = 'SV%';
|
||||
$lang->project->ac = 'AC';
|
||||
$lang->project->cv = 'CV%';
|
||||
$lang->project->pvTitle = 'Planed Value';
|
||||
$lang->project->evTitle = 'Earn Value';
|
||||
$lang->project->svTitle = 'Schedule Variance';
|
||||
$lang->project->acTitle = 'Actual Cost';
|
||||
$lang->project->cvTitle = 'Cost Variance';
|
||||
$lang->project->teamCount = 'Team';
|
||||
$lang->project->teamSumCount = '%s people in total';
|
||||
$lang->project->longTime = 'Long-Term Program';
|
||||
$lang->project->future = 'TBD';
|
||||
$lang->project->moreProject = 'More Project';
|
||||
$lang->project->days = 'Available Days';
|
||||
$lang->project->days = 'Days';
|
||||
$lang->project->mailto = 'Mailto';
|
||||
$lang->project->etc = " , etc";
|
||||
$lang->project->product = 'Product';
|
||||
$lang->project->branch = 'Branch';
|
||||
$lang->project->plan = 'Plan';
|
||||
$lang->project->createKanban = 'Create Kanban';
|
||||
$lang->project->kanban = 'Kanban';
|
||||
|
||||
/* Project Kanban. */
|
||||
$lang->project->projectTypeList = array();
|
||||
$lang->project->projectTypeList[1] = 'Has Product';
|
||||
$lang->project->projectTypeList[0] = 'No Product';
|
||||
|
||||
/* Project Kanban. */
|
||||
$lang->project->typeList = array();
|
||||
$lang->project->typeList['my'] = 'Projects Ownedbyme';
|
||||
$lang->project->typeList['other'] = 'Other Projects';
|
||||
|
||||
$lang->project->divisionList['1'] = 'Create by project';
|
||||
$lang->project->divisionList['0'] = 'Create by product';
|
||||
|
||||
$lang->project->waitProjects = 'Waiting Projects';
|
||||
$lang->project->doingProjects = 'Ongoing Projects';
|
||||
$lang->project->doingExecutions = 'Ongoing Executions';
|
||||
$lang->project->closedProjects = 'Closed Projects(The recent two projects)';
|
||||
$lang->project->closedProject = 'Closed Projects';
|
||||
$lang->project->noProgram = 'Independent Projects';
|
||||
|
||||
$lang->project->laneColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#FFC20E', '#00A78E', '#7FBB00', '#424BAC', '#C0E9FF', '#EC2761');
|
||||
|
||||
$lang->project->productNotEmpty = 'Please link products or create products.';
|
||||
$lang->project->existProductName = 'Product name already exists.';
|
||||
$lang->project->changeProgram = '%s > Change project';
|
||||
$lang->project->changeProgramTip = 'After modifying the project set, the products linked with the project will also modify the project set to which it belongs. Please confirm whether to modify it.';
|
||||
$lang->project->changeProgramTip = 'Once the program is edited, the product that is linked to this program will be changed. Do you want to edit it?';
|
||||
$lang->project->linkedProjectsTip = 'Linked projects are as follows';
|
||||
$lang->project->multiLinkedProductsTip = 'The following products linked to this project are also linked to other projects, please unlink before proceeding.';
|
||||
$lang->project->noticeDivsion = "The current project is associated with multiple products, you can click Confirm to open the mode by {$lang->productCommon} creation stage, click Cancel to keep the status quo.";
|
||||
$lang->project->noticeDivsion = "The current project is a single stage, click [Create by project] to change to multiple stages, each stage is only associated with one product.";
|
||||
$lang->project->linkStoryByPlanTips = "This action will associate all {$lang->SRCommon} under the selected plan to this project";
|
||||
$lang->project->createExecution = "There is no {$lang->executionCommon} under this project, please create {$lang->executionCommon} first";
|
||||
$lang->project->unlinkExecutionMember = "The user participated in %s executions such as %s%s. Do you want to remove the user from those executions as well? (The data related to this user will not be deleted.)";
|
||||
$lang->project->unlinkExecutionMembers = "The team members you are removing are also in the execution team of this project. Do you want to remove them from the execution team too?";
|
||||
$lang->project->productTip = 'After clicking New Product, the project will not be linked to the selected product.';
|
||||
$lang->project->noDevStage = 'There is no R&D stage under this project, or you do not have access permissions. The creation of builds is not supported at the moment.';
|
||||
$lang->project->budgetOverrun = "The project's budget exceeds the remaining budget of the parent program:";
|
||||
$lang->project->disabledInputTip = 'Please cancel %s first';
|
||||
$lang->project->linkRepoFailed = 'Failed to link projects and code repositories.';
|
||||
$lang->project->unLinkProductTip = 'Are you sure you want to unlink %s? (Does not affect linked requirements)';
|
||||
$lang->project->summary = 'Total projects: <strong>%s</strong>.';
|
||||
$lang->project->allSummary = 'Total projects: <strong>%s</strong>, Wait: <strong>%s</strong>, Doing: <strong>%s</strong>, Suspended: <strong>%s</strong>, Closed: <strong>%s</strong>.';
|
||||
$lang->project->checkedSummary = 'Seleted: <strong>%total%</strong>.';
|
||||
$lang->project->checkedAllSummary = 'Seleted: <strong>%total%</strong>, Wait: <strong>%wait%</strong>, Doing: <strong>%doing%</strong>, Suspended: <strong>%suspended%</strong>, Closed: <strong>%closed%</strong>.';
|
||||
|
||||
$lang->project->tenThousand = '';
|
||||
$lang->project->tenThousand = 'Ten Thousand';
|
||||
$lang->project->hundredMillion = 'Hundred Million';
|
||||
|
||||
$lang->project->unitList['CNY'] = 'RMB';
|
||||
$lang->project->unitList['USD'] = 'USD';
|
||||
$lang->project->unitList['HKD'] = 'HKD';
|
||||
$lang->project->unitList['NTD'] = 'New Taiwan';
|
||||
$lang->project->unitList['EUR'] = 'Euro';
|
||||
$lang->project->unitList['DEM'] = 'Deutsche Mark';
|
||||
$lang->project->unitList['CHF'] = 'Swiss Franc';
|
||||
$lang->project->unitList['FRF'] = 'French Franc';
|
||||
$lang->project->unitList['GBP'] = 'Pound';
|
||||
$lang->project->unitList['NLG'] = 'Florin';
|
||||
$lang->project->unitList['CAD'] = 'Canadian';
|
||||
$lang->project->unitList['RUR'] = 'Russian Ruble';
|
||||
$lang->project->unitList['INR'] = 'Indian';
|
||||
$lang->project->unitList['AUD'] = 'Australian';
|
||||
$lang->project->unitList['NZD'] = 'New Zealand';
|
||||
$lang->project->unitList['THB'] = 'Thai Baht';
|
||||
$lang->project->unitList['SGD'] = 'Singapore';
|
||||
$lang->project->unitList['NTD'] = 'NTD';
|
||||
$lang->project->unitList['EUR'] = 'EUR';
|
||||
$lang->project->unitList['DEM'] = 'DEM';
|
||||
$lang->project->unitList['CHF'] = 'CHF';
|
||||
$lang->project->unitList['FRF'] = 'FRF';
|
||||
$lang->project->unitList['GBP'] = 'GPR';
|
||||
$lang->project->unitList['NLG'] = 'NLG';
|
||||
$lang->project->unitList['CAD'] = 'CAD';
|
||||
$lang->project->unitList['RUR'] = 'RUB';
|
||||
$lang->project->unitList['INR'] = 'IDR';
|
||||
$lang->project->unitList['AUD'] = 'AUD';
|
||||
$lang->project->unitList['NZD'] = 'NZD';
|
||||
$lang->project->unitList['THB'] = 'THB';
|
||||
$lang->project->unitList['SGD'] = 'SGD';
|
||||
|
||||
$lang->project->currencySymbol['CNY'] = '¥';
|
||||
$lang->project->currencySymbol['USD'] = '$';
|
||||
@@ -169,34 +263,56 @@ $lang->project->currencySymbol['NZD'] = 'NZ$';
|
||||
$lang->project->currencySymbol['THB'] = '฿';
|
||||
$lang->project->currencySymbol['SGD'] = 'S$';
|
||||
|
||||
$lang->project->modelList[''] = '';
|
||||
$lang->project->modelList['scrum'] = "Scrum";
|
||||
$lang->project->modelList['waterfall'] = "CMMI";
|
||||
if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI";
|
||||
$lang->project->modelList['kanban'] = "Kanban";
|
||||
|
||||
$lang->project->featureBar['browse']['all'] = 'All';
|
||||
$lang->project->featureBar['browse']['doing'] = 'Doing';
|
||||
$lang->project->featureBar['browse']['undone'] = 'Unfinished';
|
||||
$lang->project->featureBar['browse']['wait'] = 'Waiting';
|
||||
$lang->project->featureBar['browse']['doing'] = 'Doing';
|
||||
$lang->project->featureBar['browse']['suspended'] = 'Suspended';
|
||||
$lang->project->featureBar['browse']['closed'] = 'Closed';
|
||||
|
||||
$lang->project->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->project->aclList['private'] = 'Private (For team members and stakeholders only)';
|
||||
$lang->project->aclList['private'] = 'Private (For the project leader, team members and stakeholders only)';
|
||||
$lang->project->aclList['open'] = "Open (accessible with project view permissions)";
|
||||
|
||||
$lang->project->multipleList['1'] = 'Yes';
|
||||
$lang->project->multipleList['0'] = 'No';
|
||||
|
||||
$lang->project->acls['private'] = 'Private';
|
||||
$lang->project->acls['open'] = "Open";
|
||||
$lang->project->acls['open'] = 'Open';
|
||||
|
||||
$lang->project->subAclList['private'] = "Private (Only the project leader, team members and stakeholders can access)";
|
||||
$lang->project->subAclList['open'] = "Open (accessible with project view permissions)";
|
||||
$lang->project->subAclList['program'] = 'Open in the program (all upper-level program team leaders and stakeholders, the project leader, team members and stakeholders can access)';
|
||||
|
||||
$lang->project->kanbanAclList['private'] = 'Private (For the project leader, team members only)';
|
||||
$lang->project->kanbanAclList['open'] = "Open (accessible with project view permissions)";
|
||||
|
||||
$lang->project->kanbanSubAclList['private'] = "Private (Only the project leader, team members can access)";
|
||||
$lang->project->kanbanSubAclList['open'] = "Open (accessible with project view permissions)";
|
||||
$lang->project->kanbanSubAclList['program'] = 'Open in the program (all upper-level program team leaders and stakeholders, the project leader, team members can access)';
|
||||
|
||||
global $config;
|
||||
if($config->systemMode == 'light')
|
||||
{
|
||||
unset($lang->project->subAclList['program']);
|
||||
unset($lang->project->kanbanSubAclList['program']);
|
||||
}
|
||||
|
||||
$lang->project->authList['extend'] = 'Inherit (system privilege and project privilege)';
|
||||
$lang->project->authList['reset'] = 'Reset (project privilege only)';
|
||||
|
||||
$lang->project->statusList[''] = '';
|
||||
$lang->project->statusList['wait'] = 'Waiting';
|
||||
$lang->project->statusList['doing'] = 'Doing';
|
||||
$lang->project->statusList['suspended'] = 'Suspended';
|
||||
$lang->project->statusList['closed'] = 'Closed';
|
||||
$lang->project->statusList['delay'] = 'Delayed';
|
||||
|
||||
$lang->project->endList[31] = 'One month';
|
||||
$lang->project->endList[93] = 'Trimester';
|
||||
@@ -204,46 +320,54 @@ $lang->project->endList[186] = 'Half year';
|
||||
$lang->project->endList[365] = 'One year';
|
||||
$lang->project->endList[999] = 'Longtime';
|
||||
|
||||
$lang->project->scrumTitle = 'Agile Development Management';
|
||||
$lang->project->waterfallTitle = 'Waterfall Project Management';
|
||||
$lang->project->kanbanTitle = 'Kanban Project Management';
|
||||
|
||||
$lang->project->empty = 'No project.';
|
||||
$lang->project->accessDenied = 'Access denied!';
|
||||
$lang->project->chooseProgramType = 'Select the project management model';
|
||||
$lang->project->nextStep = 'Next step';
|
||||
$lang->project->hoursUnit = '%s hours';
|
||||
$lang->project->membersUnit = '%s men';
|
||||
$lang->project->lastIteration = "Recent {$lang->executionCommon}";
|
||||
$lang->project->lastKanban = 'Recent Kanban';
|
||||
$lang->project->ongoingStage = 'Ongoing stage';
|
||||
$lang->project->scrum = 'Scrum';
|
||||
$lang->project->waterfall = 'CMMI';
|
||||
$lang->project->waterfallTitle = 'CMMI';
|
||||
$lang->project->waterfall = 'Waterfall';
|
||||
$lang->project->cannotCreateChild = 'It is not empty, so you cannot add a child. You can add a parent for it, and then create a child.';
|
||||
$lang->project->confirmDelete = "Do you want to delete [%s]?";
|
||||
$lang->project->emptyPM = 'No manager';
|
||||
$lang->project->cannotChangeToCat = "It is not empty, so you cannot change it to a parent.";
|
||||
$lang->project->cannotCancelCat = "It has child projects, so you cannot unmark the parent.";
|
||||
$lang->project->parentBeginEnd = "Parent begin&end date: %s ~ %s";
|
||||
$lang->project->childLongTime = "If a child as long-term projects, the parent should be long-term too.";
|
||||
$lang->project->readjustTime = 'Change the project begin&end date.';
|
||||
$lang->project->notAllowRemoveProducts = 'The story of this product is linked with the project. Unlink it before doing any action.';
|
||||
$lang->project->notAllowRemoveProducts = "Stories of this product are linked to projects or {$lang->execution->common} of this project is linked to this product. Please unlink it and try again.";
|
||||
$lang->project->ge = "『%s』should be >= actual begin『%s』.";
|
||||
|
||||
$lang->project->programTitle['0'] = 'Hide';
|
||||
$lang->project->programTitle['0'] = 'Hidden';
|
||||
$lang->project->programTitle['base'] = 'Base-level project only';
|
||||
$lang->project->programTitle['end'] = 'End-level project only';
|
||||
|
||||
$lang->project->accessDenied = 'Access denied to this project';
|
||||
$lang->project->chooseProgramType = 'Select management type';
|
||||
$lang->project->scrumTitle = 'Agile Development Management';
|
||||
$lang->project->cannotCreateChild = 'The project has contents, so you cannot add a child project. You can create a parent project for this one and then add a child project for the parent project.';
|
||||
$lang->project->hasChildren = 'This project has a child project, so it cannot be deleted.';
|
||||
$lang->project->confirmDelete = 'Do you want to delete this project?';
|
||||
$lang->project->cannotChangeToCat = "The project has contents, so you cannot it to a parent project.";
|
||||
$lang->project->cannotCancelCat = "There are child projects of this project. You cannot cancel the parent project mark.";
|
||||
$lang->project->parentBeginEnd = "The begin and end date of the parent project: %s ~ %s";
|
||||
$lang->project->parentBudget = "The budget of the parent project: ";
|
||||
$lang->project->beginLetterParent = "The begin date of the parent project: %s. It cannot be < the begin date of its parent project.";
|
||||
$lang->project->endGreaterParent = "The end date of the parent project: %s. It cannot be > the end date of its parent project.";
|
||||
$lang->project->beginGreateChild = "The minimum start date of the project set: %s. The start date of the project cannot be less than the minimum start date of the project set.";
|
||||
$lang->project->endLetterChild = "The maximum finish date for the project set: %s. The completion date of a project cannot be greater than the maximum completion date of the project set.";
|
||||
$lang->project->childLongTime = "There are long-term projects in the child project, and the parent project should also be a long-term project.";
|
||||
$lang->project->accessDenied = 'Access denied to this project';
|
||||
$lang->project->chooseProgramType = 'Select management type';
|
||||
$lang->project->cannotCreateChild = 'The project has contents, so you cannot add a child project. You can create a parent project for this one and then add a child project for the parent project.';
|
||||
$lang->project->hasChildren = 'This project has a child project, so it cannot be deleted.';
|
||||
$lang->project->confirmDelete = 'Do you want to delete \"%s\"?';
|
||||
$lang->project->cannotChangeToCat = "The project has contents, so you cannot it to a parent project.";
|
||||
$lang->project->cannotCancelCat = "There are child projects of this project. You cannot cancel the parent project mark.";
|
||||
$lang->project->parentBeginEnd = "The begin and end date of the parent project: %s ~ %s";
|
||||
$lang->project->parentBudget = "The budget of the parent program: ";
|
||||
$lang->project->beginLetterParent = "The start date of the project is < the start date of the parent program:";
|
||||
$lang->project->endGreaterParent = "The finish date of the project is > the finish date of the parent program:";
|
||||
$lang->project->dateExceedParent = "The start and finish date of the project was > the start and finish date of the parent program:";
|
||||
$lang->project->beginGreateChild = 'The start date of the project should be ≥ the start date of program: %s.';
|
||||
$lang->project->endLetterChild = 'The finish date of the project should be ≤ the finish date of program: %s.';
|
||||
$lang->project->begigLetterExecution = 'The start date of project should be ≤ the minimum start date of the execution: %s.';
|
||||
$lang->project->endGreateExecution = 'The finish date of the project should be ≥ the maximum finish date of the execution: %s.';
|
||||
$lang->project->childLongTime = "There are long-term projects in the child project, and the parent project should also be a long-term project.";
|
||||
$lang->project->confirmUnlinkMember = "Do you want to remove this user from project?";
|
||||
$lang->project->divisionTips = "Created by project as a single set of stages, and the stage is associated with all products; created by product as multiple sets of stages, each set of stages is associated with a product";
|
||||
|
||||
$lang->project->action = new stdclass();
|
||||
$lang->project->action->managed = '$date, managed by <strong>$actor</strong>. $extra' . "\n";
|
||||
|
||||
$lang->project->multiple = "Multi {$lang->executionCommon}";
|
||||
|
||||
@@ -134,7 +134,7 @@ $lang->project->realBeganAB = '实际开始';
|
||||
$lang->project->realEndAB = '实际完成';
|
||||
$lang->project->realBegan = '实际开始日期';
|
||||
$lang->project->realEnd = '实际完成日期';
|
||||
$lang->project->division = '按产品创建阶段';
|
||||
$lang->project->division = '阶段类型';
|
||||
$lang->project->bygrid = '看板';
|
||||
$lang->project->bylist = '列表';
|
||||
$lang->project->bycard = '卡片';
|
||||
@@ -190,8 +190,8 @@ $lang->project->typeList = array();
|
||||
$lang->project->typeList['my'] = '我负责的项目';
|
||||
$lang->project->typeList['other'] = '其他项目';
|
||||
|
||||
$lang->project->divisionList['1'] = '开启';
|
||||
$lang->project->divisionList['0'] = '关闭';
|
||||
$lang->project->divisionList['0'] = '按项目创建';
|
||||
$lang->project->divisionList['1'] = "按{$lang->productCommon}创建";
|
||||
|
||||
$lang->project->waitProjects = '未开始的项目';
|
||||
$lang->project->doingProjects = '进行中的项目';
|
||||
@@ -208,7 +208,7 @@ $lang->project->changeProgram = '%s > 修改项目集';
|
||||
$lang->project->changeProgramTip = '修改项目集后,该项目关联产品的项目集也会被修改,请确认是否修改。';
|
||||
$lang->project->linkedProjectsTip = '关联的项目如下';
|
||||
$lang->project->multiLinkedProductsTip = '该项目关联的如下产品还关联了其他项目,请取消关联后再操作';
|
||||
$lang->project->noticeDivsion = '当前项目关联多个产品,可以点击确认开启按产品创建阶段的模式,点击关闭则保持现状。';
|
||||
$lang->project->noticeDivsion = "当前项目为单套阶段,点击[按项目创建]可以变为多套阶段,每套阶段只关联一个{$lang->productCommon}。";
|
||||
$lang->project->linkStoryByPlanTips = "此操作会将所选计划下面的{$lang->SRCommon}全部关联到此项目中";
|
||||
$lang->project->createExecution = "该项目下没有{$lang->executionCommon},请先创建{$lang->executionCommon}";
|
||||
$lang->project->unlinkExecutionMember = "该用户参与了%s%s%s个{$lang->execution->common},是否同时将其移除?(该用户所产生的数据不会受影响。)";
|
||||
@@ -373,6 +373,7 @@ $lang->project->begigLetterExecution = '项目的开始日期应小于等于执
|
||||
$lang->project->endGreateExecution = '项目的完成日期应大于等于执行的最大完成日期:%s';
|
||||
$lang->project->childLongTime = "子项目中有长期项目,父项目也应该是长期项目";
|
||||
$lang->project->confirmUnlinkMember = "您确定从该项目中移除该用户吗?";
|
||||
$lang->project->divisionTips = "按项目创建为单套阶段,阶段关联所有{$lang->productCommon};按{$lang->productCommon}创建为多套阶段,每套阶段关联一个{$lang->productCommon}。";
|
||||
|
||||
$lang->project->action = new stdclass();
|
||||
$lang->project->action->managed = '$date, 由 <strong>$actor</strong> 维护。$extra' . "\n";
|
||||
|
||||
@@ -792,11 +792,11 @@ class projectModel extends model
|
||||
* @param string $orderBy
|
||||
* @param string $excludedModel
|
||||
* @param string $model
|
||||
* @param bool $multiple
|
||||
* @param string $param multiple|product
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function getPairsByProgram($programID = '', $status = 'all', $isQueryAll = false, $orderBy = 'order_asc', $excludedModel = '', $model = '', $multiple = false)
|
||||
public function getPairsByProgram($programID = '', $status = 'all', $isQueryAll = false, $orderBy = 'order_asc', $excludedModel = '', $model = '', $param = '')
|
||||
{
|
||||
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProjectPairs();
|
||||
return $this->dao->select('id, name')->from(TABLE_PROJECT)
|
||||
@@ -807,7 +807,8 @@ class projectModel extends model
|
||||
->beginIF($status != 'all' and $status != 'noclosed')->andWhere('status')->eq($status)->fi()
|
||||
->beginIF($excludedModel)->andWhere('model')->ne($excludedModel)->fi()
|
||||
->beginIF($model)->andWhere('model')->eq($model)->fi()
|
||||
->beginIF($multiple)->andWhere('multiple')->eq(1)->fi()
|
||||
->beginIF(strpos($param, 'multiple') !== false)->andWhere('multiple')->eq(1)->fi()
|
||||
->beginIF(strpos($param, 'product') !== false)->andWhere('hasProduct')->eq(1)->fi()
|
||||
->beginIF($status == 'noclosed')->andWhere('status')->ne('closed')->fi()
|
||||
->beginIF(!$this->app->user->admin and !$isQueryAll)->andWhere('id')->in($this->app->user->view->projects)->fi()
|
||||
->orderBy($orderBy)
|
||||
@@ -2848,6 +2849,17 @@ class projectModel extends model
|
||||
$this->lang->project->menuOrder = $this->lang->$navGroup->menuOrder;
|
||||
$this->lang->project->dividerMenu = $this->lang->$navGroup->dividerMenu;
|
||||
|
||||
if(empty($project->hasProduct))
|
||||
{
|
||||
unset($this->lang->project->menu->settings['subMenu']->products);
|
||||
}
|
||||
else
|
||||
{
|
||||
unset($this->lang->project->menu->settings['subMenu']->module);
|
||||
unset($this->lang->project->menu->settings['subMenu']->managerepo);
|
||||
unset($this->lang->project->menu->projectplan);
|
||||
}
|
||||
|
||||
$this->loadModel('common')->resetProjectPriv($projectID);
|
||||
}
|
||||
|
||||
|
||||
@@ -199,7 +199,10 @@
|
||||
<?php if($model == 'waterfall'):?>
|
||||
<tr class='hide division'>
|
||||
<th><?php echo $lang->project->division;?></th>
|
||||
<td colspan='3'><?php echo html::radio('division', $lang->project->divisionList, '0');?></td>
|
||||
<td>
|
||||
<?php echo html::radio('division', $lang->project->divisionList, '0');?>
|
||||
<icon class='icon icon-help' data-toggle='popover' data-trigger='focus hover' data-placement='right' data-tip-class='text-muted popover-sm' data-content="<?php echo $lang->project->divisionTips;?>"></icon>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<?php if($model == 'kanban'):?>
|
||||
|
||||
@@ -42,10 +42,12 @@
|
||||
<?php if(common::hasPriv('execution', 'task')) echo html::checkbox('showTask', array('1' => $lang->programplan->stageCustom->task), '', $this->cookie->showTask ? 'checked=checked' : '');?>
|
||||
</div>
|
||||
<div class='btn-toolbar pull-right'>
|
||||
<?php if($project->model == 'waterfall'):?>
|
||||
<div class="btn-group">
|
||||
<?php echo html::a('', "<i class='icon-list'></i> ", '', "class='btn btn-icon text-primary switchBtn' title='{$lang->project->bylist}'");?>
|
||||
<?php echo html::a($this->createLink('programplan', 'browse', "projectID=$projectID&productID=$productID&type=gantt"), "<i class='icon-gantt-alt'></i> ", '', "class='btn btn-icon switchBtn' title='{$lang->programplan->gantt}'");?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php common::printLink('execution', 'export', "status=$status&productID=$productID&orderBy=$orderBy&from=project", "<i class='icon-export muted'> </i> " . $lang->export, '', "class='btn btn-link export'")?>
|
||||
<?php if(common::hasPriv('programplan', 'create') and $isStage):?>
|
||||
<?php echo html::a($this->createLink('programplan', 'create', "projectID=$projectID&productID=$productID"), "<i class='icon icon-plus'></i> " . $lang->programplan->create, '', "class='btn btn-primary'");?>
|
||||
|
||||
@@ -23,9 +23,11 @@
|
||||
<span class='btn btn-link btn-active-text'><span class='text'><?php echo $lang->project->manageProducts;?></span></span>
|
||||
</div>
|
||||
|
||||
<?php if($this->config->systemMode == 'ALM'):?>
|
||||
<div class='btn-toolbar pull-right'>
|
||||
<button type='button' class='btn btn-primary' data-toggle='modal' data-target='#otherProductsModal'><i class='icon icon-link'></i> <?php echo $lang->project->manageOtherProducts; ?></button>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<div id='mainContent'>
|
||||
<div class='cell'>
|
||||
@@ -46,9 +48,34 @@
|
||||
</div>
|
||||
</div>
|
||||
<?php echo html::hidden("branch[$i]", $branchID);?>
|
||||
<?php if(!isset($branchGroups[$productID])) unset($currentProducts[$productID]);?>
|
||||
<?php if(isset($branchGroups[$productID][$branchID])) unset($branchGroups[$productID][$branchID]);?>
|
||||
<?php if(isset($branchGroups[$productID]) and empty($branchGroups[$productID])) unset($currentProducts[$productID]);?>
|
||||
|
||||
<?php
|
||||
if(!isset($branchGroups[$productID]))
|
||||
{
|
||||
if($this->config->systemMode == 'ALM')
|
||||
{
|
||||
unset($currentProducts[$productID]);
|
||||
}
|
||||
else
|
||||
{
|
||||
unset($allProducts[$productID]);
|
||||
}
|
||||
}
|
||||
|
||||
if(isset($branchGroups[$productID][$branchID])) unset($branchGroups[$productID][$branchID]);
|
||||
|
||||
if(isset($branchGroups[$productID]) and empty($branchGroups[$productID]))
|
||||
{
|
||||
if($this->config->systemMode == 'ALM')
|
||||
{
|
||||
unset($currentProducts[$productID]);
|
||||
}
|
||||
else
|
||||
{
|
||||
unset($allProducts[$productID]);
|
||||
}
|
||||
}
|
||||
?>
|
||||
<?php $i++;?>
|
||||
<?php endforeach;?>
|
||||
<?php endforeach;?>
|
||||
@@ -57,7 +84,10 @@
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->project->unlinkedProducts;?></div>
|
||||
<div class='detail-content row'>
|
||||
<?php foreach($currentProducts as $productID => $productName):?>
|
||||
<?php
|
||||
$unlinkedProducts = $this->config->systemMode == 'ALM' ? $currentProducts : $allProducts;
|
||||
foreach($unlinkedProducts as $productID => $productName):
|
||||
?>
|
||||
<div class='col-sm-4'>
|
||||
<div class='product<?php echo isset($branchGroups[$productID]) ? ' has-branch' : ''?>'>
|
||||
<div class="checkbox-primary" title='<?php echo $productName;?>'>
|
||||
@@ -75,6 +105,8 @@
|
||||
<?php echo html::hidden("post", 'post');?>
|
||||
<?php echo html::submitButton();?>
|
||||
</div>
|
||||
|
||||
<?php if($this->config->systemMode == 'ALM'):?>
|
||||
<div class='modal fade' id='otherProductsModal'>
|
||||
<div class='modal-content'>
|
||||
<div class='modal-dialog w-600px'>
|
||||
@@ -97,6 +129,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -83,15 +83,12 @@ class projectrelease extends control
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
$releases = $this->projectrelease->getList($projectID, $type, $orderBy, $pager);
|
||||
$productIdList = array();
|
||||
foreach($releases as $release) $productIdList[$release->product] = $release->product;
|
||||
|
||||
$this->view->title = $objectName . $this->lang->colon . $this->lang->release->browse;
|
||||
$this->view->execution = $execution;
|
||||
$this->view->project = $project;
|
||||
$this->view->products = $this->loadModel('product')->getProducts($projectID);
|
||||
$this->view->releases = $releases;
|
||||
$this->view->builds = $this->loadModel('build')->getBuildPairs($productIdList, 'all', 'notrunk,withbranch', $projectID, 'project');
|
||||
$this->view->projectID = $projectID;
|
||||
$this->view->executionID = $executionID;
|
||||
$this->view->type = $type;
|
||||
@@ -372,7 +369,7 @@ class projectrelease extends control
|
||||
$builds = $this->dao->select('*')->from(TABLE_BUILD)->where('id')->in($release->build)->fetchAll('id');
|
||||
foreach($builds as $build)
|
||||
{
|
||||
if(empty($build->execution)) $this->build->delete(TABLE_BUILD, $build->id);
|
||||
if(empty($build->execution) and empty($build->builds) and $build->createdDate == $release->createdDate) $this->build->delete(TABLE_BUILD, $build->id);
|
||||
}
|
||||
|
||||
$message = $this->executeHooks($releaseID);
|
||||
@@ -390,7 +387,6 @@ class projectrelease extends control
|
||||
{
|
||||
$response['result'] = 'success';
|
||||
$response['message'] = '';
|
||||
$this->dao->update(TABLE_BUILD)->set('deleted')->eq(1)->where('id')->in($release->build)->andWhere('name')->eq($release->name)->exec();
|
||||
}
|
||||
return $this->send($response);
|
||||
}
|
||||
@@ -693,7 +689,7 @@ class projectrelease extends control
|
||||
$this->config->bug->search['params']['resolvedBuild']['values'] = $this->config->bug->search['params']['openedBuild']['values'];
|
||||
|
||||
$searchModules = array();
|
||||
$moduleGroups = $this->loadModel('tree')->getOptionMenu($release->product, 'story', 0, explode(',', $release->branch));
|
||||
$moduleGroups = $this->loadModel('tree')->getOptionMenu($release->product, 'bug', 0, explode(',', $release->branch));
|
||||
foreach($moduleGroups as $modules) $searchModules += $modules;
|
||||
$this->config->bug->search['params']['module']['values'] = $searchModules;
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ class projectreleaseModel extends model
|
||||
$this->loadModel('file');
|
||||
$release = $this->file->replaceImgURL($release, 'desc');
|
||||
$release->files = $this->file->getByObject('release', $releaseID);
|
||||
$release->buildInfos = $this->dao->select('id,project,product,name,scmPath,filePath')->from(TABLE_BUILD)->where('id')->in($release->build)->fetchAll('id');
|
||||
$release->buildInfos = $this->dao->select('id,project,product,execution,name,scmPath,filePath')->from(TABLE_BUILD)->where('id')->in($release->build)->fetchAll('id');
|
||||
if(empty($release->files))$release->files = $this->file->getByObject('build', $release->build);
|
||||
if($setImgSize) $release->desc = $this->file->setImgSize($release->desc);
|
||||
return $release;
|
||||
@@ -55,7 +55,7 @@ class projectreleaseModel extends model
|
||||
*/
|
||||
public function getList($projectID, $type = 'all', $orderBy = 't1.date_desc', $pager = null)
|
||||
{
|
||||
return $this->dao->select('t1.*, t2.name as productName')->from(TABLE_RELEASE)->alias('t1')
|
||||
$releases = $this->dao->select('t1.*, t2.name as productName')->from(TABLE_RELEASE)->alias('t1')
|
||||
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id')
|
||||
->where('t1.deleted')->eq(0)
|
||||
->andWhere("FIND_IN_SET($projectID, t1.project)")
|
||||
@@ -64,6 +64,26 @@ class projectreleaseModel extends model
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
->fetchAll();
|
||||
|
||||
$buildIdList = array();
|
||||
foreach($releases as $release)
|
||||
{
|
||||
$release->project = trim($release->project, ',');
|
||||
$release->branch = trim($release->branch, ',');
|
||||
$release->build = trim($release->build, ',');
|
||||
$buildIdList = array_merge($buildIdList, explode(',', $release->build));
|
||||
}
|
||||
|
||||
$builds = $this->dao->select("id,project,product,execution,name,scmPath,filePath")->from(TABLE_BUILD)->where('id')->in(array_unique($buildIdList))->fetchAll('id');
|
||||
foreach($releases as $release)
|
||||
{
|
||||
foreach(explode(',', $release->build) as $buildID)
|
||||
{
|
||||
if(empty($buildID)) continue;
|
||||
$release->buildInfos[$buildID] = $builds[$buildID];
|
||||
}
|
||||
}
|
||||
return $releases;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -65,11 +65,10 @@
|
||||
<tbody>
|
||||
<?php foreach($releases as $release):?>
|
||||
<?php
|
||||
$linkedBuilds = explode(',', trim($release->build, ','));
|
||||
$buildCount = count($linkedBuilds);
|
||||
foreach($linkedBuilds as $i => $buildID):
|
||||
$i = 0;
|
||||
$buildCount = count($release->buildInfos);
|
||||
foreach($release->buildInfos as $buildID => $build):
|
||||
?>
|
||||
<?php $buildName = zget($builds, $buildID, '');?>
|
||||
<?php if($i == 0):?>
|
||||
<?php $rowspan = $buildCount > 1 ? "rowspan='$buildCount'" : '';?>
|
||||
<tr data-type='<?php echo $release->status;?>'>
|
||||
@@ -83,7 +82,7 @@
|
||||
<?php if($project->hasProduct):?>
|
||||
<td <?php echo $rowspan?> title='<?php echo $release->productName?>'><?php echo $release->productName?></td>
|
||||
<?php endif;?>
|
||||
<td class='c-build' title='<?php echo $buildName;?>'><?php echo html::a($this->createLink('build', 'view', "buildID=$buildID"), $buildName, '', "data-app='project'");?></td>
|
||||
<td class='c-build' title='<?php echo $build->name;?>'><?php echo html::a($this->createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$buildID"), $build->name, '', "data-app='project'");?></td>
|
||||
<?php $status = $this->processStatus('release', $release);?>
|
||||
<td <?php echo $rowspan?> class='c-status text-center' title='<?php echo $status;?>'>
|
||||
<span class="status-release status-<?php echo $release->status?>"><?php echo $status;?></span>
|
||||
@@ -94,9 +93,10 @@
|
||||
</tr>
|
||||
<?php else:?>
|
||||
<tr>
|
||||
<td class='c-build' title='<?php echo $buildName;?>'><?php echo html::a($this->createLink('build', 'view', "buildID=$buildID"), $buildName, '', "data-app='project'");?></td>
|
||||
<td class='c-build' title='<?php echo $build->name;?>'><?php echo html::a($this->createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$buildID"), $build->name, '', "data-app='project'");?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<?php $i++; ?>
|
||||
<?php endforeach;?>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<?php echo html::select('product', $products, $product->id, "onchange='loadBranches(this.value)' class='form-control chosen'");?>
|
||||
<?php if($product->type != 'normal') echo html::select('branch', $branches, $branch, "class='form-control chosen control-branch'");?>
|
||||
<?php if($product->type != 'normal') echo html::select('branch', $branches, $branch, "onchange='loadBuilds()' class='form-control chosen control-branch'");?>
|
||||
</div>
|
||||
</td>
|
||||
<td></td>
|
||||
|
||||
@@ -356,9 +356,9 @@
|
||||
$buildHtml = array();
|
||||
foreach($release->buildInfos as $buildID => $buildInfo)
|
||||
{
|
||||
$buildHtml[] = html::a($this->createLink('build', 'view', "buildID=$buildID"), $buildInfo->name);
|
||||
$buildHtml[] = html::a($this->createLink($buildInfo->execution ? 'build' : 'projectbuild', 'view', "buildID=$buildID"), $buildInfo->name, '', "data-app='project'");
|
||||
}
|
||||
echo join(', ', $buildHtml);
|
||||
echo join($lang->comma, $buildHtml);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
+43
-19
@@ -464,7 +464,6 @@ class release extends control
|
||||
$this->session->set('storyList', inlink('view', "releaseID=$releaseID&type=story&link=true¶m=" . helper::safe64Encode("&browseType=$browseType&queryID=$param")), 'product');
|
||||
|
||||
$release = $this->release->getById($releaseID);
|
||||
$build = $this->loadModel('build')->getByID($release->build);
|
||||
$this->commonAction($release->product);
|
||||
$this->loadModel('story');
|
||||
$this->loadModel('tree');
|
||||
@@ -475,15 +474,21 @@ class release extends control
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
/* Build search form. */
|
||||
$queryID = ($browseType == 'bySearch') ? (int)$param : 0;
|
||||
unset($this->config->product->search['fields']['product']);
|
||||
unset($this->config->product->search['fields']['project']);
|
||||
|
||||
$queryID = ($browseType == 'bySearch') ? (int)$param : 0;
|
||||
$this->config->product->search['actionURL'] = $this->createLink('release', 'view', "releaseID=$releaseID&type=story&link=true¶m=" . helper::safe64Encode('&browseType=bySearch&queryID=myQueryID'));
|
||||
$this->config->product->search['queryID'] = $queryID;
|
||||
$this->config->product->search['style'] = 'simple';
|
||||
$this->config->product->search['params']['plan']['values'] = $this->loadModel('productplan')->getPairsForStory($release->product, $release->branch, 'skipParent|withMainPlan');
|
||||
$this->config->product->search['params']['status'] = array('operator' => '=', 'control' => 'select', 'values' => $this->lang->story->statusList);
|
||||
$this->config->product->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($release->product, 'story', 0, $release->branch);;
|
||||
|
||||
$searchModules = array();
|
||||
$moduleGroups = $this->loadModel('tree')->getOptionMenu($release->product, 'story', 0, explode(',', $release->branch));;
|
||||
foreach($moduleGroups as $modules) $searchModules += $modules;
|
||||
$this->config->product->search['params']['module']['values'] = $searchModules;
|
||||
|
||||
if($this->session->currentProductType == 'normal')
|
||||
{
|
||||
unset($this->config->product->search['fields']['branch']);
|
||||
@@ -491,20 +496,30 @@ class release extends control
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->config->product->search['fields']['branch'] = $this->lang->product->branch;
|
||||
$branchName = $this->loadModel('branch')->getById($release->branch);
|
||||
$branches = array('' => '', BRANCH_MAIN => $this->lang->branch->main, $release->branch => $branchName);
|
||||
$allBranchs = $this->loadModel('branch')->getPairs($release->product);
|
||||
$branches = array('' => '', BRANCH_MAIN => $this->lang->branch->main);
|
||||
foreach(explode(',', trim($release->branch, ',')) as $branchID) $branches[$branchID] = zget($allBranchs, $branchID);
|
||||
|
||||
$this->config->product->search['fields']['branch'] = sprintf($this->lang->product->branch, $this->lang->product->branchName[$release->productType]);
|
||||
$this->config->product->search['params']['branch']['values'] = $branches;
|
||||
}
|
||||
$this->loadModel('search')->setSearchParams($this->config->product->search);
|
||||
|
||||
if($browseType == 'bySearch' or $build->execution == 0)
|
||||
$builds = $this->loadModel('build')->getByList($release->build);
|
||||
$executionIdList = array();
|
||||
foreach($builds as $build)
|
||||
{
|
||||
$allStories = $this->story->getBySearch($release->product, "0,{$release->branch}", $queryID, 'id', $build->execution ? $build->execution : '', 'story', $release->stories, $pager);
|
||||
if(empty($build->execution)) continue;
|
||||
$executionIdList[$build->execution] = $build->execution;
|
||||
}
|
||||
|
||||
if($browseType == 'bySearch')
|
||||
{
|
||||
$allStories = $this->story->getBySearch($release->product, $release->branch, $queryID, 'id', $executionIdList, 'story', $release->stories, $pager);
|
||||
}
|
||||
else
|
||||
{
|
||||
$allStories = $this->story->getExecutionStories($build->execution, $build->product, 0, 't1.`order`_desc', 'byBranch', $release->branch, 'story', $release->stories, $pager);
|
||||
$allStories = $this->story->getExecutionStories($executionIdList, $build->product, 0, 't1.`order`_desc', 'byBranch', $release->branch, 'story', $release->stories, $pager);
|
||||
}
|
||||
|
||||
$this->view->allStories = $allStories;
|
||||
@@ -584,7 +599,6 @@ class release extends control
|
||||
$this->session->set('bugList', inlink('view', "releaseID=$releaseID&type=$type&link=true¶m=" . helper::safe64Encode("&browseType=$browseType&queryID=$param")), 'qa');
|
||||
/* Set menu. */
|
||||
$release = $this->release->getByID($releaseID);
|
||||
$build = $this->loadModel('build')->getByID($release->build);
|
||||
$this->commonAction($release->product);
|
||||
|
||||
/* Load pager. */
|
||||
@@ -593,17 +607,24 @@ class release extends control
|
||||
|
||||
/* Build the search form. */
|
||||
$this->loadModel('bug');
|
||||
$queryID = ($browseType == 'bysearch') ? (int)$param : 0;
|
||||
unset($this->config->bug->search['fields']['product']);
|
||||
unset($this->config->bug->search['fields']['project']);
|
||||
|
||||
$queryID = ($browseType == 'bysearch') ? (int)$param : 0;
|
||||
$this->config->bug->search['actionURL'] = $this->createLink('release', 'view', "releaseID=$releaseID&type=$type&link=true¶m=" . helper::safe64Encode('&browseType=bySearch&queryID=myQueryID'));
|
||||
$this->config->bug->search['queryID'] = $queryID;
|
||||
$this->config->bug->search['style'] = 'simple';
|
||||
|
||||
$this->config->bug->search['params']['plan']['values'] = $this->loadModel('productplan')->getPairsForStory($release->product, $release->branch, 'skipParent|withMainPlan');
|
||||
$this->config->bug->search['params']['execution']['values'] = $this->loadModel('product')->getExecutionPairsByProduct($release->product, $release->branch);
|
||||
$this->config->bug->search['params']['openedBuild']['values'] = $this->loadModel('build')->getBuildPairs($release->product, $branch = 'all', $params = '');
|
||||
$this->config->bug->search['params']['resolvedBuild']['values'] = $this->config->bug->search['params']['openedBuild']['values'];
|
||||
$this->config->bug->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($release->product, 'bug', 0, $release->branch);
|
||||
|
||||
$searchModules = array();
|
||||
$moduleGroups = $this->loadModel('tree')->getOptionMenu($release->product, 'bug', 0, explode(',', $release->branch));
|
||||
foreach($moduleGroups as $modules) $searchModules += $modules;
|
||||
$this->config->bug->search['params']['module']['values'] = $searchModules;
|
||||
|
||||
if($this->session->currentProductType == 'normal')
|
||||
{
|
||||
unset($this->config->bug->search['fields']['branch']);
|
||||
@@ -611,28 +632,31 @@ class release extends control
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->config->bug->search['fields']['branch'] = $this->lang->product->branch;
|
||||
$branchName = $this->loadModel('branch')->getById($release->branch);
|
||||
$branches = array('' => '', BRANCH_MAIN => $this->lang->branch->main, $release->branch => $branchName);
|
||||
$allBranchs = $this->loadModel('branch')->getPairs($release->product);
|
||||
$branches = array('' => '', BRANCH_MAIN => $this->lang->branch->main);
|
||||
foreach(explode(',', trim($release->branch, ',')) as $branchID) $branches[$branchID] = zget($allBranchs, $branchID);
|
||||
|
||||
$this->config->bug->search['fields']['branch'] = sprintf($this->lang->product->branch, $this->lang->product->branchName[$release->productType]);
|
||||
$this->config->bug->search['params']['branch']['values'] = $branches;
|
||||
}
|
||||
$this->loadModel('search')->setSearchParams($this->config->bug->search);
|
||||
|
||||
$builds = $this->loadModel('build')->getByList($release->build);
|
||||
$allBugs = array();
|
||||
$releaseBugs = $type == 'bug' ? $release->bugs : $release->leftBugs;
|
||||
if($browseType == 'bySearch' or $build->execution == 0)
|
||||
if($browseType == 'bySearch')
|
||||
{
|
||||
$allBugs = $this->bug->getBySearch($release->product, $release->branch, $queryID, 'id_desc', $releaseBugs, $pager);
|
||||
}
|
||||
elseif($build->execution)
|
||||
else
|
||||
{
|
||||
if($type == 'bug')
|
||||
{
|
||||
$allBugs = $this->bug->getReleaseBugs($build->id, $release->product, $release->branch, $releaseBugs, $pager);
|
||||
$allBugs = $this->bug->getReleaseBugs(array_keys($builds), $release->product, $release->branch, $releaseBugs, $pager);
|
||||
}
|
||||
elseif($type == 'leftBug')
|
||||
{
|
||||
$allBugs = $this->bug->getProductLeftBugs($build->id, $release->product, $release->branch, $releaseBugs, $pager);
|
||||
$allBugs = $this->bug->getProductLeftBugs(array_keys($builds), $release->product, $release->branch, $releaseBugs, $pager);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#releaseList {font-size: 13px;}
|
||||
td {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
#releaseList tbody>tr:hover{background-color: unset!important;}
|
||||
.main-table tbody>tr>td:first-child{padding: 2px 8px!important;}
|
||||
|
||||
.c-id {width: 60px}
|
||||
|
||||
@@ -38,6 +38,8 @@ $lang->release->product = $lang->productCommon;
|
||||
$lang->release->branch = 'Platform/Branch';
|
||||
$lang->release->project = 'Project';
|
||||
$lang->release->build = 'Build';
|
||||
$lang->release->includedBuild = 'Included Build';
|
||||
$lang->release->relatedProject = 'Related Project';
|
||||
$lang->release->name = 'Name';
|
||||
$lang->release->marker = 'Meilensteine';
|
||||
$lang->release->date = 'Datum';
|
||||
|
||||
@@ -39,6 +39,8 @@ $lang->release->product = $lang->productCommon;
|
||||
$lang->release->branch = 'Platform/Branch';
|
||||
$lang->release->project = 'Project';
|
||||
$lang->release->build = 'Build';
|
||||
$lang->release->includedBuild = 'Included Build';
|
||||
$lang->release->relatedProject = 'Related Project';
|
||||
$lang->release->name = 'Name';
|
||||
$lang->release->marker = 'Milestone';
|
||||
$lang->release->date = 'Release Date';
|
||||
|
||||
@@ -38,6 +38,8 @@ $lang->release->product = $lang->productCommon;
|
||||
$lang->release->branch = 'Plateforme/Branche';
|
||||
$lang->release->project = 'Project';
|
||||
$lang->release->build = 'Build';
|
||||
$lang->release->includedBuild = 'Included Build';
|
||||
$lang->release->relatedProject = 'Related Project';
|
||||
$lang->release->name = 'Nom';
|
||||
$lang->release->marker = 'Etape Importante';
|
||||
$lang->release->date = 'Date Release';
|
||||
|
||||
@@ -39,6 +39,8 @@ $lang->release->product = $lang->productCommon;
|
||||
$lang->release->branch = '平台/分支';
|
||||
$lang->release->project = '所属项目';
|
||||
$lang->release->build = '版本';
|
||||
$lang->release->includedBuild = '包含版本';
|
||||
$lang->release->relatedProject = '对应项目';
|
||||
$lang->release->name = '发布名称';
|
||||
$lang->release->marker = '里程碑';
|
||||
$lang->release->date = '发布日期';
|
||||
|
||||
@@ -31,7 +31,7 @@ class releaseModel extends model
|
||||
->fetch();
|
||||
if(!$release) return false;
|
||||
|
||||
$release->builds = $this->dao->select('id, filePath, scmPath, name, project')->from(TABLE_BUILD)->where('id')->in($release->build)->fetchAll();
|
||||
$release->builds = $this->dao->select('id, filePath, scmPath, name, execution, project')->from(TABLE_BUILD)->where('id')->in($release->build)->fetchAll();
|
||||
|
||||
$this->loadModel('file');
|
||||
$release = $this->file->replaceImgURL($release, 'desc');
|
||||
@@ -66,7 +66,7 @@ class releaseModel extends model
|
||||
->page($pager)
|
||||
->fetchAll();
|
||||
|
||||
$builds = $this->dao->select("t1.id, t1.name, IF(t2.name IS NOT NULL, t2.name, '') AS projectName, IF(t3.name IS NOT NULL, t3.name, '{$this->lang->trunk}') AS branchName")
|
||||
$builds = $this->dao->select("t1.id, t1.name, t1.execution, IF(t2.name IS NOT NULL, t2.name, '') AS projectName, IF(t3.name IS NOT NULL, t3.name, '{$this->lang->trunk}') AS branchName")
|
||||
->from(TABLE_BUILD)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
|
||||
->leftJoin(TABLE_BRANCH)->alias('t3')->on('t1.branch = t3.id')
|
||||
|
||||
@@ -51,8 +51,8 @@
|
||||
<tr>
|
||||
<th class='c-id'><?php echo $lang->release->id;?></th>
|
||||
<th class="c-name"><?php echo $lang->release->name;?></th>
|
||||
<th class='text-center c-build'><?php echo $lang->release->build;?></th>
|
||||
<th class='text-center c-build'><?php echo $lang->release->project;?></th>
|
||||
<th class='text-center c-build'><?php echo $lang->release->includedBuild;?></th>
|
||||
<th class='text-center c-project'><?php echo $lang->release->relatedProject;?></th>
|
||||
<th class='text-center c-status'><?php echo $lang->release->status;?></th>
|
||||
<th class='c-date text-center'><?php echo $lang->release->date;?></th>
|
||||
<?php
|
||||
@@ -82,7 +82,7 @@
|
||||
<?php if($product->type != 'normal'):?>
|
||||
<span class='label label-outline label-badge'><?php echo $build->branchName;?></span>
|
||||
<?php endif;?>
|
||||
<?php echo html::a($this->createLink('build', 'view', "buildID=$build->id"), $build->name);?>
|
||||
<?php echo html::a($this->createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$build->id"), $build->name);?>
|
||||
</td>
|
||||
<td><?php echo $build->projectName;?></td>
|
||||
<?php if($i == 1):?>
|
||||
|
||||
@@ -357,7 +357,7 @@
|
||||
foreach($release->builds as $build)
|
||||
{
|
||||
$buildDivision = $i == count($release->builds) ? '' : $lang->comma;
|
||||
echo (($build->project) ? html::a($this->createLink('build', 'view', "buildID=$build->id"), $build->name, '_blank') : $build->name) . $buildDivision;
|
||||
echo (($build->project) ? html::a($this->createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$build->id"), $build->name) : $build->name) . $buildDivision;
|
||||
$i++;
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -973,10 +973,11 @@ class searchModel extends model
|
||||
if($this->app->user->admin) return $results;
|
||||
|
||||
$this->loadModel('doc');
|
||||
$products = $this->app->user->view->products;
|
||||
$programs = $this->app->user->view->programs;
|
||||
$projects = $this->app->user->view->projects;
|
||||
$executions = $this->app->user->view->sprints;
|
||||
$products = $this->app->user->view->products;
|
||||
$shadowProducts = $this->dao->select('id')->from(TABLE_PRODUCT)->where('shadow')->eq(1)->fetchPairs('id');
|
||||
$programs = $this->app->user->view->programs;
|
||||
$projects = $this->app->user->view->projects;
|
||||
$executions = $this->app->user->view->sprints;
|
||||
|
||||
$objectPairs = array();
|
||||
$total = count($results);
|
||||
@@ -1014,6 +1015,7 @@ class searchModel extends model
|
||||
foreach($objectIdList as $productID => $recordID)
|
||||
{
|
||||
if(strpos(",$products,", ",$productID,") === false) unset($results[$recordID]);
|
||||
if(in_array($productID, $shadowProducts)) unset($results[$recordID]);
|
||||
}
|
||||
}
|
||||
elseif($objectType == 'program')
|
||||
|
||||
@@ -396,6 +396,7 @@ class story extends control
|
||||
|
||||
/* Hidden some fields of projects without products. */
|
||||
$this->view->hiddenProduct = false;
|
||||
$this->view->hiddenParent = false;
|
||||
$this->view->hiddenPlan = false;
|
||||
$this->view->hiddenURS = false;
|
||||
$this->view->teamUsers = array();
|
||||
@@ -409,6 +410,7 @@ class story extends control
|
||||
{
|
||||
$this->view->teamUsers = $this->project->getTeamMemberPairs($project->id);
|
||||
$this->view->hiddenProduct = true;
|
||||
$this->view->hiddenParent = true;
|
||||
|
||||
if($project->model !== 'scrum') $this->view->hiddenPlan = true;
|
||||
if(!$project->multiple) $this->view->hiddenPlan = true;
|
||||
@@ -883,6 +885,7 @@ class story extends control
|
||||
|
||||
/* Hidden some fields of projects without products. */
|
||||
$this->view->hiddenProduct = false;
|
||||
$this->view->hiddenParent = false;
|
||||
$this->view->hiddenPlan = false;
|
||||
$this->view->hiddenURS = false;
|
||||
$this->view->teamUsers = array();
|
||||
@@ -892,6 +895,7 @@ class story extends control
|
||||
$project = $this->project->getByShadowProduct($product->id);
|
||||
$this->view->teamUsers = $this->project->getTeamMemberPairs($project->id);
|
||||
$this->view->hiddenProduct = true;
|
||||
$this->view->hiddenParent = true;
|
||||
|
||||
if($project->model !== 'scrum') $this->view->hiddenPlan = true;
|
||||
if(!$project->multiple) $this->view->hiddenPlan = true;
|
||||
@@ -1085,7 +1089,7 @@ class story extends control
|
||||
}
|
||||
|
||||
/* Set ditto option for users. */
|
||||
$users = $this->loadModel('user')->getPairs('nodeleted');
|
||||
$users = $this->loadModel('user')->getPairs('nodeleted|noclosed');
|
||||
$users = array('' => '', 'ditto' => $this->lang->story->ditto) + $users;
|
||||
|
||||
/* Set Custom*/
|
||||
@@ -2777,7 +2781,7 @@ class story extends control
|
||||
$this->config->story->datatable->fieldList['plan']['dataSource'] = array('module' => 'productplan', 'method' => 'getPairs', 'params' => $productIdList);
|
||||
}
|
||||
|
||||
$this->post->set('rows', $this->story->getExportStorys($executionID, $orderBy));
|
||||
$this->post->set('rows', $this->story->getExportStorys($executionID, $orderBy, $storyType));
|
||||
$this->fetch('transfer', 'export', 'model=story');
|
||||
}
|
||||
|
||||
@@ -2816,7 +2820,7 @@ class story extends control
|
||||
if(isset($project->hasProduct) && !$project->hasProduct)
|
||||
{
|
||||
$filterFields = array('product,', 'branch,');
|
||||
if($project->model != 'scrum') $filterFields[] = 'plan';
|
||||
if($project->model != 'scrum') $filterFields[] = 'plan,';
|
||||
$this->config->story->exportFields = str_replace($filterFields, '', $this->config->story->exportFields);
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ $(function()
|
||||
|
||||
$('#saveButton').on('click', function()
|
||||
{
|
||||
$('#saveButton').attr('disabled', true);
|
||||
$('#saveButton').attr('type', 'submit').attr('disabled', true);
|
||||
$('#saveDraftButton').attr('disabled', true);
|
||||
|
||||
var storyStatus = !$('#reviewer').val() || $('#needNotReview').is(':checked') ? 'active' : 'reviewing';
|
||||
@@ -31,7 +31,7 @@ $(function()
|
||||
|
||||
setTimeout(function()
|
||||
{
|
||||
$('#saveButton').removeAttr('disabled');
|
||||
$('#saveButton').attr('type', 'button').removeAttr('disabled');
|
||||
$('#saveDraftButton').removeAttr('disabled');
|
||||
}, 1000);
|
||||
});
|
||||
@@ -39,7 +39,7 @@ $(function()
|
||||
$('#saveDraftButton').on('click', function()
|
||||
{
|
||||
$('#saveButton').attr('disabled', true);
|
||||
$('#saveDraftButton').attr('disabled', true);
|
||||
$('#saveDraftButton').attr('type', 'submit').attr('disabled', true);
|
||||
|
||||
storyStatus = 'draft';
|
||||
if(typeof(page) != 'undefined' && page == 'change') storyStatus = 'changing';
|
||||
@@ -50,7 +50,7 @@ $(function()
|
||||
setTimeout(function()
|
||||
{
|
||||
$('#saveButton').removeAttr('disabled');
|
||||
$('#saveDraftButton').removeAttr('disabled');
|
||||
$('#saveDraftButton').attr('type', 'button').removeAttr('disabled');
|
||||
}, 1000);
|
||||
});
|
||||
})
|
||||
|
||||
@@ -4218,7 +4218,7 @@ class storyModel extends model
|
||||
if($action == 'batchcreate' and $story->parent > 0) return false;
|
||||
if($action == 'batchcreate' and $story->type == 'requirement' and $story->status != 'closed') return strpos('draft,reviewing,changing', $story->status) === false;
|
||||
if($action == 'batchcreate' and $config->vision == 'lite' and ($story->status == 'active' and ($story->stage == 'wait' or $story->stage == 'projected'))) return true;
|
||||
/* Adjust code, hide split entry, fix bug #29432. */
|
||||
/* Adjust code, hide split entry. */
|
||||
if($action == 'batchcreate' and ($story->status != 'active' or (isset($shadowProducts[$story->product])) or (!isset($shadowProducts[$story->product]) && $story->stage != 'wait') or !empty($story->plan))) return false;
|
||||
|
||||
return true;
|
||||
@@ -4489,7 +4489,7 @@ class storyModel extends model
|
||||
|
||||
$executionID = empty($execution) ? 0 : $execution->id;
|
||||
|
||||
/* Adjust code, hide split entry, fix bug #29432. */
|
||||
/* Adjust code, hide split entry. */
|
||||
if(common::hasPriv('story', 'batchCreate') and !$execution->multiple and !$execution->hasProduct and false)
|
||||
{
|
||||
$isClick = $this->isClickable($story, 'batchcreate');
|
||||
@@ -5878,13 +5878,16 @@ class storyModel extends model
|
||||
*
|
||||
* @param int $executionID
|
||||
* @param string $orderBy
|
||||
* @param string $storyType
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getExportStorys($executionID, $orderBy = 'id_desc')
|
||||
public function getExportStorys($executionID, $orderBy = 'id_desc', $storyType = 'story')
|
||||
{
|
||||
$this->loadModel('file');
|
||||
$this->loadModel('branch');
|
||||
|
||||
$this->replaceURLang($storyType);
|
||||
$storyLang = $this->lang->story;
|
||||
$storyConfig = $this->config->story;
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@ foreach(explode(',', $config->story->create->requiredFields) as $field)
|
||||
<tr>
|
||||
<th><?php echo $hiddenURS ? $lang->story->parent : $lang->story->requirement;?></th>
|
||||
<td colspan="2" class="<?php if($hiddenURS) echo 'hidden';?>"><?php echo html::select('URS[]', $URS, '', "class='form-control chosen' multiple");?></td>
|
||||
<td colspan="2">
|
||||
<td colspan="2" <?php if($hiddenParent) echo 'hidden';?>>
|
||||
<div class='input-group' id='moduleIdBox'>
|
||||
<?php if(!$hiddenURS):?>
|
||||
<div class="input-group-addon"><?php echo $lang->story->parent;?></div>
|
||||
@@ -171,7 +171,7 @@ foreach(explode(',', $config->story->create->requiredFields) as $field)
|
||||
</td>
|
||||
</tr>
|
||||
<?php else:?>
|
||||
<tr>
|
||||
<tr <?php if($hiddenParent) echo 'hidden';?>>
|
||||
<th><?php echo $lang->story->parent;?></th>
|
||||
<td colspan="4"><?php echo html::select('parent', $stories, '', "class='form-control chosen'");?></td>
|
||||
</tr>
|
||||
@@ -297,8 +297,12 @@ foreach(explode(',', $config->story->create->requiredFields) as $field)
|
||||
<tr>
|
||||
<td colspan="5" class="text-center form-actions">
|
||||
<?php echo html::hidden('type', $type);?>
|
||||
<?php if(defined('TUTORIAL')):?>
|
||||
<?php echo html::submitButton();?>
|
||||
<?php else:?>
|
||||
<?php echo html::commonButton($lang->save, "id='saveButton'", 'btn btn-primary btn-wide');?>
|
||||
<?php echo html::commonButton($lang->story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');?>
|
||||
<?php endif;?>
|
||||
<?php echo $gobackLink ? html::a($gobackLink, $lang->goback, '', 'class="btn btn-wide"') : html::backButton('', $source == 'bug' ? 'data-app=qa' : '');?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -166,7 +166,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<?php if($story->parent >= 0 and $story->type == 'story'):?>
|
||||
<tr>
|
||||
<tr class="<?php if($hiddenParent) echo 'hidden';?>">
|
||||
<th><?php echo $lang->story->parent;?></th>
|
||||
<td><?php echo html::select('parent', $stories, $story->parent, "class='form-control chosen'");?></td>
|
||||
</tr>
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
<?php
|
||||
$otherParam = 'storyID=&projectID=';
|
||||
$tab = 'product';
|
||||
if($this->app->rawModule == 'projectstory')
|
||||
if($this->app->rawModule == 'projectstory' or $this->app->tab == 'project')
|
||||
{
|
||||
$otherParam = "storyID=&projectID={$this->session->project}";
|
||||
$tab = 'project';
|
||||
|
||||
@@ -343,7 +343,7 @@ function setStories(moduleID, executionID)
|
||||
$("#story").addClass('filled').chosen();
|
||||
|
||||
/* If there is no story option, select will be hidden and text will be displayed; otherwise, the opposite is true */
|
||||
if($('#story option').length > 1)
|
||||
if($('#story option').length > 1 || parseInt(hasProduct) == 0)
|
||||
{
|
||||
$('#story').parent().removeClass('hidden');
|
||||
$('#storyBox').addClass('hidden');
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
<?php js::set('estimateNotEmpty', sprintf($lang->error->gt, $lang->task->estimate, '0'))?>
|
||||
<?php js::set('lifetime', $execution->lifetime);?>
|
||||
<?php js::set('lifetimeList', $lifetimeList);?>
|
||||
<?php js::set('hasProduct', $execution->hasProduct);?>
|
||||
<?php
|
||||
$requiredFields = array();
|
||||
foreach(explode(',', $config->task->create->requiredFields) as $field)
|
||||
|
||||
@@ -348,8 +348,6 @@ class testcase extends control
|
||||
$stories = array_chunk($stories, $pager->recPerPage);
|
||||
|
||||
$this->view->title = $this->lang->story->zeroCase;
|
||||
$this->view->position[] = html::a($this->createLink('testcase', 'browse', "productID=$productID"), $products[$productID]);
|
||||
$this->view->position[] = $this->lang->story->zeroCase;
|
||||
|
||||
$this->view->stories = empty($stories) ? $stories : $stories[$pageID - 1];
|
||||
$this->view->users = $this->user->getPairs('noletter');
|
||||
|
||||
@@ -159,14 +159,14 @@ class transfer extends control
|
||||
|
||||
if($model == 'story')
|
||||
{
|
||||
$product = $this->loadModel('product')->getByID($this->session->storyPortParams['productID']);
|
||||
$product = $this->loadModel('product')->getByID($this->session->storyTransferParams['productID']);
|
||||
if($product->type == 'normal') unset($fields['branch']);
|
||||
if($this->session->storyType == 'requirement') unset($fields['plan']);
|
||||
}
|
||||
|
||||
if($model == 'bug')
|
||||
{
|
||||
$product = $this->loadModel('product')->getByID($this->session->bugPortParams['productID']);
|
||||
$product = $this->loadModel('product')->getByID($this->session->bugTransferParams['productID']);
|
||||
if($product->type == 'normal') unset($fields['branch']);
|
||||
if($product->shadow and ($this->app->tab == 'execution' or $this->app->tab == 'project')) unset($fields['product']);
|
||||
}
|
||||
|
||||
@@ -56,16 +56,16 @@ class transferModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* Check tmpFile.
|
||||
* Check tmp file.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function checkTmpFile()
|
||||
{
|
||||
$file = $this->session->fileImportFileName;
|
||||
$tmpPath = $this->loadModel('file')->getPathOfImportedFile();
|
||||
$tmpFile = $tmpPath . DS . md5(basename($file));
|
||||
$file = $this->session->fileImportFileName;
|
||||
$tmpPath = $this->loadModel('file')->getPathOfImportedFile();
|
||||
$tmpFile = $tmpPath . DS . md5(basename($file));
|
||||
|
||||
if($this->maxImport and file_exists($tmpFile)) return $tmpFile;
|
||||
return false;
|
||||
@@ -196,7 +196,7 @@ class transferModel extends model
|
||||
$rows = $this->getRows($model, $fieldList);
|
||||
if($model == 'story')
|
||||
{
|
||||
$product = $this->loadModel('product')->getByID((int)$this->session->storyPortParams['productID']);
|
||||
$product = $this->loadModel('product')->getByID((int)$this->session->storyTransferParams['productID']);
|
||||
if($product and $product->shadow)
|
||||
{
|
||||
foreach($rows as $id => $row)
|
||||
|
||||
@@ -400,15 +400,16 @@ class tree extends control
|
||||
$this->view->branch = $branch;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noclosed|nodeleted', $module->owner);
|
||||
|
||||
$showProduct = strpos('story|bug|case', $type) !== false ? true : false;
|
||||
$this->view->showProduct = $showProduct;
|
||||
$showProduct = strpos('story|bug|case', $type) !== false ? true : false;
|
||||
if($showProduct)
|
||||
{
|
||||
$product = $this->loadModel('product')->getById($module->root);
|
||||
if($product->type != 'normal') $this->view->branches = $this->loadModel('branch')->getPairs($module->root, 'withClosed');
|
||||
$this->view->product = $product;
|
||||
$this->view->products = $this->product->getPairs('', $product->program);
|
||||
if($product->shadow) $showProduct = false;
|
||||
}
|
||||
$this->view->showProduct = $showProduct;
|
||||
|
||||
/* Remove self and childs from the $optionMenu. Because it's parent can't be self or childs. */
|
||||
$childs = $this->tree->getAllChildId($moduleID);
|
||||
|
||||
@@ -852,7 +852,7 @@ class treeModel extends model
|
||||
{
|
||||
$extra['productID'] = $id;
|
||||
$projectProductLink = helper::createLink('projectstory', 'story', "projectID=$rootID&productID=$id&branch=all");
|
||||
$executionProductLink = helper::createLink('execution', 'story', "executionID=$rootID&ordery=&status=byProduct&praram=$id");
|
||||
$executionProductLink = helper::createLink('execution', 'story', "executionID=$rootID&storyType=story&orderBy=&type=byProduct&praram=$id");
|
||||
$link = $this->app->rawModule == 'projectstory' ? $projectProductLink : $executionProductLink;
|
||||
if($productNum > 1) $menu .= "<li>" . html::a($link, $product, '_self', "id='product$id' title=$product");
|
||||
|
||||
|
||||
@@ -74,3 +74,6 @@ $lang->tutorial->tasks['createTask']['desc'] = "<p>Aufgaben aufteilen: </p><ul><
|
||||
$lang->tutorial->tasks['createBug'] = array('title' => 'Bug melden');
|
||||
$lang->tutorial->tasks['createBug']['nav'] = array('module' => 'bug', 'method' => 'create', 'menuModule' => 'qa', 'menu' => 'bug', 'target' => '.btn-bug-create', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => 'Bug erstellen');
|
||||
$lang->tutorial->tasks['createBug']['desc'] = "<p>Bug erstellen: </p><ul><li data-target='nav'>Öffnen <span class='task-nav'> Test <i class='icon icon-angle-right'></i> Bug <i class='icon icon-angle-right'></i> Einen Bug erstellen</span>;</li><li data-target='form'>Tragen Sie die Bug Informationen ein:</li><li data-target='submit'>Speichern</li></ul>";
|
||||
|
||||
global $config;
|
||||
if($config->systemMode == 'light') unset($lang->tutorial->tasks['createProgram']);
|
||||
|
||||
@@ -74,3 +74,6 @@ $lang->tutorial->tasks['createTask']['desc'] = "<p>Task breakdown for a story: <
|
||||
$lang->tutorial->tasks['createBug'] = array('title' => 'Report Bug');
|
||||
$lang->tutorial->tasks['createBug']['nav'] = array('app' => 'qa', 'module' => 'bug', 'method' => 'create', 'menuModule' => 'bug', 'menu' => 'bug', 'target' => '.create-bug-btn', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => 'Report Bug');
|
||||
$lang->tutorial->tasks['createBug']['desc'] = "<p>Report a Bug: </p><ul><li data-target='nav'>Open <span class='task-nav'> Test <i class='icon icon-angle-right'></i> Bug <i class='icon icon-angle-right'></i> Report Bug</span>;</li><li data-target='form'>Fill the form with bug information:</li><li data-target='submit'>Save</li></ul>";
|
||||
|
||||
global $config;
|
||||
if($config->systemMode == 'light') unset($lang->tutorial->tasks['createProgram']);
|
||||
|
||||
@@ -74,3 +74,6 @@ $lang->tutorial->tasks['createTask']['desc'] = "<p>Task breakdown for a story: <
|
||||
$lang->tutorial->tasks['createBug'] = array('title' => 'Report Bug');
|
||||
$lang->tutorial->tasks['createBug']['nav'] = array('module' => 'bug', 'method' => 'create', 'menuModule' => 'qa', 'menu' => 'bug', 'target' => '.btn-bug-create', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => 'Report Bug');
|
||||
$lang->tutorial->tasks['createBug']['desc'] = "<p>Report a Bug: </p><ul><li data-target='nav'>Open <span class='task-nav'> Test <i class='icon icon-angle-right'></i> Bug <i class='icon icon-angle-right'></i> Report Bug</span>;</li><li data-target='form'>Fill the form with bug information:</li><li data-target='submit'>Save</li></ul>";
|
||||
|
||||
global $config;
|
||||
if($config->systemMode == 'light') unset($lang->tutorial->tasks['createProgram']);
|
||||
|
||||
@@ -74,3 +74,6 @@ $lang->tutorial->tasks['createTask']['desc'] = "<p>将执行{$lang->SRCommon}分
|
||||
$lang->tutorial->tasks['createBug'] = array('title' => '提Bug');
|
||||
$lang->tutorial->tasks['createBug']['nav'] = array('app' => 'qa', 'module' => 'bug', 'method' => 'create', 'menuModule' => 'bug', 'menu' => 'bug', 'target' => '.create-bug-btn', 'vars' => 'productID=0', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => '提Bug');
|
||||
$lang->tutorial->tasks['createBug']['desc'] = "<p>在系统中提交一个Bug:</p><ul><li data-target='nav'>打开 <span class='task-nav'> 测试 <i class='icon icon-angle-right'></i> Bug <i class='icon icon-angle-right'></i> 提Bug</span>;</li><li data-target='form'>在表单中填写Bug信息;</li><li data-target='submit'>保存Bug信息。</li></ul>";
|
||||
|
||||
global $config;
|
||||
if($config->systemMode == 'light') unset($lang->tutorial->tasks['createProgram']);
|
||||
|
||||
Reference in New Issue
Block a user