diff --git a/db/update17.6.1.sql b/db/update17.6.1.sql
index 9846b7562f..7fed81278f 100644
--- a/db/update17.6.1.sql
+++ b/db/update17.6.1.sql
@@ -1,2 +1,4 @@
ALTER TABLE `zt_product` ADD `shadow` tinyint(1) unsigned NOT NULL AFTER `code`;
ALTER TABLE `zt_project` ADD `hasProduct` tinyint(1) unsigned NOT NULL DEFAULT 1 AFTER `code`;
+
+ALTER TABLE `zt_product` MODIFY `name` varchar(110) NOT NULL;
\ No newline at end of file
diff --git a/db/zentao.sql b/db/zentao.sql
index b39793fd2a..e92a6e2223 100755
--- a/db/zentao.sql
+++ b/db/zentao.sql
@@ -1096,7 +1096,7 @@ CREATE TABLE IF NOT EXISTS `zt_planstory` (
CREATE TABLE IF NOT EXISTS `zt_product` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`program` mediumint(8) unsigned NOT NULL,
- `name` varchar(90) NOT NULL,
+ `name` varchar(110) NOT NULL,
`code` varchar(45) NOT NULL,
`shadow` tinyint(1) unsigned NOT NULL,
`bind` enum('0','1') NOT NULL DEFAULT '0',
diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php
index 856fe405a8..c6f2c848eb 100644
--- a/module/common/lang/menu.php
+++ b/module/common/lang/menu.php
@@ -209,7 +209,7 @@ $lang->scrum->menu->devops = array('link' => "{$lang->repo->common}|repo|brow
$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' => 'stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist,team');
+$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->dividerMenu = ',execution,programplan,doc,settings,';
@@ -241,6 +241,7 @@ $lang->scrum->menu->settings['subMenu']->members = array('link' => "{$lang->
$lang->scrum->menu->settings['subMenu']->whitelist = array('link' => "{$lang->whitelist}|project|whitelist|project=%s", 'subModule' => 'personnel');
$lang->scrum->menu->settings['subMenu']->stakeholder = array('link' => "{$lang->stakeholder->common}|stakeholder|browse|project=%s", 'subModule' => 'stakeholder');
$lang->scrum->menu->settings['subMenu']->group = array('link' => "{$lang->priv}|project|group|project=%s", 'alias' => 'group,manageview,managepriv');
+$lang->scrum->menu->settings['subMenu']->module = array('link' => "{$lang->module}|tree|browse|product=%s&view=story");
/* Waterfall menu. */
$lang->waterfall->menu = new stdclass();
@@ -295,7 +296,7 @@ $lang->kanbanProject = new stdclass();
$lang->kanbanProject->menu = new stdclass();
$lang->kanbanProject->menu->index = array('link' => "{$lang->kanban->common}|project|index|project=%s");
$lang->kanbanProject->menu->build = array('link' => "{$lang->build->common}|project|build|project=%s");
-$lang->kanbanProject->menu->settings = array('link' => "$lang->settings|project|view|project=%s", 'subModule' => 'stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist,team');
+$lang->kanbanProject->menu->settings = array('link' => "$lang->settings|project|view|project=%s", 'subModule' => 'tree,stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist,team');
$lang->kanbanProject->dividerMenu = '';
@@ -309,6 +310,7 @@ $lang->kanbanProject->menu->settings['subMenu']->view = array('link' => "
$lang->kanbanProject->menu->settings['subMenu']->products = array('link' => "{$lang->product->common}|project|manageProducts|project=%s", 'alias' => 'manageproducts');
$lang->kanbanProject->menu->settings['subMenu']->members = array('link' => "{$lang->team->common}|project|team|project=%s", 'alias' => 'managemembers,team');
$lang->kanbanProject->menu->settings['subMenu']->whitelist = array('link' => "{$lang->whitelist}|project|whitelist|project=%s", 'subModule' => 'personnel');
+$lang->kanbanProject->menu->settings['subMenu']->module = array('link' => "{$lang->module}|tree|browse|product=%s&view=story");
/* Execution menu. */
$lang->execution->homeMenu = new stdclass();
diff --git a/module/datatable/config.php b/module/datatable/config.php
index 0c2c0fdbb0..3909fefff3 100644
--- a/module/datatable/config.php
+++ b/module/datatable/config.php
@@ -6,3 +6,5 @@ $config->datatable->moduleAlias['testtask-cases'] = 'testcase';
$config->datatable->moduleAlias['program-project'] = 'project';
$config->datatable->moduleAlias['project-bug'] = 'bug';
$config->datatable->moduleAlias['execution-bug'] = 'bug';
+
+$config->datatable->noProductModule = ',review,';
diff --git a/module/datatable/model.php b/module/datatable/model.php
index e69834e266..49267b9bf6 100644
--- a/module/datatable/model.php
+++ b/module/datatable/model.php
@@ -23,6 +23,12 @@ class datatableModel extends model
public function getFieldList($module)
{
if(!isset($this->config->$module)) $this->loadModel($module);
+ if($this->session->hasProduct == 0 and (strpos($this->config->datatable->noProductModule, ",$module,") !== false))
+ {
+ $productIndex = array_search('product', $this->config->$module->datatable->defaultField);
+ if($productIndex) unset($this->config->$module->datatable->defaultField[$productIndex]);
+ if(isset($this->config->$module->datatable->fieldList['product'])) unset($this->config->$module->datatable->fieldList['product']);
+ }
if($this->session->currentProductType === 'normal') unset($this->config->$module->datatable->fieldList['branch']);
foreach($this->config->$module->datatable->fieldList as $field => $items)
{
diff --git a/module/execution/control.php b/module/execution/control.php
index 6eeeddbe7e..140d8f0b7e 100644
--- a/module/execution/control.php
+++ b/module/execution/control.php
@@ -847,6 +847,10 @@ class execution extends control
$branchOption[$branchID] = $name;
}
}
+
+ $projectID = $execution->project;
+ $project = $this->loadModel('project')->getByID($projectID);
+ if(empty($project->hasProduct)) unset($this->config->product->search['fields']['product']);
$this->execution->buildStorySearchForm($products, $branchGroups, $modules, $queryID, $actionURL, 'executionStory', $executionID);
/* Header and position. */
diff --git a/module/execution/model.php b/module/execution/model.php
index 32b6aaa4e0..a86ab95200 100644
--- a/module/execution/model.php
+++ b/module/execution/model.php
@@ -1604,7 +1604,7 @@ class executionModel extends model
->beginIF($limit)->limit($limit)->fi()
->fetchAll('id');
- if(isset($project->model) and $project->model == 'waterfall')
+ if(isset($project->model) and $project->model == 'waterfall' and $project->hasProduct)
{
$executionList = array();
$executionProducts = $this->dao->select('t1.project,t1.product')->from(TABLE_PROJECTPRODUCT)->alias('t1')
diff --git a/module/product/control.php b/module/product/control.php
index 72c732df21..b78a354694 100644
--- a/module/product/control.php
+++ b/module/product/control.php
@@ -295,6 +295,9 @@ class product extends control
unset($this->config->product->search['fields']['stage']);
}
+ $project = $this->loadModel('project')->getByID($projectID);
+ if(empty($project->hasProduct)) unset($this->config->product->search['fields']['product']);
+
/* Build search form. */
$rawModule = $this->app->rawModule;
$rawMethod = $this->app->rawMethod;
@@ -347,7 +350,7 @@ class product extends control
$this->view->storyType = $storyType;
$this->view->from = $this->app->tab;
$this->view->modulePairs = $showModule ? $this->tree->getModulePairs($productID, 'story', $showModule) : array();
- $this->view->project = $this->loadModel('project')->getByID($projectID);
+ $this->view->project = $project;
$this->display();
}
diff --git a/module/product/view/browse.html.php b/module/product/view/browse.html.php
index e99aeab382..0e88c43143 100644
--- a/module/product/view/browse.html.php
+++ b/module/product/view/browse.html.php
@@ -59,6 +59,7 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : '';