This commit is contained in:
daitingting
2018-07-12 10:43:48 +08:00
79 changed files with 931 additions and 625 deletions
+1 -1
View File
@@ -1 +1 @@
10.0.stable
10.1.stable
+1 -1
View File
@@ -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.
+155
View File
@@ -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 把用户的入职日期属性展示出来
+15
View File
@@ -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 . ' {};');
}
}
+16 -1
View File
@@ -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, '<?php die(); ?' . '>');
$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'];
+3
View File
@@ -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 = '移除';
+8 -5
View File
@@ -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;
+1 -1
View File
@@ -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];
+3 -3
View File
@@ -23,7 +23,7 @@ function setBranchRelated(branchID, productID, num)
if(!modules) modules = '<select id="modules' + num + '" name="modules[' + num + ']" class="form-control"></select>';
$('#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 = '<select id="projects' + num + '" name="projects[' + num + ']" class="form-control"></select>';
$('#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;
+9 -1
View File
@@ -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;
+25 -25
View File
@@ -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 = '<select id="task"></select>'; // 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 = '<select id="task"></select>'; // 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 = '<select id="story" name="story" class="form-control"></select>';
$('#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();});
}
/**
+1 -1
View File
@@ -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();});
}
/**
+17 -30
View File
@@ -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 = "<a class='querybox-toggle' id='bysearchTab'><i class='icon icon-search muted'> </i>{$this->lang->bug->byQuery}</a>";
}
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 = "<a data-toggle='dropdown'>{$moreLabel}<span class='caret'></span></a>";
$more .= "<ul class='dropdown-menu'>";
foreach($moreMenu as $menu)
{
list($label, $module, $method, $params) = explode('|', $menu);
if(common::hasPriv($module, $method))
{
$more .= '<li>' . html::a(helper::createLink($module, $method, $params), $label) . '</li>';
}
}
$more .= '</ul>';
$tmpMenu[$moreKey] = $more;
}
if($this->app->getMethodName() != 'view') $tmpMenu['bysearch'] = "<a class='querybox-toggle' id='bysearchTab'><i class='icon icon-search muted'> </i>{$this->lang->bug->byQuery}</a>";
$this->lang->bug->menu = (object)$tmpMenu;
}
}
/**
+20 -12
View File
@@ -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&param=%s';
$lang->bug->menu->toclosed = 'ToBeClosed|bug|browse|productID=%s&branch=%s&browseType=toclosed&param=%s';
$lang->bug->menu->unresolved = 'Unresolved|bug|browse|productID=%s&branch=%s&browseType=unresolved&param=%s';
$lang->bug->menu->unconfirmed = 'Unconfirmed|bug|browse|productID=%s&branch=%s&browseType=unconfirmed&param=%s';
$lang->bug->menu->assigntonull = 'Unassigned|bug|browse|productID=%s&branch=%s&browseType=assigntonull&param=%s';
$lang->bug->menu->longlifebugs = 'Pending|bug|browse|productID=%s&branch=%s&browseType=longlifebugs&param=%s';
$lang->bug->menu->postponedbugs = 'PostPoned|bug|browse|productID=%s&branch=%s&browseType=postponedbugs&param=%s';
$lang->bug->menu->overduebugs = 'Overdue|bug|browse|productID=%s&branch=%s&browseType=overduebugs&param=%s';
$lang->bug->menu->needconfirm = 'NeedConfirm|bug|browse|productID=%s&branch=%s&browseType=needconfirm&param=%s';
$lang->bug->menu->more = array('link' => 'More|bug|browse|productID=%s&branch=%s&browseType=unconfirmed&param=%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&param=%s';
$lang->bug->subMenu->more->assigntonull = 'Unassigned|bug|browse|productID=%s&branch=%s&browseType=assigntonull&param=%s';
$lang->bug->subMenu->more->longlifebugs = 'Pending|bug|browse|productID=%s&branch=%s&browseType=longlifebugs&param=%s';
$lang->bug->subMenu->more->postponedbugs = 'PostPoned|bug|browse|productID=%s&branch=%s&browseType=postponedbugs&param=%s';
$lang->bug->subMenu->more->overduebugs = 'Overdue|bug|browse|productID=%s&branch=%s&browseType=overduebugs&param=%s';
$lang->bug->subMenu->more->needconfirm = 'NeedConfirm|bug|browse|productID=%s&branch=%s&browseType=needconfirm&param=%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';
+27 -19
View File
@@ -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&param=%s';
$lang->bug->menu->toclosed = '待关闭|bug|browse|productID=%s&branch=%s&browseType=toclosed&param=%s';
$lang->bug->menu->unresolved = '未解决|bug|browse|productID=%s&branch=%s&browseType=unresolved&param=%s';
$lang->bug->menu->unconfirmed = '未确认|bug|browse|productID=%s&branch=%s&browseType=unconfirmed&param=%s';
$lang->bug->menu->assigntonull = '未指派|bug|browse|productID=%s&branch=%s&browseType=assigntonull&param=%s';
$lang->bug->menu->longlifebugs = '久未处理|bug|browse|productID=%s&branch=%s&browseType=longlifebugs&param=%s';
$lang->bug->menu->postponedbugs = '被延期|bug|browse|productID=%s&branch=%s&browseType=postponedbugs&param=%s';
$lang->bug->menu->overduebugs = '过期Bug|bug|browse|productID=%s&branch=%s&browseType=overduebugs&param=%s';
$lang->bug->menu->needconfirm = '需求变动|bug|browse|productID=%s&branch=%s&browseType=needconfirm&param=%s';
$lang->bug->menu->more = array('link' => '更多|bug|browse|productID=%s&branch=%s&browseType=unconfirmed&param=%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&param=%s';
$lang->bug->subMenu->more->assigntonull = '未指派|bug|browse|productID=%s&branch=%s&browseType=assigntonull&param=%s';
$lang->bug->subMenu->more->longlifebugs = '久未处理|bug|browse|productID=%s&branch=%s&browseType=longlifebugs&param=%s';
$lang->bug->subMenu->more->postponedbugs = '被延期|bug|browse|productID=%s&branch=%s&browseType=postponedbugs&param=%s';
$lang->bug->subMenu->more->overduebugs = '过期Bug|bug|browse|productID=%s&branch=%s&browseType=overduebugs&param=%s';
$lang->bug->subMenu->more->needconfirm = '需求变动|bug|browse|productID=%s&branch=%s&browseType=needconfirm&param=%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';
+27 -19
View File
@@ -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&param=%s';
$lang->bug->menu->toclosed = '待關閉|bug|browse|productID=%s&branch=%s&browseType=toclosed&param=%s';
$lang->bug->menu->unresolved = '未解決|bug|browse|productID=%s&branch=%s&browseType=unresolved&param=%s';
$lang->bug->menu->unconfirmed = '未確認|bug|browse|productID=%s&branch=%s&browseType=unconfirmed&param=%s';
$lang->bug->menu->assigntonull = '未指派|bug|browse|productID=%s&branch=%s&browseType=assigntonull&param=%s';
$lang->bug->menu->longlifebugs = '久未處理|bug|browse|productID=%s&branch=%s&browseType=longlifebugs&param=%s';
$lang->bug->menu->postponedbugs = '被延期|bug|browse|productID=%s&branch=%s&browseType=postponedbugs&param=%s';
$lang->bug->menu->overduebugs = '過期Bug|bug|browse|productID=%s&branch=%s&browseType=overduebugs&param=%s';
$lang->bug->menu->needconfirm = '需求變動|bug|browse|productID=%s&branch=%s&browseType=needconfirm&param=%s';
$lang->bug->menu->more = array('link' => '更多|bug|browse|productID=%s&branch=%s&browseType=unconfirmed&param=%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&param=%s';
$lang->bug->subMenu->more->assigntonull = '未指派|bug|browse|productID=%s&branch=%s&browseType=assigntonull&param=%s';
$lang->bug->subMenu->more->longlifebugs = '久未處理|bug|browse|productID=%s&branch=%s&browseType=longlifebugs&param=%s';
$lang->bug->subMenu->more->postponedbugs = '被延期|bug|browse|productID=%s&branch=%s&browseType=postponedbugs&param=%s';
$lang->bug->subMenu->more->overduebugs = '過期Bug|bug|browse|productID=%s&branch=%s&browseType=overduebugs&param=%s';
$lang->bug->subMenu->more->needconfirm = '需求變動|bug|browse|productID=%s&branch=%s&browseType=needconfirm&param=%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';
+86 -3
View File
@@ -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 ? '' : "<ul class='nav nav-default'>\n";
if(isset($lang->menugroup->$moduleName)) $moduleName = $lang->menugroup->$moduleName;
/* Cycling to print every sub menus. */
/* Cycling to print every sub menu. */
foreach($menu as $menuItem)
{
if(isset($lang->$moduleName->dividerMenu) and strpos($lang->$moduleName->dividerMenu, ",{$menuItem->name},") !== false) echo "<li class='divider'></li>";
@@ -505,7 +539,56 @@ class commonModel extends model
if($currentModule == 'testsuite' && $currentMethod == 'library') $active = '';
}
$menuItemHtml = "<li class='$class $active' data-id='$menuItem->name'>" . html::a($link, $menuItem->text, $target) . "</li>\n";
$label = $menuItem->text;
$subMenu = '';
/* Print sub menus. */
if(isset($menuItem->subMenu))
{
$firstLink = '';
$firstLabel = '';
foreach($menuItem->subMenu as $subMenuItem)
{
if($subMenuItem->hidden) continue;
$subActive = '';
$subModule = '';
$subMethod = '';
$subParams = '';
$subLabel = $subMenuItem->text;
if(isset($subMenuItem->link['module'])) $subModule = $subMenuItem->link['module'];
if(isset($subMenuItem->link['method'])) $subMethod = $subMenuItem->link['method'];
if(isset($subMenuItem->link['vars'])) $subParams = $subMenuItem->link['vars'];
$subLink = helper::createLink($subModule, $subMethod, $subParams);
if($config->global->flow != 'onlyTest' && $currentModule == strtolower($subModule) && $currentMethod == strtolower($subMethod)) $subActive = 'active';
$subMenu .= "<li class='$subActive' data-id='$subMenuItem->name'>" . html::a($subLink, $subLabel) . '</li>';
if(!$firstLink) $firstLink = $subLink;
if(!$firstLabel) $firstLabel = $subLabel;
}
if(!$firstLink or !$firstLabel) continue;
if($config->global->flow == 'onlyTest')
{
$link = $firstLink;
}
else
{
$link = $firstLink;
$label = $firstLabel;
}
if($subMenu)
{
$label .= "<span class='caret'></span>";
$subMenu = "<ul class='dropdown-menu'>{$subMenu}</ul>";
}
}
$menuItemHtml = "<li class='$class $active' data-id='$menuItem->name'>" . html::a($link, $label, $target) . $subMenu . "</li>\n";
if($isMobile) $menuItemHtml = html::a($link, $menuItem->text, $target, "class='$class $active'") . "\n";
echo $menuItemHtml;
}
@@ -1326,7 +1409,7 @@ EOD;
if(strpos(",{$limitedProjects},", ",$objectID,") !== false) $limitedProject = true;
if(empty($app->user->rights['rights']['my']['limited']) && !$limitedProject) return true;
}
if(empty($app->user->rights['rights']['my']['limited'])) return true;
if(!is_null($method) && strpos($method, 'batch') === 0) return false;
if(!is_null($method) && strpos($method, 'link') === 0) return false;
+1 -1
View File
@@ -4,6 +4,6 @@ var chooseUsersToMail = '<?php echo $lang->chooseUsersToMail;?>';
$(document).ready(function()
{
$("#mailto").attr('data-placeholder', chooseUsersToMail);
$("#mailto, #productID").chosen($.defaultChosenOptions).on('chosen:showing_dropdown');
$("#mailto, #productID").chosen();
});
</script>
+1 -1
View File
@@ -12,5 +12,5 @@
#menuEditor li > a .item-hidden-icon {display: none; margin-left: 3px;}
#menuEditor .dropdown-menu > li > a .item-hidden-icon {margin-left: 10px;}
#menuEditor li.menu-hidden > a .item-hidden-icon {display: inline-block;}
#menuEditor .nav > li.menu-hidden > a {opacity: .7; border: 1px dashed #ddd; background: rgba(0,0,0,.1); margin: 0 2px;}
#menuEditor .nav > li.menu-hidden > a {border: 1px dashed #ddd; background: rgba(0,0,0,.1); margin: 0 2px;}
#menuEditor .nav > li.menu-hidden > a > .dropdown{display: inline-block;}
+51 -9
View File
@@ -45,9 +45,34 @@ $(function()
if(!item.text || item.fixed) return;
var $a = $('<a href="#"/>').append(item.text);
$a.data('menu', item).append('<i class="item-hidden-icon icon icon-eye-off"></i>');
$('<li/>').attr('data-id', item.name).toggleClass('right', item.float === 'right').toggleClass('menu-hidden', !!item.hidden).append($a).appendTo($nav);
var $dropmenu = $a.find('.dropdown-menu').empty();
return $dropmenu.remove(); // Disable custom submenu, full function see https://github.com/easysoft/zentaopms/blob/c7fdbddfc074ddd7ddf539b1d3b5f108ab13ec7b/module/custom/js/ajaxmenu.js
var hidden = !!item.hidden;
if(item.subMenu)
{
hidden = true;
$a.addClass('dropdown dropdown-hover').append("<span class='caret'></span><ul class='dropdown-menu'></ul>");
var $dropmenu = $a.find('.dropdown-menu');
$.each(item.subMenu, function(subIdx, subItem)
{
subItem.order = subIdx + 1;
var $subA = $('<a href="#"/>').append(subItem.text);
$subA.data('menu', subItem).append('<i class="item-hidden-icon icon icon-eye-off"></i>');
$('<li/>').attr('data-id', subItem.name).toggleClass('right', subItem.float === 'right').toggleClass('menu-hidden', !!subItem.hidden).append($subA).appendTo($dropmenu);
hidden = subItem.hidden && hidden;
});
var $aInner = $a.children('a');
if ($aInner.length)
{
$aInner.replaceWith($('<span>' + $aInner.text() + ' <span class="caret"></span></span>'));
$a.addClass('dropdown-hover');
}
if(!$dropmenu.children().length)
{
$a.removeClass('dropdown dropdown-hover').find('.caret').remove();
$dropmenu.remove();
}
}
$('<li/>').attr('data-id', item.name).toggleClass('right', item.float === 'right').toggleClass('menu-hidden', hidden).append($a).appendTo($nav);
});
$nav.sortable({finish: function(e)
{
@@ -113,17 +138,19 @@ $(function()
var data = {name: item.name, order: parseInt(item.order)};
if(item.hidden) data.hidden = true;
if(item.float) data.float = item.float;
dataList.push(data);
if (item.subMenu)
if(item.subMenu)
{
var subMenu = [];
$.each(item.subMenu, function(sIdx, subItem)
{
var subData = {name: subItem.name, order: parseInt(subItem.order)};
if(subItem.hidden) subData.hidden = true;
if(subItem.float) subData.float = subItem.float;
dataList.push(subData);
subMenu.push(subData);
});
data.subMenu = subMenu;
}
dataList.push(data);
});
return dataList;
};
@@ -200,9 +227,11 @@ $(function()
}
}).on('click', '.nav>li>a,.dropdown-menu>li>a', function(e)
{
var $a = $(this);
var item = $a.data('menu');
if (!item) return;
var $a = $(this);
var item = $a.data('menu');
if(!item) return;
if($a.find('.dropdown-menu').length) return;
var $menu = $a.closest('nav');
var moduleName = item.link && item.link['module'] ? item.link['module'] : item.name;
var methodName = item.link && item.link['method'] ? item.link['method'] : '';
@@ -213,6 +242,19 @@ $(function()
methodName = item.name;
}
$a.parent().toggleClass('menu-hidden', item.hidden);
/* Update parent menu by sub menu. */
if($a.parent().parent().hasClass('dropdown-menu'))
{
var hidden = true;
$a.parent().parent().children().each(function()
{
hidden = $(this).hasClass('menu-hidden') && hidden;
});
$a.parent().parent().parent().parent().toggleClass('menu-hidden', hidden);
}
updateConfig($menu);
e.stopPropagation();
});
+30 -11
View File
@@ -140,11 +140,11 @@ class customModel extends model
public static function setMenuByConfig($allMenu, $customMenu, $module = '')
{
global $app, $lang, $config;
$menu = array();
$menuModuleName = $module;
$order = 1;
$customMenuMap = array();
$isTutorialMode = commonModel::isTutorialMode();
$menu = array();
$menuModuleName = $module;
$order = 1;
$customMenuMap = array();
$isTutorialMode = commonModel::isTutorialMode();
if($customMenu)
{
@@ -201,8 +201,8 @@ class customModel extends model
/* Merge fileMenu and customMenu. */
foreach($customMenuMap as $name => $item)
{
if(is_object($allMenu) and !isset($allMenu->$name))$allMenu->$name = $item;
if(is_array($allMenu) and !isset($allMenu[$name]))$allMenu[$name] = $item;
if(is_object($allMenu) and !isset($allMenu->$name)) $allMenu->$name = $item;
if(is_array($allMenu) and !isset($allMenu[$name])) $allMenu[$name] = $item;
}
foreach($allMenu as $name => $item)
@@ -249,13 +249,32 @@ class customModel extends model
}
$hidden = isset($customMenuMap[$name]) && isset($customMenuMap[$name]->hidden) && $customMenuMap[$name]->hidden;
if(isset($item['subMenu']))
{
foreach($item['subMenu'] as $subItem)
{
if(isset($subItem->link['module']) && isset($subItem->link['method']))
{
$subItem->hidden = !common::hasPriv($subItem->link['module'], $subItem->link['method']);
}
}
if(isset($customMenuMap[$name]->subMenu))
{
foreach($customMenuMap[$name]->subMenu as $subItem)
{
if(isset($subItem->hidden) && isset($item['subMenu'][$subItem->name])) $item['subMenu'][$subItem->name]->hidden = $subItem->hidden;
}
}
}
if(strpos($name, 'QUERY') === 0 and !isset($customMenuMap[$name])) $hidden = true;
$menuItem = new stdclass();
$menuItem->name = $name;
$menuItem->link = $itemLink;
$menuItem->text = $label;
$menuItem->order = (isset($customMenuMap[$name]) && isset($customMenuMap[$name]->order) ? $customMenuMap[$name]->order : $order++);
$menuItem->name = $name;
$menuItem->link = $itemLink;
$menuItem->text = $label;
$menuItem->order = (isset($customMenuMap[$name]) && isset($customMenuMap[$name]->order) ? $customMenuMap[$name]->order : $order++);
if($hidden) $menuItem->hidden = $hidden;
if($class) $menuItem->class = $class;
if($subModule)$menuItem->subModule = $subModule;
+2
View File
@@ -39,6 +39,8 @@
<?php
$fields = $this->custom->getFormFields($moduleName, $method);
if($moduleName == 'doc' and $method == 'createlib') $method = 'createLib';
if($moduleName == 'doc' and $method == 'editlib') $method = 'editLib';
if($moduleName == 'testsuite' and $method == 'createlib') $method = 'createLib';
if($moduleName == 'testsuite' and $method == 'createcase')
{
-2
View File
@@ -82,7 +82,6 @@ $lang->dev->tableList['testsuite'] = '測試套件';
$lang->dev->tableList['tree'] = '模組關係';
$lang->dev->tableList['upgrade'] = '更新';
$lang->dev->tableList['cron'] = '定時任務';
$lang->dev->tableList['mailqueue'] = '郵件隊列';
$lang->dev->tableList['datatable'] = '數據表格';
$lang->dev->tableList['block'] = '區塊';
$lang->dev->tableList['branch'] = '平台/分支';
@@ -93,7 +92,6 @@ $lang->dev->tableList['suitecase'] = '套件用例';
$lang->dev->tableList['score'] = '積分';
$lang->dev->tableList['entry'] = '應用';
$lang->dev->tableList['webhook'] = 'WebHook';
$lang->dev->tableList['webhookdatas'] = 'WebHook數據';
$lang->dev->tableList['log'] = '介面日誌';
$lang->dev->tableList['message'] = '消息';
$lang->dev->tableList['notify'] = '通知';
+1 -1
View File
@@ -1,7 +1,7 @@
function loadModules(libID)
{
link = createLink('doc', 'ajaxGetModules', 'libID=' + libID);
$('#moduleBox').load(link, function(){$('#moduleBox').find('select').chosen(defaultChosenOptions)});
$('#moduleBox').load(link, function(){$('#moduleBox').find('select').chosen()});
}
function toggleAcl(acl)
+104 -27
View File
@@ -35,11 +35,16 @@ class docModel extends model
if($libID)
{
$lib = $this->getLibById($libID);
if($this->checkPriv($lib))
if(!$this->checkPrivLib($lib))
{
$type = $lib->product ? 'product' : 'custom';
$type = $lib->project ? 'project' : $type;
echo(js::alert($this->lang->doc->accessDenied));
$loginLink = $this->config->requestType == 'GET' ? "?{$this->config->moduleVar}=user&{$this->config->methodVar}=login" : "user{$this->config->requestFix}login";
if(strpos($this->server->http_referer, $loginLink) !== false) die(js::locate(inlink('index')));
die(js::locate('back'));
}
$type = $lib->product ? 'product' : 'custom';
$type = $lib->project ? 'project' : $type;
}
$mainLib = $type == 'custom' ? $this->lang->doc->customAB : $mainLib;
@@ -191,7 +196,7 @@ class docModel extends model
* @access public
* @return array
*/
public function getLibs($type = '')
public function getLibs($type = '', $extra = '')
{
if($type == 'product' or $type == 'project')
{
@@ -215,11 +220,49 @@ class docModel extends model
$libPairs = array();
while($lib = $stmt->fetch())
{
if($this->checkPriv($lib)) $libPairs[$lib->id] = $lib->name;
if($this->checkPrivLib($lib, $extra)) $libPairs[$lib->id] = $lib->name;
}
return $libPairs;
}
/**
* Get grant libs by doc.
*
* @access public
* @return array
*/
public function getPrivLibsByDoc()
{
static $libs;
if($libs === null)
{
$libs = array();
$stmt = $this->dao->select('lib,groups,users')->from(TABLE_DOC)->where('acl')->ne('open')->andWhere("(groups != '' or users != '')")->query();
$account = ",{$this->app->user->account},";
$userGroups = $this->app->user->groups;
while($lib = $stmt->fetch())
{
if(strpos(",$lib->users,", $account) !== false)
{
$libs[$lib->lib] = $lib->lib;
}
else
{
foreach($userGroups as $groupID)
{
if(strpos(",$lib->groups,", ",$groupID,") !== false)
{
$libs[$lib->lib] = $lib->lib;
break;
}
}
}
}
}
return $libs;
}
/**
* Create a library.
*
@@ -377,7 +420,7 @@ class docModel extends model
->fetchAll('id');
foreach($docs as $docID => $doc)
{
if(!$this->checkPriv($doc)) unset($docs[$docID]);
if(!$this->checkPrivDoc($doc)) unset($docs[$docID]);
}
$docs = $this->dao->select('*')->from(TABLE_DOC)
->where('id')->in(array_keys($docs))
@@ -481,7 +524,7 @@ class docModel extends model
$docIdList = array();
while($doc = $stmt->fetch())
{
if($this->checkPriv($doc)) $docIdList[$doc->id] = $doc->id;
if($this->checkPrivDoc($doc)) $docIdList[$doc->id] = $doc->id;
}
return $docIdList;
}
@@ -498,7 +541,7 @@ class docModel extends model
{
$doc = $this->dao->select('*')->from(TABLE_DOC)->where('id')->eq((int)$docID)->fetch();
if(!$doc) return false;
if(!$this->checkPriv($doc))
if(!$this->checkPrivDoc($doc))
{
echo(js::alert($this->lang->doc->accessDenied));
$loginLink = $this->config->requestType == 'GET' ? "?{$this->config->moduleVar}=user&{$this->config->methodVar}=login" : "user{$this->config->requestFix}login";
@@ -803,13 +846,14 @@ class docModel extends model
}
/**
* Check priv.
* Check priv for lib.
*
* @param object $object
* @param string $extra
* @access public
* @return bool
*/
public function checkPriv($object, $type = 'lib')
public function checkPrivLib($object, $extra = '')
{
if($this->app->user->admin) return true;
@@ -817,29 +861,26 @@ class docModel extends model
if(!empty($object->product) and !empty($acls['products']) and !in_array($object->product, $acls['products'])) return false;
if(!empty($object->project) and !empty($acls['projects']) and !in_array($object->project, $acls['projects'])) return false;
if(isset($object->lib))
{
static $libs;
if(empty($libs)) $libs = $this->getLibs('all');
if(!isset($libs[$object->lib])) return false;
}
if($object->acl == 'open') return true;
$account = ',' . $this->app->user->account . ',';
if(isset($object->addedBy) and $object->addedBy == $this->app->user->account) return true;
if($object->acl == 'private' and strpos(",$object->users,", $account) !== false) return true;
if(strpos(",$object->users,", $account) !== false) return true;
if($object->acl == 'custom')
{
if(strpos(",$object->users,", $account) !== false) return true;
$userGroups = $this->app->user->groups;
foreach($userGroups as $groupID)
{
if(strpos(",$object->groups,", ",$groupID,") !== false) return true;
}
}
if(isset($object->lib)) return false;
if(strpos($extra, 'notdoc') === false)
{
static $extraDocLibs;
if($extraDocLibs === null) $extraDocLibs = $this->getPrivLibsByDoc();
if(isset($extraDocLibs[$object->id])) return true;
}
if($object->project)
{
@@ -858,6 +899,42 @@ class docModel extends model
return false;
}
/**
* Check priv for doc.
*
* @param object $object
* @access public
* @return bool
*/
public function checkPrivDoc($object)
{
if($this->app->user->admin) return true;
static $extraDocLibs;
if($extraDocLibs === null) $extraDocLibs = $this->getPrivLibsByDoc();
static $libs;
if($libs === null) $libs = $this->getLibs('all', 'notdoc');
if(isset($libs[$object->lib]) and isset($extraDocLibs[$object->lib])) unset($extraDocLibs[$object->lib]);
if(!isset($libs[$object->lib]) and !isset($extraDocLibs[$object->lib])) return false;
if($object->acl == 'open' and !isset($extraDocLibs[$object->lib])) return true;
$account = ',' . $this->app->user->account . ',';
if(isset($object->addedBy) and $object->addedBy == $this->app->user->account) return true;
if(strpos(",$object->users,", $account) !== false) return true;
if($object->acl == 'custom')
{
$userGroups = $this->app->user->groups;
foreach($userGroups as $groupID)
{
if(strpos(",$object->groups,", ",$groupID,") !== false) return true;
}
}
return false;
}
/**
* Get all libs by type.
*
@@ -1017,7 +1094,7 @@ class docModel extends model
{
if($limit && $i > $limit) break;
$key = ($type == 'product' or $type == 'project') ? $type : 'id';
if($this->checkPriv($docLib) and !isset($libs[$docLib->$key]))
if($this->checkPrivLib($docLib) and !isset($libs[$docLib->$key]))
{
$libs[$docLib->$key] = $docLib->name;
$i++;
@@ -1062,7 +1139,7 @@ class docModel extends model
{
foreach($libs as $lib)
{
if($this->checkPriv($lib)) $buildGroups[$objectID][$lib->id] = $lib->name;
if($this->checkPrivLib($lib)) $buildGroups[$objectID][$lib->id] = $lib->name;
}
if($type == 'product' and isset($hasProject[$objectID]) and common::hasPriv('doc', 'allLibs')) $buildGroups[$objectID]['project'] = $this->lang->doclib->project;
if(common::hasPriv('doc', 'showFiles')) $buildGroups[$objectID]['files'] = $this->lang->doclib->files;
@@ -1104,7 +1181,7 @@ class docModel extends model
$libs = array();
foreach($objectLibs as $lib)
{
if($this->checkPriv($lib)) $libs[$lib->id] = $lib;
if($this->checkPrivLib($lib)) $libs[$lib->id] = $lib;
}
$itemCounts = $this->statLibCounts(array_keys($libs));
@@ -1154,7 +1231,7 @@ class docModel extends model
$docCounts = array();
foreach($docs as $doc)
{
if(!$this->checkPriv($doc)) continue;
if(!$this->checkPrivDoc($doc)) continue;
if(!isset($docCounts[$doc->lib])) $docCounts[$doc->lib] = 0;
$docCounts[$doc->lib] ++;
}
@@ -1272,7 +1349,7 @@ class docModel extends model
$docGroups = array();
foreach($docs as $doc)
{
if($this->checkPriv($doc)) $docGroups[$doc->module][$doc->id] = $doc;
if($this->checkPrivDoc($doc)) $docGroups[$doc->module][$doc->id] = $doc;
}
}
@@ -1326,7 +1403,7 @@ class docModel extends model
if(empty($libID)) return '';
$lib = $this->getLibById($libID);
if(!$this->checkPriv($lib))
if(!$this->checkPrivLib($lib))
{
echo(js::alert($this->lang->doc->accessDenied));
$loginLink = $this->config->requestType == 'GET' ? "?{$this->config->moduleVar}=user&{$this->config->methodVar}=login" : "user{$this->config->requestFix}login";
+1 -1
View File
@@ -66,7 +66,7 @@ function saveTemplate()
var defaultValue = $('#tplBox #template').val();
$('#tplBox').html(data);
if(data.indexOf('alert') >= 0) $('#tplBox #template').val(defaultValue);
$("#tplBox #template").chosen(defaultChosenOptions).on('chosen:showing_dropdown', function()
$("#tplBox #template").chosen().on('chosen:showing_dropdown', function()
{
var $this = $(this);
var $chosen = $this.next('.chosen-container').removeClass('chosen-up');
+1
View File
@@ -35,6 +35,7 @@ $lang->install->links = <<<EOT
技术支持:<a href='http://www.zentao.net/ask/' target='_blank'>http://www.zentao.net/ask/</a>
新浪微博:<a href='http://weibo.com/easysoft' target='_blank'>http://weibo.com/easysoft</a>
您现在正在安装的版本是 <strong class='text-danger'>%s</strong>
EOT;
+1
View File
@@ -35,6 +35,7 @@ $lang->install->links = <<<EOT
技術支持:<a href='http://www.zentao.net/ask/' target='_blank'>http://www.zentao.net/ask/</a>
新浪微博:<a href='http://weibo.com/easysoft' target='_blank'>http://weibo.com/easysoft</a>
您現在正在安裝的版本是 <strong class='text-danger'>%s</strong>
EOT;
-2
View File
@@ -14,5 +14,3 @@
.popoverStage .icon-caret-down{position:absolute;}
a.removeModule{color:#ddd}
a.removeModule:hover{color:red}
tbody > tr > td > .btn-icon {margin-right: 3px;}
+1 -1
View File
@@ -10,6 +10,6 @@ function loadProductLines(rootID)
link = createLink('tree', 'ajaxGetOptionMenu', 'rootID=' + rootID + '&viewtype=line' + '&branch=0' + '&rootModuleID=0&returnType=html&fieldID=&needManage=true');
$('#lineIdBox').load(link, function()
{
$(this).find('select').chosen(defaultChosenOptions)
$(this).find('select').chosen()
});
}
+2 -2
View File
@@ -116,8 +116,8 @@ $lang->product->aclList['open'] = "預設設置(有{$lang->productCommon}視
$lang->product->aclList['private'] = "私有{$lang->productCommon}(只有{$lang->productCommon}相關負責人和{$lang->projectCommon}團隊成員才能訪問)";
$lang->product->aclList['custom'] = '自定義白名單(團隊成員和白名單的成員可以訪問)';
$lang->product->storySummary = "本頁共 <strong>%s</strong> 個需求,預計 <strong>%s</strong> 個工時,用例覆蓋率<strong>%s</strong>。";
$lang->product->checkedSummary = "選中 <strong>%total%</strong> 個需求,預計 <strong>%estimate%</strong> 個工時,用例覆蓋率<strong>%rate%</strong>。";
$lang->product->storySummary = "本頁共 <strong>%s</strong> 個需求,預計 <strong>%s</strong> 個工時,用例覆蓋率 <strong>%s</strong>。";
$lang->product->checkedSummary = "選中 <strong>%total%</strong> 個需求,預計 <strong>%estimate%</strong> 個工時,用例覆蓋率 <strong>%rate%</strong>。";
$lang->product->noModule = '<div>您現在還沒有模組信息</div><div>請維護產品模組</div>';
$lang->product->noProduct = '暫時沒有產品。';
$lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon;
+1 -1
View File
@@ -253,7 +253,7 @@ class productplan extends control
{
$stories = array();
$order = explode(',', $plan->order);
if(strpos($orderBy, 'asc') !== false) $order = array_reverse($order, true);
if(strpos($orderBy, 'desc') !== false) $order = array_reverse($order, true);
foreach($order as $id)
{
if(empty($id)) continue;
+1 -2
View File
@@ -98,8 +98,7 @@
if(common::hasPriv('productplan', 'delete', $plan))
{
$deleteURL = $this->createLink('productplan', 'delete', "planID=$plan->id&confirm=yes");
echo html::a("javascript:ajaxDelete(\"$deleteURL\",\"productplanList\",confirmDelete)", '<i class="icon-trash"></i>', '', "class='btn btn-icon' title='{$lang->productplan->delete}'");
common::printIcon('productplan', 'delete', "planID=$plan->id", $plan, '<i class="icon-link"></i>', '', 'hiddenwin');
}
?>
</td>
+2 -1
View File
@@ -11,6 +11,7 @@
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/sortable.html.php';?>
<?php js::set('confirmUnlinkStory', $lang->productplan->confirmUnlinkStory)?>
<?php js::set('confirmUnlinkBug', $lang->productplan->confirmUnlinkBug)?>
<?php js::set('planID', $plan->id);?>
@@ -114,7 +115,7 @@
<th class='c-actions-1'> <?php echo $lang->actions?></th>
</tr>
</thead>
<tbody class='text-center'>
<tbody class='sortable text-center'>
<?php
$totalEstimate = 0.0;
?>
+13 -2
View File
@@ -2308,13 +2308,24 @@ class project extends control
public function importPlanStories($projectID, $planID)
{
$planStories = $planProducts = array();
$planStory = $this->loadModel('story')->getPlanStories($planID, 'changed,active,reviewing');
$planStory = $this->loadModel('story')->getPlanStories($planID);
if(!empty($planStory))
{
$count = 0;
foreach($planStory as $id => $story)
{
if($story->status == 'draft')
{
$count++;
unset($planStory[$id]);
continue;
}
$planProducts[$story->id] = $story->product;
}
$planStories = array_keys($planStory);
foreach($planStory as $story) $planProducts[$story->id] = $story->product;
$this->project->linkStory($projectID, $planStories, $planProducts);
}
if($count != 0) die(js::confirm(sprintf($this->lang->project->haveDraft, $count), $this->createLink('project', 'story', "projectID=$projectID")));
die(js::locate(helper::createLink('project', 'story', 'projectID=' . $projectID), 'parent'));
}
+1
View File
@@ -0,0 +1 @@
td.delayed{background: #e84e0f!important; color: white;}
+1 -1
View File
@@ -182,7 +182,7 @@ function loadPlans(product, branchID)
if(data)
{
if($("div#plan" + index).size() == 0) $("#plansBox .row").append('<div class="col-sm-4" id="plan' + index + '"></div>');
$("div#plan" + index).width($(product).closest('.col-sm-4').width()).html(data).find('select').attr('name', 'plans[' + productID + ']').attr('id', 'plans' + productID).chosen();
$("div#plan" + index).html(data).find('select').attr('name', 'plans[' + productID + ']').attr('id', 'plans' + productID).chosen();
adjustPlanBoxMargin();
}
-1
View File
@@ -100,7 +100,6 @@ $(function()
shown: function(){$('.modal-iframe').addClass('with-titlebar').data('cancel-reload', true)},
hidden: refresh
});
return true;
}
return false;
};
+1
View File
@@ -209,6 +209,7 @@ $lang->project->batchWBS = "Batch Decompose";
$lang->project->howToUpdateBurn = "<a href='http://api.zentao.net/goto.php?item=burndown&lang=zh-cn' target='_blank' title='How to Update the Burndown Chart?' class='btn btn-link'>Help <i class='icon icon-help'></i></a>";
$lang->project->whyNoStories = "No Story can be linked. Please check whether there is Story in {$lang->projectCommon} linked {$lang->productCommon} and make sure it has been reviewed.";
$lang->project->productStories = "{$lang->projectCommon} linked story is the subeset of {$lang->productCommon}, which can only be linked after review. Please <a href='%s'> Link Story</a>。";
$lang->project->haveDraft = "There are %s draft stories can't be linked.";
$lang->project->doneProjects = 'Done';
$lang->project->selectDept = 'Select Department';
$lang->project->selectDeptTitle = 'Select Department';
+1
View File
@@ -209,6 +209,7 @@ $lang->project->batchWBS = "批量分解";
$lang->project->howToUpdateBurn = "<a href='http://api.zentao.net/goto.php?item=burndown&lang=zh-cn' target='_blank' title='如何更新燃尽图?' class='btn btn-link'>帮助 <i class='icon icon-help'></i></a>";
$lang->project->whyNoStories = "看起来没有需求可以关联。请检查下{$lang->projectCommon}关联的{$lang->productCommon}中有没有需求,而且要确保它们已经审核通过。";
$lang->project->productStories = "{$lang->projectCommon}关联的需求是{$lang->productCommon}需求的子集,并且只有评审通过的需求才能关联。请<a href='%s'>关联需求</a>。";
$lang->project->haveDraft = "有%s条草稿状态的需求无法关联到该{$lang->projectCommon}";
$lang->project->doneProjects = '已结束';
$lang->project->selectDept = '选择部门';
$lang->project->selectDeptTitle = '选择一个部门的成员';
+3
View File
@@ -145,6 +145,8 @@ $lang->project->importPlanStories = '按計劃關聯需求';
$lang->project->importBug = '導入Bug';
$lang->project->updateOrder = '排序';
$lang->project->tree = '樹狀圖';
$lang->project->treeTask = '只看任務';
$lang->project->treeStory = '只看需求';
$lang->project->storyKanban = '需求看板';
$lang->project->storySort = '需求排序';
$lang->project->importPlanStory = '創建' . $lang->projectCommon . '成功!\n是否導入計劃關聯的相關需求?';
@@ -207,6 +209,7 @@ $lang->project->batchWBS = "批量分解";
$lang->project->howToUpdateBurn = "<a href='http://api.zentao.net/goto.php?item=burndown&lang=zh-tw' target='_blank' title='如何更新燃盡圖?' class='btn btn-link'>幫助 <i class='icon icon-help'></i></a>";
$lang->project->whyNoStories = "看起來沒有需求可以關聯。請檢查下{$lang->projectCommon}關聯的{$lang->productCommon}中有沒有需求,而且要確保它們已經審核通過。";
$lang->project->productStories = "{$lang->projectCommon}關聯的需求是{$lang->productCommon}需求的子集,並且只有評審通過的需求才能關聯。請<a href='%s'>關聯需求</a>。";
$lang->project->haveDraft = "有%s條草稿狀態的需求無法關聯到該{$lang->projectCommon}";
$lang->project->doneProjects = '已結束';
$lang->project->selectDept = '選擇部門';
$lang->project->selectDeptTitle = '選擇一個部門的成員';
+15 -54
View File
@@ -141,65 +141,15 @@ class projectModel extends model
foreach($this->lang->project->menu as $key => $menu)
{
$replace = $projectID;
common::setMenuVars($this->lang->project->menu, $key, $projectID);
/* Replace for dropdown submenu. */
if(isset($this->lang->project->subMenu->$key))
{
$index = 0;
$firstLink = '';
$dropTitle = '';
$hasActive = false;
$subMenu = array();
$replace = "<ul class='dropdown-menu'>";
foreach($this->lang->project->subMenu->$key as $subMenuKey => $subMenuLink)
{
$subModule = '';
if(is_array($subMenuLink))
{
if(isset($subMenuLink['subModule'])) $subModule = $subMenuLink['subModule'];
$subMenuLink = $subMenuLink['link'];
}
list($subMenuName, $subMenuModule, $subMenuMethod, $subMenuParams) = explode('|', $subMenuLink);
if(!commonModel::hasPriv($subMenuModule, $subMenuMethod)) continue;
if(empty($dropTitle)) $dropTitle = $subMenuName;
$active = '';
if(($moduleName == $subMenuModule and $methodName == strtolower($subMenuMethod)) or strpos(",$subModule,", ",$moduleName,") !== false)
{
$active = "class='active'";
$dropTitle = $subMenuName;
}
$link = helper::createLink($subMenuModule, $subMenuMethod, sprintf($subMenuParams, $projectID));
$replace .= "<li $active>" . html::a($link, $subMenuName) . '</li>';
if($active) $hasActive = true;
if($index == 0) $firstLink = $link;
$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[] = $menu;
$index++;
}
$replace .= '</ul>';
$replace = "<a href='$firstLink'>$dropTitle <span class='caret'></span></a>" . $replace;
$this->lang->project->menu->{$key}['class'] = 'dropdown dropdown-hover';
if($hasActive) $this->lang->project->menu->{$key}['class'] .= ' active';
$subMenu = common::createSubMenu($this->lang->project->subMenu->$key, $projectID);
if(!empty($subMenu)) $this->lang->project->menu->{$key}['subMenu'] = $subMenu;
}
common::setMenuVars($this->lang->project->menu, $key, $replace);
}
}
@@ -1645,15 +1595,26 @@ class projectModel extends model
{
foreach($plans as $planID => $productID)
{
$planStory = $this->loadModel('story')->getPlanStories($planID, 'active');
$planStory = $this->loadModel('story')->getPlanStories($planID);
if(!empty($planStory))
{
$count = 0;
foreach($planStory as $id => $story)
{
if($story->status == 'draft')
{
$count++;
unset($planStory[$id]);
continue;
}
$planProducts[$story->id] = $story->product;
}
$planStories = array_merge($planStories, array_keys($planStory));
foreach($planStory as $story) $planProducts[$story->id] = $story->product;
}
}
}
$this->linkStory($projectID, $planStories, $planProducts);
if($count != 0) die(js::confirm(sprintf($this->lang->project->haveDraft, $count), helper::createLink('project', 'create', "projectID=$projectID")));
}
/**
+1 -2
View File
@@ -87,8 +87,7 @@
common::printIcon('build', 'edit', "buildID=$build->id", $build, 'list');
if(common::hasPriv('build', 'delete', $build))
{
$deleteURL = $this->createLink('build', 'delete', "buildID=$build->id&confirm=yes");
echo html::a("javascript:ajaxDelete(\"$deleteURL\",\"buildList\",confirmDelete)", '<i class="icon-trash"></i>', '', "class='btn' title='{$lang->build->delete}'");
common::printIcon('build', 'delete', "buildID=$build->id", $build, '<i class="icon-trash"></i>', '', 'hiddenwin');
}
?>
</td>
+3 -1
View File
@@ -137,9 +137,11 @@
<th><?php echo $lang->project->linkPlan;?></th>
<td id="plansBox" colspan="2">
<div class='row'>
<?php $i = 0;?>
<?php foreach($linkedProducts as $product):?>
<?php $plans = zget($productPlans, $product->id, array(0 => ''));?>
<div class="col-sm-4" id="plan<?php echo $product->id;?>"><?php echo html::select("plans[" . $product->id . "]", $plans, $product->plan, "class='form-control chosen'");?></div>
<div class="col-sm-4" id="plan<?php echo $i;?>"><?php echo html::select("plans[" . $product->id . "]", $plans, $product->plan, "class='form-control chosen'");?></div>
<?php $i++;?>
<?php endforeach;?>
</div>
</td>
+2 -2
View File
@@ -203,7 +203,7 @@
<tbody>
<tr>
<td colspan="2">
<?php $progress = $project->totalHours ? round($project->totalConsumed / $project->totalHours, 3) * 100 : 0;?>
<?php $progress = ($project->totalConsumed + $project->totalLeft) ? round($project->totalConsumed / ($project->totalConsumed + $project->totalLeft), 3) * 100 : 0;?>
<?php echo $lang->projectCommon . $lang->project->progress;?> <em><?php echo $progress . $lang->percent;?></em> &nbsp;
<div class="progress inline-block">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="<?php echo $progress;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $progress . $lang->percent;?>"></div>
@@ -226,7 +226,7 @@
<th><?php echo $lang->project->totalDays;?></th>
<td><?php echo $project->days;?></td>
<th><?php echo $lang->project->totalLeft;?></th>
<td><em><?php echo $project->totalLeft;?></em></td>
<td><em><?php echo $project->totalLeft . $lang->project->workHour;?></em></td>
</tr>
<tr>
<th><?php echo $lang->project->totalHours;?></th>
+1 -2
View File
@@ -77,8 +77,7 @@
common::printIcon('release', 'edit', "release=$release->id", $release, 'list');
if(common::hasPriv('release', 'delete', $release))
{
$deleteURL = $this->createLink('release', 'delete', "releaseID=$release->id&confirm=yes");
echo html::a("javascript:ajaxDelete(\"$deleteURL\",\"releaseList\",confirmDelete)", '<i class="icon-trash"></i>', '', "class='btn' title='{$lang->release->delete}'");
common::printIcon('release', 'delete', "releaseID=$release->id", $release, '<i class="icon-link"></i>', '', 'hiddenwin');
}
?>
</td>
+1
View File
@@ -24,6 +24,7 @@ $lang->search->select = '需求/任務篩選';
$lang->search->me = '自己';
$lang->search->noQuery = '還沒有保存查詢!';
$lang->search->onMenuBar = '顯示在菜單欄';
$lang->search->custom = '自定義';
$lang->search->account = '用戶名';
$lang->search->module = '模組';
+2 -2
View File
@@ -31,11 +31,11 @@ function loadBranches(product, branch, storyID)
if(!branch) branch = 0;
moduleLink = createLink('tree', 'ajaxGetOptionMenu', 'productID=' + product + '&viewtype=story&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=' + storyID);
$('#modules' + storyID).parent('td').load(moduleLink, function(){$('#modules' + storyID).chosen(defaultChosenOptions);});
$('#modules' + storyID).parent('td').load(moduleLink, function(){$('#modules' + storyID).chosen();});
planID = $('#plans' + storyID).val();
planLink = createLink('product', 'ajaxGetPlans', 'productID=' + product + '&branch=' + branch + '&planID=' + planID + '&fieldID=' + storyID);
$('#plans' + storyID).parent('td').load(planLink, function(){$('#plans' + storyID).chosen(defaultChosenOptions);});
$('#plans' + storyID).parent('td').load(planLink, function(){$('#plans' + storyID).chosen();});
}
$(function()
-2
View File
@@ -274,8 +274,6 @@ class storyModel extends model
$stories->plan[$i] = $plan;
$stories->pri[$i] = (int)$pri;
$stories->source[$i] = $source;
if(!empty($stories->title[$i]) && empty($stories->module[$i])) die(js::alert(sprintf($this->lang->error->notempty, $this->lang->story->module)));
}
if(isset($stories->uploadImage)) $this->loadModel('file');
+1 -1
View File
@@ -46,7 +46,7 @@
<tr>
<th class='col-id'><?php echo $lang->idAB;?></th>
<th class='w-150px<?php echo zget($visibleFields, $product->type, ' hidden')?>'><?php echo $lang->product->branch;?></th>
<th class='col-module required'><?php echo $lang->story->module;?></th>
<th class='col-module'><?php echo $lang->story->module;?></th>
<th class='col-plan<?php echo zget($visibleFields, 'plan', ' hidden') . zget($requiredFields, 'plan', '', ' required');?>'><?php echo $lang->story->plan;?></th>
<th class='col-name required has-btn'><?php echo $lang->story->title;?></th>
<th class='w-150px<?php echo zget($visibleFields, 'spec', ' hidden') . zget($requiredFields, 'spec', '', ' required');?>'><?php echo $lang->story->spec;?></th>
+1 -1
View File
@@ -32,7 +32,7 @@ var assignedTo = '<?php $story->lastEditedBy ? print($story->lastEditedBy) : pri
</tr>
<tr>
<th><?php echo $lang->story->reviewResult;?></th>
<td><?php echo html::select('result', $lang->story->reviewResultList, '', 'class=form-control onchange="switchShow(this.value)"');?></td><td></td>
<td class = 'required'><?php echo html::select('result', $lang->story->reviewResultList, '', 'class=form-control onchange="switchShow(this.value)"');?></td><td></td>
</tr>
<tr id='rejectedReasonBox' class='hide'>
<th><?php echo $lang->story->rejectedReason;?></th>
+1 -4
View File
@@ -1,6 +1,3 @@
/* Remove width in defaultChosenOptions. */
delete defaultChosenOptions.width;
/* Remove 'ditto' in first row. */
$(function()
{
@@ -32,7 +29,7 @@ function setStories(moduleID, projectID, num)
})
}
$("#story" + num + "_chosen").remove();
$("#story" + num).chosen(defaultChosenOptions);
$("#story" + num).chosen();
});
}
+51
View File
@@ -0,0 +1,51 @@
function adjustSortBtn()
{
$('.btn-move-up:first').addClass('disabled').attr('disabled', 'disabled');
$('.btn-move-down:last').addClass('disabled').attr('disabled', 'disabled');
}
$('.btn-move-up, .btn-move-down').click(function()
{
var $this = $(this);
if($this.hasClass('btn-move-up'))
{
$(this).parents('tr').prev().before($(this).parents('tr'));
}
else
{
$this.parents('tr').next().after($(this).parents('tr'));
}
$('.btn-move-up, .btn-move-down').removeClass('disabled').removeAttr('disabled');
adjustSortBtn();
});
function adjustSortBtn()
{
$('.btn-move-up:first').addClass('disabled').attr('disabled', 'disabled');
$('.btn-move-down:last').addClass('disabled').attr('disabled', 'disabled');
}
$('#modalTeam .btn').click(function()
{
var team = '';
var time = 0;
$('[name*=team]').each(function()
{
if($(this).find('option:selected').text() != '')
{
team += ' ' + $(this).find('option:selected').text();
}
estimate = parseFloat($(this).parents('td').next('td').find('[name*=teamEstimate]').val());
if(!isNaN(estimate))
{
time += estimate;
}
$('#teamMember').val(team);
$('#estimate').val(time);
})
});
//end
+4 -4
View File
@@ -1,6 +1,6 @@
$(function()
{
$("#story, #mailto").chosen(defaultChosenOptions);
$("#story, #mailto").chosen();
$('.record-estimate-toggle').modalTrigger({width:900, type:'iframe', afterHide: function(){parent.location.href=parent.location.href;}});
})
@@ -41,7 +41,7 @@ function loadAll(projectID)
function loadModuleMenu(projectID)
{
var link = createLink('tree', 'ajaxGetOptionMenu', 'rootID=' + projectID + '&viewtype=task');
$('#moduleIdBox').load(link, function(){$('#module').chosen(defaultChosenOptions);});
$('#moduleIdBox').load(link, function(){$('#module').chosen();});
}
/**
@@ -54,7 +54,7 @@ function loadModuleMenu(projectID)
function loadProjectStories(projectID)
{
var link = createLink('story', 'ajaxGetProjectStories', 'projectID=' + projectID + '&productID=0&branch=0&moduleID=0&storyID=' + oldStoryID);
$('#storyIdBox').load(link, function(){$('#story').chosen(defaultChosenOptions);});
$('#storyIdBox').load(link, function(){$('#story').chosen();});
}
/**
@@ -67,7 +67,7 @@ function loadProjectStories(projectID)
function loadProjectMembers(projectID)
{
var link = createLink('project', 'ajaxGetMembers', 'projectID=' + projectID + '&assignedTo=' + oldAssignedTo);
$('#assignedToIdBox').load(link, function(){$('#assignedToIdBox').find('select').chosen(defaultChosenOptions)});
$('#assignedToIdBox').load(link, function(){$('#assignedToIdBox').find('select').chosen()});
}
/* empty function. */
+1
View File
@@ -183,6 +183,7 @@ $lang->task->error->left = '請填寫"剩餘"';
$lang->task->error->work = '"備註"必須小於%d個字元';
$lang->task->error->skipClose = '任務:%s 不是“已完成”或“已取消”狀態,確定要關閉嗎?';
$lang->task->error->consumed = '任務:%s工時不能小於0,忽略該任務工時的改動';
$lang->task->error->assignedTo = '當前狀態的多人任務不能指派給任務團隊外的成員。';
/* Report. */
$lang->task->report = new stdclass();
+1 -1
View File
@@ -222,7 +222,7 @@
<td>
<?php
$mailto = explode(',', str_replace(' ', '', $task->mailto));
if(empty($mainto))
if(empty($mailto))
{
echo $lang->noData;
}
+1 -1
View File
@@ -101,6 +101,6 @@ function setModules(branchID, productID, num)
if(!modules) modules = '<select id="module' + num + '" name="module[' + num + ']" class="form-control"></select>';
$('#module' + num).replaceWith(modules);
$("#module" + num + "_chosen").remove();
$("#module" + num).chosen(defaultChosenOptions);
$("#module" + num).chosen();
});
}
+1 -1
View File
@@ -31,7 +31,7 @@ function loadBranches(product, branch, caseID)
if(!branch) branch = 0;
moduleLink = createLink('tree', 'ajaxGetOptionMenu', 'productID=' + product + '&viewtype=case&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=' + caseID + '&needManage=true');
$('#modules' + caseID).parent('td').load(moduleLink, function(){$('#modules' + caseID).chosen(defaultChosenOptions);})
$('#modules' + caseID).parent('td').load(moduleLink, function(){$('#modules' + caseID).chosen();})
}
$(function()
+13 -1
View File
@@ -17,6 +17,18 @@ $(function()
if(flow == 'onlyTest')
{
$('#subNavbar > .nav > li[data-id=' + browseType + ']').addClass('active');
$('#subNavbar > .nav li[data-id=' + browseType + ']').addClass('active');
if(browseType == 'bysuite')
{
var $moreSuite = $('#subNavbar > .nav > li[data-id=bysuite]');
if($moreSuite.find('.dropdown-menu').children().length)
{
$moreSuite.find('.dropdown-menu').children().each(function()
{
if($(this).data('id') == suiteID) $(this).addClass('active');
});
}
}
}
});
+3 -3
View File
@@ -85,7 +85,7 @@ function loadProductModules(productID, branch)
link = createLink('tree', 'ajaxGetOptionMenu', 'productID=' + productID + '&viewtype=case&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=&needManage=true');
$('#moduleIdBox').load(link, function()
{
$(this).find('select').chosen(defaultChosenOptions)
$(this).find('select').chosen()
if(typeof(caseModule) == 'string') $('#moduleIdBox').prepend("<span class='input-group-addon'>" + caseModule + "</span>")
});
setStories();
@@ -105,7 +105,7 @@ function loadLibModules(libID, branch)
link = createLink('tree', 'ajaxGetOptionMenu', 'rootID=' + libID + '&viewtype=caselib&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=&needManage=true');
$('#moduleIdBox').load(link, function()
{
$(this).find('select').chosen(defaultChosenOptions)
$(this).find('select').chosen()
if(typeof(caseModule) == 'string') $('#moduleIdBox').prepend("<span class='input-group-addon'>" + caseModule + "</span>")
});
}
@@ -130,7 +130,7 @@ function setStories()
$('#story').replaceWith(stories);
$('#story').val(value);
$('#story_chosen').remove();
$("#story").chosen(defaultChosenOptions);
$("#story").chosen();
});
}
+2 -2
View File
@@ -15,7 +15,7 @@ function getList()
$(document).ready(function()
{
$("#story").chosen(defaultChosenOptions);
$("#story").chosen();
initSteps();
});
@@ -32,7 +32,7 @@ function loadLibModules(libID)
link = createLink('tree', 'ajaxGetOptionMenu', 'libID=' + libID + '&viewtype=caselib&branch=0&rootModuleID=0&returnType=html&fieldID=&needManage=true');
$('#moduleIdBox').load(link, function()
{
$(this).find('select').chosen(defaultChosenOptions)
$(this).find('select').chosen()
if(typeof(caseModule) == 'string') $('#moduleIdBox').prepend("<span class='input-group-addon'>" + caseModule + "</span>")
});
}
+39 -28
View File
@@ -118,38 +118,50 @@ class testcaseModel extends model
}
else
{
if($key == 'suite' and common::hasPriv('testcase', 'browse'))
if($key == 'bysuite')
{
$suiteList = $this->loadModel('testsuite')->getSuites($productID);
$currentSuiteID = isset($suiteID) ? (int)$suiteID : 0;
$currentSuite = zget($suiteList, $currentSuiteID, '');
$currentLable = empty($currentSuite) ? $this->lang->testsuite->common : $currentSuite->name;
$subMenu = array();
if(common::hasPriv('testcase', 'browse'))
{
$suiteList = $this->loadModel('testsuite')->getSuites($productID);
$currentSuiteID = isset($suiteID) ? (int)$suiteID : 0;
$replace = "<li id='bysuiteTab' class='dropdown' data-id='bysuite'>";
$replace .= html::a('javascript:;', $currentLable . " <span class='caret'></span>", '', "data-toggle='dropdown'");
$replace .="<ul class='dropdown-menu' style='max-height:240px; overflow-y:auto'>";
if($suiteList)
{
foreach($suiteList as $suiteID => $suite)
{
$suiteName = $suite->name;
if($suite->type == 'public') $suiteName .= " <span class='label label-info'>{$this->lang->testsuite->authorList[$suite->type]}</span>";
if($suiteList)
{
foreach($suiteList as $suiteID => $suite)
{
$suiteName = $suite->name;
if($suite->type == 'public') $suiteName .= " <span class='label label-info'>{$this->lang->testsuite->authorList[$suite->type]}</span>";
$link = array();
$link['module'] = 'testcase';
$link['method'] = 'browse';
$link['vars'] = "productID=$productID&branch=$branch&browseType=bysuite&param=$suiteID";
$replace .= '<li' . ($suiteID == (int)$currentSuiteID ? " class='active'" : '') . '>';
$replace .= html::a(helper::createLink('testcase', 'browse', "productID=$productID&branch=$branch&browseType=bySuite&param=$suiteID"), $suiteName);
$replace .= "</li>";
}
}
else
{
if(common::hasPriv('testsuite', 'create'))
{
$replace .= '<li>' . html::a(helper::createLink('testsuite', 'create', "productID=$productID"), $this->lang->testsuite->create) . '</li>';
}
}
$menu = new stdclass();
$menu->name = $suiteID;
$menu->link = $link;
$menu->text = $suiteName;
$menu->hidden = false;
$subMenu[$suiteID] = $menu;
}
}
}
/* Avoid the menu shaking when change it by js. */
if(isset($subMenu[$currentSuiteID]))
{
$currentSubMenu = $subMenu[$currentSuiteID];
$this->lang->testcase->menu->bysuite['link'] = "$currentSubMenu->text|" . implode('|', $currentSubMenu->link);
}
$replace .= '</ul></li>';
/* Replace for dropdown submenu. */
if(isset($this->lang->testcase->subMenu->$key))
{
$subMenu += common::createSubMenu($this->lang->testcase->subMenu->$key, $productID);
}
if(!empty($subMenu)) $this->lang->testcase->menu->{$key}['subMenu'] = $subMenu;
if($this->app->getMethodName() != 'view') $this->lang->testcase->menu->bysearch = "<a class='querybox-toggle' id='bysearchTab'><i class='icon icon-search muted'> </i>{$this->lang->testcase->bySearch}</a>";
}
else
{
@@ -160,7 +172,6 @@ class testcaseModel extends model
}
common::setMenuVars($this->lang->testcase->menu, $key, $replace);
}
if($this->config->global->flow != 'full' && $this->app->getMethodName() != 'view') $this->lang->testcase->menu->bysearch = "<a class='querybox-toggle' id='bysearchTab'><i class='icon icon-search muted'> </i>{$this->lang->testcase->bySearch}</a>";
}
/**
+1
View File
@@ -22,6 +22,7 @@ js::set('confirmDelete', $lang->testcase->confirmDelete);
js::set('batchDelete', $lang->testcase->confirmBatchDelete);
js::set('productID', $productID);
js::set('branch', $branch);
js::set('suiteID', $suiteID);
?>
<div id="mainContent" class="main-row fade">
<div class='side-col' id='sidebar'>
+1 -1
View File
@@ -5,7 +5,7 @@ function loadLibModules(libID)
link = createLink('tree', 'ajaxGetOptionMenu', 'libID=' + libID + '&viewtype=caselib&branch=0&rootModuleID=0&returnType=html&fieldID=&needManage=true');
$('#moduleIdBox').load(link, function()
{
$(this).find('select').chosen(defaultChosenOptions)
$(this).find('select').chosen()
if(typeof(caseModule) == 'string') $('#moduleIdBox').prepend("<span class='input-group-addon'>" + caseModule + "</span>")
});
}
+1 -1
View File
@@ -22,7 +22,7 @@ function loadProjectBuilds(projectID)
selectedBuild = $('#build').val();
if(!selectedBuild) selectedBuild = 0;
link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + $('#product').val() + '&varName=testTaskBuild&build=' + selectedBuild);
$('#buildBox').load(link, function(){$('#build').chosen(window.defaultChosenOptions);});
$('#buildBox').load(link, function(){$('#build').chosen(window.);});
}
/**
+1 -1
View File
@@ -22,7 +22,7 @@ function loadProjectBuilds(projectID)
selectedBuild = $('#build').val();
if(!selectedBuild) selectedBuild = 0;
link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + $('#product').val() + '&varName=testTaskBuild&build=' + selectedBuild);
$('#buildBox').load(link, function(){$('#build').chosen(defaultChosenOptions);});
$('#buildBox').load(link, function(){$('#build').chosen();});
}
$(function()
+1 -1
View File
@@ -15,7 +15,7 @@
<div class='main-header'>
<h2>
<span class='label label-id'><?php echo $case->id;?></span>
<?php echo $case->title;?>
<span title='<?php echo $case->title;?>'><?php echo $case->title;?></span>
</h2>
</div>
+1 -1
View File
@@ -17,7 +17,7 @@
<div class='main-header'>
<h2>
<span class='label label-id'><?php echo $run->case->id;?></span>
<?php echo $run->case->title;?>
<span title='<?php echo $run->case->title?>'><?php echo $run->case->title;?></span>
</h2>
</div>
<form method='post' enctype='multipart/form-data' id='dataform' data-type='ajax'>
+1
View File
@@ -30,6 +30,7 @@ $lang->todo->import = "導入";
$lang->todo->legendBasic = "基本信息";
$lang->todo->cycle = "周期";
$lang->todo->cycleConfig = "周期設置";
$lang->todo->noName = "『待辦名稱』不能為空。";
$lang->todo->reasonList['story'] = "轉需求";
$lang->todo->reasonList['task'] = "轉任務";
+1 -92
View File
@@ -45,95 +45,4 @@ $lang->upgrade->sureExecute = 'Execute';
$lang->upgrade->forbiddenExt = 'Extension is not compatible with the upgraded version. It has been deactivated:';
$lang->upgrade->updateFile = 'Attachment information has to be updated.';
$lang->upgrade->fromVersions['0_3beta'] = '0.3 BETA';
$lang->upgrade->fromVersions['0_4beta'] = '0.4 BETA';
$lang->upgrade->fromVersions['0_5beta'] = '0.5 BETA';
$lang->upgrade->fromVersions['0_6beta'] = '0.6 BETA';
$lang->upgrade->fromVersions['1_0beta'] = '1.0 BETA';
$lang->upgrade->fromVersions['1_0rc1'] = '1.0 RC1';
$lang->upgrade->fromVersions['1_0rc2'] = '1.0 RC2';
$lang->upgrade->fromVersions['1_0'] = '1.0 STABLE';
$lang->upgrade->fromVersions['1_0_1'] = '1.0.1';
$lang->upgrade->fromVersions['1_1'] = '1.1';
$lang->upgrade->fromVersions['1_2'] = '1.2';
$lang->upgrade->fromVersions['1_3'] = '1.3';
$lang->upgrade->fromVersions['1_4'] = '1.4';
$lang->upgrade->fromVersions['1_5'] = '1.5';
$lang->upgrade->fromVersions['2_0'] = '2.0';
$lang->upgrade->fromVersions['2_1'] = '2.1';
$lang->upgrade->fromVersions['2_2'] = '2.2';
$lang->upgrade->fromVersions['2_3'] = '2.3';
$lang->upgrade->fromVersions['2_4'] = '2.4';
$lang->upgrade->fromVersions['3_0_beta1'] = '3.0 BETA1';
$lang->upgrade->fromVersions['3_0_beta2'] = '3.0 BETA2';
$lang->upgrade->fromVersions['3_0'] = '3.0 STABLE';
$lang->upgrade->fromVersions['3_1'] = '3.1';
$lang->upgrade->fromVersions['3_2'] = '3.2';
$lang->upgrade->fromVersions['3_2_1'] = '3.2.1';
$lang->upgrade->fromVersions['3_3'] = '3.3';
$lang->upgrade->fromVersions['4_0_beta1'] = '4.0 BETA1';
$lang->upgrade->fromVersions['4_0_beta2'] = '4.0 BETA2';
$lang->upgrade->fromVersions['4_0'] = '4.0';
$lang->upgrade->fromVersions['4_0_1'] = '4.0.1';
$lang->upgrade->fromVersions['4_1'] = '4.1';
$lang->upgrade->fromVersions['4_2_beta'] = '4.2.beta';
$lang->upgrade->fromVersions['4_3_beta'] = '4.3.beta';
$lang->upgrade->fromVersions['5_0_beta1'] = '5.0.beta1';
$lang->upgrade->fromVersions['5_0_beta2'] = '5.0.beta2';
$lang->upgrade->fromVersions['5_0'] = '5.0';
$lang->upgrade->fromVersions['5_1'] = '5.1';
$lang->upgrade->fromVersions['5_2'] = '5.2';
$lang->upgrade->fromVersions['5_2_1'] = '5.2.1';
$lang->upgrade->fromVersions['5_3'] = '5.3';
$lang->upgrade->fromVersions['6_0_beta1'] = '6.0.beta1';
$lang->upgrade->fromVersions['6_0'] = '6.0';
$lang->upgrade->fromVersions['6_1'] = '6.1';
$lang->upgrade->fromVersions['6_2'] = '6.2';
$lang->upgrade->fromVersions['6_3'] = '6.3';
$lang->upgrade->fromVersions['6_4'] = '6.4';
$lang->upgrade->fromVersions['7_0'] = '7.0';
$lang->upgrade->fromVersions['7_1'] = '7.1';
$lang->upgrade->fromVersions['7_2'] = '7.2';
$lang->upgrade->fromVersions['7_2_4'] = '7.2.4';
$lang->upgrade->fromVersions['7_2_5'] = '7.2.5';
$lang->upgrade->fromVersions['7_3'] = '7.3';
$lang->upgrade->fromVersions['7_4_beta'] = '7.4.beta';
$lang->upgrade->fromVersions['8_0'] = '8.0';
$lang->upgrade->fromVersions['8_0_1'] = '8.0.1';
$lang->upgrade->fromVersions['8_1'] = '8.1';
$lang->upgrade->fromVersions['8_1_3'] = '8.1.3';
$lang->upgrade->fromVersions['8_2_beta'] = '8.2.beta';
$lang->upgrade->fromVersions['8_2'] = '8.2';
$lang->upgrade->fromVersions['8_2_1'] = '8.2.1';
$lang->upgrade->fromVersions['8_2_2'] = '8.2.2';
$lang->upgrade->fromVersions['8_2_3'] = '8.2.3';
$lang->upgrade->fromVersions['8_2_4'] = '8.2.4';
$lang->upgrade->fromVersions['8_2_5'] = '8.2.5';
$lang->upgrade->fromVersions['8_2_6'] = '8.2.6';
$lang->upgrade->fromVersions['8_3'] = '8.3';
$lang->upgrade->fromVersions['8_3_1'] = '8.3.1';
$lang->upgrade->fromVersions['8_4'] = '8.4';
$lang->upgrade->fromVersions['8_4_1'] = '8.4.1';
$lang->upgrade->fromVersions['9_0_beta'] = '9.0.beta';
$lang->upgrade->fromVersions['9_0'] = '9.0';
$lang->upgrade->fromVersions['9_0_1'] = '9.0.1';
$lang->upgrade->fromVersions['9_1'] = '9.1';
$lang->upgrade->fromVersions['9_1_1'] = '9.1.1';
$lang->upgrade->fromVersions['9_1_2'] = '9.1.2';
$lang->upgrade->fromVersions['9_2'] = '9.2';
$lang->upgrade->fromVersions['9_2_1'] = '9.2.1';
$lang->upgrade->fromVersions['9_3_beta'] = '9.3.beta';
$lang->upgrade->fromVersions['9_4'] = '9.4';
$lang->upgrade->fromVersions['9_5'] = '9.5';
$lang->upgrade->fromVersions['9_5_1'] = '9.5.1';
$lang->upgrade->fromVersions['9_6'] = '9.6';
$lang->upgrade->fromVersions['9_6_1'] = '9.6.1';
$lang->upgrade->fromVersions['9_6_2'] = '9.6.2';
$lang->upgrade->fromVersions['9_6_3'] = '9.6.3';
$lang->upgrade->fromVersions['9_7'] = '9.7';
$lang->upgrade->fromVersions['9_8'] = '9.8';
$lang->upgrade->fromVersions['9_8_1'] = '9.8.1';
$lang->upgrade->fromVersions['9_8_2'] = '9.8.2';
$lang->upgrade->fromVersions['9_8_3'] = '9.8.3';
$lang->upgrade->fromVersions['10_0_alpha'] = '10.0.alpha';
$lang->upgrade->fromVersions['10_0_beta'] = '10.0.beta';
include dirname(__FILE__) . '/version.php';
+94
View File
@@ -0,0 +1,94 @@
<?php
$lang->upgrade->fromVersions['0_3beta'] = '0.3 BETA';
$lang->upgrade->fromVersions['0_4beta'] = '0.4 BETA';
$lang->upgrade->fromVersions['0_5beta'] = '0.5 BETA';
$lang->upgrade->fromVersions['0_6beta'] = '0.6 BETA';
$lang->upgrade->fromVersions['1_0beta'] = '1.0 BETA';
$lang->upgrade->fromVersions['1_0rc1'] = '1.0 RC1';
$lang->upgrade->fromVersions['1_0rc2'] = '1.0 RC2';
$lang->upgrade->fromVersions['1_0'] = '1.0 STABLE';
$lang->upgrade->fromVersions['1_0_1'] = '1.0.1';
$lang->upgrade->fromVersions['1_1'] = '1.1';
$lang->upgrade->fromVersions['1_2'] = '1.2';
$lang->upgrade->fromVersions['1_3'] = '1.3';
$lang->upgrade->fromVersions['1_4'] = '1.4';
$lang->upgrade->fromVersions['1_5'] = '1.5';
$lang->upgrade->fromVersions['2_0'] = '2.0';
$lang->upgrade->fromVersions['2_1'] = '2.1';
$lang->upgrade->fromVersions['2_2'] = '2.2';
$lang->upgrade->fromVersions['2_3'] = '2.3';
$lang->upgrade->fromVersions['2_4'] = '2.4';
$lang->upgrade->fromVersions['3_0_beta1'] = '3.0 BETA1';
$lang->upgrade->fromVersions['3_0_beta2'] = '3.0 BETA2';
$lang->upgrade->fromVersions['3_0'] = '3.0 STABLE';
$lang->upgrade->fromVersions['3_1'] = '3.1';
$lang->upgrade->fromVersions['3_2'] = '3.2';
$lang->upgrade->fromVersions['3_2_1'] = '3.2.1';
$lang->upgrade->fromVersions['3_3'] = '3.3';
$lang->upgrade->fromVersions['4_0_beta1'] = '4.0 BETA1';
$lang->upgrade->fromVersions['4_0_beta2'] = '4.0 BETA2';
$lang->upgrade->fromVersions['4_0'] = '4.0';
$lang->upgrade->fromVersions['4_0_1'] = '4.0.1';
$lang->upgrade->fromVersions['4_1'] = '4.1';
$lang->upgrade->fromVersions['4_2_beta'] = '4.2.beta';
$lang->upgrade->fromVersions['4_3_beta'] = '4.3.beta';
$lang->upgrade->fromVersions['5_0_beta1'] = '5.0.beta1';
$lang->upgrade->fromVersions['5_0_beta2'] = '5.0.beta2';
$lang->upgrade->fromVersions['5_0'] = '5.0';
$lang->upgrade->fromVersions['5_1'] = '5.1';
$lang->upgrade->fromVersions['5_2'] = '5.2';
$lang->upgrade->fromVersions['5_2_1'] = '5.2.1';
$lang->upgrade->fromVersions['5_3'] = '5.3';
$lang->upgrade->fromVersions['6_0_beta1'] = '6.0.beta1';
$lang->upgrade->fromVersions['6_0'] = '6.0';
$lang->upgrade->fromVersions['6_1'] = '6.1';
$lang->upgrade->fromVersions['6_2'] = '6.2';
$lang->upgrade->fromVersions['6_3'] = '6.3';
$lang->upgrade->fromVersions['6_4'] = '6.4';
$lang->upgrade->fromVersions['7_0'] = '7.0';
$lang->upgrade->fromVersions['7_1'] = '7.1';
$lang->upgrade->fromVersions['7_2'] = '7.2';
$lang->upgrade->fromVersions['7_2_4'] = '7.2.4';
$lang->upgrade->fromVersions['7_2_5'] = '7.2.5';
$lang->upgrade->fromVersions['7_3'] = '7.3';
$lang->upgrade->fromVersions['7_4_beta'] = '7.4.beta';
$lang->upgrade->fromVersions['8_0'] = '8.0';
$lang->upgrade->fromVersions['8_0_1'] = '8.0.1';
$lang->upgrade->fromVersions['8_1'] = '8.1';
$lang->upgrade->fromVersions['8_1_3'] = '8.1.3';
$lang->upgrade->fromVersions['8_2_beta'] = '8.2.beta';
$lang->upgrade->fromVersions['8_2'] = '8.2';
$lang->upgrade->fromVersions['8_2_1'] = '8.2.1';
$lang->upgrade->fromVersions['8_2_2'] = '8.2.2';
$lang->upgrade->fromVersions['8_2_3'] = '8.2.3';
$lang->upgrade->fromVersions['8_2_4'] = '8.2.4';
$lang->upgrade->fromVersions['8_2_5'] = '8.2.5';
$lang->upgrade->fromVersions['8_2_6'] = '8.2.6';
$lang->upgrade->fromVersions['8_3'] = '8.3';
$lang->upgrade->fromVersions['8_3_1'] = '8.3.1';
$lang->upgrade->fromVersions['8_4'] = '8.4';
$lang->upgrade->fromVersions['8_4_1'] = '8.4.1';
$lang->upgrade->fromVersions['9_0_beta'] = '9.0.beta';
$lang->upgrade->fromVersions['9_0'] = '9.0';
$lang->upgrade->fromVersions['9_0_1'] = '9.0.1';
$lang->upgrade->fromVersions['9_1'] = '9.1';
$lang->upgrade->fromVersions['9_1_1'] = '9.1.1';
$lang->upgrade->fromVersions['9_1_2'] = '9.1.2';
$lang->upgrade->fromVersions['9_2'] = '9.2';
$lang->upgrade->fromVersions['9_2_1'] = '9.2.1';
$lang->upgrade->fromVersions['9_3_beta'] = '9.3.beta';
$lang->upgrade->fromVersions['9_4'] = '9.4';
$lang->upgrade->fromVersions['9_5'] = '9.5';
$lang->upgrade->fromVersions['9_5_1'] = '9.5.1';
$lang->upgrade->fromVersions['9_6'] = '9.6';
$lang->upgrade->fromVersions['9_6_1'] = '9.6.1';
$lang->upgrade->fromVersions['9_6_2'] = '9.6.2';
$lang->upgrade->fromVersions['9_6_3'] = '9.6.3';
$lang->upgrade->fromVersions['9_7'] = '9.7';
$lang->upgrade->fromVersions['9_8'] = '9.8';
$lang->upgrade->fromVersions['9_8_1'] = '9.8.1';
$lang->upgrade->fromVersions['9_8_2'] = '9.8.2';
$lang->upgrade->fromVersions['9_8_3'] = '9.8.3';
$lang->upgrade->fromVersions['10_0_alpha'] = '10.0.alpha';
$lang->upgrade->fromVersions['10_0_beta'] = '10.0.beta';
$lang->upgrade->fromVersions['10_0'] = '10.0';
+1 -92
View File
@@ -45,95 +45,4 @@ $lang->upgrade->sureExecute = '确认执行';
$lang->upgrade->forbiddenExt = '以下插件与新版本不兼容,已经自动禁用:';
$lang->upgrade->updateFile = '需要更新附件信息。';
$lang->upgrade->fromVersions['0_3beta'] = '0.3 BETA';
$lang->upgrade->fromVersions['0_4beta'] = '0.4 BETA';
$lang->upgrade->fromVersions['0_5beta'] = '0.5 BETA';
$lang->upgrade->fromVersions['0_6beta'] = '0.6 BETA';
$lang->upgrade->fromVersions['1_0beta'] = '1.0 BETA';
$lang->upgrade->fromVersions['1_0rc1'] = '1.0 RC1';
$lang->upgrade->fromVersions['1_0rc2'] = '1.0 RC2';
$lang->upgrade->fromVersions['1_0'] = '1.0 STABLE';
$lang->upgrade->fromVersions['1_0_1'] = '1.0.1';
$lang->upgrade->fromVersions['1_1'] = '1.1';
$lang->upgrade->fromVersions['1_2'] = '1.2';
$lang->upgrade->fromVersions['1_3'] = '1.3';
$lang->upgrade->fromVersions['1_4'] = '1.4';
$lang->upgrade->fromVersions['1_5'] = '1.5';
$lang->upgrade->fromVersions['2_0'] = '2.0';
$lang->upgrade->fromVersions['2_1'] = '2.1';
$lang->upgrade->fromVersions['2_2'] = '2.2';
$lang->upgrade->fromVersions['2_3'] = '2.3';
$lang->upgrade->fromVersions['2_4'] = '2.4';
$lang->upgrade->fromVersions['3_0_beta1'] = '3.0 BETA1';
$lang->upgrade->fromVersions['3_0_beta2'] = '3.0 BETA2';
$lang->upgrade->fromVersions['3_0'] = '3.0 STABLE';
$lang->upgrade->fromVersions['3_1'] = '3.1';
$lang->upgrade->fromVersions['3_2'] = '3.2';
$lang->upgrade->fromVersions['3_2_1'] = '3.2.1';
$lang->upgrade->fromVersions['3_3'] = '3.3';
$lang->upgrade->fromVersions['4_0_beta1'] = '4.0 BETA1';
$lang->upgrade->fromVersions['4_0_beta2'] = '4.0 BETA2';
$lang->upgrade->fromVersions['4_0'] = '4.0';
$lang->upgrade->fromVersions['4_0_1'] = '4.0.1';
$lang->upgrade->fromVersions['4_1'] = '4.1';
$lang->upgrade->fromVersions['4_2_beta'] = '4.2.beta';
$lang->upgrade->fromVersions['4_3_beta'] = '4.3.beta';
$lang->upgrade->fromVersions['5_0_beta1'] = '5.0.beta1';
$lang->upgrade->fromVersions['5_0_beta2'] = '5.0.beta2';
$lang->upgrade->fromVersions['5_0'] = '5.0';
$lang->upgrade->fromVersions['5_1'] = '5.1';
$lang->upgrade->fromVersions['5_2'] = '5.2';
$lang->upgrade->fromVersions['5_2_1'] = '5.2.1';
$lang->upgrade->fromVersions['5_3'] = '5.3';
$lang->upgrade->fromVersions['6_0_beta1'] = '6.0.beta1';
$lang->upgrade->fromVersions['6_0'] = '6.0';
$lang->upgrade->fromVersions['6_1'] = '6.1';
$lang->upgrade->fromVersions['6_2'] = '6.2';
$lang->upgrade->fromVersions['6_3'] = '6.3';
$lang->upgrade->fromVersions['6_4'] = '6.4';
$lang->upgrade->fromVersions['7_0'] = '7.0';
$lang->upgrade->fromVersions['7_1'] = '7.1';
$lang->upgrade->fromVersions['7_2'] = '7.2';
$lang->upgrade->fromVersions['7_2_4'] = '7.2.4';
$lang->upgrade->fromVersions['7_2_5'] = '7.2.5';
$lang->upgrade->fromVersions['7_3'] = '7.3';
$lang->upgrade->fromVersions['7_4_beta'] = '7.4.beta';
$lang->upgrade->fromVersions['8_0'] = '8.0';
$lang->upgrade->fromVersions['8_0_1'] = '8.0.1';
$lang->upgrade->fromVersions['8_1'] = '8.1';
$lang->upgrade->fromVersions['8_1_3'] = '8.1.3';
$lang->upgrade->fromVersions['8_2_beta'] = '8.2.beta';
$lang->upgrade->fromVersions['8_2'] = '8.2';
$lang->upgrade->fromVersions['8_2_1'] = '8.2.1';
$lang->upgrade->fromVersions['8_2_2'] = '8.2.2';
$lang->upgrade->fromVersions['8_2_3'] = '8.2.3';
$lang->upgrade->fromVersions['8_2_4'] = '8.2.4';
$lang->upgrade->fromVersions['8_2_5'] = '8.2.5';
$lang->upgrade->fromVersions['8_2_6'] = '8.2.6';
$lang->upgrade->fromVersions['8_3'] = '8.3';
$lang->upgrade->fromVersions['8_3_1'] = '8.3.1';
$lang->upgrade->fromVersions['8_4'] = '8.4';
$lang->upgrade->fromVersions['8_4_1'] = '8.4.1';
$lang->upgrade->fromVersions['9_0_beta'] = '9.0.beta';
$lang->upgrade->fromVersions['9_0'] = '9.0';
$lang->upgrade->fromVersions['9_0_1'] = '9.0.1';
$lang->upgrade->fromVersions['9_1'] = '9.1';
$lang->upgrade->fromVersions['9_1_1'] = '9.1.1';
$lang->upgrade->fromVersions['9_1_2'] = '9.1.2';
$lang->upgrade->fromVersions['9_2'] = '9.2';
$lang->upgrade->fromVersions['9_2_1'] = '9.2.1';
$lang->upgrade->fromVersions['9_3_beta'] = '9.3.beta';
$lang->upgrade->fromVersions['9_4'] = '9.4';
$lang->upgrade->fromVersions['9_5'] = '9.5';
$lang->upgrade->fromVersions['9_5_1'] = '9.5.1';
$lang->upgrade->fromVersions['9_6'] = '9.6';
$lang->upgrade->fromVersions['9_6_1'] = '9.6.1';
$lang->upgrade->fromVersions['9_6_2'] = '9.6.2';
$lang->upgrade->fromVersions['9_6_3'] = '9.6.3';
$lang->upgrade->fromVersions['9_7'] = '9.7';
$lang->upgrade->fromVersions['9_8'] = '9.8';
$lang->upgrade->fromVersions['9_8_1'] = '9.8.1';
$lang->upgrade->fromVersions['9_8_2'] = '9.8.2';
$lang->upgrade->fromVersions['9_8_3'] = '9.8.3';
$lang->upgrade->fromVersions['10_0_alpha'] = '10.0.alpha';
$lang->upgrade->fromVersions['10_0_beta'] = '10.0.beta';
include dirname(__FILE__) . '/version.php';
+1 -92
View File
@@ -45,95 +45,4 @@ $lang->upgrade->sureExecute = '確認執行';
$lang->upgrade->forbiddenExt = '以下插件與新版本不兼容,已經自動禁用:';
$lang->upgrade->updateFile = '需要更新附件信息。';
$lang->upgrade->fromVersions['0_3beta'] = '0.3 BETA';
$lang->upgrade->fromVersions['0_4beta'] = '0.4 BETA';
$lang->upgrade->fromVersions['0_5beta'] = '0.5 BETA';
$lang->upgrade->fromVersions['0_6beta'] = '0.6 BETA';
$lang->upgrade->fromVersions['1_0beta'] = '1.0 BETA';
$lang->upgrade->fromVersions['1_0rc1'] = '1.0 RC1';
$lang->upgrade->fromVersions['1_0rc2'] = '1.0 RC2';
$lang->upgrade->fromVersions['1_0'] = '1.0 STABLE';
$lang->upgrade->fromVersions['1_0_1'] = '1.0.1';
$lang->upgrade->fromVersions['1_1'] = '1.1';
$lang->upgrade->fromVersions['1_2'] = '1.2';
$lang->upgrade->fromVersions['1_3'] = '1.3';
$lang->upgrade->fromVersions['1_4'] = '1.4';
$lang->upgrade->fromVersions['1_5'] = '1.5';
$lang->upgrade->fromVersions['2_0'] = '2.0';
$lang->upgrade->fromVersions['2_1'] = '2.1';
$lang->upgrade->fromVersions['2_2'] = '2.2';
$lang->upgrade->fromVersions['2_3'] = '2.3';
$lang->upgrade->fromVersions['2_4'] = '2.4';
$lang->upgrade->fromVersions['3_0_beta1'] = '3.0 BETA1';
$lang->upgrade->fromVersions['3_0_beta2'] = '3.0 BETA2';
$lang->upgrade->fromVersions['3_0'] = '3.0 STABLE';
$lang->upgrade->fromVersions['3_1'] = '3.1';
$lang->upgrade->fromVersions['3_2'] = '3.2';
$lang->upgrade->fromVersions['3_2_1'] = '3.2.1';
$lang->upgrade->fromVersions['3_3'] = '3.3';
$lang->upgrade->fromVersions['4_0_beta1'] = '4.0 BETA1';
$lang->upgrade->fromVersions['4_0_beta2'] = '4.0 BETA2';
$lang->upgrade->fromVersions['4_0'] = '4.0';
$lang->upgrade->fromVersions['4_0_1'] = '4.0.1';
$lang->upgrade->fromVersions['4_1'] = '4.1';
$lang->upgrade->fromVersions['4_2_beta'] = '4.2.beta';
$lang->upgrade->fromVersions['4_3_beta'] = '4.3.beta';
$lang->upgrade->fromVersions['5_0_beta1'] = '5.0.beta1';
$lang->upgrade->fromVersions['5_0_beta2'] = '5.0.beta2';
$lang->upgrade->fromVersions['5_0'] = '5.0';
$lang->upgrade->fromVersions['5_1'] = '5.1';
$lang->upgrade->fromVersions['5_2'] = '5.2';
$lang->upgrade->fromVersions['5_2_1'] = '5.2.1';
$lang->upgrade->fromVersions['5_3'] = '5.3';
$lang->upgrade->fromVersions['6_0_beta1'] = '6.0.beta1';
$lang->upgrade->fromVersions['6_0'] = '6.0';
$lang->upgrade->fromVersions['6_1'] = '6.1';
$lang->upgrade->fromVersions['6_2'] = '6.2';
$lang->upgrade->fromVersions['6_3'] = '6.3';
$lang->upgrade->fromVersions['6_4'] = '6.4';
$lang->upgrade->fromVersions['7_0'] = '7.0';
$lang->upgrade->fromVersions['7_1'] = '7.1';
$lang->upgrade->fromVersions['7_2'] = '7.2';
$lang->upgrade->fromVersions['7_2_4'] = '7.2.4';
$lang->upgrade->fromVersions['7_2_5'] = '7.2.5';
$lang->upgrade->fromVersions['7_3'] = '7.3';
$lang->upgrade->fromVersions['7_4_beta'] = '7.4.beta';
$lang->upgrade->fromVersions['8_0'] = '8.0';
$lang->upgrade->fromVersions['8_0_1'] = '8.0.1';
$lang->upgrade->fromVersions['8_1'] = '8.1';
$lang->upgrade->fromVersions['8_1_3'] = '8.1.3';
$lang->upgrade->fromVersions['8_2_beta'] = '8.2.beta';
$lang->upgrade->fromVersions['8_2'] = '8.2';
$lang->upgrade->fromVersions['8_2_1'] = '8.2.1';
$lang->upgrade->fromVersions['8_2_2'] = '8.2.2';
$lang->upgrade->fromVersions['8_2_3'] = '8.2.3';
$lang->upgrade->fromVersions['8_2_4'] = '8.2.4';
$lang->upgrade->fromVersions['8_2_5'] = '8.2.5';
$lang->upgrade->fromVersions['8_2_6'] = '8.2.6';
$lang->upgrade->fromVersions['8_3'] = '8.3';
$lang->upgrade->fromVersions['8_3_1'] = '8.3.1';
$lang->upgrade->fromVersions['8_4'] = '8.4';
$lang->upgrade->fromVersions['8_4_1'] = '8.4.1';
$lang->upgrade->fromVersions['9_0_beta'] = '9.0.beta';
$lang->upgrade->fromVersions['9_0'] = '9.0';
$lang->upgrade->fromVersions['9_0_1'] = '9.0.1';
$lang->upgrade->fromVersions['9_1'] = '9.1';
$lang->upgrade->fromVersions['9_1_1'] = '9.1.1';
$lang->upgrade->fromVersions['9_1_2'] = '9.1.2';
$lang->upgrade->fromVersions['9_2'] = '9.2';
$lang->upgrade->fromVersions['9_2_1'] = '9.2.1';
$lang->upgrade->fromVersions['9_3_beta'] = '9.3.beta';
$lang->upgrade->fromVersions['9_4'] = '9.4';
$lang->upgrade->fromVersions['9_5'] = '9.5';
$lang->upgrade->fromVersions['9_5_1'] = '9.5.1';
$lang->upgrade->fromVersions['9_6'] = '9.6';
$lang->upgrade->fromVersions['9_6_1'] = '9.6.1';
$lang->upgrade->fromVersions['9_6_2'] = '9.6.2';
$lang->upgrade->fromVersions['9_6_3'] = '9.6.3';
$lang->upgrade->fromVersions['9_7'] = '9.7';
$lang->upgrade->fromVersions['9_8'] = '9.8';
$lang->upgrade->fromVersions['9_8_1'] = '9.8.1';
$lang->upgrade->fromVersions['9_8_2'] = '9.8.2';
$lang->upgrade->fromVersions['9_8_3'] = '9.8.3';
$lang->upgrade->fromVersions['10_0_alpha'] = '10.0.alpha';
$lang->upgrade->fromVersions['10_0_beta'] = '10.0.beta';
include dirname(__FILE__) . '/version.php';
+37 -37
View File
@@ -9,42 +9,42 @@
* @version $Id: zh-tw.php 5053 2013-07-06 08:17:37Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
$lang->user->common = '用戶';
$lang->user->id = '用戶編號';
$lang->user->company = '所屬公司';
$lang->user->dept = '所屬部門';
$lang->user->account = '用戶名';
$lang->user->password = '密碼';
$lang->user->password2 = '請重複密碼';
$lang->user->role = '職位';
$lang->user->group = '分組';
$lang->user->realname = '真實姓名';
$lang->user->nickname = '暱稱';
$lang->user->commiter = '原始碼帳號';
$lang->user->birthyear = '出生年';
$lang->user->gender = '性別';
$lang->user->email = '郵箱';
$lang->user->basicInfo = '基本信息';
$lang->user->accountInfo = '帳號信息';
$lang->user->verify = '安全驗證';
$lang->user->contactInfo = '聯繫信息';
$lang->user->skype = 'Skype';
$lang->user->qq = 'QQ';
$lang->user->yahoo = '雅虎通';
$lang->user->gtalk = 'GTalk';
$lang->user->wangwang = '旺旺';
$lang->user->mobile = '手機';
$lang->user->phone = '電話';
$lang->user->address = '通訊地址';
$lang->user->zipcode = '郵編';
$lang->user->join = '入職日期';
$lang->user->visits = '訪問次數';
$lang->user->ip = '最後IP';
$lang->user->last = '最後登錄';
$lang->user->ranzhi = '然之帳號';
$lang->user->ditto = '同上';
$lang->user->common = '用戶';
$lang->user->id = '用戶編號';
$lang->user->company = '所屬公司';
$lang->user->dept = '所屬部門';
$lang->user->account = '用戶名';
$lang->user->password = '密碼';
$lang->user->password2 = '請重複密碼';
$lang->user->role = '職位';
$lang->user->group = '分組';
$lang->user->realname = '真實姓名';
$lang->user->nickname = '暱稱';
$lang->user->commiter = '原始碼帳號';
$lang->user->birthyear = '出生年';
$lang->user->gender = '性別';
$lang->user->email = '郵箱';
$lang->user->basicInfo = '基本信息';
$lang->user->accountInfo = '帳號信息';
$lang->user->verify = '安全驗證';
$lang->user->contactInfo = '聯繫信息';
$lang->user->skype = 'Skype';
$lang->user->qq = 'QQ';
$lang->user->yahoo = '雅虎通';
$lang->user->gtalk = 'GTalk';
$lang->user->wangwang = '旺旺';
$lang->user->mobile = '手機';
$lang->user->phone = '電話';
$lang->user->address = '通訊地址';
$lang->user->zipcode = '郵編';
$lang->user->join = '入職日期';
$lang->user->visits = '訪問次數';
$lang->user->ip = '最後IP';
$lang->user->last = '最後登錄';
$lang->user->ranzhi = '然之帳號';
$lang->user->ditto = '同上';
$lang->user->originalPassword = '原密碼';
$lang->user->verifyPassword = '請輸入你的密碼';
$lang->user->verifyPassword = '您的系統登錄密碼';
$lang->user->resetPassword = '忘記密碼';
$lang->user->index = "用戶視圖首頁";
@@ -134,7 +134,7 @@ $lang->user->placeholder->password1 = '六位以上';
$lang->user->placeholder->role = '職位影響內容和用戶列表的順序。';
$lang->user->placeholder->group = '分組決定用戶的權限列表。';
$lang->user->placeholder->commiter = '版本控制系統(subversion)中的帳號';
$lang->user->placeholder->verify = '需要輸入你的密碼加以驗證';
$lang->user->placeholder->verify = '請輸入您的系統登錄密碼';
$lang->user->placeholder->passwordStrength[1] = '6位以上,包含大小寫字母,數字。';
$lang->user->placeholder->passwordStrength[2] = '10位以上,包含大小寫字母,數字,特殊字元。';
@@ -148,7 +148,7 @@ $lang->user->error->mail = "【ID %s】的郵箱地址不正確";
$lang->user->error->role = "【ID %s】的職位不能為空";
$lang->user->error->reserved = "【ID %s】的用戶名已被系統預留";
$lang->user->error->verifyPassword = "安全驗證密碼錯誤,請輸入你的登錄密碼";
$lang->user->error->verifyPassword = "驗證失敗,請檢查您的系統登錄密碼是否正確";
$lang->user->error->originalPassword = "原密碼不正確";
$lang->user->contacts = new stdclass();
+3 -3
View File
@@ -767,9 +767,9 @@ class userModel extends model
if(!empty($acl['projects'])) $acls['projects'] = !empty($acls['projects']) ? array_merge($acls['projects'], $acl['projects']) : $acl['projects'];
}
if($productAllow && empty($acls['products'])) $acls['products'] = array();
if($projectAllow && empty($acls['projects'])) $acls['projects'] = array();
if($viewAllow && empty($acl['views'])) $acls['views'] = array();
if($productAllow) $acls['products'] = array();
if($projectAllow) $acls['projects'] = array();
if($viewAllow) $acls['views'] = array();
$sql = $this->dao->select('module, method')->from(TABLE_USERGROUP)->alias('t1')->leftJoin(TABLE_GROUPPRIV)->alias('t2')
->on('t1.group = t2.group')
+1
View File
@@ -16,6 +16,7 @@ $lang->webhook->id = 'ID';
$lang->webhook->type = '類型';
$lang->webhook->name = '名稱';
$lang->webhook->url = 'Hook地址';
$lang->webhook->domain = '禪道域名';
$lang->webhook->contentType = '內容類型';
$lang->webhook->sendType = '發送方式';
$lang->webhook->product = "關聯{$lang->productCommon}";
+2 -2
View File
@@ -158,7 +158,7 @@ function setMailto(mailto, contactListID)
{
$('#' + mailto).replaceWith(users);
$('#' + mailto + '_chosen').remove();
$('#' + mailto).chosen(defaultChosenOptions);
$('#' + mailto).chosen();
});
}
@@ -179,7 +179,7 @@ function ajaxGetContacts(obj)
$inputgroup = $(obj).closest('.input-group');
$inputgroup.find('.input-group-btn').remove();
$inputgroup.append(contacts);
$inputgroup.find('select:last').chosen(defaultChosenOptions).fixInputGroup();
$inputgroup.find('select:last').chosen().fixInputGroup();
});
}
+3
View File
@@ -1,5 +1,8 @@
body{padding-bottom:0px;}
#header{padding-top:0px;}
#header #heading{display:none !important;}
#header #navbar{text-align:left !important;}
#main{padding-bottom: 45px;}
.datatable .scroll-wrapper .scroll-slide {bottom:-55px;}
.table-footer.fixed-footer{bottom:0px !important;}
#footer{display:none;}
File diff suppressed because one or more lines are too long