Merge branch 'master' of github.com:easysoft/zentaopms
This commit is contained in:
@@ -49,9 +49,17 @@ class block extends control
|
||||
if(!common::hasPriv($moduleKey, 'index')) unset($modules[$moduleKey]);
|
||||
}
|
||||
|
||||
if($this->config->global->flow != 'full')
|
||||
{
|
||||
unset($modules['todo']);
|
||||
unset($modules['qa']);
|
||||
}
|
||||
if($this->config->global->flow == 'onlyStory') unset($modules['project']);
|
||||
if($this->config->global->flow == 'onlyTask') unset($modules['product']);
|
||||
|
||||
$closedBlock = isset($this->config->block->closed) ? $this->config->block->closed : '';
|
||||
if(strpos(",$closedBlock,", ",|dynamic,") === false) $modules['dynamic'] = $this->lang->block->dynamic;
|
||||
if(strpos(",$closedBlock,", ",|flowchart,") === false) $modules['flowchart'] = $this->lang->block->lblFlowchart;
|
||||
if(strpos(",$closedBlock,", ",|flowchart,") === false and $this->config->global->flow == 'full') $modules['flowchart'] = $this->lang->block->lblFlowchart;
|
||||
if(strpos(",$closedBlock,", ",|html,") === false) $modules['html'] = 'HTML';
|
||||
$modules = array('' => '') + $modules;
|
||||
|
||||
@@ -203,8 +211,11 @@ class block extends control
|
||||
if($this->block->initBlock($module)) die(js::reload());
|
||||
}
|
||||
|
||||
foreach($blocks as $block)
|
||||
foreach($blocks as $key => $block)
|
||||
{
|
||||
if($this->config->global->flow == 'onlyStory' and strpos(',product,story,', ',' . $block->source . ',') === false and $block->block != 'dynamic') unset($blocks[$key]);
|
||||
if($this->config->global->flow == 'onlyTask' and strpos(',project,task,', ',' . $block->source . ',') === false and $block->block != 'dynamic') unset($blocks[$key]);
|
||||
|
||||
$block->params = json_decode($block->params);
|
||||
$blockID = $block->block;
|
||||
$source = empty($block->source) ? 'common' : $block->source;
|
||||
|
||||
+43
-2
@@ -125,6 +125,20 @@ class commonModel extends model
|
||||
$this->config->system = isset($config['system']) ? $config['system'] : array();
|
||||
$this->config->personal = isset($config[$account]) ? $config[$account] : array();
|
||||
|
||||
foreach($this->config->system as $module => $records)
|
||||
{
|
||||
/* Overide the items defined in config/config.php and config/my.php. */
|
||||
if(!isset($this->config->$module)) $this->config->$module = new stdclass();
|
||||
if(isset($this->config->system->$module)) helper::mergeConfig($this->config->system->$module, $module);
|
||||
}
|
||||
|
||||
foreach($this->config->personal as $module => $records)
|
||||
{
|
||||
/* Overide the items defined in config/config.php and config/my.php. */
|
||||
if(!isset($this->config->$module)) $this->config->$module = new stdclass();
|
||||
if(isset($this->config->personal->$module)) helper::mergeConfig($this->config->personal->$module, $module);
|
||||
}
|
||||
|
||||
/* Overide the items defined in config/config.php and config/my.php. */
|
||||
if(isset($this->config->system->common)) helper::mergeConfig($this->config->system->common, 'common');
|
||||
if(isset($this->config->personal->common)) helper::mergeConfig($this->config->personal->common, 'common');
|
||||
@@ -374,11 +388,33 @@ class commonModel extends model
|
||||
*/
|
||||
public static function printSearchBox()
|
||||
{
|
||||
global $app, $lang;
|
||||
global $app, $config, $lang;
|
||||
$moduleName = $app->getModuleName();
|
||||
$methodName = $app->getMethodName();
|
||||
$searchObject = $moduleName;
|
||||
|
||||
if($config->global->flow == 'onlyStory')
|
||||
{
|
||||
/* Adjust search items. */
|
||||
unset($lang->searchObjects['bug']);
|
||||
unset($lang->searchObjects['task']);
|
||||
unset($lang->searchObjects['testcase']);
|
||||
unset($lang->searchObjects['project']);
|
||||
unset($lang->searchObjects['build']);
|
||||
unset($lang->searchObjects['testtask']);
|
||||
}
|
||||
elseif($config->global->flow == 'onlyTask')
|
||||
{
|
||||
unset($lang->searchObjects['bug']);
|
||||
unset($lang->searchObjects['story']);
|
||||
unset($lang->searchObjects['product']);
|
||||
unset($lang->searchObjects['testcase']);
|
||||
unset($lang->searchObjects['build']);
|
||||
unset($lang->searchObjects['release']);
|
||||
unset($lang->searchObjects['productplan']);
|
||||
unset($lang->searchObjects['testtask']);
|
||||
}
|
||||
|
||||
if($moduleName == 'product')
|
||||
{
|
||||
if($methodName == 'browse') $searchObject = 'story';
|
||||
@@ -391,7 +427,12 @@ class commonModel extends model
|
||||
{
|
||||
$searchObject = $methodName;
|
||||
}
|
||||
if(empty($lang->searchObjects[$searchObject])) $searchObject = 'bug';
|
||||
if(empty($lang->searchObjects[$searchObject]))
|
||||
{
|
||||
$searchObject = 'bug';
|
||||
if($config->global->flow == 'onlyStory') $searchObject = 'story';
|
||||
if($config->global->flow == 'onlyTask') $searchObject = 'task';
|
||||
}
|
||||
|
||||
echo "<div class='input-group input-group-sm' id='searchbox'>";
|
||||
echo "<div class='input-group-btn' id='typeSelector'>";
|
||||
|
||||
+64
-4
@@ -280,11 +280,70 @@ class customModel extends model
|
||||
|
||||
global $app, $lang, $config;
|
||||
|
||||
if($config->global->flow == 'onlyStory')
|
||||
{
|
||||
/* Remove project, report and qa module. */
|
||||
unset($lang->menu->project);
|
||||
unset($lang->menu->report);
|
||||
unset($lang->menu->qa);
|
||||
|
||||
unset($lang->menuOrder[15]);
|
||||
unset($lang->menuOrder[20]);
|
||||
unset($lang->menuOrder[30]);
|
||||
|
||||
/* Adjust sub menu of my dashboard. */
|
||||
unset($lang->my->menu->bug);
|
||||
unset($lang->my->menu->todo);
|
||||
unset($lang->my->menu->testtask);
|
||||
unset($lang->my->menu->task);
|
||||
unset($lang->my->menu->myProject);
|
||||
|
||||
/* Adjust sub menu of product module. */
|
||||
unset($lang->product->menu->project);
|
||||
|
||||
/* Rename product module. */
|
||||
$clientLang = $app->getClientLang();
|
||||
$lang->menu->product = $config->productCommonList[$clientLang][0] . '|product|index';
|
||||
}
|
||||
elseif($config->global->flow == 'onlyTask')
|
||||
{
|
||||
/* Remove product, report and qa module. */
|
||||
unset($lang->menu->product);
|
||||
unset($lang->menu->report);
|
||||
unset($lang->menu->qa);
|
||||
|
||||
unset($lang->menuOrder[10]);
|
||||
unset($lang->menuOrder[20]);
|
||||
unset($lang->menuOrder[30]);
|
||||
|
||||
/* Adjust sub menu of my dashboard. */
|
||||
unset($lang->my->menu->bug);
|
||||
unset($lang->my->menu->todo);
|
||||
unset($lang->my->menu->testtask);
|
||||
unset($lang->my->menu->story);
|
||||
|
||||
/* Adjust sub menu of project module. */
|
||||
unset($lang->project->menu->story);
|
||||
unset($lang->project->menu->build);
|
||||
unset($lang->project->menu->bug);
|
||||
unset($lang->project->menu->testtask);
|
||||
unset($lang->project->menu->product);
|
||||
|
||||
/* Remove sub menu of product module. */
|
||||
unset($lang->product->menu);
|
||||
unset($lang->product->menuOrder);
|
||||
|
||||
$lang->project->menu->task['subModule'] = 'task';
|
||||
$lang->project->menu->task['alias'] = 'grouptask,importtask';
|
||||
}
|
||||
|
||||
|
||||
$allMenu = $module == 'main' ? $lang->menu : (isset($lang->$module->menu) ? $lang->$module->menu : $lang->my->menu);
|
||||
if($module == 'product' and isset($allMenu->branch)) $allMenu->branch = str_replace('@branch@', $lang->custom->branch, $allMenu->branch);
|
||||
|
||||
if($module != 'main' and isset($lang->menugroup->$module)) $module = $lang->menugroup->$module;
|
||||
$customMenu = isset($config->customMenu->$module) ? $config->customMenu->$module : array();
|
||||
$flowModule = $config->global->flow . '_' . $module;
|
||||
$customMenu = isset($config->customMenu->$flowModule) ? $config->customMenu->$flowModule : array();
|
||||
if(commonModel::isTutorialMode() && $module === 'main')$customMenu = 'my,product,project,qa,company';
|
||||
if(!empty($customMenu) && is_string($customMenu) && substr($customMenu, 0, 1) === '[') $customMenu = json_decode($customMenu);
|
||||
|
||||
@@ -317,7 +376,7 @@ class customModel extends model
|
||||
$app->loadLang($module);
|
||||
customModel::mergeFeatureBar($module, $method);
|
||||
|
||||
$configKey = 'feature_' . $module . '_' . $method;
|
||||
$configKey = $config->global->flow . '_feature_' . $module . '_' . $method;
|
||||
$allMenu = isset($lang->$module->featureBar[$method]) ? $lang->$module->featureBar[$method] : null;
|
||||
$customMenu = '';
|
||||
if(!commonModel::isTutorialMode() && isset($config->customMenu->$configKey)) $customMenu = $config->customMenu->$configKey;
|
||||
@@ -361,13 +420,14 @@ class customModel extends model
|
||||
|
||||
if(!is_string($menu)) $menu = json_encode($menu);
|
||||
|
||||
$flow = $this->config->global->flow;
|
||||
if(empty($method))
|
||||
{
|
||||
$settingKey = "$account.common.customMenu.$module";
|
||||
$settingKey = "$account.common.customMenu.{$flow}_{$module}";
|
||||
}
|
||||
else
|
||||
{
|
||||
$settingKey = "$account.common.customMenu.feature_{$module}_{$method}";
|
||||
$settingKey = "$account.common.customMenu.{$flow}_feature_{$module}_{$method}";
|
||||
}
|
||||
|
||||
$this->loadModel('setting')->setItem($settingKey, $menu);
|
||||
|
||||
@@ -82,6 +82,13 @@ $lang->doc->libTypeList['custom'] = '自定义文档库';
|
||||
$lang->doc->systemLibs['product'] = $lang->productCommon;
|
||||
$lang->doc->systemLibs['project'] = $lang->projectCommon;
|
||||
|
||||
global $config;
|
||||
if($config->global->flow == 'onlyStory') unset($lang->doc->systemLibs['project']);
|
||||
if($config->global->flow == 'onlyStory') unset($lang->doc->libTypeList['project']);
|
||||
if($config->global->flow == 'onlyTask') unset($lang->doc->systemLibs['product']);
|
||||
if($config->global->flow == 'onlyTask') unset($lang->doc->libTypeList['product']);
|
||||
|
||||
|
||||
$lang->doc->aclList['open'] = '公开';
|
||||
$lang->doc->aclList['custom'] = '自定义';
|
||||
$lang->doc->aclList['private'] = '私有';
|
||||
|
||||
+42
-18
@@ -69,8 +69,8 @@ class docModel extends model
|
||||
$selectHtml .= "<div id='libMenu'>";
|
||||
$selectHtml .= "<div id='libMenuHeading'><input id='searchLib' type='search' placeholder='{$this->lang->doc->searchDoc}' class='form-control'></div>";
|
||||
$selectHtml .= "<div id='libMenuGroups' class='clearfix'>";
|
||||
$selectHtml .= "<div class='lib-menu-group' id='libMenuProductGroup'><div class='lib-menu-list-heading' data-type='product'>{$this->lang->doc->libTypeList['product']}<i class='icon icon-remove'></i></div><div class='lib-menu-list clearfix'></div></div>";
|
||||
$selectHtml .= "<div class='lib-menu-group' id='libMenuProjectGroup'><div class='lib-menu-list-heading' data-type='project'>{$this->lang->doc->libTypeList['project']}<i class='icon icon-remove'></i></div><div class='lib-menu-project-done'>{$this->lang->project->statusList['done']}<i class='icon icon-remove'></i></div><div class='lib-menu-list clearfix'></div></div>";
|
||||
if($this->config->global->flow != 'onlyTask') $selectHtml .= "<div class='lib-menu-group' id='libMenuProductGroup'><div class='lib-menu-list-heading' data-type='product'>{$this->lang->doc->libTypeList['product']}<i class='icon icon-remove'></i></div><div class='lib-menu-list clearfix'></div></div>";
|
||||
if($this->config->global->flow != 'onlyStory') $selectHtml .= "<div class='lib-menu-group' id='libMenuProjectGroup'><div class='lib-menu-list-heading' data-type='project'>{$this->lang->doc->libTypeList['project']}<i class='icon icon-remove'></i></div><div class='lib-menu-project-done'>{$this->lang->project->statusList['done']}<i class='icon icon-remove'></i></div><div class='lib-menu-list clearfix'></div></div>";
|
||||
$selectHtml .= "<div class='lib-menu-group' id='libMenuCustomGroup'><div class='lib-menu-list-heading' data-type='custom'>{$this->lang->doc->libTypeList['custom']}<i class='icon icon-remove'></i></div><div class='lib-menu-list clearfix'></div></div>";
|
||||
$selectHtml .= "</div></div></div>";
|
||||
common::setMenuVars($this->lang->doc->menu, 'list', $selectHtml);
|
||||
@@ -705,11 +705,18 @@ class docModel extends model
|
||||
}
|
||||
$productIdList = array_keys($productLibs);
|
||||
$products = $this->dao->select('id,name,status')->from(TABLE_PRODUCT)->where('id')->in($productIdList)->andWhere('deleted')->eq('0')->orderBy('`order`_desc')->fetchAll();
|
||||
$hasProject = $this->dao->select('DISTINCT product')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
|
||||
->where('t1.product')->in($productIdList)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->fetchPairs('product', 'product');
|
||||
if($this->config->global->flow == 'onlyStory')
|
||||
{
|
||||
$hasProject = array();
|
||||
}
|
||||
else
|
||||
{
|
||||
$hasProject = $this->dao->select('DISTINCT product')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
|
||||
->where('t1.product')->in($productIdList)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->fetchPairs('product', 'product');
|
||||
}
|
||||
|
||||
$hasLibsPriv = common::hasPriv('doc', 'allLibs');
|
||||
$hasFilesPriv = common::hasPriv('doc', 'showFiles');
|
||||
@@ -757,6 +764,9 @@ class docModel extends model
|
||||
*/
|
||||
public function getLimitLibs($type, $limit = 4)
|
||||
{
|
||||
if($type == 'project' and $this->config->global->flow == 'onlyStory') return array();
|
||||
if($type == 'product' and $this->config->global->flow == 'onlyTask') return array();
|
||||
|
||||
if($type == 'product' or $type == 'project')
|
||||
{
|
||||
$table = $type == 'product' ? TABLE_PRODUCT : TABLE_PROJECT;
|
||||
@@ -804,11 +814,18 @@ class docModel extends model
|
||||
$libGroups = $this->dao->select('*')->from(TABLE_DOCLIB)->where('deleted')->eq(0)->andWhere($type)->in($idList)->orderBy('`order`, id')->fetchGroup($type, 'id');
|
||||
if($type == 'product')
|
||||
{
|
||||
$hasProject = $this->dao->select('DISTINCT product')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
|
||||
->where('t1.product')->in($idList)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->fetchPairs('product', 'product');
|
||||
if($this->config->global->flow == 'onlyStory')
|
||||
{
|
||||
$hasProject = array();
|
||||
}
|
||||
else
|
||||
{
|
||||
$hasProject = $this->dao->select('DISTINCT product')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
|
||||
->where('t1.product')->in($idList)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->fetchPairs('product', 'product');
|
||||
}
|
||||
}
|
||||
$buildGroups = array();
|
||||
foreach($libGroups as $objectID => $libs)
|
||||
@@ -839,11 +856,18 @@ class docModel extends model
|
||||
$objectLibs = $this->dao->select('*')->from(TABLE_DOCLIB)->where('deleted')->eq(0)->andWhere($type)->eq($objectID)->orderBy('`order`, id')->fetchAll('id');
|
||||
if($type == 'product')
|
||||
{
|
||||
$hasProject = $this->dao->select('DISTINCT product')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
|
||||
->where('t1.product')->eq($objectID)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->fetchPairs('product', 'product');
|
||||
if($this->config->global->flow == 'onlyStory')
|
||||
{
|
||||
$hasProject = array();
|
||||
}
|
||||
else
|
||||
{
|
||||
$hasProject = $this->dao->select('DISTINCT product')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
|
||||
->where('t1.product')->eq($objectID)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->fetchPairs('product', 'product');
|
||||
}
|
||||
}
|
||||
$libs = array();
|
||||
foreach($objectLibs as $lib)
|
||||
@@ -1208,7 +1232,7 @@ class docModel extends model
|
||||
|
||||
$crumb = '';
|
||||
$productID = $this->cookie->product ? $this->cookie->product : '0';
|
||||
if($productID and $type == 'project')
|
||||
if($productID and $type == 'project' and $this->config->global->flow != 'onlyTask')
|
||||
{
|
||||
$crumb .= $this->getProductCrumb($productID, $lib->project);
|
||||
}
|
||||
|
||||
@@ -1298,3 +1298,103 @@ $lang->changelog['9.1'][] = 'caselib-libView';
|
||||
$lang->changelog['9.1'][] = 'testtask-activate';
|
||||
$lang->changelog['9.1'][] = 'testtask-block';
|
||||
$lang->changelog['9.1'][] = 'testtask-report';
|
||||
|
||||
global $config;
|
||||
if($config->global->flow != 'full')
|
||||
{
|
||||
unset($lang->resource->todo);
|
||||
unset($lang->moduleOrder[10]);
|
||||
unset($lang->resource->qa);
|
||||
unset($lang->moduleOrder[50]);
|
||||
unset($lang->resource->report);
|
||||
unset($lang->moduleOrder[90]);
|
||||
|
||||
unset($lang->resource->my->todo);
|
||||
}
|
||||
|
||||
if($config->global->flow == 'onlyStory' || $config->global->flow == 'onlyTask')
|
||||
{
|
||||
unset($lang->resource->build);
|
||||
unset($lang->moduleOrder[45]);
|
||||
unset($lang->resource->bug);
|
||||
unset($lang->moduleOrder[55]);
|
||||
unset($lang->resource->testcase);
|
||||
unset($lang->moduleOrder[60]);
|
||||
unset($lang->resource->testtask);
|
||||
unset($lang->moduleOrder[65]);
|
||||
|
||||
unset($lang->resource->my->bug);
|
||||
unset($lang->resource->my->testTask);
|
||||
unset($lang->resource->my->testCase);
|
||||
}
|
||||
|
||||
if($config->global->flow == 'onlyStory' || $config->global->flow == 'onlyTest')
|
||||
{
|
||||
unset($lang->resource->project);
|
||||
unset($lang->moduleOrder[35]);
|
||||
unset($lang->resource->task);
|
||||
unset($lang->moduleOrder[40]);
|
||||
|
||||
unset($lang->resource->my->task);
|
||||
unset($lang->resource->my->project);
|
||||
|
||||
unset($lang->resource->product->project);
|
||||
}
|
||||
|
||||
if($config->global->flow == 'onlyTask' || $config->global->flow == 'onlyTest')
|
||||
{
|
||||
unset($lang->resource->story);
|
||||
unset($lang->moduleOrder[20]);
|
||||
unset($lang->resource->productplan);
|
||||
unset($lang->moduleOrder[25]);
|
||||
unset($lang->resource->release);
|
||||
unset($lang->moduleOrder[30]);
|
||||
|
||||
unset($lang->resource->my->story);
|
||||
}
|
||||
|
||||
if($config->global->flow == 'onlyStory')
|
||||
{
|
||||
unset($lang->resource->svn);
|
||||
unset($lang->moduleOrder[150]);
|
||||
unset($lang->resource->git);
|
||||
unset($lang->moduleOrder[155]);
|
||||
|
||||
unset($lang->resource->story->tasks);
|
||||
}
|
||||
|
||||
if($config->global->flow == 'onlyTask')
|
||||
{
|
||||
unset($lang->resource->product);
|
||||
unset($lang->moduleOrder[15]);
|
||||
unset($lang->resource->bug);
|
||||
unset($lang->moduleOrder[55]);
|
||||
|
||||
unset($lang->resource->project->importbug);
|
||||
unset($lang->resource->project->story);
|
||||
unset($lang->resource->project->bug);
|
||||
unset($lang->resource->project->linkStory);
|
||||
unset($lang->resource->project->unlinkStory);
|
||||
unset($lang->resource->project->ajaxGetProducts);
|
||||
}
|
||||
|
||||
if($config->global->flow == 'onlyTest')
|
||||
{
|
||||
unset($lang->resource->product->browse);
|
||||
unset($lang->resource->product->roadmap);
|
||||
unset($lang->resource->product->dynamic);
|
||||
unset($lang->resource->product->ajaxGetProjects);
|
||||
unset($lang->resource->product->ajaxGetPlans);
|
||||
|
||||
unset($lang->resource->build->ajaxGetProjectBuilds);
|
||||
unset($lang->build->methodOrder[30]);
|
||||
|
||||
unset($lang->resource->bug->confirmStoryChange);
|
||||
unset($lang->bug->methodOrder[60]);
|
||||
|
||||
unset($lang->resource->testcase->confirmStoryChange);
|
||||
unset($lang->testcase->methodOrder[40]);
|
||||
|
||||
$lang->resource->product->build = 'build';
|
||||
$lang->product->methodOrder[5] = 'build';
|
||||
}
|
||||
|
||||
@@ -2,3 +2,8 @@ function setWhite(acl)
|
||||
{
|
||||
acl == 'custom' ? $('#whitelistBox').removeClass('hidden') : $('#whitelistBox').addClass('hidden');
|
||||
}
|
||||
|
||||
$(document).ready(function()
|
||||
{
|
||||
if(onlyStory) $('#aclprivate').parents('.radio').remove();
|
||||
})
|
||||
|
||||
@@ -233,6 +233,8 @@ class productModel extends model
|
||||
*/
|
||||
public function getProductsByProject($projectID)
|
||||
{
|
||||
if($this->config->global->flow == 'onlyTask') return array();
|
||||
|
||||
return $this->dao->select('t1.product, t2.name')
|
||||
->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PRODUCT)->alias('t2')
|
||||
|
||||
@@ -91,7 +91,10 @@
|
||||
common::printIcon('story', 'review', $vars, $story, 'list', 'review');
|
||||
common::printIcon('story', 'close', $vars, $story, 'list', 'off', '', 'iframe', true);
|
||||
common::printIcon('story', 'edit', $vars, $story, 'list', 'pencil');
|
||||
common::printIcon('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$vars", $story, 'list', 'sitemap');
|
||||
if($this->config->global->flow != 'onlyStory')
|
||||
{
|
||||
common::printIcon('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$vars", $story, 'list', 'sitemap');
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
<?php js::set('onlyStory', $config->global->flow == 'onlyStory' ? true : false);?>
|
||||
<div class='container mw-1400px'>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
<?php js::set('onlyStory', $config->global->flow == 'onlyStory' ? true : false);?>
|
||||
<div class='container mw-1400px'>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
<td class='text-center'>
|
||||
<?php
|
||||
if(common::hasPriv('productplan', 'linkStory')) echo html::a(inlink('view', "planID=$plan->id&type=story&orderBy=id_desc&link=true"), '<i class="icon-link"></i>', '', "class='btn-icon' title='{$lang->productplan->linkStory}'");
|
||||
if(common::hasPriv('productplan', 'linkBug')) echo html::a(inlink('view', "planID=$plan->id&type=bug&orderBy=id_desc&link=true"), '<i class="icon-bug"></i>', '', "class='btn-icon' title='{$lang->productplan->linkBug}'");
|
||||
if(common::hasPriv('productplan', 'linkBug') and $config->global->flow != 'onlyStory') echo html::a(inlink('view', "planID=$plan->id&type=bug&orderBy=id_desc&link=true"), '<i class="icon-bug"></i>', '', "class='btn-icon' title='{$lang->productplan->linkBug}'");
|
||||
common::printIcon('productplan', 'edit', "planID=$plan->id", '', 'list');
|
||||
|
||||
if(common::hasPriv('productplan', 'delete'))
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
echo "<div class='btn-group'>";
|
||||
common::printIcon('story', 'create', "productID=$plan->product&branch=$plan->branch&moduleID=0&storyID=0&projectID=0&bugID=0&planID=$plan->id", '', 'button', 'plus');
|
||||
if(common::hasPriv('productplan', 'linkStory')) echo html::a(inlink('view', "planID=$plan->id&type=story&orderBy=id_desc&link=true"), '<i class="icon-link"></i> ' . $lang->productplan->linkStory, '', "class='btn'");
|
||||
if(common::hasPriv('productplan', 'linkBug')) echo html::a(inlink('view', "planID=$plan->id&type=bug&orderBy=id_desc&link=true"), '<i class="icon-bug"></i> ' . $lang->productplan->linkBug, '', "class='btn'");
|
||||
if(common::hasPriv('productplan', 'linkBug') and $config->global->flow != 'onlyStory') echo html::a(inlink('view', "planID=$plan->id&type=bug&orderBy=id_desc&link=true"), '<i class="icon-bug"></i> ' . $lang->productplan->linkBug, '', "class='btn'");
|
||||
echo '</div>';
|
||||
echo "<div class='btn-group'>";
|
||||
common::printIcon('productplan', 'edit', "planID=$plan->id");
|
||||
@@ -52,7 +52,9 @@
|
||||
<div class='tabs'>
|
||||
<ul class='nav nav-tabs'>
|
||||
<li class='<?php if($type == 'story') echo 'active'?>'><a href='#stories' data-toggle='tab'><?php echo html::icon($lang->icons['story']) . ' ' . $lang->productplan->linkedStories;?></a></li>
|
||||
<?php if($config->global->flow != 'onlyStory'):?>
|
||||
<li class='<?php if($type == 'bug') echo 'active'?>'><a href='#bugs' data-toggle='tab'><?php echo html::icon($lang->icons['bug']) . ' ' . $lang->productplan->linkedBugs;?></a></li>
|
||||
<?php endif;?>
|
||||
<li><a href='#planInfo' data-toggle='tab'><?php echo html::icon($lang->icons['plan']) . ' ' . $lang->productplan->view;?></a></li>
|
||||
</ul>
|
||||
<div class='tab-content'>
|
||||
|
||||
@@ -128,13 +128,15 @@ class project extends control
|
||||
|
||||
/* Set browse type. */
|
||||
$browseType = strtolower($status);
|
||||
if($this->config->global->flow == 'onlyTask' and $browseType == 'byproduct') $param = 0;
|
||||
|
||||
/* Get products by project. */
|
||||
$project = $this->commonAction($projectID, $status);
|
||||
$projectID = $project->id;
|
||||
$products = $this->loadModel('product')->getProductsByProject($projectID);
|
||||
$products = $this->config->global->flow == 'onlyTask' ? array() : $this->loadModel('product')->getProductsByProject($projectID);
|
||||
setcookie('preProjectID', $projectID, $this->config->cookieLife, $this->config->webRoot);
|
||||
|
||||
|
||||
if($this->cookie->preProjectID != $projectID)
|
||||
{
|
||||
$_COOKIE['moduleBrowseParam'] = $_COOKIE['productBrowseParam'] = 0;
|
||||
|
||||
@@ -262,3 +262,10 @@ $lang->project->treeLevel['root'] = '全部折叠';
|
||||
$lang->project->treeLevel['story'] = '显示需求';
|
||||
$lang->project->treeLevel['task'] = '显示任务';
|
||||
$lang->project->treeLevel['all'] = '全部展开';
|
||||
|
||||
global $config;
|
||||
if($config->global->flow == 'onlyTask')
|
||||
{
|
||||
unset($lang->project->groups['story']);
|
||||
unset($lang->project->featureBar['task']['needconfirm']);
|
||||
}
|
||||
|
||||
@@ -937,6 +937,8 @@ class projectModel extends model
|
||||
*/
|
||||
public function getProducts($projectID, $withBranch = true)
|
||||
{
|
||||
if($this->config->global->flow == 'onlyTask') return array();
|
||||
|
||||
if(defined('TUTORIAL'))
|
||||
{
|
||||
if(!$withBranch) return $this->loadModel('tutorial')->getProductPairs();
|
||||
|
||||
@@ -88,7 +88,8 @@
|
||||
<div class='type-tips'><?php echo $lang->project->typeDesc;?></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<?php if($this->config->global->flow != '')?>
|
||||
<tr <?php if($this->config->global->flow != 'onlyTask') echo "class='hidden'";?>>
|
||||
<th><?php echo $lang->project->manageProducts;?></th>
|
||||
<td class='text-left' id='productsBox' colspan="2">
|
||||
<div class='row'>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<h6><?php echo $lang->project->afterInfo;?></h6>
|
||||
<div class='pdb-20'>
|
||||
<?php echo html::a($this->createLink('project', 'team', "projectID=$projectID"), $lang->project->setTeam, '', "class='btn'");?>
|
||||
<?php echo html::a($this->createLink('project', 'linkstory', "projectID=$projectID"), $lang->project->linkStory, '', "class='btn'");?>
|
||||
<?php if($this->config->global->flow != 'onlyTask') echo html::a($this->createLink('project', 'linkstory', "projectID=$projectID"), $lang->project->linkStory, '', "class='btn'");?>
|
||||
<?php echo html::a($this->createLink('task', 'create', "project=$projectID"), $lang->project->createTask, '', "class='btn'");?>
|
||||
<?php echo html::a($this->createLink('project', 'task', "projectID=$projectID"), $lang->project->goback, '', "class='btn'");?>
|
||||
</div>
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
<td class='text-center'>
|
||||
<?php
|
||||
if(common::hasPriv('release', 'linkStory')) echo html::a(inlink('view', "releaseID=$release->id&type=story&link=true"), '<i class="icon-link"></i> ', '', "class='btn-icon' title='{$lang->release->linkStory}'");
|
||||
if(common::hasPriv('release', 'linkBug')) echo html::a(inlink('view', "releaseID=$release->id&type=bug&link=true"), '<i class="icon-bug"></i> ', '', "class='btn-icon' title='{$lang->release->linkBug}'");
|
||||
if(common::hasPriv('release', 'linkBug') and $this->config->global->flow != 'onlyStory') echo html::a(inlink('view', "releaseID=$release->id&type=bug&link=true"), '<i class="icon-bug"></i> ', '', "class='btn-icon' title='{$lang->release->linkBug}'");
|
||||
if(common::hasPriv('release', 'changeStatus'))
|
||||
{
|
||||
$changedStatus = $release->status == 'normal' ? 'terminate' : 'normal';
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
echo html::a(inlink('changeStatus', "releaseID=$release->id&type=$changedStatus"), '<i class="icon-' . ($release->status == 'normal' ? 'pause' : 'play') . '"></i> ' . $lang->release->changeStatusList[$changedStatus], 'hiddenwin', "class='btn'");
|
||||
}
|
||||
if(common::hasPriv('release', 'linkStory')) echo html::a(inlink('view', "releaseID=$release->id&type=story&link=true"), '<i class="icon-link"></i> ' . $lang->release->linkStory, '', "class='btn'");
|
||||
if(common::hasPriv('release', 'linkBug')) echo html::a(inlink('view', "releaseID=$release->id&type=bug&link=true"), '<i class="icon-bug"></i> ' . $lang->release->linkBug, '', "class='btn'");
|
||||
if(common::hasPriv('release', 'linkBug') and $this->config->global->flow != 'onlyStory') echo html::a(inlink('view', "releaseID=$release->id&type=bug&link=true"), '<i class="icon-bug"></i> ' . $lang->release->linkBug, '', "class='btn'");
|
||||
echo '</div>';
|
||||
|
||||
echo "<div class='btn-group'>";
|
||||
@@ -65,9 +65,11 @@
|
||||
<?php $countStories = count($stories); $countBugs = count($bugs); $countLeftBugs = count($leftBugs);?>
|
||||
<ul class='nav nav-tabs'>
|
||||
<li <?php if($type == 'story') echo "class='active'"?>><a href='#stories' data-toggle='tab'><?php echo html::icon($lang->icons['story'], 'green') . ' ' . $lang->release->stories;?></a></li>
|
||||
<?php if($this->config->global->flow != 'onlyStory'):?>
|
||||
<li <?php if($type == 'bug') echo "class='active'"?>><a href='#bugs' data-toggle='tab'><?php echo html::icon($lang->icons['bug'], 'green') . ' ' . $lang->release->bugs;?></a></li>
|
||||
<li <?php if($type == 'leftBug') echo "class='active'"?>><a href='#leftBugs' data-toggle='tab'><?php echo html::icon($lang->icons['bug'], 'red') . ' ' . $lang->release->generatedBugs;?></a></li>
|
||||
<?php if($countStories or $countBugs or $countLeftBugs):?>
|
||||
<?php endif;?>
|
||||
<?php if($countStories or ($this->config->global->flow != 'onlyStory' and ($countBugs or $countLeftBugs))):?>
|
||||
<li class='pull-right'><div><?php common::printIcon('release', 'export', '', '', 'button', '', '', "export btn-sm");?></div></li>
|
||||
<?php endif;?>
|
||||
</ul>
|
||||
|
||||
@@ -2324,7 +2324,7 @@ class storyModel extends model
|
||||
common::printIcon('story', 'review', $vars, $story, 'list', 'review');
|
||||
common::printIcon('story', 'close', $vars, $story, 'list', 'off', '', 'iframe', true);
|
||||
common::printIcon('story', 'edit', $vars, $story, 'list', 'pencil');
|
||||
common::printIcon('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$vars", $story, 'list', 'sitemap');
|
||||
if($this->config->global->flow != 'onlyStory') common::printIcon('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$vars", $story, 'list', 'sitemap');
|
||||
break;
|
||||
}
|
||||
echo '</td>';
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
common::printIcon('story', 'close', "storyID=$story->id", $story, 'button', '', '', 'iframe text-danger', true);
|
||||
common::printIcon('story', 'activate', "storyID=$story->id", $story, 'button', '', '', 'iframe text-success', true);
|
||||
|
||||
if(!isonlybody() and (common::hasPriv('testcase', 'create') or common::hasPriv('testcase', 'batchCreate')))
|
||||
if($this->config->global->flow != 'onlyStory' and !isonlybody() and (common::hasPriv('testcase', 'create') or common::hasPriv('testcase', 'batchCreate')))
|
||||
{
|
||||
$this->app->loadLang('testcase');
|
||||
echo "<div class='btn-group'>";
|
||||
@@ -272,10 +272,15 @@
|
||||
</div>
|
||||
<div class='tabs'>
|
||||
<ul class='nav nav-tabs'>
|
||||
<?php if($config->global->flow == 'onlyStory'):?>
|
||||
<li class='active'><a href='#legendRelated' data-toggle='tab'><?php echo $lang->story->legendRelated;?></a></li>
|
||||
<?php else:?>
|
||||
<li class='active'><a href='#legendProjectAndTask' data-toggle='tab'><?php echo $lang->story->legendProjectAndTask;?></a></li>
|
||||
<li><a href='#legendRelated' data-toggle='tab'><?php echo $lang->story->legendRelated;?></a></li>
|
||||
<?php endif;?>
|
||||
</ul>
|
||||
<div class='tab-content'>
|
||||
<?php if($config->global->flow != 'onlyStory'):?>
|
||||
<div class='tab-pane active' id='legendProjectAndTask'>
|
||||
<ul class='list-unstyled'>
|
||||
<?php
|
||||
@@ -299,8 +304,10 @@
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<div class='tab-pane' id='legendRelated'>
|
||||
<?php endif;?>
|
||||
<div class="tab-pane <?php if($config->global->flow == 'onlyStory') echo 'active';?>" id='legendRelated'>
|
||||
<table class='table table-data table-condensed table-borderless'>
|
||||
<?php if($config->global->flow != 'onlyStory'):?>
|
||||
<?php if(!empty($fromBug)):?>
|
||||
<tr class='text-top'>
|
||||
<th class='w-70px'><?php echo $lang->story->legendFromBug;?></th>
|
||||
@@ -337,8 +344,9 @@
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr class='text-top'>
|
||||
<th><?php echo $lang->story->legendLinkStories;?></th>
|
||||
<th class='w-80px'><?php echo $lang->story->legendLinkStories;?></th>
|
||||
<td class='pd-0'>
|
||||
<ul class='list-unstyled'>
|
||||
<?php
|
||||
|
||||
@@ -30,7 +30,7 @@ foreach(explode(',', $showFields) as $field)
|
||||
if($field)$visibleFields[$field] = '';
|
||||
}
|
||||
$colspan = count($visibleFields) + 3;
|
||||
$hiddenStory = (isonlybody() and $storyID) ? ' hidden' : '';
|
||||
$hiddenStory = ((isonlybody() and $storyID) || $this->config->global->flow == 'onlyTask') ? ' hidden' : '';
|
||||
if($hiddenStory and isset($visibleFields['story'])) $colspan -= 1;
|
||||
?>
|
||||
<form class='form-condensed' method='post' target='hiddenwin'>
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
<button type='button' class='btn btn-link<?php echo $task->type == 'affair' ? '' : ' hidden'?>' id='selectAllUser'><?php echo $lang->task->selectAllUser ?></button>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if(strpos(",$showFields,", ',story,') !== false):?>
|
||||
<?php if(strpos(",$showFields,", ',story,') !== false and $this->config->global->flow != 'onlyTask'):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->task->story;?></th>
|
||||
<td colspan='5'>
|
||||
@@ -65,7 +65,9 @@
|
||||
<div class="input-group w-p100">
|
||||
<input type='hidden' id='color' name='color' data-provide='colorpicker' data-wrapper='input-group-btn fix-border-right' data-pull-menu-right='false' data-btn-tip='<?php echo $lang->task->colorTag ?>' data-update-text='#name'>
|
||||
<?php echo html::input('name', $task->name, "class='form-control' autocomplete='off'");?>
|
||||
<?php if($this->config->global->flow != 'onlyTask'):?>
|
||||
<span class='input-group-btn'><a href='javascript:copyStoryTitle();' id='copyButton' class='btn'><?php echo $lang->task->copyStoryTitle;?></a></span>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
@@ -161,9 +163,9 @@
|
||||
<th><?php echo $lang->files;?></th>
|
||||
<td colspan='5'><?php echo $this->fetch('file', 'buildform');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr <?php echo $this->config->global->flow == 'onlyTask' ? "class='hidden'" : '';?>>
|
||||
<th><?php echo $lang->task->afterSubmit;?></th>
|
||||
<td colspan='5'><?php echo html::radio('after', $lang->task->afterChoices, 'continueAdding');?></td>
|
||||
<td colspan='5'><?php echo html::radio('after', $lang->task->afterChoices, $this->config->global->flow == 'onlyTask' ? 'toTaskList' : 'continueAdding');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
|
||||
@@ -36,6 +36,9 @@ class user extends control
|
||||
*/
|
||||
public function view($account)
|
||||
{
|
||||
if($this->config->global->flow == 'onlyStory') $this->locate($this->createLink('user', 'dynamic', "period=today&account=$account"));
|
||||
if($this->config->global->flow == 'onlyTask') $this->locate($this->createLink('user', 'task', "account=$account"));
|
||||
if($this->config->global->flow == 'onlyTest') $this->locate($this->createLink('user', 'bug', "account=$account"));
|
||||
$this->locate($this->createLink('user', 'todo', "account=$account"));
|
||||
}
|
||||
|
||||
|
||||
@@ -7,13 +7,32 @@
|
||||
$date = isset($date) ? $date : helper::today();
|
||||
|
||||
echo "<li class='w-150px'>" . $userList . '</li>';
|
||||
echo "<li id='todoTab'>"; common::printLink('user', 'todo', "account=$account", $lang->user->todo); echo '</li>';
|
||||
echo "<li id='storyTab'>"; common::printLink('user', 'story', "account=$account", $lang->user->story); echo '</li>';
|
||||
echo "<li id='taskTab'>"; common::printLink('user', 'task', "account=$account", $lang->user->task); echo '</li>';
|
||||
echo "<li id='bugTab'>" ; common::printLink('user', 'bug', "account=$account", $lang->user->bug); echo '</li>';
|
||||
echo "<li id='testTab'>"; common::printLink('user', 'testtask', "account=$account", $lang->user->test); echo '</li>';
|
||||
if($config->global->flow == 'full')
|
||||
{
|
||||
echo "<li id='todoTab'>"; common::printLink('user', 'todo', "account=$account", $lang->user->todo); echo '</li>';
|
||||
}
|
||||
|
||||
if($config->global->flow != 'onlyTask')
|
||||
{
|
||||
echo "<li id='storyTab'>"; common::printLink('user', 'story', "account=$account", $lang->user->story); echo '</li>';
|
||||
}
|
||||
|
||||
if($config->global->flow == 'full' or $config->global->flow == 'onlyTask')
|
||||
{
|
||||
echo "<li id='taskTab'>"; common::printLink('user', 'task', "account=$account", $lang->user->task); echo '</li>';
|
||||
}
|
||||
|
||||
if($config->global->flow == 'full' or $config->global->flow == 'onlyTest')
|
||||
{
|
||||
echo "<li id='bugTab'>" ; common::printLink('user', 'bug', "account=$account", $lang->user->bug); echo '</li>';
|
||||
echo "<li id='testTab'>"; common::printLink('user', 'testtask', "account=$account", $lang->user->test); echo '</li>';
|
||||
}
|
||||
echo "<li id='dynamicTab'>"; common::printLink('user', 'dynamic', "type=today&account=$account", $lang->user->dynamic); echo '</li>' ;
|
||||
echo "<li id='projectTab'>"; common::printLink('user', 'project', "account=$account", $lang->user->project); echo '</li>';
|
||||
|
||||
if($config->global->flow == 'full' or $config->global->flow == 'onlyTask')
|
||||
{
|
||||
echo "<li id='projectTab'>"; common::printLink('user', 'project', "account=$account", $lang->user->project); echo '</li>';
|
||||
}
|
||||
echo "<li id='profileTab'>"; common::printLink('user', 'profile', "account=$account", $lang->user->profile); echo '</li>';
|
||||
|
||||
$activedSpan = $this->app->getMethodName() . 'Tab';
|
||||
|
||||
Reference in New Issue
Block a user