* Finish task #75237.

This commit is contained in:
wangyuting
2022-11-10 07:36:35 +00:00
parent 3beb994fe8
commit 59fe4826ca
22 changed files with 396 additions and 201 deletions
+2
View File
@@ -37,3 +37,5 @@ REPLACE INTO `zt_report` (`code`, `name`, `module`, `sql`, `vars`, `langs`, `par
('projectbug-type', '{\"zh-cn\":\"\\u9879\\u76eeBug\\u7c7b\\u578b\\u7edf\\u8ba1\\u8868\",\"zh-tw\":\"\\u9805\\u76eeBug\\u985e\\u578b\\u7d71\\u8a08\\u8868\",\"en\":\"Project Bug Type\",\"de\":\"Project Bug Type\",\"fr\":\"Project Bug Type\",\"vi\":\"Project Bug Type\",\"ja\":\"Project Bug Type\"}', ',project,test', 'select t1.id,t3.name as project,t3.id,IF(t3.multiple="1",t1.name,"") as execution,t2.id as bugID,t2.type from TABLE_EXECUTION as t1 \r\nleft join TABLE_BUG as t2 on t1.id=t2.execution\r\nleft join TABLE_PROJECT as t3 on t3.id=t1.project\r\nwhere t1.deleted=\'0\' and t2.deleted=\'0\' and if($project=\'\',1,t3.id=$project) and if($execution=\'\',1,t1.id=$execution)', '{\"varName\":[\"project\",\"execution\"],\"showName\":[\"\\u9879\\u76ee\\u5217\\u8868\",\"\\u6267\\u884c\\u5217\\u8868\"],\"requestType\":[\"select\",\"select\"],\"selectList\":[\"project\",\"execution\"],\"default\":[\"\",\"\"]}', '{\"stories\":{\"zh-cn\":\"\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u9700\\u6c42\\u6570\",\"en\":\"Stories\"},\"tasks\":{\"zh-cn\":\"\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u4efb\\u52a1\\u6570\",\"en\":\"Tasks\"},\"undoneStory\":{\"zh-cn\":\"\\u5269\\u4f59\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u5269\\u4f59\\u9700\\u6c42\\u6570\",\"en\":\"Undone Story\"},\"undoneTask\":{\"zh-cn\":\"\\u5269\\u4f59\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u5269\\u4f59\\u4efb\\u52a1\\u6570\",\"en\":\"Undone Task\"},\"consumed\":{\"zh-cn\":\"\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\",\"zh-tw\":\"\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\",\"en\":\"Cost(h)\"},\"left\":{\"zh-cn\":\"\\u5269\\u4f59\\u5de5\\u65f6\",\"zh-tw\":\"\\u5269\\u4f59\\u5de5\\u65f6\",\"en\":\"Left(h)\"},\"consumedPercent\":{\"zh-cn\":\"\\u8fdb\\u5ea6\",\"zh-tw\":\"\\u8fdb\\u5ea6\",\"en\":\"Process\"},\"execution\":{\"zh-cn\":\"\\u6267\\u884c\\u540d\\u79f0\"}}', '{\"group1\":\"project\",\"group2\":\"execution\",\"reportField\":[\"type\"],\"reportType\":[\"count\"],\"sumAppend\":[\"\"]}', 2, '{\"zh-cn\":\"\\u6309\\u7167\\u9879\\u76ee\\u7edf\\u8ba1Bug\\u7684\\u7c7b\\u578b\\u5206\\u5e03\\u60c5\\u51b5\\u3002\",\"zh-tw\":\"\\u6309\\u7167\\u9805\\u76ee\\u7d71\\u8a08Bug\\u7684\\u985e\\u578b\\u5206\\u5e03\\u60c5\\u6cc1\\u3002\",\"en\":\"\",\"de\":\"\",\"fr\":\"\",\"vi\":\"\",\"ja\":\"\"}', 'admin', '2015-08-04 13:54:22');
ALTER TABLE `zt_project` ADD `division` enum('0','1') COLLATE 'utf8_general_ci' NOT NULL DEFAULT '1';
ALTER TABLE `zt_build` ADD `builds` varchar(255) NOT NULL AFTER `execution`;
+1
View File
@@ -323,6 +323,7 @@ CREATE TABLE IF NOT EXISTS `zt_build` (
`product` mediumint(8) unsigned NOT NULL default '0',
`branch` mediumint(8) unsigned NOT NULL default '0',
`execution` mediumint(8) unsigned NOT NULL default '0',
`builds` varchar(255) NOT NULL,
`name` char(150) NOT NULL,
`scmPath` char(255) NOT NULL,
`filePath` char(255) NOT NULL,
+2 -2
View File
@@ -2,8 +2,8 @@
$config->build = new stdclass();
$config->build->create = new stdclass();
$config->build->edit = new stdclass();
$config->build->create->requiredFields = 'product,execution,name,builder,date';
$config->build->edit->requiredFields = 'product,execution,name,builder,date';
$config->build->create->requiredFields = 'product,name,builder,date';
$config->build->edit->requiredFields = 'product,name,builder,date';
$config->build->editor = new stdclass();
$config->build->editor->create = array('id' => 'desc', 'tools' => 'simpleTools');
+75 -73
View File
@@ -49,13 +49,12 @@ class build extends control
if(!empty($_POST))
{
$executionID = empty($executionID) ? $this->post->execution : $executionID;
if(empty($executionID)) dao::$errors['execution'] = $this->lang->build->emptyExecution;
if(empty($executionID) && $this->app->tab == 'execution') dao::$errors['execution'] = $this->lang->build->emptyExecution;
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
if(defined('TUTORIAL')) return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true)); // Fix bug #21095.
$buildID = $this->build->create($executionID);
$buildID = $this->build->create($executionID, $projectID);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
$this->loadModel('action')->create('build', $buildID, 'opened');
@@ -67,40 +66,36 @@ class build extends control
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('build', 'view', "buildID=$buildID") . "#app={$this->app->tab}"));
}
$this->loadModel('product');
$this->loadModel('project');
/* Set menu. */
$executions = array();
if($this->app->tab == 'project')
{
$this->loadModel('project')->setMenu($projectID);
$executions = $this->execution->getPairs($projectID, 'all', 'stagefilter');
$executionID = empty($executionID) ? key($executions) : $executionID;
$this->project->setMenu($projectID);
$productGroups = $this->product->getProducts($projectID);
$branchGroups = $this->project->getBranchesByProject($projectID);
$this->session->set('project', $projectID);
}
elseif($this->app->tab == 'execution')
{
$execution = $this->execution->getByID($executionID);
$executions = $this->execution->getPairs($execution->project);
$projectID = $execution->project;
$execution = $this->execution->getByID($executionID);
$projectID = $execution->project;
$productGroups = $this->product->getProducts($executionID);
$branchGroups = $this->project->getBranchesByProject($executionID);
$this->execution->setMenu($executionID);
$this->session->set('project', $execution->project);
}
elseif($this->app->tab == 'qa')
{
$execution = $this->execution->getByID($executionID);
$projectID = $execution ? $execution->project : 0;
$executions = $this->execution->getPairs($projectID);
$execution = $this->execution->getByID($executionID);
$projectID = $execution ? $execution->project : 0;
$productGroups = $this->product->getProducts($executionID);
$branchGroups = $this->project->getBranchesByProject($executionID);
}
$this->commonActions($projectID);
$executionList = empty($executions) ? array() : $this->execution->getByIdList(array_keys($executions));
foreach($executionList as $execution)
{
if($execution->lifetime == 'ops') unset($executions[$execution->id]);
}
$productGroups = $this->loadModel('product')->getProducts($executionID);
$productID = $productID ? $productID : key($productGroups);
$branchGroups = $this->loadModel('project')->getBranchesByProject($executionID);
$branchPairs = $this->loadModel('branch')->getPairs($productID, 'active');
$branches = array();
$products = array();
@@ -124,7 +119,6 @@ class build extends control
$this->view->executionID = $executionID;
$this->view->products = $products;
$this->view->projectID = $projectID;
$this->view->executions = $executions;
$this->view->lastBuild = $this->build->getLast($executionID);
$this->view->productGroups = $productGroups;
$this->view->users = $this->user->getPairs('nodeleted|noclosed');
@@ -157,7 +151,7 @@ class build extends control
$message = $this->executeHooks($buildID);
if($message) $this->lang->saveSuccess = $message;
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('view', "buildID=$buildID")));
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('build', 'view', "buildID=$buildID") . "#app={$this->app->tab}"));
}
$this->loadModel('execution');
@@ -165,30 +159,24 @@ class build extends control
$build = $this->build->getById((int)$buildID);
/* Set menu. */
if($this->app->tab == 'project')
{
$this->loadModel('project')->setMenu($build->project);
}
elseif($this->app->tab == 'execution')
{
$this->execution->setMenu($build->execution);
}
if($this->app->tab == 'project') $this->loadModel('project')->setMenu($build->project);
if($this->app->tab == 'execution') $this->execution->setMenu($build->execution);
/* Get stories and bugs. */
$orderBy = 'status_asc, stage_asc, id_desc';
/* Assign. */
$execution = $this->execution->getByID($build->execution);
if(empty($execution))
if($build->execution)
{
$execution = new stdclass();
$execution->name = '';
$productGroups = $this->product->getProducts($build->execution);
$branches = $this->loadModel('branch')->getList($build->product, $build->execution, 'all');
}
else
{
$productGroups = $this->product->getProducts($build->project);
$branches = $this->loadModel('branch')->getList($build->product, $build->project, 'all');
}
$executions = $this->product->getExecutionPairsByProduct($build->product, $build->branch, 'id_desc', $this->session->project, 'stagefilter');
if(!isset($executions[$build->execution])) $executions[$build->execution] = $execution->name;
$productGroups = $this->product->getProducts($build->execution);
/* Get stories and bugs. */
$orderBy = 'status_asc, stage_asc, id_desc';
if(!isset($productGroups[$build->product]))
{
@@ -198,7 +186,6 @@ class build extends control
}
/* Display status of branch. */
$branches = $this->loadModel('branch')->getList($build->product, $build->execution, 'all');
$branchTagOption = array();
foreach($branches as $branchInfo)
{
@@ -210,19 +197,17 @@ class build extends control
$this->commonActions($build->project);
$this->view->title = $execution->name . $this->lang->colon . $this->lang->build->edit;
$this->view->position[] = html::a($this->createLink('execution', 'task', "executionID=$build->execution"), $execution->name);
$this->view->title = $build->name . $this->lang->colon . $this->lang->build->edit;
$this->view->position[] = $this->lang->build->edit;
$this->view->product = isset($productGroups[$build->product]) ? $productGroups[$build->product] : '';
$this->view->branchTagOption = $branchTagOption;
$this->view->executions = $executions;
$this->view->orderBy = $orderBy;
$this->view->productGroups = $productGroups;
$this->view->products = $products;
$this->view->users = $this->loadModel('user')->getPairs('noletter', $build->builder);
$this->view->build = $build;
$this->view->testtaskID = $this->dao->select('id')->from(TABLE_TESTTASK)->where('build')->eq($build->id)->andWhere('deleted')->eq(0)->fetch('id');
$this->view->executions = $executions;
$this->view->productGroups = $productGroups;
$this->view->products = $products;
$this->view->users = $this->loadModel('user')->getPairs('noletter', $build->builder);
$this->view->build = $build;
$this->view->testtaskID = $this->dao->select('id')->from(TABLE_TESTTASK)->where('build')->eq($build->id)->andWhere('deleted')->eq(0)->fetch('id');
$this->display();
}
@@ -310,23 +295,24 @@ class build extends control
$this->executeHooks($buildID);
$objectType = 'execution';
$objectID = $build->execution;
if($build->project and $this->app->tab == 'project')
if($this->app->tab == 'execution')
{
$project = $this->project->getByID($build->project);
if(!$project->multiple)
{
$objectType = 'project';
$objectID = $build->project;
}
$objectType = 'execution';
$objectID = $build->execution;
}
else
{
$objectType = 'project';
$objectID = $build->project;
}
/* Assign. */
$this->view->canBeChanged = common::canBeChanged('build', $build); // Determines whether an object is editable.
$this->view->users = $this->loadModel('user')->getPairs('noletter');
$this->view->build = $build;
$this->view->buildPairs = $this->build->getBuildPairs(0, 'all', 'noempty,notrunk', $objectID, $objectType);
$this->view->builds = $this->build->getByList(array_keys($this->view->buildPairs));
$this->view->actions = $this->loadModel('action')->getList('build', $buildID);
$this->view->link = $link;
$this->view->param = $param;
@@ -399,10 +385,11 @@ class build extends control
* @param string|int $branch
* @param int $index the index of batch create bug.
* @param string $type get all builds or some builds belong to normal releases and executions are not done.
* @param string $extra
* @access public
* @return string
*/
public function ajaxGetProductBuilds($productID, $varName, $build = '', $branch = 'all', $index = 0, $type = 'normal')
public function ajaxGetProductBuilds($productID, $varName, $build = '', $branch = 'all', $index = 0, $type = 'normal', $extra = '')
{
$isJsonView = $this->app->getViewType() == 'json';
if($varName == 'openedBuild' )
@@ -425,6 +412,11 @@ class build extends control
if($isJsonView) return print(json_encode($builds));
return print(html::select($varName, $builds, $build, "class='form-control'"));
}
$builds = $this->build->getBuildPairs($productID, $branch, $type);
if($isJsonView) return print(json_encode($builds));
if(strpos($extra, 'multiple') !== false) $varName .= '[]';
return print(html::select($varName, $builds, $build, "class='form-control chosen' $extra"));
}
/**
@@ -563,14 +555,11 @@ class build extends control
$build = $this->build->getById($buildID);
$product = $this->loadModel('product')->getById($build->product);
$this->loadModel('execution')->setMenu($build->execution);
if($build->execution) $this->loadModel('execution')->setMenu($build->execution);
$this->loadModel('story');
$this->loadModel('tree');
$this->loadModel('product');
$execution = $this->execution->getByID($build->execution);
if(empty($execution->hasProduct) and empty($execution->multiple)) unset($this->config->product->search['fields']['plan']);
/* Load pager. */
$this->app->loadClass('pager', $static = true);
$pager = new pager($recTotal, $recPerPage, $pageID);
@@ -589,7 +578,14 @@ class build extends control
if($build->project)
{
$project = $this->loadModel('project')->getByID($build->project);
if(!$project->hasProduct and $project->model != 'scrum') unset($this->config->product->search['fields']['plan']);
if(!$project->hasProduct and $project->model != 'scrum')
{
unset($this->config->product->search['fields']['plan']);
}
else if(!$project->hasProduct and !$project->multiple)
{
unset($this->config->product->search['fields']['plan']);
}
}
if($product->type == 'normal')
@@ -608,13 +604,14 @@ class build extends control
}
$this->loadModel('search')->setSearchParams($this->config->product->search);
$executionID = $build->execution ? $build->execution : $build->project;
if($browseType == 'bySearch')
{
$allStories = $this->story->getBySearch($build->product, $build->branch, $queryID, 'id', $build->execution, 'story', $build->stories, $pager);
$allStories = $this->story->getBySearch($build->product, $build->branch, $queryID, 'id', $executionID, 'story', $build->stories, $pager);
}
else
{
$allStories = $this->story->getExecutionStories($build->execution, $build->product, 0, 't1.`order`_desc', 'byBranch', $build->branch, 'story', $build->stories, $pager);
$allStories = $this->story->getExecutionStories($executionID, $build->product, 0, 't1.`order`_desc', 'byBranch', $build->branch, 'story', $build->stories, $pager);
}
$this->view->allStories = $allStories;
@@ -679,7 +676,7 @@ class build extends control
/* Set menu. */
$build = $this->build->getByID($buildID);
$product = $this->loadModel('product')->getByID($build->product);
$this->loadModel('execution')->setMenu($build->execution);
if($build->execution) $this->loadModel('execution')->setMenu($build->execution);
/* Load pager. */
$this->app->loadClass('pager', $static = true);
@@ -698,9 +695,6 @@ class build extends control
$this->config->bug->search['params']['openedBuild']['values'] = $this->build->getBuildPairs($build->product, $branch = 'all', $params = '');
$this->config->bug->search['params']['resolvedBuild']['values'] = $this->config->bug->search['params']['openedBuild']['values'];
$execution = $this->execution->getByID($build->execution);
if(!$execution->hasProduct and !$execution->multiple) unset($this->config->bug->search['fields']['plan']);
unset($this->config->bug->search['fields']['product']);
unset($this->config->bug->search['params']['product']);
unset($this->config->bug->search['fields']['project']);
@@ -709,7 +703,14 @@ class build extends control
if($build->project)
{
$project = $this->loadModel('project')->getByID($build->project);
if(!$project->hasProduct and $project->model != 'scrum') unset($this->config->bug->search['fields']['plan']);
if(!$project->hasProduct and $project->model != 'scrum')
{
unset($this->config->bug->search['fields']['plan']);
}
else if(!$project->hasProduct and !$project->multiple)
{
unset($this->config->bug->search['fields']['plan']);
}
}
if($product->type == 'normal')
@@ -727,13 +728,14 @@ class build extends control
}
$this->loadModel('search')->setSearchParams($this->config->bug->search);
$executionID = $build->execution ? $build->execution : $build->project;
if($browseType == 'bySearch')
{
$allBugs = $this->bug->getBySearch($build->product, $build->branch, $queryID, 'id_desc', $build->bugs, $pager, $build->project);
}
else
{
$allBugs = $this->bug->getExecutionBugs($build->execution, 0, 'all', $buildID, 'noclosed', 0, 'status_desc,id_desc', $build->bugs, $pager);
$allBugs = $this->bug->getExecutionBugs($executionID, 0, 'all', $buildID, 'noclosed', 0, 'status_desc,id_desc', $build->bugs, $pager);
}
$this->view->allBugs = $allBugs;
+4 -2
View File
@@ -15,8 +15,8 @@ function loadBranches(productID)
oldBranch = productGroups[productID]['branches'];
}
executionID = currentTab == 'execution' ? executionID : $('#execution').val();
$.get(createLink('branch', 'ajaxGetBranches', 'productID=' + productID + '&oldBranch=0&param=active&projectID=' + executionID), function(data)
projectID = currentTab == 'execution' ? executionID : projectID;
$.get(createLink('branch', 'ajaxGetBranches', 'productID=' + productID + '&oldBranch=0&param=active&projectID=' + projectID), function(data)
{
if(data)
{
@@ -25,3 +25,5 @@ function loadBranches(productID)
}
});
}
function loadBranch() {return false;}
+9 -31
View File
@@ -5,37 +5,15 @@ $().ready(function()
$('#name').val($(this).text()).focus();
});
});
/**
* Load products.
*
* @param int $executionID
* @access public
* @return void
*/
function loadProducts(executionID)
{
$('#product').remove();
$('#product_chosen').remove();
$('#branch').remove();
$('#branch_chosen').remove();
$('#noProduct').remove();
$.get(createLink('product', 'ajaxGetProducts', 'executionID=' + executionID), function(data)
$(document).on('change', '#product, #branch', function()
{
if(data)
var productID = $('#product').val();
var branch = $('#branch').val();
$.get(createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=builds&build=&branch=' + branch + '&index=&type=noempty,notrunk,separate,noproject&extra=multiple'), function(data)
{
if(data.indexOf("required") != -1)
{
$('#productBox').addClass('required');
}
else
{
$('#productBox').removeClass('required');
}
$('#productBox').append(data);
$('#product').chosen();
loadBranches($("#product").val());
}
if(data) $('#buildBox').html(data);
$('#builds').chosen();
});
});
}
$('#product').change();
});
+26 -10
View File
@@ -1,16 +1,32 @@
var oldExecutionID = $('#execution').val();
function loadExecutions()
$().ready(function()
{
var productID = $('#product').val();
var branchID = $('#branch').length > 0 ? $('#branch').val() : 0;
var oldExecutionID = $('#execution').val();
$(document).on('change', '#product, #branch', function()
{
if(executionID)
{
loadExecutions(oldExecutionID);
}
else
{
var productID = $('#product').val();
var branch = $('#branch').val();
$.get(createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=builds&build=' + builds + '&branch=' + branch + '&index=&type=noempty,notrunk,separate,noproject&extra=multiple'), function(data)
{
if(data) $('#buildBox').html(data);
$('#builds').chosen();
});
}
});
if(!executionID) $('#product').change();
});
function loadExecutions(oldExecutionID)
{
var productID = $('#product').val();
var branchID = $('#branch').length > 0 ? $('#branch').val() : 0;
$('#executionsBox').load(createLink('product', 'ajaxGetExecutions', 'productID=' + productID + '&projectID=0&branch=' + branchID + '&number=&executionID=' + oldExecutionID), function()
{
$('#executionsBox #execution').chosen().removeAttr('onchange');
});
}
$(document).on('change', '#product,#branch', function()
{
loadExecutions();
})
+1 -1
View File
@@ -2,7 +2,7 @@ function showLink(buildID, type, param)
{
var method = type == 'story' ? 'linkStory' : 'linkBug';
if(typeof(param) == 'undefined') param = '&browseType=' + type + '&param=0';
loadURL(createLink('build', method, 'buildID=' + buildID + param), type);
loadURL(createLink(currentModule, method, 'buildID=' + buildID + param), type);
$('.actions').find("a[href*='" + type + "']").addClass('hidden');
}
+21 -15
View File
@@ -225,6 +225,7 @@ class buildModel extends model
->fetchPairs();
}
$branchs = strpos($params, 'separate') === false ? "0,$branch" : $branch;
$allBuilds = $this->dao->select('t1.id, t1.name, t1.deleted, t2.status as objectStatus, t3.id as releaseID, t3.status as releaseStatus, t4.name as branchName, t5.type as productType')->from(TABLE_BUILD)->alias('t1')
->beginIF($objectType === 'execution')->leftJoin(TABLE_EXECUTION)->alias('t2')->on('t1.execution = t2.id')->fi()
->beginIF($objectType === 'project')->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')->fi()
@@ -233,10 +234,11 @@ class buildModel extends model
->leftJoin(TABLE_PRODUCT)->alias('t5')->on('t1.product = t5.id')
->where(1)->eq(1)
->beginIF(strpos($params, 'hasDeleted') === false)->andWhere('t1.deleted')->eq(0)->fi()
->beginIF(strpos($params, 'noproject') !== false)->andWhere('t1.execution')->ne(0)->fi()
->beginIF($products)->andWhere('t1.product')->in($products)->fi()
->beginIF($objectType === 'execution' and $objectID)->andWhere('t1.execution')->eq($objectID)->fi()
->beginIF($objectType === 'project' and $objectID)->andWhere('t1.project')->eq($objectID)->fi()
->beginIF($branch !== 'all')->andWhere('t1.branch')->in("0,$branch")->fi()
->beginIF($branch !== 'all')->andWhere('t1.branch')->in("$branchs")->fi()
->orderBy('t1.date desc, t1.id desc')->fetchAll('id');
/* Set builds and filter done executions and terminate releases. */
@@ -262,7 +264,7 @@ class buildModel extends model
$releases = $this->dao->select('build, name')->from(TABLE_RELEASE)
->where('build')->in(array_keys($builds))
->andWhere('product')->in($products)
->beginIF($branch !== 'all')->andWhere('branch')->in("0,$branch")->fi()
->beginIF($branch !== 'all')->andWhere('branch')->in("$branchs")->fi()
->andWhere('deleted')->eq(0)
->fetchPairs();
foreach($releases as $buildID => $releaseName)
@@ -299,26 +301,27 @@ class buildModel extends model
* Create a build
*
* @param int $executionID
* @param int $projectID
* @access public
* @return void
*/
public function create($executionID)
public function create($executionID = 0, $projectID = 0)
{
$build = new stdclass();
$build->stories = '';
$build->bugs = '';
$execution = $this->loadModel('execution')->getByID($executionID);
$build = fixer::input('post')
->setDefault('project', $execution->project)
->setDefault('project', $projectID)
->setDefault('product', 0)
->setDefault('branch', 0)
->setDefault('builds', '')
->cleanInt('product,branch')
->add('execution', (int)$executionID)
->add('execution', $executionID)
->add('createdBy', $this->app->user->account)
->add('createdDate', helper::now())
->stripTags($this->config->build->editor->create['id'], $this->config->allowedTags)
->join('builds', ',')
->remove('resolvedBy,allchecker,files,labels,uid')
->get();
@@ -355,7 +358,9 @@ class buildModel extends model
->add('id', $buildID)
->setIF(!isset($_POST['branch']), 'branch', $oldBuild->branch)
->setDefault('product', $oldBuild->product)
->setDefault('builds', '')
->cleanInt('product,branch,execution')
->join('builds', ',')
->remove('allchecker,resolvedBy,files,labels,uid')
->get();
@@ -565,21 +570,22 @@ class buildModel extends model
global $app;
$tab = $app->tab;
$module = $build->execution ? 'build' : 'projectbuild';
if($type == 'browse')
{
$executionID = $tab == 'execution' ? $extraParams['executionID'] : $build->execution;
$execution = $this->loadModel('execution')->getByID($executionID);
$testtaskApp = (!empty($execution->type) and $execution->type == 'kanban') ? 'data-app="qa"' : "data-app='{$tab}'";
if(common::hasPriv('build', 'linkstory') and common::canBeChanged('build', $build)) $menu .= $this->buildMenu('build', 'view', "{$params}&type=story&link=true", $build, $type, 'link', '', '', '', "data-app={$tab}", $this->lang->build->linkStory);
if(common::hasPriv($module, 'linkstory') and common::canBeChanged('build', $build)) $menu .= $this->buildMenu($module, 'view', "{$params}&type=story&link=true", $build, $type, 'link', '', '', '', "data-app={$tab}", $this->lang->build->linkStory);
$menu .= $this->buildMenu('testtask', 'create', "product=$build->product&execution={$executionID}&build=$build->id&projectID=$build->project", $build, $type, 'bullhorn', '', '', '', $testtaskApp);
if($tab == 'execution' and !empty($execution->type) and $execution->type != 'kanban') $menu .= $this->buildMenu('execution', 'bug', "execution={$extraParams['executionID']}&productID={$extraParams['productID']}&branchID=all&orderBy=status&build=$build->id", $build, $type, '', '', '', '', $this->lang->execution->viewBug);
if($tab == 'project' or empty($execution->type) or $execution->type == 'kanban') $menu .= $this->buildMenu('build', 'view', "{$params}&type=generatedBug", $build, $type, 'bug', '', '', '', "data-app='$tab'", $this->lang->project->bug);
if($tab == 'project' or empty($execution->type) or $execution->type == 'kanban') $menu .= $this->buildMenu($module, 'view', "{$params}&type=generatedBug", $build, $type, 'bug', '', '', '', "data-app='$tab'", $this->lang->project->bug);
$menu .= $this->buildMenu('build', 'edit', $params, $build, $type);
$menu .= $this->buildMenu('build', 'delete', $params, $build, $type, 'trash', 'hiddenwin');
$menu .= $this->buildMenu($module, 'edit', $params, $build, $type);
$menu .= $this->buildMenu($module, 'delete', $params, $build, $type, 'trash', 'hiddenwin');
}
else
{
@@ -588,10 +594,10 @@ class buildModel extends model
$menu .= $this->buildFlowMenu('build', $build, 'view', 'direct');
$editClickable = $this->buildMenu('build', 'edit', $params, $build, $type, '', '', '', '', '', '', false);
$deleteClickable = $this->buildMenu('build', 'delete', $params, $build, $type, '', '', '', '', '', '', false);
if(common::hasPriv('build', 'edit') and $editClickable) $menu .= html::a(helper::createLink('build', 'edit', $params), "<i class='icon-common-edit icon-edit'></i> " . $this->lang->edit, '', "class='btn btn-link' title='{$this->lang->build->edit}' data-app='{$app->tab}'");
if(common::hasPriv('build', 'delete') and $deleteClickable) $menu .= html::a(helper::createLink('build', 'delete', $params), "<i class='icon-common-delete icon-trash'></i> " . $this->lang->delete, '', "class='btn btn-link' title='{$this->lang->build->delete}' target='hiddenwin' data-app='{$app->tab}'");
$editClickable = $this->buildMenu($module, 'edit', $params, $build, $type, '', '', '', '', '', '', false);
$deleteClickable = $this->buildMenu($module, 'delete', $params, $build, $type, '', '', '', '', '', '', false);
if(common::hasPriv($module, 'edit') and $editClickable) $menu .= html::a(helper::createLink($module, 'edit', $params), "<i class='icon-common-edit icon-edit'></i> " . $this->lang->edit, '', "class='btn btn-link' title='{$this->lang->build->edit}' data-app='{$app->tab}'");
if(common::hasPriv($module, 'delete') and $deleteClickable) $menu .= html::a(helper::createLink($module, 'delete', $params), "<i class='icon-common-delete icon-trash'></i> " . $this->lang->delete, '', "class='btn btn-link' title='{$this->lang->build->delete}' target='hiddenwin' data-app='{$app->tab}'");
}
return $menu;
+7 -6
View File
@@ -19,12 +19,6 @@
</div>
<form class='load-indicator main-form form-ajax' id='dataform' method='post' enctype='multipart/form-data'>
<table class='table table-form'>
<?php if($app->tab == 'project'):?>
<tr class="<?php echo empty($multipleProject) ? 'hidden' : '';?>">
<th><?php echo $lang->executionCommon;?></th>
<td><?php echo html::select('execution', $executions, $executionID, "onchange='loadProducts(this.value);' class='form-control chosen' required");?></td>
</tr>
<?php endif;?>
<tr class="<?php echo $hidden;?>">
<th><?php echo $lang->build->product;?></th>
<?php if(!empty($products)):?>
@@ -48,6 +42,12 @@
<?php endif;?>
<td></td>
</tr>
<?php if($app->tab == 'project' && !empty($multipleProject)):?>
<tr>
<th><?php echo $lang->build->common;?></th>
<td id='buildBox'><?php echo html::select('builds', array(), '', "class='form-control chosen' multiple");?></td>
</tr>
<?php endif;?>
<tr>
<th><?php echo $lang->build->name;?></th>
<td><?php echo html::input('name', '', "class='form-control' required");?></td>
@@ -93,6 +93,7 @@
</div>
</div>
<?php js::set('productGroups', $productGroups);?>
<?php js::set('projectID', $projectID);?>
<?php js::set('executionID', $executionID);?>
<?php js::set('currentTab', $this->app->tab);?>
<?php include '../../common/view/footer.html.php';?>
+10 -6
View File
@@ -23,7 +23,7 @@
</div>
<form class='load-indicator main-form form-ajax' method='post' id='dataform' enctype='multipart/form-data'>
<table class='table table-form'>
<tr class="<?php echo $hidden;?>">
<tr class="<?php echo $hidden;?>">
<th><?php echo $lang->build->product;?></th>
<td>
<?php
@@ -42,13 +42,16 @@
</td>
<td><?php if($disabled) echo $lang->build->notice->changeProduct;?></td>
</tr>
<?php if(!empty($multipleProject)):?>
<?php if(!$build->execution):?>
<tr>
<?php $disabled = $testtaskID ? 'disabled' : '';?>
<th><?php echo $lang->build->execution;?></th>
<td id='executionsBox'><?php echo html::select('execution', $executions, $build->execution, "class='form-control chosen' required $disabled");?></td>
<td><?php if($disabled) echo $lang->build->notice->changeExecution;?></td>
<th><?php echo $lang->build->common;?></th>
<td id='buildBox'><?php echo html::select('builds', array(), '', "class='form-control chosen' multiple");?></td>
</tr>
<?php elseif(!empty($multipleProject)):?>
<?php $disabled = $testtaskID ? 'disabled' : '';?>
<th><?php echo $lang->build->execution;?></th>
<td id='executionsBox'><?php echo html::select('execution', $executions, $build->execution, "class='form-control chosen' required $disabled");?></td>
<td><?php if($disabled) echo $lang->build->notice->changeExecution;?></td>
<?php endif;?>
<tr>
<th><?php echo $lang->build->name;?></th>
@@ -91,6 +94,7 @@
</div>
<?php js::set('productGroups', $productGroups)?>
<?php js::set('projectID', $build->project)?>
<?php js::set('builds', $build->builds)?>
<?php js::set('executionID', $build->execution)?>
<?php js::set('currentTab', $this->app->tab);?>
<?php include '../../common/view/footer.html.php';?>
+14 -11
View File
@@ -35,8 +35,9 @@ tbody tr td:first-child input {display: none;}
echo "<ul class='dropdown-menu'>";
foreach($buildPairs as $id => $name)
{
$buildInfo = zget($builds, $id);
echo '<li' . ($id == $build->id ? " class='active'" : '') . '>';
echo html::a($this->createLink('build', 'view', "buildID=$id"), $name);
echo html::a($this->createLink($buildInfo->execution ? 'build' : 'projectbuild', 'view', "buildID=$id") . "#app={$app->tab}", $name);
echo '</li>';
}
echo '</ul>';
@@ -53,6 +54,7 @@ tbody tr td:first-child input {display: none;}
</div>
<?php endif;?>
</div>
<?php $module = $build->execution ? 'build' : 'projectbuild';?>
<div id='mainContent' class='main-content'>
<div class='tabs' id='tabsNav'>
<?php $countStories = count($stories); $countBugs = count($bugs); $countGeneratedBugs = count($generatedBugs);?>
@@ -64,13 +66,13 @@ tbody tr td:first-child input {display: none;}
</ul>
<div class='tab-content'>
<div class='tab-pane <?php if($type == 'story') echo 'active'?>' id='stories'>
<?php if($canBeChanged and common::hasPriv('build', 'linkStory') and !isonlybody()):?>
<?php if($canBeChanged and common::hasPriv($module, 'linkStory') and !isonlybody()):?>
<div class='actions'><?php echo html::a("javascript:showLink($build->id, \"story\")", '<i class="icon-link"></i> ' . $lang->build->linkStory, '', "class='btn btn-primary'");?></div>
<div class='linkBox cell hidden'></div>
<?php endif;?>
<form class='main-table table-story' data-ride='table' method='post' target='hiddenwin' action='<?php echo inlink('batchUnlinkStory', "buildID={$build->id}")?>' id='linkedStoriesForm'>
<form class='main-table table-story' data-ride='table' method='post' target='hiddenwin' action='<?php echo $this->createLink($module, 'batchUnlinkStory', "buildID={$build->id}")?>' id='linkedStoriesForm'>
<table class='table has-sort-head' id='storyList'>
<?php $canBatchUnlink = ($canBeChanged and common::hasPriv('build', 'batchUnlinkStory'));?>
<?php $canBatchUnlink = ($canBeChanged and common::hasPriv($module, 'batchUnlinkStory'));?>
<?php $vars = "buildID={$build->id}&type=story&link=$link&param=$param&orderBy=%s";?>
<thead>
<tr class='text-center'>
@@ -133,9 +135,9 @@ tbody tr td:first-child input {display: none;}
<td><?php echo $lang->story->stageList[$story->stage];?></td>
<td class='c-actions'>
<?php
if($canBeChanged and common::hasPriv('build', 'unlinkStory'))
if($canBeChanged and common::hasPriv($module, 'unlinkStory'))
{
$unlinkURL = inlink('unlinkStory', "buildID=$build->id&story=$story->id");
$unlinkURL = $this->createLink($module, 'unlinkStory', "buildID=$build->id&story=$story->id");
echo html::a($unlinkURL, '<i class="icon-unlink"></i>', 'hiddenwin', "class='btn' title='{$lang->build->unlinkStory}'");
}
?>
@@ -163,13 +165,13 @@ tbody tr td:first-child input {display: none;}
</form>
</div>
<div class='tab-pane <?php if($type == 'bug') echo 'active'?>' id='bugs'>
<?php if($canBeChanged and common::hasPriv('build', 'linkBug') and !isonlybody()):?>
<?php if($canBeChanged and common::hasPriv($module, 'linkBug') and !isonlybody()):?>
<div class='actions'><?php echo html::a("javascript:showLink($build->id, \"bug\")", '<i class="icon-bug"></i> ' . $lang->build->linkBug, '', "class='btn btn-primary'");?></div>
<div class='linkBox cell hidden'></div>
<?php endif;?>
<form class='main-table table-bug' data-ride='table' method='post' target='hiddenwin' action="<?php echo inLink('batchUnlinkBug', "build=$build->id");?>" id='linkedBugsForm'>
<form class='main-table table-bug' data-ride='table' method='post' target='hiddenwin' action="<?php echo $this->createLink($module, 'batchUnlinkBug', "build=$build->id");?>" id='linkedBugsForm'>
<table class='table has-sort-head' id='bugList'>
<?php $canBatchUnlink = $canBeChanged and common::hasPriv('build', 'batchUnlinkBug');?>
<?php $canBatchUnlink = $canBeChanged and common::hasPriv($module, 'batchUnlinkBug');?>
<?php $vars = "buildID={$build->id}&type=bug&link=$link&param=$param&orderBy=%s";?>
<thead>
<tr class='text-center'>
@@ -214,9 +216,9 @@ tbody tr td:first-child input {display: none;}
<td><?php echo helper::isZeroDate($bug->resolvedDate) ? '' : substr($bug->resolvedDate, 5, 11);?></td>
<td class='c-actions'>
<?php
if($canBeChanged and common::hasPriv('build', 'unlinkBug'))
if($canBeChanged and common::hasPriv($module, 'unlinkBug'))
{
$unlinkURL = inlink('unlinkBug', "buildID=$build->id&bug=$bug->id");
$unlinkURL = $this->createLink($module, 'unlinkBug', "buildID=$build->id&bug=$bug->id");
echo html::a("###", '<i class="icon-unlink"></i>', '', "onclick='ajaxDelete(\"$unlinkURL\", \"bugList\", confirmUnlinkBug)' class='btn' title='{$lang->build->unlinkBug}'");
}
?>
@@ -369,6 +371,7 @@ tbody tr td:first-child input {display: none;}
</div>
<?php js::set('param', helper::safe64Decode($param))?>
<?php js::set('link', $link)?>
<?php js::set('currentModule', $module)?>
<?php js::set('buildID', $build->id)?>
<?php js::set('type', $type)?>
<?php include '../../common/view/footer.html.php';?>
+1 -1
View File
@@ -212,7 +212,7 @@ $lang->scrum->menu->projectplan = array('link' => "{$lang->productplan->shortCom
$lang->scrum->menu->doc = array('link' => "{$lang->doc->common}|doc|tableContents|type=project&objectID=%s", 'subModule' => 'doc');
$lang->scrum->menu->qa = array('link' => "{$lang->qa->common}|project|bug|projectID=%s", 'subModule' => 'testcase,testtask,bug,testreport', 'alias' => 'bug,testtask,testcase,testreport', 'exclude' => 'execution-create,execution-batchedit');
$lang->scrum->menu->devops = array('link' => "{$lang->repo->common}|repo|browse|repoID=0&branchID=&objectID=%s", 'subModule' => 'repo');
$lang->scrum->menu->build = array('link' => "{$lang->build->common}|project|build|project=%s");
$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');
+14 -9
View File
@@ -237,6 +237,9 @@ $lang->project->methodOrder[190] = 'manageRepo';
$lang->resource->projectbuild = new stdclass();
$lang->resource->projectbuild->browse = 'browse';
$lang->resource->projectbuild->create = 'create';
$lang->resource->projectbuild->edit = 'edit';
$lang->resource->projectbuild->delete = 'delete';
$lang->projectbuild->methodOrder[5] = 'browse';
@@ -953,15 +956,17 @@ $lang->resource->build->unlinkBug = 'unlinkBug';
$lang->resource->build->batchUnlinkBug = 'batchUnlinkBug';
$lang->build->methodOrder[5] = 'create';
$lang->build->methodOrder[10] = 'edit';
$lang->build->methodOrder[15] = 'delete';
$lang->build->methodOrder[20] = 'view';
$lang->build->methodOrder[25] = 'linkStory';
$lang->build->methodOrder[30] = 'unlinkStory';
$lang->build->methodOrder[35] = 'batchUnlinkStory';
$lang->build->methodOrder[40] = 'linkBug';
$lang->build->methodOrder[45] = 'unlinkBug';
$lang->build->methodOrder[50] = 'batchUnlinkBug';
$lang->build->methodOrder[10] = 'createProjectBuild';
$lang->build->methodOrder[15] = 'edit';
$lang->build->methodOrder[20] = 'editProjectBuild';
$lang->build->methodOrder[25] = 'delete';
$lang->build->methodOrder[30] = 'view';
$lang->build->methodOrder[35] = 'linkStory';
$lang->build->methodOrder[40] = 'unlinkStory';
$lang->build->methodOrder[45] = 'batchUnlinkStory';
$lang->build->methodOrder[50] = 'linkBug';
$lang->build->methodOrder[55] = 'unlinkBug';
$lang->build->methodOrder[60] = 'batchUnlinkBug';
/* QA. */
$lang->resource->qa = new stdclass();
-21
View File
@@ -882,27 +882,6 @@ class product extends control
$this->display();
}
/**
* Ajax get products.
*
* @param int $executionID
* @access public
* @return void
*/
public function ajaxGetProducts($executionID)
{
$this->loadModel('build');
$products = $this->product->getProductPairsByProject($executionID);
if(empty($products))
{
return printf($this->lang->build->noProduct, $this->createLink('execution', 'manageproducts', "executionID=$executionID&from=buildCreate", '', 'true'), 'project');
}
else
{
return print(html::select('product', $products, empty($product) ? '' : $product->id, "onchange='loadBranches(this.value);' class='form-control chosen' required data-toggle='modal' data-type='iframe'"));
}
}
/**
* AJAX: get projects of a product in html select.
*
+4 -3
View File
@@ -35,7 +35,7 @@
<a class="btn btn-link querybox-toggle" id="bysearchTab"><i class="icon icon-search muted"></i> <?php echo $lang->execution->byQuery;?></a>
</div>
<div class="btn-toolbar pull-right">
<?php if(common::canModify('project', $project)) common::printLink('build', 'create', "executionID=&productID=&projectID=$projectID", "<i class='icon icon-plus'></i> " . $lang->build->create, '', "class='btn btn-primary' id='createBuild'");?>
<?php if(common::canModify('project', $project)) common::printLink('projectbuild', 'create', "projectID=$projectID", "<i class='icon icon-plus'></i> " . $lang->build->create, '', "class='btn btn-primary' id='createBuild'");?>
</div>
</div>
<div id="mainContent">
@@ -67,11 +67,12 @@
<tbody>
<?php foreach($projectBuilds as $productID => $builds):?>
<?php foreach($builds as $index => $build):?>
<?php $module = $build->execution ? 'build' : 'projectbuild';?>
<tr data-id="<?php echo $productID;?>">
<td class="c-id-sm text-muted"><?php echo html::a(helper::createLink('build', 'view', "buildID=$build->id"), sprintf('%03d', $build->id), '', "data-app='project'");?></td>
<td class="c-id-sm text-muted"><?php echo html::a(helper::createLink($module, 'view', "buildID=$build->id"), sprintf('%03d', $build->id), '', "data-app='project'");?></td>
<td class="c-name" title='<?php echo $build->name;?>'>
<?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, '', "data-app='project'");?>
<?php echo html::a($this->createLink($module, 'view', "buildID=$build->id"), $build->name, '', "data-app='project'");?>
</td>
<?php if($project->hasProduct):?>
<td class="c-name text-left" title='<?php echo $build->productName;?>'><?php echo $build->productName;?></td>
+140
View File
@@ -76,4 +76,144 @@ class projectBuild extends control
$this->display();
}
/**
* Create a build for project.
*
* @param int $projectID
* @access public
* @return void
*/
public function create($projectID = 0)
{
echo $this->fetch('build', 'create', "executionID=0&productID=0&projectID=$projectID");
}
/**
* Edit a build for project.
*
* @param int $buildID
* @access public
* @return void
*/
public function edit($buildID)
{
echo $this->fetch('build', 'edit', "buildID=$buildID");
}
/**
* View a build for project.
*
* @param int $buildID
* @param string $type
* @param string $link
* @param string $param
* @param string $orderBy
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @access public
* @return void
*/
public function view($buildID, $type = 'story', $link = 'false', $param = '', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 100, $pageID = 1)
{
echo $this->fetch('build', 'view', "buildID=$buildID&type=$type&link=$link&param=$param&orderBy=$orderBy&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID");
}
/**
* Delete a build for project.
*
* @param int $buildID
* @param string $confirm yes|noe
* @access public
* @return void
*/
public function delete($buildID, $confirm = 'no')
{
echo $this->fetch('build', 'delete', "buildID=$buildID&confirm=$confirm");
}
/**
* Link stories.
*
* @param int $buildID
* @param string $browseType
* @param int $param
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @access public
* @return void
*/
public function linkStory($buildID = 0, $browseType = '', $param = 0, $recTotal = 0, $recPerPage = 100, $pageID = 1)
{
echo $this->fetch('build', 'linkStory', "buildID=$buildID&browseType=$browseType&param=$param&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID");
}
/**
* Unlink story
*
* @param int $storyID
* @param string $confirm yes|no
* @access public
* @return void
*/
public function unlinkStory($buildID, $storyID)
{
echo $this->fetch('build', 'unlinkStory', "buildID=$buildID&storyID=$storyID");
}
/**
* Batch unlink story.
*
* @param string $confirm
* @access public
* @return void
*/
public function batchUnlinkStory($buildID)
{
echo $this->fetch('build', 'batchUnlinkStory', "buildID=$buildID");
}
/**
* Link bugs.
*
* @param int $buildID
* @param string $browseType
* @param int $param
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @access public
* @return void
*/
public function linkBug($buildID = 0, $browseType = '', $param = 0, $recTotal = 0, $recPerPage = 100, $pageID = 1)
{
echo $this->fetch('build', 'linkBug', "buildID=$buildID&browseType=$browseType&param=$param&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID");
}
/**
* Unlink story
*
* @param int $buildID
* @param int $bugID
* @access public
* @return void
*/
public function unlinkBug($buildID, $bugID)
{
echo $this->fetch('build', 'unlinkBug', "buildID=$buildID&bugID=$bugID");
}
/**
* Batch unlink story.
*
* @param int $buildID
* @access public
* @return void
*/
public function batchUnlinkBug($buildID)
{
echo $this->fetch('build', 'batchUnlinkBug', "buildID=$buildID");
}
}
+13 -2
View File
@@ -9,5 +9,16 @@
* @version $Id: zh-cn.php 4129 2020-11-27 01:58:14Z wwccss $
* @link http://www.zentao.net
*/
$lang->projectbuild->common = 'Project Build';
$lang->projectbuild->browse = 'Build List';
$lang->projectbuild->common = 'Project Build';
$lang->projectbuild->browse = 'Build List';
$lang->projectbuild->create = "Create Build";
$lang->projectbuild->edit = "Edit Build";
$lang->projectbuild->delete = "Delete Build";
$lang->projectbuild->view = "Build Detail";
$lang->projectbuild->linkStory = "Link {$lang->SRCommon}";
$lang->projectbuild->linkBug = "Link Bug";
$lang->projectbuild->unlinkStory = "Unlink {$lang->SRCommon}";
$lang->projectbuild->unlinkBug = "Unlink Bug";
$lang->projectbuild->batchUnlink = 'Batch Unlink';
$lang->projectbuild->batchUnlinkStory = "Batch Unlink {$lang->SRCommon}";
$lang->projectbuild->batchUnlinkBug = 'Batch Unlink Bug';
+13 -2
View File
@@ -9,5 +9,16 @@
* @version $Id: zh-cn.php 4129 2020-11-27 01:58:14Z wwccss $
* @link http://www.zentao.net
*/
$lang->projectbuild->common = 'Project Build';
$lang->projectbuild->browse = 'Build List';
$lang->projectbuild->common = 'Project Build';
$lang->projectbuild->browse = 'Build List';
$lang->projectbuild->create = "Create Build";
$lang->projectbuild->edit = "Edit Build";
$lang->projectbuild->delete = "Delete Build";
$lang->projectbuild->view = "Build Detail";
$lang->projectbuild->linkStory = "Link {$lang->SRCommon}";
$lang->projectbuild->linkBug = "Link Bug";
$lang->projectbuild->unlinkStory = "Unlink {$lang->SRCommon}";
$lang->projectbuild->unlinkBug = "Unlink Bug";
$lang->projectbuild->batchUnlink = 'Batch Unlink';
$lang->projectbuild->batchUnlinkStory = "Batch Unlink {$lang->SRCommon}";
$lang->projectbuild->batchUnlinkBug = 'Batch Unlink Bug';
+13 -2
View File
@@ -9,5 +9,16 @@
* @version $Id: zh-cn.php 4129 2020-11-27 01:58:14Z wwccss $
* @link http://www.zentao.net
*/
$lang->projectbuild->common = 'Project Build';
$lang->projectbuild->browse = 'Build List';
$lang->projectbuild->common = 'Project Build';
$lang->projectbuild->browse = 'Build List';
$lang->projectbuild->create = "Create Build";
$lang->projectbuild->edit = "Edit Build";
$lang->projectbuild->delete = "Delete Build";
$lang->projectbuild->view = "Build Detail";
$lang->projectbuild->linkStory = "Link {$lang->SRCommon}";
$lang->projectbuild->linkBug = "Link Bug";
$lang->projectbuild->unlinkStory = "Unlink {$lang->SRCommon}";
$lang->projectbuild->unlinkBug = "Unlink Bug";
$lang->projectbuild->batchUnlink = 'Batch Unlink';
$lang->projectbuild->batchUnlinkStory = "Batch Unlink {$lang->SRCommon}";
$lang->projectbuild->batchUnlinkBug = 'Batch Unlink Bug';
+13 -2
View File
@@ -9,5 +9,16 @@
* @version $Id: zh-cn.php 4129 2020-11-27 01:58:14Z wwccss $
* @link http://www.zentao.net
*/
$lang->projectbuild->common = 'Project Build';
$lang->projectbuild->browse = 'Build List';
$lang->projectbuild->common = 'Project Build';
$lang->projectbuild->browse = 'Build List';
$lang->projectbuild->create = "Create Build";
$lang->projectbuild->edit = "Edit Build";
$lang->projectbuild->delete = "Delete Build";
$lang->projectbuild->view = "Build Detail";
$lang->projectbuild->linkStory = "Link {$lang->SRCommon}";
$lang->projectbuild->linkBug = "Link Bug";
$lang->projectbuild->unlinkStory = "Unlink {$lang->SRCommon}";
$lang->projectbuild->unlinkBug = "Unlink Bug";
$lang->projectbuild->batchUnlink = 'Batch Unlink';
$lang->projectbuild->batchUnlinkStory = "Batch Unlink {$lang->SRCommon}";
$lang->projectbuild->batchUnlinkBug = 'Batch Unlink Bug';
+13 -2
View File
@@ -9,5 +9,16 @@
* @version $Id: zh-cn.php 4129 2020-11-27 01:58:14Z wwccss $
* @link http://www.zentao.net
*/
$lang->projectbuild->common = '项目版本';
$lang->projectbuild->browse = '版本列表';
$lang->projectbuild->common = '项目版本';
$lang->projectbuild->browse = '版本列表';
$lang->projectbuild->create = "创建项目版本";
$lang->projectbuild->edit = "编辑项目版本";
$lang->projectbuild->delete = "删除版本";
$lang->projectbuild->view = "版本详情";
$lang->projectbuild->linkStory = "关联{$lang->SRCommon}";
$lang->projectbuild->linkBug = "关联Bug";
$lang->projectbuild->unlinkStory = "移除{$lang->SRCommon}";
$lang->projectbuild->unlinkBug = "移除Bug";
$lang->projectbuild->batchUnlink = '批量移除';
$lang->projectbuild->batchUnlinkStory = "批量移除{$lang->SRCommon}";
$lang->projectbuild->batchUnlinkBug = '批量移除Bug';