* fix UI for feature menu.

This commit is contained in:
Catouse
2016-04-20 14:06:23 +08:00
parent c4c5f942e8
commit 0733b9f177
8 changed files with 82 additions and 206 deletions
+3 -3
View File
@@ -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&param=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&param=0"), $menuItem->text)?></li>
<?php endforeach;?>
<li id='bysearchTab'><a href='#'><i class='icon-search icon'></i>&nbsp;<?php echo $lang->bug->byQuery;?></a></li>
</ul>
+3 -3
View File
@@ -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
View File
@@ -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;
}
}
+3 -3
View File
@@ -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>
+3 -1
View File
@@ -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' => '产品视图');
+11 -14
View File
@@ -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>&nbsp;{$lang->project->byQuery}</a></li> ";
?>
</ul>
<div class='actions'>
<div class='btn-group'>
+4 -3
View File
@@ -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'))
{
+4 -3
View File
@@ -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&param=0"), $featurebar['link']) . "</li>";
echo "<li id='{$type}Tab'>" . html::a($this->inlink('cases', "taskID=$taskID&browseType=$type&param=0"), $menuItem->text) . "</li>";
}
elseif(common::hasPriv('testtask', 'cases') and $type == 'group')
{