This commit is contained in:
tianshujie
2022-11-15 17:07:27 +08:00
88 changed files with 717 additions and 382 deletions
+1 -1
View File
@@ -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
View File
@@ -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 = '';
+1 -1
View File
@@ -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>
+2 -1
View File
@@ -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>
+1 -1
View File
@@ -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);
+1
View File
@@ -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.';
+1
View File
@@ -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';
+1
View File
@@ -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';
+1
View File
@@ -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';
+1
View File
@@ -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';
+30
View File
@@ -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.
*
+2 -1
View File
@@ -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>
+7 -1
View File
@@ -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>
+2 -2
View File
@@ -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>
+3 -2
View File
@@ -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'))
+24 -6
View File
@@ -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;
+1
View File
@@ -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';
+1
View File
@@ -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';
+1
View File
@@ -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é';
+1
View File
@@ -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';
+1
View File
@@ -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 = '已结束';
-2
View File
@@ -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>
+1 -1
View File
@@ -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);
+2 -1
View File
@@ -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>
+9 -3
View File
@@ -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&param=$param&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}";
$vars = "executionID={$execution->id}&storyType=$storyType&orderBy=%s&type=$type&param=$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>
+21 -5
View File
@@ -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:?>
+2 -2
View File
@@ -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);
-18
View File
@@ -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.
*
+1 -1
View File
@@ -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);
+2
View File
@@ -0,0 +1,2 @@
#releaseList > tbody > tr:hover{background-color: unset!important;}
#product_chosen {width: 45% !important}
+20 -12
View File
@@ -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';?>
+2
View File
@@ -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);
+4 -4
View File
@@ -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' => '');
+4 -4
View File
@@ -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' => '');
+3 -3
View File
@@ -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';
+1 -1
View File
@@ -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';
+1
View File
@@ -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';
+1 -1
View File
@@ -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;
+5 -3
View File
@@ -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'>
+9 -6
View File
@@ -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');
+1 -3
View File
@@ -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;
+3 -1
View File
@@ -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()
+2 -2
View File
@@ -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
View File
@@ -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.
*
+2 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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}
+5 -4
View File
@@ -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";
+5 -4
View File
@@ -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";
+5 -4
View File
@@ -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
View File
@@ -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}";
+5 -4
View File
@@ -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";
+15 -3
View File
@@ -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);
}
+4 -1
View File
@@ -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'):?>
+2
View File
@@ -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> &nbsp;", '', "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> &nbsp;", '', "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'");?>
+37 -4
View File
@@ -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>
+2 -6
View File
@@ -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;
+22 -2
View File
@@ -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;
}
/**
+6 -6
View File
@@ -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>
+1 -1
View File
@@ -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>
+2 -2
View File
@@ -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
View File
@@ -464,7 +464,6 @@ class release extends control
$this->session->set('storyList', inlink('view', "releaseID=$releaseID&type=story&link=true&param=" . 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&param=" . 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&param=" . 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&param=" . 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
View File
@@ -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}
+2
View File
@@ -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';
+2
View File
@@ -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';
+2
View File
@@ -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';
+2
View File
@@ -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 = '发布日期';
+2 -2
View File
@@ -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')
+3 -3
View File
@@ -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):?>
+1 -1
View File
@@ -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++;
}
?>
+6 -4
View File
@@ -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')
+7 -3
View File
@@ -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);
}
+4 -4
View File
@@ -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);
});
})
+6 -3
View File
@@ -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;
+6 -2
View File
@@ -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>
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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';
+1 -1
View File
@@ -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');
+1
View File
@@ -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)
-2
View File
@@ -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');
+2 -2
View File
@@ -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']);
}
+5 -5
View File
@@ -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)
+3 -2
View File
@@ -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);
+1 -1
View File
@@ -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");
+3
View File
@@ -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']);
+3
View File
@@ -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']);
+3
View File
@@ -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']);
+3
View File
@@ -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']);