From b8ba41c6c9ae1bef7951e2d20dfc2f894cf49b89 Mon Sep 17 00:00:00 2001 From: qiyu-xie Date: Tue, 3 Aug 2021 15:35:21 +0800 Subject: [PATCH 1/8] * Finish task#40805. --- module/doc/control.php | 38 +++++--------------------------------- module/doc/model.php | 39 ++++++--------------------------------- 2 files changed, 11 insertions(+), 66 deletions(-) diff --git a/module/doc/control.php b/module/doc/control.php index c71764533c..e68555c6c5 100644 --- a/module/doc/control.php +++ b/module/doc/control.php @@ -759,46 +759,18 @@ class doc extends control */ public function showFiles($type, $objectID, $viewType = '', $orderBy = 't1.id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { - $uri = $this->app->getURI(true); - $this->app->session->set('taskList', $uri); - $this->app->session->set('storyList', $uri); - $this->app->session->set('docList', $uri); - if(empty($viewType)) $viewType = !empty($_COOKIE['docFilesViewType']) ? $this->cookie->docFilesViewType : 'card'; setcookie('docFilesViewType', $viewType, $this->config->cookieLife, $this->config->webRoot, '', false, true); - $objects = $this->doc->getOrderedObjects($type); - if($type == 'product') - { - $objectID = $this->product->saveState($objectID, $objects); - $table = TABLE_PRODUCT; - - $libs = $this->doc->getLibsByObject('product', $objectID); - - $this->lang->modulePageNav = $this->doc->select($type, $objects, $objectID, $libs); - } - else if($type == 'project') - { - $objectID = $this->project->saveState($objectID, $objects); - $table = TABLE_PROJECT; - - $libs = $this->doc->getLibsByObject('project', $objectID); - - $this->lang->modulePageNav = $this->doc->select($type, $objects, $objectID, $libs); - } - else if($type == 'execution') - { - $objectID = $this->execution->saveState($objectID, $objects); - $table = TABLE_EXECUTION; - $libs = $this->doc->getLibsByObject('execution', $objectID); - - $this->lang->modulePageNav = $this->doc->select($type, $objects, $objectID, $libs); - } + $objects = $this->doc->getOrderedObjects($type); + $objectID = $this->{$type}->saveState($objectID, $objects); + $libs = $this->doc->getLibsByObject($type, $objectID); + $this->lang->modulePageNav = $this->doc->select($type, $objects, $objectID, $libs); $openApp = strpos('doc,product,project,execution', $this->app->openApp) !== false ? $this->app->openApp : 'doc'; if($openApp != 'doc') $this->loadModel($openApp)->setMenu($objectID); - $table = $type == 'product' ? TABLE_PRODUCT : TABLE_PROJECT; + $table = $this->config->objectTables[$type]; $object = $this->dao->select('id,name,status')->from($table)->where('id')->eq($objectID)->fetch(); $this->lang->TRActions = $this->doc->buildCollectButton4Doc(); diff --git a/module/doc/model.php b/module/doc/model.php index d2a768910d..2027313a9c 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -2288,41 +2288,14 @@ EOT; } else { - if($type == 'product') - { - $objectID = $this->product->saveState($objectID, $objects); - $table = TABLE_PRODUCT; + $objectID = $this->loadModel($type)->saveState($objectID, $objects); + $table = $this->config->objectTables[$type]; + $libs = $this->getLibsByObject($type, $objectID); - $libs = $this->getLibsByObject('product', $objectID); + if($libID == 0) $libID = key($libs); + $this->lang->modulePageNav = $this->select($type, $objects, $objectID, $libs, $libID); - if($libID == 0) $libID = key($libs); - $this->lang->modulePageNav = $this->select($type, $objects, $objectID, $libs, $libID); - - $this->app->rawMethod = 'product'; - } - else if($type == 'project') - { - $objectID = $this->loadModel('project')->saveState($objectID, $objects); - $table = TABLE_PROJECT; - - $libs = $this->getLibsByObject('project', $objectID); - - if($libID == 0) $libID = key($libs); - $this->lang->modulePageNav = $this->select($type, $objects, $objectID, $libs, $libID); - - $this->app->rawMethod = 'project'; - } - else if($type == 'execution') - { - $objectID = $this->loadModel('execution')->saveState($objectID, $objects); - $table = TABLE_EXECUTION; - $libs = $this->getLibsByObject('execution', $objectID); - - if($libID == 0) $libID = key($libs); - $this->lang->modulePageNav = $this->select($type, $objects, $objectID, $libs, $libID); - - $this->app->rawMethod = 'execution'; - } + $this->app->rawMethod = $type; $object = $this->dao->select('id,name,status')->from($table)->where('id')->eq($objectID)->fetch(); if(empty($object)) die(js::locate(helper::createLink($type, 'create'))); From 7bf9bbf1ca50ce6592d0612ab9c7a309a03a6abd Mon Sep 17 00:00:00 2001 From: holan20180123 Date: Tue, 3 Aug 2021 15:37:22 +0800 Subject: [PATCH 2/8] * Fix bug #14024. --- module/doc/css/common.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/doc/css/common.css b/module/doc/css/common.css index 33ccef5d95..211f206282 100644 --- a/module/doc/css/common.css +++ b/module/doc/css/common.css @@ -85,7 +85,7 @@ ol, ul {margin-bottom: 0} #createDropdown ul.dropdown-menu {text-align: left;} #collection-menu {max-width: 300px;} #collection-menu li a {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;} -#project, #product, #custom, #book {min-height: 160px;} +#project, #product, #custom, #book, #execution {min-height: 160px;} #title .menu-title {font-size: 15px; font-weight: 600; position: relative; padding: 2px 0 2px 15px; list-style: none;} #title .dropdown-menu {top: 38px;} .tree li > a {white-space: nowrap; text-overflow: ellipsis; overflow: hidden;} From a18fdc5a54301ee003ca5cc63632d6b4a9d2c223 Mon Sep 17 00:00:00 2001 From: dingguodong Date: Tue, 3 Aug 2021 15:47:34 +0800 Subject: [PATCH 3/8] - Remove extra line for importing issues. --- module/gitlab/control.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/gitlab/control.php b/module/gitlab/control.php index f1964f60b6..ba1521bdba 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -300,7 +300,6 @@ class gitlab extends control /* 'not[iids]' option in gitlab API has a issue when iids is too long. */ $gitlabIssues = $this->gitlab->apiGetIssues($gitlabID, $projectID, '&state=opened'); - if(empty($gitlabIssues)) return $this->send(array('result' => 'fail', 'message' => $this->lang->gitlab->serverFail, 'locate' => $this->server->http_referer)); foreach($gitlabIssues as $index => $issue) { foreach($savedIssueIDList as $savedIssueID) From 31772c8e161b5fb18996bafc5b821ef0e10a2ff3 Mon Sep 17 00:00:00 2001 From: holan20180123 Date: Tue, 3 Aug 2021 15:47:44 +0800 Subject: [PATCH 4/8] * Fix issue #367. --- module/doc/css/common.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/doc/css/common.css b/module/doc/css/common.css index 211f206282..c0435d6c14 100644 --- a/module/doc/css/common.css +++ b/module/doc/css/common.css @@ -81,7 +81,7 @@ td.c-name a:visited {color: #082999;} #pageNav .dropdown-menu {max-height: 350px; overflow-y: auto;} ol, ul {margin-bottom: 0} -#dropMenu .table-col .list-group {padding-top: 5px;} +#subHeader #dropMenu .table-col .list-group {padding-top: 5px;} #createDropdown ul.dropdown-menu {text-align: left;} #collection-menu {max-width: 300px;} #collection-menu li a {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;} From aad5ceb176937a5edd0feec2cb81c54ffe887ffa Mon Sep 17 00:00:00 2001 From: zenggang Date: Tue, 3 Aug 2021 15:53:34 +0800 Subject: [PATCH 5/8] * Adjust code format --- module/project/js/edit.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/module/project/js/edit.js b/module/project/js/edit.js index 321e55c715..dc5ed1f790 100644 --- a/module/project/js/edit.js +++ b/module/project/js/edit.js @@ -15,13 +15,14 @@ $(function() { changed = confirm(data.message); if(changed) - { + { /* Select change to the new program products. */ var lastProductSelect = $('#productsBox .input-group:last select:first'); - if($(lastProductSelect).val() == 0) { + if($(lastProductSelect).val() == 0) + { var lastProductSelectID = $(lastProductSelect).attr("id"); var lastProductSelectName = $(lastProductSelect).attr("name"); - $('#'+lastProductSelectID+'_chosen').remove(); + $('#' + lastProductSelectID + '_chosen').remove(); $(lastProductSelect).replaceWith(data.newProducts); $('#productsBox .input-group:last select:first').attr('name', lastProductSelectName).attr('id', lastProductSelectID).chosen(); } From 3b1933ca4306ef9fbde7e55c8df1ecf6ef8f497e Mon Sep 17 00:00:00 2001 From: holan20180123 Date: Tue, 3 Aug 2021 16:06:20 +0800 Subject: [PATCH 6/8] * Fix bug #14009. --- module/tree/model.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/module/tree/model.php b/module/tree/model.php index 9bfb5e20c5..e3a262bc7b 100644 --- a/module/tree/model.php +++ b/module/tree/model.php @@ -405,6 +405,12 @@ class treeModel extends model if($type == 'story' or $type == 'bug') { $branchLink = helper::createLink($this->app->rawModule, $this->app->rawMethod, "productID=$rootID&branch=$branchID&browseType=bybranch" . $extraParams); + + if($type == 'story' and $this->app->rawModule == 'projectstory') + { + $projectID = zget($extra, 'projectID', 0); + $branchLink = helper::createLink($this->app->rawModule, $this->app->rawMethod, "projectID=$projectID&productID=$rootID&branch=$branchID&browseType=bybranch" . $extraParams); + } $linkHtml = html::a($branchLink, $branch, "", "id=branch" . $branchID); } if($firstBranch and $product->type != 'normal') From 59b2e6f0f073336639712d535c0e1e4c551edac2 Mon Sep 17 00:00:00 2001 From: tianshujie98 Date: Tue, 3 Aug 2021 16:08:18 +0800 Subject: [PATCH 7/8] * Finish task #40834. --- module/product/config.php | 7 ++ module/product/model.php | 145 +++++++++++++------------------ module/product/view/all.html.php | 15 ++-- 3 files changed, 74 insertions(+), 93 deletions(-) diff --git a/module/product/config.php b/module/product/config.php index acfdef1152..7372c19c35 100644 --- a/module/product/config.php +++ b/module/product/config.php @@ -108,3 +108,10 @@ $config->product->report->projectLabels[] = ''; $config->product->report->planLabels = array(); $config->product->report->planLabels[] = ''; + +$config->product->statisticFields = array(); +$config->product->statisticFields['requirements'] = array('draftRequirements', 'activeRequirements', 'changedRequirements', 'closedRequirements'); +$config->product->statisticFields['stories'] = array('draftStories', 'activeStories', 'changedStories', 'closedStories'); +$config->product->statisticFields['bugs'] = array('unResolvedBugs', 'closedBugs', 'fixedBugs'); +$config->product->statisticFields['plans'] = array('plans'); +$config->product->statisticFields['releases'] = array('releases'); diff --git a/module/product/model.php b/module/product/model.php index a0c944e291..e31f0157be 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -1611,105 +1611,80 @@ class productModel extends model $productStructure[$product->program][$product->line]['products'][$product->id] = $product; if($product->line) { - /* Init vars. */ - if(!isset($productStructure[$product->program][$product->line]['totalRequirements'])) $productStructure[$product->program][$product->line]['totalRequirements'] = 0; - if(!isset($productStructure[$product->program][$product->line]['draftRequirments'])) $productStructure[$product->program][$product->line]['draftRequirments'] = 0; - if(!isset($productStructure[$product->program][$product->line]['activeRequirments'])) $productStructure[$product->program][$product->line]['activeRequirments'] = 0; - if(!isset($productStructure[$product->program][$product->line]['changedRequirments'])) $productStructure[$product->program][$product->line]['changedRequirments'] = 0; - if(!isset($productStructure[$product->program][$product->line]['closedRequirements'])) $productStructure[$product->program][$product->line]['closedRequirements'] = 0; - - if(!isset($productStructure[$product->program][$product->line]['totalStories'])) $productStructure[$product->program][$product->line]['totalStories'] = 0; - if(!isset($productStructure[$product->program][$product->line]['draftStories'])) $productStructure[$product->program][$product->line]['draftStories'] = 0; - if(!isset($productStructure[$product->program][$product->line]['activeStories'])) $productStructure[$product->program][$product->line]['activeStories'] = 0; - if(!isset($productStructure[$product->program][$product->line]['changedStories'])) $productStructure[$product->program][$product->line]['changedStories'] = 0; - if(!isset($productStructure[$product->program][$product->line]['closedStories'])) $productStructure[$product->program][$product->line]['closedStories'] = 0; - - if(!isset($productStructure[$product->program][$product->line]['unResolvedBugs'])) $productStructure[$product->program][$product->line]['unResolvedBugs'] = 0; - if(!isset($productStructure[$product->program][$product->line]['closedBugs'])) $productStructure[$product->program][$product->line]['closedBugs'] = 0; - if(!isset($productStructure[$product->program][$product->line]['fixedBugs'])) $productStructure[$product->program][$product->line]['fixedBugs'] = 0; - - if(!isset($productStructure[$product->program][$product->line]['plans'])) $productStructure[$product->program][$product->line]['plans'] = 0; - if(!isset($productStructure[$product->program][$product->line]['releases'])) $productStructure[$product->program][$product->line]['releases'] = 0; - /* Line name. */ $productStructure[$product->program][$product->line]['lineName'] = $product->lineName; - - /* Requirements. */ - $productStructure[$product->program][$product->line]['totalRequirements'] += $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changed']; - $productStructure[$product->program][$product->line]['draftRequirments'] += $product->requirements['draft']; - $productStructure[$product->program][$product->line]['activeRequirments'] += $product->requirements['active']; - $productStructure[$product->program][$product->line]['changedRequirments'] += $product->requirements['changed']; - $productStructure[$product->program][$product->line]['closedRequirements'] += $product->requirements['closed']; - - /* Stories. */ - $productStructure[$product->program][$product->line]['totalStories'] += $product->stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changed']; - $productStructure[$product->program][$product->line]['draftStories'] += $product->stories['draft']; - $productStructure[$product->program][$product->line]['activeStories'] += $product->stories['active']; - $productStructure[$product->program][$product->line]['changedStories'] += $product->stories['changed']; - $productStructure[$product->program][$product->line]['closedStories'] += $product->stories['closed']; - - /* Bugs. */ - $productStructure[$product->program][$product->line]['unResolvedBugs'] += $product->unResolved; - $productStructure[$product->program][$product->line]['closedBugs'] += $product->closedBugs; - $productStructure[$product->program][$product->line]['fixedBugs'] += $product->fixedBugs; - - /* Plans and releases. */ - $productStructure[$product->program][$product->line]['plans'] += $product->plans; - $productStructure[$product->program][$product->line]['releases'] += $product->releases; + $productStructure[$product->program][$product->line] = $this->statisticData('line', $productStructure, $product); } if($product->program) { /* Init vars. */ - if(!isset($productStructure[$product->program]['totalRequirements'])) $productStructure[$product->program]['totalRequirements'] = 0; - if(!isset($productStructure[$product->program]['draftRequirments'])) $productStructure[$product->program]['draftRequirments'] = 0; - if(!isset($productStructure[$product->program]['activeRequirments'])) $productStructure[$product->program]['activeRequirments'] = 0; - if(!isset($productStructure[$product->program]['changedRequirments'])) $productStructure[$product->program]['changedRequirments'] = 0; - if(!isset($productStructure[$product->program]['closedRequirements'])) $productStructure[$product->program]['closedRequirements'] = 0; - - if(!isset($productStructure[$product->program]['totalStories'])) $productStructure[$product->program]['totalStories'] = 0; - if(!isset($productStructure[$product->program]['draftStories'])) $productStructure[$product->program]['draftStories'] = 0; - if(!isset($productStructure[$product->program]['activeStories'])) $productStructure[$product->program]['activeStories'] = 0; - if(!isset($productStructure[$product->program]['changedStories'])) $productStructure[$product->program]['changedStories'] = 0; - if(!isset($productStructure[$product->program]['closedStories'])) $productStructure[$product->program]['closedStories'] = 0; - - if(!isset($productStructure[$product->program]['unResolvedBugs'])) $productStructure[$product->program]['unResolvedBugs'] = 0; - if(!isset($productStructure[$product->program]['closedBugs'])) $productStructure[$product->program]['closedBugs'] = 0; - if(!isset($productStructure[$product->program]['fixedBugs'])) $productStructure[$product->program]['fixedBugs'] = 0; - - if(!isset($productStructure[$product->program]['plans'])) $productStructure[$product->program]['plans'] = 0; - if(!isset($productStructure[$product->program]['releases'])) $productStructure[$product->program]['releases'] = 0; - /* Program name. */ $productStructure[$product->program]['programName'] = $product->programName; - - /* Requirements. */ - $productStructure[$product->program]['totalRequirements'] += $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changed']; - $productStructure[$product->program]['draftRequirments'] += $product->requirements['draft']; - $productStructure[$product->program]['activeRequirments'] += $product->requirements['active']; - $productStructure[$product->program]['changedRequirments'] += $product->requirements['changed']; - $productStructure[$product->program]['closedRequirements'] += $product->requirements['closed']; - - /* Stories. */ - $productStructure[$product->program]['totalStories'] += $product->stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changed']; - $productStructure[$product->program]['draftStories'] += $product->stories['draft']; - $productStructure[$product->program]['activeStories'] += $product->stories['active']; - $productStructure[$product->program]['changedStories'] += $product->stories['changed']; - $productStructure[$product->program]['closedStories'] += $product->stories['closed']; - - /* Bugs. */ - $productStructure[$product->program]['unResolvedBugs'] += $product->unResolved; - $productStructure[$product->program]['closedBugs'] += $product->closedBugs; - $productStructure[$product->program]['fixedBugs'] += $product->fixedBugs; - - /* Plans and releases. */ - $productStructure[$product->program]['plans'] += $product->plans; - $productStructure[$product->program]['releases'] += $product->releases; + $productStructure[$product->program] = $this->statisticData('program', $productStructure, $product); } } return $productStructure; } + /** + * Statistic product data. + * + * @param string $type + * @param array $productStructure + * @param object $product + * @access public + * @return void + */ + public function statisticData($type = 'program', $productStructure = array(), $product = null) + { + /* Init vars. */ + $data = $type == 'program' ? $productStructure[$product->program] : $productStructure[$product->program][$product->line]; + foreach($this->config->product->statisticFields as $key => $fields) + { + /* Get the total number of requirements and stories. */ + if(strpos('stories|requirements', $key) !== false) + { + $totalObjects = 0; + foreach($product->$key as $status => $number) + { + if(isset($this->lang->story->statusList[$status])) $totalObjects += $number; + } + + $fieldType = $key == 'stories' ? 'Stories' : 'Requirements'; + if(!isset($data['total' . $fieldType])) $data['total' . $fieldType] = 0; + $data['total' . $fieldType] += $totalObjects; + } + elseif($key == 'bugs') + { + $fieldType = 'Bugs'; + } + + foreach($fields as $field) + { + if(!isset($data[$field])) $data[$field] = 0; + + $status = $field; + if(strpos($field, 'Requirements') !== false or strpos($field, 'Stories') !== false or $field == 'unResolvedBugs') + { + $length = strpos($field, $fieldType); + $status = substr($field, 0, $length); + } + + if(strpos('requirements|stories', $key) !== false) + { + $objects = $product->$key; + $data[$field] += $objects[$status]; + } + else + { + $data[$field] += $product->$status; + } + } + } + return $data; + } + /** * Judge an action is clickable or not. * diff --git a/module/product/view/all.html.php b/module/product/view/all.html.php index bceb0ff86d..ec3c709f55 100644 --- a/module/product/view/all.html.php +++ b/module/product/view/all.html.php @@ -85,9 +85,9 @@ config->URAndSR):?> - - - + + + % @@ -111,8 +111,7 @@ if($this->config->systemMode == 'new' and $programID) { $trAttrs = "data-id='line.$lineID' data-parent='program.$programID'"; - $trClass .= ' is-nest-child table-nest text-center'; - $trAttrs .= " data-nest-parent='program.$programID' data-nest-path='program.$programID,$lineID'"; + $trAttrs .= " data-nest-parent='program.$programID' data-nest-path='program.$programID,$lineID'" . "class='text-center'"; } else { @@ -127,9 +126,9 @@ config->URAndSR):?> - - - + + + % From 5e08cd860eef08adba0530549656aa43eac1712c Mon Sep 17 00:00:00 2001 From: leiyong <1549684884@qq.com> Date: Tue, 3 Aug 2021 16:12:37 +0800 Subject: [PATCH 8/8] * Fix bug#14026. --- module/execution/view/create.html.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/module/execution/view/create.html.php b/module/execution/view/create.html.php index b51d33643c..707b4290f0 100644 --- a/module/execution/view/create.html.php +++ b/module/execution/view/create.html.php @@ -10,9 +10,6 @@ * @link http://www.zentao.net */ ?> -openApp == 'execution'): ?> - - systemMode == 'new' ? $this->createLink('project', 'execution', "status=all&projectID=$projectID") : $this->createLink('execution', 'task', 'executionID=' . $executionID);?>