Merge branch 'master' into zenops_41

This commit is contained in:
caoyanyi
2022-08-11 16:04:36 +08:00
60 changed files with 4384 additions and 134 deletions
+1 -1
View File
@@ -1 +1 @@
17.4
17.5
+19 -5
View File
@@ -140,7 +140,8 @@ class userEntry extends Entry
break;
case 'execution':
$info->execution = array('total' => 0, 'executions' => array());
if(!common::hasPriv('my', 'execution')) break;
if(!common::hasPriv('my', 'work')) break;
$this->config->openMethods[] = 'my.execution';
$control = $this->loadController('my', 'execution');
$control->execution($this->param('type', 'undone'), $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
@@ -193,6 +194,7 @@ class userEntry extends Entry
case 'task':
$info->task = array('total' => 0, 'tasks' => array());
if(!common::hasPriv('my', 'work')) break;
$this->config->openMethods[] = 'my.task';
$control = $this->loadController('my', 'task');
$control->task($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
@@ -208,6 +210,7 @@ class userEntry extends Entry
case 'bug':
$info->bug = array('total' => 0, 'bugs' => array());
if(!common::hasPriv('my', 'work')) break;
$this->config->openMethods[] = 'my.bug';
$control = $this->loadController('my', 'bug');
$control->bug($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
@@ -264,6 +267,7 @@ class userEntry extends Entry
case 'story':
$info->story = array('total' => 0, 'stories' => array());
if(!common::hasPriv('my', 'work')) break;
$this->config->openMethods[] = 'my.story';
$control = $this->loadController('my', 'story');
$control->story($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
@@ -289,6 +293,7 @@ class userEntry extends Entry
if($this->config->edition == 'max')
{
$this->config->openMethods[] = 'my.issue';
$control = $this->loadController('my', 'issue');
$control->issue('createdBy', 0, 'id_desc', 0, $this->param('limit', 5), 1);
$data = $this->getData();
@@ -306,6 +311,7 @@ class userEntry extends Entry
if($this->config->edition == 'max')
{
$this->config->openMethods[] = 'my.risk';
$control = $this->loadController('my', 'risk');
$control->risk('createdBy', 0, 'id_desc', 0, $this->param('limit', 5), 1);
$data = $this->getData();
@@ -323,6 +329,7 @@ class userEntry extends Entry
if($this->config->edition == 'max')
{
$this->config->openMethods[] = 'my.myMeeting';
$control = $this->loadController('my', 'myMeeting');
$control->myMeeting('all', '', 'id_desc', 0, $this->param('limit', 5), 1);
$data = $this->getData();
@@ -375,14 +382,21 @@ class userEntry extends Entry
$oldUser = $this->loadModel('user')->getByID($userID, 'id');
/* Set $_POST variables. */
$fields = 'dept,realname,email,commiter,gender,role,mobile,phone,visions,groups';
$fields = 'dept,realname,role,join,type,visions,mobile,phone,qq,dingding,weixin,skype,whatsapp,slack,address,address,email,commiter,gender,groups,passwordStrength,locked,fails,birthday';
$this->batchSetPost($fields, $oldUser);
$this->setPost('account', $oldUser->account);
if($this->request('gender') and !in_array($this->request('gender'), array('f', 'm'))) return $this->sendError(400, "The value of gendar must be 'f' or 'm'");
$userGroups = $this->dao->select('`group`')->from(TABLE_USERGROUP)->where('account')->eq($oldUser->account)->fetchPairs('group', 'group');
$this->setPost('groups', $this->request('groups', zget($_POST, 'groups', array_values($userGroups))));
$this->setPost('password1', $this->request('password', ''));
$this->setPost('password2', $this->request('password', ''));
$gender = $this->request('gender', zget($_POST, 'gender', 'f'));
if(!in_array($gender, array('f', 'm'))) return $this->sendError(400, "The value of gender must be 'f' or 'm'");
if($this->request('gender') and !in_array($this->request('gender'), array('f', 'm'))) return $this->sendError(400, "The value of gendar must be 'f' or 'm'");
$this->setPost('gender', $gender);
$password = $this->request('password', zget($_POST, 'password', ''));
$this->setPost('password1', md5($password));
$this->setPost('password2', md5($password));
$this->setPost('verifyPassword', md5($this->app->user->password . $this->app->session->rand));
$control = $this->loadController('user', 'edit');
+5 -3
View File
@@ -55,21 +55,23 @@ class usersEntry extends entry
*/
public function post()
{
$fields = 'account,dept,realname,email,commiter,gender';
$fields = 'type,dept,account,password,visions,realname,join,role,email,commiter,gender,group,passwordStrength';
$this->batchSetPost($fields);
if(!in_array($this->request('gendar', 'f'), array('f', 'm'))) return $this->sendError(400, "The value of gendar must be 'f' or 'm'");
if(!in_array($this->request('gendar', zget($_POST, 'gendar', 'f')), array('f', 'm'))) return $this->sendError(400, "The value of gendar must be 'f' or 'm'");
$password = $this->request('password', '') ? md5($this->request('password')) : '';
$password = $this->request('password', zget($_POST, 'password', '')) ? md5($this->request('password', zget($_POST, 'password', ''))) : '';
$visions = $this->request('visions', array('rnd'));
if(!is_array($visions)) $visions = explode(',', $visions);
if($this->request('group')) $this->setPost('group', explode(',', $this->request('group')));
$this->setPost('password1', $password);
$this->setPost('password2', $password);
$this->setPost('passwordStrength', 3);
$this->setPost('visions', $visions);
$this->setPost('verifyPassword', md5($this->app->user->password . $this->app->session->rand));
unset($_POST['password']);
$control = $this->loadController('user', 'create');
$this->requireFields('account,password1,realname');
+1 -1
View File
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
if(!function_exists('getWebRoot')){function getWebRoot(){}}
/* 基本设置。Basic settings. */
$config->version = '17.4'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->version = '17.5'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->liteVersion = '1.2'; // 迅捷版版本。 The version of Lite.
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
File diff suppressed because it is too large Load Diff
-13
View File
@@ -14,16 +14,6 @@ ALTER TABLE `zt_testtask` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
ALTER TABLE `zt_build` ADD `createdBy` varchar(30) NOT NULL AFTER `desc`;
ALTER TABLE `zt_build` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
INSERT IGNORE INTO `zt_workflowfield` (`module`, `field`, `type`, `length`, `name`, `control`, `expression`, `options`, `default`, `rules`, `placeholder`, `order`, `searchOrder`, `exportOrder`, `canExport`, `canSearch`, `isValue`, `readonly`, `buildin`, `role`, `desc`, `createdBy`, `createdDate`, `editedBy`, `editedDate`) VALUES
('testtask', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 393, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
('testtask', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 394, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
('productplan', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 11, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
('productplan', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 12, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
('build', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 15, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
('build', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 16, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
('release', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 14, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
('release', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 15, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00');
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackType' ORDER BY `id` DESC LIMIT 1) WHERE `module`='feedback' AND `field`='type';
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackSolution' ORDER BY `id` DESC LIMIT 1) WHERE `module`='feedback' AND `field`='solution';
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackclosedReason' ORDER BY `id` DESC LIMIT 1), `control`='select' WHERE `module`='feedback' AND `field`='closedReason';
@@ -31,8 +21,5 @@ UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource`
UPDATE `zt_project` SET `closedDate`='' AND `closedBy`='' WHERE `status` != 'closed';
UPDATE `zt_grouppriv` SET `method`='exportTemplate' WHERE `method` = 'exportTemplet';
INSERT IGNORE INTO `zt_workflowaction` (`module`, `action`, `method`, `name`, `type`, `batchMode`, `extensionType`, `open`, `position`, `layout`, `show`, `buildin`, `role`, `createdBy`, `createdDate`) VALUES
('bug', 'batchactivate', 'batchoperate', '批量激活', 'batch', 'different', 'none', 'normal', 'browse', 'normal', 'direct', '1', 'buildin', '', '2022-08-09 15:52');
INSERT INTO `zt_grouppriv` (SELECT `group`,`module`,'reply' FROM `zt_grouppriv` WHERE `module` = 'feedback' AND `method` = 'comment');
INSERT INTO `zt_grouppriv` (SELECT `group`,`module`,'ask' FROM `zt_grouppriv` WHERE `module` = 'feedback' AND `method` = 'comment');
+117
View File
@@ -1,3 +1,119 @@
2022-08-11 17.5
完成的需求
开源版:
15665 可以设置用户查看的团队范围
15666 增加部门维度查看团队
31754 Scrum看板中任务看板按需求分组时需求列支持按条件排序
34360 修改会议详情页面附件重命名样式
34928 代理原因登录失败时,提醒用户检查代理服务
34994 面板客户端下载菜单中增加移动端的下载功能
35050 项目执行列表的筛选标签右侧增加编辑执行的设置
35057 需求通过编辑或批量设置调整计划后,计划历史记录中增加关联或移除的记录
35058 Bug通过编辑调整计划后,计划历史记录中增加关联或移除的记录
35169 需求编辑页面增加关联相关需求功能
35172 需求详情页面展示关联的相关需求
35173 用户需求编辑页面增加关联相关用户需求功能
35175 用户需求详情页面展示关联的相关用户需求
35189 批量创建测试类型任务后子任务所属模块默认取需求所属模块
35255 创建测试单页面中描述编辑器支持保存模板和应用模板功能
35270 创建/编辑项目集时项目集同名提示优化
35279 执行列表增加搜索功能
35295 后台权限中将选择项目模板权限合并到创建项目权限中
35357 LDAP原因登录失败时,提醒用户检查LDAP服务
35362 用例搜索表单中搜索结果条件增加“未执行”选项
35373 地盘待处理的任务列表中过滤掉已取消、已暂停、已关闭、已删除状态的任务
35410 在文档库下创建文档时,第一步不默认创建空白文档,第二步保存后才创建成功
35411 文档编辑页面中编辑基本信息后不保存,信息不保存
35412 文档编辑页面中附件编辑后局部刷新
35414 创建/编辑产品时产品同名提示优化
35415 创建/编辑项目时项目同名提示优化
35416 创建/编辑执行时执行同名提示优化
35441 通用看板导入的执行卡片同步展示执行进度
35442 通用看板导入的计划、发布、版本卡片不展示进度
35444 Bug列表中所属执行、所属计划、创建者字段鼠标悬浮时支持显示全称
35451 创建/编辑执行时执行同代号提示优化
35453 创建/编辑项目时项目同代号提示优化
35455 创建/编辑产品时产品同代号提示优化
35468 文档创建页面中基本信息的抄送给用户列表维护弹窗样式优化
35473 编辑项目时,允许项目预算超过父项目集
35474 创建项目时,允许项目预算超过父项目集
35476 编辑子项目集时,预算允许超过父项目集
35477 创建子项目集时,预算允许超过父项目集的金额
35478 创建项目时,计划开始日期允许小于父项目集
35479 创建子项目集时,计划开始日期允许小于父项目集
35480 编辑项目时,项目集的计划开始日期允许小于父项目集
35481 编辑子项目集时,允许修改子项目集的计划开始时间小于父项目集的计划开始时间
35482 创建项目时,项目的计划完成时间允许大于父项目集的计划完成时间
35483 创建子项目集时,子项目集的计划完成时间允许大于父项目集的计划完成时间
35484 编辑项目时,允许修改项目的计划完成时间大于父项目集的计划完成时间
35485 编辑子项目集时,允许修改子项目集的计划完成时间大于父项目集的计划完成时间
35490 优化修改密码的密码提示语
35491 优化邮箱修改密码的密码提示语
35493 全局搜索的搜索项优化排序
35599 批量编辑项目时,允许修改项目的时间范围超出所属项目集的时间范围
35600 创建和编辑项目时,计划起止日期超出父项目集日期范围,增加提示信息
35601 创建和编辑项目时,预算金额超出父项目集时增加提示信息
35602 创建和编辑子项目集时,计划起止日期超出父项目集的日期范围时,增加提示信息
35603 创建和编辑子项目集时,预算金超出父项目集时,增加提示信息
35624 累积流图时间周期优化
35706 执行需求列表批量转任务时增加必填项判断
35737 产品列表筛选标签的数量统计逻辑优化
35771 编辑父项目集时,计划起止日期不包含子项目集的日期范围时,增加提示信息
35799 地盘执行列表中角色字段修改为“我的角色”,鼠标悬浮展示全称
35800 地盘贡献研发需求列表中,名称和所属产品字段支持鼠标悬浮显示全部内容
35801 产品研发需求列表中版本号居中显示
35816 用例关联多个测试单时,用例列表展示多条用例,分别对应不同测试单
35817 修改发布中研发需求列表的子需求图标的圆角和颜色
35818 发布中解决bug列表的解决日期没有定义时,显示为空
35819 发布中研发需求列表预计字段的右侧内间距修改为16px
35826 修改项目集列表预算字段表头右侧内边距为16px
35834 产品研发需求列表中日期字段不定义时,显示为空
35835 用例列表中最后修改者字段的宽度调整为92px
35863 项目度量的统计项目汇总表的负责人、计划开始、计划完成和任务数量字段居中显示
35865 执行列表中执行状态字段居中显示
35867 项目发布列表中日期类字段居中显示
35937 产品发布通知邮件中直接展示完成的需求、解决的Bug、遗留的Bug
35939 密码难度规则优化
企业版:
6130 甘特图支持拖拽设置任务的起止日期
33993 甘特图样式优化
34482 新增反馈编辑他人反馈的权限
35082 执行甘特图,增加任务顺序的拖动排序功能
35857 反馈列表转用户需求icon更换
35933 执行甘特图的持续天数改成工期
旗舰版:
35836 项目问题列表中优先级字段居中显示
35837 项目问题列表“优先级”字段修改为“P”
35838 项目风险列表中风险系数和优先级字段居中显示
35868 瀑布项目培训能力差距分析列表各字段宽度调整
35997 项目度量的项目工作量报表的右侧标题加粗显示
32555 瀑布项目甘特图支持拖动调整起止日期
33995 甘特图样式优化
34893 项目计划甘特图,增加阶段/任务顺序的拖动排序功能
34895 增加按指派分组功能
35061 甘特图编辑权限
35382 复制项目交互样式优化
35393 甘特图升级到最近版本
34372 新建项目增加复制项目信息入口
34723 项目复制选择项目
34724 项目复制信息
34725 项目复制项目信息确认
34726 项目复制阶段信息确认
34727 项目复制迭代信息确认
34728 项目复制弹窗提示
35217 复制项目,阶段信息确认页面增加阶段选择弹窗
35218 复制项目的交互样式优化
35310 复制项目增加团队成员与权限复制
修复的Bug
22662 执行任务列表父子任务显示错乱
24608 英文下批量编辑执行页面执行状态名称显示不全
24743 测试单下所有用例页面执行状态排序按钮部分遮挡
25416 产品列表分页逻辑问题
25563 已设置颜色的任务名称,阶段列表显示任务名称的颜色
25837 产品-计划的需求列表没有展示需求标题颜色
25851 导入任务相关研发需求详情弹窗中样式问题
25282 导入用户时,左右滚动条必须拖动到底部才显示
2022-07-27 17.4
完成的需求
开源版:
@@ -89,6 +205,7 @@
29944 项目甘特图中支持显示阶段和任务的负责人
34795 项目甘特图可以在阶段或任务前增加图标显示状态
34742 项目甘特图中没有起止日期的任务的时间显示为所属阶段时间
34729 QA质量保证计划可以批量编辑
禅道客户端:
34124 XXD可以从XXB主动拉取配置
34123 喧喧增加禅道的checktable.php以便自动修复数据库
+3
View File
@@ -249,6 +249,7 @@ $lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove storie
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
/* Used to describe the historical operation records of gantt. */
$lang->action->desc->ganttdrag = '$date, <strong>$actor</strong> tasks dragged <strong>$extra</strong>.' . "\n";
$lang->action->desc->ganttmove = '$date, <strong>$actor</strong> tasks sorted <strong>$extra</strong>.' . "\n";
/* Used to display dynamic information. */
@@ -388,6 +389,8 @@ $lang->action->label->unlinkstory = 'unlink stories from';
$lang->action->label->unlinkbug = 'unlink bugs from';
$lang->action->label->tolib = 'imported';
$lang->action->label->updatetolib = 'updated';
$lang->action->label->ganttdrag = 'dragged';
$lang->action->label->ganttmove = 'sorted';
/* Dynamic information is grouped by object. */
$lang->action->dynamicAction = new stdclass;
+3
View File
@@ -249,6 +249,7 @@ $lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove storie
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
/* Used to describe the historical operation records of gantt. */
$lang->action->desc->ganttdrag = '$date, <strong>$actor</strong> tasks dragged <strong>$extra</strong>.' . "\n";
$lang->action->desc->ganttmove = '$date, <strong>$actor</strong> tasks sorted <strong>$extra</strong>.' . "\n";
/* Used to display dynamic information. */
@@ -388,6 +389,8 @@ $lang->action->label->unlinkstory = 'unlink stories from';
$lang->action->label->unlinkbug = 'unlink bugs from';
$lang->action->label->tolib = 'imported';
$lang->action->label->updatetolib = 'updated';
$lang->action->label->ganttdrag = 'dragged';
$lang->action->label->ganttmove = 'sorted';
/* Dynamic information is grouped by object. */
$lang->action->dynamicAction = new stdclass;
+3
View File
@@ -249,6 +249,7 @@ $lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove storie
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
/* Used to describe the historical operation records of gantt. */
$lang->action->desc->ganttdrag = '$date, <strong>$actor</strong> tasks dragged <strong>$extra</strong>.' . "\n";
$lang->action->desc->ganttmove = '$date, <strong>$actor</strong> tasks sorted <strong>$extra</strong>.' . "\n";
/* Used to display dynamic information. */
@@ -388,6 +389,8 @@ $lang->action->label->unlinkstory = 'unlink stories from';
$lang->action->label->unlinkbug = 'unlink bugs from';
$lang->action->label->tolib = 'Importé';
$lang->action->label->updatetolib = 'MàJ';
$lang->action->label->ganttdrag = 'dragged';
$lang->action->label->ganttmove = 'sorted';
/* Dynamic information is grouped by object. */
$lang->action->dynamicAction = new stdclass();
+2 -2
View File
@@ -69,8 +69,8 @@ $lang->admin->safe->modeList[0] = '不检查';
$lang->admin->safe->modeList[1] = '中';
$lang->admin->safe->modeList[2] = '强';
$lang->admin->safe->modeRuleList[1] = '6位以上,包含大小写字母,数字。';
$lang->admin->safe->modeRuleList[2] = '10位以上,包含字母,数字,特殊字符。';
$lang->admin->safe->modeRuleList[1] = '6位及以上,包含大小写字母,数字。';
$lang->admin->safe->modeRuleList[2] = '10位及以上,包含字母,数字,特殊字符。';
$lang->admin->safe->reasonList['weak'] = '常用弱口令';
$lang->admin->safe->reasonList['account'] = '与帐号相同';
+1
View File
@@ -2255,6 +2255,7 @@ class bugModel extends model
}
}
$this->app->loadLang('report');
foreach($datas as $buildID => $data)
{
$data->name = isset($builds[$buildID]) ? $builds[$buildID] : $this->lang->report->undefined;
+8 -5
View File
@@ -245,14 +245,17 @@ class build extends control
/* Get stories and stages. */
$storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1);
$stories = $this->dao->select('t1.*, t2.stage')->from(TABLE_STORY)->alias('t1')
->leftJoin(TABLE_STORYSTAGE)->alias('t2')->on('t1.id = t2.story')
->where('t1.id')->in($build->stories)
->andWhere('t1.deleted')->eq(0)
->beginIF($type == 'story')->orderBy("t1.$orderBy")->fi()
$stories = $this->dao->select('*')->from(TABLE_STORY)
->where('id')->in($build->stories)
->andWhere('deleted')->eq(0)
->beginIF($type == 'story')->orderBy($orderBy)->fi()
->page($storyPager)
->fetchAll('id');
$stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->in($build->stories)->andWhere('branch')->eq($build->branch)->fetchPairs('story', 'stage');
foreach($stages as $storyID => $stage) $stories[$storyID]->stage = $stage;
/* Set menu. */
if($this->app->tab == 'project')
{
+1 -1
View File
@@ -2417,10 +2417,10 @@ EOD;
$module == 'tutorial' or
$module == 'install' or
$module == 'upgrade' or
$module == 'sso' or
($module == 'user' and strpos('|login|deny|logout|reset|forgetpassword|resetpassword|', "|{$method}|") !== false) or
($module == 'my' and strpos('|changepassword|preference|', "|{$method}|") !== false) or
($module == 'file' and strpos('|read|download|uploadimages|ajaxwopifiles|', "|{$method}|") !== false) or
($module == 'sso' and $method == 'login') or
($module == 'report' && $method == 'annualdata') or
($module == 'misc' && $method == 'captcha') or
($module == 'execution' and $method == 'printkanban') or
+20 -5
View File
@@ -1384,22 +1384,37 @@ class execution extends control
$this->loadModel('kanban');
$this->app->loadClass('date');
$minDate = !helper::isZeroDate($execution->openedDate) ? $execution->openedDate : $execution->begin;
$maxDate = !helper::isZeroDate($execution->closedDate) ? $execution->closedDate : helper::today();
$minDate = !helper::isZeroDate($execution->openedDate) ? date('Y-m-d', strtotime($execution->openedDate)) : date('Y-m-d', strtotime($execution->begin));
$maxDate = !helper::isZeroDate($execution->closedDate) ? date('Y-m-d', strtotime($execution->closedDate)) : helper::today();
if(!empty($_POST))
{
$begin = htmlspecialchars($this->post->begin, ENT_QUOTES);
$end = htmlspecialchars($this->post->end, ENT_QUOTES);
if(empty($begin)) return $this->sendError(sprintf($this->lang->error->notempty, $this->lang->execution->charts->cfd->begin));
if(empty($end)) return $this->sendError(sprintf($this->lang->error->notempty, $this->lang->execution->charts->cfd->end));
$dateError = array();
if(empty($begin)) $dateError[] = sprintf($this->lang->error->notempty, $this->lang->execution->charts->cfd->begin);
if(empty($end)) $dateError[] = sprintf($this->lang->error->notempty, $this->lang->execution->charts->cfd->end);
if(empty($dateError))
{
if($begin < $minDate) $dateError[] = sprintf($this->lang->error->gt, $this->lang->execution->charts->cfd->begin, $minDate);
if($begin > $maxDate) $dateError[] = sprintf($this->lang->error->lt, $this->lang->execution->charts->cfd->begin, $maxDate);
if($end < $minDate) $dateError[] = sprintf($this->lang->error->gt, $this->lang->execution->charts->cfd->end, $minDate);
if($end > $maxDate) $dateError[] = sprintf($this->lang->error->lt, $this->lang->execution->charts->cfd->end, $maxDate);
}
if(!empty($dateError))
{
foreach($dateError as $index => $error) $dateError[$index] = str_replace(array('。', '.'), array('', ''), $error) . '<br/>';
return $this->sendError($dateError);
}
if($begin >= $end) return $this->sendError($this->lang->execution->charts->cfd->errorBegin);
if(date("Y-m-d", strtotime("-3 months", strtotime($end))) > $begin) return $this->sendError($this->lang->execution->charts->cfd->errorDateRange);
$this->execution->computeCFD($executionID);
$this->execution->checkCFDData($executionID, $begin);
return print(js::locate($this->createLink('execution', 'cfd', "executionID=$executionID&type=$type&withWeekend=$withWeekend&begin=" . helper::safe64Encode(urlencode($begin)) . "&end=" . helper::safe64Encode(urlencode($end))), 'parent'));
return $this->send(array('result' => 'success', 'locate' => $this->createLink('execution', 'cfd', "executionID=$executionID&type=$type&withWeekend=$withWeekend&begin=" . helper::safe64Encode(urlencode($begin)) . "&end=" . helper::safe64Encode(urlencode($end)))));
}
if($begin and $end)
+4
View File
@@ -49,6 +49,10 @@ $(function()
}
storyIdList += $(this).val() + ',';
});
$('#type').val('').trigger("chosen:updated");
$('#hourPointValue').val('');
$('input[name^=fields]').prop('checked', true);
});
$('#submit').click(function()
-1
View File
@@ -4369,7 +4369,6 @@ class executionModel extends model
$spanClass = $execution->type == 'stage' ? 'label-warning' : 'label-info';
echo "<span class='project-type-label label label-outline $spanClass'>{$this->lang->execution->typeList[$execution->type]}</span> ";
}
echo empty($execution->children) ? html::a(helper::createLink('execution', 'view', "executionID=$execution->id"), $execution->name) : $execution->name;
if(empty($execution->children))
{
echo html::a(helper::createLink('execution', 'view', "executionID=$execution->id"), $execution->name);
+1 -1
View File
@@ -37,7 +37,7 @@
<?php echo html::select('type', $lang->execution->cfdTypeList, $type, "class='form-control chosen'");?>
</div>
<div id="cfdDateSelect">
<form method='post' target='hiddenwin' class='not-watch'>
<form method='post' class='form-ajax not-watch'>
<div class='input-group'>
<?php echo html::input('begin', $begin, "class='form-control form-date' onchange='$(\"#datePreview\").removeClass(\"hidden\")' placeholder='" . $lang->execution->charts->cfd->begin . "'");?>
<span class='input-group-addon'><?php echo $lang->project->to;?></span>
+3 -3
View File
@@ -164,19 +164,19 @@
<td colspan="3" id="plansBox">
<div class='row'>
<?php if(isset($plan) && !empty($plan->begin)):?>
<div class="col-sm-4" id="plan0"><?php echo html::select("plans[{$plan->product}][{$plan->branch}]", $productPlan, $plan->id, "class='form-control chosen' multiple");?></div>
<div class="col-sm-4" id="plan0"><?php echo html::select("plans[{$plan->product}][{$plan->branch}][]", $productPlan, $plan->id, "class='form-control chosen' multiple");?></div>
<?php js::set('currentPlanID', $plan->id)?>
<?php elseif($copyExecutionID):?>
<?php $i = 0;?>
<?php foreach($products as $product):?>
<?php foreach($linkedBranches[$product->id] as $branchID => $branch):?>
<?php $plans = isset($productPlans[$product->id][$branchID]) ? $productPlans[$product->id][$branchID] : array();?>
<div class="col-sm-4" id="plan<?php echo $i;?>"><?php echo html::select("plans[{$product->id}][$branchID]", $plans, $branches[$product->id][$branchID]->plan, "class='form-control chosen' multiple");?></div>
<div class="col-sm-4" id="plan<?php echo $i;?>"><?php echo html::select("plans[{$product->id}][$branchID][]", $plans, $branches[$product->id][$branchID]->plan, "class='form-control chosen' multiple");?></div>
<?php $i++;?>
<?php endforeach;?>
<?php endforeach;?>
<?php else:?>
<div class="col-sm-4" id="plan0"><?php echo html::select("plans[][]", $productPlan, '', "class='form-control chosen' multiple");?></div>
<div class="col-sm-4" id="plan0"><?php echo html::select("plans[][][]", $productPlan, '', "class='form-control chosen' multiple");?></div>
<?php js::set('currentPlanID', '')?>
<?php endif;?>
</div>
+1
View File
@@ -23,6 +23,7 @@
<small><?php echo $lang->arrow . ' ' . $lang->execution->edit;?></small>
</h2>
</div>
<?php echo html::hidden('project', $project->id);?>
<form class='load-indicator main-form form-ajax' method='post' target='hiddenwin' id='dataform'>
<table class='table table-form'>
<?php if($config->systemMode == 'new' and isset($project)):?>
-1
View File
@@ -464,7 +464,6 @@
if(!notTriggerEvent) app.$app.trigger('reloadapp', app);
if(url) $(iframe.contentWindow.document.body).hide(); // Code for task #59703.
if(!isSameUrl) app.$app.addClass('loading');
if(app._loadTimer) clearTimeout(app._loadTimer);
app._loadTimer = setTimeout(function()
+3 -3
View File
@@ -134,11 +134,11 @@ $lang->kanban->aclGroup['extend'] = 'Extend';
$lang->kanban->aclList['extend'] = 'Extend (Accessible with space view permissions)';
$lang->kanban->aclList['private'] = 'Private (For the kanban team, whitelist members and space owner only)';
$lang->kanban->archiveList['0'] = 'Disable';
$lang->kanban->archiveList['1'] = 'Enable';
$lang->kanban->archiveList['0'] = 'Disable';
$lang->kanban->enableList['0'] = 'Disable';
$lang->kanban->enableList['1'] = 'Enable';
$lang->kanban->enableList['0'] = 'Disable';
$lang->kanban->alignmentList['center'] = 'Center';
$lang->kanban->alignmentList['left'] = 'Left';
@@ -225,8 +225,8 @@ $lang->kanban->orderList['stage_desc'] = 'Story Stage Descending';
$lang->kanban->orderList['assignedTo_desc'] = 'Assigned To';
$lang->kanban->importList = array();
$lang->kanban->importList['off'] = 'Import is not enabled';
$lang->kanban->importList['on'] = 'Enable the import function, you can only import content that you have permission to view.';
$lang->kanban->importList['off'] = 'Import is not enabled';
$lang->kanban->importObjectList = array();
$lang->kanban->importObjectList['plans'] = 'Product Plan';
+3 -3
View File
@@ -134,11 +134,11 @@ $lang->kanban->aclGroup['extend'] = 'Extend';
$lang->kanban->aclList['extend'] = 'Extend (Accessible with space view permissions)';
$lang->kanban->aclList['private'] = 'Private (For the kanban team, whitelist members and space owner only)';
$lang->kanban->archiveList['0'] = 'Disable';
$lang->kanban->archiveList['1'] = 'Enable';
$lang->kanban->archiveList['0'] = 'Disable';
$lang->kanban->enableList['0'] = 'Disable';
$lang->kanban->enableList['1'] = 'Enable';
$lang->kanban->enableList['0'] = 'Disable';
$lang->kanban->alignmentList['center'] = 'Center';
$lang->kanban->alignmentList['left'] = 'Left';
@@ -225,8 +225,8 @@ $lang->kanban->orderList['stage_desc'] = 'Story Stage Descending';
$lang->kanban->orderList['assignedTo_desc'] = 'Assigned To';
$lang->kanban->importList = array();
$lang->kanban->importList['off'] = 'Import is not enabled';
$lang->kanban->importList['on'] = 'Enable import function (You can import content that you have permission to view as cards.)';
$lang->kanban->importList['off'] = 'Import is not enabled';
$lang->kanban->importObjectList = array();
$lang->kanban->importObjectList['plans'] = 'Product Plan';
+3 -3
View File
@@ -134,11 +134,11 @@ $lang->kanban->aclGroup['extend'] = 'Extend';
$lang->kanban->aclList['extend'] = 'Extend (Accessible with space view permissions)';
$lang->kanban->aclList['private'] = 'Private (For the kanban team, whitelist members and space owner only)';
$lang->kanban->archiveList['0'] = 'Disable';
$lang->kanban->archiveList['1'] = 'Enable';
$lang->kanban->archiveList['0'] = 'Disable';
$lang->kanban->enableList['0'] = 'Disable';
$lang->kanban->enableList['1'] = 'Enable';
$lang->kanban->enableList['0'] = 'Disable';
$lang->kanban->alignmentList['center'] = 'Center';
$lang->kanban->alignmentList['left'] = 'Left';
@@ -225,8 +225,8 @@ $lang->kanban->orderList['stage_desc'] = 'Story Phase Descendante';
$lang->kanban->orderList['assignedTo_desc'] = 'Assigné à';
$lang->kanban->importList = array();
$lang->kanban->importList['off'] = 'Import is not enabled';
$lang->kanban->importList['on'] = 'Enable the import function, you can only import content that you have permission to view.';
$lang->kanban->importList['off'] = 'Import is not enabled';
$lang->kanban->importObjectList = array();
$lang->kanban->importObjectList['plans'] = 'Product Plan';
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
$lang->misc->releaseDate['17.5'] = '2022-08-11';
$lang->misc->releaseDate['17.4'] = '2022-07-27';
$lang->misc->releaseDate['17.3'] = '2022-07-13';
$lang->misc->releaseDate['17.2'] = '2022-06-29';
@@ -186,6 +187,7 @@ $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['17.5'][] = array('title' => "Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.4'][] = array('title' => "Optimization of details Page visualization and jumping page logic. Improvement of Kanban function. Optimization of document creating and editing pages. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.3'][] = array('title' => "UI optimization of the modules such as statistics and background, the use case library will synchronize the function optimization information. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.2'][] = array('title' => "Adjust the display of agile project block; optimize the UI of programs, projects and tests; optimize the detailed experience. Fix bugs.", 'desc' => '');
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
$lang->misc->releaseDate['17.5'] = '2022-08-11';
$lang->misc->releaseDate['17.4'] = '2022-07-27';
$lang->misc->releaseDate['17.3'] = '2022-07-13';
$lang->misc->releaseDate['17.2'] = '2022-06-29';
@@ -186,6 +187,7 @@ $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['17.5'][] = array('title' => "Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.4'][] = array('title' => "Optimization of details Page visualization and jumping page logic. Improvement of Kanban function. Optimization of document creating and editing pages. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.3'][] = array('title' => "UI optimization of the modules such as statistics and background, the use case library will synchronize the function optimization information. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.2'][] = array('title' => "Adjust the display of agile project block; optimize the UI of programs, projects and tests; optimize the detailed experience. Fix bugs.", 'desc' => '');
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
$lang->misc->releaseDate['17.5'] = '2022-08-11';
$lang->misc->releaseDate['17.4'] = '2022-07-27';
$lang->misc->releaseDate['17.3'] = '2022-07-13';
$lang->misc->releaseDate['17.2'] = '2022-06-29';
@@ -186,6 +187,7 @@ $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['17.5'][] = array('title' => "Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.4'][] = array('title' => "Optimization of details Page visualization and jumping page logic. Improvement of Kanban function. Optimization of document creating and editing pages. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.3'][] = array('title' => "UI optimization of the modules such as statistics and background, the use case library will synchronize the function optimization information. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.2'][] = array('title' => "Adjust the display of agile project block; optimize the UI of programs, projects and tests; optimize the detailed experience. Fix bugs.", 'desc' => '');
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = "<p>禅道15系列上线了全新的“
$lang->misc->feature->visionsDesc = "<p>从16.5开始增加了界面概念,用户可以在<span style='color:#0c60e1'>[研发综合界面]</span>中处理研发事务、在<span style='color:#0c60e1'>[迅捷界面]</span>处理日常办公事务。</p><p>在头像右侧即可查看当前所处界面,点击当前界面名称可查看和切换其他的界面。</p>";
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions.png';
$lang->misc->releaseDate['17.5'] = '2022-08-11';
$lang->misc->releaseDate['17.4'] = '2022-07-27';
$lang->misc->releaseDate['17.3'] = '2022-07-13';
$lang->misc->releaseDate['17.2'] = '2022-06-29';
@@ -186,6 +187,7 @@ $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['17.5'][] = array('title' => '优化禅道性能,数据库引擎从MyISAM调整为InnoDB。甘特图优化升级,旗舰版的复制项目可以复制任务等更多信息。修复Bug。', 'desc' => '');
$lang->misc->feature->all['17.4'][] = array('title' => '详情页面的视觉优化和部分页面跳转逻辑优化。看板功能完善。文档创建和编辑页面优化。修复Bug。', 'desc' => '');
$lang->misc->feature->all['17.3'][] = array('title' => '统计、后台等模块的UI优化,用例库同步用例信息功能优化。修复Bug。', 'desc' => '');
$lang->misc->feature->all['17.2'][] = array('title' => '调整敏捷项目区块的展示,项目集、项目和测试相关UI优化,细节体验优化。修复Bug。', 'desc' => '');
+4 -4
View File
@@ -129,7 +129,7 @@ class mr extends control
$gogsUsers = $this->gogs->getGogsListByAccount();
foreach($hosts as $hostID => $host)
{
if($host->type == 'gitLab' and isset($gitlabUsers[$hostID])) continue;
if($host->type == 'gitlab' and isset($gitlabUsers[$hostID])) continue;
if($host->type == 'gitea' and isset($giteaUsers[$hostID])) continue;
if($host->type == 'gogs' and isset($gogsUsers[$hostID])) continue;
@@ -197,10 +197,10 @@ class mr extends control
if(!$this->app->user->admin and $scm == 'gitlab')
{
$groupIDList = array(0 => 0);
$groups = $this->scm->apiGetGroups($MR->hostID, 'name_asc', 'developer');
$groups = $this->$scm->apiGetGroups($MR->hostID, 'name_asc', 'developer');
foreach($groups as $group) $groupIDList[] = $group->id;
$sourceProject = $this->scm->apiGetSingleProject($MR->hostID, $MR->sourceProject);
$isDeveloper = $this->scm->checkUserAccess($MR->hostID, 0, $sourceProject, $groupIDList, 'developer');
$sourceProject = $this->$scm->apiGetSingleProject($MR->hostID, $MR->sourceProject);
$isDeveloper = $this->$scm->checkUserAccess($MR->hostID, 0, $sourceProject, $groupIDList, 'developer');
if(!isset($gitUsers[$this->app->user->account]) or !$isDeveloper) return print(js::alert($this->lang->mr->errorLang[3]) . js::locate($this->createLink('mr', 'browse')));
}
+15 -6
View File
@@ -21,9 +21,18 @@ td.delayed {background: #e84e0f !important; color: white;}
html[lang="en"] .c-date {width: 80px;}
html[lang="en"] .c-user-short {width: 88px;}
[lang^=en] #taskTable .assigned-title{width: 115px !important;}
[lang^=de] #taskTable .assigned-title{width: 145px !important;}
[lang^=de] #taskTable .c-date {width: 80px;}
[lang^=de] #taskTable .c-user {width: 120px;}
[lang^=de] #taskTable .c-hours {width: 88px;}
[lang^=fr] #taskTable .assigned-title{width: 130px !important;}
[lang^=en] #taskTable .c-project {width: 100px}
[lang^=en] #taskTable .assigned-title {width: 120px !important;}
[lang^=de] #taskTable .c-name {width: 100px;}
[lang^=de] #taskTable .c-project {width: 80px;}
[lang^=de] #taskTable .c-date {width: 78px;}
[lang^=de] #taskTable .assigned-title {width: 123px !important;}
[lang^=de] #taskTable .c-user {width: 118px;}
[lang^=de] #taskTable .c-hours {width: 86px;}
[lang^=de] #taskTable .c-user-short {width: 75px;}
[lang^=fr] #taskTable .c-name {width: 120px;}
[lang^=fr] #taskTable .c-project {width: 100px;}
[lang^=fr] #taskTable .c-date {width: 91px;}
[lang^=fr] #taskTable .assigned-title {width: 130px !important;}
[lang^=fr] #taskTable .c-user-short {width: 75px;}
[lang^=fr] #taskTable .c-status {width: 71px;}
+2 -2
View File
@@ -126,7 +126,7 @@
<?php endif;?>
<td class="text-center <?php echo isset($task->delay) ? 'delayed' : '';?>"><?php if(substr($task->deadline, 0, 4) > 0) echo substr($task->deadline, 5, 6);?></td>
<?php if($type != 'assignedTo'): ?>
<td class="c-assignedTo has-btn"> <?php $this->task->printAssignedHtml($task, $users);?></td>
<td class="c-assignedTo has-btn" title="<?php echo zget($users, $task->assignedTo);?>"> <?php $this->task->printAssignedHtml($task, $users);?></td>
<?php endif;?>
<?php if($type != 'finishedBy'): ?>
<td class='c-user'><?php echo zget($users, $task->finishedBy);?></td>
@@ -196,7 +196,7 @@
<?php endif;?>
<td class="text-center <?php echo isset($child->delay) ? 'delayed' : '';?>"><?php if(substr($child->deadline, 0, 4) > 0) echo substr($child->deadline, 5, 6);?></td>
<?php if($type != 'assignedTo'): ?>
<td class="c-assignedTo has-btn"> <?php $this->task->printAssignedHtml($child, $users);?></td>
<td class="c-assignedTo has-btn" title="<?php echo zget($users, $child->assignedTo);?>"> <?php $this->task->printAssignedHtml($child, $users);?></td>
<?php endif;?>
<?php if($type != 'finishedBy'): ?>
<td class='c-user'><?php echo zget($users, $child->finishedBy);?></td>
+4 -2
View File
@@ -17,14 +17,16 @@ $insert = $this->session->insert;
?>
<style>
form{overflow-x: scroll}
#maxImport:focus {outline: none;}
.c-pri{width:100px}
.c-estimate, .c-severity, .c-openedBuild, .c-title{width:150px !important;}
.c-story{width:150px;}
#showData > thead > tr > th{width:150px;}
.c-id{width:50px}
.c-team {width:100px; padding:0px 0px 8px 0px !important;}
.c-estimate-1 {width:50px;padding:0px 0px 8px 8px !important;}
</style>
<?php if(!empty($suhosinInfo)):?>
<div class='alert alert-info'><?php echo $suhosinInfo?></div>
<?php die;?>
<?php elseif(empty($maxImport) and $allCount > $this->config->file->maxImport):?>
<div id="mainContent" class="main-content">
<div class="main-header">
+1
View File
@@ -1,4 +1,5 @@
<?php include $app->getModuleRoot() . 'common/view/header.lite.html.php';?>
<style>input[type=file]:focus, input[type=checkbox]:focus, input[type=radio]:focus {outline: none;}</style>
<main>
<div class="container">
<div id="mainContent" class='main-content'>
+1 -1
View File
@@ -153,4 +153,4 @@ $config->product->statisticFields['bugs'] = array('unResolvedBugs', 'clo
$config->product->statisticFields['plans'] = array('plans');
$config->product->statisticFields['releases'] = array('releases');
$config->product->skipRedirectMethod = ',create,index,showerrornone,ajaxgetdropmenu,kanban,all,manageline,export,';
$config->product->skipRedirectMethod = ',create,index,showerrornone,ajaxgetdropmenu,kanban,all,manageline,export,ajaxgetplans,';
+14 -9
View File
@@ -116,16 +116,21 @@ class productplanModel extends model
if(!empty($plans))
{
$plans = $this->reorder4Children($plans);
$planIdList = array_keys($plans);
$plans = $this->reorder4Children($plans);
$planIdList = array_keys($plans);
$planProjects = array();
$planProjects = $this->dao->select('t1.*,t2.type')->from(TABLE_PROJECTPRODUCT)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
->where('t1.product')->eq($product)
->andWhere('t2.deleted')->eq(0)
->andWhere('t1.plan')->in(array_keys($plans))
->andWhere('t2.type')->in('sprint,stage,kanban')
->fetchPairs('plan', 'project');
foreach($planIdList as $planID)
{
$planProjects[$planID] = $this->dao->select('t1.*,t2.type')->from(TABLE_PROJECTPRODUCT)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
->where('t1.product')->eq($product)
->andWhere('t2.deleted')->eq(0)
->andWhere('t1.plan')->like(",$planID,")
->andWhere('t2.type')->in('sprint,stage,kanban')
->orderBy('project_desc')
->fetch('project');
}
$storyCountInTable = $this->dao->select('plan,count(story) as count')->from(TABLE_PLANSTORY)->where('plan')->in($planIdList)->groupBy('plan')->fetchPairs('plan', 'count');
$product = $this->loadModel('product')->getById($product);
+2 -2
View File
@@ -16,5 +16,5 @@ tbody.sortable > tr > td.sort-handler {color: #3c4353 !important;}
div.checkbox-primary + span.table-nest-icon {margin-left: 0px !important;}
#checkAll + label.hover:after {border-width: 0px;}
.c-budget {padding-right: 16px !important; width: 100px !important;}
.c-status {width: 65px !important;}
.c-budget {width:100px; text-align: right; padding-right:16px !important;}
.c-status {width: 65px !important;}
+1
View File
@@ -7,3 +7,4 @@
.has-prefix > a {padding-left: 5px;}
.has-suffix > a {max-width: calc(100% - 100px); padding-right: 5px; color: #0c60e1; display: inline-block; max-width: calc(100% - 50px);}
.c-budget {width:100px; text-align: right; padding-right:16px !important;}
+1 -1
View File
@@ -105,7 +105,7 @@ $lang->program->endGreaterParent = 'The finish date of the program was > the f
$lang->program->dateExceedParent = 'The start and finish date of the program was > the start and finish date of the parent program:';
$lang->program->beginGreateChild = 'The start date of the program was > the minimum start date of the subprogram or project:';
$lang->program->endLetterChild = 'The finish date of the program was < the maximum finish date of the subprogram or project:';
$lang->program->dateLetterChild = 'The start and finish date of the program no longer include the date scope of the subprogram or project:';
$lang->program->dateExceedChild = 'The start and finish date of the program no longer include the date scope of the subprogram or project:';
$lang->program->closeErrorMessage = 'There are subprograms or projects that are not closed';
$lang->program->hasChildren = 'It has child programs or projects. You cannot delete it.';
$lang->program->hasProduct = 'It has products. You cannot delete it.';
+1 -1
View File
@@ -105,7 +105,7 @@ $lang->program->endGreaterParent = 'The finish date of the program was > the f
$lang->program->dateExceedParent = 'The start and finish date of the program was > the start and finish date of the parent program:';
$lang->program->beginGreateChild = 'The start date of the program was > the minimum start date of the subprogram or project:';
$lang->program->endLetterChild = 'The finish date of the program was < the maximum finish date of the subprogram or project:';
$lang->program->dateLetterChild = 'The start and finish date of the program no longer include the date scope of the subprogram or project:';
$lang->program->dateExceedChild = 'The start and finish date of the program no longer include the date scope of the subprogram or project:';
$lang->program->closeErrorMessage = 'There are subprograms or projects that are not closed';
$lang->program->hasChildren = 'The program has a child program or the project exists and can not be deleted.';
$lang->program->hasProduct = 'The program has products exist and can not be deleted.';
+1 -1
View File
@@ -105,7 +105,7 @@ $lang->program->endGreaterParent = 'La date de fin du programme était > à la
$lang->program->dateExceedParent = 'La date de début et de fin du programme était > à la date de début et de fin du programme parent:';
$lang->program->beginGreateChild = 'La date de début du programme était > à la date minimale de début du sous-programme ou du projet:';
$lang->program->endLetterChild = 'La date de fin du programme était < à la de fin maximale du sous-programme ou du projet:';
$lang->program->dateLetterChild = 'La date de début et de fin du programme ne correspond plus la date du sous-programme ou du projet:';
$lang->program->dateExceedChild = 'La date de début et de fin du programme ne correspond plus la date du sous-programme ou du projet:';
$lang->program->closeErrorMessage = 'There are subprograms or projects that are not closed';
$lang->program->hasChildren = 'It has child programs or projects. You cannot delete it.';
$lang->program->hasProduct = 'It has products. You cannot delete it.';
+1 -1
View File
@@ -84,7 +84,7 @@ $lang->programplan->ganttCustom['PM'] ='负责人';
$lang->programplan->ganttCustom['deadline'] ='计划完成';
$lang->programplan->ganttCustom['status'] ='状态';
$lang->programplan->ganttCustom['realBegan'] ='实际开始';
$lang->programplan->ganttCustom['realEnd'] ='实际结束';
$lang->programplan->ganttCustom['realEnd'] ='实际完成';
$lang->programplan->ganttCustom['progress'] ='工作量占比';
$lang->programplan->ganttCustom['taskProgress'] ='任务进度';
$lang->programplan->ganttCustom['estimate'] ='工时';
+1 -1
View File
@@ -504,7 +504,7 @@ $(function()
gantt.config.duration_unit = "day";
gantt.config.columns = [];
gantt.config.columns.push({name: 'text', width: '*', tree: true, resize: true, width:200});
gantt.config.columns.push({name: 'text', width: '*', tree: true, resize: true, min_width:120, width:200});
if(showFields.indexOf('PM') != -1) gantt.config.columns.push({name: 'owner_id', align: 'center', resize: true, width: 80, template: function(task){return getByIdForGantt(gantt.serverList('userList'), task.owner_id)}})
if(showFields.indexOf('status') != -1) gantt.config.columns.push({name: 'status', align: 'center', resize: true, width: 80});
gantt.config.columns.push({name: 'start_date', align: 'center', resize: true, width: 80});
+1 -1
View File
@@ -3,7 +3,7 @@ body {margin-bottom: 25px;}
.side-col {padding-right: 20px; width: 18%;}
#sidebar>.cell {width: 100%;}
.c-budget {padding-right:16px !important;}
.c-budget {text-align: right; padding-right:16px !important;}
td.c-actions {overflow: visible;}
td.c-PM {white-space: nowrap; overflow: hidden;}
.c-actions .btn {overflow: visible;}
+7 -10
View File
@@ -265,19 +265,16 @@ function loadPlans(product, branchID)
var branchID = typeof(branchID) == 'undefined' ? 0 : branchID;
var index = $(product).attr('id').replace('products', '');
if(productID != 0)
$.get(createLink('product', 'ajaxGetPlans', "productID=" + productID + '&branch=0,' + branchID + '&planID=0&fieldID&needCreate=&expired=unexpired,noclosed&param=skipParent,multiple'), function(data)
{
$.get(createLink('product', 'ajaxGetPlans', "productID=" + productID + '&branch=0,' + branchID + '&planID=0&fieldID&needCreate=&expired=unexpired,noclosed&param=skipParent,multiple'), function(data)
if(data)
{
if(data)
{
if($("div#plan" + index).size() == 0) $("#plansBox .row").append('<div class="col-sm-4" id="plan' + index + '"></div>');
$("div#plan" + index).html(data).find('select').attr('name', 'plans[' + productID + '][' + branchID + '][]').attr('id', 'plans' + productID).chosen();
if($("div#plan" + index).size() == 0) $("#plansBox .row").append('<div class="col-sm-4" id="plan' + index + '"></div>');
$("div#plan" + index).html(data).find('select').attr('name', 'plans[' + productID + '][' + branchID + '][]').attr('id', 'plans' + productID).chosen();
adjustPlanBoxMargin();
}
});
}
adjustPlanBoxMargin();
}
});
}
/**
+8 -5
View File
@@ -231,14 +231,17 @@ class projectrelease extends control
}
$storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1);
$stories = $this->dao->select('t1.*, t2.stage')->from(TABLE_STORY)->alias('t1')
->leftJoin(TABLE_STORYSTAGE)->alias('t2')->on('t1.id = t2.story')
->where('t1.id')->in($release->stories)
->andWhere('t1.deleted')->eq(0)
->beginIF($type == 'story')->orderBy("t1.$orderBy")->fi()
$stories = $this->dao->select('*')->from(TABLE_STORY)
->where('id')->in($release->stories)
->andWhere('deleted')->eq(0)
->beginIF($type == 'story')->orderBy($orderBy)->fi()
->page($storyPager)
->fetchAll('id');
$stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->in($release->stories)->andWhere('branch')->eq($release->branch)->fetchPairs('story', 'stage');
foreach($stages as $storyID => $stage) $stories[$storyID]->stage = $stage;
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story');
$bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1);
+1 -1
View File
@@ -139,7 +139,7 @@ $config->story->datatable->fieldList['estimate']['required'] = 'no';
$config->story->datatable->fieldList['stage']['title'] = 'stageAB';
$config->story->datatable->fieldList['stage']['fixed'] = 'no';
$config->story->datatable->fieldList['stage']['width'] = '80';
$config->story->datatable->fieldList['stage']['width'] = '85';
$config->story->datatable->fieldList['stage']['required'] = 'no';
$config->story->datatable->fieldList['openedBy']['title'] = 'openedByAB';
+15 -1
View File
@@ -114,6 +114,8 @@ class story extends control
$this->view->$fromObjectName = $fromObject;
}
$copyStoryID = $storyID;
if(!empty($_POST))
{
$response['result'] = 'success';
@@ -237,7 +239,19 @@ class story extends control
setcookie('storyModule', 0, 0, $this->config->webRoot, '', $this->config->cookieSecure, false);
$branchID = $this->post->branch ? $this->post->branch : $branch;
$response['locate'] = $this->createLink('product', 'browse', "productID=$productID&branch=$branchID&browseType=&param=0&type=$type&orderBy=id_desc");
if($this->session->storyList) $response['locate'] = $this->session->storyList;
if($this->session->storyList)
{
/* When copying story in the product plan, return to different pages for story#32949. */
if($copyStoryID and strpos($this->session->storyList, 'productplan') !== false)
{
$storyInfo = $this->story->getByList(array($storyID, $copyStoryID));
if($storyInfo[$storyID]->plan == $storyInfo[$copyStoryID]->plan or $storyInfo[$storyID]->product != $storyInfo[$copyStoryID]->product) $response['locate'] = $this->session->storyList;
}
else
{
$response['locate'] = $this->session->storyList;
}
}
}
else
{
+10 -7
View File
@@ -13,10 +13,13 @@ select[id^="story"] + .picker-single {width: 130px; max-width: 130px;}
.chosen-results > li.has-task.highlighted,
.chosen-results > li.has-new-task.highlighted {color: #fff;}
.c-id {width: 30px;}
.c-name, .c-desc {width: 150px;}
.c-story {width: 200px;}
.c-assigned {width: 130px;}
.c-date {width: 120px;}
.c-pri {width: 80px;}
.c-actions {width: 60px;}
#batchToTaskForm .c-id {width: 30px;}
#batchToTaskForm .c-name, #batchToTaskForm .c-desc {width: 150px;}
#batchToTaskForm .c-story {width: 200px;}
#batchToTaskForm .c-assigned {width: 125px;}
#batchToTaskForm .c-date {width: 105px;}
#batchToTaskForm .c-pri {width: 65px;}
#batchToTaskForm .c-actions, #batchToTaskForm .c-estimate {width: 60px;}
#batchToTaskForm .input-group-addon {padding: 5px 6px;}
[lang^=de] #batchToTaskForm .c-date {width: 120px;}
[lang^=de] #batchToTaskForm .c-estimate {width: 65px;}
+1
View File
@@ -271,6 +271,7 @@ function addRow(obj)
$row.find('div[id$=_chosen]').remove();
$row.find('.picker').remove();
$row.find('.chosen').chosen();
$row.find('.picker-select').picker();
var begin = parseInt($(obj).parent().siblings('.c-id').text()) + 1;
var count = $('#tableBody tbody > tr').length;
+1 -1
View File
@@ -3807,7 +3807,7 @@ class taskModel extends model
$list .= common::hasPriv('task', 'view') ? html::a(helper::createLink('task', 'view', "id=$task->id"), $task->name, '', "style='color: $task->color'", "data-app='project'") : "<span style='color:$task->color'>$task->name</span>";
if(!helper::isZeroDate($task->deadline))
{
if($task->status != done)
if($task->status != 'done')
{
$list .= strtotime($today) > strtotime($task->deadline) ? '<span class="label label-danger label-badge">' . $this->lang->execution->delayed . '</span>' : '';
}
+2
View File
@@ -22,6 +22,7 @@ $config->upgrade->maxVersion['max3_2'] = '17_1';
$config->upgrade->maxVersion['max3_3'] = '17_2';
$config->upgrade->maxVersion['max3_4'] = '17_3';
$config->upgrade->maxVersion['max3_5'] = '17_4';
$config->upgrade->maxVersion['max3_6'] = '17_5';
$config->upgrade->bizVersion = array();
$config->upgrade->bizVersion['biz1_0'] = '9_5_1';
@@ -82,6 +83,7 @@ $config->upgrade->bizVersion['biz7_1'] = '17_1';
$config->upgrade->bizVersion['biz7_2'] = '17_2';
$config->upgrade->bizVersion['biz7_3'] = '17_3';
$config->upgrade->bizVersion['biz7_4'] = '17_4';
$config->upgrade->bizVersion['biz7_5'] = '17_5';
$config->upgrade->proVersion = array();
$config->upgrade->proVersion['pro1_0'] = '3_1';
+3
View File
@@ -163,6 +163,7 @@ $lang->upgrade->fromVersions['17_1'] = '17.1';
$lang->upgrade->fromVersions['17_2'] = '17.2';
$lang->upgrade->fromVersions['17_3'] = '17.3';
$lang->upgrade->fromVersions['17_4'] = '17.4';
$lang->upgrade->fromVersions['17_5'] = '17.5';
global $config;
/* Lite. */
@@ -330,6 +331,7 @@ $lang->upgrade->fromVersions['biz7_1'] = 'Biz7.1';
$lang->upgrade->fromVersions['biz7_2'] = 'Biz7.2';
$lang->upgrade->fromVersions['biz7_3'] = 'Biz7.3';
$lang->upgrade->fromVersions['biz7_4'] = 'Biz7.4';
$lang->upgrade->fromVersions['biz7_5'] = 'Biz7.5';
/* Max. */
$lang->upgrade->fromVersions['max2_0_beta4'] = 'Max2.0.beta4';
@@ -353,3 +355,4 @@ $lang->upgrade->fromVersions['max3_1'] = 'Max3.1';
$lang->upgrade->fromVersions['max3_2'] = 'Max3.2';
$lang->upgrade->fromVersions['max3_3'] = 'Max3.3';
$lang->upgrade->fromVersions['max3_4'] = 'Max3.4';
$lang->upgrade->fromVersions['max3_5'] = 'Max3.5';
+79 -4
View File
@@ -531,9 +531,6 @@ class upgradeModel extends model
$this->processBugLinkBug();
break;
case '17_4':
$this->processCreatedInfo();
$this->processCreatedBy();
$this->updateApproval();
$this->updateSearchIndex();
break;
}
@@ -681,9 +678,13 @@ class upgradeModel extends model
$this->processFlowPosition();
break;
case 'biz7.4':
$this->processCreatedInfo();
$this->processCreatedBy();
$this->updateApproval();
$this->addDefaultRuleToWorkflow();
$this->addFlowActions('biz7.3');
$this->processReviewLinkages();
$this->addFlowActions('biz7.4');
$this->addFlowFields('biz7.4');
break;
}
}
@@ -6961,4 +6962,78 @@ class upgradeModel extends model
}
return !dao::isError();
}
/**
* Add flow fields.
*
* @param int $version
* @access public
* @return bool
*/
public function addFlowFields($version)
{
$this->loadModel('workflowfield');
$upgradeLang = $this->lang->workflowfield->upgrade[$version];
$upgradeConfig = $this->config->workflowfield->upgrade[$version];
$now = helper::now();
foreach($upgradeLang as $module => $fields)
{
$field = new stdclass();
$field->buildin = '1';
$field->role = 'buildin';
$field->module = $module;
$field->createdBy = $this->app->user->account;
$field->createdDate = $now;
foreach($fields as $code => $name)
{
$field->field = $code;
$field->name = $name;
$fieldConfig = isset($upgradeConfig[$module][$code]) ? $upgradeConfig[$module][$code] : array();
foreach($fieldConfig as $key => $value) $field->$key = $value;
$this->dao->insert(TABLE_WORKFLOWFIELD)->data($field)->autoCheck()->exec();
}
}
return !dao::isError();
}
/**
* Process review linkages of approval.
*
* @access public
* @return bool
*/
public function processReviewLinkages()
{
$linkagePairs = $this->dao->select('id, linkages')->from(TABLE_WORKFLOWACTION)->where('action')->eq('approvalreview')->andWhere('role')->eq('approval')->fetchPairs();
$oldLinkages = array();
$oldLinkages[0]['sources'][0]['field'] = 'reviewResult';
$oldLinkages[0]['sources'][0]['operator'] = '==';
$oldLinkages[0]['sources'][0]['value'] = 'reject';
$oldLinkages[0]['targets'][0]['field'] = 'reviewOpinion';
$oldLinkages[0]['targets'][0]['status'] = 'show';
$newLinkages = array();
$newLinkages[0]['sources'][0]['field'] = 'reviewResult';
$newLinkages[0]['sources'][0]['operator'] = '==';
$newLinkages[0]['sources'][0]['value'] = 'pass';
$newLinkages[0]['targets'][0]['field'] = 'reviewOpinion';
$newLinkages[0]['targets'][0]['status'] = 'hide';
foreach($linkagePairs as $id => $linkages)
{
if(helper::jsonEncode($oldLinkages) == $linkages)
{
$this->dao->update(TABLE_WORKFLOWACTION)->set('linkages')->eq(helper::jsonEncode($newLinkages))->where('id')->eq($id)->exec();
}
}
return !dao::isError();
}
}
+6 -4
View File
@@ -1165,10 +1165,9 @@ class bugTest
*/
public function activateObject($bugID)
{
$change = $this->objectModel->activate($bugID, '');
$_POST['assignedTo'] = 'admin';
$changes = $this->objectModel->activate($bugID, '');
if($change == array()) $change = '没有数据更新';
if($changes == array()) $changes = '没有数据更新';
if(dao::isError())
{
@@ -1176,7 +1175,10 @@ class bugTest
}
else
{
return $change;
foreach($changes as $change)
{
if($change['field'] == 'activatedCount') return $change;
}
}
}
+10 -10
View File
@@ -12,20 +12,20 @@ pid=1
测试激活状态为active的bug1 >> activatedCount,0,1
测试激活状态为active的bug2 >> activatedCount,0,1
测试激活状态为resolved的bug51 >> assignedTo,dev1,admin;activatedCount,0,1
测试激活状态为resolved的bug52 >> assignedTo,dev1,admin;activatedCount,0,1
测试激活状态为closed的bug81 >> assignedTo,test1,admin;activatedCount,0,1
测试激活状态为closed的bug82 >> assignedTo,test1,admin;activatedCount,0,1
测试激活状态为resolved的bug51 >> activatedCount,0,1
测试激活状态为resolved的bug52 >> activatedCount,0,1
测试激活状态为closed的bug81 >> activatedCount,0,1
测试激活状态为closed的bug82 >> activatedCount,0,1
*/
$bugIDList = array('1', '2', '51', '52', '81', '82');
$bug=new bugTest();
r($bug->activateObject($bugIDList[0])) && p('2:field,old,new') && e('activatedCount,0,1'); // 测试激活状态为active的bug1
r($bug->activateObject($bugIDList[1])) && p('1:field,old,new') && e('activatedCount,0,1'); // 测试激活状态为active的bug2
r($bug->activateObject($bugIDList[2])) && p('0:field,old,new;2:field,old,new') && e('assignedTo,dev1,admin;activatedCount,0,1'); // 测试激活状态为resolved的bug51
r($bug->activateObject($bugIDList[3])) && p('0:field,old,new;2:field,old,new') && e('assignedTo,dev1,admin;activatedCount,0,1'); // 测试激活状态为resolved的bug52
r($bug->activateObject($bugIDList[4])) && p('0:field,old,new;2:field,old,new') && e('assignedTo,test1,admin;activatedCount,0,1'); // 测试激活状态为closed的bug81
r($bug->activateObject($bugIDList[5])) && p('0:field,old,new;2:field,old,new') && e('assignedTo,test1,admin;activatedCount,0,1'); // 测试激活状态为closed的bug82
r($bug->activateObject($bugIDList[0])) && p('field,old,new') && e('activatedCount,0,1'); // 测试激活状态为active的bug1
r($bug->activateObject($bugIDList[1])) && p('field,old,new') && e('activatedCount,0,1'); // 测试激活状态为active的bug2
r($bug->activateObject($bugIDList[2])) && p('field,old,new') && e('activatedCount,0,1'); // 测试激活状态为resolved的bug51
r($bug->activateObject($bugIDList[3])) && p('field,old,new') && e('activatedCount,0,1'); // 测试激活状态为resolved的bug52
r($bug->activateObject($bugIDList[4])) && p('field,old,new') && e('activatedCount,0,1'); // 测试激活状态为closed的bug81
r($bug->activateObject($bugIDList[5])) && p('field,old,new') && e('activatedCount,0,1'); // 测试激活状态为closed的bug82
$db->restoreDB();
+4 -4
View File
@@ -10,12 +10,12 @@ cid=1
pid=1
获取主干bug数 >> 主干,291
获取bug数 >> ,3
获取项目版本版本1bug数 >> 迭代版本版本1,6
获取bug数 >> 未设定,3
获取项目版本版本1bug数 >> 项目版本版本1,6
*/
$bug=new bugTest();
r($bug->getDataOfBugsPerBuildTest()) && p('trunk:name,value') && e('主干,291'); // 获取主干bug数
r($bug->getDataOfBugsPerBuildTest()) && p('0:name,value') && e(',3'); // 获取bug数
r($bug->getDataOfBugsPerBuildTest()) && p('1:name,value') && e('迭代版本版本1,6'); // 获取项目版本版本1bug数
r($bug->getDataOfBugsPerBuildTest()) && p('0:name,value') && e('未设定,3'); // 获取bug数
r($bug->getDataOfBugsPerBuildTest()) && p('1:name,value') && e('项目版本版本1,6'); // 获取项目版本版本1bug数
+2 -2
View File
@@ -9,7 +9,7 @@ title=bugModel->processBuildForBugs();
cid=1
pid=1
测试处理bug1 2 3的openedBuild resolvedBuild字段 >> 产品发布9,;0,;产品发布9,
测试处理bug1 2 3的openedBuild resolvedBuild字段 >> 项目版本版本1,;0,;项目版本版本1,
测试处理bug4 5 6的openedBuild resolvedBuild字段 >> 主干,;主干,;主干,
测试处理bug51 52 53的openedBuild resolvedBuild字段 >> 主干,;主干,;主干,
测试处理bug54 55 56的openedBuild resolvedBuild字段 >> 主干,;主干,;主干,主干
@@ -26,7 +26,7 @@ $bugIDList5 = array('81', '82', '83');
$bugIDList6 = array('84', '85', '86');
$bug=new bugTest();
r($bug->processBuildForBugsTest($bugIDList1)) && p('1:openedBuild,resolvedBuild;2:openedBuild,resolvedBuild;3:openedBuild,resolvedBuild') && e('产品发布9,;0,;产品发布9,'); // 测试处理bug1 2 3的openedBuild resolvedBuild字段
r($bug->processBuildForBugsTest($bugIDList1)) && p('1:openedBuild,resolvedBuild;2:openedBuild,resolvedBuild;3:openedBuild,resolvedBuild') && e('项目版本版本1,;0,;项目版本版本1,'); // 测试处理bug1 2 3的openedBuild resolvedBuild字段
r($bug->processBuildForBugsTest($bugIDList2)) && p('4:openedBuild,resolvedBuild;5:openedBuild,resolvedBuild;6:openedBuild,resolvedBuild') && e('主干,;主干,;主干,'); // 测试处理bug4 5 6的openedBuild resolvedBuild字段
r($bug->processBuildForBugsTest($bugIDList3)) && p('51:openedBuild,resolvedBuild;52:openedBuild,resolvedBuild;53:openedBuild,resolvedBuild') && e('主干,;主干,;主干,'); // 测试处理bug51 52 53的openedBuild resolvedBuild字段
r($bug->processBuildForBugsTest($bugIDList4)) && p('54:openedBuild,resolvedBuild;55:openedBuild,resolvedBuild;56:openedBuild,resolvedBuild') && e('主干,;主干,;主干,主干'); // 测试处理bug54 55 56的openedBuild resolvedBuild字段
+30
View File
@@ -0,0 +1,30 @@
#!/usr/bin/env php
<?php
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
include dirname(dirname(dirname(__FILE__))) . '/class/file.class.php';
/**
title=测试 fileModel->getSaveName();
cid=1
pid=1
*/
global $tester;
$tester->loadModel('file');
$file1 = $tester->file->getByID(1);
$file10 = $tester->file->getByID(10);
$file45 = $tester->file->getByID(45);
su('user10');
r($tester->file->checkPriv($file1)) && p() && e(1); // 查看用户user10是否有下载附件1的权限
r($tester->file->checkPriv($file10)) && p() && e(1); // 查看用户user10是否有下载附件10的权限
r($tester->file->checkPriv($file45)) && p() && e(0); // 查看用户user10是否有下载附件45的权限
su('dev38');
r($tester->file->checkPriv($file1)) && p() && e(1); // 查看用户dev38是否有下载附件1的权限
r($tester->file->checkPriv($file10)) && p() && e(1); // 查看用户dev38是否有下载附件10的权限
r($tester->file->checkPriv($file45)) && p() && e(0); // 查看用户dev38是否有下载附件45的权限
+1 -1
View File
@@ -1 +1 @@
v6.1.0-rc.5
v6.2.0-rc.3
+1 -1
View File
@@ -1 +1 @@
6.1
6.2