diff --git a/VERSION b/VERSION index 9341e7602b..b82244ff8c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -10.0.stable +10.1.stable diff --git a/config/config.php b/config/config.php index 037ff1caec..b8e9bcd87a 100644 --- a/config/config.php +++ b/config/config.php @@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}} if(!function_exists('getWebRoot')){function getWebRoot(){}} /* 基本设置。Basic settings. */ -$config->version = '10.0'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. +$config->version = '10.1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. $config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP. $config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time. $config->timezone = 'Asia/Shanghai'; // 时区设置。 The time zone setting, for more see http://www.php.net/manual/en/timezones.php. diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 19ea984146..2f1386f4d9 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -1,3 +1,158 @@ +2018-07-11 10.1 +完成的需求 +3068 需求关联相关需求字段时,选择需求后页面没有及时刷新。 +3067 项目需求列表页面调整创建需求和关联需求按钮的位置。 +3066 项目任务列表可以直接点击进入 +3065 优化各个视图首页区块中滚动条的位置和样式 +3064 调整编辑器和详情页面P标签的行距,精简,保持一致。 +3058 检查zt_webhookdatas表是否还需要,如果不需要,去掉 +3037 多人任务只能线性执行 +3036 调整待办列表中操作按钮 +3035 调整首页指派给我区块中待办的查询逻辑 +3034 父任务删除,子任务一起删除 +3033 父任务的起止日期根据子任务的起止日期变化 +3031 后台自定义必填项,如果是系统原来默认的必填项,不出现在编辑的下拉列表里,即不允许编辑 +3027 创建需求列出的计划规则修改 +3025 数据库表索引再过一遍,有些加了没用上 +3015 导出设置,选中某个已存模板,下方模板名称不显示。点删除时,不大清楚删除的是哪个模板 +3012 创建任务,如果是多人类型的任务,设置团队的时候目前只能设置6个,考虑增加添加按钮,排序换成拖拽的 +2935 文档库和文档的权限分开进行检查 +2910 下个版本升级时把项目状态是done的改为closed +2857 需求和bug的所属模块改为后台可以去掉必填 +2835 导出用例结果的时候,不管状态。有实际情况数据就导出。 +2820 子任务详情,标题中的父任务,做成链接。 +2818 把任务列表自定义显示字段中的“完成”改成“完成日期” + +修复的Bug +1990 需求以重复原因关闭之后,再修改关闭原因无法将重复需求字段置空 +1989 测试单关联用例页面,搜索,选择搜索字段,搜索框数据没有变化 +1988 操作栏存在换行显示的问题 +1987 登录后跳转的网址不对 +1986 发信功能,收到的邮件,邮件标题跳转链接错误 +1984 所有产品和所有项目页面,对产品和项目排序不生效 +1981 组织-权限 有一个没有对号的汉字展示 +1978 部分模块拖动排序显示有问题 +1977 添加待办不填写待办名称,没有提示必填项 +1975 批量添加bug多项录入卡死 +1971 文档模块下面富文本编辑器选择SQL会变形 +1966 产品的模块显示位置错误 +1965 创建任务,抄送给下拉显示不完整 +1964 项目按计划关联需求时会把草稿状态的需求关联进来 +1963 markdown无法正常录入数据 +1962 富文本编辑器的图片空间功能异常 +1961 测试单-关联用例 缺少 按照bug关联 用例的功能 +1958 项目主页任务统计与实际不符 +1951 10.0.beta产品计划关联缺陷列表,不能按查询条件过滤数据 +1950 长名称的产品,需要优化测试单首页样式 +1948 任务管理模式下,文档里产品相关内容需要隐藏 +1944 产品需求里生成报表,下拉时会出现所有表头的表格 +1942 项目-任务,按分组查看任务时,父子任务会统计负责任务工时总和 +1941 创建周期性待办,新建的待办和周期待办的创建人不一致 +1935 bug标题过长时,点击解决bug,会遮挡下方信息 +1924 文档库创建文档链接跳转不对 +1921 多人任务创建后点击编辑然后保存无法保存 +1920 产品-项目:项目过多,加一个总数给用户预知 +1919 产品-概况:最新动态模块中,对重要信息待处理(以蓝色的点重点突出) +1918 文档-产品:文档的产品详情页有页码行 +1917 文档-文档主页:在左边的文档导航部分,产品名过长 +1913 组织-权限,视图维护设置可以访问的产品或项目无效 +1908 修改日志无法滚动 +1903 产品批量编辑与概况显示不一致 +1884 任务列表工时统计显示不友好 +1873 需求单独分解任务 列表页面的任务数不会变化 +1870 文档同时编辑没有提示 +1846 详情页面,先删除再取消,再点击编辑,然后点返回,谷歌和safari浏览器会提醒是否要删除该任务 +1829 燃尽图模块的图例,位置有一点挤 +1575 测试-bug 简单表格自定义字段比较多的时候排版有问题 +1561 单独创建用户的时候对邮件地址没有进行验证 +1560 用例步骤和预期高度样式显示不友好 +1559 测试报告中点击用例标题显示最新用例版本内容,不是测试单执行的用例版本内容 +1558 多人任务任务点完成时,会自动添加一条工时记录 +1557 套件关联用例问题 +1555 使用markdown创建文档时>会被过滤 +1554 附件名称长显示不美观 +1548 测试单模块显示错误 +1542 访问控制分组白名单显示优化 +1541 项目-版本 关联需求显示阶段不一致 +1540 10.0版本批量创建任务和需求,页面加载慢。 +1532 项目-版本,编辑已上传的附件名称,历史记录显示超出浏览器页面 +1985 任务标题过长,完成、关闭、激活任务页面标题会遮挡下方信息 +1983 在安装禅道,生成配置文件,检查requestType是否可以使用PATH_INFO方式的时候,检查不起作用 +1982 计划列表的描述没有换行 +1980 产品类型为多平台或多分支类型,产品下的需求所属阶段信息显示不出来 +1979 组织-用户列表 职位栏换行 +1976 升级成功页面,然之协同logo显示不全 +1973 优化名字很长时的文档页面 +1972 保存提交操作没有增加防止重复点击的设置 +1970 一键安装包zbox.php代码问题 +1968 我的地盘,欢迎总览区块,任务已延期数量统计不准确 +1967 非强制评审用户,对草稿状态的需求进行变更,需求状态还是显示为草稿 +1960 需求阶段规则完善 +1957 测试用例导入csv文件,预期和步骤以英文引号结尾无法导入 +1956 产品创建方法代码优化 +1955 创建项目时如果关联计划,项目能创建成功但是页面没有跳转,并且计划没有关联上 +1954 统计-测试-bug创建表,数据没有正常显示 +1947 集成然之,自动跳回然之功能打开,用例执行失败转bug,用例步骤不会自动带到bug中 +1943 需求变更确认按钮点击无反应 +1940 测试用例导出csv文件,实际情况字段内容没有导出 +1939 创建多人任务时不维护预计工时,用户点击完成,任务状态会变为已完成 +1938 测试-bug,编辑bug,选择所属项目后,解决版本只能选择这个项目下的版本 +1936 修改config/config.php文件后缀名白名单,pcblib格式文件上传后后缀名重复 +1930 测试-bug,按抄送给字段进行搜索,没有数据 +1929 需求查看功能异常 +1927 需求分组子任务工时重复计算 +1926 项目-需求 无法关联需求 +1925 维护产品线页面点击返回无效 +1923 需求标题列表和详情页面显示不一致 +1922 附件上传目录只读时ajaxForm无法正常提交 +1916 文档的视图切换按钮只在搜索结果页出现,其他页面没有 +1915 文档-项目:Google浏览器中,点击“项目”,文档左边的导航部分会消失 +1912 10.0 bug列表自定义字段无法设置 +1911 bug详情页面无法显示完整长版本名称 +1910 module/project/control.php代码错误 +1909 我的地盘项目状态与详情页面不一致 +1907 修复这里面的安全漏洞 +1897 项目-团队中,受限用户选择是,用户还是可以创建任务 +1895 邮件中设置的发信人和收到邮件时的发信人不一致 +1894 产品-概况页面,历史记录记录的是最新动态中的信息 +1893 测试-测试单删除后,还可以搜索到 +1892 周期待办编辑保存后会创建不符合要求的待办 +1891 任务分解子任务,不填写任务名称也可以保存 +1890 添加子任务没有必填项提醒 +1889 计划关联bug默认进来的未关联bug数量显示不对 +1888 组织-权限,权限维护,取消产品计划-关联需求权限,产品-计划下需求无法排序 +1887 点击模块不显示子任务 +1880 子任务收起会被勾选 +1874 批量修改需求阶段不生效 +1872 多人任务第二个人员无法记录工时 +1871 优化创建用户页面密码验证失败的提示 +1585 升级成功的页面,然之协同的logo显示不完整 +1582 待办关闭后,指派人还是之前指派的用户 +1581 zbox服务不能正常重启 +1556 看板上拖动任务没有按预期工作 +1553 调整任务指派时剩余工时字段的逻辑 +1552 关联需求,搜索是否需要显示删除的需求。 +1551 国际版绑定禅道官网逻辑错误 +1547 批量添加用户,职位显示为必填,实际职位非必填字段 +1546 英文版文档首页%s +1544 周期待办的创建人会显示所有成员中的一个 +1534 项目-概况的 关联计划 无法修改 +1533 钉钉机器人中发的链接点击无法访问 +1530 测试报告(测试管理工具)提示需要关联项目 +1528 平台页面无法切换产品 +1527 用户源码包安装检测的session目录读写权限不准 +1526 禅道更新到 9.8.x后速度变慢cpu占用率增高 +1522 禅道附件图片无法下载预览 +1521 受限用户可以删除任何能看到的附件 +1520 列表页面排序功能异常 +1519 所有项目排序功能异常 +1512 新建产品,维护产品线,点刷新显示为维护模块 +1506 升级结果页面,然之协同的logo没显示完整 +1501 项目关联的产品多,显示样式需优化。 +1496 员工负载表显示错位 +1492 创建项目页面关联计划,计划下的需求不会关联到项目中 +1491 任务列表,点击表头进行排序,对子任务不起作用 + 2018-04-03 9.8.3.stable 完成的需求 2872 把用户的入职日期属性展示出来 diff --git a/framework/helper.class.php b/framework/helper.class.php index e54e60d459..af58e010ca 100644 --- a/framework/helper.class.php +++ b/framework/helper.class.php @@ -162,3 +162,18 @@ function formatTime($time, $format = '') if($format) return date($format, strtotime($time)); return trim($time); } + +/** + * Fix for session error. + * + * @param int $class + * @access protected + * @return void + */ +function __autoload($class) +{ + if(!class_exists($class)) + { + if($class == 'post_max_size' or $class == 'max_input_vars') eval('class ' . $class . ' {};'); + } +} diff --git a/lib/snoopy/snoopy.class.php b/lib/snoopy/snoopy.class.php index e83e283ddb..d5d7c2ce76 100644 --- a/lib/snoopy/snoopy.class.php +++ b/lib/snoopy/snoopy.class.php @@ -1068,7 +1068,7 @@ class Snoopy $headers[] = "API-RemoteIP: " . $_SERVER['REMOTE_ADDR']; curl_setopt($curl, CURLOPT_URL, $URI); - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers ); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLINFO_HEADER_OUT, TRUE); if(!empty($body)) { @@ -1082,6 +1082,21 @@ class Snoopy $result_headers = curl_getinfo($curl); curl_close($curl); + global $app; + $logFile = $app->getLogRoot() . 'saas.' . date('Ymd') . '.log.php'; + if(!file_exists($logFile)) file_put_contents($logFile, ''); + + $fh = @fopen($logFile, 'a'); + if($fh) + { + fwrite($fh, date('Ymd H:i:s') . ": " . $app->getURI() . "\n"); + fwrite($fh, "url: " . $URI . "\n"); + if(!empty($data)) fwrite($fh, "data: " . print_r($body, true) . "\n"); + fwrite($fh, "results:" . print_r($results, true) . "\n"); + if(!empty($return)) fwrite($fh, "errors: " . $return . "\n"); + fclose($fh); + } + $this->_redirectaddr = false; $this->response_code = $result_headers['http_code']; if(!empty($result_headers['redirect_url']))$this->_redirectaddr = $result_headers['redirect_url']; diff --git a/module/block/lang/zh-tw.php b/module/block/lang/zh-tw.php index a62f02bd04..8a4f399770 100644 --- a/module/block/lang/zh-tw.php +++ b/module/block/lang/zh-tw.php @@ -15,6 +15,7 @@ $lang->block->name = '區塊名稱'; $lang->block->style = '外觀'; $lang->block->grid = '位置'; $lang->block->color = '顏色'; +$lang->block->reset = '恢復預設'; $lang->block->account = '所屬用戶'; $lang->block->module = '所屬模組'; @@ -52,6 +53,8 @@ $lang->block->createBlock = '添加區塊'; $lang->block->editBlock = '編輯區塊'; $lang->block->ordersSaved = '排序已保存'; $lang->block->confirmRemoveBlock = '確定移除區塊嗎?'; +$lang->block->noticeNewBlock = '10.0版本以後各個視圖主頁提供了全新的視圖,您要啟用新的視圖佈局嗎?'; +$lang->block->confirmReset = '是否恢復預設佈局'; $lang->block->closeForever = '永久關閉'; $lang->block->confirmClose = '確定永久關閉該區塊嗎?關閉後所有人都將無法使用該區塊,可以在後台自定義中打開。'; $lang->block->remove = '移除'; diff --git a/module/block/model.php b/module/block/model.php index 82f3f233eb..6bfa893c47 100644 --- a/module/block/model.php +++ b/module/block/model.php @@ -160,11 +160,11 @@ class blockModel extends model $projects = $this->loadModel('project')->getPairs(); $products = $this->loadModel('product')->getPairs(); - $data['tasks'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_TASK)->where('assignedTo')->eq($this->app->user->account)->fetch('count'); - $data['bugs'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_BUG)->where('assignedTo')->eq($this->app->user->account)->fetch('count'); - $data['stories'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_STORY)->where('assignedTo')->eq($this->app->user->account)->fetch('count'); - $data['projects'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_PROJECT)->where('id')->in(array_keys($projects))->andWhere("(status='wait' or status='doing')")->fetch('count'); - $data['products'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_PRODUCT)->where('status')->ne('closed')->andWhere('id')->in(array_keys($products))->fetch('count'); + $data['tasks'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_TASK)->where('assignedTo')->eq($this->app->user->account)->andWhere('deleted')->eq(0)->fetch('count'); + $data['bugs'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_BUG)->where('assignedTo')->eq($this->app->user->account)->andWhere('deleted')->eq(0)->fetch('count'); + $data['stories'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_STORY)->where('assignedTo')->eq($this->app->user->account)->andWhere('deleted')->eq(0)->fetch('count'); + $data['projects'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_PROJECT)->where('id')->in(array_keys($projects))->andWhere("(status='wait' or status='doing')")->andWhere('deleted')->eq(0)->fetch('count'); + $data['products'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_PRODUCT)->where('status')->ne('closed')->andWhere('id')->in(array_keys($products))->andWhere('deleted')->eq(0)->fetch('count'); $today = date('Y-m-d'); $data['delayTask'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_TASK) @@ -172,17 +172,20 @@ class blockModel extends model ->andWhere('status')->in('wait,doing') ->andWhere('deadline')->ne('0000-00-00') ->andWhere('deadline')->lt($today) + ->andWhere('deleted')->eq(0) ->fetch('count'); $data['delayBug'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_BUG) ->where('assignedTo')->eq($this->app->user->account) ->andWhere('status')->eq('active') ->andWhere('deadline')->ne('0000-00-00') ->andWhere('deadline')->lt($today) + ->andWhere('deleted')->eq(0) ->fetch('count'); $data['delayProject'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_PROJECT) ->where('id')->in(array_keys($projects)) ->andWhere('status')->in('wait,doing') ->andWhere('end')->lt($today) + ->andWhere('deleted')->eq(0) ->fetch('count'); return $data; diff --git a/module/bug/control.php b/module/bug/control.php index 187e6b3c7a..027540e689 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -482,7 +482,7 @@ class bug extends control } /* Set custom. */ - $product = $this->product->getById($productID); + $product = $this->product->getById($productID); foreach(explode(',', $this->config->bug->list->customBatchCreateFields) as $field) { if($product->type != 'normal') $customFields[$product->type] = $this->lang->product->branchName[$product->type]; diff --git a/module/bug/js/batchcreate.js b/module/bug/js/batchcreate.js index 91cfc514d4..6c359ba21b 100644 --- a/module/bug/js/batchcreate.js +++ b/module/bug/js/batchcreate.js @@ -23,7 +23,7 @@ function setBranchRelated(branchID, productID, num) if(!modules) modules = ''; $('#modules' + num).replaceWith(modules); $("#modules" + num + "_chosen").remove(); - $("#modules" + num).chosen(defaultChosenOptions); + $("#modules" + num).chosen(); }); projectLink = createLink('product', 'ajaxGetProjects', 'productID=' + productID + '&projectID=0&branch=' + branchID + '&num=' + num); @@ -32,7 +32,7 @@ function setBranchRelated(branchID, productID, num) if(!projects) projects = ''; $('#projects' + num).replaceWith(projects); $("#projects" + num + "_chosen").remove(); - $("#projects" + num).chosen(defaultChosenOptions); + $("#projects" + num).chosen(); }); buildLink = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + "&varName=openedBuilds&build=&branch=" + branchID + "&index=" + num); @@ -63,7 +63,7 @@ function setOpenedBuilds(link, index) $('#buildBox' + index + ' select').addClass('select-1'); $('#buildBox' + index + ' select').attr('name','openedBuilds[' + index + '][]'); $('#buildBox' + index + ' select').attr('id','openedBuilds' + index); - $('#buildBox' + index + ' select').chosen(defaultChosenOptions); + $('#buildBox' + index + ' select').chosen(); index++; if($('#projects' + index).val() != 'ditto') break; diff --git a/module/bug/js/browse.js b/module/bug/js/browse.js index c48f4edd06..5bd584904b 100644 --- a/module/bug/js/browse.js +++ b/module/bug/js/browse.js @@ -4,7 +4,15 @@ $(function() if(flow == 'onlyTest') { - $('#subNavbar > .nav > li[data-id=' + browseType + ']').addClass('active'); + $('#subNavbar > .nav li[data-id=' + browseType + ']').addClass('active'); + var $more = $('#subNavbar > .nav > li[data-id=more]'); + if($more.find('.dropdown-menu').children().length) + { + $more.find('.dropdown-menu').children().each(function() + { + if($(this).hasClass('active')) $more.addClass('active'); + }); + } var navWidth = $('#subNavbar > .nav').width(); var leftWidth = 0; diff --git a/module/bug/js/common.js b/module/bug/js/common.js index 9e565e87a2..35fc894ff7 100644 --- a/module/bug/js/common.js +++ b/module/bug/js/common.js @@ -21,7 +21,7 @@ $(function() if(page == 'create' || page == 'edit' || page == 'assignedto' || page == 'confirmbug') { oldProductID = $('#product').val(); - $("#story, #task, #mailto").chosen(defaultChosenOptions); + $("#story, #task, #mailto").chosen(); } if(window.flow != 'full') @@ -57,7 +57,7 @@ function loadAll(productID) { $('#product').val(oldProductID);//Revert old product id if confirm is no. $('#product').trigger("chosen:updated"); - $('#product').chosen(defaultChosenOptions); + $('#product').chosen(); return true; } @@ -66,7 +66,7 @@ function loadAll(productID) else { $('#taskIdBox').innerHTML = ''; // Reset the task. - $('#task').chosen(defaultChosenOptions); + $('#task').chosen(); loadProductBranches(productID) loadProductModules(productID); loadProductProjects(productID); @@ -85,7 +85,7 @@ function loadAll(productID) function loadBranch() { $('#taskIdBox').innerHTML = ''; // Reset the task. - $('#task').chosen(defaultChosenOptions); + $('#task').chosen(); productID = $('#product').val(); loadProductModules(productID); loadProductProjects(productID); @@ -106,7 +106,7 @@ function loadAllBuilds(that) { oldResolvedBuild = $('#resolvedBuild').val() ? $('#resolvedBuild').val() : 0; link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=0&index=0&type=all'); - $('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen(defaultChosenOptions)}); + $('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()}); } else { @@ -141,19 +141,19 @@ function loadAllProjectBuilds(projectID, productID) { oldOpenedBuild = $('#openedBuild').val() ? $('#openedBuild').val() : 0; link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&needCreate=true&type=all'); - $('#buildBox').load(link, function(){ notice(); $('#openedBuild').chosen(defaultChosenOptions);}); + $('#buildBox').load(link, function(){ notice(); $('#openedBuild').chosen();}); } if(page == 'edit') { if(buildBox == 'openedBuildBox') { link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&needCreate=true&type=all'); - $('#openedBuildBox').load(link, function(){$(this).find('select').chosen(defaultChosenOptions)}); + $('#openedBuildBox').load(link, function(){$(this).find('select').chosen()}); } if(buildBox == 'resolvedBuildBox') { link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=0&index=0&needCreate=true&type=all'); - $('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen(defaultChosenOptions)}); + $('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()}); } } } @@ -172,19 +172,19 @@ function loadAllProductBuilds(productID) if(page == 'create') { link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&type=all'); - $('#buildBox').load(link, function(){ notice(); $('#openedBuild').chosen(defaultChosenOptions);}); + $('#buildBox').load(link, function(){ notice(); $('#openedBuild').chosen();}); } if(page == 'edit') { if(buildBox == 'openedBuildBox') { link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&type=all'); - $('#openedBuildBox').load(link, function(){$(this).find('select').chosen(defaultChosenOptions)}); + $('#openedBuildBox').load(link, function(){$(this).find('select').chosen()}); } if(buildBox == 'resolvedBuildBox') { link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=0&index=0&type=all'); - $('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen(defaultChosenOptions)}); + $('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()}); } } } @@ -203,7 +203,7 @@ function loadProductModules(productID) link = createLink('tree', 'ajaxGetOptionMenu', 'productID=' + productID + '&viewtype=bug&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=&needManage=true'); $('#moduleIdBox').load(link, function() { - $(this).find('select').chosen(defaultChosenOptions) + $(this).find('select').chosen() }); } @@ -219,7 +219,7 @@ function loadProductStories(productID) branch = $('#branch').val(); if(typeof(branch) == 'undefined') branch = 0; link = createLink('story', 'ajaxGetProductStories', 'productID=' + productID + '&branch=' + branch + '&moduleId=0&storyID=' + oldStoryID); - $('#storyIdBox').load(link, function(){$('#story').chosen(defaultChosenOptions);}); + $('#storyIdBox').load(link, function(){$('#story').chosen();}); } /** @@ -234,7 +234,7 @@ function loadProductProjects(productID) branch = $('#branch').val(); if(typeof(branch) == 'undefined') branch = 0; link = createLink('product', 'ajaxGetProjects', 'productID=' + productID + '&projectID=' + oldProjectID + '&branch=' + branch); - $('#projectIdBox').load(link, function(){$(this).find('select').chosen(defaultChosenOptions)}); + $('#projectIdBox').load(link, function(){$(this).find('select').chosen()}); } /** @@ -249,7 +249,7 @@ function loadProductplans(productID) branch = $('#branch').val(); if(typeof(branch) == 'undefined') branch = 0; link = createLink('productplan', 'ajaxGetProductplans', 'productID=' + productID + '&branch=' + branch); - $('#planIdBox').load(link, function(){$(this).find('select').chosen(defaultChosenOptions)}); + $('#planIdBox').load(link, function(){$(this).find('select').chosen()}); } /** @@ -267,13 +267,13 @@ function loadProductBuilds(productID) if(page == 'create') { - $('#buildBox').load(link, function(){ notice(); $('#openedBuild').chosen(defaultChosenOptions);}); + $('#buildBox').load(link, function(){ notice(); $('#openedBuild').chosen();}); } else { - $('#openedBuildBox').load(link, function(){$(this).find('select').chosen(defaultChosenOptions)}); + $('#openedBuildBox').load(link, function(){$(this).find('select').chosen()}); link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=' + branch); - $('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen(defaultChosenOptions)}); + $('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()}); } } @@ -311,7 +311,7 @@ function loadProjectRelated(projectID) function loadProjectTasks(projectID) { link = createLink('task', 'ajaxGetProjectTasks', 'projectID=' + projectID + '&taskID=' + oldTaskID); - $('#taskIdBox').load(link, function(){$('#task').chosen(defaultChosenOptions);}); + $('#taskIdBox').load(link, function(){$('#task').chosen();}); } /** @@ -326,7 +326,7 @@ function loadProjectStories(projectID) branch = $('#branch').val(); if(typeof(branch) == 'undefined') branch = 0; link = createLink('story', 'ajaxGetProjectStories', 'projectID=' + projectID + '&productID=' + $('#product').val() + '&branch=' + branch + '&moduleID=0&storyID=' + oldStoryID); - $('#storyIdBox').load(link, function(){$('#story').chosen(defaultChosenOptions);}); + $('#storyIdBox').load(link, function(){$('#story').chosen();}); } /** @@ -346,15 +346,15 @@ function loadProjectBuilds(projectID) if(page == 'create') { link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + "&branch=" + branch + "&index=0&needCreate=true"); - $('#buildBox').load(link, function(){ notice(); $('#openedBuild').chosen(defaultChosenOptions);}); + $('#buildBox').load(link, function(){ notice(); $('#openedBuild').chosen();}); } else { link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch); - $('#openedBuildBox').load(link, function(){$(this).find('select').chosen(defaultChosenOptions)}); + $('#openedBuildBox').load(link, function(){$(this).find('select').chosen()}); link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=' + branch); - $('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen(defaultChosenOptions)}); + $('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()}); } } @@ -376,7 +376,7 @@ function setStories(moduleID, productID) if(!stories) stories = ''; $('#story').replaceWith(stories); $('#story_chosen').remove(); - $("#story").chosen(defaultChosenOptions); + $("#story").chosen(); }); } @@ -410,7 +410,7 @@ function loadProductBranches(productID) function loadAssignedTo(projectID) { link = createLink('bug', 'ajaxLoadAssignedTo', 'projectID=' + projectID + '&selectedUser=' + $('#assignedTo').val()); - $('#assignedToBox').load(link, function(){$('#assignedTo').chosen(defaultChosenOptions);}); + $('#assignedToBox').load(link, function(){$('#assignedTo').chosen();}); } /** diff --git a/module/bug/js/create.js b/module/bug/js/create.js index ef4c921464..8416c0e8b8 100644 --- a/module/bug/js/create.js +++ b/module/bug/js/create.js @@ -29,7 +29,7 @@ function loadAllUsers() function loadProjectTeamMembers(productID) { var link = createLink('bug', 'ajaxLoadProjectTeamMembers', 'productID=' + productID + '&selectedUser=' + $('#assignedTo').val()); - $('#assignedToBox').load(link, function(){$('#assignedTo').chosen(defaultChosenOptions);}); + $('#assignedToBox').load(link, function(){$('#assignedTo').chosen();}); } /** diff --git a/module/bug/model.php b/module/bug/model.php index 7405d1673e..9290177b28 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -101,39 +101,26 @@ class bugModel extends model $replace['productID'] = $productID; $replace['branch'] = $branch; $replace['param'] = $moduleID; + + /* Replace for dropdown submenu. */ + if(isset($this->lang->bug->subMenu->$key)) + { + $subMenu = common::createSubMenu($this->lang->bug->subMenu->$key, $replace); + + /* Avoid the menu shaking when change it by js. */ + if(isset($subMenu[$browseType])) + { + $currentSubMenu = $subMenu[$browseType]; + $this->lang->bug->menu->more['link'] = "$currentSubMenu->text|" . implode('|', $currentSubMenu->link); + } + + if(!empty($subMenu)) $this->lang->bug->menu->{$key}['subMenu'] = $subMenu; + } + + if($this->app->getMethodName() != 'view') $this->lang->bug->menu->bysearch = " {$this->lang->bug->byQuery}"; } common::setMenuVars($this->lang->bug->menu, $key, $replace); } - if($this->config->global->flow != 'full') - { - $tmpMenu = (array)$this->lang->bug->menu; - $moreMenu = array_slice($tmpMenu, -6); - $tmpMenu = array_slice($tmpMenu, 0, count($tmpMenu) - 6); - if($moreMenu) - { - $moreKey = 'more'; - $moreLabel = $this->lang->more; - if(isset($this->lang->bug->moreSelects[$browseType])) - { - $moreKey = $browseType; - $moreLabel = $this->lang->bug->moreSelects[$browseType]; - } - $more = "{$moreLabel}"; - $more .= "'; - $tmpMenu[$moreKey] = $more; - } - if($this->app->getMethodName() != 'view') $tmpMenu['bysearch'] = " {$this->lang->bug->byQuery}"; - $this->lang->bug->menu = (object)$tmpMenu; - } } /** diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 73be22bebe..316c57d4be 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -229,13 +229,13 @@ $lang->release->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->list = array('link' => '%s', 'subModule' => 'task,grouptask,tree', 'alias' => 'grouptask,importtask,importbug,tree'); +$lang->project->menu->list = array('link' => 'Task List|project|task|projectID=%s', 'subModule' => 'task,grouptask,tree', 'alias' => 'grouptask,importtask,importbug,tree', 'class' => 'dropdown dropdown-hover'); $lang->project->menu->kanban = array('link' => 'Kanban|project|kanban|projectID=%s'); $lang->project->menu->burn = array('link' => 'Burn|project|burn|projectID=%s'); $lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->qa = array('link' => '%s', 'subModule' => 'bug,build,testtask'); +$lang->project->menu->qa = array('link' => 'Bug|project|bug|projectID=%s', 'subModule' => 'bug,build,testtask', 'alias' => 'build,testtask', 'class' => 'dropdown dropdown-hover'); $lang->project->menu->doc = array('link' => 'Doc|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->action = array('link' => '%s'); +$lang->project->menu->action = array('link' => 'Dynamic|project|dynamic|projectID=%s', 'subModule' => 'dynamic', 'class' => 'dropdown dropdown-hover'); $lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; $lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers'); $lang->project->menu->view = array('link' => 'Overview|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); @@ -723,12 +723,16 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->bug->menu->resolvedbyme = 'ResolvedByMe|bug|browse|productID=%s&branch=%s&browseType=resolvedbyme¶m=%s'; $lang->bug->menu->toclosed = 'ToBeClosed|bug|browse|productID=%s&branch=%s&browseType=toclosed¶m=%s'; $lang->bug->menu->unresolved = 'Unresolved|bug|browse|productID=%s&branch=%s&browseType=unresolved¶m=%s'; - $lang->bug->menu->unconfirmed = 'Unconfirmed|bug|browse|productID=%s&branch=%s&browseType=unconfirmed¶m=%s'; - $lang->bug->menu->assigntonull = 'Unassigned|bug|browse|productID=%s&branch=%s&browseType=assigntonull¶m=%s'; - $lang->bug->menu->longlifebugs = 'Pending|bug|browse|productID=%s&branch=%s&browseType=longlifebugs¶m=%s'; - $lang->bug->menu->postponedbugs = 'PostPoned|bug|browse|productID=%s&branch=%s&browseType=postponedbugs¶m=%s'; - $lang->bug->menu->overduebugs = 'Overdue|bug|browse|productID=%s&branch=%s&browseType=overduebugs¶m=%s'; - $lang->bug->menu->needconfirm = 'NeedConfirm|bug|browse|productID=%s&branch=%s&browseType=needconfirm¶m=%s'; + $lang->bug->menu->more = array('link' => 'More|bug|browse|productID=%s&branch=%s&browseType=unconfirmed¶m=%s', 'class' => 'dropdown dropdown-hover'); + + $lang->bug->subMenu = new stdclass(); + $lang->bug->subMenu->more = new stdclass(); + $lang->bug->subMenu->more->unconfirmed = 'Unconfirmed|bug|browse|productID=%s&branch=%s&browseType=unconfirmed¶m=%s'; + $lang->bug->subMenu->more->assigntonull = 'Unassigned|bug|browse|productID=%s&branch=%s&browseType=assigntonull¶m=%s'; + $lang->bug->subMenu->more->longlifebugs = 'Pending|bug|browse|productID=%s&branch=%s&browseType=longlifebugs¶m=%s'; + $lang->bug->subMenu->more->postponedbugs = 'PostPoned|bug|browse|productID=%s&branch=%s&browseType=postponedbugs¶m=%s'; + $lang->bug->subMenu->more->overduebugs = 'Overdue|bug|browse|productID=%s&branch=%s&browseType=overduebugs¶m=%s'; + $lang->bug->subMenu->more->needconfirm = 'NeedConfirm|bug|browse|productID=%s&branch=%s&browseType=needconfirm¶m=%s'; $lang->bug->menuOrder[5] = 'product'; $lang->bug->menuOrder[10] = 'all'; @@ -747,9 +751,13 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') /* Adjust sub menu of testcase. */ $lang->testcase->menu = new stdclass(); - $lang->testcase->menu->all = 'All|testcase|browse|productID=%s&branch=%s&browseType=all'; - $lang->testcase->menu->wait = 'Wait|testcase|browse|productID=%s&branch=%s&browseType=wait'; - $lang->testcase->menu->suite = array('link' => '%s', 'fixed' => true); + $lang->testcase->menu->all = 'All|testcase|browse|productID=%s&branch=%s&browseType=all'; + $lang->testcase->menu->wait = 'Wait|testcase|browse|productID=%s&branch=%s&browseType=wait'; + $lang->testcase->menu->bysuite = array('link' => 'Test Suite|testsuite|create|productID=%s', 'class' => 'dropdown dropdown-hover'); + + $lang->testcase->subMenu = new stdclass(); + $lang->testcase->subMenu->bysuite = new stdclass(); + $lang->testcase->subMenu->bysuite->create = 'Create Suite|testsuite|create|productID=%s'; $lang->testcase->menuOrder[5] = 'product'; $lang->testcase->menuOrder[10] = 'all'; diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index acb0ce8ed2..28f0cbfaec 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -229,16 +229,16 @@ $lang->release->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->list = array('link' => '%s', 'subModule' => 'task,grouptask,tree', 'alias' => 'grouptask,importtask,importbug,tree'); -$lang->project->menu->kanban = array('link' => '看板|project|kanban|projectID=%s'); -$lang->project->menu->burn = array('link' => '燃尽图|project|burn|projectID=%s'); -$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->qa = array('link' => '%s', 'subModule' => 'bug,build,testtask'); -$lang->project->menu->doc = array('link' => '文档|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->action = array('link' => '%s'); -$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; -$lang->project->menu->team = array('link' => '团队|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->view = array('link' => '概况|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); +$lang->project->menu->list = array('link' => '任务列表|project|task|projectID=%s', 'subModule' => 'task,grouptask,tree', 'alias' => 'grouptask,importtask,importbug,tree', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->kanban = array('link' => '看板|project|kanban|projectID=%s'); +$lang->project->menu->burn = array('link' => '燃尽图|project|burn|projectID=%s'); +$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); +$lang->project->menu->qa = array('link' => 'Bug|project|bug|projectID=%s', 'subModule' => 'bug,build,testtask', 'alias' => 'build,testtask', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->doc = array('link' => '文档|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); +$lang->project->menu->action = array('link' => '动态|project|dynamic|projectID=%s', 'subModule' => 'dynamic', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; +$lang->project->menu->team = array('link' => '团队|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->view = array('link' => '概况|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); $lang->project->subMenu = new stdclass(); $lang->project->subMenu->list = new stdclass(); @@ -723,12 +723,16 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->bug->menu->resolvedbyme = '由我解决|bug|browse|productID=%s&branch=%s&browseType=resolvedbyme¶m=%s'; $lang->bug->menu->toclosed = '待关闭|bug|browse|productID=%s&branch=%s&browseType=toclosed¶m=%s'; $lang->bug->menu->unresolved = '未解决|bug|browse|productID=%s&branch=%s&browseType=unresolved¶m=%s'; - $lang->bug->menu->unconfirmed = '未确认|bug|browse|productID=%s&branch=%s&browseType=unconfirmed¶m=%s'; - $lang->bug->menu->assigntonull = '未指派|bug|browse|productID=%s&branch=%s&browseType=assigntonull¶m=%s'; - $lang->bug->menu->longlifebugs = '久未处理|bug|browse|productID=%s&branch=%s&browseType=longlifebugs¶m=%s'; - $lang->bug->menu->postponedbugs = '被延期|bug|browse|productID=%s&branch=%s&browseType=postponedbugs¶m=%s'; - $lang->bug->menu->overduebugs = '过期Bug|bug|browse|productID=%s&branch=%s&browseType=overduebugs¶m=%s'; - $lang->bug->menu->needconfirm = '需求变动|bug|browse|productID=%s&branch=%s&browseType=needconfirm¶m=%s'; + $lang->bug->menu->more = array('link' => '更多|bug|browse|productID=%s&branch=%s&browseType=unconfirmed¶m=%s', 'class' => 'dropdown dropdown-hover'); + + $lang->bug->subMenu = new stdclass(); + $lang->bug->subMenu->more = new stdclass(); + $lang->bug->subMenu->more->unconfirmed = '未确认|bug|browse|productID=%s&branch=%s&browseType=unconfirmed¶m=%s'; + $lang->bug->subMenu->more->assigntonull = '未指派|bug|browse|productID=%s&branch=%s&browseType=assigntonull¶m=%s'; + $lang->bug->subMenu->more->longlifebugs = '久未处理|bug|browse|productID=%s&branch=%s&browseType=longlifebugs¶m=%s'; + $lang->bug->subMenu->more->postponedbugs = '被延期|bug|browse|productID=%s&branch=%s&browseType=postponedbugs¶m=%s'; + $lang->bug->subMenu->more->overduebugs = '过期Bug|bug|browse|productID=%s&branch=%s&browseType=overduebugs¶m=%s'; + $lang->bug->subMenu->more->needconfirm = '需求变动|bug|browse|productID=%s&branch=%s&browseType=needconfirm¶m=%s'; $lang->bug->menuOrder[5] = 'product'; $lang->bug->menuOrder[10] = 'all'; @@ -747,9 +751,13 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') /* Adjust sub menu of testcase. */ $lang->testcase->menu = new stdclass(); - $lang->testcase->menu->all = '所有|testcase|browse|productID=%s&branch=%s&browseType=all'; - $lang->testcase->menu->wait = '待评审|testcase|browse|productID=%s&branch=%s&browseType=wait'; - $lang->testcase->menu->suite = array('link' => '%s', 'fixed' => true); + $lang->testcase->menu->all = '所有|testcase|browse|productID=%s&branch=%s&browseType=all'; + $lang->testcase->menu->wait = '待评审|testcase|browse|productID=%s&branch=%s&browseType=wait'; + $lang->testcase->menu->bysuite = array('link' => '套件|testsuite|create|productID=%s', 'class' => 'dropdown dropdown-hover'); + + $lang->testcase->subMenu = new stdclass(); + $lang->testcase->subMenu->bysuite = new stdclass(); + $lang->testcase->subMenu->bysuite->create = '建套件|testsuite|create|productID=%s'; $lang->testcase->menuOrder[5] = 'product'; $lang->testcase->menuOrder[10] = 'all'; diff --git a/module/common/lang/zh-tw.php b/module/common/lang/zh-tw.php index 58ba92753b..aaf98cd0e2 100644 --- a/module/common/lang/zh-tw.php +++ b/module/common/lang/zh-tw.php @@ -229,16 +229,16 @@ $lang->release->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->list = array('link' => '%s', 'subModule' => 'task,grouptask,tree', 'alias' => 'grouptask,importtask,importbug,tree'); -$lang->project->menu->kanban = array('link' => '看板|project|kanban|projectID=%s'); -$lang->project->menu->burn = array('link' => '燃盡圖|project|burn|projectID=%s'); -$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->qa = array('link' => '%s', 'subModule' => 'bug,build,testtask'); -$lang->project->menu->doc = array('link' => '文檔|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->action = array('link' => '%s'); -$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; -$lang->project->menu->team = array('link' => '團隊|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->view = array('link' => '概況|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); +$lang->project->menu->list = array('link' => '任務列表|project|task|projectID=%s', 'subModule' => 'task,grouptask,tree', 'alias' => 'grouptask,importtask,importbug,tree', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->kanban = array('link' => '看板|project|kanban|projectID=%s'); +$lang->project->menu->burn = array('link' => '燃盡圖|project|burn|projectID=%s'); +$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); +$lang->project->menu->qa = array('link' => 'Bug|project|bug|projectID=%s', 'subModule' => 'bug,build,testtask', 'alias' => 'build,testtask', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->doc = array('link' => '文檔|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); +$lang->project->menu->action = array('link' => '動態|project|dynamic|projectID=%s', 'subModule' => 'dynamic', 'class' => 'dropdown dropdown-hover'); +$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; +$lang->project->menu->team = array('link' => '團隊|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->view = array('link' => '概況|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); $lang->project->subMenu = new stdclass(); $lang->project->subMenu->list = new stdclass(); @@ -723,12 +723,16 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->bug->menu->resolvedbyme = '由我解決|bug|browse|productID=%s&branch=%s&browseType=resolvedbyme¶m=%s'; $lang->bug->menu->toclosed = '待關閉|bug|browse|productID=%s&branch=%s&browseType=toclosed¶m=%s'; $lang->bug->menu->unresolved = '未解決|bug|browse|productID=%s&branch=%s&browseType=unresolved¶m=%s'; - $lang->bug->menu->unconfirmed = '未確認|bug|browse|productID=%s&branch=%s&browseType=unconfirmed¶m=%s'; - $lang->bug->menu->assigntonull = '未指派|bug|browse|productID=%s&branch=%s&browseType=assigntonull¶m=%s'; - $lang->bug->menu->longlifebugs = '久未處理|bug|browse|productID=%s&branch=%s&browseType=longlifebugs¶m=%s'; - $lang->bug->menu->postponedbugs = '被延期|bug|browse|productID=%s&branch=%s&browseType=postponedbugs¶m=%s'; - $lang->bug->menu->overduebugs = '過期Bug|bug|browse|productID=%s&branch=%s&browseType=overduebugs¶m=%s'; - $lang->bug->menu->needconfirm = '需求變動|bug|browse|productID=%s&branch=%s&browseType=needconfirm¶m=%s'; + $lang->bug->menu->more = array('link' => '更多|bug|browse|productID=%s&branch=%s&browseType=unconfirmed¶m=%s', 'class' => 'dropdown dropdown-hover'); + + $lang->bug->subMenu = new stdclass(); + $lang->bug->subMenu->more = new stdclass(); + $lang->bug->subMenu->more->unconfirmed = '未確認|bug|browse|productID=%s&branch=%s&browseType=unconfirmed¶m=%s'; + $lang->bug->subMenu->more->assigntonull = '未指派|bug|browse|productID=%s&branch=%s&browseType=assigntonull¶m=%s'; + $lang->bug->subMenu->more->longlifebugs = '久未處理|bug|browse|productID=%s&branch=%s&browseType=longlifebugs¶m=%s'; + $lang->bug->subMenu->more->postponedbugs = '被延期|bug|browse|productID=%s&branch=%s&browseType=postponedbugs¶m=%s'; + $lang->bug->subMenu->more->overduebugs = '過期Bug|bug|browse|productID=%s&branch=%s&browseType=overduebugs¶m=%s'; + $lang->bug->subMenu->more->needconfirm = '需求變動|bug|browse|productID=%s&branch=%s&browseType=needconfirm¶m=%s'; $lang->bug->menuOrder[5] = 'product'; $lang->bug->menuOrder[10] = 'all'; @@ -747,9 +751,13 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') /* Adjust sub menu of testcase. */ $lang->testcase->menu = new stdclass(); - $lang->testcase->menu->all = '所有|testcase|browse|productID=%s&branch=%s&browseType=all'; - $lang->testcase->menu->wait = '待評審|testcase|browse|productID=%s&branch=%s&browseType=wait'; - $lang->testcase->menu->suite = array('link' => '%s', 'fixed' => true); + $lang->testcase->menu->all = '所有|testcase|browse|productID=%s&branch=%s&browseType=all'; + $lang->testcase->menu->wait = '待評審|testcase|browse|productID=%s&branch=%s&browseType=wait'; + $lang->testcase->menu->bysuite = array('link' => '套件|testsuite|create|productID=%s', 'class' => 'dropdown dropdown-hover'); + + $lang->testcase->subMenu = new stdclass(); + $lang->testcase->subMenu->bysuite = new stdclass(); + $lang->testcase->subMenu->bysuite->create = '建套件|testsuite|create|productID=%s'; $lang->testcase->menuOrder[5] = 'product'; $lang->testcase->menuOrder[10] = 'all'; diff --git a/module/common/model.php b/module/common/model.php index bf625a0a04..c164a9fba2 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -349,6 +349,40 @@ class commonModel extends model return $link; } + /** + * Create sub menu by settings in lang files. + * + * @param array $items + * @param mixed $replace + * @static + * @access public + * @return array + */ + public static function createSubMenu($items, $replace) + { + $subMenu = array(); + foreach($items as $subMenuKey => $subMenuLink) + { + if(isset($subMenuLink['link'])) $subMenuLink = $subMenuLink['link']; + $subMenuLink = vsprintf($subMenuLink, $replace); + list($subMenuName, $subMenuModule, $subMenuMethod, $subMenuParams) = explode('|', $subMenuLink); + + $link = array(); + $link['module'] = $subMenuModule; + $link['method'] = $subMenuMethod; + $link['vars'] = $subMenuParams; + + $menu = new stdclass(); + $menu->name = $subMenuKey; + $menu->link = $link; + $menu->text = $subMenuName; + $menu->hidden = false; + $subMenu[$subMenuKey] = $menu; + } + + return $subMenu; + } + /** * Print the main menu. * @@ -468,7 +502,7 @@ class commonModel extends model echo $isMobile ? '' : "