Merge branch 'master' into 'sprint/master_tanghucheng_project'
# Conflicts: # module/programplan/lang/en.php
This commit is contained in:
@@ -39,7 +39,8 @@ class bugsEntry extends entry
|
||||
if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed);
|
||||
if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed);
|
||||
if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs);
|
||||
$bug->status = $status;
|
||||
$bug->status = $status['code'];
|
||||
$bug->statusName = $status['name'];
|
||||
|
||||
$result[$bug->id] = $this->format($bug, 'activatedDate:time,openedBy:user,openedDate:time,assignedTo:user,assignedDate:time,mailto:userList,resolvedBy:user,resolvedDate:time,closedBy:user,closedDate:time,lastEditedBy:user,lastEditedDate:time,deadline:date,deleted:bool');
|
||||
}
|
||||
@@ -53,7 +54,8 @@ class bugsEntry extends entry
|
||||
foreach($storyChangeds as $bugID)
|
||||
{
|
||||
$status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed);
|
||||
$result[$bugID]->status = $status;
|
||||
$result[$bugID]->status = $status['code'];
|
||||
$result[$bugID]->statusName = $status['name'];
|
||||
}
|
||||
|
||||
return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'bugs' => array_values($result)));
|
||||
|
||||
@@ -39,7 +39,8 @@ class executionBugsEntry extends entry
|
||||
if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed);
|
||||
if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed);
|
||||
if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs);
|
||||
$bug->status = $status;
|
||||
$bug->status = $status['code'];
|
||||
$bug->statusName = $status['name'];
|
||||
|
||||
$result[$bug->id] = $this->format($bug, 'activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time,deadline:date,deleted:bool');
|
||||
}
|
||||
@@ -53,7 +54,8 @@ class executionBugsEntry extends entry
|
||||
foreach($storyChangeds as $bugID)
|
||||
{
|
||||
$status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed);
|
||||
$result[$bugID]->status = $status;
|
||||
$result[$bugID]->status = $status['code'];
|
||||
$result[$bugID]->statusName = $status['name'];
|
||||
}
|
||||
|
||||
return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'bugs' => array_values($result)));
|
||||
|
||||
@@ -35,7 +35,7 @@ class executionCasesEntry extends entry
|
||||
$result = array();
|
||||
foreach($cases as $case)
|
||||
{
|
||||
$case->status = array('code' => $case->status, 'name' => $this->lang->testcase->statusList[$case->status]);
|
||||
$case->statusName = 'name' => $this->lang->testcase->statusList[$case->status];
|
||||
$result[] = $this->format($case, 'openedDate:time,reviewedDate:date,lastEditedDate:time,lastRunDate:time');
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,8 @@ class projectBugsEntry extends entry
|
||||
if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed);
|
||||
if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed);
|
||||
if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs);
|
||||
$bug->status = $status;
|
||||
$bug->status = $status['code'];
|
||||
$bug->statusName = $status['name'];
|
||||
|
||||
$result[$bug->id] = $this->format($bug, 'activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time,deadline:date,deleted:bool');
|
||||
}
|
||||
@@ -53,7 +54,8 @@ class projectBugsEntry extends entry
|
||||
foreach($storyChangeds as $bugID)
|
||||
{
|
||||
$status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed);
|
||||
$result[$bugID]->status = $status;
|
||||
$result[$bugID]->status = $status['code'];
|
||||
$result[$bugID]->statusName = $status['name'];
|
||||
}
|
||||
|
||||
return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'bugs' => array_values($result)));
|
||||
|
||||
@@ -38,7 +38,7 @@ class projectCasesEntry extends entry
|
||||
$result = array();
|
||||
foreach($cases as $case)
|
||||
{
|
||||
$case->status = array('code' => $case->status, 'name' => $this->lang->testcase->statusList[$case->status]);
|
||||
$case->statusName = $this->lang->testcase->statusList[$case->status];
|
||||
$result[] = $this->format($case, 'openedDate:time,reviewedDate:date,lastEditedDate:time,lastRunDate:time');
|
||||
}
|
||||
|
||||
|
||||
@@ -221,7 +221,8 @@ class userEntry extends Entry
|
||||
if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed);
|
||||
if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed);
|
||||
if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs);
|
||||
$bug->status = $status;
|
||||
$bug->status = $status['code'];
|
||||
$bug->statusName = $status['name'];
|
||||
|
||||
$bugs[$bug->id] = $bug;
|
||||
}
|
||||
@@ -235,7 +236,8 @@ class userEntry extends Entry
|
||||
foreach($storyChangeds as $bugID)
|
||||
{
|
||||
$status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed);
|
||||
$bugs[$bugID]->status = $status;
|
||||
$bugs[$bugID]->status = $status['code'];
|
||||
$bugs[$bugID]->statusName = $status['name'];
|
||||
}
|
||||
|
||||
$info->bug['total'] = $data->data->pager->recTotal;
|
||||
@@ -271,7 +273,7 @@ class userEntry extends Entry
|
||||
$stories = array();
|
||||
foreach($data->data->stories as $story)
|
||||
{
|
||||
$story->status = array('code' => $story->status, 'name' => $this->lang->story->statusList[$story->status]);
|
||||
$story->statusName = $this->lang->story->statusList[$story->status];
|
||||
$stories[$story->id] = $story;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
|
||||
if(!function_exists('getWebRoot')){function getWebRoot(){}}
|
||||
|
||||
/* 基本设置。Basic settings. */
|
||||
$config->version = '15.8'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
|
||||
$config->version = '16.0.beta1'; // 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.
|
||||
|
||||
+1
-1
@@ -653,7 +653,7 @@ CREATE TABLE IF NOT EXISTS `zt_kanbanlane` (
|
||||
`name` varchar(255) NOT NULL DEFAULT '',
|
||||
`color` char(30) NOT NULL,
|
||||
`order` smallint(6) NOT NULL DEFAULT '0',
|
||||
`lastEditedDate` datetime NOT NULL,
|
||||
`lastEditedTime` datetime NOT NULL,
|
||||
`deleted` enum('0','1') NOT NULL default '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
+183
-67
@@ -1,73 +1,189 @@
|
||||
2021-11-19 15.8
|
||||
2021-12-06 16.0.beat1
|
||||
完成的需求
|
||||
28965 实现分支的新增/编辑操作
|
||||
28941 重新登陆系统后产品下拉菜单应当保持上次选中的产品名称
|
||||
28932 实现分支的批量操作
|
||||
28931 调整分支管理功能
|
||||
28904 优化项目列表“我参与的”筛选结果
|
||||
28833 创建执行页面可以直接维护相关负责人信息
|
||||
28819 调整项目集/产品/项目/执行重名规则
|
||||
28510 项目列表中增加项目代号字段显示
|
||||
28509 项目概况中增加项目代号的显示
|
||||
28466 测试Bug列表中增加按所属项目的搜索条件
|
||||
28138 员工负载表中增加项目名称信息
|
||||
28131 待处理任务列表中子任务名称前显示父任务
|
||||
28098 需求批量转任务时对已经转换过任务的需求进行提示
|
||||
25673 分支增加排序功能
|
||||
25670 多分支产品浏览需求的时候将所有和主干区分开
|
||||
25667 将所有分支概念改为主干并处理历史数据
|
||||
25666 可以将某一个分支关闭
|
||||
25665 梳理项目和执行关联产品分支的逻辑
|
||||
15478 我的地盘bug列表增加确认字段
|
||||
14877 根据分支提示上次版本计划名称
|
||||
14778 分支设置默认分支功能
|
||||
14772 需求修改所属分支时如果有冲突给出提示
|
||||
14771 启用多分支功能后增加分支字样显示的控制
|
||||
14761 选择某一个分支之后点击其他菜单希望能够保持分支下拉菜单状态
|
||||
14005 能够按照平台分支浏览用户需求
|
||||
29147 产品下软件需求列表需求名称前显示主干的分支名
|
||||
29145 项目和执行关联了产品的多个分支及计划时调整概况页面显示方式
|
||||
29144 所有分支下批量编辑需求/BUG/用例,所属模块数据默认为所有分支的模块时,需要处理分支与模块不一致的问题
|
||||
29143 批量创建需求/BUG/用例时所属模块选择同上,需要检测上一行数据的所属分支和当前行的所属分支是否一致
|
||||
29142 启用多分支功能后要Bug增加分支字样显示的控制
|
||||
29141 启用多分支功能后要用例增加分支字样显示的控制
|
||||
29059 多分支产品批量创建需求时分支字段设为默认项
|
||||
28974 产品列表批量调整计划时在计划名称前显示分支信息
|
||||
28973 提交Bug时分支与影响版本要跟着联动
|
||||
28972 产品列表左侧的模块设置调整为显示设置
|
||||
28310 未开始的项目集有项目开始的时候自动将项目集状态设置为开始
|
||||
28309 未开始的项目有执行开始的时候自动将项目状态设置为开始
|
||||
28308 未开始的执行有任务开始的时候自动将执行状态设置为开始
|
||||
14005 能够按照平台分支浏览用户需求
|
||||
14429 父需求支持变更
|
||||
14761 选择某一个分支之后点击其他菜单希望能够保持分支下拉菜单状态
|
||||
14771 启用多分支功能后增加分支字样显示的控制
|
||||
14772 需求修改所属分支时如果有冲突给出提示
|
||||
14778 分支设置默认分支功能
|
||||
14877 根据分支提示上次版本计划名称
|
||||
15134 员工负载表增加备注说明
|
||||
15470 看板可以设置一个单元格里面卡片的排列方式
|
||||
15478 我的地盘bug列表增加确认字段
|
||||
25665 梳理项目和执行关联产品分支的逻辑
|
||||
25666 可以将某一个分支关闭
|
||||
25667 将所有分支概念改为主干并处理历史数据
|
||||
25670 多分支产品浏览需求的时候将所有和主干区分开
|
||||
25673 分支增加排序功能
|
||||
27484 文档库右侧目录增加文件的浮动操作菜单
|
||||
27485 文档库右侧目录增加目录的浮动操作菜单
|
||||
27486 wiki目录中,当鼠标悬浮到文章名称时展示文章快捷操作
|
||||
27487 wiki目录中,鼠标悬浮到具体章节时展示章节的快捷操作
|
||||
27927 执行看板默认只显示一屏滚动时再往下加载
|
||||
28098 需求批量转任务时对已经转换过任务的需求进行提示
|
||||
28131 待处理任务列表中子任务名称前显示父任务
|
||||
28138 员工负载表中增加项目名称信息
|
||||
28147 统计列表中具备横向滚动条的列表可以直接展示出来
|
||||
28153 Bug创建表中优化执行查询条件
|
||||
28235 关闭项目时增加实际完成日期的记录
|
||||
28236 项目工时统计中增加实际开始和实际完成的信息
|
||||
28237 执行启动时增加实际开始日期的记录
|
||||
28238 关闭执行时增加实际完成日期的记录
|
||||
28239 执行工时统计中增加实际开始和实际完成的信息
|
||||
28310 未开始的项目
|
||||
28466 测试Bug列表中增加按所属项目的搜索条件
|
||||
28509 项目概况中增加项目代号的显示
|
||||
28510 项目列表中增加项目代号字段显示
|
||||
28719 项目看板中看板列显示数量汇总
|
||||
28727 计划创建迭代时选择项目点击下一步后自动关闭选择弹窗
|
||||
28809 执行看板中进行中项目排序规则调整
|
||||
28810 执行看板中已关闭的执行只展示最近2期数据
|
||||
28811 执行看板中执行支持拖动调整看板列和状态
|
||||
28811 执行看板中执行支持拖动调整看板列和状态
|
||||
28812 项目看板中调整项目集和项目的排序规则
|
||||
28813 项目看板中已关闭的项目只展示最近2个数据
|
||||
28814 项目看板中项目支持拖动调整看板列和状态
|
||||
28814 项目看板中项目支持拖动调整看板列和状态
|
||||
28815 产品看板中看板列显示数量汇总
|
||||
28816 产品看板中调整项目集和产品的排序规则
|
||||
28817 项目集看板中调整项目集和产品的排序规则
|
||||
28818 项目集看板中看板列显示数量汇总
|
||||
28819 调整项目集/产品/项目/执行重名规则
|
||||
28833 创建执行页面可以直接维护相关负责人信息
|
||||
28834 项目的分组权限中移除无用的模块和方法
|
||||
28835 关联多个产品的项目也可以选择归并方式
|
||||
28904 优化项目列表“我参与的”筛选结果 结
|
||||
28928 可以设置哪些人不需要提醒
|
||||
28929 编辑bug修改状态时如果未修改成功希望有错误提示
|
||||
28931 调整分支管理功能
|
||||
28932 实现分支的批量操作
|
||||
28941 重新登陆系统后产品下拉菜单应当保持上次选中的产品名称
|
||||
28944 在开源版中增加瀑布模型的相关功能
|
||||
28959 老版本升级新版本数据归并的时候,可以修改项目、执行名称。
|
||||
28960 调整产品列表页面的宽度展示比例
|
||||
28965 实现分支的新增/编辑操作
|
||||
28970 需求列表批量选中希望可以通过shift快捷键操作
|
||||
28972 产品列表左侧的模块设置调整为显示设置
|
||||
28973 提交Bug时分支与影响版本要跟着联动
|
||||
28974 产品列表批量调整计划时在计划名称前显示分支信息
|
||||
28993 创建或者编辑用例时调整所属需求的查询逻辑
|
||||
29000 产品列表中调整字段显示宽度
|
||||
29002 动态支持按正序/倒序切换排序
|
||||
29030 已挂起的项目/执行下面的任务不在待办/待处理的任务中展示
|
||||
29059 多分支产品批量创建需求时分支字段设为默认项
|
||||
29069 组织团队成员任务列表增加优先级排序功能
|
||||
29074 用户下拉菜单中增加人员的头像/部门/职位信息
|
||||
29108 提交/编辑软件需求页面中增加反馈者和通知邮箱信息
|
||||
29109 提交/编辑Bug页面中增加反馈者和通知邮箱信息
|
||||
29116 创建/编辑发布信息的通知人员中增加反馈者
|
||||
29127 计划的Bug列表中增加批量编辑和调整计划功能
|
||||
29131 产品概况中增加评审人员的设置
|
||||
29134 看板页面的刷新不要抖动用更加平滑的方式呈现
|
||||
29141 启用多分支功能后要用例增加分支字样显示的控制
|
||||
29142 启用多分支功能后要Bug增加分支字样显示的控制
|
||||
29143 批量创建需求/BUG/用例时所属模块选择同上,需要检测上一行数据的所属分支和当前行的所属分支是否一致
|
||||
29144 所有分支下批量编辑需求/BUG/用例,所属模块数据默认为所有分支的模块时,需要处理分支与模块不一致的问题
|
||||
29145 项目和执行关联了产品的多个分支及计划时调整概况页面显示方式
|
||||
29147 产品下软件需求列表需求名称前显示主干的分支名
|
||||
29156 启用多分支功能后项目需求列表增加是否显示分支名
|
||||
29157 启用多分支功能后执行需求列表增加是否显示分支名
|
||||
29158 启用多分支功能后执行任务列表增加是否显示分支名
|
||||
29166 需求调整分支时,需求所属模块为主干的不用清空所属模块
|
||||
29167 Bug调整分支时所属模块为主干的不用清空所属模块
|
||||
29168 用例调整分支时所属模块为主干的不用清空所属模块
|
||||
29173 项目关联产品计划时不允许关联父计划
|
||||
29174 执行关联产品计划时不允许关联父计划
|
||||
29182 分支下拉菜单中显示已关闭的分支状态
|
||||
29192 归并数据遇到重名数据时可修改重名的数据
|
||||
29193 调整发布中消息通知的触发方式
|
||||
29218 分支的状态全部为关闭时才能调整产品类型为正常
|
||||
29234 梳理分支逻辑
|
||||
29438 在执行1下创建测试用例在执行2用例列表中也能看到
|
||||
修复的BUG
|
||||
15826 后台评审流程开启后产品中批量创建研发需求没有默认需要评审
|
||||
15798 报告导出之后不展示饼状图
|
||||
15780 更改项目集的父项目集时,下面的产品线不能变更到顶层项目集
|
||||
15695 建用例,有默认所属模块可选择所有需求
|
||||
15694 执行下创建用例,可以选择产品所有的模块和需求
|
||||
15693 卡片展示项目时,项目状态显示不正确
|
||||
15691 套件的用例列表右上角的操作按钮样式不一致
|
||||
15690 切换产品后,新建用例未显示在用例列表中
|
||||
15689 测试单的报表百分比换行
|
||||
15688 新建用例,模块和需求对应错误
|
||||
15687 自定义任务优先级展示问题
|
||||
15686 创建项目填充数据后,再选择项目集数据被清空
|
||||
15665 维护目录和版本管理前的icon图标一样
|
||||
12023 产品下分支页面建议优化
|
||||
11290 邮件列表中主题字段内容部分遮挡
|
||||
16302 项目软件需求下搜索下拉列中所属分支显示为%s
|
||||
16257 创建执行的时候已经关闭的项目仍然可以选择
|
||||
16139 设为分支为默认分支icon没有显示完全
|
||||
16130 项目下创建测试用例时相关需求列出的数据不对
|
||||
16018 项目-测试-BUG界面提交BUG不显示多分支/平台
|
||||
16000 执行测试用例下用例标题换行显示
|
||||
15828 项目集列表中删除顶级项目,跳转错误
|
||||
15781 项目创建版本时选择不到产品分支
|
||||
15675 版本下解决又激活的bug,重新解决的时候,应该带有之前版本信息
|
||||
14101 青春蓝-引导页国际版配图为中文
|
||||
13756 提bug页面没有正常显示所属产品分支的控件
|
||||
6978 多分支产品bug搜索影响版本不太清晰
|
||||
6917 用例转bug编号会变化
|
||||
|
||||
6978 多分支产品bug搜索影响版本不太清晰
|
||||
11290 邮件列表中主题字段内容部分遮挡
|
||||
12023 产品下分支页面建议优化
|
||||
13756 提bug页面没有正常显示所属产品分支的控件
|
||||
14101 青春蓝-引导页国际版配图为中文
|
||||
15665 维护目录和版本管理前的icon图标一样
|
||||
15675 版本下解决又激活的bug,重新解决的时候,应该带有之前版本信息
|
||||
15675 版本下解决又激活的bug,重新解决的时候,应该带有之前版本信息
|
||||
15686 创建项目填充数据后,再选择项目集数据被清空
|
||||
15687 自定义任务优先级展示问题
|
||||
15688 新建用例,模块和需求对应错误
|
||||
15689 测试单的报表百分比换行
|
||||
15690 切换产品后,新建用例未显示在用例列表中
|
||||
15691 套件的用例列表右上角的操作按钮样式不一致
|
||||
15693 卡片展示项目时,项目状态显示不正确
|
||||
15694 执行下创建用例,可以选择产品所有的模块和需求
|
||||
15695 建用例,有默认所属模块可选择所有需求
|
||||
15737 统计视图无法通过权限控制取消
|
||||
15780 更改项目集的父项目集时,下面的产品线不能变更到顶层项目集
|
||||
15781 项目创建版本时选择不到产品分支
|
||||
15798 报告导出之后不展示饼状图
|
||||
15826 后台评审流程开启后产品中批量创建研发需求没有默认需要评审
|
||||
15828 项目集列表中删除顶级项目,跳转错误
|
||||
16000 执行测试用例下用例标题换行显示
|
||||
16018 项目-测试-BUG界面提交BUG不显示多分支/平台
|
||||
16130 项目下创建测试用例时相关需求列出的数据不对
|
||||
16139 设为分支为默认分支icon没有显示完全
|
||||
16257 创建执行的时候已经关闭的项目仍然可以选择
|
||||
16302 项目软件需求下搜索下拉列中所属分支显示为%s
|
||||
16527 批量编辑用例时,列出了所有分支
|
||||
16567 多分支产品的任务名称前主干分支名称显示其他分支名称不显示
|
||||
16570 经典模式多分支产品批量提bug时标题未填写点击保存没做提示
|
||||
16573 经典模式多分支产品批量创建用例未填写用例标题保存直接跳转列表没做提示
|
||||
16574 关联产品页面已关联产品可以下拉选择其他未关联的分支
|
||||
16582 分支1版本可以关联其他分支需求
|
||||
16583 批量编辑测试用例分支显示错误导致无法选择模块
|
||||
16584 执行版本不能按照所属分支搜索
|
||||
16585 主干版本前未显示主干标识
|
||||
16587 需求编辑页面所处阶段处分支展示方式建议优化
|
||||
16588 项目/执行下显示了未关联的分支需求
|
||||
16589 多分支产品测试用例列表用例类型展示有遮挡
|
||||
16591 批量编辑研发需求修改分支后再修改回去计划没有随之联动
|
||||
16592 多分支产品项目的研发需求模块展示不对
|
||||
16593 测试下Bug页面中左侧模块树默认高亮了主干
|
||||
16603 项目列表中项目名称显示不全
|
||||
16605 项目的用例下显示了所有的分支
|
||||
16608 编辑模块页面选择分支后上级模块列出的还是主干模块
|
||||
16609 导出用例的模板显示了所有分支
|
||||
16612 用例模板没显示分支下的模块
|
||||
16616 导入用例分支下拉列表显示了所有分支
|
||||
16620 研发需求变动列表一条用例显示多次
|
||||
16621 搜索用例时,所属分支列出了所有分支
|
||||
16622 产品下研发需求页搜索的所属模块下拉只列出了主干下的模块
|
||||
16623 多分支产品关闭的分支在项目关联产品的时候仍然显示
|
||||
16624 产品详情页中左上角产品下拉菜单中无当前产品选项
|
||||
16626 测试套件中不显示其他分支模块只显示主干模块
|
||||
16631 套件的用例名称前不显示主干
|
||||
16637 测试单关联用例列表,用例列表显示分支标识
|
||||
16639 测试用例详情页指派给用户显示数字
|
||||
16640 测试单的优先级显示为0
|
||||
16641 地盘待处理下用例批量编辑页面相关研发需求未带出
|
||||
16643 地盘下批量编辑任务页面“贡献”菜单位置显示不对
|
||||
16645 创建Gitlab动态没有链接地址
|
||||
16646 文档的产品库中产品显示错误
|
||||
16647 测试单生成报告提示没有关联的非Trunk测试单
|
||||
16648 项目列表中项目名称完全折叠隐藏
|
||||
16650 多分支产品测试套件详情所属模块只展示主干模块
|
||||
16653 发布可以关联所有分支的需求
|
||||
16676 地盘待处理下批量执行用例页面有代码报错
|
||||
16680 产品库创建文档时所属文档库下拉无法选择其他产品库
|
||||
16681 导入用例库测试用例分支和模块不对应
|
||||
16682 地盘贡献下复制用例页面有代码报错
|
||||
16683 测试单关联测试用例不能选择主干
|
||||
16684 套件中用例标题的主干分支不显示
|
||||
16685 测试单关联测试用例分支=空搜索到的数据为主干的测试用例
|
||||
16689 测试单用例列表不显示测试用例相关模块
|
||||
16690 产品下需求批量编辑页面计划显示不对
|
||||
16692 项目下软件需求批量编辑页面分支显示不对
|
||||
16694 提交测试的测试单不应该受左上角选择分支影响
|
||||
16697 测试单关联测试用例选择所属分支应该只能选择版本关联的分支
|
||||
16700 项目创建发布选择版本后产品分支会消失
|
||||
16708 批量编辑多分支产品的研发需求报错
|
||||
16713 产品需求模块中主干模块直接显示不用增加层级
|
||||
2021-11-02 15.7.1
|
||||
修复的BUG
|
||||
15835 创建产品选择产品线选中样式不对
|
||||
|
||||
+23
-12
@@ -9,18 +9,29 @@
|
||||
* @version $Id: de.php 4729 2013-05-03 07:53:55Z chencongzhi520@gmail.com $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
$lang->action->common = 'Log';
|
||||
$lang->action->product = $lang->productCommon;
|
||||
$lang->action->project = 'Project';
|
||||
$lang->action->execution = $lang->execution->common;
|
||||
$lang->action->objectType = 'Object Type';
|
||||
$lang->action->objectID = 'ID';
|
||||
$lang->action->objectName = 'Objekt Name';
|
||||
$lang->action->actor = 'Handler';
|
||||
$lang->action->action = 'Aktion';
|
||||
$lang->action->actionID = 'Aktion ID';
|
||||
$lang->action->date = 'Datum';
|
||||
$lang->action->extra = 'Wertschöpfung';
|
||||
global $config;
|
||||
|
||||
$lang->action->common = 'Log';
|
||||
$lang->action->id = 'ID';
|
||||
$lang->action->product = $lang->productCommon;
|
||||
$lang->action->project = 'Project';
|
||||
$lang->action->execution = $lang->execution->common;
|
||||
$lang->action->objectType = 'Object Type';
|
||||
$lang->action->objectID = 'ID';
|
||||
$lang->action->objectName = 'Objekt Name';
|
||||
$lang->action->actor = 'Handler';
|
||||
$lang->action->action = 'Aktion';
|
||||
$lang->action->actionID = 'Aktion ID';
|
||||
$lang->action->date = 'Datum';
|
||||
$lang->action->extra = 'Wertschöpfung';
|
||||
$lang->action->system = 'System';
|
||||
$lang->action->url = 'URL';
|
||||
$lang->action->contentType = 'Content Type';
|
||||
$lang->action->data = 'Data';
|
||||
$lang->action->result = 'Result';
|
||||
$lang->action->modified = 'Modified';
|
||||
$lang->action->old = 'Old';
|
||||
$lang->action->new = 'New';
|
||||
|
||||
$lang->action->trash = 'Aufräumen';
|
||||
$lang->action->undelete = 'Wiederherstellen';
|
||||
|
||||
@@ -29,6 +29,9 @@ $lang->action->url = 'URL';
|
||||
$lang->action->contentType = 'Content Type';
|
||||
$lang->action->data = 'Data';
|
||||
$lang->action->result = 'Result';
|
||||
$lang->action->modified = 'Modified';
|
||||
$lang->action->old = 'Old';
|
||||
$lang->action->new = 'New';
|
||||
|
||||
$lang->action->trash = 'Recycle';
|
||||
$lang->action->undelete = 'Restore';
|
||||
@@ -295,6 +298,8 @@ $lang->action->label->startProgram = '(The start of the project sets th
|
||||
$lang->action->label->createmr = 'Merge Request Linked';
|
||||
$lang->action->label->deletemr = 'Merge Request Unlinked';
|
||||
$lang->action->label->mergedmr = 'Merge Request Merged';
|
||||
$lang->action->label->compilepass = 'Compile Success';
|
||||
$lang->action->label->compilefail = 'Compile Fail';
|
||||
$lang->action->label->reopen = 'Reopen';
|
||||
$lang->action->label->approve = 'Passed';
|
||||
$lang->action->label->reject = 'Rejected';
|
||||
|
||||
@@ -13,11 +13,11 @@ foreach($branches as $branchID => $branch)
|
||||
|
||||
if($branchID == 'all' or empty($branchID) or $statusList[$branchID] == 'active')
|
||||
{
|
||||
$activeBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}'");
|
||||
$activeBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}' data-app='{$this->app->tab}'");
|
||||
}
|
||||
else
|
||||
{
|
||||
$closedBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}'");
|
||||
$closedBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}' data-app='{$this->app->tab}'");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -186,6 +186,7 @@ $lang->bug->legendComment = 'Note';
|
||||
$lang->bug->legendLife = 'Bug Life';
|
||||
$lang->bug->legendMisc = 'Misc.';
|
||||
$lang->bug->legendRelated = 'Related Info';
|
||||
$lang->bug->legendThisWeekCreated = 'This Week Created';
|
||||
|
||||
/* Button. */
|
||||
$lang->bug->buttonConfirm = 'Confirm';
|
||||
@@ -280,6 +281,7 @@ $lang->bug->statusList['active'] = 'Active';
|
||||
$lang->bug->statusList['resolved'] = 'Resolved';
|
||||
$lang->bug->statusList['closed'] = 'Closed';
|
||||
|
||||
$lang->bug->confirmedList[''] = '';
|
||||
$lang->bug->confirmedList[1] = 'Yes';
|
||||
$lang->bug->confirmedList[0] = 'No';
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
<div class='main-header'>
|
||||
<h2>
|
||||
<?php echo $lang->bug->batchCreate;?>
|
||||
<?php if($this->session->currentProductType !== 'normal' and $branch !== 'all') echo '<span class="label label-info">' . $branches[$branch] . '</span>';?>
|
||||
</h2>
|
||||
<div class="pull-right btn-toolbar">
|
||||
<?php if(common::hasPriv('file', 'uploadImages')) echo html::a($this->createLink('file', 'uploadImages', 'module=bug¶ms=' . helper::safe64Encode("productID=$productID&executionID=$executionID&moduleID=$moduleID")), $lang->uploadImages, '', "data-toggle='modal' data-type='iframe' class='btn btn-primary' data-width='70%'")?>
|
||||
|
||||
@@ -78,15 +78,15 @@ class buildModel extends model
|
||||
/**
|
||||
* Get builds of a project in pairs.
|
||||
*
|
||||
* @param int $projectID
|
||||
* @param int $productID
|
||||
* @param int $branch
|
||||
* @param string $params noempty|notrunk, can be a set of them
|
||||
* @param int $buildID
|
||||
* @param int $projectID
|
||||
* @param int $productID
|
||||
* @param int|string $branch
|
||||
* @param string $params noempty|notrunk|nodone|noterminate, can be a set of them
|
||||
* @param int $buildID
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProjectBuildPairs($projectID, $productID, $branch = 0, $params = '', $buildID = 0)
|
||||
public function getProjectBuildPairs($projectID, $productID, $branch = 'all', $params = '', $buildID = 0)
|
||||
{
|
||||
$sysBuilds = array();
|
||||
$selectedBuilds = array();
|
||||
@@ -100,7 +100,7 @@ class buildModel extends model
|
||||
->leftJoin(TABLE_BRANCH)->alias('t4')->on('t1.branch = t4.id')
|
||||
->where('t1.project')->eq((int)$projectID)
|
||||
->beginIF($productID)->andWhere('t1.product')->eq((int)$productID)->fi()
|
||||
->beginIF($branch)->andWhere('t1.branch')->in("0,$branch")->fi()
|
||||
->beginIF($branch !== 'all')->andWhere('t1.branch')->eq($branch)->fi()
|
||||
->andWhere('t1.deleted')->eq(0)
|
||||
->orderBy('t1.date desc, t1.id desc')->fetchAll('id');
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
#steps .btn-group .btn {padding-left: 0; padding-right: 0; min-width: 30px;}
|
||||
.step-actions {width: 100px;}
|
||||
#steps .active td {transition: background-color .5s;}
|
||||
#steps .step-group .step-steps {resize: none; max-height: 30px;}
|
||||
#steps .step-group .step-expects {display: none;}
|
||||
#steps .step-steps {resize: none; max-height: 30px;}
|
||||
#steps .step-expects {display: none;}
|
||||
#steps .step-item .step-item-id {display: table-cell; min-width: 40px;}
|
||||
#steps .step-item .step-id {color: transparent;}
|
||||
#steps .step-group .step-id {font-weight: bold;}
|
||||
#steps .step-id {font-weight: bold;}
|
||||
#steps .step-actions {width: 90px; text-align: center;}
|
||||
|
||||
#steps .btn-step-move {cursor: move;}
|
||||
@@ -19,7 +19,6 @@
|
||||
#steps.sortable-sorting > tr.drag-row + tr > td {box-shadow: inset 0 4px 2px rgba(0,0,0,.2);}
|
||||
#steps.sortable-sorting > tr.drag-row > td {background-color: #edf3fe !important;}
|
||||
#steps.sortable > tr.drop-success > td {background-color: #cfe0ff; transition: background-color 2s;}
|
||||
#steps .step-type-toggle {padding: 0;}
|
||||
#steps .step-type-menu-box {position: relative;}
|
||||
#steps .step-type-menu {position: absolute; top: 25px; right: 0; z-index: 10; box-shadow: 0 6px 12px rgba(0,0,0,.175); background-color: #fff; display: none; border: 1px solid #bbb; min-width: 60px;}
|
||||
#steps .step-step[data-type="item"] .step-type-menu > a[data-value="item"] {display: none;}
|
||||
|
||||
@@ -19,64 +19,70 @@ function loadLibModules(libID)
|
||||
*/
|
||||
function initSteps(selector)
|
||||
{
|
||||
/* Auto adjust textarea height. */
|
||||
$('textarea.autosize').each(function()
|
||||
{
|
||||
$.autoResizeTextarea(this);
|
||||
});
|
||||
|
||||
var $steps = $(selector || '#steps');
|
||||
var $stepTemplate = $('#stepTemplate').detach().removeClass('template').attr('id', null);
|
||||
var initSortableCallTask = null;
|
||||
var groupNameText = $steps.data('groupName');
|
||||
var insertStepRow = function($row, count, type)
|
||||
var insertStepRow = function($row, count, type, notFocus)
|
||||
{
|
||||
if(count === undefined) count = 1;
|
||||
var $step;
|
||||
for(var i = 0; i < count; ++i)
|
||||
{
|
||||
var $step = $stepTemplate.clone();
|
||||
$step = $stepTemplate.clone();
|
||||
if($row) $row.after($step);
|
||||
else $steps.append($step);
|
||||
if(!$row) $steps.append($step);
|
||||
$step.addClass('step-new');
|
||||
setTimeout(function(){$step.find('.step-steps').focus();}, 10);
|
||||
if(type) $step.find('.step-type').val(type);
|
||||
}
|
||||
if(!notFocus && $step) setTimeout(function(){$step.find('.step-steps').focus();}, 10);
|
||||
};
|
||||
var updateStepType = function($step, type)
|
||||
{
|
||||
var targetIsGroup = type =='group';
|
||||
$step.attr('data-type', type).find('.step-steps').toggleClass('autosize', !targetIsGroup).attr('placeholder', targetIsGroup ? groupNameText : null).focus();
|
||||
|
||||
var displayType = (type =='item' && $step.hasClass('step-step')) ? 'step' : type;
|
||||
|
||||
var activeTypeText = $step.find('.step-type-menu > a').removeClass('active').filter('[data-value="' + displayType + '"]').addClass('active').text();
|
||||
$step.find('.step-type-current > span').text(activeTypeText);
|
||||
$step.attr('data-type', type).find('.step-steps').addClass('autosize').attr('placeholder', targetIsGroup ? groupNameText : null);
|
||||
};
|
||||
var refreshSteps = function()
|
||||
var getStepsElements = function()
|
||||
{
|
||||
return $steps.children('.step:not(.drag-shadow)');
|
||||
};
|
||||
var refreshSteps = function(skipAutoAddStep)
|
||||
{
|
||||
var parentId = 1, childId = 0;
|
||||
$steps.children('.step:not(.drag-shadow)').each(function(idx)
|
||||
getStepsElements().each(function(idx)
|
||||
{
|
||||
var $step = $(this);
|
||||
var $step = $(this).attr('data-index', idx + 1);
|
||||
var type = $step.find('.step-type').val();
|
||||
var stepID;
|
||||
if(type == 'group')
|
||||
{
|
||||
$step.removeClass('step-item step-step').addClass('step-group');
|
||||
$step.removeClass('step-item').removeClass('step-step').addClass('step-group');
|
||||
stepID = parentId++;
|
||||
$step.find('.step-id').text(stepID);
|
||||
childId = 1;
|
||||
}
|
||||
else if(type == 'step')
|
||||
{
|
||||
$step.removeClass('step-item step-group').addClass('step-step');
|
||||
$step.removeClass('step-item').removeClass('step-group').addClass('step-step');
|
||||
stepID = parentId++;
|
||||
$step.find('.step-id').text(stepID);
|
||||
childId = 0;
|
||||
}
|
||||
else
|
||||
else // step type is not set
|
||||
{
|
||||
if(childId) // as child
|
||||
if(childId) // type as child
|
||||
{
|
||||
stepID = (parentId - 1) + '.' + (childId++);
|
||||
$step.removeClass('step-step step-group').addClass('step-item').find('.step-item-id').text(stepID);
|
||||
$step.removeClass('step-step').removeClass('step-group').addClass('step-item').find('.step-item-id').text(stepID);
|
||||
}
|
||||
else
|
||||
else // type as step
|
||||
{
|
||||
$step.removeClass('step-item step-group').addClass('step-step');
|
||||
$step.removeClass('step-item').removeClass('step-group').addClass('step-step');
|
||||
stepID = parentId++;
|
||||
$step.find('.step-id').text(stepID);
|
||||
}
|
||||
@@ -87,6 +93,25 @@ function initSteps(selector)
|
||||
|
||||
updateStepType($step, type);
|
||||
});
|
||||
|
||||
/* Auto insert step to group without any steps */
|
||||
if(!skipAutoAddStep)
|
||||
{
|
||||
var needRefresh = false;
|
||||
getStepsElements().each(function(idx)
|
||||
{
|
||||
var $step = $(this).attr('data-index', idx + 1);
|
||||
if($step.attr('data-type') !== 'group') return;
|
||||
var $nextStep = $step.next('.step:not(.drag-shadow)');
|
||||
if(!$nextStep.length || $nextStep.attr('data-type') !== 'item')
|
||||
{
|
||||
insertStepRow($step, 1, 'item', true);
|
||||
needRefresh = true;
|
||||
}
|
||||
});
|
||||
|
||||
if(needRefresh) refreshSteps(true);
|
||||
}
|
||||
};
|
||||
var initSortable = function()
|
||||
{
|
||||
@@ -110,7 +135,7 @@ function initSteps(selector)
|
||||
{
|
||||
if(!isMouseDown) return;
|
||||
var $targetStep = $(this);
|
||||
$steps.children('.step').each(function(idx)
|
||||
getStepsElements().each(function(idx)
|
||||
{
|
||||
$(this).data('order', idx);
|
||||
});
|
||||
@@ -133,14 +158,47 @@ function initSteps(selector)
|
||||
refreshSteps();
|
||||
}).on('click', '.btn-step-delete', function()
|
||||
{
|
||||
if($('tbody#steps tr.step').size() == 1) return false;
|
||||
if($steps.children('.step').length == 1) return;
|
||||
$(this).closest('.step').remove();
|
||||
refreshSteps();
|
||||
}).on('click', '.step-type-menu a', function()
|
||||
}).on('change', '.step-group-toggle', function()
|
||||
{
|
||||
var $a = $(this);
|
||||
$a.closest('.step').find('.step-type').val($a.data('value'));
|
||||
var $checkbox = $(this);
|
||||
var $step = $checkbox.closest('.step');
|
||||
var isChecked = $checkbox.is(':checked');
|
||||
var suggestType = isChecked ? 'group' : 'item';
|
||||
if(!isChecked)
|
||||
{
|
||||
var $prevStep = $step.prev('.step:not(.drag-shadow)');
|
||||
var suggestChild = $prevStep.length && $prevStep.is('.step-group') && $step.next('.step:not(.drag-shadow)').length;
|
||||
suggestType = suggestChild ? 'item' : 'step';
|
||||
}
|
||||
$step.find('.step-type').val(suggestType);
|
||||
|
||||
/* Auto insert step to group without any steps */
|
||||
if(suggestType === 'group')
|
||||
{
|
||||
var $nextStep = $step.next('.step:not(.drag-shadow)');
|
||||
if(!$nextStep.length || $nextStep.find('.step-type').val() !== 'item')
|
||||
{
|
||||
insertStepRow($step, 1, 'item', true);
|
||||
}
|
||||
}
|
||||
|
||||
refreshSteps();
|
||||
}).on('change', '.form-control', function()
|
||||
{
|
||||
var $control = $(this);
|
||||
if($control.val())
|
||||
{
|
||||
var $step = $control.closest('.step');
|
||||
if($step.data('index') === getStepsElements().length)
|
||||
{
|
||||
insertStepRow($step, 1, 'step', true);
|
||||
if($step.is('.step-item,.step-group')) insertStepRow($step, 1, 'item', true);
|
||||
refreshSteps();
|
||||
}
|
||||
}
|
||||
});
|
||||
initSortable();
|
||||
refreshSteps();
|
||||
|
||||
@@ -26,184 +26,176 @@
|
||||
<form method='post' enctype='multipart/form-data' id='dataform' target='hiddenwin'>
|
||||
<table class='table table-form'>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->lib;?></th>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<?php echo html::select('lib', $libraries, $libID, "onchange='loadLibModules(this.value);' class='form-control chosen'");?>
|
||||
</div>
|
||||
</td>
|
||||
<td style='padding-left:15px;'>
|
||||
<div class='input-group' id='moduleIdBox'>
|
||||
<span class="input-group-addon"><?php echo $lang->testcase->module?></span>
|
||||
<?php
|
||||
echo html::select('module', $moduleOptionMenu, $currentModuleID, "onchange='loadModuleRelated();' class='form-control chosen'");
|
||||
if(count($moduleOptionMenu) == 1)
|
||||
{
|
||||
echo "<span class='input-group-btn'>";
|
||||
echo html::a($this->createLink('tree', 'browse', "rootID=$libID&view=caselib¤tModuleID=0", 'html', true), "<i class='icon icon-cog'></i>", '', "data-toggle='tooltip' class='btn iframe' title='{$lang->tree->manage}'");
|
||||
echo '</span>';
|
||||
echo "<span class='input-group-btn'>";
|
||||
echo html::a("javascript:void(0)", "<i class='icon icon-refresh'></i>", '', "class='btn refresh' title='{$lang->refresh}' onclick='loadLibModules($libID)'");
|
||||
echo '</span>';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->type;?></th>
|
||||
<td><?php echo html::select('type', $lang->testcase->typeList, $type, "class='form-control chosen'");?></td>
|
||||
<?php if(strpos(",$showFields,", 'stage') !== false):?>
|
||||
<td style='padding-left:15px'>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->testcase->stage?></span>
|
||||
<?php echo html::select('stage[]', $lang->testcase->stageList, $stage, "class='form-control chosen' multiple='multiple'");?>
|
||||
</div>
|
||||
</td>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->title;?></th>
|
||||
<td colspan='2'>
|
||||
<div class="input-group title-group">
|
||||
<div class="input-control has-icon-right">
|
||||
<?php echo html::input('title', $caseTitle, "class='form-control'");?>
|
||||
<div class="colorpicker">
|
||||
<button type="button" class="btn btn-link dropdown-toggle" data-toggle="dropdown"><span class="cp-title"></span><span class="color-bar"></span><i class="ic"></i></button>
|
||||
<ul class="dropdown-menu clearfix">
|
||||
<li class="heading"><?php echo $lang->testcase->colorTag;?><i class="icon icon-close"></i></li>
|
||||
</ul>
|
||||
<input type="hidden" class="colorpicker" id="color" name="color" value="" data-icon="color" data-wrapper="input-control-icon-right" data-update-color="#title" data-provide="colorpicker">
|
||||
</div>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->lib;?></th>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<?php echo html::select('lib', $libraries, $libID, "onchange='loadLibModules(this.value);' class='form-control chosen'");?>
|
||||
</div>
|
||||
<?php if(strpos(",$showFields,", ',pri,') !== false): // begin print pri selector?>
|
||||
<span class="input-group-addon fix-border br-0"><?php echo $lang->testcase->pri;?></span>
|
||||
</td>
|
||||
<td style='padding-left:15px;'>
|
||||
<div class='input-group' id='moduleIdBox'>
|
||||
<span class="input-group-addon w-80px"><?php echo $lang->testcase->module?></span>
|
||||
<?php
|
||||
$hasCustomPri = false;
|
||||
foreach($lang->testcase->priList as $priKey => $priValue)
|
||||
echo html::select('module', $moduleOptionMenu, $currentModuleID, "onchange='loadModuleRelated();' class='form-control chosen'");
|
||||
if(count($moduleOptionMenu) == 1)
|
||||
{
|
||||
if(!empty($priKey) and (string)$priKey != (string)$priValue)
|
||||
{
|
||||
$hasCustomPri = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
$priList = $lang->testcase->priList;
|
||||
if(end($priList)) unset($priList[0]);
|
||||
if(!isset($priList[$pri]))
|
||||
{
|
||||
reset($priList);
|
||||
$pri = key($priList);
|
||||
echo "<span class='input-group-btn'>";
|
||||
echo html::a($this->createLink('tree', 'browse', "rootID=$libID&view=caselib¤tModuleID=0", 'html', true), "<i class='icon icon-cog'></i>", '', "data-toggle='tooltip' class='btn iframe' title='{$lang->tree->manage}'");
|
||||
echo '</span>';
|
||||
echo "<span class='input-group-btn'>";
|
||||
echo html::a("javascript:void(0)", "<i class='icon icon-refresh'></i>", '', "class='btn refresh' title='{$lang->refresh}' onclick='loadLibModules($libID)'");
|
||||
echo '</span>';
|
||||
}
|
||||
?>
|
||||
<?php if($hasCustomPri):?>
|
||||
<?php echo html::select('pri', (array)$priList, $pri, "class='form-control'");?>
|
||||
<?php else: ?>
|
||||
<?php ksort($priList);?>
|
||||
<div class="input-group-btn pri-selector" data-type="pri">
|
||||
<button type="button" class="btn dropdown-toggle br-0" data-toggle="dropdown">
|
||||
<span class="pri-text"><span class="label-pri label-pri-<?php echo empty($pri) ? '0' : $pri?>" title="<?php echo $pri?>"><?php echo $pri?></span></span> <span class="caret"></span>
|
||||
</button>
|
||||
<div class='dropdown-menu pull-right'>
|
||||
<?php echo html::select('pri', (array)$priList, $pri, "class='form-control' data-provide='labelSelector' data-label-class='label-pri'");?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endif; // end print pri selector ?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->precondition;?></th>
|
||||
<td colspan='2'><?php echo html::textarea('precondition', $precondition, " rows='2' class='form-control'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->steps;?></th>
|
||||
<td colspan='2'>
|
||||
<table class='table table-form mg-0 table-bordered' style='border: 1px solid #ddd'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='c-id text-center'><?php echo $lang->testcase->stepID;?></th>
|
||||
<th width="45%"><?php echo $lang->testcase->stepDesc;?></th>
|
||||
<th><?php echo $lang->testcase->stepExpect;?></th>
|
||||
<th class='step-actions'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id='steps' class='sortable' data-group-name='<?php echo $lang->testcase->groupName ?>'>
|
||||
<tr class='template step' id='stepTemplate'>
|
||||
<td class='step-id'></td>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon step-item-id'></span>
|
||||
<textarea rows='1' class='form-control autosize step-steps' name='steps[]'></textarea>
|
||||
<span class="input-group-addon step-type-toggle">
|
||||
<input type='hidden' name='stepType[]' value='item' class='step-type'>
|
||||
<div class='step-type-menu-box'>
|
||||
<div class='step-type-current'><span></span> <i class='caret'></i></div>
|
||||
<div class='step-type-menu'>
|
||||
<a href='javascript:;' href='step-type-option' data-value='step'><?php echo $lang->testcase->step ?></a>
|
||||
<a href='javascript:;' href='step-type-option' data-value='group'><?php echo $lang->testcase->group ?></a>
|
||||
<a href='javascript:;' href='step-type-option' data-value='item'><?php echo $lang->testcase->stepChild ?></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->type;?></th>
|
||||
<td><?php echo html::select('type', $lang->testcase->typeList, $type, "class='form-control chosen'");?></td>
|
||||
<?php if(strpos(",$showFields,", 'stage') !== false):?>
|
||||
<td style='padding-left:15px'>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon w-80px'><?php echo $lang->testcase->stage?></span>
|
||||
<?php echo html::select('stage[]', $lang->testcase->stageList, $stage, "class='form-control chosen' multiple='multiple'");?>
|
||||
</div>
|
||||
</td>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->title;?></th>
|
||||
<td colspan='2'>
|
||||
<div class="input-group title-group">
|
||||
<div class="input-control has-icon-right">
|
||||
<?php echo html::input('title', $caseTitle, "class='form-control'");?>
|
||||
<div class="colorpicker">
|
||||
<button type="button" class="btn btn-link dropdown-toggle" data-toggle="dropdown"><span class="cp-title"></span><span class="color-bar"></span><i class="ic"></i></button>
|
||||
<ul class="dropdown-menu clearfix">
|
||||
<li class="heading"><?php echo $lang->testcase->colorTag;?><i class="icon icon-close"></i></li>
|
||||
</ul>
|
||||
<input type="hidden" class="colorpicker" id="color" name="color" value="" data-icon="color" data-wrapper="input-control-icon-right" data-update-color="#title" data-provide="colorpicker">
|
||||
</div>
|
||||
</div>
|
||||
<?php if(strpos(",$showFields,", ',pri,') !== false): // begin print pri selector?>
|
||||
<span class="input-group-addon fix-border br-0"><?php echo $lang->testcase->pri;?></span>
|
||||
<?php
|
||||
$hasCustomPri = false;
|
||||
foreach($lang->testcase->priList as $priKey => $priValue)
|
||||
{
|
||||
if(!empty($priKey) and (string)$priKey != (string)$priValue)
|
||||
{
|
||||
$hasCustomPri = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
$priList = $lang->testcase->priList;
|
||||
if(end($priList)) unset($priList[0]);
|
||||
if(!isset($priList[$pri]))
|
||||
{
|
||||
reset($priList);
|
||||
$pri = key($priList);
|
||||
}
|
||||
?>
|
||||
<?php if($hasCustomPri):?>
|
||||
<?php echo html::select('pri', (array)$priList, $pri, "class='form-control'");?>
|
||||
<?php else: ?>
|
||||
<?php ksort($priList);?>
|
||||
<div class="input-group-btn pri-selector" data-type="pri">
|
||||
<button type="button" class="btn dropdown-toggle br-0" data-toggle="dropdown">
|
||||
<span class="pri-text"><span class="label-pri label-pri-<?php echo empty($pri) ? '0' : $pri?>" title="<?php echo $pri?>"><?php echo $pri?></span></span> <span class="caret"></span>
|
||||
</button>
|
||||
<div class='dropdown-menu pull-right'>
|
||||
<?php echo html::select('pri', (array)$priList, $pri, "class='form-control' data-provide='labelSelector' data-label-class='label-pri'");?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endif; // end print pri selector ?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->precondition;?></th>
|
||||
<td colspan='2'><?php echo html::textarea('precondition', $precondition, " rows='2' class='form-control'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->steps;?></th>
|
||||
<td colspan='2'>
|
||||
<table class='table table-form mg-0 table-bordered' style='border: 1px solid #ddd'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='c-id text-center'><?php echo $lang->testcase->stepID;?></th>
|
||||
<th width="45%"><?php echo $lang->testcase->stepDesc;?></th>
|
||||
<th><?php echo $lang->testcase->stepExpect;?></th>
|
||||
<th class='step-actions'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id='steps' class='sortable' data-group-name='<?php echo $lang->testcase->groupName ?>'>
|
||||
<tr class='template step' id='stepTemplate'>
|
||||
<td class='step-id'></td>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon step-item-id'></span>
|
||||
<textarea rows='1' class='form-control autosize step-steps' name='steps[]'></textarea>
|
||||
<span class="input-group-addon step-type-toggle">
|
||||
<input type='hidden' name='stepType[]' value='item' class='step-type'>
|
||||
<div class='checkbox-primary'>
|
||||
<input tabindex='-1' type="checkbox" class='step-group-toggle'>
|
||||
<label class="checkbox-inline"><?php echo $lang->testcase->group ?></label>
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</td>
|
||||
<td><textarea rows='1' class='form-control autosize step-expects' name='expects[]'></textarea></td>
|
||||
<td class='step-actions'>
|
||||
<div class='btn-group'>
|
||||
<button type='button' class='btn btn-step-add'><i class='icon icon-plus'></i></button>
|
||||
<button type='button' class='btn btn-step-move'><i class='icon icon-move'></i></button>
|
||||
<button type='button' class='btn btn-step-delete'><i class='icon icon-close'></i></button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php foreach($steps as $stepID => $step):?>
|
||||
<tr class='step'>
|
||||
<td class='step-id'></td>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon step-item-id'></span>
|
||||
<?php echo html::textarea('steps[]', $step->desc, "rows='1' class='form-control autosize step-steps'") ?>
|
||||
<span class='input-group-addon step-type-toggle'>
|
||||
<?php if(!isset($step->type)) $step->type = 'step';?>
|
||||
<input type='hidden' name='stepType[]' value='<?php echo $step->type ?>' class='step-type'>
|
||||
<div class='step-type-menu-box'>
|
||||
<div class='step-type-current'><span></span> <i class='caret'></i></div>
|
||||
<div class='step-type-menu'>
|
||||
<a href='javascript:;' href='step-type-option' data-value='step'><?php echo $lang->testcase->step ?></a>
|
||||
<a href='javascript:;' href='step-type-option' data-value='group'><?php echo $lang->testcase->group ?></a>
|
||||
<a href='javascript:;' href='step-type-option' data-value='item'><?php echo $lang->testcase->stepChild ?></a>
|
||||
</span>
|
||||
</div>
|
||||
</td>
|
||||
<td><textarea rows='1' class='form-control autosize step-expects' name='expects[]'></textarea></td>
|
||||
<td class='step-actions'>
|
||||
<div class='btn-group'>
|
||||
<button type='button' class='btn btn-step-add'><i class='icon icon-plus'></i></button>
|
||||
<button type='button' class='btn btn-step-move'><i class='icon icon-move'></i></button>
|
||||
<button type='button' class='btn btn-step-delete'><i class='icon icon-close'></i></button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php foreach($steps as $stepID => $step):?>
|
||||
<tr class='step'>
|
||||
<td class='step-id'></td>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon step-item-id'></span>
|
||||
<?php echo html::textarea('steps[]', $step->desc, "rows='1' class='form-control autosize step-steps'") ?>
|
||||
<span class='input-group-addon step-type-toggle'>
|
||||
<?php if(!isset($step->type)) $step->type = 'step';?>
|
||||
<input type='hidden' name='stepType[]' value='<?php echo $step->type;?>' class='step-type'>
|
||||
<div class='checkbox-primary'>
|
||||
<input tabindex='-1' type="checkbox" class='step-group-toggle'<?php if($step->type === 'group') echo ' checked' ?>>
|
||||
<label><?php echo $lang->testcase->group ?></label>
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</td>
|
||||
<td><?php echo html::textarea('expects[]', $step->expect, "rows='1' class='form-control autosize step-expects'") ?></td>
|
||||
<td class='step-actions'>
|
||||
<div class='btn-group'>
|
||||
<button type='button' class='btn btn-step-add'><i class='icon icon-plus'></i></button>
|
||||
<button type='button' class='btn btn-step-move'><i class='icon icon-move'></i></button>
|
||||
<button type='button' class='btn btn-step-delete'><i class='icon icon-close'></i></button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if(strpos(",$showFields,", ',keywords,') !== false):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->keywords;?></th>
|
||||
<td colspan='2'><?php echo html::input('keywords', '', "class='form-control'");?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->files;?></th>
|
||||
<td colspan='2'><?php echo $this->fetch('file', 'buildform');?></td>
|
||||
</tr>
|
||||
</span>
|
||||
</div>
|
||||
</td>
|
||||
<td><?php echo html::textarea('expects[]', $step->expect, "rows='1' class='form-control autosize step-expects'") ?></td>
|
||||
<td class='step-actions'>
|
||||
<div class='btn-group'>
|
||||
<button type='button' class='btn btn-step-add'><i class='icon icon-plus'></i></button>
|
||||
<button type='button' class='btn btn-step-move'><i class='icon icon-move'></i></button>
|
||||
<button type='button' class='btn btn-step-delete'><i class='icon icon-close'></i></button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if(strpos(",$showFields,", ',keywords,') !== false):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->keywords;?></th>
|
||||
<td colspan='2'><?php echo html::input('keywords', '', "class='form-control'");?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->files;?></th>
|
||||
<td colspan='2'><?php echo $this->fetch('file', 'buildform');?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
|
||||
@@ -108,6 +108,10 @@ $lang->customMenu = 'Custom Menu';
|
||||
$lang->customField = 'Custom Field';
|
||||
$lang->lineNumber = 'Line No.';
|
||||
$lang->tutorialConfirm = 'You are using ZenTao tutorial. Do you want to quit right now?';
|
||||
$lang->levelExceeded = 'The level has exceeded the display range. For more information, please go to the web page or view it through search.';
|
||||
|
||||
$lang->serviceAgreement = "Service Agreement";
|
||||
$lang->privacyPolicy = "Privacy Policy";
|
||||
|
||||
$lang->preShortcutKey = '[Shortcut:←]';
|
||||
$lang->nextShortcutKey = '[Shortcut:→]';
|
||||
|
||||
@@ -436,21 +436,6 @@ $.extend($.fn.kanban.Constructor.DEFAULTS,
|
||||
var color = kanbanColorList[lane.$index % kanbanColorList.length];
|
||||
$name.css('background-color', color);
|
||||
},
|
||||
onRenderKanban: function($kanban, kanbanData)
|
||||
{
|
||||
/* Update project count and execution count */
|
||||
var doingProjectCount = 0;
|
||||
var doingExecutionCount = 0;
|
||||
var $doingProjectItems = $kanban.find('.kanban-lane-col[data-type="doingProject"] > .kanban-lane-items');
|
||||
if($doingProjectItems.length)
|
||||
{
|
||||
doingProjectCount = $doingProjectItems.find('.project-item').length;
|
||||
doingExecutionCount = $doingProjectItems.find('.execution-item').length;
|
||||
}
|
||||
|
||||
$kanban.find('.kanban-header-col[data-type="doingProject"] > .title > .count').text(doingProjectCount || 0);
|
||||
$kanban.find('.kanban-header-col[data-type="doingExecution"] > .title > .count').text(doingExecutionCount || 0);
|
||||
},
|
||||
onCreate: function(kanban)
|
||||
{
|
||||
kanban.$.on('scroll', tryUpdateKanbanAffix);
|
||||
|
||||
@@ -277,7 +277,7 @@ class design extends control
|
||||
*/
|
||||
public function linkCommit($designID = 0, $repoID = 0, $begin = '', $end = '', $recTotal = 0, $recPerPage = 50, $pageID = 1)
|
||||
{
|
||||
$design = $this->design->getById($designID);
|
||||
$design = $this->design->getById($designID);
|
||||
$productID = $this->commonAction($design->project, $design->product, $designID);
|
||||
|
||||
/* Get project and date. */
|
||||
@@ -330,9 +330,10 @@ class design extends control
|
||||
$this->view->designID = $designID;
|
||||
$this->view->begin = $begin;
|
||||
$this->view->end = $end;
|
||||
$this->view->design = $this->design->getByID($designID);
|
||||
$this->view->design = $design;
|
||||
$this->view->pager = $pager;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->type = $design->type;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -4,16 +4,16 @@ $('#begin, #end, #repo').change(function()
|
||||
var end = $('#end').val();
|
||||
var repo = $('#repo').val();
|
||||
|
||||
if(begin.indexOf('-') != -1)
|
||||
{
|
||||
if(begin.indexOf('-') != -1)
|
||||
{
|
||||
var beginarray = begin.split("-");
|
||||
var begin = '';
|
||||
var begin = '';
|
||||
for(i = 0; i < beginarray.length; i++) begin = begin + beginarray[i];
|
||||
}
|
||||
if(end.indexOf('-') != -1)
|
||||
{
|
||||
}
|
||||
if(end.indexOf('-') != -1)
|
||||
{
|
||||
var endarray = end.split("-");
|
||||
var end = '';
|
||||
var end = '';
|
||||
for(i = 0 ; i < endarray.length ; i++) end = end + endarray[i];
|
||||
}
|
||||
|
||||
@@ -26,3 +26,9 @@ $('#begin, #end, #repo').change(function()
|
||||
|
||||
location.href = createLink('design', 'linkCommit', "designID=" + designID + '&repoID=' + repo + '&begin=' + begin + '&end=' + end);
|
||||
})
|
||||
|
||||
$(function()
|
||||
{
|
||||
$('#subNavbar .nav li').removeClass('active');
|
||||
$('#subNavbar .nav li[data-id=' + type + ']').addClass('active');
|
||||
})
|
||||
|
||||
@@ -84,5 +84,6 @@
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<?php js::set('designID', $designID);?>
|
||||
<?php js::set('type', strtolower($type));?>
|
||||
<?php js::set('errorDate', $lang->design->errorDate);?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
+97
-90
@@ -28,96 +28,103 @@ $lang->dev->fields['length'] = 'Length';
|
||||
$lang->dev->fields['null'] = 'Null';
|
||||
|
||||
$lang->dev->tableList = array();
|
||||
$lang->dev->tableList['action'] = 'Action';
|
||||
$lang->dev->tableList['bug'] = 'Bug';
|
||||
$lang->dev->tableList['build'] = 'Build';
|
||||
$lang->dev->tableList['burn'] = 'Burndown Chart';
|
||||
$lang->dev->tableList['case'] = 'Test Case';
|
||||
$lang->dev->tableList['casestep'] = 'Case Step';
|
||||
$lang->dev->tableList['company'] = 'Company';
|
||||
$lang->dev->tableList['config'] = 'Configuration';
|
||||
$lang->dev->tableList['custom'] = 'Custom';
|
||||
$lang->dev->tableList['dept'] = 'Department';
|
||||
$lang->dev->tableList['doc'] = 'Document';
|
||||
$lang->dev->tableList['doclib'] = 'Document Library';
|
||||
$lang->dev->tableList['effort'] = 'Effort';
|
||||
$lang->dev->tableList['extension'] = 'Extension';
|
||||
$lang->dev->tableList['file'] = 'File';
|
||||
$lang->dev->tableList['group'] = 'Group';
|
||||
$lang->dev->tableList['grouppriv'] = 'Privilege';
|
||||
$lang->dev->tableList['history'] = 'History';
|
||||
$lang->dev->tableList['lang'] = 'Language';
|
||||
$lang->dev->tableList['module'] = 'Module';
|
||||
$lang->dev->tableList['program'] = 'Program';
|
||||
$lang->dev->tableList['product'] = $lang->productCommon;
|
||||
$lang->dev->tableList['productplan'] = $lang->productCommon . 'Plan';
|
||||
$lang->dev->tableList['project'] = 'Project';
|
||||
$lang->dev->tableList['projectproduct'] = 'Project' . $lang->productCommon;
|
||||
$lang->dev->tableList['projectstory'] = 'Project Story';
|
||||
$lang->dev->tableList['execution'] = $lang->executionCommon;
|
||||
$lang->dev->tableList['release'] = 'Release';
|
||||
$lang->dev->tableList['story'] = 'Story';
|
||||
$lang->dev->tableList['storyspec'] = 'Story Description';
|
||||
$lang->dev->tableList['task'] = 'Task';
|
||||
$lang->dev->tableList['taskestimate'] = 'Estimates';
|
||||
$lang->dev->tableList['team'] = 'Team';
|
||||
$lang->dev->tableList['testresult'] = 'Test Result';
|
||||
$lang->dev->tableList['testrun'] = 'Test Run';
|
||||
$lang->dev->tableList['testtask'] = 'Test Request';
|
||||
$lang->dev->tableList['todo'] = 'Todo';
|
||||
$lang->dev->tableList['user'] = 'User';
|
||||
$lang->dev->tableList['usercontact'] = 'User Contact';
|
||||
$lang->dev->tableList['usergroup'] = 'User Group';
|
||||
$lang->dev->tableList['userquery'] = 'User Query';
|
||||
$lang->dev->tableList['usertpl'] = 'User Template';
|
||||
$lang->dev->tableList['admin'] = 'Admin';
|
||||
$lang->dev->tableList['api'] = 'API';
|
||||
$lang->dev->tableList['backup'] = 'Backup';
|
||||
$lang->dev->tableList['common'] = 'Common';
|
||||
$lang->dev->tableList['convert'] = 'Convert';
|
||||
$lang->dev->tableList['dev'] = 'Develop';
|
||||
$lang->dev->tableList['git'] = 'GIT';
|
||||
$lang->dev->tableList['index'] = 'Home';
|
||||
$lang->dev->tableList['install'] = 'Install';
|
||||
$lang->dev->tableList['mail'] = 'Email';
|
||||
$lang->dev->tableList['misc'] = 'Misc.';
|
||||
$lang->dev->tableList['my'] = 'Dashboard';
|
||||
$lang->dev->tableList['qa'] = 'Test';
|
||||
$lang->dev->tableList['report'] = 'Report';
|
||||
$lang->dev->tableList['search'] = 'Search';
|
||||
$lang->dev->tableList['sso'] = 'SSO';
|
||||
$lang->dev->tableList['svn'] = 'SVN';
|
||||
$lang->dev->tableList['testcase'] = 'Test Case';
|
||||
$lang->dev->tableList['testreport'] = 'Test Report';
|
||||
$lang->dev->tableList['testsuite'] = 'Test Suite';
|
||||
$lang->dev->tableList['caselib'] = 'Case Library';
|
||||
$lang->dev->tableList['tree'] = 'Module Tree';
|
||||
$lang->dev->tableList['upgrade'] = 'Update';
|
||||
$lang->dev->tableList['cron'] = 'Cron';
|
||||
$lang->dev->tableList['datatable'] = 'Data Table';
|
||||
$lang->dev->tableList['block'] = 'Block';
|
||||
$lang->dev->tableList['branch'] = 'Branch';
|
||||
$lang->dev->tableList['doccontent'] = 'Doc Content';
|
||||
$lang->dev->tableList['storystage'] = 'Story Phase';
|
||||
$lang->dev->tableList['tutorial'] = 'Tutorial';
|
||||
$lang->dev->tableList['suitecase'] = 'Suite Case';
|
||||
$lang->dev->tableList['score'] = 'Score';
|
||||
$lang->dev->tableList['entry'] = 'Application';
|
||||
$lang->dev->tableList['webhook'] = 'WebHook';
|
||||
$lang->dev->tableList['log'] = 'Log';
|
||||
$lang->dev->tableList['message'] = 'Message';
|
||||
$lang->dev->tableList['notify'] = 'Notification';
|
||||
$lang->dev->tableList['userview'] = 'User Privilege';
|
||||
$lang->dev->tableList['repo'] = 'Code';
|
||||
$lang->dev->tableList['repohistory'] = 'Repo History';
|
||||
$lang->dev->tableList['repofiles'] = 'Repo Files';
|
||||
$lang->dev->tableList['repobranch'] = 'Repo Branch';
|
||||
$lang->dev->tableList['ci'] = 'CI';
|
||||
$lang->dev->tableList['compile'] = 'Compile';
|
||||
$lang->dev->tableList['jenkins'] = 'Jenkins';
|
||||
$lang->dev->tableList['job'] = 'Job';
|
||||
$lang->dev->tableList['searchdict'] = 'Search dict';
|
||||
$lang->dev->tableList['searchindex'] = 'Search index';
|
||||
$lang->dev->tableList['action'] = 'Action';
|
||||
$lang->dev->tableList['bug'] = 'Bug';
|
||||
$lang->dev->tableList['build'] = 'Build';
|
||||
$lang->dev->tableList['burn'] = 'Burndown Chart';
|
||||
$lang->dev->tableList['case'] = 'Test Case';
|
||||
$lang->dev->tableList['casestep'] = 'Case Step';
|
||||
$lang->dev->tableList['company'] = 'Company';
|
||||
$lang->dev->tableList['config'] = 'Configuration';
|
||||
$lang->dev->tableList['custom'] = 'Custom';
|
||||
$lang->dev->tableList['dept'] = 'Department';
|
||||
$lang->dev->tableList['doc'] = 'Document';
|
||||
$lang->dev->tableList['doclib'] = 'Document Library';
|
||||
$lang->dev->tableList['effort'] = 'Effort';
|
||||
$lang->dev->tableList['extension'] = 'Extension';
|
||||
$lang->dev->tableList['file'] = 'File';
|
||||
$lang->dev->tableList['group'] = 'Group';
|
||||
$lang->dev->tableList['grouppriv'] = 'Privilege';
|
||||
$lang->dev->tableList['history'] = 'History';
|
||||
$lang->dev->tableList['lang'] = 'Language';
|
||||
$lang->dev->tableList['module'] = 'Module';
|
||||
$lang->dev->tableList['program'] = 'Program';
|
||||
$lang->dev->tableList['product'] = $lang->productCommon;
|
||||
$lang->dev->tableList['productplan'] = $lang->productCommon . 'Plan';
|
||||
$lang->dev->tableList['project'] = 'Project';
|
||||
$lang->dev->tableList['projectproduct'] = 'Project' . $lang->productCommon;
|
||||
$lang->dev->tableList['projectstory'] = 'Project Story';
|
||||
$lang->dev->tableList['execution'] = $lang->executionCommon;
|
||||
$lang->dev->tableList['release'] = 'Release';
|
||||
$lang->dev->tableList['story'] = 'Story';
|
||||
$lang->dev->tableList['storyspec'] = 'Story Description';
|
||||
$lang->dev->tableList['task'] = 'Task';
|
||||
$lang->dev->tableList['taskestimate'] = 'Estimates';
|
||||
$lang->dev->tableList['team'] = 'Team';
|
||||
$lang->dev->tableList['testresult'] = 'Test Result';
|
||||
$lang->dev->tableList['testrun'] = 'Test Run';
|
||||
$lang->dev->tableList['testtask'] = 'Test Request';
|
||||
$lang->dev->tableList['todo'] = 'Todo';
|
||||
$lang->dev->tableList['user'] = 'User';
|
||||
$lang->dev->tableList['usercontact'] = 'User Contact';
|
||||
$lang->dev->tableList['usergroup'] = 'User Group';
|
||||
$lang->dev->tableList['userquery'] = 'User Query';
|
||||
$lang->dev->tableList['usertpl'] = 'User Template';
|
||||
$lang->dev->tableList['admin'] = 'Admin';
|
||||
$lang->dev->tableList['api'] = 'API';
|
||||
$lang->dev->tableList['backup'] = 'Backup';
|
||||
$lang->dev->tableList['common'] = 'Common';
|
||||
$lang->dev->tableList['convert'] = 'Convert';
|
||||
$lang->dev->tableList['dev'] = 'Develop';
|
||||
$lang->dev->tableList['git'] = 'GIT';
|
||||
$lang->dev->tableList['index'] = 'Home';
|
||||
$lang->dev->tableList['install'] = 'Install';
|
||||
$lang->dev->tableList['mail'] = 'Email';
|
||||
$lang->dev->tableList['misc'] = 'Misc.';
|
||||
$lang->dev->tableList['my'] = 'Dashboard';
|
||||
$lang->dev->tableList['qa'] = 'Test';
|
||||
$lang->dev->tableList['report'] = 'Report';
|
||||
$lang->dev->tableList['search'] = 'Search';
|
||||
$lang->dev->tableList['sso'] = 'SSO';
|
||||
$lang->dev->tableList['svn'] = 'SVN';
|
||||
$lang->dev->tableList['testcase'] = 'Test Case';
|
||||
$lang->dev->tableList['testreport'] = 'Test Report';
|
||||
$lang->dev->tableList['testsuite'] = 'Test Suite';
|
||||
$lang->dev->tableList['caselib'] = 'Case Library';
|
||||
$lang->dev->tableList['tree'] = 'Module Tree';
|
||||
$lang->dev->tableList['upgrade'] = 'Update';
|
||||
$lang->dev->tableList['cron'] = 'Cron';
|
||||
$lang->dev->tableList['datatable'] = 'Data Table';
|
||||
$lang->dev->tableList['block'] = 'Block';
|
||||
$lang->dev->tableList['branch'] = 'Branch';
|
||||
$lang->dev->tableList['doccontent'] = 'Doc Content';
|
||||
$lang->dev->tableList['storystage'] = 'Story Phase';
|
||||
$lang->dev->tableList['tutorial'] = 'Tutorial';
|
||||
$lang->dev->tableList['suitecase'] = 'Suite Case';
|
||||
$lang->dev->tableList['score'] = 'Score';
|
||||
$lang->dev->tableList['entry'] = 'Application';
|
||||
$lang->dev->tableList['webhook'] = 'WebHook';
|
||||
$lang->dev->tableList['log'] = 'Log';
|
||||
$lang->dev->tableList['message'] = 'Message';
|
||||
$lang->dev->tableList['notify'] = 'Notification';
|
||||
$lang->dev->tableList['userview'] = 'User Privilege';
|
||||
$lang->dev->tableList['repo'] = 'Code';
|
||||
$lang->dev->tableList['repohistory'] = 'Repo History';
|
||||
$lang->dev->tableList['repofiles'] = 'Repo Files';
|
||||
$lang->dev->tableList['repobranch'] = 'Repo Branch';
|
||||
$lang->dev->tableList['ci'] = 'CI';
|
||||
$lang->dev->tableList['compile'] = 'Compile';
|
||||
$lang->dev->tableList['jenkins'] = 'Jenkins';
|
||||
$lang->dev->tableList['job'] = 'Job';
|
||||
$lang->dev->tableList['searchdict'] = 'Search dict';
|
||||
$lang->dev->tableList['searchindex'] = 'Search index';
|
||||
$lang->dev->tableList['kanbanlane'] = 'Kanban Lane';
|
||||
$lang->dev->tableList['kanbancolumn'] = 'Kanban Column';
|
||||
$lang->dev->tableList['stakeholder'] = 'Stakeholder';
|
||||
$lang->dev->tableList['im_chat_message_index'] = 'Zentao Client Message';
|
||||
$lang->dev->tableList['im_message_backup'] = 'Zentao Client Backup';
|
||||
$lang->dev->tableList['im_message_index'] = 'Zentao Client Message Index';
|
||||
$lang->dev->tableList['im_userdevice'] = 'Zentao Client User Device';
|
||||
|
||||
$lang->dev->groupList['my'] = 'Dashboard';
|
||||
$lang->dev->groupList['program'] = 'Program';
|
||||
|
||||
@@ -37,11 +37,11 @@
|
||||
#kanbans .kanban-card[data-scale-size="4"] {padding: 8px;}
|
||||
#kanbans .kanban-card[data-scale-size="3"] {padding: 3px 4px;}
|
||||
#kanbans .kanban-card[data-scale-size="3"] > .title {white-space: normal; max-height: 100%;}
|
||||
#kanbans .kanban-card[data-scale-size="2"] {padding: 3px 4px;}
|
||||
#kanbans .kanban-card[data-scale-size="2"] > .title {line-height: 18px; white-space: normal; max-height: 100%;}
|
||||
#kanbans .kanban-card[data-scale-size="2"] > .title > .infos {display: inline-block; height: 18px; vertical-align: top;}
|
||||
#kanbans .kanban-card[data-scale-size="2"] > .title > .infos > .info-pri {transform: scale(.8); vertical-align: top;}
|
||||
#kanbans .kanban-card[data-scale-size="2"] > .title > .infos > .avatar {display: inline-block; transform: scale(.8); position: relative; top: -1px; vertical-align: top; margin-right: -1px;}
|
||||
#kanbans .kanban-card[data-scale-size="2"] {padding: 3px 4px; overflow: hidden;}
|
||||
#kanbans .kanban-card[data-scale-size="2"] > .title {display: inline; line-height: 18px; white-space: normal; max-height: 100%; word-break: break-all;}
|
||||
#kanbans .kanban-card[data-scale-size="2"] > .infos {display: inline-block; height: 18px; vertical-align: top; margin: 0;}
|
||||
#kanbans .kanban-card[data-scale-size="2"] > .infos > .info-pri {transform: scale(.8); vertical-align: top;}
|
||||
#kanbans .kanban-card[data-scale-size="2"] > .infos > .avatar {display: inline-block; transform: scale(.8); position: relative; top: -2px; vertical-align: top; margin-right: -1px;}
|
||||
|
||||
#kanbanScaleControl {width: 100px;}
|
||||
#kanbanScaleControl .input-group-addon {background: #fff; padding: 5px;}
|
||||
|
||||
@@ -64,7 +64,7 @@ function renderDeadline(deadline)
|
||||
}
|
||||
|
||||
/**
|
||||
* Render story item 提供方法渲染看板中的需求卡片
|
||||
* Render story item
|
||||
* @param {Object} item Story item object
|
||||
* @param {JQuery} $item Kanban item element
|
||||
* @param {Object} col Column object
|
||||
@@ -99,6 +99,7 @@ function renderStoryItem(item, $item, col)
|
||||
|
||||
$infos[scaleSize <= 1 ? 'append' : 'prepend'](avatarHtml);
|
||||
if(scaleSize <= 1) $infos.appendTo($item);
|
||||
else if(scaleSize === 2) $infos.prependTo($item);
|
||||
else $infos.prependTo($item.find('.title'));
|
||||
}
|
||||
else if(scaleSize === 4)
|
||||
@@ -125,7 +126,7 @@ function renderStoryItem(item, $item, col)
|
||||
}
|
||||
|
||||
/**
|
||||
* Render bug item 提供方法渲染看板中的 Bug 卡片
|
||||
* Render bug item
|
||||
* @param {Object} item Bug item object
|
||||
* @param {JQuery} $item Kanban item element
|
||||
* @param {Object} col Column object
|
||||
@@ -162,6 +163,7 @@ function renderBugItem(item, $item, col)
|
||||
$infos[scaleSize <= 1 ? 'append' : 'prepend'](avatarHtml);
|
||||
|
||||
if(scaleSize <= 1) $infos.appendTo($item);
|
||||
else if(scaleSize === 2) $infos.prependTo($item);
|
||||
else $infos.prependTo($item.find('.title'));
|
||||
}
|
||||
else if(scaleSize === 4)
|
||||
@@ -188,7 +190,7 @@ function renderBugItem(item, $item, col)
|
||||
}
|
||||
|
||||
/**
|
||||
* Render task item 提供方法渲染看板中的任务卡片
|
||||
* Render task item
|
||||
* @param {Object} item Task item object
|
||||
* @param {JQuery} $item Kanban item element
|
||||
* @param {Object} col Column object
|
||||
@@ -225,6 +227,7 @@ function renderTaskItem(item, $item, col)
|
||||
$infos[scaleSize <= 1 ? 'append' : 'prepend'](avatarHtml);
|
||||
|
||||
if(scaleSize <= 1) $infos.appendTo($item);
|
||||
else if(scaleSize === 2) $infos.prependTo($item);
|
||||
else $infos.prependTo($item.find('.title'));
|
||||
}
|
||||
else if(scaleSize === 4)
|
||||
@@ -252,13 +255,13 @@ function renderTaskItem(item, $item, col)
|
||||
return $item;
|
||||
}
|
||||
|
||||
/* Add column renderer/ 添加特定列类型或列条目类型渲染方法 */
|
||||
/* Add column renderer */
|
||||
addColumnRenderer('story', renderStoryItem);
|
||||
addColumnRenderer('bug', renderBugItem);
|
||||
addColumnRenderer('task', renderTaskItem);
|
||||
|
||||
/**
|
||||
* Render column count 渲染看板列头上的卡片数目
|
||||
* Render column count
|
||||
* @param {JQuery} $count Kanban count element
|
||||
* @param {number} count Column cards count
|
||||
* @param {number} col Column object
|
||||
@@ -271,7 +274,7 @@ function renderColumnCount($count, count, col)
|
||||
}
|
||||
|
||||
/**
|
||||
* Render header column 渲染看板列头部
|
||||
* Render header column
|
||||
* @param {JQuery} $col Header column element
|
||||
* @param {Object} col Header column object
|
||||
* @param {JQuery} $header Header element
|
||||
@@ -307,7 +310,7 @@ function renderHeaderCol($col, col, $header, kanban)
|
||||
}
|
||||
|
||||
/**
|
||||
* Render lane name 渲染看板泳道名称
|
||||
* Render lane name
|
||||
* @param {JQuery} $name Name element
|
||||
* @param {Object} lane Lane object
|
||||
* @param {JQuery} $kanban $kanban element
|
||||
@@ -331,9 +334,8 @@ function renderLaneName($name, lane, $kanban, columns, kanban)
|
||||
|
||||
/**
|
||||
* Updata kanban data
|
||||
* 更新看板上的数据
|
||||
* @param {string} kanbanID Kanban id 看板 ID
|
||||
* @param {Object} data Kanban data 看板数据
|
||||
* @param {string} kanbanID Kanban id
|
||||
* @param {Object} data Kanban data
|
||||
*/
|
||||
function updateKanban(kanbanID, data)
|
||||
{
|
||||
@@ -345,10 +347,9 @@ function updateKanban(kanbanID, data)
|
||||
|
||||
/**
|
||||
* Create kanban in page
|
||||
* 在界面上创建一个看板界面
|
||||
* @param {string} kanbanID Kanban id 看板 ID
|
||||
* @param {Object} data Kanban data 看板数据
|
||||
* @param {Object} options Kanban options 组件初始化数据 看板名称
|
||||
* @param {string} kanbanID Kanban id
|
||||
* @param {Object} data Kanban data
|
||||
* @param {Object} options Kanban options
|
||||
*/
|
||||
function createKanban(kanbanID, data, options)
|
||||
{
|
||||
@@ -502,7 +503,6 @@ function findDropColumns($element, $root)
|
||||
|
||||
/**
|
||||
* Change column type for a card
|
||||
* 变更卡片类型
|
||||
* @param {Object} card Card object
|
||||
* @param {String} fromColType The column type before change
|
||||
* @param {String} toColType The column type after change
|
||||
@@ -568,13 +568,6 @@ function changeCardColType(card, fromColType, toColType, kanbanID)
|
||||
var modalTrigger = new $.zui.ModalTrigger({type: 'iframe', width: '80%', url: link});
|
||||
modalTrigger.show();
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: The server must return a updated kanban data 服务器返回更新后的看板数据
|
||||
|
||||
// 调用 updateKanban 更新看板数据
|
||||
updateKanban(kanbanID, newKanbanData);
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -588,7 +581,7 @@ function handleFinishDrop(event)
|
||||
var $dragCol = $card.closest('.kanban-lane-col');
|
||||
var $dropCol = $(event.target);
|
||||
|
||||
/* Get d-n-d(drag and drop) infos 获取拖放操作相关信息 */
|
||||
/* Get d-n-d(drag and drop) infos */
|
||||
var card = $card.data('item');
|
||||
var fromColType = $dragCol.data('type');
|
||||
var toColType = $dropCol.data('type');
|
||||
@@ -599,9 +592,7 @@ function handleFinishDrop(event)
|
||||
$('#kanbans').find('.can-drop-here').removeClass('can-drop-here');
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle sort cards in column 处理对列卡片进行排序
|
||||
*/
|
||||
/** Handle sort cards in column */
|
||||
function handleSortColCards()
|
||||
{
|
||||
/* TODO: handle sort cards from column contextmenu */
|
||||
@@ -609,7 +600,7 @@ function handleSortColCards()
|
||||
}
|
||||
|
||||
/**
|
||||
* Create column menu 创建列操作菜单
|
||||
* Create column menu
|
||||
* @returns {Object[]}
|
||||
*/
|
||||
function createColumnMenu(options)
|
||||
@@ -626,7 +617,7 @@ function createColumnMenu(options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create column create button menu 创建列添加按钮操作菜单
|
||||
* Create column create button menu
|
||||
* @returns {Object[]}
|
||||
*/
|
||||
function createColumnCreateMenu(options)
|
||||
@@ -656,7 +647,7 @@ function createColumnCreateMenu(options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create lane menu 创建泳道操作菜单
|
||||
* Create lane menu
|
||||
* @returns {Object[]}
|
||||
*/
|
||||
function createLaneMenu(options)
|
||||
@@ -681,7 +672,7 @@ function createLaneMenu(options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create story menu 创建需求卡片操作菜单
|
||||
* Create story menu
|
||||
* @returns {Object[]}
|
||||
*/
|
||||
function createStoryMenu(options)
|
||||
@@ -703,7 +694,7 @@ function createStoryMenu(options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create bug menu 创建 Bug 卡片操作菜单
|
||||
* Create bug menu
|
||||
* @returns {Object[]}
|
||||
*/
|
||||
function createBugMenu(options)
|
||||
@@ -724,7 +715,7 @@ function createBugMenu(options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create task menu 创建任务卡片操作菜单
|
||||
* Create task menu
|
||||
* @returns {Object[]}
|
||||
*/
|
||||
function createTaskMenu(options)
|
||||
@@ -819,7 +810,7 @@ $(function()
|
||||
$('#kanbanScaleControl .btn[data-type="+"]').attr('disabled', window.kanbanScaleSize >= 4 ? 'disabled' : null);
|
||||
$('#kanbanScaleControl .btn[data-type="-"]').attr('disabled', window.kanbanScaleSize <= 1 ? 'disabled' : null);
|
||||
|
||||
/* Common options 用于初始化看板的通用选项 */
|
||||
/* Common options */
|
||||
var commonOptions =
|
||||
{
|
||||
maxColHeight: 'auto',
|
||||
@@ -843,7 +834,7 @@ $(function()
|
||||
onRenderCount: renderColumnCount
|
||||
};
|
||||
|
||||
/* Create kanban 创建看板 */
|
||||
/* Create kanban */
|
||||
if(groupBy == 'default')
|
||||
{
|
||||
var kanbanLane = '';
|
||||
@@ -858,7 +849,7 @@ $(function()
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Create kanban by group. 分泳道创建看板. */
|
||||
/* Create kanban by group. */
|
||||
createKanban(browseType, kanbanGroup[groupBy], commonOptions);
|
||||
}
|
||||
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->execution->copyNoExecution = 'There are no ' . $lang->executionCommon .
|
||||
$lang->execution->noTeam = 'No team members at the moment';
|
||||
$lang->execution->or = ' or ';
|
||||
$lang->execution->selectProject = 'Please select project';
|
||||
$lang->execution->unfoldClosed = 'Unfold Closed';
|
||||
$lang->execution->editName = 'Edit Name';
|
||||
$lang->execution->setWIP = 'WIP Settings';
|
||||
$lang->execution->sortColumn = 'Kanban Card Sorting';
|
||||
|
||||
@@ -154,7 +154,7 @@ $lang->gitlab->group->requestAccessEnabledTip = "Allow users to
|
||||
$lang->gitlab->group->lfsEnabled = 'Large File Storage';
|
||||
$lang->gitlab->group->lfsEnabledTip = "Allow projects within this group to use Git LFS(This setting can be overridden in each project)";
|
||||
$lang->gitlab->group->projectCreationLevel = "Allowed to create projects";
|
||||
$lang->gitlab->group->projectCreationLevelList['none'] = "No one";
|
||||
$lang->gitlab->group->projectCreationLevelList['noone'] = "No one";
|
||||
$lang->gitlab->group->projectCreationLevelList['maintainer'] = "Maintainers";
|
||||
$lang->gitlab->group->projectCreationLevelList['developer'] = "Developers + Maintainers";
|
||||
$lang->gitlab->group->subgroupCreationLevel = "Allowed to create projects";
|
||||
|
||||
@@ -21,15 +21,15 @@ $lang->kanban->group->task['default'] = "Default";
|
||||
$lang->kanban->group->task['pri'] = "Task Priority";
|
||||
$lang->kanban->group->task['type'] = "Task Type";
|
||||
$lang->kanban->group->task['module'] = "Task Module";
|
||||
$lang->kanban->group->task['story'] = "Story";
|
||||
$lang->kanban->group->task['assignedTo'] = "Assigned To";
|
||||
$lang->kanban->group->task['story'] = "Story";
|
||||
|
||||
$lang->kanban->group->bug = array();
|
||||
$lang->kanban->group->bug['default'] = "Default";
|
||||
$lang->kanban->group->bug['pri'] = "Bug Priority";
|
||||
$lang->kanban->group->bug['type'] = "Bug Type";
|
||||
$lang->kanban->group->bug['module'] = "Bug Module";
|
||||
$lang->kanban->group->bug['severity'] = "Bug Severity";
|
||||
$lang->kanban->group->bug['module'] = "Bug Module";
|
||||
$lang->kanban->group->bug['type'] = "Bug Type";
|
||||
$lang->kanban->group->bug['assignedTo'] = "Assigned To";
|
||||
|
||||
$lang->kanban->WIP = 'WIP';
|
||||
|
||||
@@ -84,6 +84,16 @@ $lang->misc->feature = new stdclass();
|
||||
$lang->misc->feature->lastest = 'Letzte Version';
|
||||
$lang->misc->feature->detailed = 'Details';
|
||||
|
||||
$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06';
|
||||
$lang->misc->releaseDate['15.7.1'] = '2021-11-02';
|
||||
$lang->misc->releaseDate['15.7'] = '2021-10-18';
|
||||
$lang->misc->releaseDate['15.6'] = '2021-10-12';
|
||||
$lang->misc->releaseDate['15.5'] = '2021-09-14';
|
||||
$lang->misc->releaseDate['15.4'] = '2021-08-23';
|
||||
$lang->misc->releaseDate['15.3'] = '2021-08-04';
|
||||
$lang->misc->releaseDate['15.2'] = '2021-07-20';
|
||||
$lang->misc->releaseDate['15.0.3'] = '2021-06-24';
|
||||
$lang->misc->releaseDate['15.0.2'] = '2021-06-12';
|
||||
$lang->misc->releaseDate['15.0.1'] = '2021-06-06';
|
||||
$lang->misc->releaseDate['15.0'] = '2021-04-30';
|
||||
$lang->misc->releaseDate['15.0.rc3'] = '2021-04-16';
|
||||
@@ -143,6 +153,16 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust details,Fix bug', 'desc' => '');
|
||||
|
||||
@@ -94,7 +94,7 @@ $lang->misc->feature->downloadFile = 'Download introduction';
|
||||
$lang->misc->feature->tutorialDesc = '<p>ZenTao 15.0 has new functions, and you know how to use it through the "<strong>Tutorial</strong>".</p><p>Click your [<span style="color: #0c60e1">Avatar-Theme-Young Blue</span>] to set it.</p>';
|
||||
$lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme, the pages are more beautiful and the experience is more friendly.</p><p>Click your [<span style="color: #0c60e1">Avatar-Theme-Young Blue</span>] to set it.</p>';
|
||||
|
||||
$lang->misc->releaseDate['15.8'] = '2021-11-19';
|
||||
$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06';
|
||||
$lang->misc->releaseDate['15.7.1'] = '2021-11-02';
|
||||
$lang->misc->releaseDate['15.7'] = '2021-10-18';
|
||||
$lang->misc->releaseDate['15.6'] = '2021-10-12';
|
||||
@@ -163,14 +163,14 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['15.8'][] = array('title' => 'Optimize the branch management and its details. Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => '');
|
||||
$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => '');
|
||||
|
||||
$lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
|
||||
@@ -84,6 +84,16 @@ $lang->misc->feature = new stdclass();
|
||||
$lang->misc->feature->lastest = 'Dernière Version';
|
||||
$lang->misc->feature->detailed = 'Détail';
|
||||
|
||||
$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06';
|
||||
$lang->misc->releaseDate['15.7.1'] = '2021-11-02';
|
||||
$lang->misc->releaseDate['15.7'] = '2021-10-18';
|
||||
$lang->misc->releaseDate['15.6'] = '2021-10-12';
|
||||
$lang->misc->releaseDate['15.5'] = '2021-09-14';
|
||||
$lang->misc->releaseDate['15.4'] = '2021-08-23';
|
||||
$lang->misc->releaseDate['15.3'] = '2021-08-04';
|
||||
$lang->misc->releaseDate['15.2'] = '2021-07-20';
|
||||
$lang->misc->releaseDate['15.0.3'] = '2021-06-24';
|
||||
$lang->misc->releaseDate['15.0.2'] = '2021-06-12';
|
||||
$lang->misc->releaseDate['15.0.1'] = '2021-06-06';
|
||||
$lang->misc->releaseDate['15.0'] = '2021-04-30';
|
||||
$lang->misc->releaseDate['15.0.rc3'] = '2021-04-16';
|
||||
@@ -143,6 +153,16 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust details, fix bug.', 'desc' => '');
|
||||
|
||||
@@ -84,6 +84,16 @@ $lang->misc->feature = new stdclass();
|
||||
$lang->misc->feature->lastest = 'Latest Version';
|
||||
$lang->misc->feature->detailed = 'Chi tiết';
|
||||
|
||||
$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06';
|
||||
$lang->misc->releaseDate['15.7.1'] = '2021-11-02';
|
||||
$lang->misc->releaseDate['15.7'] = '2021-10-18';
|
||||
$lang->misc->releaseDate['15.6'] = '2021-10-12';
|
||||
$lang->misc->releaseDate['15.5'] = '2021-09-14';
|
||||
$lang->misc->releaseDate['15.4'] = '2021-08-23';
|
||||
$lang->misc->releaseDate['15.3'] = '2021-08-04';
|
||||
$lang->misc->releaseDate['15.2'] = '2021-07-20';
|
||||
$lang->misc->releaseDate['15.0.3'] = '2021-06-24';
|
||||
$lang->misc->releaseDate['15.0.2'] = '2021-06-12';
|
||||
$lang->misc->releaseDate['15.0.1'] = '2021-06-06';
|
||||
$lang->misc->releaseDate['15.0'] = '2021-04-30';
|
||||
$lang->misc->releaseDate['15.0.rc3'] = '2021-04-16';
|
||||
@@ -143,6 +153,16 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0'][] = array('title' => 'Fix Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust detail, fix bug.', 'desc' => '');
|
||||
|
||||
@@ -94,7 +94,7 @@ $lang->misc->feature->downloadFile = '下载新版本功能介绍文档';
|
||||
$lang->misc->feature->tutorialDesc = "<p>禅道15系列新增了多项功能,您可以通过“<strong>新手引导教程</strong>”快速了解禅道的基本使用方法。</p><p>通过鼠标经过 [<span style='color: #0c60e1'>头像-新手引导</span>],点击新手引导,即可进入新手引导教程。</p>";
|
||||
$lang->misc->feature->themeDesc = "<p>禅道15系列上线了全新的“青春蓝”主题,页面呈现更加美观,体验更加友好。</p><p>通过鼠标经过 [<span style='color: #0c60e1'>头像-主题-青春蓝</span>],点击青春蓝,即可设置成功。</p>";
|
||||
|
||||
$lang->misc->releaseDate['15.8'] = '2021-11-19';
|
||||
$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06';
|
||||
$lang->misc->releaseDate['15.7.1'] = '2021-11-02';
|
||||
$lang->misc->releaseDate['15.7'] = '2021-10-18';
|
||||
$lang->misc->releaseDate['15.6'] = '2021-10-12';
|
||||
@@ -163,14 +163,14 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['15.8'][] = array('title' => '完善分支管理和细节。修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7.1'][] = array('title' => '修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7'][] = array('title' => '新增接口库。修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['15.6'][] = array('title' => '修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['15.5'][] = array('title' => '增加项目集/产品/项目看板视图、全局添加功能、新手引导。 修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['15.4'][] = array('title' => '修复Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.3'][] = array('title' => '实现界面风格改动和文档优化,修复Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.2'][] = array('title' => '优化新版本升级流程,增加执行看板。', 'desc' => '');
|
||||
$lang->misc->feature->all['16.0.beta1'][] = array('title' => '新增瀑布模型项目,新增任务看板,完善分支管理和细节,修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7.1'][] = array('title' => '修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['15.7'][] = array('title' => '新增接口库。修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['15.6'][] = array('title' => '修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['15.5'][] = array('title' => '增加项目集/产品/项目看板视图、全局添加功能、新手引导。 修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['15.4'][] = array('title' => '修复Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.3'][] = array('title' => '实现界面风格改动和文档优化,修复Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.2'][] = array('title' => '优化新版本升级流程,增加执行看板。', 'desc' => '');
|
||||
|
||||
$lang->misc->feature->all['15.0.3'][] = array('title' => '修复Bug', 'desc' => '');
|
||||
$lang->misc->feature->all['15.0.2'][] = array('title' => '修复Bug', 'desc' => '');
|
||||
|
||||
+11
-6
@@ -37,6 +37,9 @@ $lang->mr->gitlabID = 'GitLab';
|
||||
$lang->mr->repoID = 'Repo';
|
||||
$lang->mr->jobID = 'Compile job';
|
||||
|
||||
$lang->mr->canMerge = "Can merge";
|
||||
$lang->mr->cantMerge = "不可合并";
|
||||
|
||||
$lang->mr->approval = 'Approval';
|
||||
$lang->mr->approve = 'Approve';
|
||||
$lang->mr->reject = 'Reject';
|
||||
@@ -74,12 +77,14 @@ $lang->mr->mergeStatusList['checking'] = 'checking';
|
||||
$lang->mr->mergeStatusList['can_be_merged'] = 'can be merged';
|
||||
$lang->mr->mergeStatusList['cannot_be_merged'] = 'cannot be merged';
|
||||
|
||||
$lang->mr->description = 'Description';
|
||||
$lang->mr->confirmDelete = 'Are you sure to delete this merge request?';
|
||||
$lang->mr->sourceProject = 'Source project';
|
||||
$lang->mr->sourceBranch = 'Source branch';
|
||||
$lang->mr->targetProject = 'Target project';
|
||||
$lang->mr->targetBranch = 'Target branch';
|
||||
$lang->mr->description = 'Description';
|
||||
$lang->mr->confirmDelete = 'Are you sure to delete this merge request?';
|
||||
$lang->mr->sourceProject = 'Source project';
|
||||
$lang->mr->sourceBranch = 'Source branch';
|
||||
$lang->mr->targetProject = 'Target project';
|
||||
$lang->mr->targetBranch = 'Target branch';
|
||||
$lang->mr->noCompileJob = 'No Compile Job';
|
||||
$lang->mr->compileUnexecuted = 'Compile Unexecuted';
|
||||
|
||||
$lang->mr->notFound = "Merge Request does not exist!";
|
||||
$lang->mr->toCreatedMessage = "The merge request you submitted:<a href='%s'>%s</a>, the build task succeeded.";
|
||||
|
||||
@@ -9,14 +9,22 @@ function processKanbanData(key, programsData)
|
||||
var kanbanId = key;
|
||||
|
||||
/* Generate columns */
|
||||
var columns = [];
|
||||
var columns = [];
|
||||
var hasDoingProject = false;
|
||||
var executionsCol;
|
||||
$.each(kanbanColumns, function(_, column)
|
||||
{
|
||||
var colType = column.type;
|
||||
if(colType === 'doingProject') hasDoingProject = true;
|
||||
column = $.extend({}, column,
|
||||
{
|
||||
kanban: kanbanId,
|
||||
id: kanbanId + '-' + colType,
|
||||
parentType: (hasDoingProject && (colType === 'doingProject' || colType === 'doingExecution')) ? 'doing' : false,
|
||||
});
|
||||
|
||||
if(colType === 'doingProject')
|
||||
{
|
||||
hasDoingProject = true;
|
||||
columns.push(
|
||||
{
|
||||
kanban: kanbanId,
|
||||
@@ -27,12 +35,12 @@ function processKanbanData(key, programsData)
|
||||
count: ''
|
||||
});
|
||||
}
|
||||
columns.push($.extend({}, column,
|
||||
else if(colType === 'doingExecution')
|
||||
{
|
||||
kanban: kanbanId,
|
||||
id: kanbanId + '-' + colType,
|
||||
parentType: (hasDoingProject && (colType === 'doingProject' || colType === 'doingExecution')) ? 'doing' : false,
|
||||
}));
|
||||
executionsCol = column;
|
||||
executionsCol.count = 0;
|
||||
}
|
||||
columns.push(column);
|
||||
});
|
||||
|
||||
/* Format lanes data */
|
||||
@@ -76,6 +84,8 @@ function processKanbanData(key, programsData)
|
||||
|
||||
var execution = latestExecutions[projectID];
|
||||
if(!execution || !execution.id) return;
|
||||
|
||||
executionsCol.count++;
|
||||
projectItem.execution = $.extend({}, execution, {id: 'execution-' + execution.id, _id: execution.id});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -55,6 +55,7 @@ $lang->product->project = $lang->executionCommon . ' List';
|
||||
$lang->product->build = 'Build List';
|
||||
$lang->product->moreProduct = "More Product";
|
||||
$lang->product->projectInfo = "Projects that are linked to this {$lang->productCommon} are listed below.";
|
||||
$lang->product->progress = "Progress";
|
||||
|
||||
$lang->product->currentExecution = "Current Execution";
|
||||
$lang->product->activeStories = 'Active [S]';
|
||||
@@ -77,6 +78,7 @@ $lang->product->assignToNullBugs = 'Unassigned [B]';
|
||||
$lang->product->assignToNullBugsTitle = 'Unassigned Bugs';
|
||||
$lang->product->closedBugs = 'Closed Bug';
|
||||
$lang->product->bugFixedRate = 'Bug Repair rate';
|
||||
$lang->product->unfoldClosed = 'Unfold Closed';
|
||||
|
||||
$lang->product->confirmDelete = " Do you want to delete the {$lang->productCommon}?";
|
||||
$lang->product->errorNoProduct = "No {$lang->productCommon} is created yet!";
|
||||
|
||||
@@ -75,10 +75,10 @@ class productModel extends model
|
||||
*/
|
||||
public function select($products, $productID, $currentModule, $currentMethod, $extra = '', $branch = '', $module = 0, $moduleType = '', $withBranch = true)
|
||||
{
|
||||
$isBrowseBug = (strpos(',project,execution,', ",{$this->app->tab},") !== false and strpos(',bug,testcase,testtask,ajaxselectstory,', ",{$this->app->rawMethod},") !== false and isset($products[0])) ? true : false;
|
||||
$isQaModule = (strpos(',project,execution,', ",{$this->app->tab},") !== false and strpos(',bug,testcase,testtask,ajaxselectstory,', ",{$this->app->rawMethod},") !== false and isset($products[0])) ? true : false;
|
||||
|
||||
$this->app->loadLang('product');
|
||||
if(!$isBrowseBug and !$productID)
|
||||
if(!$isQaModule and !$productID)
|
||||
{
|
||||
unset($this->lang->product->menu->settings['subMenu']->branch);
|
||||
return;
|
||||
@@ -88,10 +88,13 @@ class productModel extends model
|
||||
setcookie("lastProduct", $productID, $this->config->cookieLife, $this->config->webRoot, '', $this->config->cookieSecure, true);
|
||||
if($productID) $currentProduct = $this->getById($productID);
|
||||
|
||||
if($isBrowseBug and $this->app->tab == 'project') $extra = $this->session->project;
|
||||
if($isBrowseBug and $this->app->tab == 'execution') $extra = $this->session->execution;
|
||||
if($isQaModule and $this->app->tab == 'project')
|
||||
{
|
||||
if($this->app->tab == 'project') $extra = $currentMethod == 'testcase' ? $extra : $this->session->project;
|
||||
if($this->app->tab == 'execution') $extra = $this->session->execution;
|
||||
}
|
||||
|
||||
if($isBrowseBug and !$productID)
|
||||
if($isQaModule and !$productID)
|
||||
{
|
||||
$currentProduct = new stdclass();
|
||||
$currentProduct->name = $products[$productID];
|
||||
@@ -102,7 +105,7 @@ class productModel extends model
|
||||
$output = '';
|
||||
if(!empty($products))
|
||||
{
|
||||
$dropMenuLink = helper::createLink($isBrowseBug ? 'bug' : 'product', 'ajaxGetDropMenu', "objectID=$productID&module=$currentModule&method=$currentMethod&extra=$extra");
|
||||
$dropMenuLink = helper::createLink($isQaModule ? 'bug' : 'product', 'ajaxGetDropMenu', "objectID=$productID&module=$currentModule&method=$currentMethod&extra=$extra");
|
||||
$output = "<div class='btn-group angle-btn'><div class='btn-group'><button data-toggle='dropdown' type='button' class='btn btn-limit' id='currentItem' title='{$currentProduct->name}'><span class='text'>{$currentProduct->name}</span> <span class='caret'></span></button><div id='dropMenu' class='dropdown-menu search-list' data-ride='searchList' data-url='$dropMenuLink'>";
|
||||
$output .= '<div class="input-control search-box has-icon-left has-icon-right search-example"><input type="search" class="form-control search-input" /><label class="input-control-icon-left search-icon"><i class="icon icon-search"></i></label><a class="input-control-icon-right search-clear-btn"><i class="icon icon-close icon-sm"></i></a></div>';
|
||||
$output .= "</div></div>";
|
||||
@@ -539,7 +542,7 @@ class productModel extends model
|
||||
if($currentModule == 'tree' and $currentMethod == 'browse') $isShowBranch = true;
|
||||
if($currentModule == 'product' and strpos($this->config->product->showBranchMethod, $currentMethod) !== false) $isShowBranch = true;
|
||||
if($this->app->tab == 'qa' and strpos(',testsuite,testreport,testtask,', ",$currentModule,") === false) $isShowBranch = true;
|
||||
if($this->app->tab == 'qa' and $currentModule == 'testtask' and strpos(',create,edit,', ",$currentMethod,") === false) $isShowBranch = true;
|
||||
if($this->app->tab == 'qa' and $currentModule == 'testtask' and strpos(',create,edit,browseunits,importunitresult,unitcases,', ",$currentMethod,") === false) $isShowBranch = true;
|
||||
if($isShowBranch)
|
||||
{
|
||||
$this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$currentProduct->type]);
|
||||
@@ -1978,7 +1981,19 @@ class productModel extends model
|
||||
elseif($module == 'testtask')
|
||||
{
|
||||
$extra = $method != 'browse' ? '' : "&extra=$extra";
|
||||
$link = helper::createLink($module, 'browse', "productID=%s" . ($branch ? "&branch=%s" : '&branch=0') . $extra);
|
||||
if(strtolower($method) == 'browseunits')
|
||||
{
|
||||
$methodName = 'browseUnits';
|
||||
$param = '&browseType=newest&orderBy=id_desc&recTotal=0&recPerPage=0&pageID=1';
|
||||
$param .= $this->app->tab == 'project' ? "&projectID={$this->session->project}" : '';
|
||||
}
|
||||
else
|
||||
{
|
||||
$methodName = 'browse';
|
||||
$param = ($branch ? "&branch=%s" : '&branch=0') . $extra;
|
||||
}
|
||||
|
||||
$link = helper::createLink($module, $methodName, "productID=%s" . $param);
|
||||
}
|
||||
elseif($module == 'bug' && $method == 'view')
|
||||
{
|
||||
@@ -1994,6 +2009,10 @@ class productModel extends model
|
||||
$projectID = isset($output['projectID']) ? $output['projectID'] : 0;
|
||||
$link = helper::createLink($module, $method, "productID=%s&branch=" . ($branch ? "%s" : '') . "&groupBy=&projectID=$projectID") . "#app=project";
|
||||
}
|
||||
elseif($module == 'testcase' and $method == 'browse')
|
||||
{
|
||||
$link = helper::createLink('testcase', 'browse', "productID=%s" . ($branch ? "&branch=%s" : '&branch=all') . "&browseType=$extra");
|
||||
}
|
||||
elseif($module == 'testreport' and ($method == 'create' or $method == 'edit'))
|
||||
{
|
||||
$vars = $method == 'edit' ? "objectID=%s" : "objectID=&objectType=testtask&extra=%s";
|
||||
@@ -2027,6 +2046,11 @@ class productModel extends model
|
||||
{
|
||||
return helper::createLink('design', 'browse', "productID=%s");
|
||||
}
|
||||
elseif($module == 'project' and $method == 'testcase')
|
||||
{
|
||||
$params = explode('|', $extra);
|
||||
return helper::createLink('project', 'testcase', "projectID={$params[0]}&productID=%s&branch=all&browseType={$params[1]}");
|
||||
}
|
||||
elseif($module == 'project' or $module == 'execution')
|
||||
{
|
||||
$objectID = $module == 'project' ? 'projectID' : 'executionID';
|
||||
|
||||
@@ -82,7 +82,7 @@ foreach($products as $programID => $programProducts)
|
||||
|
||||
if($product->status == 'normal' and $product->PO == $this->app->user->account)
|
||||
{
|
||||
$myProductsHtml .= '<li>' . html::a($linkHtml, $productName, '', "class='$selected productName' title='{$productName}' data-key='" . zget($productsPinYin, $product->name, '') . "' " . $locateTab) . '</li>';
|
||||
$myProductsHtml .= '<li>' . html::a($linkHtml, $productName, '', "class='$selected productName' title='{$productName}' data-key='" . zget($productsPinYin, $product->name, '') . "' data-app='$app->tab'") . '</li>';
|
||||
|
||||
if($selected == 'selected') $tabActive = 'myProduct';
|
||||
|
||||
|
||||
@@ -79,10 +79,12 @@ $lang->productplan->endList[93] = '3 Months';
|
||||
$lang->productplan->endList[186] = '6 Months';
|
||||
$lang->productplan->endList[365] = '1 Year';
|
||||
|
||||
$lang->productplan->errorNoTitle = 'ID %s title should not be empty.';
|
||||
$lang->productplan->errorNoBegin = 'ID %s begin time should not be empty.';
|
||||
$lang->productplan->errorNoEnd = 'ID %s end time should not be empty.';
|
||||
$lang->productplan->beginGeEnd = 'ID %s begin time should not be >= end time.';
|
||||
$lang->productplan->errorNoTitle = 'ID %s title should not be empty.';
|
||||
$lang->productplan->errorNoBegin = 'ID %s begin time should not be empty.';
|
||||
$lang->productplan->errorNoEnd = 'ID %s end time should not be empty.';
|
||||
$lang->productplan->beginGeEnd = 'ID %s begin time should not be >= end time.';
|
||||
$lang->productplan->beginLetterParent = "The start date of the parent plan: %s, the start date cannot be less than the start date of the parent plan.";
|
||||
$lang->productplan->endGreaterParent = "The completion date of the parent plan: %s, the completion date cannot be greater than the completion date of the parent plan.";
|
||||
|
||||
$lang->productplan->featureBar['browse']['all'] = 'All';
|
||||
$lang->productplan->featureBar['browse']['unexpired'] = 'Unexpired';
|
||||
|
||||
@@ -10,9 +10,17 @@ function processKanbanData(key, programsData)
|
||||
|
||||
/* Generate columns */
|
||||
var columns = [];
|
||||
var executionsCol;
|
||||
$.each(kanbanColumns, function(_, column)
|
||||
{
|
||||
var colType = column.type;
|
||||
column = $.extend({}, column,
|
||||
{
|
||||
kanban: kanbanId,
|
||||
id: kanbanId + '-' + column.type,
|
||||
parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false,
|
||||
});
|
||||
|
||||
if(colType === 'doingProject')
|
||||
{
|
||||
columns.push(
|
||||
@@ -25,13 +33,12 @@ function processKanbanData(key, programsData)
|
||||
count: ''
|
||||
});
|
||||
}
|
||||
|
||||
columns.push($.extend({}, column,
|
||||
else if(colType === 'doingExecution')
|
||||
{
|
||||
kanban: kanbanId,
|
||||
id: kanbanId + '-' + column.type,
|
||||
parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false,
|
||||
}));
|
||||
executionsCol = column;
|
||||
executionsCol.count = 0;
|
||||
}
|
||||
columns.push(column);
|
||||
});
|
||||
|
||||
/* Format lanes data */
|
||||
@@ -87,6 +94,8 @@ function processKanbanData(key, programsData)
|
||||
|
||||
var execution = project.execution;
|
||||
if(!execution || !execution.id) return;
|
||||
|
||||
executionsCol.count++;
|
||||
projectItem.execution = $.extend({}, execution, {id: 'execution-' + execution.id, _id: execution.id});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -449,7 +449,6 @@ class programModel extends model
|
||||
->where('t1.deleted')->eq('0')
|
||||
->beginIF($this->config->systemMode == 'new')->andWhere('t1.type')->eq('project')->fi()
|
||||
->beginIF($this->config->systemMode == 'new' and ($this->cookie->involved or $involved))->andWhere('t2.type')->eq('project')->fi()
|
||||
->beginIF($this->config->systemMode == 'new' and ($this->cookie->involved or $involved))->andWhere('t3.objectType')->eq('project')->fi()
|
||||
->beginIF($browseType != 'all' and $browseType != 'undone')->andWhere('t1.status')->eq($browseType)->fi()
|
||||
->beginIF($browseType == 'undone')->andWhere('t1.status')->in('wait,doing')->fi()
|
||||
->beginIF($path)->andWhere('t1.path')->like($path . '%')->fi()
|
||||
|
||||
@@ -51,12 +51,12 @@ $lang->programplan->exporting = 'Exporting';
|
||||
$lang->programplan->exportFail = 'Failed';
|
||||
$lang->programplan->hideCriticalPath = 'Hide Critical Path';
|
||||
$lang->programplan->showCriticalPath = 'Show Critical Path';
|
||||
$lang->programplan->errorEnd = "Project end date: %s, end date should be <= project end date.";
|
||||
$lang->programplan->errorBegin = "Project begin date: %s, begin date should be >= project begin date.";
|
||||
$lang->programplan->emptyBegin = '『Begin』should not be blank';
|
||||
$lang->programplan->emptyEnd = '『End』should not be blank';
|
||||
$lang->programplan->checkBegin = '『Begin』should be valid date';
|
||||
$lang->programplan->checkEnd = '『End』should be valid date';
|
||||
$lang->programplan->errorEnd = "Project end date: %s, end date should be <= project end date.";
|
||||
|
||||
$lang->programplan->milestoneList[1] = 'Yes';
|
||||
$lang->programplan->milestoneList[0] = 'No';
|
||||
|
||||
@@ -969,7 +969,9 @@ class project extends control
|
||||
$this->session->set('bugList', $this->app->getURI(true), 'project');
|
||||
|
||||
$products = array('0' => $this->lang->product->all) + $this->product->getProducts($projectID, 'all', '', false);
|
||||
$this->lang->modulePageNav = $this->product->select($products, $productID, 'project', 'testcase', '', $branch, 0, '', false);
|
||||
|
||||
$extra = "$projectID|$browseType";
|
||||
$this->lang->modulePageNav = $this->product->select($products, $productID, 'project', 'testcase', $extra, $branch, 0, '', false);
|
||||
|
||||
echo $this->fetch('testcase', 'browse', "productID=$productID&branch=$branch&browseType=$browseType¶m=$param&orderBy=$orderBy&recTotal=$orderBy&recPerPage=$recPerPage&pageID=$pageID&projectID=$projectID");
|
||||
}
|
||||
|
||||
+26
-17
@@ -10,9 +10,17 @@ function processKanbanData(key, programGroup)
|
||||
|
||||
/* Generate columns */
|
||||
var columns = [];
|
||||
var executionsCol;
|
||||
$.each(kanbanColumns, function(_, column)
|
||||
{
|
||||
var colType = column.type;
|
||||
column = $.extend({}, column,
|
||||
{
|
||||
kanban: kanbanId,
|
||||
id: kanbanId + '-' + column.type,
|
||||
parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false,
|
||||
});
|
||||
|
||||
if(colType === 'doingProject')
|
||||
{
|
||||
columns.push(
|
||||
@@ -25,13 +33,13 @@ function processKanbanData(key, programGroup)
|
||||
count: ''
|
||||
});
|
||||
}
|
||||
|
||||
columns.push($.extend({}, column,
|
||||
else if(colType === 'doingExecution')
|
||||
{
|
||||
kanban: kanbanId,
|
||||
id: kanbanId + '-' + column.type,
|
||||
parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false,
|
||||
}));
|
||||
executionsCol = column;
|
||||
executionsCol.count = 0;
|
||||
}
|
||||
|
||||
columns.push(column);
|
||||
});
|
||||
/* Format lanes data */
|
||||
var lanes = [];
|
||||
@@ -58,6 +66,7 @@ function processKanbanData(key, programGroup)
|
||||
var execution = latestExecutions[projectID];
|
||||
if(execution && execution.id)
|
||||
{
|
||||
executionsCol.count++;
|
||||
projectItem.execution = $.extend({}, execution, {id: 'execution-' + execution.id, _id: execution.id});
|
||||
}
|
||||
}
|
||||
@@ -72,6 +81,15 @@ function processKanbanData(key, programGroup)
|
||||
return {id: kanbanId, columns: columns, lanes: lanes};
|
||||
}
|
||||
|
||||
/** Define kanban d-n-d rules */
|
||||
var projectDropRules =
|
||||
{
|
||||
waitProject: ['doingProject', 'closedProject'],
|
||||
doingProject: ['closedProject'],
|
||||
closedProject: ['doingProject'],
|
||||
};
|
||||
window.kanbanDropRules = {my: projectDropRules, other: projectDropRules};
|
||||
|
||||
/*
|
||||
* Find drop columns
|
||||
* @param {JQuery} $element Drag element
|
||||
@@ -145,13 +163,6 @@ function changeCardColType(card, fromColType, toColType, kanbanID)
|
||||
var modalTrigger = new $.zui.ModalTrigger({type: 'iframe', width: '80%', url: link});
|
||||
modalTrigger.show();
|
||||
}
|
||||
|
||||
/*
|
||||
// TODO: The server must return a updated kanban data 服务器返回更新后的看板数据
|
||||
|
||||
// 调用 updateKanban 更新看板数据
|
||||
updateKanban(kanbanID, newKanbanData);
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -161,7 +172,7 @@ function changeCardColType(card, fromColType, toColType, kanbanID)
|
||||
*/
|
||||
function handleFinishDrop(event)
|
||||
{
|
||||
var $card = $(event.element); // The drag card
|
||||
var $card = $(event.element).closest('.kanban-item'); // The drag card
|
||||
var $dragCol = $card.closest('.kanban-lane-col');
|
||||
var $dropCol = $(event.target);
|
||||
|
||||
@@ -171,8 +182,6 @@ function handleFinishDrop(event)
|
||||
var toColType = $dropCol.data('type');
|
||||
var kanbanID = $card.closest('.kanban').data('id');
|
||||
|
||||
if(fromColType == 'doingProject') card = $card.parent().parent().data('item');
|
||||
|
||||
changeCardColType(card, fromColType, toColType, kanbanID);
|
||||
}
|
||||
|
||||
@@ -197,7 +206,7 @@ $(function()
|
||||
virtualize: true,
|
||||
droppable:
|
||||
{
|
||||
selector: '.kanban-item:not(.execution-item)',
|
||||
selector: '.kanban-card:not(.execution-item)',
|
||||
target: findDropColumns,
|
||||
finish: handleFinishDrop,
|
||||
mouseButton: 'left'
|
||||
|
||||
@@ -180,9 +180,6 @@ $lang->project->createExecution = "There is no {$lang->executionCommon} u
|
||||
$lang->project->unlinkExecutionMember = "The user participated in %s executions such as %s%s. Do you want to remove the user from those executions as well? (The data related to this user will not be deleted.)";
|
||||
$lang->project->unlinkExecutionMembers = "The team members you are removing are also in the execution team of this project. Do you want to remove them from the execution team too?";
|
||||
|
||||
$lang->project->realEndNotEmpty = 'Actual End should not be empty.';
|
||||
$lang->project->realEndNotFuture = 'Actual End should be < = today.';
|
||||
|
||||
$lang->project->tenThousand = '';
|
||||
|
||||
$lang->project->unitList['CNY'] = 'RMB';
|
||||
|
||||
@@ -56,7 +56,7 @@ $lang->release->createdBugs = '本次共遗留 %s 个Bug';
|
||||
$lang->release->export = '导出HTML';
|
||||
$lang->release->yesterday = '昨日发布';
|
||||
$lang->release->all = '所有';
|
||||
$lang->release->notify = '通知';
|
||||
$lang->release->notify = '发送通知';
|
||||
$lang->release->notifyUsers = '通知人员';
|
||||
$lang->release->mailto = '抄送给';
|
||||
$lang->release->mailContent = '<p>尊敬的用户,您好!</p><p style="margin-left: 30px;">您反馈的如下需求和Bug已经在 %s版本中发布,请联系客户经理查看最新版本。</p>';
|
||||
|
||||
@@ -112,6 +112,7 @@ $lang->report->proVersion = '<a href="https://api.zentao.net/goto.php?item=pr
|
||||
$lang->report->proVersionEn = '<a href="http://api.zentao.pm/goto.php?item=proversion&from=reportpage" target="_blank">Try ZenTao Pro for more!</a>';
|
||||
$lang->report->workloadDesc = '工作负载=用户所有任务剩余工时之和/选择的时间天数*每天的工时。例如:起止时间设为1月1日~1月7日、工作日天数5天、每天工时8h,统计的是所有指派给该人员的未完成的任务,在5天内,每天8h的情况下的工作负载。';
|
||||
|
||||
|
||||
$lang->report->annualData = new stdclass();
|
||||
$lang->report->annualData->title = "%s %s年工作汇总";
|
||||
$lang->report->annualData->exportByZentao = "由禅道系统导出";
|
||||
|
||||
@@ -250,6 +250,7 @@ $lang->story->legendChildStories = 'Child Stories';
|
||||
$lang->story->legendSpec = 'Description';
|
||||
$lang->story->legendVerify = 'Acceptance';
|
||||
$lang->story->legendMisc = 'Misc.';
|
||||
$lang->story->legendInformation = 'Story Information';
|
||||
|
||||
$lang->story->lblChange = 'Change';
|
||||
$lang->story->lblReview = 'Review';
|
||||
|
||||
@@ -25,6 +25,7 @@ $lang->task->delayed = 'Delayed';
|
||||
$lang->task->view = "Task Detail";
|
||||
$lang->task->logEfforts = "Effort";
|
||||
$lang->task->record = "Estimates";
|
||||
$lang->task->teamConsumed = "Tean Consumed";
|
||||
$lang->task->start = "Start";
|
||||
$lang->task->startAction = "Start Task";
|
||||
$lang->task->restart = "Continue";
|
||||
@@ -197,6 +198,7 @@ $lang->task->legendBasic = 'Basic Info';
|
||||
$lang->task->legendEffort = 'Effort';
|
||||
$lang->task->legendLife = 'Task Life';
|
||||
$lang->task->legendDesc = 'Task Description';
|
||||
$lang->task->legendDetail = 'Task Detail';
|
||||
|
||||
$lang->task->confirmDelete = "Do you want to delete this task?";
|
||||
$lang->task->confirmDeleteEstimate = "Do you want to delete it?";
|
||||
|
||||
@@ -131,7 +131,7 @@ class testcase extends control
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->qa->setMenu($this->products, $productID, $branch);
|
||||
$this->qa->setMenu($this->products, $productID, $branch, $browseType);
|
||||
}
|
||||
|
||||
$uri = $this->app->getURI(true);
|
||||
@@ -1365,6 +1365,12 @@ class testcase extends control
|
||||
*/
|
||||
public function export($productID, $orderBy, $taskID = 0, $browseType = '')
|
||||
{
|
||||
if(strpos($orderBy, 'case') !== false)
|
||||
{
|
||||
list($field, $sort) = explode('_', $orderBy);
|
||||
$orderBy = '`' . $field . '`_' . $sort;
|
||||
}
|
||||
|
||||
$product = $this->loadModel('product')->getById($productID);
|
||||
if($product->type != 'normal') $this->lang->testcase->branch = $this->lang->product->branchName[$product->type];
|
||||
if($_POST)
|
||||
@@ -1847,11 +1853,16 @@ class testcase extends control
|
||||
$caseLang = $this->lang->testcase;
|
||||
$caseConfig = $this->config->testcase;
|
||||
$branches = $this->loadModel('branch')->getPairs($productID);
|
||||
$modules = $this->loadModel('tree')->getOptionMenu($productID, 'case', 0, empty($branches) ? 0 : array_keys($branches));
|
||||
$stories = $this->loadModel('story')->getProductStoryPairs($productID, $branch);
|
||||
$fields = $this->testcase->getImportFields($productID);
|
||||
$fields = array_flip($fields);
|
||||
|
||||
$branchModules = $this->loadModel('tree')->getOptionMenu($productID, 'case', 0, empty($branches) ? array(0) : array_keys($branches));
|
||||
foreach($branchModules as $branchID => $moduleList)
|
||||
{
|
||||
foreach($moduleList as $moduleID => $moduleName) $modules[$moduleID] = $moduleName;
|
||||
}
|
||||
|
||||
if(!empty($maxImport) and file_exists($tmpFile))
|
||||
{
|
||||
$data = unserialize(file_get_contents($tmpFile));
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
<div class="main-header">
|
||||
<h2>
|
||||
<?php echo $lang->testcase->batchCreate;?>
|
||||
<?php if($this->session->currentProductType !== 'normal' and $branch !== 'all') echo '<span class="label label-info">' . $branches[$branch] . '</span>';?>
|
||||
<?php if($story):?>
|
||||
<small class='text' title='<?php echo $story->title ?>'><?php echo $lang->arrow . $story->title ?></small>
|
||||
<?php endif;?>
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
<?php
|
||||
if(!isonlybody()) common::printIcon('testcase', 'edit',"caseID=$case->id", $case, 'button', '', '', 'showinonlybody');
|
||||
if(!$isLibCase and $case->auto != 'unit') common::printIcon('testcase', 'create', "productID=$case->product&branch=$case->branch&moduleID=$case->module&from=testcase¶m=$case->id", $case, 'button', 'copy');
|
||||
if($isLibCase and common::hasPriv('caselib', 'createCase')) echo html::a($this->createLink('caselib', 'createCase', "libID=$case->lib&moduleID=$case->module¶m=$case->id", $case), "<i class='icon-copy'></i>", '', "class='btn' title='{$lang->testcase->copy}'");
|
||||
if($isLibCase and common::hasPriv('caselib', 'createCase')) echo html::a($this->createLink('caselib', 'createCase', "libID=$case->lib&moduleID=$case->module¶m=$case->id"), "<i class='icon-copy'></i>", '', "class='btn' title='{$lang->testcase->copy}'");
|
||||
common::printIcon('testcase', 'delete', "caseID=$case->id", $case, 'button', 'trash', 'hiddenwin', '');
|
||||
?>
|
||||
<?php endif;?>
|
||||
|
||||
@@ -250,6 +250,7 @@ class testreport extends control
|
||||
|
||||
$execution = $this->execution->getById($executionID);
|
||||
$tasks = $this->testtask->getExecutionTasks($executionID);
|
||||
$task = $objectID ? $this->testtask->getById($objectID) : key($tasks);
|
||||
$owners = array();
|
||||
$buildIdList = array();
|
||||
$productIdList = array();
|
||||
@@ -287,8 +288,8 @@ class testreport extends control
|
||||
$builds = $this->build->getByList($buildIdList);
|
||||
$stories = !empty($builds) ? $this->testreport->getStories4Test($builds) : $this->story->getExecutionStories($execution->id);;
|
||||
|
||||
$begin = !empty($begin) ? date("Y-m-d", strtotime($begin)) : $execution->begin;
|
||||
$end = !empty($end) ? date("Y-m-d", strtotime($end)) : $execution->end;
|
||||
$begin = !empty($begin) ? date("Y-m-d", strtotime($begin)) : $task->begin;
|
||||
$end = !empty($end) ? date("Y-m-d", strtotime($end)) : $task->end;
|
||||
$owner = current($owners);
|
||||
$bugs = $this->testreport->getBugs4Test($builds, $productIdList, $begin, $end, 'execution');
|
||||
|
||||
|
||||
@@ -175,7 +175,7 @@ class testtask extends control
|
||||
}
|
||||
|
||||
$this->loadModel('project')->setMenu($this->session->project);
|
||||
$this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', "projectID=$projectID");
|
||||
$this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', "projectID=$projectID", '', 0, '', false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -365,7 +365,7 @@ class testtask extends control
|
||||
$this->lang->scrum->menu->qa['subMenu']->testcase['subModule'] = 'testtask';
|
||||
$this->lang->scrum->menu->qa['subMenu']->testtask['subModule'] = '';
|
||||
$this->loadModel('project')->setMenu($this->session->project);
|
||||
$this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits');
|
||||
$this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', '', '', 0, '', false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1365,7 +1365,7 @@ class testtask extends control
|
||||
->andWhere('`case`')->in($this->post->caseIDList)
|
||||
->exec();
|
||||
$this->loadModel('action');
|
||||
foreach($this->post->caseIDList as $caseID) $this->action->create('case', $caseID, 'assigned', '', $taskID);
|
||||
foreach($this->post->caseIDList as $caseID) $this->action->create('case', $caseID, 'assigned', '', $this->post->assignedTo);
|
||||
die(js::locate($this->session->caseList, 'parent'));
|
||||
}
|
||||
|
||||
@@ -1394,7 +1394,7 @@ class testtask extends control
|
||||
$this->lang->scrum->menu->qa['subMenu']->testcase['subModule'] = 'testtask';
|
||||
$this->lang->scrum->menu->qa['subMenu']->testtask['subModule'] = '';
|
||||
$this->loadModel('project')->setMenu($this->session->project);
|
||||
$this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits');
|
||||
$this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', '', '', 0, '', false);
|
||||
|
||||
/* Replace language. */
|
||||
$project = $this->project->getByID($this->session->project);
|
||||
|
||||
@@ -37,9 +37,11 @@ $lang->testtask->next = 'Next';
|
||||
$lang->testtask->start = "Start";
|
||||
$lang->testtask->close = "Close";
|
||||
$lang->testtask->wait = "Waiting";
|
||||
$lang->testtask->waitAB = "Waiting";
|
||||
$lang->testtask->block = "Block";
|
||||
$lang->testtask->activate = "Activate";
|
||||
$lang->testtask->testing = "Testing";
|
||||
$lang->testtask->testingAB = "Testing";
|
||||
$lang->testtask->blocked = "Blocked";
|
||||
$lang->testtask->done = "Tested";
|
||||
$lang->testtask->totalStatus = "All";
|
||||
@@ -116,10 +118,9 @@ $lang->testtask->statusList['doing'] = 'Doing';
|
||||
$lang->testtask->statusList['done'] = 'Closed';
|
||||
$lang->testtask->statusList['blocked'] = 'Blocked';
|
||||
|
||||
$lang->testtask->priList[0] = '';
|
||||
$lang->testtask->priList[3] = '3';
|
||||
$lang->testtask->priList[1] = '1';
|
||||
$lang->testtask->priList[2] = '2';
|
||||
$lang->testtask->priList[3] = '3';
|
||||
$lang->testtask->priList[4] = '4';
|
||||
|
||||
$lang->testtask->unlinkedCases = 'Unlinked Case';
|
||||
|
||||
@@ -72,12 +72,11 @@ class testtaskModel extends model
|
||||
{
|
||||
$products = $scopeAndStatus[0] == 'all' ? $this->app->user->view->products : array();
|
||||
|
||||
return $this->dao->select("t1.*, t2.name AS productName, t3.name AS executionName, t4.name AS buildName, if(t4.name != '', t4.branch, t5.branch) AS branch")
|
||||
return $this->dao->select("t1.*, t2.name AS productName, t3.name AS executionName, t4.name AS buildName, t4.branch AS branch")
|
||||
->from(TABLE_TESTTASK)->alias('t1')
|
||||
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id')
|
||||
->leftJoin(TABLE_EXECUTION)->alias('t3')->on('t1.execution = t3.id')
|
||||
->leftJoin(TABLE_BUILD)->alias('t4')->on('t1.build = t4.id')
|
||||
->leftJoin(TABLE_PROJECTPRODUCT)->alias('t5')->on('t1.execution = t5.project and t1.product = t5.product')
|
||||
|
||||
->where('t1.deleted')->eq(0)
|
||||
->andWhere('t1.auto')->ne('unit')
|
||||
@@ -86,7 +85,7 @@ class testtaskModel extends model
|
||||
->beginIF($scopeAndStatus[0] == 'all')->andWhere('t1.product')->in($products)->fi()
|
||||
->beginIF(strtolower($scopeAndStatus[1]) == 'totalstatus')->andWhere('t1.status')->in('blocked,doing,wait,done')->fi()
|
||||
->beginIF(strtolower($scopeAndStatus[1]) != 'totalstatus')->andWhere('t1.status')->eq($scopeAndStatus[1])->fi()
|
||||
->beginIF($branch !== 'all')->andWhere("if(t4.branch, t4.branch, t5.branch) = '$branch'")->fi()
|
||||
->beginIF($branch !== 'all')->andWhere('t4.branch')->eq($branch)->fi()
|
||||
->beginIF($beginTime)->andWhere('t1.begin')->ge($beginTime)->fi()
|
||||
->beginIF($endTime)->andWhere('t1.end')->le($endTime)->fi()
|
||||
->orderBy($orderBy)
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
<div class='btn-toolbar pull-right'>
|
||||
<?php
|
||||
common::printIcon('testtask', 'linkCase', "taskID=$task->id", $task, 'button', 'link');
|
||||
common::printIcon('testcase', 'export', "productID=$productID&orderBy=`case`_desc&taskID=$task->id", '', 'button', '', '', 'export');
|
||||
common::printIcon('testcase', 'export', "productID=$productID&orderBy=case_desc&taskID=$task->id", '', 'button', '', '', 'export');
|
||||
common::printIcon('testtask', 'report', "productID=$productID&taskID=$task->id&browseType=$browseType&branchID=$task->branch&moduleID=" . (empty($moduleID) ? '' : $moduleID));
|
||||
common::printIcon('testtask', 'view', "taskID=$task->id", '', 'button', 'list-alt');
|
||||
common::printBack($this->session->testtaskList, 'btn btn-link');
|
||||
|
||||
@@ -392,7 +392,7 @@ class upgrade extends control
|
||||
foreach($projectProducts as $projectProduct)
|
||||
{
|
||||
$data = new stdclass();
|
||||
$data->project = $projectList[$projectProduct->project];
|
||||
$data->project = $_POST['projectType'] == 'execution' ? $projectList : $projectList[$projectProduct->project];
|
||||
$data->product = $projectProduct->product;
|
||||
$data->plan = $projectProduct->plan;
|
||||
$data->branch = $projectProduct->branch;
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+3
-3
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Executable → Regular
Executable → Regular
@@ -8,6 +8,11 @@ $lang->resource->setting->xuanxuan = 'xuanxuan';
|
||||
$lang->setting->methodOrder[26] = 'xuanxuan';
|
||||
|
||||
$lang->resource->im = new stdclass();
|
||||
$lang->resource->im->getChatUsers = 'getChatUsers';
|
||||
$lang->resource->im->getChatGroups = 'getChatGroups';
|
||||
$lang->resource->im->notifyMSG = 'notifyMSG';
|
||||
$lang->resource->im->sendNotification = 'sendNotification';
|
||||
$lang->resource->im->sendChatMessage = 'sendChatMessage';
|
||||
$lang->resource->im->downloadXxdPackage = 'downloadXXD';
|
||||
|
||||
$lang->resource->client = new stdclass();
|
||||
|
||||
@@ -8,6 +8,11 @@ $lang->resource->setting->xuanxuan = 'xuanxuan';
|
||||
$lang->setting->methodOrder[26] = 'xuanxuan';
|
||||
|
||||
$lang->resource->im = new stdclass();
|
||||
$lang->resource->im->getChatUsers = 'getChatUsers';
|
||||
$lang->resource->im->getChatGroups = 'getChatGroups';
|
||||
$lang->resource->im->notifyMSG = 'notifyMSG';
|
||||
$lang->resource->im->sendNotification = 'sendNotification';
|
||||
$lang->resource->im->sendChatMessage = 'sendChatMessage';
|
||||
$lang->resource->im->downloadXxdPackage = 'downloadXXD';
|
||||
|
||||
$lang->resource->client = new stdclass();
|
||||
|
||||
@@ -14,4 +14,3 @@ $config->im->cards['task']['view'] = array('width' => '700px', 'height' => '
|
||||
$config->im->cards['doc']['view'] = array('width' => '700px', 'height' => '500px');
|
||||
$config->im->cards['story']['view'] = array('width' => '700px', 'height' => '500px');
|
||||
$config->im->cards['testcase']['view'] = array('width' => '700px', 'height' => '500px');
|
||||
$config->im->cards['productplan']['view'] = array('width' => '700px', 'height' => '447px');
|
||||
|
||||
@@ -7,6 +7,11 @@ $lang->im->xxdServer = 'ZenTao Server';
|
||||
$lang->im->downloadXXD = 'Download XXD';
|
||||
$lang->im->zentaoIntegrate = 'ZenTao Integrated';
|
||||
$lang->im->zentaoClient = 'ZenTao Desktop is added!';
|
||||
$lang->im->getChatUsers = 'Get Chat Users';
|
||||
$lang->im->getChatGroups = 'Get Chat Groups';
|
||||
$lang->im->notifyMSG = 'Notification';
|
||||
$lang->im->sendNotification = 'Push message to notification Center';
|
||||
$lang->im->sendChatMessage = 'Push messages to the discussion group';
|
||||
|
||||
$lang->im->createBug = 'Create Bug';
|
||||
$lang->im->createDoc = 'Create Doc';
|
||||
|
||||
@@ -7,6 +7,11 @@ $lang->im->xxdServer = '禅道服务器';
|
||||
$lang->im->downloadXXD = '下载喧喧服务端';
|
||||
$lang->im->zentaoIntegrate = '禅道集成';
|
||||
$lang->im->zentaoClient = '新增禅道客户端!';
|
||||
$lang->im->getChatUsers = '获取用户';
|
||||
$lang->im->getChatGroups = '获取讨论组';
|
||||
$lang->im->notifyMSG = '消息通知';
|
||||
$lang->im->sendNotification = '向通知中心推送通知消息';
|
||||
$lang->im->sendChatMessage = '向指定的讨论组推送通知消息';
|
||||
|
||||
$lang->im->createBug = '创建 Bug';
|
||||
$lang->im->createDoc = '创建文档';
|
||||
|
||||
Executable → Regular
@@ -1,39 +0,0 @@
|
||||
<?php
|
||||
include '../../control.php';
|
||||
class myIndex extends index
|
||||
{
|
||||
/**
|
||||
* The index page of whole zentao system.
|
||||
*
|
||||
* @param string $open
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function index($open = '')
|
||||
{
|
||||
if(strpos($_SERVER['HTTP_USER_AGENT'], 'xuanxuan') != false)
|
||||
{
|
||||
$this->view->pageBodyClass = 'xxc-embed';
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->loadModel('im');
|
||||
|
||||
$xuanConfig = new stdclass();
|
||||
$token = $this->im->userGetAuthToken($this->app->user->id, 'zentaoweb');
|
||||
$clientUrl = isset($this->config->webClientUrl) ? $this->config->webClientUrl : 'data/xuanxuan/web/';
|
||||
|
||||
$xuanConfig->clientUrl = $clientUrl;
|
||||
$xuanConfig->server = $this->im->getServer('zentao');
|
||||
$xuanConfig->account = $this->app->user->account;
|
||||
$xuanConfig->authKey = $token->token;
|
||||
$xuanConfig->debug = $this->config->debug;
|
||||
$xuanConfig->serverTime = (int)(microtime(true) * 1000);
|
||||
$xuanConfig->serverNowTime = (int)round(time() / $tokenAuthWindow);
|
||||
|
||||
$this->view->xuanConfig = $xuanConfig;
|
||||
}
|
||||
|
||||
return parent::index($open);
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
<?php if(strpos($_SERVER['HTTP_USER_AGENT'], 'xuanxuan') != false): ?>
|
||||
<style>
|
||||
#menu {display: none!important;}
|
||||
#appsBar,
|
||||
#apps {left: 0!important;}
|
||||
</style>
|
||||
<script>
|
||||
$('html').addClass('xxc-embed');
|
||||
|
||||
/** Update zentao client app menu */
|
||||
function updateAppMenu()
|
||||
{
|
||||
const menuItems = appsMenuItems.map(function(item)
|
||||
{
|
||||
if (item === 'divider') return '-';
|
||||
var $title = $('<div>' + item.title + '</div>');
|
||||
return [item.code, ($title.find('.icon').attr('class') || '').replace('icon ', ''),$title.text().trim()];
|
||||
});
|
||||
window.open('xxc://extension.zentao-integrated.updateAppMenu/' + encodeURIComponent(JSON.stringify(menuItems)));
|
||||
}
|
||||
|
||||
updateAppMenu();
|
||||
|
||||
$(function()
|
||||
{
|
||||
$(document).on('showapp', function(e, app)
|
||||
{
|
||||
window.open('xxc://extension.zentao-integrated.activeAppMenuItem/' + app.code);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if(isset($xuanConfig)): ?>
|
||||
<style>
|
||||
#chatBtn {padding: 3px; position: relative;}
|
||||
#chatBtn .icon {font-size: 24px;}
|
||||
#chatNoticeBadge {position: absolute; top: -4px; right: -2px; line-height: 14px; height: 14px; width: 14px; text-align: center; display: block; font-size: 12px; border-radius: 50%; opacity: 0; transform: scale(0); transition: .2s; transition-property: transform, opacity;}
|
||||
#chatNoticeBadge.show {opacity: 1; transform: scale(1);}
|
||||
#xx-embed-container {bottom: 40px!important; z-index: 1010!important;}
|
||||
#xx-embed-container .xx-embed-has-animation {transition-property: transform, opacity!important;}
|
||||
#xx-embed-container .xx-embed {width: 280px; height: 100%;}
|
||||
#xx-embed-container .xx-embed.xx-embed-collapsed {width: 280px!important; height: 100%!important; opacity: 0; pointer-events: none; transform: translateY(100%);}
|
||||
</style>
|
||||
<?php js::import($webRoot . 'data/xuanxuan/sdk/sdk.min.js'); ?>
|
||||
<?php js::import($jsRoot . 'md5.js'); ?>
|
||||
<?php js::set('xuanConfig', $xuanConfig); ?>
|
||||
<script>
|
||||
function showXuanClient()
|
||||
{
|
||||
if(!window.xuan.shown) window.xuan.show();
|
||||
else window.xuan.toggleCollapse();
|
||||
}
|
||||
|
||||
function handleXuanNoticeChange(notice)
|
||||
{
|
||||
$('#chatNoticeBadge').toggleClass('show', !!notice.count).text(notice.count);
|
||||
}
|
||||
|
||||
Xuanxuan.setGlobalOptions(
|
||||
{
|
||||
position: 'right',
|
||||
width: 280,
|
||||
preload: true,
|
||||
showHeader: false,
|
||||
onNotice: handleXuanNoticeChange
|
||||
});
|
||||
|
||||
var $chatBtn = $('<a href="javascript:void(0)" id="chatBtn" class="btn btn-link"><i class="text-primary icon icon-chat"></i><span class="badge bg-red" id="chatNoticeBadge"></span></a>');
|
||||
$chatBtn.insertBefore('#globalSearchDiv').on('click', showXuanClient);
|
||||
window.xuan = new Xuanxuan(xuanConfig);
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
$config->message->available['xuanxuan']['story'] = $config->message->objectTypes['story'];
|
||||
$config->message->available['xuanxuan']['task'] = $config->message->objectTypes['task'];
|
||||
$config->message->available['xuanxuan']['bug'] = $config->message->objectTypes['bug'];
|
||||
$config->message->available['xuanxuan']['todo'] = $config->message->objectTypes['todo'];
|
||||
$config->message->setting['xuanxuan']['setting'] = $config->message->available['xuanxuan'];
|
||||
$config->message->available['xuanxuan']['story'] = $config->message->objectTypes['story'];
|
||||
$config->message->available['xuanxuan']['task'] = $config->message->objectTypes['task'];
|
||||
$config->message->available['xuanxuan']['bug'] = $config->message->objectTypes['bug'];
|
||||
$config->message->available['xuanxuan']['todo'] = $config->message->objectTypes['todo'];
|
||||
$config->message->available['xuanxuan']['release'] = $config->message->objectTypes['release'];
|
||||
$config->message->setting['xuanxuan']['setting'] = $config->message->available['xuanxuan'];
|
||||
|
||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
-4
File diff suppressed because one or more lines are too long
Binary file not shown.
Reference in New Issue
Block a user