diff --git a/module/bug/control.php b/module/bug/control.php index 99dd327aaa..14adcf78a4 100755 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -1158,6 +1158,7 @@ class bug extends control $branch = $product->type == 'branch' ? ($bug->branch > 0 ? $bug->branch . ',0' : '0') : ''; $productBugs = $this->bug->getProductBugPairs($productID, $branch); + unset($productBugs[$bugID]); $this->view->bug = $bug; $this->view->productID = $productID; @@ -1814,6 +1815,7 @@ class bug extends control $product = $this->loadModel('product')->getById($productID); $branch = $product->type == 'branch' ? ($bug->branch > 0 ? $bug->branch . ',0' : '0') : ''; $productBugs = $this->bug->getProductBugPairs($productID, $branch); + unset($productBugs[$bugID]); $this->bug->checkBugExecutionPriv($bug); $this->qa->setMenu($this->products, $productID, $bug->branch); diff --git a/module/bug/view/batchedit.html.php b/module/bug/view/batchedit.html.php index f1e9c9c348..89d343479d 100644 --- a/module/bug/view/batchedit.html.php +++ b/module/bug/view/batchedit.html.php @@ -143,7 +143,11 @@ resolution, "class='form-control' onchange=setDuplicate(this.value,$bugID)");?> ' resolution != 'duplicate') echo "style='display:none'";?>> - product][$bug->branch], $bug->duplicateBug, "class='form-control' placeholder='{$lang->bug->duplicateTip}'");?> + product][$bug->branch]; + if(isset($productBugs[$bug->id])) unset($productBugs[$bug->id]); + ?> + duplicateBug, "class='form-control' placeholder='{$lang->bug->duplicateTip}'");?> diff --git a/module/execution/control.php b/module/execution/control.php index 2c5b30db86..efc0e4a767 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -3183,7 +3183,7 @@ class execution extends control { $this->project->setMenu($object->id); } - elseif($object->type == 'sprint' or $object->type == 'stage') + elseif($object->type == 'sprint' or $object->type == 'stage' or $object->type == 'kanban') { $this->execution->setMenu($object->id); } diff --git a/module/execution/css/kanban.css b/module/execution/css/kanban.css index e167b91aba..31b965666b 100644 --- a/module/execution/css/kanban.css +++ b/module/execution/css/kanban.css @@ -121,3 +121,4 @@ #kanban .kanban-affixed .kanban-header-col .title.action-dbc {pointer-events: none;} #kanban .kanban-affixed .kanban-header-col .title.action-dbc .storyColumn .text {color: #fff;} #kanban .kanban-affixed .kanban-header-col .title.action-dbc .storyColumn .caret {display: none;} +.kanban-card a[disabled] {color: #313c52;} diff --git a/module/execution/css/taskkanban.css b/module/execution/css/taskkanban.css index c9adfef160..6d02e68754 100644 --- a/module/execution/css/taskkanban.css +++ b/module/execution/css/taskkanban.css @@ -73,3 +73,4 @@ #kanbans .kanban-affixed .kanban-header-col .title.action-dbc {pointer-events: none;} #kanbans .kanban-affixed .kanban-header-col .title.action-dbc .storyColumn .text {color: #fff;} #kanbans .kanban-affixed .kanban-header-col .title.action-dbc .storyColumn .caret {display: none;} +.kanban-card a[disabled] {color: #313c52;} diff --git a/module/execution/view/edit.html.php b/module/execution/view/edit.html.php index 5f98f51b32..27a7b10be2 100644 --- a/module/execution/view/edit.html.php +++ b/module/execution/view/edit.html.php @@ -179,6 +179,9 @@
+ +
+ id] as $branchID => $branch):?> id][$branchID]) ? $productPlans[$product->id][$branchID] : array();?> @@ -186,6 +189,7 @@ +
diff --git a/module/execution/view/testcase.html.php b/module/execution/view/testcase.html.php index 8ea2460d6a..861ccf63b5 100644 --- a/module/execution/view/testcase.html.php +++ b/module/execution/view/testcase.html.php @@ -13,7 +13,7 @@
- {$lang->execution->featureBar['all']['all']}", '', "class='btn btn-link btn-active-text'");?> + {$lang->execution->featureBar['all']['all']} {$pager->recTotal}", '', "class='btn btn-link btn-active-text'");?>
id", '', '', '', true), " " . $lang->testcase->create, '', "class='btn btn-primary' data-app='{$this->app->tab}'");?> diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 6f8d39a5b8..6d4b921759 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -1446,6 +1446,7 @@ $(function() { initKanban($(this)); }); + initRegionTabs(); if(navigator.userAgent.toLowerCase().indexOf("qqbrowser") > -1) $('.region .kanban-header-col > .actions').css('top', '30%'); diff --git a/module/my/control.php b/module/my/control.php index 10d4d4cf94..e148b6144e 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -1517,7 +1517,6 @@ EOF; $this->session->set('designList', $uri, 'project'); $this->session->set('productPlanList', $uri, 'product'); $this->session->set('releaseList', $uri, 'product'); - $this->session->set('programList', $uri, 'program'); $this->session->set('projectList', $uri, 'project'); $this->session->set('executionList', $uri, 'execution'); $this->session->set('taskList', $uri, 'execution'); diff --git a/module/my/view/project.html.php b/module/my/view/project.html.php index 264a24a824..2fc86b3206 100644 --- a/module/my/view/project.html.php +++ b/module/my/view/project.html.php @@ -36,13 +36,13 @@ idAB);?> project->name);?> + project->PM);?> project->status);?> + project->budget);?> project->begin);?> project->end);?> - project->budget);?> - project->PM);?> actions;?> @@ -53,21 +53,21 @@ createLink('project', 'index', "projectID=$project->id", '', '', $project->id), $project->name, '', "data-group='project' title='{$project->name} ({$this->lang->project->{$project->model}})'");?> - - project->statusList, $project->status, '');?> - - begin;?> - end == LONG_TIME ? $this->lang->project->longTime : $project->end;?> - app->getClientLang(), array('zh-cn','zh-tw')) ? round((float)$project->budget / 10000, 2) . $this->lang->project->tenThousand : round((float)$project->budget, 2);?> - budget != 0 ? zget($lang->project->currencySymbol, $project->budgetUnit) . ' ' . $projectBudget : $lang->project->future;?> PM)):?> PM);?> - $usersAvatar[$project->PM], 'account' => $project->PM, 'name' => $userName), "avatar-circle avatar-top avatar-{$project->PM}"); ?> + $usersAvatar[$project->PM], 'account' => $project->PM, 'name' => $userName), "avatar-circle avatar-{$project->PM}"); ?> PM]) ? $PMList[$project->PM]->id : '';?> createLink('user', 'profile', "userID=$userID", '', true), $userName, '', "title='{$userName}' data-toggle='modal' data-type='iframe' data-width='600'");?> + + project->statusList, $project->status, '');?> + + app->getClientLang(), array('zh-cn','zh-tw')) ? round((float)$project->budget / 10000, 2) . $this->lang->project->tenThousand : round((float)$project->budget, 2);?> + budget != 0 ? zget($lang->project->currencySymbol, $project->budgetUnit) . ' ' . $projectBudget : $lang->project->future;?> + begin;?> + end == LONG_TIME ? $this->lang->project->longTime : $project->end;?> status == 'wait' || $project->status == 'suspended') common::printIcon('project', 'start', "projectID=$project->id", $project, 'list', 'play', '', 'iframe', true);?> status == 'doing') common::printIcon('project', 'close', "projectID=$project->id", $project, 'list', 'off', '', 'iframe', true);?> diff --git a/module/product/config.php b/module/product/config.php index c42c6ce6bd..ac10fd7bfa 100644 --- a/module/product/config.php +++ b/module/product/config.php @@ -11,7 +11,7 @@ $config->product->custom->batchEditFields = 'line,PO,QD,RD'; if($config->systemMode == 'new') $config->product->custom->batchEditFields .= ',program'; $config->product->list = new stdclass(); -$config->product->list->exportFields = 'id,program,line,name,activeRequirements,changedRequirements,draftRequirements,closedRequirements,requireCompleteRate,activeStories,changedStories,draftStories,closedStories,storyCompleteRate,plans,releases,bugs,unResolvedBugs,assignToNullBugs,closedBugs,bugFixedRate'; +$config->product->list->exportFields = 'id,program,line,name,manager,draftStories,activeStories,changedStories,reviewingStories,closedStories,storyCompleteRate,bugs,unResolvedBugs,assignToNullBugs,bugFixedRate,plans,releases'; $config->product->showBranchMethod = 'browse,project'; diff --git a/module/product/control.php b/module/product/control.php index 2bd4c6fb33..66833d346f 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -1440,7 +1440,6 @@ class product extends control $productConfig = $this->config->product; /* Create field lists. */ - if(!$this->config->URAndSR) $productConfig->list->exportFields = str_replace('activeRequirements,changedRequirements,draftRequirements,closedRequirements,requireCompleteRate,', '', $productConfig->list->exportFields); $fields = $this->post->exportFields ? $this->post->exportFields : explode(',', $productConfig->list->exportFields); foreach($fields as $key => $fieldName) { @@ -1451,28 +1450,21 @@ class product extends control $lastProgram = $lastLine = ''; $lines = $this->product->getLinePairs(); + $users = $this->user->getPairs('noletter'); $productStats = $this->product->getStats('program_desc,line_desc,' . $orderBy, null, $status); foreach($productStats as $i => $product) { - $product->line = zget($lines, $product->line, ''); - if($this->config->URAndSR) - { - $product->activeRequirements = (int) $product->requirements['active']; - $product->changedRequirements = (int) $product->requirements['changing']; - $product->draftRequirements = (int) $product->requirements['draft']; - $product->closedRequirements = (int) $product->requirements['closed']; - $product->totalRequirements = $product->activeRequirements + $product->changedRequirements + $product->draftRequirements + $product->closedRequirements; - $product->requireCompleteRate = ($product->totalRequirements == 0 ? 0 : round($product->closedRequirements / $product->totalRequirements, 3) * 100) . '%'; - } + $product->line = zget($lines, $product->line, ''); + $product->manager = zget($users, $product->PO, ''); + $product->draftStories = (int)$product->stories['draft']; $product->activeStories = (int)$product->stories['active']; $product->changedStories = (int)$product->stories['changing']; - $product->draftStories = (int)$product->stories['draft']; + $product->reviewingStories = (int)$product->stories['reviewing']; $product->closedStories = (int)$product->stories['closed']; - $product->totalStories = $product->activeStories + $product->changedStories + $product->draftStories + $product->closedStories; + $product->totalStories = $product->activeStories + $product->changedStories + $product->draftStories + $product->closedStories + $product->reviewingStories; $product->storyCompleteRate = ($product->totalStories == 0 ? 0 : round($product->closedStories / $product->totalStories, 3) * 100) . '%'; $product->unResolvedBugs = (int)$product->unResolved; $product->assignToNullBugs = (int)$product->assignToNull; - $product->closedBugs = (int)$product->closedBugs; $product->bugFixedRate = (($product->unResolved + $product->fixedBugs) == 0 ? 0 : round($product->fixedBugs / ($product->unResolved + $product->fixedBugs), 3) * 100) . '%'; $product->program = $product->programName; diff --git a/module/product/lang/de.php b/module/product/lang/de.php index 913c2c6eda..0b6f2d3c81 100644 --- a/module/product/lang/de.php +++ b/module/product/lang/de.php @@ -72,6 +72,8 @@ $lang->product->changedStories = 'Geänderte [S]'; $lang->product->changedStoriesTitle = 'Changed Stories'; $lang->product->draftStories = 'Entwurf [S]'; $lang->product->draftStoriesTitle = 'Draft Stories'; +$lang->product->reviewingStories = "Reviewing [S]"; +$lang->product->reviewingStoriesTitle = "Reviewing Stories"; $lang->product->closedStories = 'Geschlossene [S]'; $lang->product->closedStoriesTitle = 'Closed Stories'; $lang->product->storyCompleteRate = "{$lang->SRCommon} Completion rate"; diff --git a/module/product/lang/en.php b/module/product/lang/en.php index bf6a91a961..6fbdd044da 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -72,6 +72,8 @@ $lang->product->changedStories = 'Changed [S]'; $lang->product->changedStoriesTitle = 'Changed Stories'; $lang->product->draftStories = 'Draft [S]'; $lang->product->draftStoriesTitle = 'Draft Stories'; +$lang->product->reviewingStories = "Reviewing [S]"; +$lang->product->reviewingStoriesTitle = "Reviewing Stories"; $lang->product->closedStories = 'Closed [S]'; $lang->product->closedStoriesTitle = 'Closed Stories'; $lang->product->storyCompleteRate = "{$lang->SRCommon} Completion rate"; diff --git a/module/product/lang/fr.php b/module/product/lang/fr.php index 6154559fac..bd7f8e0ce0 100644 --- a/module/product/lang/fr.php +++ b/module/product/lang/fr.php @@ -72,6 +72,8 @@ $lang->product->changedStories = 'Changées [S]'; $lang->product->changedStoriesTitle = 'Stories Modifiées'; $lang->product->draftStories = 'Brouillon [S]'; $lang->product->draftStoriesTitle = 'Stories en Analyse'; +$lang->product->reviewingStories = "Reviewing [S]"; +$lang->product->reviewingStoriesTitle = "Reviewing Stories"; $lang->product->closedStories = 'Fermées [S]'; $lang->product->closedStoriesTitle = 'Stories Fermées'; $lang->product->storyCompleteRate = "{$lang->SRCommon} Completion rate"; diff --git a/module/product/lang/zh-cn.php b/module/product/lang/zh-cn.php index 6d33a54d1f..46dad4abdc 100644 --- a/module/product/lang/zh-cn.php +++ b/module/product/lang/zh-cn.php @@ -72,6 +72,8 @@ $lang->product->changedStories = "已变更{$lang->SRCommon}"; $lang->product->changedStoriesTitle = "已变更{$lang->SRCommon}"; $lang->product->draftStories = "草稿{$lang->SRCommon}"; $lang->product->draftStoriesTitle = "草稿{$lang->SRCommon}"; +$lang->product->reviewingStories = "评审中{$lang->SRCommon}"; +$lang->product->reviewingStoriesTitle = "评审中{$lang->SRCommon}"; $lang->product->closedStories = "已关闭{$lang->SRCommon}"; $lang->product->closedStoriesTitle = "已关闭{$lang->SRCommon}"; $lang->product->storyCompleteRate = "{$lang->SRCommon}完成率"; diff --git a/module/productplan/lang/de.php b/module/productplan/lang/de.php index e87334e50d..088f41c66b 100644 --- a/module/productplan/lang/de.php +++ b/module/productplan/lang/de.php @@ -73,6 +73,8 @@ $lang->productplan->cannotDeleteParent = 'Cannot delete parent plan'; $lang->productplan->selectProjects = "Please select the project"; $lang->productplan->projectNotEmpty = 'Project cannot be empty.'; $lang->productplan->nextStep = "Next step"; +$lang->productplan->summary = "Total: %s, Parents: %s, Children: %s."; +$lang->productplan->checkedSummary = "Seleted: %total%, Parents: %parent%, Children: %child%."; $lang->productplan->id = 'ID'; $lang->productplan->product = $lang->productCommon; diff --git a/module/productplan/lang/en.php b/module/productplan/lang/en.php index da23bd9127..2807a5eddc 100644 --- a/module/productplan/lang/en.php +++ b/module/productplan/lang/en.php @@ -73,6 +73,8 @@ $lang->productplan->cannotDeleteParent = 'Cannot delete parent plan'; $lang->productplan->selectProjects = "Please select the project"; $lang->productplan->projectNotEmpty = 'Project cannot be empty.'; $lang->productplan->nextStep = "Next step"; +$lang->productplan->summary = "Total: %s, Parents: %s, Children: %s."; +$lang->productplan->checkedSummary = "Seleted: %total%, Parents: %parent%, Children: %child%."; $lang->productplan->id = 'ID'; $lang->productplan->product = $lang->productCommon; diff --git a/module/productplan/lang/fr.php b/module/productplan/lang/fr.php index 8b45ee16bf..3f9b50d086 100644 --- a/module/productplan/lang/fr.php +++ b/module/productplan/lang/fr.php @@ -73,6 +73,8 @@ $lang->productplan->cannotDeleteParent = 'Impossible de supprimer le plan parent $lang->productplan->selectProjects = "Please select the project"; $lang->productplan->projectNotEmpty = 'Project cannot be empty.'; $lang->productplan->nextStep = "Next step"; +$lang->productplan->summary = "Total: %s, Parents: %s, Children: %s."; +$lang->productplan->checkedSummary = "Seleted: %total%, Parents: %parent%, Children: %child%."; $lang->productplan->id = 'ID'; $lang->productplan->product = $lang->productCommon; diff --git a/module/productplan/lang/zh-cn.php b/module/productplan/lang/zh-cn.php index 4a93f1a59d..1c4abdb050 100644 --- a/module/productplan/lang/zh-cn.php +++ b/module/productplan/lang/zh-cn.php @@ -73,6 +73,8 @@ $lang->productplan->cannotDeleteParent = "不能删除父计划"; $lang->productplan->selectProjects = "请选择所属项目"; $lang->productplan->projectNotEmpty = '所属项目不能为空。'; $lang->productplan->nextStep = "下一步"; +$lang->productplan->summary = "本页共 %s 个计划,父计划 %s,子计划 %s。"; +$lang->productplan->checkedSummary = "共选中 %total% 个计划,父计划 %parent%,子计划 %child%。"; $lang->productplan->id = '编号'; $lang->productplan->product = $lang->productCommon; diff --git a/module/productplan/model.php b/module/productplan/model.php index d07ec90341..f2481a291c 100644 --- a/module/productplan/model.php +++ b/module/productplan/model.php @@ -1184,7 +1184,7 @@ class productplanModel extends model $menu .= ""; } - if(($canStart or $canFinish or $canClose or $canCreateExec) and ($canLinkStory or $canLinkBug or $canEdit or $canCreateChild or $canDelete)) + if($type == 'browse' and ($canStart or $canFinish or $canClose or $canCreateExec) and ($canLinkStory or $canLinkBug or $canEdit or $canCreateChild or $canDelete)) { $menu .= "
"; } @@ -1212,7 +1212,7 @@ class productplanModel extends model $menu .= $this->buildMenu('productplan', 'create', "product={$plan->product}&branch={$plan->branch}&parent={$plan->id}", $plan, $type, 'split', '', '', '', '', $this->lang->productplan->children); - if(($canLinkStory or $canLinkBug or $canEdit or $canCreateChild) and $canDelete) + if($type == 'browse' and ($canLinkStory or $canLinkBug or $canEdit or $canCreateChild) and $canDelete) { $menu .= "
"; } diff --git a/module/productplan/view/browsebylist.html.php b/module/productplan/view/browsebylist.html.php index e488ec94f8..8c9fab7c55 100644 --- a/module/productplan/view/browsebylist.html.php +++ b/module/productplan/view/browsebylist.html.php @@ -33,6 +33,8 @@
+ +

