* fix UI for feature menu.
This commit is contained in:
@@ -32,9 +32,9 @@ js::set('bugBrowseType', $this->session->bugBrowseType);
|
||||
?>
|
||||
</span>
|
||||
</li>
|
||||
<?php foreach($app->customMenu['featurebar'] as $type => $featurebar):?>
|
||||
<?php if($featurebar['status'] == 'hide') continue;?>
|
||||
<li id='<?php echo $type?>Tab'><?php echo html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=$type¶m=0"), $featurebar['link'])?></li>
|
||||
<?php foreach(customModel::getFeatureMenu($this->moduleName, $this->methodName) as $menuItem):?>
|
||||
<?php if($menuItem->hidden) continue;?>
|
||||
<li id='<?php echo $menuItem->name?>Tab'><?php echo html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=$menuItem->name¶m=0"), $menuItem->text)?></li>
|
||||
<?php endforeach;?>
|
||||
<li id='bysearchTab'><a href='#'><i class='icon-search icon'></i> <?php echo $lang->bug->byQuery;?></a></li>
|
||||
</ul>
|
||||
|
||||
@@ -188,15 +188,15 @@ class custom extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function menu($module = 'main')
|
||||
public function menu($module = 'main', $method = '')
|
||||
{
|
||||
a(customModel::getModuleMenu($module));
|
||||
global $config;
|
||||
if($_POST)
|
||||
{
|
||||
$config->menucustom->main = $_POST['menu'];
|
||||
$this->send(array('result' => 'success', 'menu' => $_POST['menu']));
|
||||
}
|
||||
$this->send(json_encode(customModel::getModuleMenu($module)));
|
||||
$menu = empty($method) ? customModel::getFeatureMenu($module, $method) : customModel::getModuleMenu($module);
|
||||
$this->send(array('result' => $menu ? 'success' : 'fail', 'menu' => $menu));
|
||||
}
|
||||
}
|
||||
|
||||
+51
-176
@@ -123,17 +123,17 @@ class customModel extends model
|
||||
->beginIF($params['key'])->andWhere('`key`')->in($params['key'])->fi();
|
||||
}
|
||||
|
||||
public static function getModuleMenu($module = 'main', $rebuild = false)
|
||||
/**
|
||||
* Build menu data from config
|
||||
* @param object $allMenu
|
||||
* @param string | array $menuConfig
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public static function buildMenuConfig($allMenu, $menuConfig)
|
||||
{
|
||||
if(empty($module)) $module = 'main';
|
||||
|
||||
global $app, $lang, $config;
|
||||
// if(empty($app->customMenu)) $app->customMenu = array();
|
||||
// if(!$rebuild && !empty($app->customMenu[$module])) return $app->customMenu[$module];
|
||||
|
||||
$menuConfig = $config->menucustom->$module;
|
||||
if(!isset($menuConfig) && common::inNoviceMode()) $menuConfig = $config->menu->$module['novice'];
|
||||
$isSetMenuConfig = isset($menuConfig);
|
||||
$menu = array();
|
||||
|
||||
if($isSetMenuConfig)
|
||||
{
|
||||
@@ -148,9 +148,6 @@ class customModel extends model
|
||||
}
|
||||
}
|
||||
|
||||
$menu = array();
|
||||
$allMenu = $module == 'main' ? $lang->menu : $lang->$module->menu;
|
||||
|
||||
foreach($allMenu as $name => $item)
|
||||
{
|
||||
$label = '';
|
||||
@@ -193,183 +190,61 @@ class customModel extends model
|
||||
$menu[] = $menuItem;
|
||||
}
|
||||
}
|
||||
// $app->customMenu[$module] = $menu;
|
||||
return $menu;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get module menu data, if module is 'main' then return main menu
|
||||
* @param string $module
|
||||
* @param boolean $rebuild
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public static function getModuleMenu($module = 'main', $rebuild = false)
|
||||
{
|
||||
if(empty($module)) $module = 'main';
|
||||
|
||||
global $app, $lang, $config;
|
||||
if(empty($app->customMenu)) $app->customMenu = array();
|
||||
if(!$rebuild && !empty($app->customMenu[$module])) return $app->customMenu[$module];
|
||||
|
||||
$menuConfig = $config->menucustom->$module;
|
||||
if(!isset($menuConfig) && common::inNoviceMode()) $menuConfig = $config->menu->$module['novice'];
|
||||
|
||||
$allMenu = $module == 'main' ? $lang->menu : $lang->$module->menu;
|
||||
$menu = self::buildMenuConfig($allMenu, $menuConfig);
|
||||
|
||||
$app->customMenu[$module] = $menu;
|
||||
return $menu;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get main menu data
|
||||
* @param boolean $rebuild
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public static function getMainMenu($rebuild = false)
|
||||
{
|
||||
return self::getModuleMenu('main', $rebuild);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get feature menu
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public static function getFeatureMenu($module, $method)
|
||||
{
|
||||
global $app, $lang, $config;
|
||||
$menucustomKey = 'menucustom' . $module;
|
||||
|
||||
$app->loadLang($module);
|
||||
$featurebar = '';
|
||||
if(isset($lang->$module->featurebar[$method])) $featurebar = $lang->$module->featurebar[$method];
|
||||
$menucustomKey = 'menucustom' . $module;
|
||||
return $featurebar;
|
||||
if($featurebar)
|
||||
{
|
||||
$menuOrder = array();
|
||||
$menuStatus = array();
|
||||
if(isset($config->$menucustomKey->$method))
|
||||
{
|
||||
$menuStatus = json_decode($config->$menucustomKey->$method, true);
|
||||
foreach($menuStatus as $menuKey => $status) $menuOrder[] = $menuKey;
|
||||
}
|
||||
$configKey = 'menucustom' . $module;
|
||||
|
||||
/* Merge all menu. */
|
||||
$inOrderMenu = ',' . join(',', $menuOrder) . ',';
|
||||
$notInOrderMenu = array();
|
||||
foreach($featurebar as $menuKey => $menuName)
|
||||
{
|
||||
if(strpos($inOrderMenu, ",$menuKey,") === false) $notInOrderMenu[] = $menuKey;
|
||||
}
|
||||
if($notInOrderMenu)
|
||||
{
|
||||
$order = count($menuOrder);
|
||||
foreach($notInOrderMenu as $menuKey)
|
||||
{
|
||||
$menuOrder[$order] = $menuKey;
|
||||
$order++;
|
||||
}
|
||||
}
|
||||
ksort($menuOrder, SORT_ASC);
|
||||
$menuConfig = $config->$configKey->$method;
|
||||
$allMenu = $lang->$module->featurebar[$method];
|
||||
|
||||
$processedMenu = new stdclass();
|
||||
foreach($menuOrder as $order => $menuKey)
|
||||
{
|
||||
$menuContent = $featurebar[$menuKey];
|
||||
$menuContent = array('link' => $menuContent);
|
||||
$menuContent['status'] = isset($menuStatus[$menuKey]) ? $menuStatus[$menuKey] : 'show';
|
||||
$menuContent['order'] = ($order + 1) * 5;
|
||||
|
||||
$processedMenu->$menuKey = $menuContent;
|
||||
}
|
||||
$processedMenus['featurebar'] = $processedMenu;
|
||||
}
|
||||
}
|
||||
|
||||
public static function getCustomMenu($module, $method)
|
||||
{
|
||||
global $app, $lang, $config;
|
||||
if(!isset($lang->$module->menu)) return array();
|
||||
$allMenu['main'] = $lang->menu;
|
||||
$allMenu['module'] = $lang->$module->menu;
|
||||
|
||||
/* Process main and module menu. */
|
||||
$processedMenus = array();
|
||||
foreach($allMenu as $type => $menu)
|
||||
{
|
||||
$menucustom = '';
|
||||
$menuOrder = array();
|
||||
$menuStatus = array();
|
||||
if($type == 'main') $menucustom = isset($config->menucustom->main) ? $config->menucustom->main : '';
|
||||
if($type == 'module')$menucustom = isset($config->menucustomModule->$module) ? $config->menucustomModule->$module : '';
|
||||
|
||||
/* Get order and status from config. */
|
||||
if($menucustom)
|
||||
{
|
||||
$menuStatus = json_decode($menucustom, true);
|
||||
$i = 1;
|
||||
foreach($menuStatus as $menuKey => $status)
|
||||
{
|
||||
$order = $i * 5;
|
||||
$menuOrder[$order] = $menuKey;
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
if(empty($menuOrder)) $menuOrder = $type == 'main' ? $lang->menuOrder : $lang->$module->menuOrder;
|
||||
|
||||
/* Merge all menu. */
|
||||
$inOrderMenu = ',' . join(',', $menuOrder) . ',';
|
||||
$notInOrderMenu = array();
|
||||
foreach($menu as $menuKey => $menuName)
|
||||
{
|
||||
if(strpos($inOrderMenu, ",$menuKey,") === false) $notInOrderMenu[] = $menuKey;
|
||||
}
|
||||
if($notInOrderMenu)
|
||||
{
|
||||
$order = count($menuOrder) * 5;
|
||||
foreach($notInOrderMenu as $menuKey)
|
||||
{
|
||||
$order = $order + 5;
|
||||
$menuOrder[$order] = $menuKey;
|
||||
}
|
||||
}
|
||||
ksort($menuOrder, SORT_ASC);
|
||||
|
||||
/* Rebuild menu. */
|
||||
$processedMenu = new stdclass();
|
||||
foreach($menuOrder as $order => $menuKey)
|
||||
{
|
||||
if(!isset($menu->$menuKey)) continue;
|
||||
$menuContent = $menu->$menuKey;
|
||||
if(is_string($menuContent)) $menuContent = array('link' => $menuContent);
|
||||
$menuContent['status'] = isset($menuStatus[$menuKey]) ? $menuStatus[$menuKey] : 'show';
|
||||
$menuContent['order'] = $order;
|
||||
|
||||
if(strpos($menuContent['link'], '|') !== false)
|
||||
{
|
||||
list($menuTitle, $menuModule, $menuMethod) = explode('|', $menuContent['link']);
|
||||
if($menuContent['status'] == 'show' and !common::hasPriv($menuModule, $menuMethod)) $menuContent['status'] = 'hide';
|
||||
}
|
||||
|
||||
$processedMenu->$menuKey = $menuContent;
|
||||
}
|
||||
$processedMenus[$type] = $processedMenu;
|
||||
}
|
||||
|
||||
/* Process featurebar. */
|
||||
$app->loadLang($module);
|
||||
$featurebar = '';
|
||||
if(isset($lang->$module->featurebar[$method])) $featurebar = $lang->$module->featurebar[$method];
|
||||
$menucustomKey = 'menucustom' . $module;
|
||||
if($featurebar)
|
||||
{
|
||||
$menuOrder = array();
|
||||
$menuStatus = array();
|
||||
if(isset($config->$menucustomKey->$method))
|
||||
{
|
||||
$menuStatus = json_decode($config->$menucustomKey->$method, true);
|
||||
foreach($menuStatus as $menuKey => $status) $menuOrder[] = $menuKey;
|
||||
}
|
||||
|
||||
/* Merge all menu. */
|
||||
$inOrderMenu = ',' . join(',', $menuOrder) . ',';
|
||||
$notInOrderMenu = array();
|
||||
foreach($featurebar as $menuKey => $menuName)
|
||||
{
|
||||
if(strpos($inOrderMenu, ",$menuKey,") === false) $notInOrderMenu[] = $menuKey;
|
||||
}
|
||||
if($notInOrderMenu)
|
||||
{
|
||||
$order = count($menuOrder);
|
||||
foreach($notInOrderMenu as $menuKey)
|
||||
{
|
||||
$menuOrder[$order] = $menuKey;
|
||||
$order++;
|
||||
}
|
||||
}
|
||||
ksort($menuOrder, SORT_ASC);
|
||||
|
||||
$processedMenu = new stdclass();
|
||||
foreach($menuOrder as $order => $menuKey)
|
||||
{
|
||||
$menuContent = $featurebar[$menuKey];
|
||||
$menuContent = array('link' => $menuContent);
|
||||
$menuContent['status'] = isset($menuStatus[$menuKey]) ? $menuStatus[$menuKey] : 'show';
|
||||
$menuContent['order'] = ($order + 1) * 5;
|
||||
|
||||
$processedMenu->$menuKey = $menuContent;
|
||||
}
|
||||
$processedMenus['featurebar'] = $processedMenu;
|
||||
}
|
||||
|
||||
return $processedMenus;
|
||||
return $allMenu ? self::buildMenuConfig($allMenu, $menuConfig) : null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,9 +28,9 @@
|
||||
?>
|
||||
</span>
|
||||
</li>
|
||||
<?php foreach($app->customMenu['featurebar'] as $type => $featurebar):?>
|
||||
<?php if($featurebar['status'] == 'hide') continue;?>
|
||||
<li id='<?php echo $type?>Tab'><?php echo html::a($this->inlink('browse', "productID=$productID&branch=$branch&browseType=$type"), $featurebar['link']);?></li>
|
||||
<?php foreach(customModel::getFeatureMenu($this->moduleName, $this->methodName) as $menuItem):?>
|
||||
<?php if($menuItem->hidden) continue;?>
|
||||
<li id='<?php echo $menuItem->name?>Tab'><?php echo html::a($this->inlink('browse', "productID=$productID&branch=$branch&browseType=$menuItem->name"), $menuItem->text);?></li>
|
||||
<?php endforeach;?>
|
||||
<li id='bysearchTab'><a href='javascript:;'><i class='icon-search icon'></i> <?php echo $lang->product->searchStory;?></a></li>
|
||||
</ul>
|
||||
|
||||
@@ -255,12 +255,14 @@ $lang->project->featurebar['task']['unclosed'] = $lang->project->unclosed;
|
||||
$lang->project->featurebar['task']['all'] = $lang->project->allTasks;
|
||||
$lang->project->featurebar['task']['kanban'] = $lang->project->kanban;
|
||||
$lang->project->featurebar['task']['burn'] = $lang->project->burn;
|
||||
$lang->project->featurebar['task']['tree'] = $lang->project->tree;
|
||||
$lang->project->featurebar['task']['assignedtome'] = $lang->project->assignedToMe;
|
||||
$lang->project->featurebar['task']['status'] = $lang->project->statusSelects[''];
|
||||
$lang->project->featurebar['task']['group'] = $lang->project->groups[''];
|
||||
$lang->project->featurebar['grouptask'] = $lang->project->featurebar['task'];
|
||||
$lang->project->featurebar['kanban'] = $lang->project->featurebar['task'];
|
||||
$lang->project->featurebar['burn'] = $lang->project->featurebar['task'];
|
||||
$lang->project->featurebar['burn'] = $lang->project->featurebar['task'];
|
||||
$lang->project->featurebar['tree'] = $lang->project->featurebar['task'];
|
||||
|
||||
$lang->project->treeLevel = array();
|
||||
$lang->project->treeLevel['product'] = array('icon' => 'icon-cube', 'text' => '产品视图');
|
||||
|
||||
@@ -32,27 +32,28 @@
|
||||
$hasGroupTaskPriv = common::hasPriv('project', 'groupTask');
|
||||
$hasTreePriv = common::hasPriv('project', 'tree');
|
||||
?>
|
||||
<?php foreach($app->customMenu['featurebar'] as $type => $featurebar):?>
|
||||
<?php foreach(customModel::getFeatureMenu($this->moduleName, $this->methodName) as $menuItem):?>
|
||||
<?php
|
||||
if($featurebar['status'] == 'hide') continue;
|
||||
if($hasBrowsePriv and ($type == 'unclosed' or $type == 'all' or $type == 'assignedtome')) echo "<li id='{$type}Tab'>" . html::a(inlink('task', "project=$projectID&type=$type"), $featurebar['link']) . '</li>' ;
|
||||
if($hasKanbanPriv and $type == 'kanban') echo "<li id='kanbanTab'>" . html::a(inlink('kanban', "projectID=$projectID"), $featurebar['link']) . '</li>';
|
||||
if($hasBurnPriv and $type == 'burn' and ($project->type == 'sprint' or $project->type == 'waterfall')) echo "<li id='burnTab'>" . html::a(inlink('burn', "project=$projectID"), $featurebar['link']) . '</li>' ;
|
||||
if($hasTreePriv and $type == 'tree') echo "<li id='treeTab'>"; common::printLink('project', 'tree', "projectID=$projectID", $lang->project->tree, '', '', false); echo '</li>';
|
||||
if($menuItem->hidden) continue;
|
||||
$type = $menuItem->name;
|
||||
if($hasBrowsePriv and ($type == 'unclosed' or $type == 'all' or $type == 'assignedtome')) echo "<li id='{$type}Tab'>" . html::a(inlink('task', "project=$projectID&type=$type"), $menuItem->text) . '</li>' ;
|
||||
if($hasKanbanPriv and $type == 'kanban') echo "<li id='kanbanTab'>" . html::a(inlink('kanban', "projectID=$projectID"), $menuItem->text) . '</li>';
|
||||
if($hasBurnPriv and $type == 'burn' and ($project->type == 'sprint' or $project->type == 'waterfall')) echo "<li id='burnTab'>" . html::a(inlink('burn', "project=$projectID"), $menuItem->text) . '</li>' ;
|
||||
if($hasTreePriv and $type == 'tree') echo "<li id='treeTab'>" . html::a(inlink('project', 'tree', "projectID=$projectID"), $menuItem->text) . '</li>';
|
||||
|
||||
if($hasBrowsePriv and $type == 'status')
|
||||
{
|
||||
echo "<li id='statusTab' class='dropdown'>";
|
||||
$taskBrowseType = isset($status) ? $this->session->taskBrowseType : '';
|
||||
$current = zget($lang->project->statusSelects, $taskBrowseType, '');
|
||||
if(empty($current)) $current = $featurebar['link'];
|
||||
if(empty($current)) $current = $menuItem->text;
|
||||
echo html::a('javascript:;', $current . " <span class='caret'></span>", '', "data-toggle='dropdown'");
|
||||
echo "<ul class='dropdown-menu'>";
|
||||
foreach ($lang->project->statusSelects as $key => $value)
|
||||
{
|
||||
if($key == '') continue;
|
||||
echo '<li' . ($key == $taskBrowseType ? " class='active'" : '') . '>';
|
||||
echo html::a($this->createLink('project', 'task', "project=$projectID&type=$key"), $value);
|
||||
echo html::a($this->createLink('project', 'task', "project=$projectID&type=$key"), $value) . '</li>';
|
||||
}
|
||||
echo '</ul></li>';
|
||||
}
|
||||
@@ -61,23 +62,19 @@
|
||||
echo "<li id='groupTab' class='dropdown'>";
|
||||
$groupBy = isset($groupBy) ? $groupBy : '';
|
||||
$current = zget($lang->project->groups, isset($groupBy) ? $groupBy : '', '');
|
||||
if(empty($current)) $current = $featurebar['link'];
|
||||
if(empty($current)) $current = $menuItem->text;
|
||||
echo html::a('javascript:;', $current . " <span class='caret'></span>", '', "data-toggle='dropdown'");
|
||||
echo "<ul class='dropdown-menu'>";
|
||||
foreach ($lang->project->groups as $key => $value)
|
||||
{
|
||||
if($key == '') continue;
|
||||
echo '<li' . ($key == $groupBy ? " class='active'" : '') . '>';
|
||||
echo html::a($this->createLink('project', 'groupTask', "project=$projectID&groupBy=$key"), $value);
|
||||
echo html::a($this->createLink('project', 'groupTask', "project=$projectID&groupBy=$key"), $value) . '</li>';
|
||||
}
|
||||
echo '</ul></li>';
|
||||
}
|
||||
?>
|
||||
<?php endforeach;?>
|
||||
|
||||
<?php
|
||||
if($this->methodName == 'task') echo "<li id='bysearchTab'><a href='#'><i class='icon-search icon'></i> {$lang->project->byQuery}</a></li> ";
|
||||
?>
|
||||
</ul>
|
||||
<div class='actions'>
|
||||
<div class='btn-group'>
|
||||
|
||||
@@ -16,12 +16,13 @@
|
||||
</span>
|
||||
</li>
|
||||
<?php endif;?>
|
||||
<?php foreach($app->customMenu['featurebar'] as $type => $featurebar):?>
|
||||
<?php if($featurebar['status'] == 'hide') continue;?>
|
||||
<?php foreach(customModel::getFeatureMenu($this->moduleName, $this->methodName) as $menuItem):?>
|
||||
<?php
|
||||
if($menuItem->hidden) continue;
|
||||
$type = $menuItem->name;
|
||||
if(common::hasPriv('testcase', 'browse') and ($type == 'all' or $type == 'needconfirm'))
|
||||
{
|
||||
echo "<li id='{$type}Tab'>" . html::a($this->createLink('testcase', 'browse', "productid=$productID&branch=$branch&browseType=$type"), $featurebar['link']) . "</li>";
|
||||
echo "<li id='{$type}Tab'>" . html::a($this->createLink('testcase', 'browse', "productid=$productID&branch=$branch&browseType=$type"), $menuItem->text) . "</li>";
|
||||
}
|
||||
elseif($type == 'group' and common::hasPriv('testcase', 'groupcase'))
|
||||
{
|
||||
|
||||
@@ -3,12 +3,13 @@
|
||||
<?php echo "<span class='prefix'>" . html::icon($lang->icons['usecase']) . '</span><strong>' . $task->name . '</strong>';?>
|
||||
</div>
|
||||
<div class='nav'>
|
||||
<?php foreach($app->customMenu['featurebar'] as $type => $featurebar):?>
|
||||
<?php if($featurebar['status'] == 'hide') continue;?>
|
||||
<?php foreach(customModel::getFeatureMenu($this->moduleName, $this->methodName) as $menuItem):?>
|
||||
<?php
|
||||
if($menuItem->hidden) continue;
|
||||
$type = $menuItem->name;
|
||||
if(common::hasPriv('testtask', 'cases') and ($type == 'all' or $type == 'assignedtome'))
|
||||
{
|
||||
echo "<li id='{$type}Tab'>" . html::a($this->inlink('cases', "taskID=$taskID&browseType=$type¶m=0"), $featurebar['link']) . "</li>";
|
||||
echo "<li id='{$type}Tab'>" . html::a($this->inlink('cases', "taskID=$taskID&browseType=$type¶m=0"), $menuItem->text) . "</li>";
|
||||
}
|
||||
elseif(common::hasPriv('testtask', 'cases') and $type == 'group')
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user