* Finish task#8956.
This commit is contained in:
@@ -899,7 +899,7 @@ $lang->menu = new stdclass();
|
||||
$lang->menu->scrum = new stdclass();
|
||||
$lang->menu->scrum->programindex = 'Index|program|index|project={PROJECT}';
|
||||
$lang->menu->scrum->project = "$lang->executionCommon|project|index|locate=no";
|
||||
$lang->menu->scrum->projectstory = array('link' => 'Story|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->scrum->projectstory = array('link' => 'Story|projectstory|story', 'subModule' => 'story', 'alias' => 'story,track');
|
||||
$lang->menu->scrum->doc = 'Doc|doc|index|';
|
||||
$lang->menu->scrum->qa = 'QA|qa|index';
|
||||
$lang->menu->scrum->ci = 'Code|repo|browse';
|
||||
@@ -925,7 +925,7 @@ $lang->menu->waterfall->programplan = array('link' => 'Plan|programplan|brows
|
||||
$lang->menu->waterfall->project = array('link' => $lang->executionCommon . '|project|task|projectID={PROJECT}', 'subModule' => ',project,task,');
|
||||
$lang->menu->waterfall->doc = array('link' => 'Doc|doc|index|program={PROJECT}');
|
||||
$lang->menu->waterfall->weekly = array('link' => 'Weekly|weekly|index|program={PROJECT}', 'subModule' => ',milestone,');
|
||||
$lang->menu->waterfall->projectstory = array('link' => 'Story|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->waterfall->projectstory = array('link' => 'Story|projectstory|story', 'alias' => 'story,track');
|
||||
$lang->menu->waterfall->design = 'Design|design|browse|product={PRODUCT}';
|
||||
$lang->menu->waterfall->ci = 'Code|repo|browse|';
|
||||
$lang->menu->waterfall->qa = 'Index|qa|index';
|
||||
@@ -993,9 +993,8 @@ $lang->budget->menu = $lang->workestimation->menu;
|
||||
$lang->programplan->menu->gantt = array('link' => 'Gantt|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=gantt');
|
||||
$lang->programplan->menu->lists = array('link' => 'Stage|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=lists', 'alias' => 'create');
|
||||
|
||||
$lang->projectstory->menu->requirement = array('link' => "{$lang->URCommon}|projectstory|requirement", 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => '');
|
||||
$lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => 'story,project', 'alias' => 'linkstory');
|
||||
$lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => '');
|
||||
|
||||
$lang->nc->menu = $lang->auditplan->menu;
|
||||
$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'job', 'jenkins', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'stage');
|
||||
|
||||
@@ -899,7 +899,7 @@ $lang->menu = new stdclass();
|
||||
$lang->menu->scrum = new stdclass();
|
||||
$lang->menu->scrum->programindex = 'Index|program|index|project={PROJECT}';
|
||||
$lang->menu->scrum->project = "$lang->executionCommon|project|index|locate=no";
|
||||
$lang->menu->scrum->projectstory = array('link' => 'Story|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->scrum->projectstory = array('link' => 'Story|projectstory|story', 'subModule' => 'story', 'alias' => 'story,track');
|
||||
$lang->menu->scrum->doc = 'Doc|doc|index|';
|
||||
$lang->menu->scrum->qa = 'QA|qa|index';
|
||||
$lang->menu->scrum->ci = 'Code|repo|browse';
|
||||
@@ -925,7 +925,7 @@ $lang->menu->waterfall->programplan = array('link' => 'Plan|programplan|brows
|
||||
$lang->menu->waterfall->project = array('link' => $lang->executionCommon . '|project|task|projectID={PROJECT}', 'subModule' => ',project,task,');
|
||||
$lang->menu->waterfall->doc = array('link' => 'Doc|doc|index|program={PROJECT}');
|
||||
$lang->menu->waterfall->weekly = array('link' => 'Weekly|weekly|index|program={PROJECT}', 'subModule' => ',milestone,');
|
||||
$lang->menu->waterfall->projectstory = array('link' => 'Story|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->waterfall->projectstory = array('link' => 'Story|projectstory|story', 'alias' => 'story,track');
|
||||
$lang->menu->waterfall->design = 'Design|design|browse|product={PRODUCT}';
|
||||
$lang->menu->waterfall->ci = 'Code|repo|browse|';
|
||||
$lang->menu->waterfall->qa = 'Index|qa|index';
|
||||
@@ -993,9 +993,8 @@ $lang->budget->menu = $lang->workestimation->menu;
|
||||
$lang->programplan->menu->gantt = array('link' => 'Gantt|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=gantt');
|
||||
$lang->programplan->menu->lists = array('link' => 'Stage|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=lists', 'alias' => 'create');
|
||||
|
||||
$lang->projectstory->menu->requirement = array('link' => "{$lang->URCommon}|projectstory|requirement", 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => '');
|
||||
$lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => 'story,project', 'alias' => 'linkstory');
|
||||
$lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => '');
|
||||
|
||||
$lang->nc->menu = $lang->auditplan->menu;
|
||||
$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'job', 'jenkins', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'stage');
|
||||
|
||||
@@ -902,7 +902,7 @@ $lang->menu = new stdclass();
|
||||
$lang->menu->scrum = new stdclass();
|
||||
$lang->menu->scrum->programindex = 'Index|program|index|project={PROJECT}';
|
||||
$lang->menu->scrum->project = "$lang->executionCommon|project|index|locate=no";
|
||||
$lang->menu->scrum->projectstory = array('link' => 'Story|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->scrum->projectstory = array('link' => 'Story|projectstory|story', 'subModule' => 'story', 'alias' => 'story,track');
|
||||
$lang->menu->scrum->doc = 'Doc|doc|index|';
|
||||
$lang->menu->scrum->qa = 'QA|qa|index';
|
||||
$lang->menu->scrum->ci = 'Code|repo|browse';
|
||||
@@ -928,7 +928,7 @@ $lang->menu->waterfall->programplan = array('link' => 'Plan|programplan|brows
|
||||
$lang->menu->waterfall->project = array('link' => $lang->executionCommon . '|project|task|projectID={PROJECT}', 'subModule' => ',project,task,');
|
||||
$lang->menu->waterfall->doc = array('link' => 'Doc|doc|index|program={PROJECT}');
|
||||
$lang->menu->waterfall->weekly = array('link' => 'Weekly|weekly|index|program={PROJECT}', 'subModule' => ',milestone,');
|
||||
$lang->menu->waterfall->projectstory = array('link' => 'Story|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->waterfall->projectstory = array('link' => 'Story|projectstory|story', 'alias' => 'story,track');
|
||||
$lang->menu->waterfall->design = 'Design|design|browse|product={PRODUCT}';
|
||||
$lang->menu->waterfall->ci = 'Code|repo|browse|';
|
||||
$lang->menu->waterfall->qa = 'Index|qa|index';
|
||||
@@ -996,9 +996,8 @@ $lang->budget->menu = $lang->workestimation->menu;
|
||||
$lang->programplan->menu->gantt = array('link' => 'Gantt|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=gantt');
|
||||
$lang->programplan->menu->lists = array('link' => 'Stage|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=lists', 'alias' => 'create');
|
||||
|
||||
$lang->projectstory->menu->requirement = array('link' => "{$lang->URCommon}|projectstory|requirement", 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => '');
|
||||
$lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => 'story,project', 'alias' => 'linkstory');
|
||||
$lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => '');
|
||||
|
||||
$lang->nc->menu = $lang->auditplan->menu;
|
||||
$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'job', 'jenkins', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'stage');
|
||||
|
||||
@@ -902,7 +902,7 @@ $lang->menu = new stdclass();
|
||||
$lang->menu->scrum = new stdclass();
|
||||
$lang->menu->scrum->programindex = 'Index|program|index|project={PROJECT}';
|
||||
$lang->menu->scrum->project = "$lang->executionCommon|project|index|locate=no";
|
||||
$lang->menu->scrum->projectstory = array('link' => 'Story|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->scrum->projectstory = array('link' => 'Story|projectstory|story', 'subModule' => 'story', 'alias' => 'story,track');
|
||||
$lang->menu->scrum->doc = 'Doc|doc|index|';
|
||||
$lang->menu->scrum->qa = 'QA|qa|index';
|
||||
$lang->menu->scrum->ci = 'Code|repo|browse';
|
||||
@@ -928,7 +928,7 @@ $lang->menu->waterfall->programplan = array('link' => 'Plan|programplan|brows
|
||||
$lang->menu->waterfall->project = array('link' => $lang->executionCommon . '|project|task|projectID={PROJECT}', 'subModule' => ',project,task,');
|
||||
$lang->menu->waterfall->doc = array('link' => 'Doc|doc|index|program={PROJECT}');
|
||||
$lang->menu->waterfall->weekly = array('link' => 'Weekly|weekly|index|program={PROJECT}', 'subModule' => ',milestone,');
|
||||
$lang->menu->waterfall->projectstory = array('link' => 'Story|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->waterfall->projectstory = array('link' => 'Story|projectstory|story', 'alias' => 'story,track');
|
||||
$lang->menu->waterfall->design = 'Design|design|browse|product={PRODUCT}';
|
||||
$lang->menu->waterfall->ci = 'Code|repo|browse|';
|
||||
$lang->menu->waterfall->qa = 'Index|qa|index';
|
||||
@@ -996,9 +996,8 @@ $lang->budget->menu = $lang->workestimation->menu;
|
||||
$lang->programplan->menu->gantt = array('link' => 'Gantt|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=gantt');
|
||||
$lang->programplan->menu->lists = array('link' => 'Stage|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=lists', 'alias' => 'create');
|
||||
|
||||
$lang->projectstory->menu->requirement = array('link' => "{$lang->URCommon}|projectstory|requirement", 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => '');
|
||||
$lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => 'story,project', 'alias' => 'linkstory');
|
||||
$lang->projectstory->menu->track = array('link' => 'Track|projectstory|track', 'subModule' => '');
|
||||
|
||||
$lang->nc->menu = $lang->auditplan->menu;
|
||||
$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'job', 'jenkins', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'stage');
|
||||
|
||||
@@ -905,7 +905,7 @@ $lang->menu = new stdclass();
|
||||
$lang->menu->scrum = new stdclass();
|
||||
$lang->menu->scrum->programindex = '仪表盘|program|index|project={PROJECT}';
|
||||
$lang->menu->scrum->project = "$lang->executionCommon|project|index|locate=no";
|
||||
$lang->menu->scrum->projectstory = array('link' => '需求|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->scrum->projectstory = array('link' => '需求|projectstory|story', 'subModule' => 'story', 'alias' => 'story,track');
|
||||
$lang->menu->scrum->doc = '文档|doc|index|';
|
||||
$lang->menu->scrum->qa = '测试|qa|index';
|
||||
$lang->menu->scrum->ci = '代码|repo|browse';
|
||||
@@ -931,7 +931,7 @@ $lang->menu->waterfall->programplan = array('link' => '计划|programplan|bro
|
||||
$lang->menu->waterfall->project = array('link' => $lang->executionCommon . '|project|task|executionID={EXECUTION}', 'subModule' => ',project,task,');
|
||||
$lang->menu->waterfall->doc = array('link' => '文档|doc|index|project={PROJECT}');
|
||||
$lang->menu->waterfall->weekly = array('link' => '报告|weekly|index|project={PROJECT}', 'subModule' => ',milestone,');
|
||||
$lang->menu->waterfall->projectstory = array('link' => '需求|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->waterfall->projectstory = array('link' => '需求|projectstory|story', 'alias' => 'story,track');
|
||||
$lang->menu->waterfall->design = '设计|design|browse|product={PRODUCT}';
|
||||
$lang->menu->waterfall->ci = '代码|repo|browse|';
|
||||
$lang->menu->waterfall->qa = '测试|qa|index';
|
||||
@@ -999,9 +999,8 @@ $lang->budget->menu = $lang->workestimation->menu;
|
||||
$lang->programplan->menu->gantt = array('link' => '甘特图|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=gantt');
|
||||
$lang->programplan->menu->lists = array('link' => '阶段列表|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=lists', 'alias' => 'create');
|
||||
|
||||
$lang->projectstory->menu->requirement = array('link' => "{$lang->URCommon}|projectstory|requirement", 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => '');
|
||||
$lang->projectstory->menu->track = array('link' => '跟踪矩阵|projectstory|track', 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => 'story,project', 'alias' => 'linkstory');
|
||||
$lang->projectstory->menu->track = array('link' => '跟踪矩阵|projectstory|track', 'subModule' => '');
|
||||
|
||||
$lang->nc->menu = $lang->auditplan->menu;
|
||||
$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'score', 'stage');
|
||||
|
||||
@@ -892,7 +892,7 @@ $lang->menu = new stdclass();
|
||||
$lang->menu->scrum = new stdclass();
|
||||
$lang->menu->scrum->programindex = '儀表盤|program|index|project={PROJECT}';
|
||||
$lang->menu->scrum->project = "$lang->executionCommon|project|index|locate=no";
|
||||
$lang->menu->scrum->projectstory = array('link' => '需求|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->scrum->projectstory = array('link' => '需求|projectstory|story', 'subModule' => 'story', 'alias' => 'story,track');
|
||||
$lang->menu->scrum->doc = '文檔|doc|index|';
|
||||
$lang->menu->scrum->qa = '測試|qa|index';
|
||||
$lang->menu->scrum->ci = '代碼|repo|browse';
|
||||
@@ -918,7 +918,7 @@ $lang->menu->waterfall->programplan = array('link' => '計劃|programplan|bro
|
||||
$lang->menu->waterfall->project = array('link' => $lang->executionCommon . '|project|task|executionID={EXECUTION}', 'subModule' => ',project,task,');
|
||||
$lang->menu->waterfall->doc = array('link' => '文檔|doc|index|project={PROJECT}');
|
||||
$lang->menu->waterfall->weekly = array('link' => '報告|weekly|index|project={PROJECT}', 'subModule' => ',milestone,');
|
||||
$lang->menu->waterfall->projectstory = array('link' => '需求|projectstory|requirement', 'alias' => 'requirement,story,track');
|
||||
$lang->menu->waterfall->projectstory = array('link' => '需求|projectstory|story', 'alias' => 'story,track');
|
||||
$lang->menu->waterfall->design = '設計|design|browse|product={PRODUCT}';
|
||||
$lang->menu->waterfall->ci = '代碼|repo|browse|';
|
||||
$lang->menu->waterfall->qa = '測試|qa|index';
|
||||
@@ -986,9 +986,8 @@ $lang->budget->menu = $lang->workestimation->menu;
|
||||
$lang->programplan->menu->gantt = array('link' => '甘特圖|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=gantt');
|
||||
$lang->programplan->menu->lists = array('link' => '階段列表|programplan|browse|programID={PROJECT}&productID={PRODUCT}&type=lists', 'alias' => 'create');
|
||||
|
||||
$lang->projectstory->menu->requirement = array('link' => "{$lang->URCommon}|projectstory|requirement", 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => '');
|
||||
$lang->projectstory->menu->track = array('link' => '跟蹤矩陣|projectstory|track', 'subModule' => '');
|
||||
$lang->projectstory->menu->story = array('link' => "{$lang->SRCommon}|projectstory|story", 'subModule' => 'story,project', 'alias' => 'linkstory');
|
||||
$lang->projectstory->menu->track = array('link' => '跟蹤矩陣|projectstory|track', 'subModule' => '');
|
||||
|
||||
$lang->nc->menu = $lang->auditplan->menu;
|
||||
$lang->noMenuModule = array('my', 'todo', 'effort', 'program', 'product', 'productplan', 'projectbuild', 'projectrelease', 'story', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'issue', 'risk', 'pssp', 'sms', 'message', 'webhook', 'search', 'stage');
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
$config->datatable->moduleAlias['product-browse'] = 'story';
|
||||
$config->datatable->moduleAlias['project-task'] = 'task';
|
||||
$config->datatable->moduleAlias['testtask-cases'] = 'testcase';
|
||||
$config->datatable->moduleAlias['product-browse'] = 'story';
|
||||
$config->datatable->moduleAlias['projectstory-story'] = 'story';
|
||||
$config->datatable->moduleAlias['project-task'] = 'task';
|
||||
$config->datatable->moduleAlias['testtask-cases'] = 'testcase';
|
||||
|
||||
@@ -111,7 +111,8 @@ class product extends control
|
||||
public function browse($productID = 0, $branch = '', $browseType = '', $param = 0, $storyType = 'story', $orderBy = '', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
/* Lower browse type. */
|
||||
$browseType = strtolower($browseType);
|
||||
$browseType = strtolower($browseType);
|
||||
$projectStoryBrowseType = $browseType;
|
||||
|
||||
/* Load datatable. */
|
||||
$this->loadModel('datatable');
|
||||
@@ -182,6 +183,30 @@ class product extends control
|
||||
|
||||
/* Get stories. */
|
||||
$stories = $this->product->getStories($productID, $branch, $browseType, $queryID, $moduleID, $storyType, $sort, $pager);
|
||||
if($this->app->rawModule == 'projectstory')
|
||||
{
|
||||
$products = $this->product->getProductsByProject($this->session->PRJ);
|
||||
$productPlans = $this->loadModel('project')->getPlans($products);
|
||||
$projectPlanList = $this->dao->select('product,plan')->from(TABLE_PROJECTPRODUCT)->where('project')->eq($this->session->PRJ)->fetchPairs('product', 'plan');
|
||||
$notLinkPlans = array();
|
||||
|
||||
foreach($projectPlanList as $productID => $planID)
|
||||
{
|
||||
if(isset($productPlans[$productID][$planID])) unset($productPlans[$productID][$planID]);
|
||||
}
|
||||
|
||||
foreach($productPlans as $productPlans)
|
||||
{
|
||||
foreach($productPlans as $id => $plan) $notLinkPlans[$id] = $plan;
|
||||
}
|
||||
|
||||
if(!empty($plans))
|
||||
{
|
||||
foreach($plans as $productID => $plan) $allPlans += $plan;
|
||||
}
|
||||
if($projectStoryBrowseType == 'bybranch') $param = $branch;
|
||||
$stories = $this->story->getProjectStories($this->session->PRJ, $sort, $projectStoryBrowseType, $param, 'story', '', $pager, $productID);
|
||||
}
|
||||
|
||||
/* Process the sql, get the conditon partion, save it to session. */
|
||||
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story', $browseType != 'bysearch');
|
||||
@@ -227,6 +252,7 @@ class product extends control
|
||||
$this->view->moduleID = $moduleID;
|
||||
$this->view->stories = $stories;
|
||||
$this->view->plans = $this->loadModel('productplan')->getPairs($productID, $branch, '', true);
|
||||
$this->view->notLinkPlans = isset($notLinkPlans) ? $notLinkPlans : array();
|
||||
$this->view->summary = $this->product->summary($stories, $storyType);
|
||||
$this->view->moduleTree = $moduleTree;
|
||||
$this->view->parentModules = $this->tree->getParents($moduleID);
|
||||
|
||||
@@ -22,6 +22,15 @@ $(function()
|
||||
$td.find('a').eq(0).css('max-width', $td.width() - labelWidth - 60);
|
||||
});
|
||||
|
||||
$('#toTaskButton').on('click', function()
|
||||
{
|
||||
var planID = $('#plan').val();
|
||||
if(planID)
|
||||
{
|
||||
parent.location.href = createLink('project', 'importPlanStories', 'projectID=' + projectID + '&planID=' + planID);
|
||||
}
|
||||
})
|
||||
|
||||
$(document).on('click', '.story-toggle', function(e)
|
||||
{
|
||||
var $toggle = $(this);
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
<?php include '../../common/view/datatable.fix.html.php';?>
|
||||
<?php js::set('browseType', $browseType);?>
|
||||
<?php js::set('productID', $productID);?>
|
||||
<?php js::set('projectID', $this->session->PRJ);?>
|
||||
<?php js::set('branch', $branch);?>
|
||||
<?php js::set('rawModule', $this->app->rawModule);?>
|
||||
<?php
|
||||
@@ -23,7 +24,7 @@ js::set('unfoldStories', $unfoldStories);
|
||||
js::set('unfoldAll', $lang->project->treeLevel['all']);
|
||||
js::set('foldAll', $lang->project->treeLevel['root']);
|
||||
js::set('storyType', $storyType);
|
||||
$lang->story->create = $storyType == 'story' ? $lang->story->createStory : $lang->story->createRequirement;
|
||||
$lang->story->createCommon = $storyType == 'story' ? $lang->story->createStory : $lang->story->createRequirement;
|
||||
?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div id="sidebarHeader">
|
||||
@@ -95,54 +96,64 @@ $lang->story->create = $storyType == 'story' ? $lang->story->createStory : $lang
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php $isProjectStroy = $this->app->rawModule == 'projectstory';?>
|
||||
<?php if(common::canModify('product', $product)):?>
|
||||
<?php if(!common::checkNotCN()):?>
|
||||
<?php if(common::hasPriv('story', 'batchCreate')) echo html::a($this->createLink('story', 'batchCreate', "productID=$productID&branch=$branch&moduleID=$moduleID&storyID=0&project=0&plan=0&type=$storyType"), "<i class='icon icon-plus'></i> {$lang->story->batchCreate}", '', "class='btn btn btn-secondary'");?>
|
||||
<?php
|
||||
if(commonModel::isTutorialMode())
|
||||
{
|
||||
$wizardParams = helper::safe64Encode("productID=$productID&branch=$branch&moduleID=$moduleID");
|
||||
$link = $this->createLink('tutorial', 'wizard', "module=story&method=create¶ms=$wizardParams");
|
||||
echo html::a($link, "<i class='icon icon-plus'></i> {$lang->story->create}", '', "class='btn btn-primary create-story-btn'");
|
||||
}
|
||||
else
|
||||
{
|
||||
$link = $this->createLink('story', 'create', "productID=$productID&branch=$branch&moduleID=$moduleID&storyID=0&projectID=0&bugID=0&planID=0&todoID=0&extra=&type=$storyType");
|
||||
if(common::hasPriv('story', 'create')) echo html::a($link, "<i class='icon icon-plus'></i> {$lang->story->create}", '', "class='btn btn-primary'");
|
||||
}
|
||||
?>
|
||||
<?php else:?>
|
||||
<div class='btn-group dropdown-hover'>
|
||||
<?php
|
||||
if(commonModel::isTutorialMode())
|
||||
{
|
||||
$wizardParams = helper::safe64Encode("productID=$productID&branch=$branch&moduleID=$moduleID");
|
||||
$link = $this->createLink('tutorial', 'wizard', "module=story&method=create¶ms=$wizardParams");
|
||||
echo html::a($link, "<i class='icon icon-plus'></i> {$lang->story->create} </span><span class='caret'>", '', "class='btn btn-primary create-story-btn'");
|
||||
}
|
||||
else
|
||||
{
|
||||
$link = $this->createLink('story', 'create', "product=$productID&branch=$branch&moduleID=$moduleID&storyID=0&projectID=0&bugID=0&planID=0&todoID=0&extra=&type=$storyType");
|
||||
$disabled = '';
|
||||
if(!common::hasPriv('story', 'create'))
|
||||
{
|
||||
$link = '###';
|
||||
$disabled = 'disabled';
|
||||
}
|
||||
echo html::a($link, "<i class='icon icon-plus'></i> {$lang->story->create} </span><span class='caret'>", '', "class='btn btn-primary $disabled'");
|
||||
}
|
||||
?>
|
||||
<?php echo html::a('javascript:;', "<i class='icon icon-plus'></i> {$lang->story->create} </span><span class='caret'>", '', "class='btn btn-secondary'");?>
|
||||
<ul class='dropdown-menu'>
|
||||
<?php $disabled = common::hasPriv('story', 'batchCreate') ? '' : "class='disabled'";?>
|
||||
<li <?php echo $disabled?>>
|
||||
<li>
|
||||
<?php
|
||||
if(commonModel::isTutorialMode())
|
||||
{
|
||||
$wizardParams = helper::safe64Encode("productID=$productID&branch=$branch&moduleID=$moduleID");
|
||||
if($isProjectStroy) $wizardParams = helper::safe64Encode("productID=$productID&branch=$branch&moduleID=$moduleID&storyID=&projectID={$this->session->PRJ} . '#open=project'");
|
||||
$link = $this->createLink('tutorial', 'wizard', "module=story&method=create¶ms=$wizardParams");
|
||||
echo html::a($link, $lang->story->createCommon);
|
||||
}
|
||||
else
|
||||
{
|
||||
$link = $this->createLink('story', 'create', "product=$productID&branch=$branch&moduleID=$moduleID&storyID=0&projectID=0&bugID=0&planID=0&todoID=0&extra=&type=$storyType");
|
||||
if($isProjectStroy) $link = $this->createLink('story', 'create', "product=$productID&branch=$branch&moduleID=$moduleID&storyID=0&projectID={$this->session->PRJ}#open=project");
|
||||
$disabled = '';
|
||||
if(!common::hasPriv('story', 'create'))
|
||||
{
|
||||
$link = '###';
|
||||
$disabled = 'disabled';
|
||||
}
|
||||
echo html::a($link, $lang->story->createCommon, '', "class='$disabled'");
|
||||
}
|
||||
?>
|
||||
</li>
|
||||
<?php $batchDisabled = common::hasPriv('story', 'batchCreate') ? '' : "class='disabled'";?>
|
||||
<li <?php echo $batchDisabled;?>>
|
||||
<?php
|
||||
$batchLink = $this->createLink('story', 'batchCreate', "productID=$productID&branch=$branch&moduleID=$moduleID&storyID=0&project=0&plan=0&type=$storyType");
|
||||
echo "<li>" . html::a($batchLink, "<i class='icon icon-plus'></i>" . $lang->story->batchCreate) . "</li>";
|
||||
if($isProjectStroy) $batchLink = $this->createLink('story', 'batchCreate', "productID=$productID&branch=$branch&moduleID=$moduleID&storyID=0&project={$this->session->PRJ}#open=project");
|
||||
echo html::a($batchLink, $lang->story->batchCreate);
|
||||
?>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php $isShow = $isProjectStroy ? '' : "style='display: none;'";?>
|
||||
<div class='btn-group dropdown-hover' <?php echo $isShow;?>>
|
||||
<?php
|
||||
if(commonModel::isTutorialMode())
|
||||
{
|
||||
$wizardParams = helper::safe64Encode("project=$project->id");
|
||||
echo html::a($this->createLink('tutorial', 'wizard', "module=project&method=linkStory¶ms=$wizardParams"), "<i class='icon-link'></i> {$lang->project->linkStory}",'', "class='btn btn-link link-story-btn'");
|
||||
}
|
||||
else
|
||||
{
|
||||
echo "<button type='button' class='btn btn-primary' id='linkButton'>";
|
||||
echo "<i class='icon-link'></i> {$lang->project->linkStory} <span class='caret'></span>";
|
||||
echo '</button>';
|
||||
echo "<ul class='dropdown-menu pull-right' id='linkActionMenu'>";
|
||||
echo '<li>' . html::a($this->createLink('projectstory', 'linkStory', "project={$this->session->PRJ}"), $lang->project->linkStory). "</li>";
|
||||
if(common::hasPriv('projectstory', 'importPlanStories')) echo '<li>' . html::a('#linkStoryByPlan', $lang->project->linkStoryByPlan, '', 'data-toggle="modal"') . "</li>";
|
||||
echo '</ul>';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
@@ -171,7 +182,7 @@ $lang->story->create = $storyType == 'story' ? $lang->story->createStory : $lang
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $storyType == 'story' ? $lang->story->noStory : $lang->story->noRequirement;?></span>
|
||||
<?php if(common::canModify('product', $product) and common::hasPriv('story', 'create')):?>
|
||||
<?php echo html::a($this->createLink('story', 'create', "productID={$productID}&branch={$branch}&moduleID={$moduleID}&storyID=0&projectID=0&bugID=0&planID=0&todoID=0&extra=&type=$storyType"), "<i class='icon icon-plus'></i> " . $lang->story->create, '', "class='btn btn-info'");?>
|
||||
<?php echo html::a($this->createLink('story', 'create', "productID={$productID}&branch={$branch}&moduleID={$moduleID}&storyID=0&projectID=0&bugID=0&planID=0&todoID=0&extra=&type=$storyType"), "<i class='icon icon-plus'></i> " . $lang->story->createCommon, '', "class='btn btn-info'");?>
|
||||
<?php endif;?>
|
||||
</p>
|
||||
</div>
|
||||
@@ -433,6 +444,22 @@ $lang->story->create = $storyType == 'story' ? $lang->story->createStory : $lang
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="linkStoryByPlan">
|
||||
<div class="modal-dialog mw-500px">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="icon icon-close"></i></button>
|
||||
<h4 class="modal-title"><?php echo $lang->project->linkStoryByPlan;?></h4><?php echo '(' . $lang->project->linkStoryByPlanTips . ')';?>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class='input-group'>
|
||||
<?php echo html::select('plan', $notLinkPlans, '', "class='form-control chosen' id='plan'");?>
|
||||
<span class='input-group-btn'><?php echo html::commonButton($lang->project->linkStory, "id='toTaskButton'", 'btn btn-primary');?></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
var moduleID = <?php echo $moduleID?>;
|
||||
var branchID = $.cookie('storyBranch');
|
||||
|
||||
@@ -2107,9 +2107,14 @@ class project extends control
|
||||
}
|
||||
|
||||
/**
|
||||
* Link stories to a project.
|
||||
* Link stories to an execution.
|
||||
*
|
||||
* @param int $projectID
|
||||
* @param string $browseType
|
||||
* @param int $param
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -2122,9 +2127,10 @@ class project extends control
|
||||
$project = $this->project->getById($projectID);
|
||||
$products = $this->project->getProducts($projectID);
|
||||
$browseLink = $this->createLink('project', 'story', "projectID=$projectID");
|
||||
if($project->type == 'project') $browseLink = $this->createLink('projectstory', 'story');
|
||||
|
||||
$this->session->set('storyList', $this->app->getURI(true)); // Save session.
|
||||
$this->project->setMenu($this->projects, $project->id); // Set menu.
|
||||
if($project->type != 'project') $this->project->setMenu($this->projects, $project->id); // Set menu.
|
||||
|
||||
if(empty($products))
|
||||
{
|
||||
@@ -2729,6 +2735,7 @@ class project extends control
|
||||
{
|
||||
$planStories = $planProducts = array();
|
||||
$planStory = $this->loadModel('story')->getPlanStories($planID);
|
||||
$project = $this->dao->findById($projectID)->from(TABLE_PROJECT)->fetch();
|
||||
$count = 0;
|
||||
if(!empty($planStory))
|
||||
{
|
||||
@@ -2745,8 +2752,16 @@ class project extends control
|
||||
$planStories = array_keys($planStory);
|
||||
$this->project->linkStory($projectID, $planStories, $planProducts);
|
||||
}
|
||||
if($count != 0) echo js::alert(sprintf($this->lang->project->haveDraft, $count)) . js::locate($this->createLink('project', 'story', "projectID=$projectID"));
|
||||
die(js::locate(helper::createLink('project', 'story', 'projectID=' . $projectID), 'parent'));
|
||||
|
||||
$moduleName = 'project';
|
||||
$param = "projectID=$projectID";
|
||||
if($project->type == 'project')
|
||||
{
|
||||
$moduleName = 'projectstory';
|
||||
$param = '';
|
||||
}
|
||||
if($count != 0) echo js::alert(sprintf($this->lang->project->haveDraft, $count)) . js::locate($this->createLink($moduleName, 'story', $param));
|
||||
die(js::locate(helper::createLink($moduleName, 'story', $param), 'parent'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2106,7 +2106,7 @@ class projectModel extends model
|
||||
if($statusPairs[$storyID] == 'draft' || $statusPairs[$storyID] == 'closed') continue;
|
||||
if(isset($linkedStories[$storyID])) continue;
|
||||
|
||||
$productID = (int)$products[$storyID];
|
||||
$productID = (empty($products) and $this->app->rawMethod == 'batchcreate') ? $this->cookie->preProductID : (int)$products[$storyID];
|
||||
$data = new stdclass();
|
||||
$data->project = $projectID;
|
||||
$data->product = $productID;
|
||||
|
||||
@@ -59,8 +59,8 @@
|
||||
echo '</button>';
|
||||
echo "<ul class='dropdown-menu pull-right' id='createActionMenu'>";
|
||||
$storyModuleID = (int)$this->cookie->storyModuleParam;
|
||||
if(common::hasPriv('story', 'create')) echo '<li>' . html::a($this->createLink('story', 'create', "productID=$productID&branch=0&moduleID={$storyModuleID}&story=0&project=$project->id"), $lang->story->create) . '</li>';
|
||||
if(common::hasPriv('story', 'batchCreate')) echo '<li>' . html::a($this->createLink('story', 'batchCreate', "productID=$productID&branch=0&moduleID={$storyModuleID}&story=0&project=$project->id"), $lang->story->batchCreate) . '</li>';
|
||||
if(common::hasPriv('story', 'create')) echo '<li>' . html::a($this->createLink('story', 'create', "productID=$productID&branch=0&moduleID={$storyModuleID}&story=0&project=$project->id#open=project"), $lang->story->create) . '</li>';
|
||||
if(common::hasPriv('story', 'batchCreate')) echo '<li>' . html::a($this->createLink('story', 'batchCreate', "productID=$productID&branch=0&moduleID={$storyModuleID}&story=0&project=$project->id#open=project"), $lang->story->batchCreate) . '</li>';
|
||||
echo '</ul>';
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
@@ -113,5 +113,22 @@ class projectStory extends control
|
||||
|
||||
echo $this->fetch('story', 'track', "productID=$productID&branch=$branch&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID");
|
||||
}
|
||||
|
||||
/**
|
||||
* Link stories to a project.
|
||||
*
|
||||
* @param int $projectID
|
||||
* @param string $browseType
|
||||
* @param int $param
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function linkStory($projectID = 0, $browseType = '', $param = 0, $recTotal = 0, $recPerPage = 50, $pageID = 1)
|
||||
{
|
||||
echo $this->fetch('project', 'linkStory', "projectID=$projectID&browseType=$browseType¶m=$param&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,3 +4,17 @@ $lang->projectstory->index = 'Fordern Sie Homepage';
|
||||
$lang->projectstory->requirement = $lang->generalUR;
|
||||
$lang->projectstory->story = $lang->generalSR;
|
||||
$lang->projectstory->track = 'Matrix der Verfolgung';
|
||||
|
||||
global $app;
|
||||
$app->loadLang('product');
|
||||
$lang->projectstory->featureBarList['allstory'] = $lang->product->allStory;
|
||||
$lang->projectstory->featureBarList['unclosed'] = $lang->product->unclosed;
|
||||
$lang->projectstory->featureBarList['willclose'] = $lang->product->willClose;
|
||||
$lang->projectstory->featureBarList['status']['draftstory'] = $lang->product->draftStory;
|
||||
$lang->projectstory->featureBarList['status']['activestory'] = $lang->product->activeStory;
|
||||
$lang->projectstory->featureBarList['status']['changedstory'] = $lang->product->changedStory;
|
||||
$lang->projectstory->featureBarList['status']['closedstory'] = $lang->product->closedStory;
|
||||
$lang->projectstory->featureBarList['other']['openedbyme'] = $lang->product->openedByMe;
|
||||
$lang->projectstory->featureBarList['other']['assignedtome'] = $lang->product->assignedToMe;
|
||||
$lang->projectstory->featureBarList['other']['reviewedbyme'] = $lang->product->reviewedByMe;
|
||||
$lang->projectstory->featureBarList['other']['closedbyme'] = $lang->product->closedByMe;
|
||||
|
||||
@@ -4,3 +4,17 @@ $lang->projectstory->index = 'Request Home';
|
||||
$lang->projectstory->requirement = $lang->generalUR;
|
||||
$lang->projectstory->story = $lang->generalSR;
|
||||
$lang->projectstory->track = 'Tracking Matrix';
|
||||
|
||||
global $app;
|
||||
$app->loadLang('product');
|
||||
$lang->projectstory->featureBarList['allstory'] = $lang->product->allStory;
|
||||
$lang->projectstory->featureBarList['unclosed'] = $lang->product->unclosed;
|
||||
$lang->projectstory->featureBarList['willclose'] = $lang->product->willClose;
|
||||
$lang->projectstory->featureBarList['status']['draftstory'] = $lang->product->draftStory;
|
||||
$lang->projectstory->featureBarList['status']['activestory'] = $lang->product->activeStory;
|
||||
$lang->projectstory->featureBarList['status']['changedstory'] = $lang->product->changedStory;
|
||||
$lang->projectstory->featureBarList['status']['closedstory'] = $lang->product->closedStory;
|
||||
$lang->projectstory->featureBarList['other']['openedbyme'] = $lang->product->openedByMe;
|
||||
$lang->projectstory->featureBarList['other']['assignedtome'] = $lang->product->assignedToMe;
|
||||
$lang->projectstory->featureBarList['other']['reviewedbyme'] = $lang->product->reviewedByMe;
|
||||
$lang->projectstory->featureBarList['other']['closedbyme'] = $lang->product->closedByMe;
|
||||
|
||||
@@ -4,3 +4,17 @@ $lang->projectstory->index = 'Exigences Accueil';
|
||||
$lang->projectstory->requirement = $lang->generalUR;
|
||||
$lang->projectstory->story = $lang->generalSR;
|
||||
$lang->projectstory->track = 'Matrice de suivi';
|
||||
|
||||
global $app;
|
||||
$app->loadLang('product');
|
||||
$lang->projectstory->featureBarList['allstory'] = $lang->product->allStory;
|
||||
$lang->projectstory->featureBarList['unclosed'] = $lang->product->unclosed;
|
||||
$lang->projectstory->featureBarList['willclose'] = $lang->product->willClose;
|
||||
$lang->projectstory->featureBarList['status']['draftstory'] = $lang->product->draftStory;
|
||||
$lang->projectstory->featureBarList['status']['activestory'] = $lang->product->activeStory;
|
||||
$lang->projectstory->featureBarList['status']['changedstory'] = $lang->product->changedStory;
|
||||
$lang->projectstory->featureBarList['status']['closedstory'] = $lang->product->closedStory;
|
||||
$lang->projectstory->featureBarList['other']['openedbyme'] = $lang->product->openedByMe;
|
||||
$lang->projectstory->featureBarList['other']['assignedtome'] = $lang->product->assignedToMe;
|
||||
$lang->projectstory->featureBarList['other']['reviewedbyme'] = $lang->product->reviewedByMe;
|
||||
$lang->projectstory->featureBarList['other']['closedbyme'] = $lang->product->closedByMe;
|
||||
|
||||
@@ -4,3 +4,17 @@ $lang->projectstory->index = 'Yêu cầu trang nhà';
|
||||
$lang->projectstory->requirement = $lang->generalUR;
|
||||
$lang->projectstory->story = $lang->generalSR;
|
||||
$lang->projectstory->track = 'Theo dõi ma trận';
|
||||
|
||||
global $app;
|
||||
$app->loadLang('product');
|
||||
$lang->projectstory->featureBarList['allstory'] = $lang->product->allStory;
|
||||
$lang->projectstory->featureBarList['unclosed'] = $lang->product->unclosed;
|
||||
$lang->projectstory->featureBarList['willclose'] = $lang->product->willClose;
|
||||
$lang->projectstory->featureBarList['status']['draftstory'] = $lang->product->draftStory;
|
||||
$lang->projectstory->featureBarList['status']['activestory'] = $lang->product->activeStory;
|
||||
$lang->projectstory->featureBarList['status']['changedstory'] = $lang->product->changedStory;
|
||||
$lang->projectstory->featureBarList['status']['closedstory'] = $lang->product->closedStory;
|
||||
$lang->projectstory->featureBarList['other']['openedbyme'] = $lang->product->openedByMe;
|
||||
$lang->projectstory->featureBarList['other']['assignedtome'] = $lang->product->assignedToMe;
|
||||
$lang->projectstory->featureBarList['other']['reviewedbyme'] = $lang->product->reviewedByMe;
|
||||
$lang->projectstory->featureBarList['other']['closedbyme'] = $lang->product->closedByMe;
|
||||
|
||||
@@ -4,3 +4,17 @@ $lang->projectstory->index = '需求主页';
|
||||
$lang->projectstory->requirement = $lang->generalUR;
|
||||
$lang->projectstory->story = $lang->generalSR;
|
||||
$lang->projectstory->track = '跟踪矩阵';
|
||||
|
||||
global $app;
|
||||
$app->loadLang('product');
|
||||
$lang->projectstory->featureBarList['allstory'] = $lang->product->allStory;
|
||||
$lang->projectstory->featureBarList['unclosed'] = $lang->product->unclosed;
|
||||
$lang->projectstory->featureBarList['willclose'] = $lang->product->willClose;
|
||||
$lang->projectstory->featureBarList['status']['draftstory'] = $lang->product->draftStory;
|
||||
$lang->projectstory->featureBarList['status']['activestory'] = $lang->product->activeStory;
|
||||
$lang->projectstory->featureBarList['status']['changedstory'] = $lang->product->changedStory;
|
||||
$lang->projectstory->featureBarList['status']['closedstory'] = $lang->product->closedStory;
|
||||
$lang->projectstory->featureBarList['other']['openedbyme'] = $lang->product->openedByMe;
|
||||
$lang->projectstory->featureBarList['other']['assignedtome'] = $lang->product->assignedToMe;
|
||||
$lang->projectstory->featureBarList['other']['reviewedbyme'] = $lang->product->reviewedByMe;
|
||||
$lang->projectstory->featureBarList['other']['closedbyme'] = $lang->product->closedByMe;
|
||||
|
||||
@@ -4,3 +4,17 @@ $lang->projectstory->index = '需求主頁';
|
||||
$lang->projectstory->requirement = $lang->generalUR;
|
||||
$lang->projectstory->story = $lang->generalSR;
|
||||
$lang->projectstory->track = '跟蹤矩陣';
|
||||
|
||||
global $app;
|
||||
$app->loadLang('product');
|
||||
$lang->projectstory->featureBarList['allstory'] = $lang->product->allStory;
|
||||
$lang->projectstory->featureBarList['unclosed'] = $lang->product->unclosed;
|
||||
$lang->projectstory->featureBarList['willclose'] = $lang->product->willClose;
|
||||
$lang->projectstory->featureBarList['status']['draftstory'] = $lang->product->draftStory;
|
||||
$lang->projectstory->featureBarList['status']['activestory'] = $lang->product->activeStory;
|
||||
$lang->projectstory->featureBarList['status']['changedstory'] = $lang->product->changedStory;
|
||||
$lang->projectstory->featureBarList['status']['closedstory'] = $lang->product->closedStory;
|
||||
$lang->projectstory->featureBarList['other']['openedbyme'] = $lang->product->openedByMe;
|
||||
$lang->projectstory->featureBarList['other']['assignedtome'] = $lang->product->assignedToMe;
|
||||
$lang->projectstory->featureBarList['other']['reviewedbyme'] = $lang->product->reviewedByMe;
|
||||
$lang->projectstory->featureBarList['other']['closedbyme'] = $lang->product->closedByMe;
|
||||
|
||||
@@ -50,6 +50,23 @@ class story extends control
|
||||
$this->lang->product->switcherMenu = $this->product->getSwitcher($productID);
|
||||
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
|
||||
|
||||
if($projectID)
|
||||
{
|
||||
$project = $this->dao->findById((int)$projectID)->from(TABLE_PROJECT)->fetch();
|
||||
if($project->type == 'project')
|
||||
{
|
||||
$this->app->rawModule = 'projectstory';
|
||||
$this->lang->navGroup->story = 'project';
|
||||
$this->lang->product->menu = $this->lang->menu->{$project->model};
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->app->rawModule = 'project';
|
||||
$this->lang->navGroup->story = 'project';
|
||||
}
|
||||
$this->view->project = $project;
|
||||
}
|
||||
|
||||
/* Whether there is a object to transfer story, for example feedback. */
|
||||
$extra = str_replace(array(',', ' '), array('&', ''), $extra);
|
||||
parse_str($extra, $output);
|
||||
@@ -99,7 +116,10 @@ class story extends control
|
||||
}
|
||||
else
|
||||
{
|
||||
$response['locate'] = $this->createLink('project', 'story', "projectID=$projectID");
|
||||
$project = $this->dao->findById((int)$projectID)->from(TABLE_PROJECT)->fetch();
|
||||
$moduleName = $project->type == 'project' ? 'projectstory' : 'project';
|
||||
$param = $project->type == 'project' ? "PRJ=$projectID" : "projectID=$projectID";
|
||||
$response['locate'] = $this->createLink($moduleName, 'story', $param);
|
||||
}
|
||||
$this->send($response);
|
||||
}
|
||||
@@ -147,7 +167,10 @@ class story extends control
|
||||
else
|
||||
{
|
||||
setcookie('storyModuleParam', 0, 0, $this->config->webRoot, '', false, true);
|
||||
$response['locate'] = $this->createLink('project', 'story', "projectID=$projectID&orderBy=id_desc&browseType=unclosed");
|
||||
$project = $this->dao->findById((int)$projectID)->from(TABLE_PROJECT)->fetch();
|
||||
$moduleName = $project->type == 'project' ? 'projectstory' : 'project';
|
||||
$param = $project->type == 'project' ? "PRJ=$projectID" : "projectID=$projectID&orderBy=id_desc&browseType=unclosed";
|
||||
$response['locate'] = $this->createLink($moduleName, 'story', $param);
|
||||
}
|
||||
if($this->app->getViewType() == 'xhtml') $response['locate'] = $this->createLink('story', 'view', "storyID=$storyID");
|
||||
$this->send($response);
|
||||
@@ -255,7 +278,7 @@ class story extends control
|
||||
}
|
||||
}
|
||||
|
||||
/* Set Custom*/
|
||||
/* Set Custom. */
|
||||
foreach(explode(',', $this->config->story->list->customCreateFields) as $field) $customFields[$field] = $this->lang->story->$field;
|
||||
$this->view->customFields = $customFields;
|
||||
$this->view->showFields = $this->config->story->custom->createFields;
|
||||
@@ -311,6 +334,22 @@ class story extends control
|
||||
$this->lang->product->switcherMenu = $this->product->getSwitcher($productID);
|
||||
$this->lang->product->mainMenuAction = $this->product->getProductMainAction();
|
||||
|
||||
if($project)
|
||||
{
|
||||
$prj = $this->dao->findById((int)$project)->from(TABLE_PROJECT)->fetch();
|
||||
if($prj->type == 'project')
|
||||
{
|
||||
$this->app->rawModule = 'projectstory';
|
||||
$this->lang->navGroup->story = 'project';
|
||||
$this->lang->product->menu = $this->lang->menu->{$prj->model};
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
$this->view->project = $prj;
|
||||
}
|
||||
|
||||
/* Clear title when switching products and set the session for the current product. */
|
||||
if($productID != $this->cookie->preProductID) unset($_SESSION['storyImagesFile']);
|
||||
setcookie('preProductID', $productID, $this->config->cookieLife, $this->config->webRoot, '', false, true);
|
||||
@@ -349,7 +388,10 @@ class story extends control
|
||||
elseif($project)
|
||||
{
|
||||
setcookie('storyModuleParam', 0, 0, $this->config->webRoot, '', false, false);
|
||||
die(js::locate($this->createLink('project', 'story', "projectID=$project&orderBy=id_desc&browseType=unclosed"), 'parent'));
|
||||
$moduleName = $prj->type == 'project' ? 'projectstory' : 'project';
|
||||
$param = $prj->type == 'project' ? "PRJ=$project#open=project" : "projectID=$project&orderBy=id_desc&browseType=unclosed";
|
||||
$link = $this->createLink($moduleName, 'story', $param);
|
||||
die(js::locate($link, 'parent'));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -3,6 +3,7 @@ $(function()
|
||||
if(typeof(resetActive) != 'undefined') return false;
|
||||
if(typeof(storyType) == 'undefined') storyType = '';
|
||||
if(typeof(rawModule) == 'undefined') rawModule = 'product';
|
||||
if(typeof(project) != 'undefined') rawModule = 'projectstory';
|
||||
if(rawModule != 'projectstory')
|
||||
{
|
||||
$('#navbar .nav li').removeClass('active');
|
||||
|
||||
+22
-5
@@ -2296,15 +2296,18 @@ class storyModel extends model
|
||||
* @param string $type
|
||||
* @param int $param
|
||||
* @param string $storyType
|
||||
* @param string $excludeStories
|
||||
* @param string $excludeStories
|
||||
* @param object $pager
|
||||
* @param int $productID
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProjectStories($projectID = 0, $orderBy = 't1.`order`_desc', $type = 'byModule', $param = 0, $storyType = 'story', $excludeStories = '', $pager = null)
|
||||
public function getProjectStories($projectID = 0, $orderBy = 't1.`order`_desc', $type = 'byModule', $param = 0, $storyType = 'story', $excludeStories = '', $pager = null, $productID = 0)
|
||||
{
|
||||
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProjectStories();
|
||||
|
||||
$project = $this->dao->findById($projectID)->from(TABLE_PROJECT)->fetch();
|
||||
|
||||
$type = strtolower($type);
|
||||
if($type == 'bysearch')
|
||||
{
|
||||
@@ -2346,13 +2349,18 @@ class storyModel extends model
|
||||
else
|
||||
{
|
||||
$productParam = ($type == 'byproduct' and $param) ? $param : $this->cookie->storyProductParam;
|
||||
$branchParam = ($type == 'bybranch' and $param) ? $param : $this->cookie->storyBranchParam;
|
||||
$moduleParam = ($type == 'bymodule' and $param) ? $param : $this->cookie->storyModuleParam;
|
||||
$branchParam = ($type == 'bybranch' and $param) ? $param : $this->cookie->storyBranchParam;
|
||||
$moduleParam = ($type == 'bymodule' and $param) ? $param : $this->cookie->storyModuleParam;
|
||||
$modules = empty($moduleParam) ? array() : $this->dao->select('*')->from(TABLE_MODULE)->where('path')->like("%,$moduleParam,%")->andWhere('type')->eq('story')->andWhere('deleted')->eq(0)->fetchPairs('id', 'id');
|
||||
if(strpos($branchParam, ',') !== false) list($productParam, $branchParam) = explode(',', $branchParam);
|
||||
|
||||
$unclosedStatus = $this->lang->story->statusList;
|
||||
unset($unclosedStatus['closed']);
|
||||
if($project->type == 'project')
|
||||
{
|
||||
$statusFeatureList = $this->lang->projectstory->featureBarList['status'];
|
||||
$otherFeatureList = $this->lang->projectstory->featureBarList['other'];
|
||||
}
|
||||
|
||||
$stories = $this->dao->select('distinct t1.*, t2.*,t3.branch as productBranch,t4.type as productType,t2.version as version')->from(TABLE_PROJECTSTORY)->alias('t1')
|
||||
->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id')
|
||||
@@ -2361,10 +2369,19 @@ class storyModel extends model
|
||||
->where('t1.project')->eq((int)$projectID)
|
||||
->andWhere('t2.type')->eq($storyType)
|
||||
->beginIF($excludeStories)->andWhere('t2.id')->notIN($excludeStories)->fi()
|
||||
->beginIF($project->type == 'project')
|
||||
->andWhere('t1.product')->eq($productID)
|
||||
->beginIF(isset($statusFeatureList) and in_array($type, array_keys($statusFeatureList)))->andWhere('t2.status')->eq($type)->fi()
|
||||
->beginIF(isset($otherFeatureList) and in_array($type, array_keys($otherFeatureList)))->andWhere('t2.' . substr($type, 0, -2))->eq($this->app->user->account)->fi()
|
||||
->beginIF($type == 'unclosed')->andWhere('t2.status')->in(array_keys($unclosedStatus))->fi()
|
||||
->beginIF($type == 'willclose')->andWhere('t2.stage')->in('developed,released')->andWhere('t2.status')->ne('closed')->fi()
|
||||
->fi()
|
||||
->beginIF($project->type != 'project')
|
||||
->beginIF(!empty($productParam))->andWhere('t1.product')->eq($productParam)->fi()
|
||||
->beginIF($this->session->projectStoryBrowseType == 'unclosed')->andWhere('t2.status')->in(array_keys($unclosedStatus))->fi()
|
||||
->fi()
|
||||
->beginIF(!empty($branchParam))->andWhere('t2.branch')->eq($branchParam)->fi()
|
||||
->beginIF($modules)->andWhere('t2.module')->in($modules)->fi()
|
||||
->beginIF($this->session->projectStoryBrowseType == 'unclosed')->andWhere('t2.status')->in(array_keys($unclosedStatus))->fi()
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->orderBy($orderBy)
|
||||
->page($pager, 't2.id')
|
||||
|
||||
@@ -141,6 +141,7 @@ $(function()
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<?php if(isset($project)) js::set('project', $project);?>
|
||||
<?php js::set('storyType', $type);?>
|
||||
<?php include '../../common/view/pastetext.html.php';?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -247,6 +247,7 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(isset($project)) js::set('project', $project);?>
|
||||
<?php js::set('projectID', $projectID);?>
|
||||
<?php js::set('storyModule', $lang->story->module);?>
|
||||
<?php js::set('storyType', $type);?>
|
||||
|
||||
Reference in New Issue
Block a user