Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms
This commit is contained in:
@@ -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
|
||||
完成的需求
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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
@@ -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')
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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']);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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;}
|
||||
@@ -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();
|
||||
|
||||
@@ -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;}
|
||||
|
||||
Reference in New Issue
Block a user