This commit is contained in:
Yagami
2022-11-23 16:56:01 +08:00
21 changed files with 59 additions and 28 deletions
+14
View File
@@ -1,5 +1,6 @@
2022-11-16 18.0.beta1
完成的需求
开源版:
39874 瀑布项目设置中产品页面提示文案修改
39873 瀑布项目创建页面按产品创建阶段文案修改
39849 发布可以关联多个版本后,调整产品发布中关联软件需求的规则
@@ -338,6 +339,13 @@
37635 在项目型项目下可以创建代码库
37465 在项目型项目下可以提交评审问题
37464 代码库可以关联项目
企业版:
39500 反馈1.5级导航样式优化
39123 工单增加导出数据功能
38160 反馈的权限改名为设置
37570 权限增加产品设置功能
36930 反馈权限列表产品展示同产品列表
禅道客户端:
36616 实现版本升级后原存档讨论组逻辑处理
36543 实现群主取消归档讨论组相关提醒及操作
36540 实现对已归档的讨论组限制移动分组
@@ -376,6 +384,12 @@
27983 用户名大小写不对,提示有问题
27629 预览txt文件乱码
28095 LDAP密码有特殊字符无法登录
30119 设计Bug解决表页面代码报错
30057 输入方式的选中样式与文字不在同一水平线
29661 透视表字段显示为英文
29617 保存透视表时必填项未增加必填标识
29367 点击分组维护主机、虚拟机二级导航高亮展示
28580 统计-测试报表中有两个报表没有翻译德语和法语语言项
2022-11-02 17.8
完成的需求
+1 -1
View File
@@ -20,7 +20,7 @@
<table class='table table-condensed table-bordered active-disabled table-fixed'>
<thead class='text-center'>
<tr>
<th class='w-200px'><?php echo $lang->admin->setModule->module;?></th>
<th class='w-150px'><?php echo $lang->admin->setModule->module;?></th>
<th><?php echo $lang->admin->setModule->optional;?></th>
</tr>
</thead>
+2 -2
View File
@@ -2247,8 +2247,8 @@ class bugModel extends model
if(!empty($stepResults))
{
$bugStep = '';
$bugResult = '';
$bugStep = '';
$bugResult = isset($stepResults[0]) ? $stepResults[0]['real'] : '';
$bugExpect = '';
foreach($steps as $stepId)
{
+1 -1
View File
@@ -17,7 +17,7 @@ foreach($products as $product)
}
$productsPinYin = common::convert2Pinyin($productNames);
$linkHtml = $this->product->setParamsForLink($module, $link, $projectID, 0);
$productsHtml = count($products) > 1 ? html::a($linkHtml, $this->lang->bug->allProduct, '', "class='text-primary' title='{$this->lang->bug->allProduct}' data-key='" . zget($productsPinYin, $this->lang->bug->allProduct, '') . "' data-app='{$this->app->tab}'") : '';
$productsHtml = (count($products) > 1 and strpos(',zeroCase,browseUnits,groupCase,', ",$method,") === false) ? html::a($linkHtml, $this->lang->bug->allProduct, '', "class='text-primary' title='{$this->lang->bug->allProduct}' data-key='" . zget($productsPinYin, $this->lang->bug->allProduct, '') . "' data-app='{$this->app->tab}'") : '';
foreach($products as $product)
{
-3
View File
@@ -634,9 +634,6 @@ class custom extends control
$this->loadModel('setting')->setItem('system.common.global.mode', $mode);
$this->setting->setItem('system.common.global.defaultProgram', $program);
/* Set default program for product and project with no program. */
$this->loadModel('upgrade')->relateDefaultProgram($program);
$this->custom->disableFeaturesByMode($mode);
if($mode == 'light') $this->custom->processProjectAcl();
+1
View File
@@ -3,4 +3,5 @@
#selectProgramModal .modal-header {border-bottom: 0px}
#selectProgramModal .modal-header h4.modal-title{font-weight: 700}
#selectProgramModal .modal-footer {border-top: 0px; text-align: center}
.main-table tbody > tr.select-mode:hover{background: unset;}
.btn-wide {padding: 6px 85px;}
+2 -2
View File
@@ -267,8 +267,8 @@ $lang->custom->features['productLine'] = 'Product - Product Line';
$lang->custom->features['projectScrum'] = 'Project - Scrum model';
$lang->custom->features['projectWaterfall'] = 'Project - Waterfall model';
$lang->custom->features['projectKanban'] = 'Project - Kanban model';
$lang->custom->features['execution'] = 'Execute';
$lang->custom->features['qa'] = 'test';
$lang->custom->features['execution'] = 'Execution';
$lang->custom->features['qa'] = 'Test';
$lang->custom->features['devops'] = 'DevOps';
$lang->custom->features['kanban'] = 'Kanban';
$lang->custom->features['doc'] = 'Document';
+2 -2
View File
@@ -268,8 +268,8 @@ $lang->custom->features['projectScrum'] = 'Project - Scrum model';
$lang->custom->features['scrumDetail'] = 'Scrum - Issues, risks, opportunities, processes, QA, meetings, measure';
$lang->custom->features['projectWaterfall'] = 'Project - Waterfall model';
$lang->custom->features['projectKanban'] = 'Project - Kanban model';
$lang->custom->features['execution'] = 'Execute';
$lang->custom->features['qa'] = 'test';
$lang->custom->features['execution'] = 'Execution';
$lang->custom->features['qa'] = 'Test';
$lang->custom->features['devops'] = 'DevOps';
$lang->custom->features['kanban'] = 'Kanban';
$lang->custom->features['doc'] = 'Document';
+2 -2
View File
@@ -267,8 +267,8 @@ $lang->custom->features['productLine'] = 'Product - Product Line';
$lang->custom->features['projectScrum'] = 'Project - Scrum model';
$lang->custom->features['projectWaterfall'] = 'Project - Waterfall model';
$lang->custom->features['projectKanban'] = 'Project - Kanban model';
$lang->custom->features['execution'] = 'Execute';
$lang->custom->features['qa'] = 'test';
$lang->custom->features['execution'] = 'Execution';
$lang->custom->features['qa'] = 'Test';
$lang->custom->features['devops'] = 'DevOps';
$lang->custom->features['kanban'] = 'Kanban';
$lang->custom->features['doc'] = 'Document';
+1 -1
View File
@@ -53,7 +53,7 @@
<td><i class='icon text-success icon-check'></i></td>
</tr>
<?php endforeach;?>
<tr class='text-center'>
<tr class='text-center select-mode'>
<td class='text-left strong'><?php echo $this->lang->custom->selectUsage;?></td>
<td>
<?php $primaryClass = $mode == 'light' ? '' : 'btn-primary';?>
+3 -3
View File
@@ -351,7 +351,7 @@ class myModel extends model
{
$orderBy = (strpos($orderBy, 'priOrder') !== false or strpos($orderBy, 'severityOrder') !== false) ? $orderBy : "t1.$orderBy";
$nameField = $objectType == 'bug' ? 'productName' : 'productTitle';
$select = "t1.*, t2.name AS {$nameField}, t2.shadow, " . (strpos($orderBy, 'severity') !== false ? "IF(t1.`severity` = 0, {$this->config->maxPriValue}, t1.`severity`) AS severityOrder" : "IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) AS priOrder");
$select = "t1.*, t2.name AS {$nameField}, t2.shadow AS shadow, " . (strpos($orderBy, 'severity') !== false ? "IF(t1.`severity` = 0, {$this->config->maxPriValue}, t1.`severity`) AS severityOrder" : "IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) AS priOrder");
$objectList = $this->dao->select($select)->from($this->config->objectTables[$module])->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on("t1.product = t2.id")
->where('t1.deleted')->eq(0)
@@ -816,7 +816,7 @@ class myModel extends model
$storyIDList[$storyID] = $storyID;
}
$stories = $this->dao->select("distinct t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, t2.name as productTitle, t4.title as planTitle")->from(TABLE_STORY)->alias('t1')
$stories = $this->dao->select("distinct t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, t2.name as productTitle, t2.shadow as shadow, t4.title as planTitle")->from(TABLE_STORY)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id')
->leftJoin(TABLE_PLANSTORY)->alias('t3')->on('t1.id = t3.plan')
->leftJoin(TABLE_PRODUCTPLAN)->alias('t4')->on('t3.plan = t4.id')
@@ -835,7 +835,7 @@ class myModel extends model
}
else
{
$stories = $this->dao->select("distinct t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, t2.name as productTitle, t4.title as planTitle")->from(TABLE_STORY)->alias('t1')
$stories = $this->dao->select("distinct t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, t2.name as productTitle, t2.shadow as shadow, t4.title as planTitle")->from(TABLE_STORY)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id')
->leftJoin(TABLE_PLANSTORY)->alias('t3')->on('t1.id = t3.plan')
->leftJoin(TABLE_PRODUCTPLAN)->alias('t4')->on('t3.plan = t4.id')
+2
View File
@@ -85,6 +85,8 @@ class productModel extends model
if(empty($products)) return;
if($this->app->tab == 'project' and strpos(',zeroCase,browseUnits,groupCase,', ",$currentMethod,") !== false) $isQaModule = true;
$this->app->loadLang('product');
if(!$isQaModule and !$productID and !$isFeedbackModel)
{
+2 -1
View File
@@ -20,6 +20,8 @@ body {margin-bottom: 25px;}
.assignedTo{border-radius: 4px !important;}
</style>
<?php
$storyString = '';
$reviewStoryTips = '';
$lang->story->createCommon = $storyType == 'story' ? $lang->story->createStory : $lang->story->createRequirement;
$unfoldStories = isset($config->product->browse->unfoldStories) ? json_decode($config->product->browse->unfoldStories, true) : array();
$unfoldStories = zget($unfoldStories, $productID, array());
@@ -401,7 +403,6 @@ js::set('vision', $this->config->vision);
<div class="table-actions btn-toolbar">
<div class='btn-group dropup'>
<?php
$storyString = '';
foreach($stories as $story)
{
$storyProductIds[$story->product] = $story->product;
+1 -1
View File
@@ -104,7 +104,7 @@
<span class='input-group-addon'><?php echo zget($budgetUnitList, $project->budgetUnit);?></span>
<?php else:?>
<span class='input-group-addon'></span>
<?php echo html::select('budgetUnit', $budgetUnitList, $project->budgetUnit, "class='form-control'");?>
<?php echo html::select('budgetUnit', $budgetUnitList, $project->budgetUnit, "class='form-control w-70px'");?>
<?php endif;?>
</div>
</td>
+2
View File
@@ -27,6 +27,7 @@
<tr>
<th class='w-120px'><?php echo $lang->release->name;?></th>
<td><?php echo html::input('name', $release->name, "class='form-control' required");?></td>
<?php if(!$product->shadow):?>
<td>
<?php $checked = !empty($release->marker) ? "checked='checked'" : '';?>
<div id='markerBox' class='checkbox-primary'>
@@ -34,6 +35,7 @@
<label for='marker'><?php echo $lang->release->marker;?></label>
</div>
</td>
<?php endif;?>
</tr>
<tr>
<th><?php echo $lang->release->includedBuild;?></th>
+2 -2
View File
@@ -1349,7 +1349,7 @@ class story extends control
$product = $this->product->getByID($story->product);
$plan = $this->dao->findById($story->plan)->from(TABLE_PRODUCTPLAN)->fetch('title');
$bugs = $this->dao->select('id,title,status,pri,severity')->from(TABLE_BUG)->where('story')->eq($storyID)->andWhere('deleted')->eq(0)->fetchAll();
$fromBug = $this->dao->select('id,title')->from(TABLE_BUG)->where('toStory')->eq($storyID)->fetch();
$fromBug = $this->dao->select('id,title')->from(TABLE_BUG)->where('id')->eq($story->fromBug)->fetch();
$cases = $this->dao->select('id,title,status,pri')->from(TABLE_CASE)->where('story')->eq($storyID)->andWhere('deleted')->eq(0)->fetchAll();
$linkedMRs = $this->loadModel('mr')->getLinkedMRPairs($storyID, 'story');
$modulePath = $this->tree->getParents($story->module);
@@ -2366,7 +2366,7 @@ class story extends control
$this->lang->story->title = str_replace($this->lang->URCommon, $this->lang->SRCommon, $this->lang->story->title);
}
if(!empty($product->shadow))
if(!empty($product->shadow))
{
unset($this->config->product->search['fields']['plan']);
unset($this->config->product->search['fields']['product']);
+8 -5
View File
@@ -245,6 +245,7 @@ class testcase extends control
{
$groupBy = empty($groupBy) ? 'story' : $groupBy;
$productID = $this->product->saveState($productID, $this->products);
$product = $this->product->getByID($productID);
if($branch === '') $branch = $this->cookie->preBranch;
$this->app->loadLang('testtask');
@@ -253,7 +254,7 @@ class testcase extends control
if($this->app->tab == 'project')
{
$products = array('0' => $this->lang->product->all) + $this->product->getProducts($this->session->project, 'all', '', false);
$this->lang->modulePageNav = $this->product->select($products, $productID, 'testcase', 'groupCase', "projectID=$projectID", $branch);
if(!$product->shadow) $this->lang->modulePageNav = $this->product->select($products, $productID, 'testcase', 'groupCase', "projectID=$projectID", $branch);
}
$this->session->set('caseList', $this->app->getURI(true), $this->app->tab);
@@ -294,7 +295,7 @@ class testcase extends control
$this->view->suiteID = 0;
$this->view->moduleID = 0;
$this->view->branch = $branch;
$this->view->product = $this->product->getByID($productID);
$this->view->product = $product;
$this->display();
}
@@ -323,12 +324,14 @@ class testcase extends control
$this->loadModel('project')->setMenu($this->session->project);
$products = $this->product->getProducts($this->session->project, 'all', '', false);
$productID = $this->product->saveState($productID, $products);
$this->lang->modulePageNav = $this->product->select($products, $productID, 'testcase', 'zeroCase', "projectID=$projectID", $branchID);
$product = $this->product->getByID($productID);
if(!$product->shadow) $this->lang->modulePageNav = $this->product->select($products, $productID, 'testcase', 'zeroCase', "projectID=$projectID", $branchID);
}
else
{
$products = $this->product->getPairs();
$productID = $this->product->saveState($productID, $products);
$product = $this->product->getByID($productID);
$this->loadModel('qa');
$this->app->rawModule = 'testcase';
foreach($this->config->qa->menuList as $module) $this->lang->navGroup->$module = 'qa';
@@ -355,7 +358,7 @@ class testcase extends control
$this->view->orderBy = $orderBy;
$this->view->suiteList = $this->loadModel('testsuite')->getSuites($productID);
$this->view->browseType = '';
$this->view->product = $this->product->getByID($productID);
$this->view->product = $product;
$this->view->pager = $pager;
$this->display();
}
@@ -836,7 +839,7 @@ class testcase extends control
$this->view->caseModule = empty($case->module) ? '' : $this->tree->getById($case->module);
$this->view->users = $this->user->getPairs('noletter');
$this->view->actions = $this->loadModel('action')->getList('case', $caseID);
$this->view->preAndNext = $this->loadModel('common')->getPreAndNextObject('testcase', $caseID);
$this->view->preAndNext = !isOnlybody() ? $this->loadModel('common')->getPreAndNextObject('testcase', $caseID) : '';
$this->view->runID = $from == 'testcase' ? 0 : $run->id;
$this->view->isLibCase = $isLibCase;
$this->view->caseFails = $caseFails;
+4
View File
@@ -2,3 +2,7 @@
.group-header > a {line-height: 20px; display: block; max-height: 40px; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden;}
.c-result {width: 80px;}
.c-bugs, .c-results, .c-steps {width: 30px;}
#subHeader #dropMenu .col-left .list-group {margin-bottom: 0px; padding-top: 10px;}
#subHeader #dropMenu .col-left {padding-bottom: 0px;}
#currentBranch + #dropMenu .col-left {padding-bottom: 30px;}
+3
View File
@@ -0,0 +1,3 @@
#subHeader #dropMenu .col-left .list-group {margin-bottom: 0px; padding-top: 10px;}
#subHeader #dropMenu .col-left {padding-bottom: 0px;}
#currentBranch + #dropMenu .col-left {padding-bottom: 30px;}
+3 -2
View File
@@ -155,6 +155,7 @@ class testtask extends control
/* Set menu. */
$productID = $this->loadModel('product')->saveState($productID, $this->products);
$product = $this->product->getByID($productID);
if($this->app->tab == 'project')
{
$this->lang->scrum->menu->qa['subMenu']->testcase['subModule'] = 'testtask';
@@ -167,7 +168,7 @@ class testtask extends control
}
$this->loadModel('project')->setMenu($projectID);
$this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', "projectID=$projectID", '', 0, '', false);
if(!$product->shadow) $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', "projectID=$projectID", '', 0, '', false);
}
else
{
@@ -194,7 +195,7 @@ class testtask extends control
$this->view->tasks = $this->testtask->getProductUnitTasks($productID, $browseType, $sort, $pager);
$this->view->users = $this->loadModel('user')->getPairs('noclosed|noletter');
$this->view->pager = $pager;
$this->view->product = $this->product->getByID($productID);
$this->view->product = $product;
$this->view->suiteList = $this->loadModel('testsuite')->getSuites($productID);
$this->display();
+3
View File
@@ -1,2 +1,5 @@
td.pass {background-color: unset !important; border-color: unset !important; border-bottom: 1px solid #eee !important; color: green;}
td.fail {background-color: unset !important; border-color: unset !important; border-bottom: 1px solid #eee !important; color: red;}
#subHeader #dropMenu .col-left .list-group {margin-bottom: 0px; padding-top: 10px;}
#subHeader #dropMenu .col-left {padding-bottom: 0px;}