@@ -43,7 +45,7 @@

-
id&branch=$branch")?>'> + id&branch=$branch")?>'> recTotal}&recPerPage={$pager->recPerPage}"; ?> @@ -89,10 +91,13 @@ { $parent = $plan->id; $children = isset($plan->children) ? $plan->children : 0; + + $totalParent ++; } if($plan->parent == 0) $parent = 0; if(!empty($parent) and $plan->parent > 0 and $plan->parent != $parent) $parent = 0; if($plan->parent <= 0) $i = 0; + if($plan->parent > 0) $totalChild ++; $class = ''; if(!empty($parent) and $plan->parent == $parent) @@ -103,7 +108,7 @@ $i++; } ?> - + - + @@ -62,6 +62,7 @@ + @@ -69,10 +70,7 @@ - stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changing']; - $totalRequirements = $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changing']; - ?> + stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changing'] + $product->stories['reviewing'];?> + diff --git a/module/project/control.php b/module/project/control.php index 509c7f9ced..63dbbcca00 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -63,7 +63,7 @@ class project extends control $project->PM = zget($users, $project->PM); $project->status = $this->processStatus('project', $project); $project->model = zget($projectLang->modelList, $project->model); - $project->budget = $project->budget . zget($projectLang->unitList, $project->budgetUnit); + $project->budget = $project->budget != 0 ? $project->budget . zget($projectLang->unitList, $project->budgetUnit) : $this->lang->project->future; $project->parent = $project->parentName; $linkedProducts = $this->product->getProducts($project->id, 'all', '', false); diff --git a/module/project/view/browsebylist.html.php b/module/project/view/browsebylist.html.php index 6294bfa540..9bde07f790 100644 --- a/module/project/view/browsebylist.html.php +++ b/module/project/view/browsebylist.html.php @@ -18,8 +18,6 @@ .project-name > span, .project-name > span {flex: none;} .project-name > a {display: inline-block; max-width: calc(100% - 50px);} -.project-name.has-prefix > a, -.project-name.has-suffix > a {max-width: calc(100% - 100px);} .project-name.has-prefix > a {padding-left: 5px;} .project-name.has-suffix > a {padding-right: 5px;} diff --git a/module/story/control.php b/module/story/control.php index 3af6deb41d..d5b74f0ca0 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -421,7 +421,7 @@ class story extends control $this->view->mailto = $mailto; $this->view->blockID = $blockID; $this->view->URS = $storyType == 'story' ? $this->story->getRequirements($productID) : ''; - $this->view->needReview = ($this->app->user->account == $product->PO || $objectID > 0 || $this->config->story->needReview == 0) ? "checked='checked'" : ""; + $this->view->needReview = ($this->app->user->account == $product->PO or $objectID > 0 or $this->config->story->needReview == 0 or !$this->story->checkForceReview()) ? "checked='checked'" : ""; $this->view->type = $storyType; $this->display(); @@ -687,7 +687,7 @@ class story extends control $this->view->branch = $branch; $this->view->branches = $branches; /* When the user is product owner or add story in project or not set review, the default is not to review. */ - $this->view->needReview = ($this->app->user->account == $product->PO || $executionID > 0 || $this->config->story->needReview == 0) ? 0 : 1; + $this->view->needReview = ($this->app->user->account == $product->PO or $executionID > 0 or $this->config->story->needReview == 0 or !$this->story->checkForceReview()) ? 0 : 1; $this->view->forceReview = $this->story->checkForceReview(); $this->view->executionID = $executionID; @@ -1150,7 +1150,7 @@ class story extends control $this->view->title = $this->lang->story->change . "STORY" . $this->lang->colon . $this->view->story->title; $this->view->users = $this->user->getPairs('pofirst|nodeleted|noclosed', $this->view->story->assignedTo); $this->view->position[] = $this->lang->story->change; - $this->view->needReview = (($this->app->user->account == $this->view->product->PO or $this->config->story->needReview == 0) and empty($reviewer)) ? "checked='checked'" : ""; + $this->view->needReview = (($this->app->user->account == $this->view->product->PO or $this->config->story->needReview == 0 or !$this->story->checkForceReview()) and empty($reviewer)) ? "checked='checked'" : ""; $this->view->reviewer = implode(',', array_keys($reviewer)); $this->view->productReviewers = $this->user->getPairs('noclosed|nodeleted', $reviewer, 0, $productReviewers); @@ -1572,7 +1572,7 @@ class story extends control $this->view->actions = $this->action->getList('story', $storyID); $this->view->reviewers = $this->user->getPairs('noclosed|nodeleted', '', 0, $reviewers); $this->view->users = $this->user->getPairs('noclosed|noletter'); - $this->view->needReview = (($this->app->user->account == $product->PO || $this->config->story->needReview == 0) and empty($story->reviewer)) ? "checked='checked'" : ""; + $this->view->needReview = (($this->app->user->account == $product->PO or $this->config->story->needReview == 0 or !$this->story->checkForceReview()) and empty($story->reviewer)) ? "checked='checked'" : ""; $this->display(); }
id => ''), '', $attribute) . html::a(helper::createLink('productplan', 'view', "planID=$plan->id"), sprintf('%03d', $plan->id));?> @@ -179,8 +184,34 @@ +
productplan->summary, count($plans), $totalParent, $totalChild);?>
show('right', 'pagerjs');?> + diff --git a/module/program/control.php b/module/program/control.php index 02ce9e373c..7aebc08e59 100644 --- a/module/program/control.php +++ b/module/program/control.php @@ -196,7 +196,8 @@ class program extends control if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); $this->loadModel('action')->create('program', $programID, 'opened'); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $programID, 'locate' => $this->session->programList)); + $locateLink = $this->session->programList ? $this->session->programList : $this->createLink('program', 'browse'); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $programID, 'locate' => $locateLink)); } $extra = str_replace(array(',', ' '), array('&', ''), $extra); diff --git a/module/program/view/product.html.php b/module/program/view/product.html.php index 400629ea9b..1ee1d0ae63 100644 --- a/module/program/view/product.html.php +++ b/module/program/view/product.html.php @@ -52,7 +52,7 @@
product->name);?> product->manager);?>story->story;?>story->story;?> bug->common;?> product->plan;?> product->release;?>story->draft;?> story->activate;?> story->change;?>story->review;?> story->completeRate;?> bug->activate;?> bug->fixedRate;?>
@@ -96,6 +94,7 @@ stories['draft'];?> stories['active'];?> stories['changing'];?>stories['reviewing'];?> stories['closed'] / $totalStories, 3) * 100;?>% unResolved;?> unResolved + $product->fixedBugs) == 0 ? 0 : round($product->fixedBugs / ($product->unResolved + $product->fixedBugs), 3) * 100;?>%