diff --git a/config/filter.php b/config/filter.php index 39b722daec..8e093dc2e3 100755 --- a/config/filter.php +++ b/config/filter.php @@ -69,6 +69,7 @@ $filter->mr = new stdclass(); $filter->ci = new stdclass(); $filter->tree = new stdclass(); $filter->productplan = new stdclass(); +$filter->projectplan = new stdclass(); $filter->kanban = new stdclass(); $filter->index->index = new stdclass(); @@ -168,6 +169,7 @@ $filter->ci->checkCompileStatus = new stdclass(); $filter->execution->export = new stdclass(); $filter->tree->browse = new stdclass(); $filter->productplan->browse = new stdclass(); +$filter->projectplan->browse = new stdclass(); $filter->kanban->space = new stdclass(); $filter->index->index->get['open'] = 'reg::base64'; @@ -289,6 +291,7 @@ $filter->story->track->cookie['preBranch'] = 'reg::word'; $filter->story->track->cookie['preProductID'] = 'int'; $filter->productplan->browse->cookie['viewType'] = 'code'; +$filter->projectplan->browse->cookie['viewType'] = 'code'; $filter->task->create->cookie['lastTaskModule'] = 'int'; $filter->task->export->cookie['checkedItem'] = 'reg::checked'; diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php index 1365577762..e12288cddc 100644 --- a/module/common/lang/menu.php +++ b/module/common/lang/menu.php @@ -199,18 +199,19 @@ $lang->project->homeMenu->browse = array('link' => ($config->systemMode == 'new' if($config->systemMode == 'new') $lang->project->homeMenu->kanban = array('link' => "{$lang->project->kanban}|project|kanban|"); /* Scrum menu. */ -$lang->scrum->menu = new stdclass(); -$lang->scrum->menu->index = array('link' => "{$lang->dashboard}|project|index|project=%s"); -$lang->scrum->menu->execution = array('link' => "$lang->executionCommon|project|execution|status=all&projectID=%s", 'exclude' => 'execution-testreport', 'subModule' => 'task'); -$lang->scrum->menu->storyGroup = array('link' => "{$lang->common->story}|projectstory|story|projectID=%s&product=%s",'class' => 'dropdown dropdown-hover', 'exclude' => 'tree-browse'); -$lang->scrum->menu->story = array('link' => "$lang->SRCommon|projectstory|story|projectID=%s|story", 'subModule' => 'projectstory,tree', 'alias' => 'story,track'); -$lang->scrum->menu->doc = array('link' => "{$lang->doc->common}|doc|tableContents|type=project&objectID=%s", 'subModule' => 'doc'); -$lang->scrum->menu->qa = array('link' => "{$lang->qa->common}|project|bug|projectID=%s", 'subModule' => 'testcase,testtask,bug,testreport,execution', 'alias' => 'bug,testtask,testcase,testreport', 'exclude' => 'execution-create,execution-batchedit'); -$lang->scrum->menu->devops = array('link' => "{$lang->repo->common}|repo|browse|repoID=0&branchID=&objectID=%s", 'subModule' => 'repo'); -$lang->scrum->menu->build = array('link' => "{$lang->build->common}|project|build|project=%s"); -$lang->scrum->menu->release = array('link' => "{$lang->release->common}|projectrelease|browse|project=%s", 'subModule' => 'projectrelease'); -$lang->scrum->menu->dynamic = array('link' => "$lang->dynamic|project|dynamic|project=%s"); -$lang->scrum->menu->settings = array('link' => "$lang->settings|project|view|project=%s", 'subModule' => 'tree,stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist,team'); +$lang->scrum->menu = new stdclass(); +$lang->scrum->menu->index = array('link' => "{$lang->dashboard}|project|index|project=%s"); +$lang->scrum->menu->execution = array('link' => "$lang->executionCommon|project|execution|status=all&projectID=%s", 'exclude' => 'execution-testreport', 'subModule' => 'task'); +$lang->scrum->menu->storyGroup = array('link' => "{$lang->common->story}|projectstory|story|projectID=%s&product=%s",'class' => 'dropdown dropdown-hover', 'exclude' => 'tree-browse'); +$lang->scrum->menu->story = array('link' => "$lang->SRCommon|projectstory|story|projectID=%s|story", 'subModule' => 'projectstory,tree', 'alias' => 'story,track'); +$lang->scrum->menu->projectplan = array('link' => "{$lang->productplan->shortCommon}|projectplan|browse|productID=%s", 'subModule' => 'productplan'); +$lang->scrum->menu->doc = array('link' => "{$lang->doc->common}|doc|tableContents|type=project&objectID=%s", 'subModule' => 'doc'); +$lang->scrum->menu->qa = array('link' => "{$lang->qa->common}|project|bug|projectID=%s", 'subModule' => 'testcase,testtask,bug,testreport,execution', 'alias' => 'bug,testtask,testcase,testreport', 'exclude' => 'execution-create,execution-batchedit'); +$lang->scrum->menu->devops = array('link' => "{$lang->repo->common}|repo|browse|repoID=0&branchID=&objectID=%s", 'subModule' => 'repo'); +$lang->scrum->menu->build = array('link' => "{$lang->build->common}|project|build|project=%s"); +$lang->scrum->menu->release = array('link' => "{$lang->release->common}|projectrelease|browse|project=%s", 'subModule' => 'projectrelease'); +$lang->scrum->menu->dynamic = array('link' => "$lang->dynamic|project|dynamic|project=%s"); +$lang->scrum->menu->settings = array('link' => "$lang->settings|project|view|project=%s", 'subModule' => 'tree,stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist,team'); $lang->scrum->menu->storyGroup['dropMenu'] = new stdclass(); $lang->scrum->menu->storyGroup['dropMenu']->story = array('link' => "{$lang->SRCommon}|projectstory|story|projectID=%s&productID=%s", 'subModule' => 'projectstory,tree'); @@ -223,6 +224,7 @@ $lang->scrum->menuOrder[5] = 'index'; $lang->scrum->menuOrder[10] = 'execution'; $lang->scrum->menuOrder[15] = 'story'; $lang->scrum->menuOrder[16] = 'storyGroup'; +$lang->scrum->menuOrder[18] = 'projectplan'; $lang->scrum->menuOrder[20] = 'qa'; $lang->scrum->menuOrder[25] = 'devops'; $lang->scrum->menuOrder[30] = 'doc'; @@ -629,6 +631,7 @@ $lang->navGroup->stakeholder = 'project'; $lang->navGroup->projectbuild = 'project'; $lang->navGroup->projectstory = 'project'; +$lang->navGroup->projectplan = 'project'; $lang->navGroup->review = 'project'; $lang->navGroup->reviewissue = 'project'; $lang->navGroup->pssp = 'project'; diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index a0ff9f225b..97eee1a2a9 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -24,6 +24,7 @@ $lang->moduleOrder[35] = 'productplan'; $lang->moduleOrder[40] = 'release'; $lang->moduleOrder[45] = 'project'; +$lang->moduleOrder[48] = 'projectplan'; $lang->moduleOrder[50] = 'projectstory'; $lang->moduleOrder[55] = 'execution'; $lang->moduleOrder[56] = 'kanban'; @@ -314,6 +315,17 @@ if($config->systemMode == 'new') $lang->projectbuild->methodOrder[5] = 'browse'; + $lang->resource->projectplan = new stdclass(); + $lang->resource->projectplan->browse = 'browse'; + $lang->resource->projectplan->create = 'create'; + $lang->resource->projectplan->edit = 'edit'; + $lang->resource->projectplan->view = 'view'; + + $lang->projectbuild->methodOrder[5] = 'browse'; + $lang->projectbuild->methodOrder[10] = 'create'; + $lang->projectbuild->methodOrder[15] = 'edit'; + $lang->projectbuild->methodOrder[20] = 'view'; + /* Project Story. */ $lang->resource->projectstory = new stdclass(); $lang->resource->projectstory->story = 'story'; diff --git a/module/productplan/control.php b/module/productplan/control.php index 559c0d5c85..998874f72e 100644 --- a/module/productplan/control.php +++ b/module/productplan/control.php @@ -40,7 +40,14 @@ class productplan extends control $branchTagOption[$branchInfo->id] = $branchInfo->name . ($branchInfo->status == 'closed' ? ' (' . $this->lang->branch->statusList['closed'] . ')' : ''); } + if($product->shadow) + { + $projectID = $this->dao->select('project')->from(TABLE_PROJECTPRODUCT)->where('product')->eq($productID)->fetch('project'); + $this->loadModel('project')->setMenu($projectID); + } + $this->view->product = $product; + $this->view->projectID = isset($projectID) ? $projectID : 0; $this->view->branch = $branch; $this->view->branchOption = $branchOption; $this->view->branchTagOption = $branchTagOption; @@ -52,6 +59,7 @@ class productplan extends control * * @param string $productID * @param int $branchID + * @param int $parent * * @access public * @return void @@ -72,7 +80,7 @@ class productplan extends control if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $planID)); if(isonlybody()) return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => 'parent.refreshPlan()')); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('productplan', 'browse', "productID=$productID&branch=$branchID&browseType=all"))); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink($this->app->rawModule, 'browse', "productID=$productID&branch=$branchID&browseType=all"))); } $this->commonAction($productID, $branchID); @@ -139,7 +147,7 @@ class productplan extends control } $message = $this->executeHooks($planID); if($message) $this->lang->saveSuccess = $message; - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('view', "planID=$planID"))); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink($this->app->rawModule, 'view', "planID=$planID"))); } $plan = $this->productplan->getByID($planID); @@ -292,7 +300,7 @@ class productplan extends control * @access public * @return void */ - public function browse($productID = 0, $branch = '', $browseType = 'undone', $queryID = 0, $orderBy = 'begin_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1 ) + public function browse($productID = 0, $branch = '', $browseType = 'undone', $queryID = 0, $orderBy = 'begin_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { $branchID = $branch === '' ? 'all' : $branch; if(!$branch) $branch = 0; @@ -316,7 +324,7 @@ class productplan extends control /* Build the search form. */ $queryID = $browseType == 'bySearch' ? (int)$queryID : 0; - $actionURL = $this->createLink('productplan', 'browse', "productID=$productID&branch=$branch&browseType=bySearch&queryID=myQueryID&orderBy=$orderBy&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID"); + $actionURL = $this->createLink($this->app->rawModule, 'browse', "productID=$productID&branch=$branch&browseType=bySearch&queryID=myQueryID&orderBy=$orderBy&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID"); $this->productplan->buildSearchForm($queryID, $actionURL, $product); if($viewType == 'kanban') diff --git a/module/productplan/js/browse.js b/module/productplan/js/browse.js index 181748c902..83216e850c 100644 --- a/module/productplan/js/browse.js +++ b/module/productplan/js/browse.js @@ -47,7 +47,7 @@ $(function() $('#branch').change(function() { var branchID = $(this).val(); - var link = createLink('productplan', 'browse', "productID=" + productID + '&branch=' + branchID); + var link = createLink(rawModule, 'browse', "productID=" + productID + '&branch=' + branchID); location.href = link; }); @@ -148,9 +148,9 @@ function createCardMenu(options) } } - if(privs.includes('linkStory')) items.push({label: productplanLang.linkStory, icon: 'link', url: createLink('productplan', 'view', "planID=" + card.id + "&type=story&orderBy=id_desc&link=true")}); - if(privs.includes('linkBug')) items.push({label: productplanLang.linkBug, icon: 'bug', url: createLink('productplan', 'view', "planID=" + card.id + "&type=bug&orderBy=id_desc&link=true")}); - if(privs.includes('edit')) items.push({label: productplanLang.edit, icon: 'edit', url: createLink('productplan', 'edit', "planID=" + card.id)}); + if(privs.includes('linkStory')) items.push({label: productplanLang.linkStory, icon: 'link', url: createLink(rawModule, 'view', "planID=" + card.id + "&type=story&orderBy=id_desc&link=true")}); + if(privs.includes('linkBug')) items.push({label: productplanLang.linkBug, icon: 'bug', url: createLink(rawModule, 'view', "planID=" + card.id + "&type=bug&orderBy=id_desc&link=true")}); + if(privs.includes('edit')) items.push({label: productplanLang.edit, icon: 'edit', url: createLink(rawModule, 'edit', "planID=" + card.id)}); if(privs.includes('start')) items.push({label: productplanLang.start, icon: 'start', url: createLink('productplan', 'start', "planID=" + card.id), attrs: {'target': 'hiddenwin'}}); if(privs.includes('finish')) items.push({label: productplanLang.finish, icon: 'checked', url: createLink('productplan', 'finish', "planID=" + card.id), attrs: {'target': 'hiddenwin'}}); if(privs.includes('close')) items.push({label: productplanLang.close, icon: 'off', url: createLink('productplan', 'close', "planID=" + card.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal'}}); @@ -346,7 +346,7 @@ function renderKanbanItem(item, $item) var $title = $titleBox.children('.title'); if(!$title.length) { - if(privs.includes('view')) $title = $('').appendTo($titleBox).attr('href', createLink('productplan', 'view', 'cardID=' + item.id)); + if(privs.includes('view')) $title = $('').appendTo($titleBox).attr('href', createLink(rawModule, 'view', 'cardID=' + item.id)); if(!privs.includes('view')) $title = $('').appendTo($titleBox); } $title.text(item.title).attr('title', item.title); diff --git a/module/productplan/model.php b/module/productplan/model.php index 385ee5f43a..3d8c1ada05 100644 --- a/module/productplan/model.php +++ b/module/productplan/model.php @@ -1176,7 +1176,7 @@ class productplanModel extends model if(common::hasPriv('productplan', 'linkStory', $plan) and $plan->parent >= 0) { - $menu .= $this->buildMenu('productplan', 'view', "{$params}&type=story&orderBy=id_desc&link=true", $plan, $type, 'link', '', '', '', '', $this->lang->productplan->linkStory); + $menu .= $this->buildMenu($this->app->rawModule, 'view', "{$params}&type=story&orderBy=id_desc&link=true", $plan, $type, 'link', '', '', '', '', $this->lang->productplan->linkStory); } else { @@ -1185,17 +1185,17 @@ class productplanModel extends model if(common::hasPriv('productplan', 'linkBug', $plan) and $plan->parent >= 0) { - $menu .= $this->buildMenu('productplan', 'view', "{$params}&type=bug&orderBy=id_desc&link=true", $plan, $type, 'bug', '', '', '', '', $this->lang->productplan->linkBug); + $menu .= $this->buildMenu($this->app->rawModule, 'view', "{$params}&type=bug&orderBy=id_desc&link=true", $plan, $type, 'bug', '', '', '', '', $this->lang->productplan->linkBug); } else { $menu .= ""; } - $menu .= $this->buildMenu('productplan', 'edit', $params, $plan, $type); + $menu .= $this->buildMenu($this->app->rawModule, 'edit', $params, $plan, $type); } - $menu .= $this->buildMenu('productplan', 'create', "product={$plan->product}&branch={$plan->branch}&parent={$plan->id}", $plan, $type, 'split', '', '', '', '', $this->lang->productplan->children); + $menu .= $this->buildMenu($this->app->rawModule, 'create', "product={$plan->product}&branch={$plan->branch}&parent={$plan->id}", $plan, $type, 'split', '', '', '', '', $this->lang->productplan->children); if($type == 'browse') $menu .= $this->buildMenu('productplan', 'delete', "{$params}&confirm=no", $plan, $type, 'trash', 'hiddenwin', '', '', $this->lang->productplan->delete); @@ -1205,9 +1205,9 @@ class productplanModel extends model $menu .= $this->buildFlowMenu('productplan', $plan, $type, 'direct'); $menu .= "
"; - $editClickable = $this->buildMenu('productplan', 'edit', $params, $plan, $type, '', '', '', '', '', '', false); + $editClickable = $this->buildMenu($this->app->rawModule, 'edit', $params, $plan, $type, '', '', '', '', '', '', false); $deleteClickable = $this->buildMenu('productplan', 'delete', $params, $plan, $type, '', '', '', '', '', '', false); - if(common::hasPriv('productplan', 'edit') and $editClickable) $menu .= html::a(helper::createLink('productplan', 'edit', $params), " " . $this->lang->edit, '', "class='btn btn-link' title='{$this->lang->edit}'"); + if(common::hasPriv('productplan', 'edit') and $editClickable) $menu .= html::a(helper::createLink($this->app->rawModule, 'edit', $params), " " . $this->lang->edit, '', "class='btn btn-link' title='{$this->lang->edit}'"); if(common::hasPriv('productplan', 'delete') and $deleteClickable) $menu .= html::a(helper::createLink('productplan', 'delete', $params), " " . $this->lang->delete, '', "class='btn btn-link' title='{$this->lang->delete}' target='hiddenwin'"); } diff --git a/module/productplan/view/browsebykanban.html.php b/module/productplan/view/browsebykanban.html.php index 10ff417e03..59806a1094 100644 --- a/module/productplan/view/browsebykanban.html.php +++ b/module/productplan/view/browsebykanban.html.php @@ -32,6 +32,7 @@ .dropdown-menu > li > .disabled {pointer-events: none; color: #838a9d;} +rawModule);?> productplan);?> - id&branch=$branch", " {$lang->productplan->create}", '', "class='btn btn-primary'");?> + rawModule, 'create', "productID=$product->id&branch=$branch", " {$lang->productplan->create}", '', "class='btn btn-primary'");?> diff --git a/module/productplan/view/browsebylist.html.php b/module/productplan/view/browsebylist.html.php index a046895e57..22625faa6e 100644 --- a/module/productplan/view/browsebylist.html.php +++ b/module/productplan/view/browsebylist.html.php @@ -14,6 +14,7 @@ #productplanList .c-actions .btn+.btn {margin-left: -1px;} #productplanList .c-actions .btn {display: block; float: left;} +rawModule == 'projectplan';?> @@ -42,8 +45,9 @@

productplan->noPlan;?> - - createLink('productplan', 'create', "productID=$product->id&branch=$branch"), " " . $lang->productplan->create, '', "class='btn btn-info'");?> + + createLink('projectplan', 'create', "productID=$product->id&branch=$branch"), " " . $lang->productplan->create, '', "class='btn btn-info'");?> + createLink('productplan', 'create', "productID=$product->id&branch=$branch"), " " . $lang->productplan->create, '', "class='btn btn-info'");?>

@@ -111,7 +115,8 @@ - id => ''), '', $attribute) . html::a(helper::createLink('productplan', 'view', "planID=$plan->id"), sprintf('%03d', $plan->id));?> + id => ''), '', $attribute);?> + id"), sprintf('%03d', $plan->id)) : html::a(helper::createLink('productplan', 'view', "planID=$plan->id"), sprintf('%03d', $plan->id));?> id);?> @@ -128,7 +133,7 @@ echo "
"; if($plan->parent > 0) echo "{$this->lang->productplan->childrenAB}"; - echo html::a(inlink('view', "id=$plan->id"), $plan->title); + echo html::a($this->createLink($app->rawModule, 'view', "id=$plan->id"), $plan->title); if(!empty($expired)) echo $expired; if(isset($plan->children)) echo ''; echo '
'; diff --git a/module/productplan/view/view.html.php b/module/productplan/view/view.html.php index dfc20fdf79..0bf82d588f 100644 --- a/module/productplan/view/view.html.php +++ b/module/productplan/view/view.html.php @@ -79,16 +79,16 @@