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/css/common.css b/module/doc/css/common.css index 33ccef5d95..c0435d6c14 100644 --- a/module/doc/css/common.css +++ b/module/doc/css/common.css @@ -81,11 +81,11 @@ 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;} -#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;} 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'))); 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);?> 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) 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):?> - - - + + + % 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(); } 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')