Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms
This commit is contained in:
+17
-1
@@ -1,4 +1,10 @@
|
||||
stages:
|
||||
- sonar
|
||||
- unit_test
|
||||
- cleanup_packages
|
||||
- package
|
||||
sonarqube:
|
||||
stage: sonar
|
||||
variables:
|
||||
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
|
||||
GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
|
||||
@@ -11,12 +17,21 @@ sonarqube:
|
||||
allow_failure: true
|
||||
only:
|
||||
- master # or the name of your main branch
|
||||
packages:
|
||||
package:
|
||||
stage: package
|
||||
script:
|
||||
- make cizip
|
||||
allow_failure: true
|
||||
only:
|
||||
- master
|
||||
unit_test:
|
||||
stage: unit_test
|
||||
script:
|
||||
- "/home/gitlab-runner/bin/zentao-unittest.sh ${CI_PROJECT_DIR}"
|
||||
allow_failure: true
|
||||
only:
|
||||
- master
|
||||
- merge_requests
|
||||
#notify:
|
||||
# script:
|
||||
# - 'curl --location --request POST ''http://api.lf.oop.cc/api/v1/xuan/chatMessage'' --header ''Content-Type: application/json'' --data-raw ''{"gid": "84be4c6e-02e3-4fdc-b081-318c0c1eca02", "title": "开源包下载地址", "content": "点击查看详情链接", "url": "http://10.0.7.242:8080/allpacks/"}'''
|
||||
@@ -24,6 +39,7 @@ packages:
|
||||
# only:
|
||||
# - master
|
||||
cleanup_packages:
|
||||
stage: cleanup_packages
|
||||
script:
|
||||
- make clean
|
||||
when: on_failure
|
||||
|
||||
@@ -120,7 +120,7 @@ class productEntry extends Entry
|
||||
if(isset($data->result) and $data->result == 'fail') return $this->sendError(400, $data->message);
|
||||
|
||||
$product = $this->product->getByID($productID);
|
||||
$this->send(200, $this->format($product, 'createdDate:time'));
|
||||
$this->send(200, $this->format($product, 'createdDate:time,whitelist:userList,createdBy:user,PO:user,RD:user,QD:user'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+19
-5
@@ -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');
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
@@ -29,6 +29,7 @@ $filter->default->cookie['fingerprint'] = 'reg::word';
|
||||
$filter->default->cookie['hideMenu'] = 'equal::true';
|
||||
$filter->default->cookie['tab'] = 'reg::word';
|
||||
$filter->default->cookie['goback'] = 'reg::any';
|
||||
$filter->default->cookie['maxImport'] = 'reg::any';
|
||||
|
||||
$filter->index = new stdclass();
|
||||
$filter->my = new stdclass();
|
||||
|
||||
@@ -222,6 +222,8 @@ $config->openMethods[] = 'kanban.deleteobjectcard';
|
||||
$config->openMethods[] = 'admin.ignore';
|
||||
$config->openMethods[] = 'personnel.unbindwhitelist';
|
||||
$config->openMethods[] = 'tree.viewhistory';
|
||||
$config->openMethods[] = 'doc.createbasicinfo';
|
||||
$config->openMethods[] = 'project.createguide';
|
||||
|
||||
/* Define the tables. */
|
||||
define('TABLE_COMPANY', '`' . $config->db->prefix . 'company`');
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+12
-11
@@ -1,9 +1,7 @@
|
||||
ALTER TABLE `zt_task` ADD `order` mediumint(8) NOT NULL DEFAULT 0 AFTER `activatedDate`;
|
||||
ALTER TABLE `zt_task` ADD INDEX `order` (`order`);
|
||||
ALTER TABLE `zt_story` ADD COLUMN `linkRequirements` varchar(255) NOT NULL AFTER `linkStories`;
|
||||
|
||||
ALTER TABLE `zt_searchindex` ADD FULLTEXT `title_content` (`title`, `content`);
|
||||
ALTER TABLE `zt_searchindex` DROP INDEX `title`;
|
||||
ALTER TABLE `zt_searchindex` DROP INDEX `content`;
|
||||
|
||||
ALTER TABLE `zt_productplan` ADD `createdBy` varchar(30) NOT NULL AFTER `closedReason`;
|
||||
ALTER TABLE `zt_productplan` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
|
||||
@@ -13,12 +11,15 @@ ALTER TABLE `zt_release` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
ALTER TABLE `zt_testtask` ADD `createdBy` varchar(30) NOT NULL AFTER `subStatus`;
|
||||
ALTER TABLE `zt_testtask` 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'),
|
||||
('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');
|
||||
ALTER TABLE `zt_build` ADD `createdBy` varchar(30) NOT NULL AFTER `desc`;
|
||||
ALTER TABLE `zt_build` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
|
||||
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';
|
||||
|
||||
UPDATE `zt_project` SET `closedDate`='' AND `closedBy`='' WHERE `status` != 'closed';
|
||||
UPDATE `zt_grouppriv` SET `method`='exportTemplate' WHERE `method` = 'exportTemplet';
|
||||
|
||||
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');
|
||||
|
||||
+5
-1
@@ -331,6 +331,8 @@ CREATE TABLE IF NOT EXISTS `zt_build` (
|
||||
`bugs` text NOT NULL,
|
||||
`builder` char(30) NOT NULL default '',
|
||||
`desc` mediumtext NOT NULL,
|
||||
`createdBy` varchar(30) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
`deleted` enum('0','1') NOT NULL default '0',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `product` (`product`),
|
||||
@@ -1527,6 +1529,7 @@ CREATE TABLE IF NOT EXISTS `zt_task` (
|
||||
`lastEditedBy` varchar(30) NOT NULL,
|
||||
`lastEditedDate` datetime NOT NULL,
|
||||
`activatedDate` datetime NOT NULL,
|
||||
`order` mediumint(8) unsigned NOT NULL,
|
||||
`repo` mediumint(8) unsigned NOT NULL,
|
||||
`mr` mediumint(8) unsigned NOT NULL,
|
||||
`entry` varchar(255) NOT NULL,
|
||||
@@ -1539,7 +1542,8 @@ CREATE TABLE IF NOT EXISTS `zt_task` (
|
||||
KEY `execution` (`execution`),
|
||||
KEY `story` (`story`),
|
||||
KEY `parent` (`parent`),
|
||||
KEY `assignedTo` (`assignedTo`)
|
||||
KEY `assignedTo` (`assignedTo`),
|
||||
KEY `order` (`order`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_taskestimate`;
|
||||
CREATE TABLE IF NOT EXISTS `zt_taskestimate` (
|
||||
|
||||
+159
@@ -1,3 +1,156 @@
|
||||
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 甘特图支持拖拽设置任务的起止日期
|
||||
7742 反馈模块动作设计增加回复和追问动作
|
||||
8252 动作界面只读字段设置默认值,创建的时候写入到数据库
|
||||
9004 数据校验取消校验按钮交互优化
|
||||
33993 甘特图样式优化
|
||||
34482 新增反馈编辑他人反馈的权限
|
||||
35082 执行甘特图,增加任务顺序的拖动排序功能
|
||||
35857 反馈列表转用户需求icon更换
|
||||
35933 执行甘特图的持续天数改成工期
|
||||
35236 在执行需求列表的搜索条件中可以搜索工作流的需求流程中新增的字段
|
||||
35699 bug模块动作设计增加批量激活的动作
|
||||
35802 工作流自定义流程,保存成功的提示交互优化
|
||||
旗舰版:
|
||||
35836 项目问题列表中优先级字段居中显示
|
||||
35837 项目问题列表“优先级”字段修改为“P”
|
||||
35838 项目风险列表中风险系数和优先级字段居中显示
|
||||
35868 瀑布项目培训能力差距分析列表各字段宽度调整
|
||||
35997 项目度量的项目工作量报表的右侧标题加粗显示
|
||||
32555 瀑布项目甘特图支持拖动调整起止日期
|
||||
33995 甘特图样式优化
|
||||
34893 项目计划甘特图,增加阶段/任务顺序的拖动排序功能
|
||||
34895 增加按指派分组功能
|
||||
35061 甘特图编辑权限
|
||||
35382 复制项目交互样式优化
|
||||
35393 甘特图升级到最近版本
|
||||
34372 新建项目增加复制项目信息入口
|
||||
34723 项目复制选择项目
|
||||
34724 项目复制信息
|
||||
34725 项目复制项目信息确认
|
||||
34726 项目复制阶段信息确认
|
||||
34727 项目复制迭代信息确认
|
||||
34728 项目复制弹窗提示
|
||||
35217 复制项目,阶段信息确认页面增加阶段选择弹窗
|
||||
35218 复制项目的交互样式优化
|
||||
35310 复制项目增加团队成员与权限复制
|
||||
36036 关闭审批后停用发起动作,再次开启审批未自动启用动作
|
||||
禅道客户端:
|
||||
34119 一键包集成喧喧网页端
|
||||
34460 优化会话中禅道链接卡片的跳转交互
|
||||
34667 完善XXD命令行应用给出的提示
|
||||
34668 修改docker入口脚本,确保owt中的rabbitmq正常启动
|
||||
34669 服务器地址不正确导致客户端登录失败后,尝试去掉路径后进行重试
|
||||
34670 完善音视频服务器端口配置和提示
|
||||
34671 优化音视频服务配置中“是否启用HTTPS”的设置
|
||||
34672 设计并增加离线部署SRS音视频的方案
|
||||
34673 没有麦克风时允许加入会议
|
||||
34848 解决服务器时间和客户端时间不一样的问题
|
||||
35087 研究喧喧和其他应用系统的多页面集成
|
||||
35088 删除服务器聊天记录的功能
|
||||
35268 通过服务端下载客户端后,登录时带入服务端地址
|
||||
35280 实现自动清理解散90天以上群数据的功能
|
||||
35294 后台检查XXC是否有新版时去掉XXB的版本判断
|
||||
35297 网络诊断时给出具体提示以引导用户
|
||||
修复的Bug
|
||||
22662 执行任务列表父子任务显示错乱
|
||||
24608 英文下批量编辑执行页面执行状态名称显示不全
|
||||
24743 测试单下所有用例页面执行状态排序按钮部分遮挡
|
||||
25416 产品列表分页逻辑问题
|
||||
25563 已设置颜色的任务名称,阶段列表显示任务名称的颜色
|
||||
25837 产品-计划的需求列表没有展示需求标题颜色
|
||||
25851 导入任务相关研发需求详情弹窗中样式问题
|
||||
25282 导入用户时,左右滚动条必须拖动到底部才显示
|
||||
25019 需要测试再进行详细确认:xxd以windows服务的形式启动(注意是在windows管理的服务里面点击启动),日志会存在C:\Windows\System32\log下
|
||||
25273 禅道卡片中的弹窗不展示
|
||||
25390 一张图片发送多人再撤回其中一张图,在其他窗口中图片显示已撤回
|
||||
25402 sendChatMessage返回值有问题
|
||||
25427 提示升级页面不显示了
|
||||
25526 后台没有被禁用的用户登录客户端时提示“账号被禁用”
|
||||
25603 喧喧一键安装包安装xxd错误
|
||||
25605 独立消息记录窗口中链接打不开
|
||||
25622 连续发送消息不给提示
|
||||
25628 客户端链接转任务跳转到地盘
|
||||
25630 消息记录点击两次喧喧直接崩溃了
|
||||
25644 产品计划卡片没显示内容
|
||||
25646 禅道客户端一、口、x遮挡成员按钮
|
||||
|
||||
2022-07-27 17.4
|
||||
完成的需求
|
||||
开源版:
|
||||
@@ -89,6 +242,12 @@
|
||||
29944 项目甘特图中支持显示阶段和任务的负责人
|
||||
34795 项目甘特图可以在阶段或任务前增加图标显示状态
|
||||
34742 项目甘特图中没有起止日期的任务的时间显示为所属阶段时间
|
||||
34729 QA质量保证计划可以批量编辑
|
||||
35424 产品计划增加审批设置
|
||||
35437 内置模块显示审批进度。
|
||||
35438 内置模块增加待我审批标签
|
||||
35596 产品发布增加审批设置
|
||||
35597 测试单增加审批设置
|
||||
禅道客户端:
|
||||
34124 XXD可以从XXB主动拉取配置
|
||||
34123 喧喧增加禅道的checktable.php以便自动修复数据库
|
||||
|
||||
@@ -197,7 +197,8 @@ $lang->admin->menu->dev['menuOrder'][15] = 'editor';
|
||||
$lang->admin->menu->dev['menuOrder'][20] = 'entry';
|
||||
|
||||
$lang->admin->menu->system['subMenu'] = new stdclass();
|
||||
$lang->admin->menu->system['subMenu']->data = array('link' => "{$lang->admin->data}|backup|index", 'subModule' => 'action');
|
||||
$lang->admin->menu->system['subMenu']->backup = array('link' => "{$lang->backup->common}|backup|index");
|
||||
$lang->admin->menu->system['subMenu']->trash = array('link' => "{$lang->action->trash}|action|trash");
|
||||
$lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->security|admin|safe", 'alias' => 'checkweak');
|
||||
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
|
||||
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
|
||||
|
||||
@@ -551,7 +551,7 @@ $lang->resource->task->recordEstimate = 'recordEstimateAction';
|
||||
$lang->resource->task->editEstimate = 'editEstimate';
|
||||
$lang->resource->task->deleteEstimate = 'deleteEstimate';
|
||||
$lang->resource->task->report = 'reportChart';
|
||||
if($config->edition != 'open') $lang->resource->task->exportTemplet = 'exportTemplet';
|
||||
if($config->edition != 'open') $lang->resource->task->exportTemplate = 'exportTemplate';
|
||||
if($config->edition != 'open') $lang->resource->task->import = 'import';
|
||||
|
||||
$lang->task->methodOrder[5] = 'create';
|
||||
@@ -577,7 +577,7 @@ $lang->task->methodOrder[100] = 'editEstimate';
|
||||
$lang->task->methodOrder[105] = 'deleteEstimate';
|
||||
$lang->task->methodOrder[110] = 'report';
|
||||
$lang->task->methodOrder[115] = 'batchChangeModule';
|
||||
$lang->task->methodOrder[120] = 'exportTemplet';
|
||||
$lang->task->methodOrder[120] = 'exportTemplate';
|
||||
$lang->task->methodOrder[125] = 'import';
|
||||
|
||||
/* Doc. */
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<div class='clearfix' id='mainMenu'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php
|
||||
foreach($lang->project->featureBar as $label => $labelName)
|
||||
foreach($lang->project->featureBar['browse'] as $label => $labelName)
|
||||
{
|
||||
$active = $status == $label ? 'btn-active-text' : '';
|
||||
echo html::a($this->createLink('project', 'execution', "status=$label&projectID=$projectID"), '<span class="text">' . $labelName . '</span> ' . ($status == $label ? "<span class='label label-light label-badge'>" . (int)count($kanbanList) . '</span>' : ''), '', "class='btn btn-link $active'");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
$config->story->list->exportFields = '
|
||||
$config->story->exportFields = '
|
||||
id, module, title, spec, keywords,
|
||||
pri, estimate, status,
|
||||
openedBy, openedDate, assignedTo, assignedDate, mailto,
|
||||
|
||||
@@ -336,6 +336,7 @@
|
||||
<?php js::set('storyPinYin', (empty($config->isINT) and class_exists('common')) ? common::convert2Pinyin($stories) : array());?>
|
||||
<?php js::set('testStoryIdList', $testStoryIdList);?>
|
||||
<?php js::set('executionID', $execution->id);?>
|
||||
<?php js::set('executionType', $execution->type);?>
|
||||
<?php if(isonlybody()):?>
|
||||
<style>
|
||||
.body-modal .main-header {padding-right: 0px; z-index: 1000;}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php if($config->visions == ',lite,'):?>
|
||||
<?php $feedbackDatasources = $this->dao->select('id')->from(TABLE_WORKFLOWDATASOURCE)->where('code')->like('litefeedback%')->andWhere('vision')->eq('lite')->fetchPairs('id', 'id');?>
|
||||
<?php if($feedbackDatasources):?>
|
||||
<script>
|
||||
<?php foreach($feedbackDatasources as $id):?>
|
||||
$('#fieldOptionType option[value=<?php echo $id;?>]').remove();
|
||||
<?php endforeach;?>
|
||||
$('#fieldOptionType').trigger("chosen:updated");
|
||||
</script>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
@@ -253,10 +253,15 @@ class baseModel
|
||||
{
|
||||
if(empty($extensionName)) return false;
|
||||
|
||||
/* 设置扩展的名字和相应的文件。Set extenson name and extension file. */
|
||||
$moduleName = $moduleName ? $moduleName : $this->getModuleName();
|
||||
$moduleName = strtolower($moduleName);
|
||||
$extensionName = strtolower($extensionName);
|
||||
|
||||
/* 设置扩展类的名字。Set the extension class name. */
|
||||
$extensionClass = $extensionName . ucfirst($moduleName);
|
||||
if(isset($this->$extensionClass)) return $this->$extensionClass;
|
||||
|
||||
/* 设置扩展的名字和相应的文件。Set extenson name and extension file. */
|
||||
$moduleExtPath = $this->app->getModuleExtPath($this->appName, $moduleName, 'model');
|
||||
if(!empty($moduleExtPath['site'])) $extensionFile = $moduleExtPath['site'] . 'class/' . $extensionName . '.class.php';
|
||||
if(!isset($extensionFile) or !file_exists($extensionFile)) $extensionFile = $moduleExtPath['custom'] . 'class/' . $extensionName . '.class.php';
|
||||
@@ -265,10 +270,6 @@ class baseModel
|
||||
if(!isset($extensionFile) or !file_exists($extensionFile)) $extensionFile = $moduleExtPath['xuan'] . 'class/' . $extensionName . '.class.php';
|
||||
if(!isset($extensionFile) or !file_exists($extensionFile)) $extensionFile = $moduleExtPath['common'] . 'class/' . $extensionName . '.class.php';
|
||||
|
||||
/* 设置扩展类的名字。Set the extension class name. */
|
||||
$extensionClass = $extensionName . ucfirst($moduleName);
|
||||
if(isset($this->$extensionClass)) return $this->$extensionClass;
|
||||
|
||||
/* 载入父类。Try to import parent model file auto and then import the extension file. */
|
||||
if(!class_exists($moduleName . 'Model')) helper::import($this->app->getModulePath($this->appName, $moduleName) . 'model.php');
|
||||
if(!helper::import($extensionFile)) return false;
|
||||
|
||||
@@ -1525,8 +1525,14 @@ class baseRouter
|
||||
public function checkModuleName($var, $exit = true)
|
||||
{
|
||||
global $filter;
|
||||
$rule = $filter->default->moduleName;
|
||||
if(validater::checkByRule($var, $rule)) return true;
|
||||
static $checkedModule = array();
|
||||
if(!isset($checkedModule[$var]))
|
||||
{
|
||||
$rule = $filter->default->moduleName;
|
||||
$result = validater::checkByRule($var, $rule);
|
||||
$checkedModule[$var] = $result;
|
||||
}
|
||||
if($checkedModule[$var]) return true;
|
||||
if(!$exit) return false;
|
||||
$this->triggerError("'$var' illegal. ", __FILE__, __LINE__, $exit = true);
|
||||
}
|
||||
|
||||
@@ -389,27 +389,21 @@ class control extends baseControl
|
||||
* inForm=0|1 The fields displayed in a form or not. The default is 1.
|
||||
* inCell=0|1 The fields displayed in a div with class cell or not. The default is 0.
|
||||
* @param bool $print
|
||||
* @param string $moduleName
|
||||
* @param string $methodName
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function printExtendFields($object, $type, $extras = '', $print = true)
|
||||
public function printExtendFields($object, $type, $extras = '', $print = true, $moduleName = '', $methodName = '')
|
||||
{
|
||||
if(!isset($this->config->bizVersion)) return false;
|
||||
|
||||
$moduleName = $this->app->getModuleName();
|
||||
$methodName = $this->app->getMethodName();
|
||||
$moduleName = $moduleName ? $moduleName : $this->app->getModuleName();
|
||||
$methodName = $methodName ? $methodName : $this->app->getMethodName();
|
||||
$fields = $this->loadModel('flow')->printFields($moduleName, $methodName, $object, $type, $extras);
|
||||
if(!$print) return $fields;
|
||||
|
||||
$picker = '';
|
||||
//$jsRoot = $this->config->webRoot . "js/";
|
||||
//$picker = file_get_contents($this->app->getBasePath() . 'app/sys/common/view/picker.html.php');
|
||||
//$picker = substr($picker, strpos($picker, '<style>'));
|
||||
|
||||
//js::import($jsRoot . 'picker/min.js');
|
||||
//css::import($jsRoot . 'picker/min.css');
|
||||
|
||||
echo $picker . $fields;
|
||||
echo $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -163,12 +163,11 @@ class model extends baseModel
|
||||
if($type == 'view' && !empty($this->config->openedApproval) && commonModel::hasPriv('approval', 'progress'))
|
||||
{
|
||||
$flow = $this->loadModel('workflow', 'flow')->getByModule($moduleName);
|
||||
if($flow->approval == 'enabled')
|
||||
if($flow->approval == 'enabled' && !empty($data->approval))
|
||||
{
|
||||
$approvalID = isset($data->approval) ? $data->approval : 0;
|
||||
$extraClass = strpos(',testsuite,build,release,productplan,', ",{$moduleName},") !== false ? 'btn-link' : '';
|
||||
$approvalProgressMenu .= "<div class='divider'></div>";
|
||||
$approvalProgressMenu .= baseHTML::a(helper::createLink('approval', 'progress', "approvalID={$approvalID}", '', true), $this->lang->flow->approvalProgress, "class='btn {$extraClass} iframe'");
|
||||
$approvalProgressMenu .= baseHTML::a(helper::createLink('approval', 'progress', "approvalID={$data->approval}", '', true), $this->lang->flow->approvalProgress, "class='btn {$extraClass} iframe'");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -240,8 +240,8 @@ $lang->action->desc->linkrelatedcase = '$date, <strong>$actor</strong> hat ein
|
||||
$lang->action->desc->unlinkrelatedcase = '$date, <strong>$actor</strong> hate eine Fallverknüpfung aufgelöst <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to describe the history of operations link story and bug to productplan. */
|
||||
$lang->action->desc->linkstory = '$date, <strong>$actor</strong> link stories <strong>$extra</strong> to plan.' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <strong>$extra</strong> to plan.' . "\n";
|
||||
$lang->action->desc->linkstory = '$date, <strong>$actor</strong> link stories <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove stories <strong>$extra</strong> from plan.' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
|
||||
|
||||
@@ -382,6 +382,7 @@ $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->ganttmove = 'sorted';
|
||||
|
||||
/* Dynamic information is grouped by object. */
|
||||
$lang->action->dynamicAction = new stdclass;
|
||||
@@ -539,6 +540,7 @@ $lang->action->dynamicAction->task['undeleted'] = 'Restore Task';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Hide Task';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = 'Create Build';
|
||||
$lang->action->dynamicAction->build['edited'] = 'Edit Build';
|
||||
|
||||
@@ -240,8 +240,8 @@ $lang->action->desc->linkrelatedcase = '$date, <strong>$actor</strong> linked
|
||||
$lang->action->desc->unlinkrelatedcase = '$date, <strong>$actor</strong> unlinked a case <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to describe the history of operations link story and bug to productplan. */
|
||||
$lang->action->desc->linkstory = '$date, <strong>$actor</strong> link stories <strong>$extra</strong> to plan.' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <strong>$extra</strong> to plan.' . "\n";
|
||||
$lang->action->desc->linkstory = '$date, <strong>$actor</strong> link stories <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove stories <strong>$extra</strong> from plan.' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
|
||||
|
||||
@@ -382,6 +382,7 @@ $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->ganttmove = 'sorted';
|
||||
|
||||
/* Dynamic information is grouped by object. */
|
||||
$lang->action->dynamicAction = new stdclass;
|
||||
@@ -539,6 +540,7 @@ $lang->action->dynamicAction->task['undeleted'] = 'Restore Task';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Hide Task';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = 'Create Build';
|
||||
$lang->action->dynamicAction->build['edited'] = 'Edit Build';
|
||||
|
||||
@@ -240,8 +240,8 @@ $lang->action->desc->linkrelatedcase = '$date, <strong>$actor</strong> a fait
|
||||
$lang->action->desc->unlinkrelatedcase = '$date, <strong>$actor</strong> a délié le CasTest <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to describe the history of operations link story and bug to productplan. */
|
||||
$lang->action->desc->linkstory = '$date, <strong>$actor</strong> link stories <strong>$extra</strong> to plan.' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <strong>$extra</strong> to plan.' . "\n";
|
||||
$lang->action->desc->linkstory = '$date, <strong>$actor</strong> link stories <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove stories <strong>$extra</strong> from plan.' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
|
||||
|
||||
@@ -382,6 +382,7 @@ $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->ganttmove = 'sorted';
|
||||
|
||||
/* Dynamic information is grouped by object. */
|
||||
$lang->action->dynamicAction = new stdclass();
|
||||
@@ -539,6 +540,7 @@ $lang->action->dynamicAction->task['undeleted'] = 'Restaurer Tâche';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Masquer Tâche';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'Committer SVN';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'Committer GIT';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = 'Créer Build';
|
||||
$lang->action->dynamicAction->build['edited'] = 'Editer Build';
|
||||
|
||||
@@ -240,8 +240,8 @@ $lang->action->desc->linkrelatedcase = '$date, 由 <strong>$actor</strong> 关
|
||||
$lang->action->desc->unlinkrelatedcase = '$date, 由 <strong>$actor</strong> 移除相关用例 <strong>$extra</strong>。' . "\n";
|
||||
|
||||
/* 用来描述计划关联和移除需求、bug时的历史操作记录。*/
|
||||
$lang->action->desc->linkstory = '$date, 由 <strong>$actor</strong> 关联需求 <strong>$extra</strong> 到计划。' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, 由 <strong>$actor</strong> 关联BUG <strong>$extra</strong> 到计划。' . "\n";
|
||||
$lang->action->desc->linkstory = '$date, 由 <strong>$actor</strong> 关联需求 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, 由 <strong>$actor</strong> 关联BUG <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->unlinkstory = '$date, 由 <strong>$actor</strong> 从计划移除需求 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, 由 <strong>$actor</strong> 从计划移除BUG <strong>$extra</strong>。' . "\n";
|
||||
|
||||
@@ -382,6 +382,7 @@ $lang->action->label->unlinkstory = '移除需求从';
|
||||
$lang->action->label->unlinkbug = '移除BUG从';
|
||||
$lang->action->label->tolib = '导入了';
|
||||
$lang->action->label->updatetolib = '更新了';
|
||||
$lang->action->label->ganttmove = '排序了';
|
||||
|
||||
/* 动态信息按照对象分组 */
|
||||
$lang->action->dynamicAction = new stdclass();
|
||||
@@ -539,6 +540,7 @@ $lang->action->dynamicAction->task['undeleted'] = '还原任务';
|
||||
$lang->action->dynamicAction->task['hidden'] = '隐藏任务';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN提交';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT提交';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = '排序';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = '创建版本';
|
||||
$lang->action->dynamicAction->build['edited'] = '编辑版本';
|
||||
|
||||
+18
-22
@@ -104,7 +104,7 @@ class actionModel extends model
|
||||
*
|
||||
* @param int $actionID
|
||||
* @access public
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getUnreadActions($actionID = 0)
|
||||
{
|
||||
@@ -707,6 +707,7 @@ class actionModel extends model
|
||||
*/
|
||||
public function getTrashesBySearch($objectType, $type, $queryID, $orderBy, $pager = null)
|
||||
{
|
||||
if($objectType == 'all') return array();
|
||||
if($queryID and $queryID != 'myQueryID')
|
||||
{
|
||||
$query = $this->loadModel('search')->getQuery($queryID);
|
||||
@@ -858,7 +859,7 @@ class actionModel extends model
|
||||
$this->app->loadLang('mr');
|
||||
$desc = sprintf($this->lang->mr->createAction, $mrCreatedDate, $mrActor, $mrLink);
|
||||
}
|
||||
elseif($this->config->edition == 'max' and strpos($this->config->action->assetType, $action->objectType) !== false and $action->action == 'approved')
|
||||
elseif($this->config->edition == 'max' and strpos($this->config->action->assetType, ",{$action->objectType},") !== false and $action->action == 'approved')
|
||||
{
|
||||
$desc = empty($this->lang->action->approve->{$action->extra}) ? '' : $this->lang->action->approve->{$action->extra};
|
||||
}
|
||||
@@ -989,39 +990,43 @@ class actionModel extends model
|
||||
if($projectID == 'all') $authedProjects = (empty($aclViews) or (!empty($aclViews) and !empty($aclViews['project']))) ? $this->app->user->view->projects : '0';
|
||||
if($executionID == 'all') $authedExecutions = (empty($aclViews) or (!empty($aclViews) and !empty($aclViews['execution']))) ? $this->app->user->view->sprints : '0';
|
||||
|
||||
if(empty($authedProducts)) $authedProducts = '0';
|
||||
|
||||
if($productID == 'all' and $projectID == 'all')
|
||||
{
|
||||
$productCondition = '';
|
||||
foreach(explode(',', $authedProducts) as $product) $productCondition = empty($productCondition) ? "product LIKE '%,$product,%'" : "$productCondition OR product LIKE '%,$product,%'";
|
||||
foreach(explode(',', $authedProducts) as $product) $productCondition = empty($productCondition) ? "(execution = '0' and project = '0' and (product LIKE '%,$product,%'" : "$productCondition OR product LIKE '%,$product,%'";
|
||||
$productCondition .= '))';
|
||||
|
||||
$projectCondition = "project " . helper::dbIN($authedProjects);
|
||||
$executionCondition = isset($authedExecutions) ? "execution " . helper::dbIN($authedExecutions) : '';
|
||||
$projectCondition = "(execution = '0' and project != '0' and project " . helper::dbIN($authedProjects) . ')';
|
||||
$executionCondition = isset($authedExecutions) ? "(execution != 0 and execution " . helper::dbIN($authedExecutions) . ')' : '';
|
||||
}
|
||||
elseif($productID == 'all' and is_numeric($projectID))
|
||||
{
|
||||
$products = $this->loadModel('product')->getProductPairsByProject($projectID);
|
||||
$executions = $this->loadModel('execution')->getPairs($projectID);
|
||||
$executions = $this->loadModel('execution')->getPairs($projectID) + array(0 => 0);
|
||||
|
||||
$authedExecutions = isset($authedExecutions) ? array_intersect(array_keys($executions), explode(',', $authedExecutions)) : array_keys($executions);
|
||||
|
||||
$productCondition = '';
|
||||
foreach(array_keys($products) as $product) $productCondition = empty($productCondition) ? "product LIKE '%,$product,%'" : "$productCondition OR product LIKE '%,$product,%'";
|
||||
foreach(array_keys($products) as $product) $productCondition = empty($productCondition) ? "(execution = '0' and project = '0' and (product LIKE '%,$product,%'" : "$productCondition OR product LIKE '%,$product,%'";
|
||||
$productCondition .= '))';
|
||||
|
||||
$projectCondition = "project = $projectID";
|
||||
$executionCondition = "execution " . helper::dbIN($authedExecutions);
|
||||
$projectCondition = "(execution = '0' and project = '$projectID')";
|
||||
$executionCondition = "(execution != '0' and execution " . helper::dbIN($authedExecutions) . ')';
|
||||
}
|
||||
elseif(is_numeric($productID) and $projectID == 'all')
|
||||
{
|
||||
$this->loadModel('product');
|
||||
$projects = $this->product->getProjectPairsByProduct($productID);
|
||||
$executions = $this->product->getExecutionPairsByProduct($productID);
|
||||
$executions = $this->product->getExecutionPairsByProduct($productID) + array(0 => 0);
|
||||
|
||||
$authedProjects = array_intersect(array_keys($projects), explode(',', $authedProjects));
|
||||
$authedExecutions = isset($authedExecutions) ? array_intersect(array_keys($executions), explode(',', $authedExecutions)) : array_keys($executions);
|
||||
|
||||
$productCondition = "product like '%,$productID,%'";
|
||||
$projectCondition = 'project ' . helper::dbIN($authedProjects);
|
||||
$executionCondition = 'execution ' . helper::dbIN($authedExecutions);
|
||||
$projectCondition = "(execution = '0' and project != '0' and project " . helper::dbIN($authedProjects) . ')';
|
||||
$executionCondition = "(execution != '0' and execution " . helper::dbIN($authedExecutions) . ')';
|
||||
}
|
||||
|
||||
$condition = "((product =',0,' or product = '0' or product=',,') AND project = '0' AND execution = '0')";
|
||||
@@ -1222,17 +1227,8 @@ class actionModel extends model
|
||||
$relatedProjects = $relatedData['relatedProjects'];
|
||||
$requirements = $relatedData['requirements'];
|
||||
|
||||
$aclViews = isset($this->app->user->rights['acls']['views']) ? $this->app->user->rights['acls']['views'] : array();
|
||||
$authedProjects = (empty($aclViews) or (!empty($aclViews) and !empty($aclViews['project']))) ? ",{$this->app->user->view->projects}," : '';
|
||||
$authedExecutions = (empty($aclViews) or (!empty($aclViews) and !empty($aclViews['execution']))) ? ",{$this->app->user->view->sprints},": '';
|
||||
|
||||
foreach($actions as $i => $action)
|
||||
{
|
||||
if(($action->execution != '0' and strpos($authedExecutions, ",$action->execution,") === false) or ($action->execution == '0' and $action->project != '0' and strpos($authedProjects, ",$action->project,") === false))
|
||||
{
|
||||
unset($actions[$i]);
|
||||
continue;
|
||||
}
|
||||
/* Add name field to the actions. */
|
||||
$action->objectName = isset($objectNames[$action->objectType][$action->objectID]) ? $objectNames[$action->objectType][$action->objectID] : '';
|
||||
|
||||
@@ -1469,7 +1465,7 @@ class actionModel extends model
|
||||
}
|
||||
|
||||
if($this->config->edition == 'max'
|
||||
and strpos($this->config->action->assetType, $action->objectType) !== false
|
||||
and strpos($this->config->action->assetType, ",{$action->objectType},") !== false
|
||||
and empty($action->project) and empty($action->product) and empty($action->execution))
|
||||
{
|
||||
if($action->objectType == 'doc')
|
||||
|
||||
@@ -373,4 +373,84 @@ class admin extends control
|
||||
$this->view->title = $this->lang->admin->resetPWDSetting;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show table engine.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function tableEngine()
|
||||
{
|
||||
$this->view->title = $this->lang->admin->tableEngine;
|
||||
$this->view->tableEngines = $this->loadModel('misc')->getTableEngines();
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax change table engine.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxChangeTableEngine($tableName)
|
||||
{
|
||||
$response = array();
|
||||
$response['result'] = 'success';
|
||||
$response['message'] = '';
|
||||
|
||||
$tableEngines = $this->loadModel('misc')->getTableEngines();
|
||||
if(!isset($tableEngines[$tableName]))
|
||||
{
|
||||
$response['result'] = 'fail';
|
||||
return print(json_encode($response));
|
||||
}
|
||||
|
||||
if($tableEngines[$tableName] == 'InnoDB')
|
||||
{
|
||||
$response['message'] = sprintf($this->lang->admin->changeSuccess, $tableName);
|
||||
return print(json_encode($response));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
/* Check process this table or not. */
|
||||
$dbProcesses = $this->dao->query("SHOW PROCESSLIST")->fetchAll();
|
||||
foreach($dbProcesses as $dbProcess)
|
||||
{
|
||||
if($dbProcess->db != $this->config->db->name) continue;
|
||||
if(strpos($dbProcess->Info, " {$tableName} ") !== false)
|
||||
{
|
||||
$response['message'] = sprintf($this->lang->upgrade->changingTable, $tableName);
|
||||
return print(json_encode($response));
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(PDOException $e){}
|
||||
|
||||
if(stripos($tableName, 'searchindex') !== false)
|
||||
{
|
||||
$mysqlVersion = $this->loadModel('install')->getMysqlVersion();
|
||||
if($mysqlVersion < 5.6)
|
||||
{
|
||||
$response['result'] = 'fail';
|
||||
$response['message'] = $this->lang->admin->errorInnodb;
|
||||
return print(json_encode($response));
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$sql = "ALTER TABLE `$tableName` ENGINE='InnoDB'";
|
||||
$this->dao->exec($sql);
|
||||
$response['message'] = sprintf($this->lang->admin->changeSuccess, $tableName);
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
$response['result'] = 'fail';
|
||||
$response['message'] = sprintf($this->lang->admin->changeFail, $tableName, htmlspecialchars($e->getMessage()));
|
||||
}
|
||||
|
||||
return print(json_encode($response));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ $lang->admin->captcha = 'Bestätigungscode';
|
||||
$lang->admin->getCaptcha = 'Bestätigungscode anfordern';
|
||||
$lang->admin->register = 'Register';
|
||||
$lang->admin->resetPWDSetting = 'Reset password Setting';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->admin->api = 'API';
|
||||
$lang->admin->log = 'Log';
|
||||
@@ -29,6 +30,15 @@ $lang->admin->setting = 'Einstellungen';
|
||||
$lang->admin->days = 'Gültige Tage';
|
||||
$lang->admin->resetPWDByMail = 'Reset the password via the email';
|
||||
|
||||
$lang->admin->changeEngine = "Change to InnoDB";
|
||||
$lang->admin->changingTable = 'Replacing data table %s engine...';
|
||||
$lang->admin->changeSuccess = 'The data table %s engine has been changed to InnoDB.';
|
||||
$lang->admin->changeFail = "Failed to replace table %s engine. Reason: <span class='text-red'>%s</span>。";
|
||||
$lang->admin->errorInnodb = 'Your MySQL does not support InnoDB data table engine.';
|
||||
$lang->admin->engineInfo = "The <strong>%s</strong> table engine is <strong>%s</strong>.";
|
||||
$lang->admin->engineSummary['hasMyISAM'] = "There are %s tables that are not InnoDB engines";
|
||||
$lang->admin->engineSummary['allInnoDB'] = "All tables are InnoDB engines";
|
||||
|
||||
$lang->admin->info = new stdclass();
|
||||
$lang->admin->info->version = 'Aktuelle Version ist %s. ';
|
||||
$lang->admin->info->links = 'You can visit links below';
|
||||
@@ -69,7 +79,7 @@ $lang->admin->safe->modeList[0] = 'N/A';
|
||||
$lang->admin->safe->modeList[1] = 'Medium';
|
||||
$lang->admin->safe->modeList[2] = 'Stark';
|
||||
|
||||
$lang->admin->safe->modeRuleList[1] = 'Beinhaltet Groß und Kleinbuchstaben sowie Ziffern. Länge >= 6';
|
||||
$lang->admin->safe->modeRuleList[1] = 'Beinhaltet Groß und Kleinbuchstaben sowie Ziffern. Länge >= 6.';
|
||||
$lang->admin->safe->modeRuleList[2] = 'Beinhaltet Groß und Kleinbuchstaben, Ziffern sowie Sonderzeichen. Länge >= 10.';
|
||||
|
||||
$lang->admin->safe->reasonList['weak'] = 'Bekannte Schwache Passwörter';
|
||||
@@ -87,5 +97,6 @@ $lang->admin->safe->loginCaptchaList[0] = 'Nein';
|
||||
$lang->admin->safe->resetPWDList[1] = 'ON';
|
||||
$lang->admin->safe->resetPWDList[0] = 'Off';
|
||||
|
||||
$lang->admin->safe->noticeMode = 'Password will be checked when a user logs in, or a user is added or edited.';
|
||||
$lang->admin->safe->noticeStrong = '';
|
||||
$lang->admin->safe->noticeMode = 'The password will be checked when creating and modifying user information, and changing passwords.';
|
||||
$lang->admin->safe->noticeWeakMode = 'The password will be checked when logging into the system, creating and modifying user information, and changing passwords.';
|
||||
$lang->admin->safe->noticeStrong = 'The longer the password, the more letters, numbers, or special characters it contains, and the less repetitive the password, the more secure it is!';
|
||||
|
||||
@@ -22,6 +22,7 @@ $lang->admin->captcha = 'Verification Code';
|
||||
$lang->admin->getCaptcha = 'Send Verification Code';
|
||||
$lang->admin->register = 'Register';
|
||||
$lang->admin->resetPWDSetting = 'Reset password Setting';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->admin->api = 'API';
|
||||
$lang->admin->log = 'Log';
|
||||
@@ -29,6 +30,15 @@ $lang->admin->setting = 'Setting';
|
||||
$lang->admin->days = 'Valid Day';
|
||||
$lang->admin->resetPWDByMail = 'Reset the password via the email';
|
||||
|
||||
$lang->admin->changeEngine = "Change to InnoDB";
|
||||
$lang->admin->changingTable = 'Replacing data table %s engine...';
|
||||
$lang->admin->changeSuccess = 'The data table %s engine has been changed to InnoDB.';
|
||||
$lang->admin->changeFail = "Failed to replace table %s engine. Reason: <span class='text-red'>%s</span>。";
|
||||
$lang->admin->errorInnodb = 'Your MySQL does not support InnoDB data table engine.';
|
||||
$lang->admin->engineInfo = "The <strong>%s</strong> table engine is <strong>%s</strong>.";
|
||||
$lang->admin->engineSummary['hasMyISAM'] = "There are %s tables that are not InnoDB engines";
|
||||
$lang->admin->engineSummary['allInnoDB'] = "All tables are InnoDB engines";
|
||||
|
||||
$lang->admin->info = new stdclass();
|
||||
$lang->admin->info->version = 'Current Version is %s. ';
|
||||
$lang->admin->info->links = 'You can visit links below';
|
||||
@@ -69,7 +79,7 @@ $lang->admin->safe->modeList[0] = 'I don\'t care.';
|
||||
$lang->admin->safe->modeList[1] = 'Medium';
|
||||
$lang->admin->safe->modeList[2] = 'Strong';
|
||||
|
||||
$lang->admin->safe->modeRuleList[1] = ' >= 6 upper and lower case, and numbers';
|
||||
$lang->admin->safe->modeRuleList[1] = ' >= 6 upper and lower case, and numbers.';
|
||||
$lang->admin->safe->modeRuleList[2] = ' >= 10 upper and lower case, numbers and special characters.';
|
||||
|
||||
$lang->admin->safe->reasonList['weak'] = 'Common Weak Password';
|
||||
@@ -87,5 +97,6 @@ $lang->admin->safe->loginCaptchaList[0] = 'No';
|
||||
$lang->admin->safe->resetPWDList[1] = 'ON';
|
||||
$lang->admin->safe->resetPWDList[0] = 'Off';
|
||||
|
||||
$lang->admin->safe->noticeMode = 'Password will be checked when a user logs in, or a user is added or edited.';
|
||||
$lang->admin->safe->noticeStrong = '';
|
||||
$lang->admin->safe->noticeMode = 'The password will be checked when creating and modifying user information, and changing passwords.';
|
||||
$lang->admin->safe->noticeWeakMode = 'The password will be checked when logging into the system, creating and modifying user information, and changing passwords.';
|
||||
$lang->admin->safe->noticeStrong = 'The longer the password, the more letters, numbers, or special characters it contains, and the less repetitive the password, the more secure it is!';
|
||||
|
||||
@@ -22,6 +22,7 @@ $lang->admin->captcha = 'Code de vérification';
|
||||
$lang->admin->getCaptcha = 'Obtenir le Code de vérification';
|
||||
$lang->admin->register = 'Register';
|
||||
$lang->admin->resetPWDSetting = 'Reset password Setting';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->admin->api = 'API';
|
||||
$lang->admin->log = 'Log';
|
||||
@@ -29,6 +30,15 @@ $lang->admin->setting = 'Paramétrage';
|
||||
$lang->admin->days = 'Durée de conservation';
|
||||
$lang->admin->resetPWDByMail = 'Reset the password via the email';
|
||||
|
||||
$lang->admin->changeEngine = "Change to InnoDB";
|
||||
$lang->admin->changingTable = 'Replacing data table %s engine...';
|
||||
$lang->admin->changeSuccess = 'The data table %s engine has been changed to InnoDB.';
|
||||
$lang->admin->changeFail = "Failed to replace table %s engine. Reason: <span class='text-red'>%s</span>。";
|
||||
$lang->admin->errorInnodb = 'Your MySQL does not support InnoDB data table engine.';
|
||||
$lang->admin->engineInfo = "The <strong>%s</strong> table engine is <strong>%s</strong>.";
|
||||
$lang->admin->engineSummary['hasMyISAM'] = "There are %s tables that are not InnoDB engines";
|
||||
$lang->admin->engineSummary['allInnoDB'] = "All tables are InnoDB engines";
|
||||
|
||||
$lang->admin->info = new stdclass();
|
||||
$lang->admin->info->version = 'La version actuelle est %s customisée. ';
|
||||
$lang->admin->info->links = 'Vous pouvez visiter les liens ci-dessous';
|
||||
@@ -69,8 +79,8 @@ $lang->admin->safe->modeList[0] = "Contrôle Modéré";
|
||||
$lang->admin->safe->modeList[1] = 'Contrôle Moyen';
|
||||
$lang->admin->safe->modeList[2] = 'Contrôle Fort';
|
||||
|
||||
$lang->admin->safe->modeRuleList[1] = ' >= 6 Majuscules, minuscules et chiffres';
|
||||
$lang->admin->safe->modeRuleList[2] = ' >= 10 Majuscules, minuscules, chiffres et caractères spéciaux';
|
||||
$lang->admin->safe->modeRuleList[1] = ' >= 6 Majuscules, minuscules et chiffres.';
|
||||
$lang->admin->safe->modeRuleList[2] = ' >= 10 Majuscules, minuscules, chiffres et caractères spéciaux.';
|
||||
|
||||
$lang->admin->safe->reasonList['weak'] = 'Mots de passe faibles courants';
|
||||
$lang->admin->safe->reasonList['account'] = 'Identique au compte';
|
||||
@@ -87,5 +97,6 @@ $lang->admin->safe->loginCaptchaList[0] = 'Non';
|
||||
$lang->admin->safe->resetPWDList[1] = 'ON';
|
||||
$lang->admin->safe->resetPWDList[0] = 'Off';
|
||||
|
||||
$lang->admin->safe->noticeMode = "Le mot de passe sera vérifié quand un utilisateur se connectera ou qu'un utilisateur sera créé ou modifier.";
|
||||
$lang->admin->safe->noticeStrong = '';
|
||||
$lang->admin->safe->noticeMode = "Le mot de passe sera vérifié lors de la création et de la modification des coordonnées de l'utilisateur, et du changement de mot de passe.";
|
||||
$lang->admin->safe->noticeWeakMode = "Le mot de passe sera vérifié lors de la connexion au système, de la création et de la modification des coordonnées de l'utilisateur, et du changement de mot de passe.";
|
||||
$lang->admin->safe->noticeStrong = "Le mot de passe est d'autant plus sécurisé qu'il est long, qu'il contient plus de lettres, de chiffres ou de caractères spéciaux, et que les lettres du mot de passe sont peu répétitives !";
|
||||
|
||||
@@ -22,6 +22,7 @@ $lang->admin->captcha = '验证码';
|
||||
$lang->admin->getCaptcha = '获取验证码';
|
||||
$lang->admin->register = '登记';
|
||||
$lang->admin->resetPWDSetting = '重置密码设置';
|
||||
$lang->admin->tableEngine = '表引擎';
|
||||
|
||||
$lang->admin->api = '接口';
|
||||
$lang->admin->log = '日志';
|
||||
@@ -29,6 +30,15 @@ $lang->admin->setting = '设置';
|
||||
$lang->admin->days = '日志保存天数';
|
||||
$lang->admin->resetPWDByMail = '通过邮箱重置密码';
|
||||
|
||||
$lang->admin->changeEngine = "更换到InnoDB";
|
||||
$lang->admin->changingTable = '正在更换数据表%s引擎...';
|
||||
$lang->admin->changeSuccess = '已经更换数据表%s引擎为InnoDB。';
|
||||
$lang->admin->changeFail = "更换数据表%s引擎失败,原因:<span class='text-red'>%s</span>。";
|
||||
$lang->admin->errorInnodb = '您当前的数据库不支持使用InnoDB数据表引擎。';
|
||||
$lang->admin->engineInfo = "表<strong>%s</strong>的引擎是<strong>%s</strong>。";
|
||||
$lang->admin->engineSummary['hasMyISAM'] = "有%s个表不是InnoDB引擎";
|
||||
$lang->admin->engineSummary['allInnoDB'] = "所有的表都是InnoDB引擎了";
|
||||
|
||||
$lang->admin->info = new stdclass();
|
||||
$lang->admin->info->version = '当前系统的版本是%s,';
|
||||
$lang->admin->info->links = '您可以访问以下链接:';
|
||||
@@ -69,8 +79,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'] = '与帐号相同';
|
||||
@@ -87,5 +97,6 @@ $lang->admin->safe->loginCaptchaList[0] = '否';
|
||||
$lang->admin->safe->resetPWDList[1] = '开启';
|
||||
$lang->admin->safe->resetPWDList[0] = '关闭';
|
||||
|
||||
$lang->admin->safe->noticeMode = '系统会在登录、创建和修改用户、修改密码的时候检查用户口令。';
|
||||
$lang->admin->safe->noticeStrong = '密码长度越长,含有大写字母或数字或特殊符号越多,密码字母越不重复,安全度越强!';
|
||||
$lang->admin->safe->noticeMode = '系统会在创建和修改用户、修改密码的时候检查用户口令。';
|
||||
$lang->admin->safe->noticeWeakMode = '系统会在登录、创建和修改用户、修改密码的时候检查用户口令。';
|
||||
$lang->admin->safe->noticeStrong = '密码长度越长,含有大写字母或数字或特殊符号越多,密码字母越不重复,安全度越强!';
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
<tr>
|
||||
<th class='thWidth'><?php echo $lang->admin->safe->password?></th>
|
||||
<td class='w-250px'><?php echo html::radio('mode', $lang->admin->safe->modeList, isset($config->safe->mode) ? $config->safe->mode : 0, "onclick=showModeRule(this.value)")?></td>
|
||||
<td class='notice'><?php echo $lang->admin->safe->noticeMode?></td>
|
||||
<td class='notice'><?php echo !empty($config->safe->changeWeak) ? $lang->admin->safe->noticeWeakMode : $lang->admin->safe->noticeMode;?></td>
|
||||
</tr>
|
||||
<tr id='mode1Rule' class='hidden'>
|
||||
<th></th>
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
/**
|
||||
* The tableEngine view file of admin module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package admin
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='main-header'>
|
||||
<?php
|
||||
$MyISAMCount = 0;
|
||||
$engineListHtml = '';
|
||||
foreach($tableEngines as $tableName => $engine)
|
||||
{
|
||||
if($engine != 'InnoDB') $MyISAMCount ++;
|
||||
$engineListHtml .= "<li data-table='$tableName'>" . sprintf($lang->admin->engineInfo, $tableName, $engine) . "</li>\n";
|
||||
}
|
||||
?>
|
||||
<h2>
|
||||
<?php if($MyISAMCount > 0):?>
|
||||
<?php printf($lang->admin->engineSummary['hasMyISAM'], $MyISAMCount);?>
|
||||
<?php echo html::a('###', $lang->admin->changeEngine, '', "class='btn btn-sm changeEngine btn-primary' onclick='changeAllEngines()'");?>
|
||||
<?php else:?>
|
||||
<?php print($lang->admin->engineSummary['allInnoDB']);?>
|
||||
<?php endif;?>
|
||||
</h2>
|
||||
</div>
|
||||
<div>
|
||||
<ul id='engineBox'><?php echo $engineListHtml?></ul>
|
||||
</div>
|
||||
</div>
|
||||
<?php js::set('changingTable', $lang->admin->changingTable);?>
|
||||
<script>
|
||||
/**
|
||||
* Change all table engines.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function changeAllEngines()
|
||||
{
|
||||
var tables = [];
|
||||
var $engineBox = $('#engineBox');
|
||||
$engineBox.find('li').each(function()
|
||||
{
|
||||
tables.push($(this).attr('data-table'));
|
||||
});
|
||||
|
||||
$('.btn.changeEngine').hide();
|
||||
$engineBox.empty();
|
||||
$.each(tables, function(_, table)
|
||||
{
|
||||
changeEngine(table);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Change one engine.
|
||||
*
|
||||
* @param string $table
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function changeEngine(table)
|
||||
{
|
||||
var $engineBox = $('#engineBox');
|
||||
var link = createLink('admin', 'ajaxChangeTableEngine', 'table=' + table);
|
||||
|
||||
if($engineBox.find('[data-table=' + table + ']').length == 0) $engineBox.append("<div data-table='" + table + "'>" + changingTable.replace('%s', table) + "</div>");
|
||||
$.ajax(
|
||||
{
|
||||
type: "GET",
|
||||
url: link,
|
||||
success: function(response)
|
||||
{
|
||||
response = JSON.parse(response);
|
||||
$engineBox.find('[data-table=' + table + ']').html(response.message).addClass('text-success');
|
||||
},
|
||||
error: function()
|
||||
{
|
||||
changeEngine(table);
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
@@ -1687,17 +1687,30 @@ class block extends control
|
||||
*/
|
||||
public function printExecutionBlock()
|
||||
{
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) return;
|
||||
|
||||
$count = isset($this->params->count) ? (int)$this->params->count : 0;
|
||||
$status = isset($this->params->type) ? $this->params->type : 'all';
|
||||
$pager = pager::init(0, $count, 1);
|
||||
|
||||
$this->app->loadLang('execution');
|
||||
$this->app->loadClass('pager', true);
|
||||
$pager = pager::init(0, $count, 1);
|
||||
|
||||
$projectPairs = array();
|
||||
if($this->config->systemMode == 'new') $projectPairs = $this->dao->select('id,name')->from(TABLE_PROJECT)->where('type')->eq('project')->fetchPairs('id', 'name');
|
||||
|
||||
$projectID = $this->view->block->module == 'my' ? 0 : (int)$this->session->project;
|
||||
$this->view->executionStats = $this->loadModel('project')->getStats($projectID, $status, 0, 0, 30, 'id_asc', $pager);
|
||||
$projectID = $this->view->block->module == 'my' ? 0 : (int)$this->session->project;
|
||||
$executions = $this->loadModel('project')->getStats($projectID, $status, 0, 0, 30, 'id_asc', $pager);
|
||||
|
||||
foreach($executions as $index => $execution)
|
||||
{
|
||||
if(empty($execution->children)) continue;
|
||||
|
||||
foreach($execution->children as $child) $executions[] = $child;
|
||||
unset($executions[$index]);
|
||||
}
|
||||
|
||||
$this->view->executionStats = $executions;
|
||||
$this->view->projectPairs = $projectPairs;
|
||||
}
|
||||
|
||||
@@ -1791,7 +1804,13 @@ class block extends control
|
||||
$this->app->loadLang('task');
|
||||
$this->app->loadLang('execution');
|
||||
|
||||
$objects = $this->loadModel('task')->getUserTasks($this->app->user->account, 'assignedTo', $limitCount);
|
||||
$objects = $this->loadModel('task')->getUserTasks($this->app->user->account, 'assignedTo');
|
||||
|
||||
foreach($objects as $k => $task)
|
||||
{
|
||||
if(in_array($task->status, array('closed', 'cancel', 'pause'))) unset($objects[$k]);
|
||||
}
|
||||
if($limitCount > 0) $objects = array_slice($objects, 0, $limitCount);
|
||||
}
|
||||
|
||||
if($objectType == 'bug') $this->app->loadLang('bug');
|
||||
|
||||
@@ -171,12 +171,14 @@ class blockModel extends model
|
||||
$tasks = $this->dao->select("count(t1.id) as tasks, count(if(t1.status = 'done', 1, null)) as doneTasks")->from(TABLE_TASK)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on("t1.project = t2.id")
|
||||
->leftJoin(TABLE_EXECUTION)->alias('t3')->on("t1.execution = t3.id")
|
||||
->where('t1.assignedTo')->eq($this->app->user->account)
|
||||
->leftJoin(TABLE_TEAM)->alias('t4')->on("t4.root = t1.id and t4.type = 'task' and t4.account = '{$this->app->user->account}'")
|
||||
->where("(t1.assignedTo = '{$this->app->user->account}' or (t1.mode = 'multi' and t4.`account` = '{$this->app->user->account}') )")
|
||||
->andWhere('(t2.status')->ne('suspended')
|
||||
->orWhere('t3.status')->ne('suspended')
|
||||
->markRight(1)
|
||||
->andWhere('t1.deleted')->eq('0')
|
||||
->andWhere('t3.deleted')->eq('0')
|
||||
->andWhere('t1.status')->notin('closed,cancel,pause')
|
||||
->beginIF(!$this->app->user->admin)->andWhere('t1.execution')->in($this->app->user->view->sprints)->fi()
|
||||
->beginIF($this->config->vision)->andWhere('t1.vision')->eq($this->config->vision)->fi()
|
||||
->beginIF($this->config->vision)->andWhere('t3.vision')->eq($this->config->vision)->fi()
|
||||
@@ -252,6 +254,8 @@ class blockModel extends model
|
||||
*/
|
||||
public function initBlock($module, $type = '')
|
||||
{
|
||||
if(empty($module)) return;
|
||||
|
||||
$flow = isset($this->config->global->flow) ? $this->config->global->flow : 'full';
|
||||
$account = $this->app->user->account;
|
||||
$vision = $this->config->vision;
|
||||
@@ -484,7 +488,7 @@ class blockModel extends model
|
||||
$this->app->loadLang('project');
|
||||
$params = new stdclass();
|
||||
$params->type['name'] = $this->lang->block->type;
|
||||
$params->type['options'] = $this->lang->project->featureBar;
|
||||
$params->type['options'] = $this->lang->project->featureBar['browse'];
|
||||
$params->type['control'] = 'select';
|
||||
|
||||
$params->orderBy['name'] = $this->lang->block->orderBy;
|
||||
@@ -505,7 +509,7 @@ class blockModel extends model
|
||||
$this->app->loadLang('project');
|
||||
$params = new stdclass();
|
||||
$params->type['name'] = $this->lang->block->type;
|
||||
$params->type['options'] = $this->lang->project->featureBar;
|
||||
$params->type['options'] = $this->lang->project->featureBar['browse'];
|
||||
$params->type['control'] = 'select';
|
||||
|
||||
$params->orderBy['name'] = $this->lang->block->orderBy;
|
||||
@@ -967,11 +971,10 @@ class blockModel extends model
|
||||
/**
|
||||
* Get project dynamic params.
|
||||
*
|
||||
* @param string $module
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getProjectDynamicParams($module = '')
|
||||
public function getProjectDynamicParams()
|
||||
{
|
||||
$params = $this->appendCountParams();
|
||||
|
||||
|
||||
@@ -41,11 +41,9 @@
|
||||
<?php $id = 0; ?>
|
||||
<?php foreach($executionStats as $execution):?>
|
||||
<?php
|
||||
if(!empty($execution->children)) continue;
|
||||
|
||||
$appid = isset($_GET['entry']) ? "class='app-btn text-center' data-id='{$this->get->entry}'" : "class='text-center'";
|
||||
$viewLink = $this->createLink('execution', 'task', 'executionID=' . $execution->id);
|
||||
if($config->systemMode == 'new') $execution->name = zget($projectPairs, $execution->project, '') . ' / ' . $execution->name;
|
||||
if($config->systemMode == 'new' and isset($projectPairs[$execution->project])) $execution->name = zget($projectPairs, $execution->project, '') . ' / ' . $execution->name;
|
||||
?>
|
||||
<tr <?php echo $appid?>>
|
||||
<td class='c-name text-left' title='<?php echo $execution->name;?>'><nobr><?php echo html::a($viewLink, $execution->name, '', "title='$execution->name'");?></nobr></td>
|
||||
|
||||
+55
-26
@@ -26,7 +26,7 @@ $config->bug->list->allFields = 'id, module, execution, story, task,
|
||||
|
||||
$config->bug->list->defaultFields = 'id,severity,pri,title,openedBy,assignedTo,resolvedBy,resolution';
|
||||
|
||||
$config->bug->list->exportFields = 'id, product, branch, module, project, execution, story, task,
|
||||
$config->bug->exportFields = 'id, product, branch, module, project, execution, story, task,
|
||||
title, keywords, severity, pri, type, os, browser,
|
||||
steps, status, deadline, activatedCount, confirmed, mailto,
|
||||
openedBy, openedDate, openedBuild,
|
||||
@@ -37,7 +37,8 @@ $config->bug->list->exportFields = 'id, product, branch, module, project, execut
|
||||
case,
|
||||
lastEditedBy,
|
||||
lastEditedDate, files ,feedbackBy, notifyEmail';
|
||||
if($config->systemMode == 'classic') $config->bug->list->exportFields = str_replace(' project,', '', $config->bug->list->exportFields);
|
||||
|
||||
if($config->systemMode == 'classic') $config->bug->exportFields = str_replace(' project,', '', $config->bug->exportFields);
|
||||
|
||||
$config->bug->list->customCreateFields = 'execution,noticefeedbackBy,story,task,pri,severity,os,browser,deadline,mailto,keywords';
|
||||
$config->bug->list->customBatchEditFields = 'type,severity,pri,productplan,assignedTo,deadline,resolvedBy,resolution,os,browser,keywords';
|
||||
@@ -170,6 +171,14 @@ $config->bug->datatable->fieldList['id']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['id']['width'] = '70';
|
||||
$config->bug->datatable->fieldList['id']['required'] = 'yes';
|
||||
|
||||
$config->bug->datatable->fieldList['product']['title'] = 'product';
|
||||
$config->bug->datatable->fieldList['product']['control'] = 'hidden';
|
||||
$config->bug->datatable->fieldList['product']['dataSource'] = array('module' => 'product', 'method' => 'getPairs');
|
||||
|
||||
$config->bug->datatable->fieldList['module']['control'] = 'select';
|
||||
$config->bug->datatable->fieldList['module']['title'] = 'module';
|
||||
$config->bug->datatable->fieldList['module']['dataSource'] = array('module' => 'tree', 'method' => 'getOptionMenu', 'params' => '$productID&bug');
|
||||
|
||||
$config->bug->datatable->fieldList['severity']['title'] = 'severityAB';
|
||||
$config->bug->datatable->fieldList['severity']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['severity']['width'] = '50';
|
||||
@@ -193,10 +202,12 @@ $config->bug->datatable->fieldList['title']['width'] = 'auto';
|
||||
$config->bug->datatable->fieldList['title']['required'] = 'yes';
|
||||
$config->bug->datatable->fieldList['title']['minWidth'] = '200';
|
||||
|
||||
$config->bug->datatable->fieldList['branch']['title'] = 'branch';
|
||||
$config->bug->datatable->fieldList['branch']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['branch']['width'] = '100';
|
||||
$config->bug->datatable->fieldList['branch']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['branch']['title'] = 'branch';
|
||||
$config->bug->datatable->fieldList['branch']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['branch']['width'] = '100';
|
||||
$config->bug->datatable->fieldList['branch']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['branch']['control'] = 'select';
|
||||
$config->bug->datatable->fieldList['branch']['dataSource'] = array('module' => 'bug', 'method' => 'getRelatedObjects', 'params' => 'branch&id,name');
|
||||
|
||||
$config->bug->datatable->fieldList['type']['title'] = 'type';
|
||||
$config->bug->datatable->fieldList['type']['fixed'] = 'no';
|
||||
@@ -205,16 +216,19 @@ $config->bug->datatable->fieldList['type']['required'] = 'no';
|
||||
|
||||
if($config->systemMode == 'new')
|
||||
{
|
||||
$config->bug->datatable->fieldList['project']['title'] = 'project';
|
||||
$config->bug->datatable->fieldList['project']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['project']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['project']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['project']['title'] = 'project';
|
||||
$config->bug->datatable->fieldList['project']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['project']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['project']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['project']['control'] = 'hidden';
|
||||
$config->bug->datatable->fieldList['project']['dataSource'] = array('module' => 'product', 'method' => 'getProjectPairsByProduct', 'params' => '$productID');
|
||||
}
|
||||
|
||||
$config->bug->datatable->fieldList['execution']['title'] = 'execution';
|
||||
$config->bug->datatable->fieldList['execution']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['execution']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['execution']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['execution']['title'] = 'execution';
|
||||
$config->bug->datatable->fieldList['execution']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['execution']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['execution']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['execution']['dataSource'] = array('module' => 'product', 'method' =>'getAllExecutionPairsByProduct', 'params' => '$productID&$branch');
|
||||
|
||||
$config->bug->datatable->fieldList['plan']['title'] = 'plan';
|
||||
$config->bug->datatable->fieldList['plan']['fixed'] = 'no';
|
||||
@@ -236,15 +250,18 @@ $config->bug->datatable->fieldList['activatedDate']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['activatedDate']['width'] = '90';
|
||||
$config->bug->datatable->fieldList['activatedDate']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['story']['title'] = 'story';
|
||||
$config->bug->datatable->fieldList['story']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['story']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['story']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['story']['title'] = 'story';
|
||||
$config->bug->datatable->fieldList['story']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['story']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['story']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['story']['control'] = 'select';
|
||||
$config->bug->datatable->fieldList['story']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'story&id,title');
|
||||
|
||||
$config->bug->datatable->fieldList['task']['title'] = 'task';
|
||||
$config->bug->datatable->fieldList['task']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['task']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['task']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['task']['title'] = 'task';
|
||||
$config->bug->datatable->fieldList['task']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['task']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['task']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['task']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'task&id,name');
|
||||
|
||||
$config->bug->datatable->fieldList['toTask']['title'] = 'toTask';
|
||||
$config->bug->datatable->fieldList['toTask']['fixed'] = 'no';
|
||||
@@ -281,15 +298,18 @@ $config->bug->datatable->fieldList['openedDate']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedDate']['width'] = '90';
|
||||
$config->bug->datatable->fieldList['openedDate']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['openedBuild']['title'] = 'openedBuild';
|
||||
$config->bug->datatable->fieldList['openedBuild']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBuild']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['openedBuild']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBuild']['title'] = 'openedBuild';
|
||||
$config->bug->datatable->fieldList['openedBuild']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBuild']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['openedBuild']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBuild']['control'] = 'multiple';
|
||||
$config->bug->datatable->fieldList['openedBuild']['dataSource'] = array('module' => 'build', 'method' =>'getBuildPairs', 'params' => '$productID&$branch&noempty,noterminate,nodone,withbranch');
|
||||
|
||||
$config->bug->datatable->fieldList['assignedTo']['title'] = 'assignedToAB';
|
||||
$config->bug->datatable->fieldList['assignedTo']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['assignedTo']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['assignedTo']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['assignedTo']['dataSource'] = array('module' => 'bug', 'method' =>'getProductMemberPairs', 'params' => '$productID&$branch');
|
||||
|
||||
$config->bug->datatable->fieldList['assignedDate']['title'] = 'assignedDate';
|
||||
$config->bug->datatable->fieldList['assignedDate']['fixed'] = 'no';
|
||||
@@ -300,6 +320,7 @@ $config->bug->datatable->fieldList['deadline']['title'] = 'deadline';
|
||||
$config->bug->datatable->fieldList['deadline']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['deadline']['width'] = '90';
|
||||
$config->bug->datatable->fieldList['deadline']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['deadline']['control'] = 'date';
|
||||
|
||||
$config->bug->datatable->fieldList['resolvedBy']['title'] = 'resolvedByAB';
|
||||
$config->bug->datatable->fieldList['resolvedBy']['fixed'] = 'no';
|
||||
@@ -320,6 +341,8 @@ $config->bug->datatable->fieldList['resolvedBuild']['title'] = 'resolvedBuild
|
||||
$config->bug->datatable->fieldList['resolvedBuild']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['resolvedBuild']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['resolvedBuild']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['resolvedBuild']['control'] = 'select';
|
||||
$config->bug->datatable->fieldList['resolvedBuild']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'resolvedBuild&id,name');
|
||||
|
||||
$config->bug->datatable->fieldList['closedBy']['title'] = 'closedBy';
|
||||
$config->bug->datatable->fieldList['closedBy']['fixed'] = 'no';
|
||||
@@ -346,6 +369,12 @@ $config->bug->datatable->fieldList['actions']['fixed'] = 'right';
|
||||
$config->bug->datatable->fieldList['actions']['width'] = '150';
|
||||
$config->bug->datatable->fieldList['actions']['required'] = 'yes';
|
||||
|
||||
$config->bug->datatable->fieldList['steps']['title'] = 'steps';
|
||||
$config->bug->datatable->fieldList['steps']['control'] = 'textarea';
|
||||
|
||||
$config->bug->datatable->fieldList['case']['title'] = 'case';
|
||||
$config->bug->datatable->fieldList['case']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'case&id,title');
|
||||
|
||||
$config->bug->colorList = new stdclass();
|
||||
$config->bug->colorList->pri[0] = '#c0c0c0';
|
||||
$config->bug->colorList->pri[1] = '#d50000';
|
||||
|
||||
+6
-179
@@ -2090,7 +2090,7 @@ class bug extends control
|
||||
if(!$this->post->bugIDList) return print(js::locate($this->session->bugList, 'parent'));
|
||||
|
||||
$bugIDList = array_unique($this->post->bugIDList);
|
||||
$bugs = $this->dao->select('id, title, status, resolvedBy, openedBuild')->from(TABLE_BUG)->where('id')->in($bugIDList)->fetchAll('id');
|
||||
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($bugIDList)->fetchAll('id');
|
||||
|
||||
$this->qa->setMenu($this->products, $productID, $branch);
|
||||
|
||||
@@ -2292,183 +2292,10 @@ class bug extends control
|
||||
{
|
||||
if($_POST)
|
||||
{
|
||||
$this->loadModel('file');
|
||||
$this->loadModel('branch');
|
||||
$bugLang = $this->lang->bug;
|
||||
$bugConfig = $this->config->bug;
|
||||
|
||||
/* Create field lists. */
|
||||
$fields = $this->post->exportFields ? $this->post->exportFields : explode(',', $bugConfig->list->exportFields);
|
||||
foreach($fields as $key => $fieldName)
|
||||
{
|
||||
$fieldName = trim($fieldName);
|
||||
$fields[$fieldName] = isset($bugLang->$fieldName) ? $bugLang->$fieldName : $fieldName;
|
||||
unset($fields[$key]);
|
||||
}
|
||||
|
||||
/* Get bugs. */
|
||||
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where($this->session->bugQueryCondition)
|
||||
->beginIF($this->post->exportType == 'selected')->andWhere('id')->in($this->cookie->checkedItem)->fi()
|
||||
->orderBy($orderBy)->fetchAll('id');
|
||||
|
||||
/* Get users, products and executions. */
|
||||
$users = $this->loadModel('user')->getPairs('noletter');
|
||||
$products = $this->loadModel('product')->getPairs();
|
||||
$projects = $this->loadModel('project')->getPairsByProgram();
|
||||
$executions = $this->loadModel('execution')->getPairs($this->projectID, 'all', 'all');
|
||||
|
||||
/* Get related objects id lists. */
|
||||
$relatedProductIdList = array();
|
||||
$relatedStoryIdList = array();
|
||||
$relatedTaskIdList = array();
|
||||
$relatedBugIdList = array();
|
||||
$relatedCaseIdList = array();
|
||||
$relatedBuildIdList = array();
|
||||
$relatedBranchIdList = array();
|
||||
|
||||
foreach($bugs as $bug)
|
||||
{
|
||||
$relatedProductIdList[$bug->product] = $bug->product;
|
||||
$relatedStoryIdList[$bug->story] = $bug->story;
|
||||
$relatedTaskIdList[$bug->task] = $bug->task;
|
||||
$relatedCaseIdList[$bug->case] = $bug->case;
|
||||
$relatedBugIdList[$bug->duplicateBug] = $bug->duplicateBug;
|
||||
$relatedBranchIdList[$bug->branch] = $bug->branch;
|
||||
|
||||
/* Process link bugs. */
|
||||
$linkBugs = explode(',', $bug->linkBug);
|
||||
foreach($linkBugs as $linkBugID)
|
||||
{
|
||||
if($linkBugID) $relatedBugIdList[$linkBugID] = trim($linkBugID);
|
||||
}
|
||||
|
||||
/* Process builds. */
|
||||
$builds = $bug->openedBuild . ',' . $bug->resolvedBuild;
|
||||
$builds = explode(',', $builds);
|
||||
foreach($builds as $buildID)
|
||||
{
|
||||
if($buildID) $relatedBuildIdList[$buildID] = trim($buildID);
|
||||
}
|
||||
}
|
||||
|
||||
/* Get related objects title or names. */
|
||||
$productsType = $this->dao->select('id, type')->from(TABLE_PRODUCT)->where('id')->in($relatedProductIdList)->fetchPairs();
|
||||
$relatedStories = $this->dao->select('id,title')->from(TABLE_STORY) ->where('id')->in($relatedStoryIdList)->fetchPairs();
|
||||
$relatedTasks = $this->dao->select('id, name')->from(TABLE_TASK)->where('id')->in($relatedTaskIdList)->fetchPairs();
|
||||
$relatedBugs = $this->dao->select('id, title')->from(TABLE_BUG)->where('id')->in($relatedBugIdList)->fetchPairs();
|
||||
$relatedCases = $this->dao->select('id, title')->from(TABLE_CASE)->where('id')->in($relatedCaseIdList)->fetchPairs();
|
||||
$relatedBranch = array('0' => $this->lang->branch->main) + $this->dao->select('id, name')->from(TABLE_BRANCH)->where('id')->in($relatedBranchIdList)->fetchPairs();
|
||||
$relatedBuilds = array('trunk' => $this->lang->trunk) + $this->dao->select('id, name')->from(TABLE_BUILD)->where('id')->in($relatedBuildIdList)->fetchPairs();
|
||||
$relatedFiles = $this->dao->select('id, objectID, pathname, title')->from(TABLE_FILE)->where('objectType')->eq('bug')->andWhere('objectID')->in(@array_keys($bugs))->andWhere('extra')->ne('editor')->fetchGroup('objectID');
|
||||
$relatedModules = $this->loadModel('tree')->getAllModulePairs('bug');
|
||||
if($this->config->edition == 'max') $reviews = $this->loadModel('review')->getPairs(0, $productID);
|
||||
|
||||
foreach($bugs as $bug)
|
||||
{
|
||||
if($this->post->fileType == 'csv')
|
||||
{
|
||||
$bug->steps = str_replace("<br />", "\n", $bug->steps);
|
||||
$bug->steps = str_replace('"', '""', $bug->steps);
|
||||
$bug->steps = str_replace(' ', ' ', $bug->steps);
|
||||
}
|
||||
|
||||
$bug->openedDate = !helper::isZeroDate($bug->openedDate) ? $bug->openedDate : '';
|
||||
$bug->assignedDate = !helper::isZeroDate($bug->assignedDate) ? $bug->assignedDate : '';
|
||||
$bug->resolvedDate = !helper::isZeroDate($bug->resolvedDate) ? $bug->resolvedDate : '';
|
||||
$bug->closedDate = !helper::isZeroDate($bug->closedDate) ? $bug->closedDate : '';
|
||||
$bug->lastEditedDate = !helper::isZeroDate($bug->lastEditedDate) ? $bug->lastEditedDate : '';
|
||||
$bug->deadline = !helper::isZeroDate($bug->deadline) ? $bug->deadline : '';
|
||||
|
||||
/* fill some field with useful value. */
|
||||
$bug->product = !isset($products[$bug->product]) ? '' : $products[$bug->product] . "(#$bug->product)";
|
||||
$bug->project = !isset($projects[$bug->project]) ? '' : $projects[$bug->project] . "(#$bug->project)";
|
||||
$bug->execution = !isset($executions[$bug->execution]) ? '' : $executions[$bug->execution] . "(#$bug->execution)";
|
||||
$bug->story = !isset($relatedStories[$bug->story]) ? '' : $relatedStories[$bug->story] . "(#$bug->story)";
|
||||
$bug->task = !isset($relatedTasks[$bug->task]) ? '' : $relatedTasks[$bug->task] . "($bug->task)";
|
||||
$bug->case = !isset($relatedCases[$bug->case]) ? '' : $relatedCases[$bug->case] . "($bug->case)";
|
||||
if($this->config->edition == 'max' and isset($reviews)) $bug->identify = !isset($reviews[$bug->identify]) ? '' : $reviews[$bug->identify] . "(#$bug->identify)";
|
||||
|
||||
if(isset($relatedModules[$bug->module])) $bug->module = $relatedModules[$bug->module] . "(#$bug->module)";
|
||||
if(isset($relatedBugs[$bug->duplicateBug])) $bug->duplicateBug = $relatedBugs[$bug->duplicateBug] . "($bug->duplicateBug)";
|
||||
if(isset($relatedBuilds[$bug->resolvedBuild])) $bug->resolvedBuild = $relatedBuilds[$bug->resolvedBuild] . "(#$bug->resolvedBuild)";
|
||||
if(isset($relatedBranch[$bug->branch])) $bug->branch = $relatedBranch[$bug->branch] . "(#$bug->branch)";
|
||||
|
||||
if(isset($bugLang->priList[$bug->pri])) $bug->pri = $bugLang->priList[$bug->pri];
|
||||
if(isset($bugLang->typeList[$bug->type])) $bug->type = $bugLang->typeList[$bug->type];
|
||||
if(isset($bugLang->severityList[$bug->severity])) $bug->severity = $bugLang->severityList[$bug->severity];
|
||||
if(isset($bugLang->osList[$bug->os])) $bug->os = $bugLang->osList[$bug->os];
|
||||
if(isset($bugLang->browserList[$bug->browser])) $bug->browser = $bugLang->browserList[$bug->browser];
|
||||
if(isset($bugLang->statusList[$bug->status])) $bug->status = $this->processStatus('bug', $bug);
|
||||
if(isset($bugLang->confirmedList[$bug->confirmed])) $bug->confirmed = $bugLang->confirmedList[$bug->confirmed];
|
||||
if(isset($bugLang->resolutionList[$bug->resolution])) $bug->resolution = $bugLang->resolutionList[$bug->resolution];
|
||||
|
||||
if(isset($users[$bug->openedBy])) $bug->openedBy = $users[$bug->openedBy];
|
||||
if(isset($users[$bug->assignedTo])) $bug->assignedTo = $users[$bug->assignedTo] . "(#$bug->assignedTo)";
|
||||
if(isset($users[$bug->resolvedBy])) $bug->resolvedBy = $users[$bug->resolvedBy];
|
||||
if(isset($users[$bug->lastEditedBy])) $bug->lastEditedBy = $users[$bug->lastEditedBy];
|
||||
if(isset($users[$bug->closedBy])) $bug->closedBy = $users[$bug->closedBy];
|
||||
|
||||
$bug->title = htmlspecialchars_decode($bug->title,ENT_QUOTES);
|
||||
|
||||
if($bug->linkBug)
|
||||
{
|
||||
$tmpLinkBugs = array();
|
||||
$linkBugIdList = explode(',', $bug->linkBug);
|
||||
foreach($linkBugIdList as $linkBugID)
|
||||
{
|
||||
$linkBugID = trim($linkBugID);
|
||||
$tmpLinkBugs[] = isset($relatedBugs[$linkBugID]) ? $relatedBugs[$linkBugID] : $linkBugID;
|
||||
}
|
||||
$bug->linkBug = join("; \n", $tmpLinkBugs);
|
||||
}
|
||||
|
||||
if($bug->openedBuild)
|
||||
{
|
||||
$tmpOpenedBuilds = array();
|
||||
$tmpResolvedBuilds = array();
|
||||
$buildIdList = explode(',', $bug->openedBuild);
|
||||
foreach($buildIdList as $buildID)
|
||||
{
|
||||
$buildID = trim($buildID);
|
||||
$tmpOpenedBuilds[] = isset($relatedBuilds[$buildID]) ? $relatedBuilds[$buildID] . "(#$buildID)" : $buildID;
|
||||
}
|
||||
$bug->openedBuild = join("\n", $tmpOpenedBuilds);
|
||||
if($this->post->fileType == 'html') $bug->openedBuild = nl2br($bug->openedBuild);
|
||||
}
|
||||
|
||||
/* Set related files. */
|
||||
$bug->files = '';
|
||||
if(isset($relatedFiles[$bug->id]))
|
||||
{
|
||||
foreach($relatedFiles[$bug->id] as $file)
|
||||
{
|
||||
$fileURL = common::getSysURL() . $this->file->webPath . $this->file->getRealPathName($file->pathname);
|
||||
$bug->files .= html::a($fileURL, $file->title, '_blank') . '<br />';
|
||||
}
|
||||
}
|
||||
|
||||
$bug->mailto = trim(trim($bug->mailto), ',');
|
||||
$mailtos = explode(',', $bug->mailto);
|
||||
$bug->mailto = '';
|
||||
foreach($mailtos as $mailto)
|
||||
{
|
||||
$mailto = trim($mailto);
|
||||
if(isset($users[$mailto])) $bug->mailto .= $users[$mailto] . ',';
|
||||
}
|
||||
$bug->mailto = rtrim($bug->mailto, ',');
|
||||
|
||||
unset($bug->caseVersion);
|
||||
unset($bug->result);
|
||||
unset($bug->deleted);
|
||||
}
|
||||
|
||||
if(!(in_array('platform', $productsType) or in_array('branch', $productsType))) unset($fields['branch']);// If products's type are normal, unset branch field.
|
||||
if($this->config->edition != 'open') list($fields, $bugs) = $this->loadModel('workflowfield')->appendDataFromFlow($fields, $bugs);
|
||||
|
||||
$this->post->set('fields', $fields);
|
||||
$this->post->set('rows', $bugs);
|
||||
$this->post->set('kind', 'bug');
|
||||
$this->fetch('file', 'export2' . $this->post->fileType, $_POST);
|
||||
$this->loadModel('port');
|
||||
$this->session->set('bugPortParams', array('productID' => $productID, 'executionID' => $executionID, 'branch' => 'all'));
|
||||
$this->port->export('bug');
|
||||
$this->fetch('file', 'export2' . $_POST['fileType'], $_POST);
|
||||
}
|
||||
|
||||
$fileName = $this->lang->bug->common;
|
||||
@@ -2486,7 +2313,7 @@ class bug extends control
|
||||
}
|
||||
|
||||
$this->view->fileName = $fileName;
|
||||
$this->view->allExportFields = $this->config->bug->list->exportFields;
|
||||
$this->view->allExportFields = $this->config->bug->exportFields;
|
||||
$this->view->customExport = true;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
+75
-11
@@ -945,6 +945,7 @@ class bugModel extends model
|
||||
|
||||
if(empty($bugIDList)) return $activateBugs;
|
||||
|
||||
$extendFields = $this->getFlowExtendFields();
|
||||
foreach($bugIDList as $bugID)
|
||||
{
|
||||
if($data->statusList[$bugID] == 'active') continue;
|
||||
@@ -967,6 +968,15 @@ class bugModel extends model
|
||||
$activateBugs[$bugID]['toStory'] = 0;
|
||||
$activateBugs[$bugID]['lastEditedBy'] = $this->app->user->account;
|
||||
$activateBugs[$bugID]['lastEditedDate'] = $now;
|
||||
|
||||
foreach($extendFields as $extendField)
|
||||
{
|
||||
$postFieldData = $this->post->{$extendField->field};
|
||||
|
||||
if(is_array($postFieldData[$bugID])) $postFieldData[$bugID] = join(',', $postFieldData[$bugID]);
|
||||
|
||||
$activateBugs[$bugID][$extendField->field] = htmlSpecialString($postFieldData[$bugID]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Update bugs. */
|
||||
@@ -976,6 +986,8 @@ class bugModel extends model
|
||||
if(dao::isError()) return print(js::error('bug#' . $bugID . dao::getError(true)));
|
||||
|
||||
$this->dao->update(TABLE_BUG)->set('activatedCount = activatedCount + 1')->where('id')->eq((int)$bugID)->exec();
|
||||
|
||||
$this->executeHooks($bugID);
|
||||
}
|
||||
|
||||
return $activateBugs;
|
||||
@@ -1146,13 +1158,15 @@ class bugModel extends model
|
||||
if(dao::isError()) return false;
|
||||
|
||||
$buildData = new stdclass();
|
||||
$buildData->product = (int)$oldBug->product;
|
||||
$buildData->branch = (int)$oldBug->branch;
|
||||
$buildData->project = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($bug->buildExecution)->fetch('project');
|
||||
$buildData->execution = $bug->buildExecution;
|
||||
$buildData->name = $bug->buildName;
|
||||
$buildData->date = date('Y-m-d');
|
||||
$buildData->builder = $this->app->user->account;
|
||||
$buildData->product = (int)$oldBug->product;
|
||||
$buildData->branch = (int)$oldBug->branch;
|
||||
$buildData->project = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($bug->buildExecution)->fetch('project');
|
||||
$buildData->execution = $bug->buildExecution;
|
||||
$buildData->name = $bug->buildName;
|
||||
$buildData->date = date('Y-m-d');
|
||||
$buildData->builder = $this->app->user->account;
|
||||
$buildData->createdBy = $this->app->user->account;
|
||||
$buildData->createdDate = helper::now();
|
||||
$this->dao->insert(TABLE_BUILD)->data($buildData)->autoCheck()
|
||||
->check('name', 'unique', "product = {$buildData->product} AND branch = {$buildData->branch} AND deleted = '0'")
|
||||
->exec();
|
||||
@@ -1265,13 +1279,17 @@ class bugModel extends model
|
||||
*/
|
||||
public function batchChangePlan($bugIDList, $planID)
|
||||
{
|
||||
$now = helper::now();
|
||||
$allChanges = array();
|
||||
$oldBugs = $this->getByList($bugIDList);
|
||||
$now = helper::now();
|
||||
$allChanges = array();
|
||||
$oldBugs = $this->getByList($bugIDList);
|
||||
$unlinkPlans = array();
|
||||
$link2Plans = array();
|
||||
foreach($bugIDList as $bugID)
|
||||
{
|
||||
$oldBug = $oldBugs[$bugID];
|
||||
if($planID == $oldBug->plan) continue;
|
||||
$unlinkPlans[$oldBug->plan] = empty($unlinkPlans[$oldBug->plan]) ? $bugID : "{$unlinkPlans[$oldBug->plan]},$bugID";
|
||||
$link2Plans[$planID] = empty($link2Plans[$planID]) ? $bugID : "{$link2Plans[$planID]},$bugID";
|
||||
|
||||
$bug = new stdclass();
|
||||
$bug->lastEditedBy = $this->app->user->account;
|
||||
@@ -1281,6 +1299,12 @@ class bugModel extends model
|
||||
$this->dao->update(TABLE_BUG)->data($bug)->autoCheck()->where('id')->eq((int)$bugID)->exec();
|
||||
if(!dao::isError()) $allChanges[$bugID] = common::createChanges($oldBug, $bug);
|
||||
}
|
||||
if(!dao::isError())
|
||||
{
|
||||
$this->loadModel('action');
|
||||
foreach($unlinkPlans as $planID => $bugs) $this->action->create('productplan', $planID, 'unlinkbug', '', $bugs);
|
||||
foreach($link2Plans as $planID => $bugs) $this->action->create('productplan', $planID, 'linkbug', '', $bugs);
|
||||
}
|
||||
return $allChanges;
|
||||
}
|
||||
|
||||
@@ -1686,7 +1710,7 @@ class bugModel extends model
|
||||
$bugIDList = array();
|
||||
if($moduleName == 'contributeBug')
|
||||
{
|
||||
$bugsAssignedByMe = $this->loadModel('my')->getAssignedByMe($account, 0, $pager, $orderBy, 0, 'bug');
|
||||
$bugsAssignedByMe = $this->loadModel('my')->getAssignedByMe($account, 0, '', $orderBy, 'bug');
|
||||
foreach($bugsAssignedByMe as $bugID => $bug) $bugIDList[$bugID] = $bugID;
|
||||
}
|
||||
|
||||
@@ -2231,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;
|
||||
@@ -3179,9 +3204,19 @@ class bugModel extends model
|
||||
$class .= ' c-user';
|
||||
$title = "title='" . zget($users, $bug->resolvedBy) . "'";
|
||||
break;
|
||||
case 'openedBy':
|
||||
$class .= ' c-user';
|
||||
$title = "title='" . zget($users, $bug->openedBy) . "'";
|
||||
break;
|
||||
case 'project':
|
||||
$title = "title='" . zget($projectPairs, $bug->project, '') . "'";
|
||||
break;
|
||||
case 'plan':
|
||||
$title = "title='" . zget($plans, $bug->plan) . "'";
|
||||
break;
|
||||
case 'execution':
|
||||
$title = "title='" . zget($executions, $bug->execution) . "'";
|
||||
break;
|
||||
case 'resolvedBuild':
|
||||
$class .= ' text-ellipsis';
|
||||
$title = "title='" . $bug->resolvedBuild . "'";
|
||||
@@ -3515,4 +3550,33 @@ class bugModel extends model
|
||||
|
||||
return $menu;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get related objects id lists.
|
||||
*
|
||||
* @param int $object
|
||||
* @param string $pairs
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getRelatedObjects($object, $pairs = '')
|
||||
{
|
||||
/* Get bugs. */
|
||||
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where($this->session->bugQueryCondition)->fetchAll('id');
|
||||
|
||||
/* Get related objects id lists. */
|
||||
$relatedObjectIdList = array();
|
||||
$relatedObjects = array();
|
||||
|
||||
foreach($bugs as $bug) $relatedObjectIdList[$bug->$object] = $bug->$object;
|
||||
|
||||
if($object == 'openedBuild' or $object == 'resolvedBuild') $object = 'build';
|
||||
|
||||
/* Get related objects title or names. */
|
||||
$table = $this->config->objectTables[$object];
|
||||
if($table) $relatedObjects = $this->dao->select($pairs)->from($table)->where('id')->in($relatedObjectIdList)->fetchPairs();
|
||||
|
||||
if(in_array($object, array('build','resolvedBuild'))) $relatedObjects= array('trunk' => $this->lang->trunk) + $relatedObjects;
|
||||
return array('' => '', 0 => '') + $relatedObjects;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,16 @@
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
|
||||
<?php
|
||||
if($this->config->edition == 'biz' || $this->config->edition == 'max')
|
||||
{
|
||||
$action = $this->loadModel('workflowaction')->getByModuleAndAction('bug', 'batchactivate');
|
||||
if($action->js) echo "<script>{$action->js}</script>";
|
||||
if($action->css) echo "<style>{$action->css}</style>";
|
||||
}
|
||||
?>
|
||||
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->bug->common . $lang->colon . $lang->bug->batchActivate;?></h2>
|
||||
@@ -24,6 +34,14 @@
|
||||
<th class='c-assigned'><?php echo $lang->bug->assignedTo;?></th>
|
||||
<th class='c-build'><?php echo $lang->bug->openedBuild;?></th>
|
||||
<th><?php echo $lang->bug->legendComment;?></th>
|
||||
<?php
|
||||
$extendFields = $this->bug->getFlowExtendFields();
|
||||
foreach($extendFields as $extendField)
|
||||
{
|
||||
$required = strpos(",$extendField->rules,", ',1,') !== false ? 'required' : '';
|
||||
echo "<th class='c-extend $required'>{$extendField->name}</th>";
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class='text-left'>
|
||||
@@ -34,11 +52,15 @@
|
||||
<td style='overflow:visible'><?php echo html::select("assignedToList[$bug->id]", $users, $bug->resolvedBy, "class='form-control chosen'");?></td>
|
||||
<td style='overflow:visible'><?php echo html::select("openedBuildList[$bug->id]", $builds, $bug->openedBuild, 'size=4 multiple=multiple class="form-control chosen"');?></td>
|
||||
<td><?php echo html::input("commentList[$bug->id]", '', "class='form-control'");?></td>
|
||||
<?php
|
||||
$this->loadModel('flow');
|
||||
foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, $bug, $extendField->field . "[$bug->id]") . "</td>";
|
||||
?>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr><td colspan='5' class='text-center'><?php echo html::submitButton();?></td></tr>
|
||||
<tr><td colspan="<?php echo count($extendFields) + 5;?>" class='text-center'><?php echo html::submitButton();?></td></tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
@@ -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,2 +1 @@
|
||||
#branch_chosen .chosen-single {border-left: 0px;}
|
||||
#noProduct {display: inline-block; width: 110%;}
|
||||
|
||||
@@ -313,6 +313,8 @@ class buildModel extends model
|
||||
->setDefault('branch', 0)
|
||||
->cleanInt('product,branch')
|
||||
->add('execution', (int)$executionID)
|
||||
->add('createdBy', $this->app->user->account)
|
||||
->add('createdDate', helper::now())
|
||||
->stripTags($this->config->build->editor->create['id'], $this->config->allowedTags)
|
||||
->remove('resolvedBy,allchecker,files,labels,uid')
|
||||
->get();
|
||||
|
||||
@@ -442,7 +442,7 @@ class caselib extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function exportTemplet($libID)
|
||||
public function exportTemplate($libID)
|
||||
{
|
||||
$this->loadModel('testcase');
|
||||
if($_POST)
|
||||
|
||||
+19
-19
@@ -12,25 +12,25 @@
|
||||
$lang->caselib->common = 'Case Library';
|
||||
$lang->caselib->all = 'All Case Libraries';
|
||||
|
||||
$lang->caselib->index = "Library Home";
|
||||
$lang->caselib->create = "Create Case Library";
|
||||
$lang->caselib->edit = 'Edit Case Library';
|
||||
$lang->caselib->browse = 'View Cases in Library';
|
||||
$lang->caselib->view = 'Library Detail';
|
||||
$lang->caselib->createCase = 'Create Case';
|
||||
$lang->caselib->delete = "Delete Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Deleted';
|
||||
$lang->caselib->exportTemplet = 'Export Template';
|
||||
$lang->caselib->batchCreateCase = 'Batch Create';
|
||||
$lang->caselib->import = 'Import';
|
||||
$lang->caselib->showImport = 'Imported Data';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Import Case';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->index = "Library Home";
|
||||
$lang->caselib->create = "Create Case Library";
|
||||
$lang->caselib->edit = 'Edit Case Library';
|
||||
$lang->caselib->browse = 'View Cases in Library';
|
||||
$lang->caselib->view = 'Library Detail';
|
||||
$lang->caselib->createCase = 'Create Case';
|
||||
$lang->caselib->delete = "Delete Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Deleted';
|
||||
$lang->caselib->exportTemplate = 'Export Template';
|
||||
$lang->caselib->batchCreateCase = 'Batch Create';
|
||||
$lang->caselib->import = 'Import';
|
||||
$lang->caselib->showImport = 'Imported Data';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Import Case';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
|
||||
$lang->caselib->id = 'ID';
|
||||
$lang->caselib->name = 'Name';
|
||||
|
||||
+19
-19
@@ -12,25 +12,25 @@
|
||||
$lang->caselib->common = 'Case Library';
|
||||
$lang->caselib->all = 'All Case Libraries';
|
||||
|
||||
$lang->caselib->index = "Library Home";
|
||||
$lang->caselib->create = "Create Case Library";
|
||||
$lang->caselib->edit = 'Edit Case Library';
|
||||
$lang->caselib->browse = 'View Cases in Library';
|
||||
$lang->caselib->view = 'Library Detail';
|
||||
$lang->caselib->createCase = 'Create Case';
|
||||
$lang->caselib->delete = "Delete Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Deleted';
|
||||
$lang->caselib->exportTemplet = 'Export Template';
|
||||
$lang->caselib->batchCreateCase = 'Batch Create';
|
||||
$lang->caselib->import = 'Import';
|
||||
$lang->caselib->showImport = 'Imported Data';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Import Case';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->index = "Library Home";
|
||||
$lang->caselib->create = "Create Case Library";
|
||||
$lang->caselib->edit = 'Edit Case Library';
|
||||
$lang->caselib->browse = 'View Cases in Library';
|
||||
$lang->caselib->view = 'Library Detail';
|
||||
$lang->caselib->createCase = 'Create Case';
|
||||
$lang->caselib->delete = "Delete Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Deleted';
|
||||
$lang->caselib->exportTemplate = 'Export Template';
|
||||
$lang->caselib->batchCreateCase = 'Batch Create';
|
||||
$lang->caselib->import = 'Import';
|
||||
$lang->caselib->showImport = 'Imported Data';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Import Case';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
|
||||
$lang->caselib->id = 'ID';
|
||||
$lang->caselib->name = 'Name';
|
||||
|
||||
+19
-19
@@ -12,25 +12,25 @@
|
||||
$lang->caselib->common = 'Case Library';
|
||||
$lang->caselib->all = 'All Case Libraries';
|
||||
|
||||
$lang->caselib->index = "Accueil Library";
|
||||
$lang->caselib->create = "Créer une Library";
|
||||
$lang->caselib->edit = 'Editer Library';
|
||||
$lang->caselib->browse = 'Voir CasTests dans Library';
|
||||
$lang->caselib->view = 'Détail Library';
|
||||
$lang->caselib->createCase = 'Créer CasTest';
|
||||
$lang->caselib->delete = "Supprimer Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Supprimé';
|
||||
$lang->caselib->exportTemplet = 'Exporter Modèle';
|
||||
$lang->caselib->batchCreateCase = 'Créer par lot';
|
||||
$lang->caselib->import = 'Importer';
|
||||
$lang->caselib->showImport = 'Données Importées';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Importer CasTest';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->index = "Accueil Library";
|
||||
$lang->caselib->create = "Créer une Library";
|
||||
$lang->caselib->edit = 'Editer Library';
|
||||
$lang->caselib->browse = 'Voir CasTests dans Library';
|
||||
$lang->caselib->view = 'Détail Library';
|
||||
$lang->caselib->createCase = 'Créer CasTest';
|
||||
$lang->caselib->delete = "Supprimer Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Supprimé';
|
||||
$lang->caselib->exportTemplate = 'Exporter Modèle';
|
||||
$lang->caselib->batchCreateCase = 'Créer par lot';
|
||||
$lang->caselib->import = 'Importer';
|
||||
$lang->caselib->showImport = 'Données Importées';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Importer CasTest';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
|
||||
$lang->caselib->id = 'ID';
|
||||
$lang->caselib->name = 'Nom';
|
||||
|
||||
@@ -21,7 +21,7 @@ $lang->caselib->createCase = 'Tạo tình huống';
|
||||
$lang->caselib->delete = "Xóa Suite";
|
||||
$lang->caselib->linkVersion = "Phiên bản";
|
||||
$lang->caselib->deleted = 'Đã xóa';
|
||||
$lang->caselib->exportTemplet = 'Xuất mẫu';
|
||||
$lang->caselib->exportTemplate = 'Xuất mẫu';
|
||||
$lang->caselib->batchCreateCase = 'Tạo hàng loạt';
|
||||
$lang->caselib->import = 'Nhập';
|
||||
$lang->caselib->importAction = 'Nhập tình huống';
|
||||
|
||||
@@ -12,25 +12,25 @@
|
||||
$lang->caselib->common = '用例库';
|
||||
$lang->caselib->all = '所有用例库';
|
||||
|
||||
$lang->caselib->index = "用例库首页";
|
||||
$lang->caselib->create = "创建用例库";
|
||||
$lang->caselib->edit = '编辑用例库';
|
||||
$lang->caselib->browse = '浏览用例库';
|
||||
$lang->caselib->view = '查看库概况';
|
||||
$lang->caselib->createCase = '创建用例';
|
||||
$lang->caselib->delete = "删除";
|
||||
$lang->caselib->linkVersion = "版本";
|
||||
$lang->caselib->deleted = '已删除';
|
||||
$lang->caselib->exportTemplet = '导出模板';
|
||||
$lang->caselib->batchCreateCase = '批量创建用例';
|
||||
$lang->caselib->import = '导入';
|
||||
$lang->caselib->showImport = '显示导入数据';
|
||||
$lang->caselib->type = '类型';
|
||||
$lang->caselib->product = '所属' . $lang->productCommon;
|
||||
$lang->caselib->browseAction = '用例库列表';
|
||||
$lang->caselib->deleteAction = "删除用例库";
|
||||
$lang->caselib->importAction = '导入用例';
|
||||
$lang->caselib->linkVersion = "版本";
|
||||
$lang->caselib->index = "用例库首页";
|
||||
$lang->caselib->create = "创建用例库";
|
||||
$lang->caselib->edit = '编辑用例库';
|
||||
$lang->caselib->browse = '浏览用例库';
|
||||
$lang->caselib->view = '查看库概况';
|
||||
$lang->caselib->createCase = '创建用例';
|
||||
$lang->caselib->delete = "删除";
|
||||
$lang->caselib->linkVersion = "版本";
|
||||
$lang->caselib->deleted = '已删除';
|
||||
$lang->caselib->exportTemplate = '导出模板';
|
||||
$lang->caselib->batchCreateCase = '批量创建用例';
|
||||
$lang->caselib->import = '导入';
|
||||
$lang->caselib->showImport = '显示导入数据';
|
||||
$lang->caselib->type = '类型';
|
||||
$lang->caselib->product = '所属' . $lang->productCommon;
|
||||
$lang->caselib->browseAction = '用例库列表';
|
||||
$lang->caselib->deleteAction = "删除用例库";
|
||||
$lang->caselib->importAction = '导入用例';
|
||||
$lang->caselib->linkVersion = "版本";
|
||||
|
||||
$lang->caselib->id = '编号';
|
||||
$lang->caselib->name = '名称';
|
||||
|
||||
@@ -21,7 +21,7 @@ $lang->caselib->createCase = '創建用例';
|
||||
$lang->caselib->delete = "刪除";
|
||||
$lang->caselib->linkVersion = "版本";
|
||||
$lang->caselib->deleted = '已刪除';
|
||||
$lang->caselib->exportTemplet = '導出模板';
|
||||
$lang->caselib->exportTemplate = '導出模板';
|
||||
$lang->caselib->batchCreateCase = '批量創建用例';
|
||||
$lang->caselib->import = '導入';
|
||||
$lang->caselib->showImport = '顯示導入數據';
|
||||
|
||||
@@ -152,17 +152,19 @@ class caselibModel extends model
|
||||
/**
|
||||
* Get library list.
|
||||
*
|
||||
* @param string $type
|
||||
* @param string $orderBy
|
||||
* @param object $pager
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getList($orderBy = 'id_desc', $pager = null)
|
||||
public function getList($type = 'all', $orderBy = 'id_desc', $pager = null)
|
||||
{
|
||||
return $this->dao->select('*')->from(TABLE_TESTSUITE)
|
||||
->where('product')->eq(0)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->andWhere('type')->eq('library')
|
||||
->beginIF($type == 'review')->andWhere("FIND_IN_SET('{$this->app->user->account}', `reviewers`)")->fi()
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
->fetchAll('id');
|
||||
|
||||
@@ -59,7 +59,7 @@ js::set('flow', $config->global->flow);
|
||||
}
|
||||
?>
|
||||
<div class='btn-group'>
|
||||
<?php common::printLink('caselib', 'exportTemplet', "libID=$libID", "<i class='icon icon-export muted'> </i> " . $lang->caselib->exportTemplet, '', "class='btn btn-link export' data-width='40%'");?>
|
||||
<?php common::printLink('caselib', 'exportTemplate', "libID=$libID", "<i class='icon icon-export muted'> </i> " . $lang->caselib->exportTemplate, '', "class='btn btn-link export' data-width='40%'");?>
|
||||
<?php common::printLink('caselib', 'import', "libID=$libID", "<i class='icon muted icon-import'> </i> " . $lang->testcase->fileImport, '', "class='btn btn-link export'");?>
|
||||
</div>
|
||||
<?php echo html::a($this->createLink('caselib', 'create'), "<i class='icon icon-plus'> </i> " . $lang->caselib->create, '', 'class="btn btn-secondary"');?>
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ function closeWindow()
|
||||
<div class="container">
|
||||
<div id="mainContent" class='main-content'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->testcase->exportTemplet;?></h2>
|
||||
<h2><?php echo $lang->testcase->exportTemplate;?></h2>
|
||||
</div>
|
||||
<form method='post' target='hiddenwin' onsubmit='setDownloading();' style='padding: 40px 5%'>
|
||||
<table class='table table-form'>
|
||||
@@ -1,10 +1,31 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php if(isset($suhosinInfo)):?>
|
||||
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
|
||||
<?php
|
||||
$requiredFields = $datas->requiredFields;
|
||||
$allCount = $datas->allCount;
|
||||
$allPager = $datas->allPager;
|
||||
$pagerID = $datas->pagerID;
|
||||
$isEndPage = $datas->isEndPage;
|
||||
$maxImport = $datas->maxImport;
|
||||
$dataInsert = $datas->dataInsert;
|
||||
$fields = $datas->fields;
|
||||
$suhosinInfo = $datas->suhosinInfo;
|
||||
$model = $datas->model;
|
||||
$datas = $datas->datas;
|
||||
?>
|
||||
<style>
|
||||
form{overflow-x: scroll}
|
||||
.c-pri, .c-estStarted, .c-deadline{width:100px;}
|
||||
.c-estimate {width:150px;}
|
||||
.c-story{width:150px;}
|
||||
.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 elseif(empty($maxImport) and $allCount > $this->config->file->maxImport):?>
|
||||
<div id="mainContent" class="main-content">
|
||||
<div class="main-header">
|
||||
<h2><?php echo $lang->caselib->import;?></h2>
|
||||
<h2><?php echo $lang->port->import;?></h2>
|
||||
</div>
|
||||
<p><?php echo sprintf($lang->file->importSummary, $allCount, html::input('maxImport', $config->file->maxImport, "style='width:50px'"), ceil($allCount / $config->file->maxImport));?></p>
|
||||
<p><?php echo html::commonButton($lang->import, "id='import'", 'btn btn-primary');?></p>
|
||||
@@ -23,118 +44,186 @@ $(function()
|
||||
<?php js::set('requiredFields', $requiredFields);?>
|
||||
<div id="mainContent" class="main-content">
|
||||
<div class="main-header clearfix">
|
||||
<h2><?php echo $lang->caselib->import;?></h2>
|
||||
<h2><?php echo $lang->port->import;?></h2>
|
||||
</div>
|
||||
<form target='hiddenwin' method='post'>
|
||||
<form class='main-form' target='hiddenwin' method='post'>
|
||||
<table class='table table-form' id='showData'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='c-number'><?php echo $lang->testcase->id?></th>
|
||||
<th class='c-title' id='title'> <?php echo $lang->testcase->title?></th>
|
||||
<th class='c-module' id='module'> <?php echo $lang->testcase->module?></th>
|
||||
<th class='c-pri' id='pri'> <?php echo $lang->testcase->pri?></th>
|
||||
<th class='c-type' id='type'> <?php echo $lang->testcase->type?></th>
|
||||
<th class='c-stage' id='stage'> <?php echo $lang->testcase->stage?></th>
|
||||
<th class='c-text' id='keywords'> <?php echo $lang->testcase->keywords?></th>
|
||||
<th class='c-precondition' id='precondition'><?php echo $lang->testcase->precondition?></th>
|
||||
<th class='c-case-step col-content'>
|
||||
<th class='w-70px'> <?php echo $lang->port->id?></th>
|
||||
|
||||
<?php foreach($fields as $key => $value):?>
|
||||
|
||||
<?php if($key == 'stepDesc' or $key == 'stepExpect'):?>
|
||||
<?php if($key == 'stepExpect') continue;?>
|
||||
<th class='c-step'>
|
||||
<table class='w-p100 table-borderless'>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->stepDesc?></th>
|
||||
<th><?php echo $lang->testcase->stepExpect?></th>
|
||||
<th class="no-padding"><?php echo $fields['stepDesc']['title']?></th>
|
||||
<th class="no-padding"><?php echo $fields['stepExpect']['title']?></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<?php elseif($value['control'] != 'hidden'):?>
|
||||
<th class='c-<?php echo $key?>' id='<?php echo $key;?>'> <?php echo $value['title'];?></th>
|
||||
|
||||
<?php endif;?>
|
||||
<?php endforeach;?>
|
||||
<?php
|
||||
if(!empty($appendFields))
|
||||
{
|
||||
foreach($appendFields as $field)
|
||||
{
|
||||
if(!$field->show) continue;
|
||||
|
||||
$width = ($field->width && $field->width != 'auto' ? $field->width . 'px' : 'auto');
|
||||
$required = strpos(",$field->rules,", ",$notEmptyRule->id,") !== false ? 'required' : '';
|
||||
echo "<th class='$required' style='width: $width'>$field->name</th>";
|
||||
}
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$insert = true;
|
||||
$hideContentCol = true;
|
||||
?>
|
||||
<?php foreach($caseData as $key => $case):?>
|
||||
<?php if(empty($case->title)) continue;?>
|
||||
<?php if(!empty($case->id) and !isset($cases[$case->id])) $case->id = 0;?>
|
||||
<tr class='text-left' valign='top'>
|
||||
<td>
|
||||
<?php
|
||||
if(!empty($case->id))
|
||||
{
|
||||
echo $case->id . html::hidden("id[$key]", $case->id);
|
||||
$insert = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo $key . " <sup class='text-green small'>{$lang->testcase->new}</sup>";
|
||||
}
|
||||
echo html::hidden("lib[$key]", $libID);
|
||||
?>
|
||||
</td>
|
||||
<td><?php echo html::input("title[$key]", $case->title, "class='form-control' style='margin-top:2px'")?></td>
|
||||
<td style='overflow:visible'><?php echo html::select("module[$key]", $modules, isset($case->module) ? $case->module : (!empty($case->id) ? $cases[$case->id]->module : ''), "class='form-control chosen'")?></td>
|
||||
<td><?php echo html::select("pri[$key]", $lang->testcase->priList, isset($case->pri) ? $case->pri : (!empty($case->id) ? $cases[$case->id]->pri : ''), "class='form-control chosen'")?></td>
|
||||
<td><?php echo html::select("type[$key]", $lang->testcase->typeList, isset($case->type) ? $case->type : (!empty($case->id) ? $cases[$case->id]->type : ''), "class='form-control chosen'")?></td>
|
||||
<td style='overflow:visible'><?php echo html::select("stage[$key][]", $lang->testcase->stageList, !empty($case->stage) ? $case->stage : (!empty($case->id) ? $cases[$case->id]->stage : ''), "multiple='multiple' class='form-control chosen'")?></td>
|
||||
<td><?php echo html::input("keywords[$key]", isset($case->keywords) ? $case->keywords : "", "class='form-control'")?></td>
|
||||
<td><?php echo html::textarea("precondition[$key]", isset($case->precondition) ? htmlSpecialString($case->precondition) : "", "class='form-control'")?></td>
|
||||
<td class='col-content'>
|
||||
<?php if(isset($stepData[$key]['desc'])):?>
|
||||
<table class='w-p100 bd-0'>
|
||||
<?php foreach($stepData[$key]['desc'] as $id => $desc):?>
|
||||
<?php
|
||||
if(empty($desc['content'])) continue;
|
||||
$hideContentCol = false;
|
||||
?>
|
||||
<tr class='step'>
|
||||
<td><?php echo $id . html::hidden("stepType[$key][$id]", $desc['type'])?></td>
|
||||
<td><?php echo html::textarea("desc[$key][$id]", htmlSpecialString($desc['content']), "class='form-control'")?></td>
|
||||
<td><?php if($desc['type'] != 'group') echo html::textarea("expect[$key][$id]", isset($stepData[$key]['expect'][$id]['content']) ? htmlSpecialString($stepData[$key]['expect'][$id]['content']) : '', "class='form-control'")?></td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</table>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='9' class='text-center form-actions'>
|
||||
<?php
|
||||
$insert = true;
|
||||
$addID = 1;
|
||||
$hasMultiple = false;
|
||||
?>
|
||||
<?php foreach($datas as $key => $object):?>
|
||||
<tr class='text-top'>
|
||||
<td>
|
||||
<?php
|
||||
$submitText = $isEndPage ? $this->lang->save : $this->lang->file->saveAndNext;
|
||||
if(!$insert and $dataInsert === '')
|
||||
if(!empty($object->id))
|
||||
{
|
||||
echo "<button type='button' data-toggle='modal' data-target='#importNoticeModal' class='btn btn-primary btn-wide'>{$submitText}</button>";
|
||||
echo $object->id . html::hidden("id[$key]", $object->id);
|
||||
$insert = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::submitButton($submitText);
|
||||
if($dataInsert !== '') echo html::hidden('insert', $dataInsert);
|
||||
$sub = (strpos($object->title, '>') === 0) ? " <sub style='vertical-align:sub;color:red'>{$lang->port->children}</sub>" : " <sub style='vertical-align:sub;color:gray'>{$lang->port->new}</sub>";
|
||||
echo $addID++ . $sub;
|
||||
}
|
||||
echo html::hidden("lib[$key]", $libID);
|
||||
?>
|
||||
</td>
|
||||
<?php foreach($fields as $field => $value):?>
|
||||
|
||||
<?php if($value['control'] == 'select'):?>
|
||||
<td><?php echo html::select("{$field}[$key]", $value['values'], !empty($object->$field) ? $object->$field : '', "class='form-control chosen'")?></td>
|
||||
|
||||
<?php elseif($value['control'] == 'multiple'):?>
|
||||
<?php if(!isset($value['values'][''])) $value['values'][''] = '';?>
|
||||
<td><?php echo html::select("{$field}[$key][]", $value['values'], !empty($object->$field) ? $object->$field : '', "multiple class='form-control chosen'")?></td>
|
||||
|
||||
<?php elseif($value['control'] == 'date'):?>
|
||||
<?php $dateMatch = $this->config->port->dateMatch;?>
|
||||
<?php if(!preg_match($dateMatch, $object->$field)) $object->$field = ''; ?>
|
||||
<td><?php echo html::input("{$field}[$key]", !empty($object->$field) ? $object->$field : '', "class='form-control form-date autocomplete='off'")?></td>
|
||||
|
||||
<?php elseif($value['control'] == 'datetime'):?>
|
||||
<td><?php echo html::input("{$field}[$key]", !empty($object->$field) ? $object->$field : '', "class='form-control form-datetime autocomplete='off'")?></td>
|
||||
|
||||
<?php elseif($value['control'] == 'hidden'):?>
|
||||
<?php echo html::hidden("{$field}[$key]", $object->$field)?>
|
||||
|
||||
<?php elseif($value['control'] == 'textarea'):?>
|
||||
<td><?php echo html::textarea("{$field}[$key]", $object->$field, "class='form-control' cols='50' rows='1'")?></td>
|
||||
|
||||
<?php elseif($field == 'stepDesc' or $field == 'stepExpect'):?>
|
||||
<?php if($field == 'stepExpect') continue;?>
|
||||
<td>
|
||||
<?php if(isset($stepData[$key]['desc'])):?>
|
||||
<table class='w-p100 bd-0'>
|
||||
<?php $hasStep = false;?>
|
||||
<?php foreach($stepData[$key]['desc'] as $id => $desc):?>
|
||||
<?php if(empty($desc['content'])) continue;?>
|
||||
<tr class='step'>
|
||||
<?php $hasStep = true;?>
|
||||
<td><?php echo $id . html::hidden("stepType[$key][$id]", $desc['type'])?></td>
|
||||
<td><?php echo html::textarea("desc[$key][$id]", htmlSpecialString($desc['content']), "class='form-control'")?></td>
|
||||
<td><?php if($desc['type'] != 'group') echo html::textarea("expect[$key][$id]", isset($stepData[$key]['expect'][$id]['content']) ? htmlSpecialString($stepData[$key]['expect'][$id]['content']) : '', "class='form-control'")?></td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
<?php if(!$hasStep):?>
|
||||
<tr class='step'>
|
||||
<td><?php echo '1' . html::hidden("stepType[$key][1]", 'step')?></td>
|
||||
<td><?php echo html::textarea("desc[$key][1]", '', "class='form-control'")?></td>
|
||||
<td><?php echo html::textarea("expect[$key][1]", '', "class='form-control'")?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
</table>
|
||||
<?php else:?>
|
||||
<table class='w-p100 bd-0'>
|
||||
<tr class='step'>
|
||||
<td><?php echo '1' . html::hidden("stepType[$key][1]", 'step')?></td>
|
||||
<td><?php echo html::textarea("desc[$key][1]", '', "class='form-control'")?></td>
|
||||
<td><?php echo html::textarea("expect[$key][1]", '', "class='form-control'")?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
|
||||
<?php else:?>
|
||||
<td><?php echo html::input("{$field}[$key]", !empty($object->$field) ? $object->$field : '', "class='form-control autocomplete='off'")?></td>
|
||||
<?php endif;?>
|
||||
|
||||
<?php endforeach;?>
|
||||
<?php
|
||||
if(!empty($appendFields))
|
||||
{
|
||||
$this->loadModel('flow');
|
||||
foreach($appendFields as $field)
|
||||
{
|
||||
if(!$field->show) continue;
|
||||
$value = $field->defaultValue ? $field->defaultValue : zget($datas, $field->field, '');
|
||||
echo '<td>' . $this->flow->buildControl($field, $value, "$field->field[$key]", true) . '</td>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='10' class='text-center form-actions'>
|
||||
<?php
|
||||
$submitText = $isEndPage ? $this->lang->save : $this->lang->file->saveAndNext;
|
||||
$isStartPage = $pagerID == 1 ? true : false;
|
||||
if(!$insert and $dataInsert === '')
|
||||
{
|
||||
echo "<button type='button' data-toggle='modal' data-target='#importNoticeModal' class='btn btn-primary btn-wide'>{$submitText}</button>";
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::submitButton($submitText);
|
||||
if($dataInsert !== '') echo html::hidden('insert', $dataInsert);
|
||||
}
|
||||
echo html::hidden('isEndPage', $isEndPage ? 1 : 0);
|
||||
echo html::hidden('pagerID', $pagerID);
|
||||
echo ' ' . html::a($this->createLink('caselib', 'browse', "libID=$libID"), $lang->goback, '', 'class="btn btn-wide"');
|
||||
echo ' ' . html::a("javascript:history.back(-1)", $lang->goback, '', "class='btn btn-back btn-wide'");
|
||||
echo ' ' . sprintf($lang->file->importPager, $allCount, $pagerID, $allPager);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
<?php if(!$insert and $dataInsert === '') include '../../common/view/noticeimport.html.php';?>
|
||||
<?php if(!$insert and $dataInsert === '') include $app->getModuleRoot() . 'common/view/noticeimport.html.php';?>
|
||||
</form>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php if(isset($hideContentCol) and $hideContentCol):?>
|
||||
<style>#mainContent .col-content{display: none;}</style>
|
||||
<?php endif;?>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$.fixedTableHead('#showData');
|
||||
<?php if($hasMultiple):?>
|
||||
$('th.estimate').addClass('text-center w-250px');
|
||||
<?php endif;?>
|
||||
$("#showData th").each(function()
|
||||
{
|
||||
if(requiredFields.indexOf(this.id) !== -1) $("#" + this.id).addClass('required');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
<?php include $app->getModuleRoot() . 'common/view/footer.html.php';?>
|
||||
|
||||
@@ -288,11 +288,12 @@ $lang->devops->rules = 'Rule';
|
||||
$lang->devops->settings = 'Setting Merge Request';
|
||||
$lang->devops->set = 'Set';
|
||||
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->convert->importJira = 'Import Jira';
|
||||
|
||||
@@ -431,6 +432,7 @@ $lang->colorPicker->errorTip = 'Not a valid color value';
|
||||
$lang->downNotify = "Download Desktop Notification";
|
||||
$lang->clientName = "Desktop";
|
||||
$lang->downloadClient = "Download ZenTao Desktop";
|
||||
$lang->downloadMobile = "Download Mobile Terminal";
|
||||
$lang->clientHelp = "Client Help";
|
||||
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/scrum-tool-im-integration-206.html";
|
||||
$lang->website = "http://www.zentao.net";
|
||||
|
||||
@@ -288,11 +288,12 @@ $lang->devops->rules = 'Rule';
|
||||
$lang->devops->settings = 'Setting Merge Request';
|
||||
$lang->devops->set = 'Set';
|
||||
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->convert->importJira = 'Import Jira';
|
||||
|
||||
@@ -431,6 +432,7 @@ $lang->colorPicker->errorTip = 'Not a valid color value';
|
||||
$lang->downNotify = "Download Desktop Notification";
|
||||
$lang->clientName = "Desktop";
|
||||
$lang->downloadClient = "Download ZenTao Desktop";
|
||||
$lang->downloadMobile = "Download Mobile Terminal";
|
||||
$lang->clientHelp = "Client Help";
|
||||
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/scrum-tool-im-integration-206.html";
|
||||
$lang->website = "https://www.zentao.pm";
|
||||
|
||||
@@ -288,11 +288,12 @@ $lang->devops->rules = 'Rule';
|
||||
$lang->devops->settings = 'Setting Merge Request';
|
||||
$lang->devops->set = 'Set';
|
||||
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->convert->importJira = 'Import Jira';
|
||||
|
||||
@@ -431,6 +432,7 @@ $lang->colorPicker->errorTip = "Ce n'est pas une valeur de couleur valide";
|
||||
$lang->downNotify = "Télécharger la notification sur le bureau";
|
||||
$lang->clientName = "Desktop";
|
||||
$lang->downloadClient = "Télécharger ZenTao Desktop";
|
||||
$lang->downloadMobile = "Download Mobile Terminal";
|
||||
$lang->clientHelp = "Aide Client";
|
||||
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/scrum-tool-im-integration-206.html";
|
||||
$lang->website = "https://www.zentao.pm";
|
||||
|
||||
@@ -320,7 +320,7 @@ $lang->execution->menu->task = array('link' => "{$lang->task->common}|execut
|
||||
$lang->execution->menu->kanban = array('link' => "$lang->executionKanban|execution|taskkanban|executionID=%s");
|
||||
$lang->execution->menu->burn = array('link' => "$lang->burn|execution|burn|executionID=%s");
|
||||
$lang->execution->menu->view = array('link' => "$lang->view|execution|grouptask|executionID=%s", 'alias' => 'grouptask,tree,taskeffort,gantt,calendar,relation,maintainrelation');
|
||||
$lang->execution->menu->story = array('link' => "$lang->SRCommon|execution|story|executionID=%s", 'subModule' => 'story', 'alias' => 'batchcreate,linkstory,storykanban');
|
||||
$lang->execution->menu->story = array('link' => "$lang->SRCommon|execution|story|executionID=%s", 'subModule' => 'story', 'alias' => 'batchcreate,linkstory,storykanban,batchtotask');
|
||||
$lang->execution->menu->qa = array('link' => "{$lang->qa->common}|execution|bug|executionID=%s", 'subModule' => 'bug,testcase,testtask,testreport', 'alias' => 'qa,bug,testcase,testtask,testreport');
|
||||
$lang->execution->menu->devops = array('link' => "{$lang->repo->common}|repo|browse|repoID=0&branchID=&objectID=%s", 'subModule' => 'repo');
|
||||
$lang->execution->menu->doc = array('link' => "{$lang->doc->common}|doc|tableContents|type=execution&objectID=%s", 'subModule' => 'doc');
|
||||
@@ -568,6 +568,7 @@ $lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->sec
|
||||
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
|
||||
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
|
||||
$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
|
||||
$lang->admin->menu->system['subMenu']->tableEngine = array('link' => "{$lang->admin->tableEngine}|admin|tableengine|");
|
||||
if(version_compare(phpversion(), 5.6) > 0) $lang->admin->menu->system['subMenu']->convertJira = array('link' => "{$lang->convert->importJira}|convert|convertjira|", 'subModule' => 'convert');
|
||||
|
||||
$lang->admin->dividerMenu = ',company,message,system,';
|
||||
|
||||
@@ -288,11 +288,12 @@ $lang->devops->rules = '指令';
|
||||
$lang->devops->settings = '合并请求设置';
|
||||
$lang->devops->set = '设置';
|
||||
|
||||
$lang->admin->system = '系统';
|
||||
$lang->admin->entry = '应用';
|
||||
$lang->admin->data = '数据';
|
||||
$lang->admin->cron = '定时';
|
||||
$lang->admin->buildIndex = '重建索引';
|
||||
$lang->admin->system = '系统';
|
||||
$lang->admin->entry = '应用';
|
||||
$lang->admin->data = '数据';
|
||||
$lang->admin->cron = '定时';
|
||||
$lang->admin->buildIndex = '重建索引';
|
||||
$lang->admin->tableEngine = '表引擎';
|
||||
|
||||
$lang->convert->importJira = '导入Jira数据';
|
||||
|
||||
@@ -431,6 +432,7 @@ $lang->colorPicker->errorTip = '不是有效的颜色值';
|
||||
$lang->downNotify = "下载桌面提醒";
|
||||
$lang->clientName = "客户端";
|
||||
$lang->downloadClient = "下载客户端";
|
||||
$lang->downloadMobile = "下载移动端";
|
||||
$lang->clientHelp = "客户端使用说明";
|
||||
$lang->clientHelpLink = "http://www.zentao.net/book/zentaopmshelp/302.html#2";
|
||||
$lang->website = "https://www.zentao.net";
|
||||
|
||||
+13
-9
@@ -1232,8 +1232,7 @@ class commonModel extends model
|
||||
/**
|
||||
* Print the module menu.
|
||||
*
|
||||
* @param string $actveMenu
|
||||
* @param string $methodName
|
||||
* @param string $activeMenu
|
||||
* @static
|
||||
* @access public
|
||||
* @return void
|
||||
@@ -1423,6 +1422,9 @@ class commonModel extends model
|
||||
echo "<li class='dropdown-submenu'>";
|
||||
echo "<a href='javascript:;'>" . "<i class='icon icon-download'></i> " . $lang->clientName . "</a><ul class='dropdown-menu pull-left'>";
|
||||
echo '<li>' . html::a(helper::createLink('misc', 'downloadClient', '', '', true), $lang->downloadClient, '', "title='$lang->downloadClient' class='iframe text-ellipsis' data-width='600'") . '</li>';
|
||||
echo "<li class='dropdown-submenu' id='downloadMobile'><a href='javascript:;'>" . $lang->downloadMobile . "</a><ul class='dropdown-menu pull-left''>";
|
||||
echo "<li><div class='mobile-qrcode'><img src='{$config->webRoot}theme/default/images/main/mobile_qrcode.png' /><div class='mobile-version'><span>v1.2</span></div></div></li>";
|
||||
echo "</ul></li>";
|
||||
echo '<li>' . html::a($lang->clientHelpLink, $lang->clientHelp, '', "title='$lang->clientHelp' target='_blank'") . '</li>';
|
||||
echo '</ul></li>';
|
||||
}
|
||||
@@ -1521,10 +1523,12 @@ class commonModel extends model
|
||||
public static function printLink($module, $method, $vars = '', $label = '', $target = '', $misc = '', $newline = true, $onlyBody = false, $object = null)
|
||||
{
|
||||
/* Add data-app attribute. */
|
||||
global $app;
|
||||
global $app, $config;
|
||||
$currentModule = strtolower($module);
|
||||
$currentMethod = strtolower($method);
|
||||
if(strpos($misc, 'data-app') === false) $misc .= ' data-app="' . $app->tab . '"';
|
||||
|
||||
if(!commonModel::hasPriv($module, $method, $object)) return false;
|
||||
if(!commonModel::hasPriv($module, $method, $object) and !in_array("$currentModule.$currentMethod", $config->openMethods)) return false;
|
||||
echo html::a(helper::createLink($module, $method, $vars, '', $onlyBody), $label, $target, $misc, $newline);
|
||||
return true;
|
||||
}
|
||||
@@ -1966,7 +1970,7 @@ EOD;
|
||||
}
|
||||
}
|
||||
|
||||
$changes = array();
|
||||
$changes = array();
|
||||
foreach($new as $key => $value)
|
||||
{
|
||||
if(is_object($value) or is_array($value)) continue;
|
||||
@@ -2413,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
|
||||
@@ -3385,19 +3389,19 @@ EOD;
|
||||
*/
|
||||
public static function sortFeatureMenu($module = '', $method = '')
|
||||
{
|
||||
global $lang, $app;
|
||||
global $lang, $config, $app;
|
||||
|
||||
$module = $module ? $module : $app->rawModule;
|
||||
$method = $method ? $method : $app->rawMethod;
|
||||
|
||||
/* It will be sorted according to the workflow in the future */
|
||||
if(!empty($lang->featureBarSort[$module][$method]))
|
||||
if(!empty($config->featureBarSort[$module][$method]))
|
||||
{
|
||||
$featureBar = array();
|
||||
if(empty($lang->$module->featureBar[$method])) return false;
|
||||
foreach($lang->$module->featureBar[$method] as $key => $label)
|
||||
{
|
||||
foreach($lang->featureBarSort[$module][$method] as $currentKey => $afterKey)
|
||||
foreach($config->featureBarSort[$module][$method] as $currentKey => $afterKey)
|
||||
{
|
||||
if($key == $currentKey) continue;
|
||||
$featureBar[$method][$key] = $label;
|
||||
|
||||
@@ -11,14 +11,19 @@
|
||||
*/
|
||||
css::import($jsRoot . 'dhtmlxgantt/min.css');
|
||||
js::import($jsRoot . 'dhtmlxgantt/min.js');
|
||||
js::import($jsRoot . 'dhtmlxgantt/ext/dhtmlxgantt_critical_path.js');
|
||||
js::import($jsRoot . 'dhtmlxgantt/ext/dhtmlxgantt_fullscreen.js');
|
||||
js::import($jsRoot . 'dhtmlxgantt/ext/dhtmlxgantt_smart_rendering.js');
|
||||
js::import($jsRoot . 'dhtmlxgantt/ext/dhtmlxgantt_marker.js');
|
||||
js::import($jsRoot . 'dhtmlxgantt/ext/dhtmlxgantt_tooltip.js');
|
||||
$currentLang = $app->getClientLang();
|
||||
if($currentLang != 'en') js::import($jsRoot . 'dhtmlxgantt/lang/' . $currentLang . '.js');
|
||||
?>
|
||||
<style>
|
||||
.gantt_message_area{display:none;}
|
||||
#ganttPris:hover{background:unset;color:unset;cursor: unset;}
|
||||
</style>
|
||||
<script>
|
||||
gantt.plugins({
|
||||
marker: true,
|
||||
critical_path: true,
|
||||
fullscreen: true,
|
||||
tooltip: true,
|
||||
click_drag: true
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -947,11 +947,13 @@ class convertModel extends model
|
||||
$productID = $projectProduct[$projectID];
|
||||
|
||||
$build = new stdclass();
|
||||
$build->product = $productID;
|
||||
$build->project = $projectID;
|
||||
$build->name = $data->vname;
|
||||
$build->date = substr($data->RELEASEDATE, 0, 10);
|
||||
$build->builder = $this->app->user->account;
|
||||
$build->product = $productID;
|
||||
$build->project = $projectID;
|
||||
$build->name = $data->vname;
|
||||
$build->date = substr($data->RELEASEDATE, 0, 10);
|
||||
$build->builder = $this->app->user->account;
|
||||
$build->createdBy = $this->app->user->account;
|
||||
$build->createdDate = helper::now();
|
||||
|
||||
$this->dao->dbh($this->dbh)->insert(TABLE_BUILD)->data($build)->exec();
|
||||
$buildID = $this->dao->dbh($this->dbh)->lastInsertID();
|
||||
|
||||
@@ -609,7 +609,7 @@ class custom extends control
|
||||
if($this->config->edition != 'max') $this->loadModel('setting')->setItem('system.custom.hourPoint', $this->post->hourPoint);
|
||||
|
||||
$this->app->loadLang('common');
|
||||
$locate = $this->config->systemMode == 'new' ? 'parent' : 'top';
|
||||
$locate = $this->config->systemMode == 'new' ? inlink('flow') : 'top';
|
||||
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $locate));
|
||||
}
|
||||
|
||||
+41
-14
@@ -319,19 +319,8 @@ class doc extends control
|
||||
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $docID));
|
||||
$objectID = zget($lib, $lib->type, 0);
|
||||
$params = "type={$lib->type}&objectID=$objectID&libID={$lib->id}&docID=" . $docResult['id'];
|
||||
$link = isonlybody() ? 'parent' : $this->createLink('doc', 'objectLibs', $params, 'html') . '#app=' . $this->app->tab;
|
||||
$response = array('result' => 'success', 'message' => $this->lang->saveSuccess);
|
||||
|
||||
if(isonlybody() and $docResult['docType'] == 'text')
|
||||
{
|
||||
$link = helper::createLink('doc', 'edit', "docID=$docID&comment=false&objectType=$objectType&objectID=$objectID&libID={$docResult['libID']}");
|
||||
|
||||
$response['callback'] = "redirect2Edit($docID, \"$objectType\", $objectID, {$docResult['libID']})";
|
||||
}
|
||||
else
|
||||
{
|
||||
$response['locate'] = "$link";
|
||||
}
|
||||
$link = isonlybody() ? 'parent' : $this->createLink('doc', 'objectLibs', $params) . '#app=' . $this->app->tab;
|
||||
$response = array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $link);
|
||||
|
||||
return $this->send($response);
|
||||
}
|
||||
@@ -394,6 +383,45 @@ class doc extends control
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create basic info for doc of text type.
|
||||
*
|
||||
* @param string $objectType
|
||||
* @param int $objectID
|
||||
* @param int|string $libID
|
||||
* @param int $moduleID
|
||||
* @param string $docType
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function createBasicInfo($objectType, $objectID, $libID, $moduleID = 0, $docType = '')
|
||||
{
|
||||
/* Get libs and the default lib id. */
|
||||
$unclosed = strpos($this->config->doc->custom->showLibs, 'unclosed') !== false ? 'unclosedProject' : '';
|
||||
$libs = $this->doc->getLibs($objectType, $extra = "withObject,$unclosed", $libID, $objectID);
|
||||
if(!$libID and !empty($libs)) $libID = key($libs);
|
||||
|
||||
$lib = $this->doc->getLibByID($libID);
|
||||
$type = isset($lib->type) ? $lib->type : 'product';
|
||||
$libName = isset($lib->name) ? $lib->name . $this->lang->colon : '';
|
||||
|
||||
$this->view->title = $libName . $this->lang->doc->create;
|
||||
|
||||
$this->view->objectType = $objectType;
|
||||
$this->view->objectID = zget($lib, $lib->type, 0);
|
||||
$this->view->libID = $libID;
|
||||
$this->view->lib = $lib;
|
||||
$this->view->libs = $libs;
|
||||
$this->view->libName = $this->dao->findByID($libID)->from(TABLE_DOCLIB)->fetch('name');
|
||||
$this->view->moduleOptionMenu = $this->tree->getOptionMenu($libID, 'doc', $startModuleID = 0);
|
||||
$this->view->moduleID = $moduleID ? (int)$moduleID : (int)$this->cookie->lastDocModule;
|
||||
$this->view->docType = $docType;
|
||||
$this->view->groups = $this->loadModel('group')->getPairs();
|
||||
$this->view->users = $this->user->getPairs('nocode|noclosed|nodeleted');
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit a doc.
|
||||
*
|
||||
@@ -983,7 +1011,6 @@ class doc extends control
|
||||
|
||||
$this->lang->TRActions = $this->doc->buildCollectButton4Doc();
|
||||
$this->lang->TRActions .= $this->doc->buildBrowseSwitch($type, $objectID, $viewType, $orderBy, $recTotal, $recPerPage, $pageID, $searchTitle);
|
||||
if($this->app->tab == 'doc') $this->app->rawMethod = $type;
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#whiteListBox .input-group:last-child {margin-top: 10px;}
|
||||
@@ -61,6 +61,68 @@ $(function()
|
||||
});
|
||||
|
||||
if($(".createCustomLib").length == 1) $(".createCustomLib").click(); // Fix bug #15139.
|
||||
|
||||
if(!fromGlobal && textType.indexOf(docType) != -1)
|
||||
{
|
||||
var basicInfo = JSON.parse(sessionStorage.getItem('docBasicInfo'));
|
||||
|
||||
var libID = 0;
|
||||
var moduleID = 0;
|
||||
var title = '';
|
||||
var keywords = '';
|
||||
var type = '';
|
||||
var acl = '';
|
||||
var contentType = '';
|
||||
var fileNames = [];
|
||||
var mailto = [];
|
||||
var groups = [];
|
||||
var users = [];
|
||||
|
||||
$.each(basicInfo, function(index, value)
|
||||
{
|
||||
switch(value.name)
|
||||
{
|
||||
case 'lib':
|
||||
libID = value.value;
|
||||
break;
|
||||
case 'module':
|
||||
moduleID = value.value;
|
||||
break;
|
||||
case 'title':
|
||||
title = value.value;
|
||||
break;
|
||||
case 'keywords':
|
||||
keywords = value.value;
|
||||
break;
|
||||
case 'type':
|
||||
type = value.value;
|
||||
break;
|
||||
case 'acl':
|
||||
acl = value.value;
|
||||
break;
|
||||
case 'contentType':
|
||||
contentType = value.value;
|
||||
break;
|
||||
case 'mailto[]':
|
||||
mailto.push(value.value);
|
||||
break;
|
||||
case 'groups[]':
|
||||
groups.push(value.value);
|
||||
break;
|
||||
case 'users[]':
|
||||
users.push(value.value);
|
||||
break;
|
||||
}
|
||||
})
|
||||
|
||||
$('#title').val(title);
|
||||
$('#modalBasicInfo #keywords').val(keywords);
|
||||
$('#modalBasicInfo #mailto').data('zui.picker').setValue(mailto);
|
||||
$('#modalBasicInfo input:radio[value='+ acl +']').attr('checked', 'checked');
|
||||
toggleAcl($('input[name="acl"]:checked').val(), 'doc');
|
||||
setTimeout(function(){$('#modalBasicInfo #groups').data('zui.picker').setValue(groups)}, 1000);
|
||||
setTimeout(function(){$('#modalBasicInfo #users').data('zui.picker').setValue(users)}, 1000);
|
||||
}
|
||||
})
|
||||
|
||||
function toggleEditor(type)
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
$(function()
|
||||
{
|
||||
config.onlybody = 'no';
|
||||
|
||||
toggleAcl($('input[name="acl"]:checked').val(), 'doc');
|
||||
|
||||
if($(".createCustomLib").length == 1) $(".createCustomLib").click(); // Fix bug #15139.
|
||||
|
||||
$('#saveBtn').click(function()
|
||||
{
|
||||
var params = $('#dataform').serializeArray();
|
||||
|
||||
sessionStorage.setItem('docBasicInfo', JSON.stringify(params));
|
||||
|
||||
var libID = $('#lib').val();
|
||||
var moduleID = $('#module').val();
|
||||
var link = createLink('doc', 'create', 'objectType=' + objectType + '&objectID=' + objectID + '&libID=' + libID + '&moduleID=' + moduleID + '&docType=' + docType);
|
||||
|
||||
parent.location.href = link;
|
||||
})
|
||||
})
|
||||
|
||||
/**
|
||||
* Load whitelist by libID.
|
||||
*
|
||||
* @param int $libID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function loadWhitelist(libID)
|
||||
{
|
||||
var groupLink = createLink('doc', 'ajaxGetWhitelist', 'libID=' + libID + '&acl=&control=group');
|
||||
var userLink = createLink('doc', 'ajaxGetWhitelist', 'libID=' + libID + '&acl=&control=user');
|
||||
$.post(groupLink, function(groups)
|
||||
{
|
||||
if(groups != 'private')
|
||||
{
|
||||
$('#groups').replaceWith(groups);
|
||||
$('#groups').next('.picker').remove();
|
||||
$('#groups').picker();
|
||||
}
|
||||
});
|
||||
|
||||
$.post(userLink, function(users)
|
||||
{
|
||||
if(users == 'private')
|
||||
{
|
||||
$('#aclopen').parent('.radio-inline').addClass('hidden');
|
||||
$('#aclcustom').parent('.radio-inline').addClass('hidden');
|
||||
$('#whiteListBox').addClass('hidden');
|
||||
$('#aclprivate').prop('checked', true);
|
||||
}
|
||||
else if(users == 'project')
|
||||
{
|
||||
$('#aclprivate').parent('.radio-inline').addClass('hidden');
|
||||
$('#aclcustom').parent('.radio-inline').addClass('hidden');
|
||||
$('#whiteListBox').addClass('hidden');
|
||||
$('#aclopen').prop('checked', true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#aclopen').parent('.radio-inline').removeClass('hidden');
|
||||
$('#aclcustom').parent('.radio-inline').removeClass('hidden');
|
||||
|
||||
$('#users').replaceWith(users);
|
||||
$('#users').next('.picker').remove();
|
||||
$('#users').picker();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -1,3 +1,8 @@
|
||||
$(function()
|
||||
{
|
||||
loadDocLibs('product');
|
||||
})
|
||||
|
||||
/**
|
||||
* Redirect the parent window.
|
||||
*
|
||||
|
||||
@@ -94,6 +94,7 @@ $lang->doc->main = 'Main Document Library';
|
||||
$lang->doc->order = 'Order';
|
||||
$lang->doc->doc = 'Document';
|
||||
$lang->doc->updateOrder = 'Update Order';
|
||||
$lang->doc->nextStep = 'Next';
|
||||
|
||||
$lang->doc->moduleDoc = 'Nach Modulen';
|
||||
$lang->doc->searchDoc = 'Suche';
|
||||
@@ -153,6 +154,7 @@ $lang->doc->allCollections = 'All Collections';
|
||||
$lang->doc->keywordsTips = 'Please use commas to separate multiple keywords.';
|
||||
$lang->doc->sortLibs = 'Sort Libs';
|
||||
$lang->doc->titlePlaceholder = 'Please enter the title';
|
||||
$lang->doc->confirm = 'Confirm';
|
||||
|
||||
global $config;
|
||||
/* Query condition list. */
|
||||
|
||||
@@ -94,6 +94,7 @@ $lang->doc->main = 'Main Document Library';
|
||||
$lang->doc->order = 'Order';
|
||||
$lang->doc->doc = 'Document';
|
||||
$lang->doc->updateOrder = 'Update Order';
|
||||
$lang->doc->nextStep = 'Next';
|
||||
|
||||
$lang->doc->moduleDoc = 'By Module';
|
||||
$lang->doc->searchDoc = 'Search';
|
||||
@@ -153,6 +154,7 @@ $lang->doc->allCollections = 'All Collections';
|
||||
$lang->doc->keywordsTips = 'Please use commas to separate keywords.';
|
||||
$lang->doc->sortLibs = 'Sort Libs';
|
||||
$lang->doc->titlePlaceholder = 'Please enter the title';
|
||||
$lang->doc->confirm = 'Confirm';
|
||||
|
||||
global $config;
|
||||
/* Query condition list. */
|
||||
|
||||
@@ -94,6 +94,7 @@ $lang->doc->main = 'Main Document Library';
|
||||
$lang->doc->order = 'Order';
|
||||
$lang->doc->doc = 'Document';
|
||||
$lang->doc->updateOrder = 'Update Order';
|
||||
$lang->doc->nextStep = 'Next';
|
||||
|
||||
$lang->doc->moduleDoc = 'Par Module';
|
||||
$lang->doc->searchDoc = 'Rechercher';
|
||||
@@ -153,6 +154,7 @@ $lang->doc->allCollections = 'All Collections';
|
||||
$lang->doc->keywordsTips = 'Please use commas to separate multiple keywords.';
|
||||
$lang->doc->sortLibs = 'Sort Libs';
|
||||
$lang->doc->titlePlaceholder = 'Veuillez saisir le titre';
|
||||
$lang->doc->confirm = 'Confirm';
|
||||
|
||||
global $config;
|
||||
/* Query condition list. */
|
||||
|
||||
@@ -94,6 +94,7 @@ $lang->doc->main = '文档主库';
|
||||
$lang->doc->order = '排序';
|
||||
$lang->doc->doc = '文档';
|
||||
$lang->doc->updateOrder = '更新排序';
|
||||
$lang->doc->nextStep = '下一步';
|
||||
|
||||
$lang->doc->moduleDoc = '按模块浏览';
|
||||
$lang->doc->searchDoc = '搜索';
|
||||
@@ -153,6 +154,7 @@ $lang->doc->allCollections = '查看全部收藏文档';
|
||||
$lang->doc->keywordsTips = '多个关键字请用逗号分隔。';
|
||||
$lang->doc->sortLibs = '文档库排序';
|
||||
$lang->doc->titlePlaceholder = '请输入标题';
|
||||
$lang->doc->confirm = '确认';
|
||||
|
||||
global $config;
|
||||
/* 查询条件列表 */
|
||||
|
||||
@@ -2131,11 +2131,12 @@ class docModel extends model
|
||||
{
|
||||
foreach($this->lang->doc->typeList as $typeKey => $typeName)
|
||||
{
|
||||
$class = (strpos($this->config->doc->officeTypes, $typeKey) !== false or strpos($this->config->doc->textTypes, $typeKey) !== false) ? 'iframe' : '';
|
||||
$icon = zget($this->config->doc->iconList, $typeKey);
|
||||
$html .= "<li>";
|
||||
$html .= html::a(helper::createLink('doc', 'create', "objectType=$objectType&objectID=$objectID&libID=$libID&moduleID=0&type=$typeKey", '', $class ? true : false), "<i class='icon-$icon icon'></i> " . $typeName, '', "class='$class' data-app='{$this->app->tab}'");
|
||||
$html .= "</li>";
|
||||
$class = (strpos($this->config->doc->officeTypes, $typeKey) !== false or strpos($this->config->doc->textTypes, $typeKey) !== false) ? 'iframe' : '';
|
||||
$icon = zget($this->config->doc->iconList, $typeKey);
|
||||
$method = strpos($this->config->doc->textTypes, $typeKey) !== false ? 'createBasicInfo' : 'create';
|
||||
$html .= "<li>";
|
||||
$html .= html::a(helper::createLink('doc', $method, "objectType=$objectType&objectID=$objectID&libID=$libID&moduleID=0&type=$typeKey", '', $class ? true : false), "<i class='icon-$icon icon'></i> " . $typeName, '', "class='$class' data-app='{$this->app->tab}'");
|
||||
$html .= "</li>";
|
||||
if($typeKey == 'url') $html .= '<li class="divider"></li>';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php if($docType == 'text' and $fromGlobal):?>
|
||||
<?php if(strpos($config->doc->textTypes, $docType) !== false and $from == 'doc'):?>
|
||||
<?php include 'createtexttype.html.php';?>
|
||||
<?php else:?>
|
||||
<?php if($docType != '' and strpos($config->doc->officeTypes, $docType) !== false):?>
|
||||
@@ -72,8 +72,7 @@ $("a[href^='###']").click(function()
|
||||
<th><?php echo $lang->doc->keywords;?></th>
|
||||
<td colspan='2'><?php echo html::input('keywords', '', "class='form-control' placeholder='{$lang->doc->keywordsTips}'");?></td>
|
||||
</tr>
|
||||
<?php $docContentHidden = strpos($this->config->doc->textTypes, $docType) !== false ? 'hidden' : '';?>
|
||||
<tr id='contentBox' class="<?php echo $docContentHidden;?>">
|
||||
<tr id='contentBox'>
|
||||
<th><?php echo $lang->doc->content;?></th>
|
||||
<td colspan='2'>
|
||||
<div class='contenthtml'><?php echo html::textarea('content', '', "style='width:100%;height:200px'");?></div>
|
||||
@@ -144,7 +143,9 @@ $("a[href^='###']").click(function()
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php js::set('textType', $config->doc->textTypes);?>
|
||||
<?php js::set('docType', $docType);?>
|
||||
<?php js::set('fromGlobal', $fromGlobal);?>
|
||||
<?php js::set('noticeAcl', $lang->doc->noticeAcl['doc']);?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
<?php endif;?>
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
/**
|
||||
* The create basic info view of doc module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author Fangzhou Hu <hufangzhou@easycorp.ltd>
|
||||
* @package doc
|
||||
* @version $Id: createbasicinfo.html.php 2022-08-02 13:49:25Z $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php js::set('holders', $lang->doc->placeholder);?>
|
||||
<?php js::set('type', 'doc');?>
|
||||
<div id="mainContent" class="main-content">
|
||||
<div class='center-block'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->doc->create;?></h2>
|
||||
</div>
|
||||
<?php if($objectType == 'custom' and empty($libs)):?>
|
||||
<?php echo html::a(helper::createLink('doc', 'createLib', "type=custom&objectID=$objectID"), '<i class="icon icon-plus"></i> ' . $lang->doc->createLib, '', 'class="iframe hidden createCustomLib"');?>
|
||||
<?php endif;?>
|
||||
<form class="load-indicator main-form form-ajax" id="dataform" method='post' enctype='multipart/form-data'>
|
||||
<table class='table table-form'>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th class='w-110px'><?php echo $lang->doc->lib;?></th>
|
||||
<td> <?php echo html::select('lib', $libs, $libID, "class='form-control chosen' onchange=loadDocModule(this.value)");?> </td><td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->doc->module;?></th>
|
||||
<td>
|
||||
<span id='moduleBox'><?php echo html::select('module', $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></span>
|
||||
</td><td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->doc->title;?></th>
|
||||
<td colspan='2'><?php echo html::input('title', '', "class='form-control'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->doc->keywords;?></th>
|
||||
<td colspan='2'><?php echo html::input('keywords', '', "class='form-control' placeholder='{$lang->doc->keywordsTips}'");?></td>
|
||||
</tr>
|
||||
<tr class='hidden'>
|
||||
<th><?php echo $lang->doc->type;?></th>
|
||||
<?php
|
||||
$typeKeyList = array();
|
||||
foreach($lang->doc->types as $typeKey => $typeName) $typeKeyList[$typeKey] = $typeKey;
|
||||
?>
|
||||
<td><?php echo html::radio('type', $lang->doc->types, zget($typeKeyList, $docType, 'text'));?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->doc->mailto;?></th>
|
||||
<td colspan="2">
|
||||
<div class="input-group">
|
||||
<?php
|
||||
echo html::select('mailto[]', $users, '', "multiple class='form-control picker-select' data-drop-direction='top'");
|
||||
echo $this->fetch('my', 'buildContactLists');
|
||||
?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->doclib->control;?></th>
|
||||
<td colspan='2'>
|
||||
<?php $acl = $lib->acl == 'default' ? 'open' : $lib->acl;?>
|
||||
<?php $acl = ($lib->type == 'project' and $acl == 'private') ? 'open' : $acl;?>
|
||||
<?php echo html::radio('acl', $lang->doc->aclList, $acl, "onchange='toggleAcl(this.value, \"doc\")'");?>
|
||||
<span class='text-info' id='noticeAcl'><?php echo $lang->doc->noticeAcl['doc'][$acl];?></span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id='whiteListBox' class='hidden'>
|
||||
<th><?php echo $lang->doc->whiteList;?></th>
|
||||
<td colspan='2'>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon groups-addon'><?php echo $lang->doclib->group?></span>
|
||||
<?php echo html::select('groups[]', $groups, '', "class='form-control picker-select' multiple data-drop-direction='top'")?>
|
||||
</div>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->doclib->user?></span>
|
||||
<?php echo html::select('users[]', $users, '', "class='form-control picker-select' multiple data-drop-direction='top'")?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center form-actions'>
|
||||
<?php echo html::hidden('contentType', 'html');?>
|
||||
<?php echo html::commonButton($lang->doc->nextStep, "id='saveBtn'", "btn btn-wide btn-primary");?>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php js::set('objectType', $objectType);?>
|
||||
<?php js::set('objectID', $objectID);?>
|
||||
<?php js::set('docType', $docType);?>
|
||||
<?php js::set('noticeAcl', $lang->doc->noticeAcl['doc']);?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
@@ -35,10 +35,9 @@
|
||||
.ke-toolbar {padding-left: 20px; width: 100%; height: 30px;}
|
||||
.ke-edit {border-top: 1px solid rgb(220, 220, 220)}
|
||||
.ke-edit, .CodeMirror {margin: 8px 200px 0 200px; background: #fff;}
|
||||
.kindeditor-ph {padding-left: 20px !important;}
|
||||
.kindeditor-ph {padding: 20px 20px 0 20px !important;}
|
||||
.editor-toolbar {background: #fff; padding-left: 20px; border-right: unset; border-top: unset; height: 30px;}
|
||||
.hide-sidebar .ke-edit {padding-right: 20px;}
|
||||
.hide-sidebar .CodeMirror {padding-right: 50px;}
|
||||
.CodeMirror {padding: 20px 20px 0 20px;}
|
||||
.CodeMirror.CodeMirror-wrap {border-left: 0; border-right: 0; border-bottom: 0;}
|
||||
.ke-statusbar {display: none;}
|
||||
.contentmarkdown {background: #efefef;}
|
||||
@@ -47,15 +46,9 @@
|
||||
|
||||
#noticeAcl {margin-left: 10px; vertical-align: middle;}
|
||||
|
||||
#moreList {display: inline-block; padding: 7px;}
|
||||
#moreList .icon-more-circle {font-size: 20px;}
|
||||
#moreList ul.dropdown-menu {left: -77px;}
|
||||
|
||||
#backBtn {border: unset;}
|
||||
#backBtn i {font-size: 20px;}
|
||||
#basicInfoLink {border: unset;}
|
||||
|
||||
.modal-title {font-size: 14px !important; font-weight: 700 !important;}
|
||||
#modalBasicInfo .modal-dialog {width: 720px;}
|
||||
</style>
|
||||
<?php if($objectType == 'custom' and empty($libs)):?>
|
||||
<?php echo html::a(helper::createLink('doc', 'createLib', "type=custom&objectID=$objectID"), '<i class="icon icon-plus"></i> ' . $lang->doc->createLib, '', 'class="iframe hidden createCustomLib"');?>
|
||||
@@ -66,16 +59,11 @@
|
||||
<table class='table table-form'>
|
||||
<tbody>
|
||||
<tr id='headerBox'>
|
||||
<td width='50px'><?php echo html::linkButton("<i class='icon icon-back-circle'></i>", $backLink, 'self', "id='backBtn'");?></td>
|
||||
<td width='90px'><?php echo html::a($backLink, '<i class="icon icon-back icon-sm"></i> ' . $lang->goback, '', "class='btn btn-secondary' id='backBtn'");?></td>
|
||||
<td class="doc-title" colspan='3'><?php echo html::input('title', '', "placeholder='{$lang->doc->titlePlaceholder}' class='form-control' required");?></td>
|
||||
<td class="text-right">
|
||||
<?php echo html::submitButton('', "data-placement='bottom'", 'btn btn-primary');?>
|
||||
<div id="moreList" class="dropdown dropdown-hover">
|
||||
<?php echo html::a('#', "<i class='icon icon-more-circle'></i>");?>
|
||||
<ul class="dropdown-menu">
|
||||
<li><?php echo html::a('#modalBasicInfo', $lang->doc->basicInfo, '', "data-toggle='modal' id='basicInfoLink'");?><li>
|
||||
</ul>
|
||||
</div>
|
||||
<?php echo html::a('#modalBasicInfo', "<i class='icon icon-cog-outline'></i> " . $lang->settings, '', "data-toggle='modal' id='basicInfoLink' class='btn'");?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -97,9 +85,6 @@
|
||||
<div class='modal-dialog'>
|
||||
<div class='modal-content with-padding'>
|
||||
<div class='modal-header'>
|
||||
<button type='button' class='close' data-dismiss='modal'>
|
||||
<i class="icon icon-close"></i>
|
||||
</button>
|
||||
<h2 class='modal-title'><?php echo $lang->doc->basicInfo;?></h2>
|
||||
</div>
|
||||
<div class='modal-body'>
|
||||
@@ -159,7 +144,7 @@
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->save, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->doc->confirm, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
@@ -176,20 +161,13 @@ $(function()
|
||||
setTimeout(function(){$('.ke-edit-iframe, .ke-edit').height(contentHeight);}, 100);
|
||||
setTimeout(function(){$('.CodeMirror').height(contentHeight);}, 100);
|
||||
|
||||
//basicInfoContent = '';
|
||||
//$('#basicInfoLink').click(function()
|
||||
//{
|
||||
// basicInfoContent = $('#basicInfoBox').html();
|
||||
//});
|
||||
|
||||
//$('#modalBasicInfo .modal-header .close').click(function()
|
||||
//{
|
||||
// $('#basicInfoBox').html(basicInfoContent);
|
||||
//});
|
||||
|
||||
$(document).on('click', '#modalBasicInfo tfoot .btn', function() {$('#modalBasicInfo').modal('hide');});
|
||||
|
||||
$('iframe.ke-edit-iframe').contents().find('.article-content').css('padding', '20px 20px 0 20px');
|
||||
})
|
||||
</script>
|
||||
<?php js::set('textType', $config->doc->textTypes);?>
|
||||
<?php js::set('docType', $docType);?>
|
||||
<?php js::set('fromGlobal', $fromGlobal);?>
|
||||
<?php js::set('noticeAcl', $lang->doc->noticeAcl['doc']);?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -39,10 +39,9 @@
|
||||
.ke-toolbar {padding-left: 20px; width: 100%; height: 30px;}
|
||||
.ke-edit {border-top: 1px solid rgb(220, 220, 220)}
|
||||
.ke-edit, .CodeMirror {margin: 8px 200px 0 200px; background: #fff;}
|
||||
.kindeditor-ph {padding-left: 20px !important;}
|
||||
.kindeditor-ph {padding: 20px 20px 0 20px !important;}
|
||||
.editor-toolbar {background: #fff; padding-left: 20px; border-right: unset; border-top: unset; height: 30px;}
|
||||
.hide-sidebar .ke-edit {padding-right: 20px;}
|
||||
.hide-sidebar .CodeMirror {padding-right: 50px;}
|
||||
.CodeMirror {padding: 20px 20px 0 20px;}
|
||||
.CodeMirror.CodeMirror-wrap {border-left: 0; border-right: 0; border-bottom: 0;}
|
||||
.ke-statusbar {display: none;}
|
||||
|
||||
@@ -50,15 +49,9 @@
|
||||
|
||||
#noticeAcl {margin-left: 10px; vertical-align: middle;}
|
||||
|
||||
#moreList {display: inline-block; padding: 7px;}
|
||||
#moreList .icon-more-circle {font-size: 20px;}
|
||||
#moreList ul.dropdown-menu {left: -77px;}
|
||||
|
||||
#backBtn {border: unset;}
|
||||
#backBtn i {font-size: 20px;}
|
||||
#basicInfoLink {border: unset;}
|
||||
|
||||
.modal-title {font-size: 14px !important; font-weight: 700 !important;}
|
||||
#modalBasicInfo .modal-dialog {width: 720px;}
|
||||
</style>
|
||||
<?php $backLink = $this->createLink('doc', 'objectlibs', "type=$type&objectID=$objectID&libID={$lib->id}&docID={$doc->id}");?>
|
||||
<div id="mainContent" class="main-content">
|
||||
@@ -66,20 +59,11 @@
|
||||
<table class='table table-form'>
|
||||
<tbody>
|
||||
<tr id='headerBox'>
|
||||
<?php if($from == 'create'):?>
|
||||
<td width='50px'><?php echo html::linkButton("<i class='icon icon-back-circle'></i>", $backLink, 'self', "id='backBtn'");?></td>
|
||||
<?php else:?>
|
||||
<td width='50px'><?php echo html::backButton("<i class='icon icon-back-circle'></i>", "id='backBtn'", '');?></td>
|
||||
<?php endif;?>
|
||||
<td width='90px'><?php echo html::backButton("<i class='icon icon-back icon-sm'></i> " . $lang->goback, "id='backBtn'", 'btn btn-secondary');?></td>
|
||||
<td class="doc-title" colspan='3'><?php echo html::input('title', $doc->title, "placeholder='{$lang->doc->titlePlaceholder}' class='form-control' required");?></td>
|
||||
<td class="text-right">
|
||||
<?php echo html::submitButton('', "data-placement='bottom'", 'btn btn-primary');?>
|
||||
<div id="moreList" class="dropdown dropdown-hover">
|
||||
<?php echo html::a('#', "<i class='icon icon-more-circle'></i>");?>
|
||||
<ul class="dropdown-menu">
|
||||
<li><?php echo html::a('#modalBasicInfo', $lang->doc->basicInfo, '', "data-toggle='modal' id='basicInfoLink'");?><li>
|
||||
</ul>
|
||||
</div>
|
||||
<?php echo html::a('#modalBasicInfo', "<i class='icon icon-cog-outline'></i> " . $lang->settings, '', "data-toggle='modal' id='basicInfoLink' class='btn'");?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -101,9 +85,6 @@
|
||||
<div class='modal-dialog'>
|
||||
<div class='modal-content with-padding'>
|
||||
<div class='modal-header'>
|
||||
<button type='button' class='close' data-dismiss='modal'>
|
||||
<i class="icon icon-close"></i>
|
||||
</button>
|
||||
<h2 class='modal-title'><?php echo $lang->doc->basicInfo;?></h2>
|
||||
</div>
|
||||
<div class='modal-body'>
|
||||
@@ -160,7 +141,7 @@
|
||||
</tr>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->save, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->doc->confirm, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
@@ -177,18 +158,9 @@ $(function()
|
||||
setTimeout(function(){$('.ke-edit-iframe, .ke-edit').height(contentHeight);}, 100);
|
||||
setTimeout(function(){$('.CodeMirror').height(contentHeight);}, 100);
|
||||
|
||||
//basicInfoContent = '';
|
||||
//$('#basicInfoLink').click(function()
|
||||
//{
|
||||
// basicInfoContent = $('#basicInfoBox').html();
|
||||
//});
|
||||
|
||||
//$('#modalBasicInfo .modal-header .close').click(function()
|
||||
//{
|
||||
// $('#basicInfoBox').html(basicInfoContent);
|
||||
//});
|
||||
|
||||
$(document).on('click', '#modalBasicInfo tfoot .btn', function() {$('#modalBasicInfo').modal('hide');});
|
||||
|
||||
$('iframe.ke-edit-iframe').contents().find('.article-content').css('padding', '20px 20px 0 20px');
|
||||
})
|
||||
</script>
|
||||
<?php js::set('noticeAcl', $lang->doc->noticeAcl['doc']);?>
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<td><?php echo html::radio('type', $lang->doc->types, 'text');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center form-actions'><?php echo html::submitButton($lang->confirm);?></td>
|
||||
<td colspan='3' class='text-center form-actions'><?php echo html::submitButton($lang->doc->nextStep);?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
@@ -93,11 +93,12 @@ if(empty($type)) $type = 'product';
|
||||
$html .= "<ul class='dropdown-menu' style='left:0px'>";
|
||||
foreach($this->lang->doc->typeList as $typeKey => $typeName)
|
||||
{
|
||||
$icon = zget($this->config->doc->iconList, $typeKey);
|
||||
$class = (strpos($this->config->doc->officeTypes, $typeKey) !== false or strpos($this->config->doc->textTypes, $typeKey) !== false) ? 'iframe' : '';
|
||||
$html .= "<li>";
|
||||
$html .= html::a(helper::createLink('doc', 'create', "objectType=$type&objectID=$objectID&libID=$libID&moduleID=0&type=$typeKey", '', $class ? true : false), "<i class='icon-$icon text-muted'></i> " . $typeName, '', "class='$class' data-app='{$this->app->tab}'");
|
||||
$html .= "</li>";
|
||||
$icon = zget($this->config->doc->iconList, $typeKey);
|
||||
$class = (strpos($this->config->doc->officeTypes, $typeKey) !== false or strpos($this->config->doc->textTypes, $typeKey) !== false) ? 'iframe' : '';
|
||||
$method = strpos($this->config->doc->textTypes, $typeKey) !== false ? 'createBasicInfo' : 'create';
|
||||
$html .= "<li>";
|
||||
$html .= html::a(helper::createLink('doc', $method, "objectType=$type&objectID=$objectID&libID=$libID&moduleID=0&type=$typeKey", '', $class ? true : false), "<i class='icon-$icon text-muted'></i> " . $typeName, '', "class='$class' data-app='{$this->app->tab}'");
|
||||
$html .= "</li>";
|
||||
if($typeKey == 'url') $html .= '<li class="divider"></li>';
|
||||
}
|
||||
$html .= "</ul></div>";
|
||||
|
||||
@@ -125,7 +125,7 @@ $config->execution->all->search['module'] = 'execution';
|
||||
$config->execution->all->search['fields']['name'] = $lang->execution->execName;
|
||||
$config->execution->all->search['fields']['id'] = $lang->execution->execId;
|
||||
$config->execution->all->search['fields']['status'] = $lang->execution->execStatus;
|
||||
$config->execution->all->search['fields']['project'] = $lang->execution->project;
|
||||
if($config->systemMode == 'new') $config->execution->all->search['fields']['project'] = $lang->execution->project;
|
||||
$config->execution->all->search['fields']['PM'] = $lang->execution->owner;
|
||||
$config->execution->all->search['fields']['openedBy'] = $lang->execution->openedBy;
|
||||
$config->execution->all->search['fields']['openedDate'] = $lang->execution->openedDate;
|
||||
@@ -140,7 +140,7 @@ $config->execution->all->search['fields']['closedDate'] = $lang->execution->
|
||||
$config->execution->all->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
|
||||
$config->execution->all->search['params']['id'] = array('operator' => '=', 'control' => 'input', 'values' => '');
|
||||
$config->execution->all->search['params']['status'] = array('operator' => '=', 'control' => 'select', 'values' => array('') + $lang->execution->statusList);
|
||||
$config->execution->all->search['params']['project'] = array('operator' => '=', 'control' => 'select', 'values' => '');
|
||||
if($config->systemMode == 'new') $config->execution->all->search['params']['project'] = array('operator' => '=', 'control' => 'select', 'values' => '');
|
||||
$config->execution->all->search['params']['PM'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
|
||||
$config->execution->all->search['params']['openedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
|
||||
$config->execution->all->search['params']['openedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
@@ -188,14 +188,14 @@ $config->execution->datatable->fieldList['id']['fixed'] = 'left';
|
||||
$config->execution->datatable->fieldList['id']['width'] = '70';
|
||||
$config->execution->datatable->fieldList['id']['required'] = 'yes';
|
||||
|
||||
$config->execution->datatable->fieldList['name']['title'] = 'name';
|
||||
$config->execution->datatable->fieldList['name']['title'] = 'execName';
|
||||
$config->execution->datatable->fieldList['name']['fixed'] = 'left';
|
||||
$config->execution->datatable->fieldList['name']['width'] = 'auto';
|
||||
$config->execution->datatable->fieldList['name']['required'] = 'yes';
|
||||
|
||||
if(!isset($config->setCode) or $config->setCode == 1)
|
||||
{
|
||||
$config->execution->datatable->fieldList['code']['title'] = 'code';
|
||||
$config->execution->datatable->fieldList['code']['title'] = 'execCode';
|
||||
$config->execution->datatable->fieldList['code']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['code']['width'] = '95';
|
||||
$config->execution->datatable->fieldList['code']['required'] = 'no';
|
||||
@@ -211,7 +211,7 @@ $config->execution->datatable->fieldList['PM']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['PM']['width'] = '70';
|
||||
$config->execution->datatable->fieldList['PM']['required'] = 'no';
|
||||
|
||||
$config->execution->datatable->fieldList['status']['title'] = 'status';
|
||||
$config->execution->datatable->fieldList['status']['title'] = 'execStatus';
|
||||
$config->execution->datatable->fieldList['status']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['status']['width'] = '100';
|
||||
$config->execution->datatable->fieldList['status']['required'] = 'no';
|
||||
|
||||
@@ -943,6 +943,7 @@ class execution extends control
|
||||
|
||||
/* Save session. */
|
||||
$this->session->set('bugList', $this->app->getURI(true), 'execution');
|
||||
$this->session->set('buildList', $this->app->getURI(true), 'execution');
|
||||
|
||||
$type = strtolower($type);
|
||||
$queryID = ($type == 'bysearch') ? (int)$param : 0;
|
||||
@@ -1057,7 +1058,7 @@ class execution extends control
|
||||
$this->view->builds = $this->build->getBuildPairs($productID);
|
||||
$this->view->branchOption = $branchOption;
|
||||
$this->view->branchTagOption = $branchTagOption;
|
||||
$this->view->plans = $this->loadModel('productplan')->getPairs($productID);
|
||||
$this->view->plans = $this->loadModel('productplan')->getPairs($productID ? $productID : array_keys($products));
|
||||
$this->view->stories = $storyList;
|
||||
$this->view->tasks = $taskList;
|
||||
$this->view->projectPairs = $this->loadModel('project')->getPairsByProgram();
|
||||
@@ -1383,19 +1384,37 @@ class execution extends control
|
||||
$this->loadModel('kanban');
|
||||
$this->app->loadClass('date');
|
||||
|
||||
$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)
|
||||
@@ -1423,6 +1442,8 @@ class execution extends control
|
||||
$this->view->chartData = $chartData;
|
||||
$this->view->begin = $begin;
|
||||
$this->view->end = $end;
|
||||
$this->view->minDate = $minDate;
|
||||
$this->view->maxDate = $maxDate;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -2289,9 +2310,7 @@ class execution extends control
|
||||
{
|
||||
$this->app->loadClass('date');
|
||||
|
||||
$begin = date('Y-m-d', strtotime('-13 days'));
|
||||
$begin = (helper::isZeroDate($execution->begin) or helper::diffDate($begin, $execution->begin) > 0) ? $begin : $execution->begin;
|
||||
$end = helper::today();
|
||||
list($begin, $end) = $this->execution->getBeginEnd4CFD($execution);
|
||||
$dateList = date::getDateList($begin, $end, 'Y-m-d', 'noweekend');
|
||||
$chartData = $this->execution->buildCFDData($executionID, $dateList, 'task');
|
||||
if(isset($chartData['line'])) $chartData['line'] = array_reverse($chartData['line']);
|
||||
@@ -3675,7 +3694,6 @@ class execution extends control
|
||||
* All execution.
|
||||
*
|
||||
* @param string $status
|
||||
* @param int $projectID
|
||||
* @param string $orderBy
|
||||
* @param int $productID
|
||||
* @param string $param
|
||||
@@ -3685,7 +3703,7 @@ class execution extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function all($status = 'undone', $projectID = 0, $orderBy = 'order_asc', $productID = 0, $param = '', $recTotal = 0, $recPerPage = 100, $pageID = 1)
|
||||
public function all($status = 'undone', $orderBy = 'order_asc', $productID = 0, $param = '', $recTotal = 0, $recPerPage = 100, $pageID = 1)
|
||||
{
|
||||
$this->app->loadLang('my');
|
||||
$this->app->loadLang('product');
|
||||
@@ -3698,17 +3716,8 @@ class execution extends control
|
||||
|
||||
if($this->app->viewType == 'mhtml')
|
||||
{
|
||||
if($this->app->rawModule == 'project' and $this->app->rawMethod == 'execution')
|
||||
{
|
||||
$projects = $this->project->getPairsByProgram();
|
||||
$projectID = $this->project->saveState($projectID, $projects);
|
||||
$this->project->setMenu($projectID);
|
||||
}
|
||||
else
|
||||
{
|
||||
$executionID = $this->execution->saveState(0, $this->executions);
|
||||
$this->execution->setMenu($executionID);
|
||||
}
|
||||
$executionID = $this->execution->saveState(0, $this->executions);
|
||||
$this->execution->setMenu($executionID);
|
||||
}
|
||||
|
||||
/* Load pager and get tasks. */
|
||||
@@ -3716,13 +3725,13 @@ class execution extends control
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
$queryID = ($status == 'bySearch') ? (int)$param : 0;
|
||||
$actionURL = $this->createLink('execution', 'all', "status=bySearch&projectID=$projectID&orderBy=$orderBy&productID=$productID¶m=myQueryID");
|
||||
$actionURL = $this->createLink('execution', 'all', "status=bySearch&orderBy=$orderBy&productID=$productID¶m=myQueryID");
|
||||
$this->execution->buildSearchFrom($queryID, $actionURL);
|
||||
|
||||
$this->view->title = $this->lang->execution->allExecutions;
|
||||
$this->view->position[] = $this->lang->execution->allExecutions;
|
||||
|
||||
$executionStats = $this->project->getStats($projectID, $status, $productID, 0, 30, $orderBy, $pager, false, $queryID);
|
||||
$executionStats = $this->project->getStats(0, $status, $productID, 0, 30, $orderBy, $pager, false, $queryID);
|
||||
|
||||
$parentIdList = array();
|
||||
foreach($executionStats as $execution)
|
||||
@@ -3733,15 +3742,13 @@ class execution extends control
|
||||
$parents = array();
|
||||
if($parentIdList) $parents = $this->execution->getByIdList($parentIdList);
|
||||
|
||||
$allExecutionsNum = $this->project->getStats($projectID, 'all');
|
||||
$allExecutionsNum = $this->project->getStats(0, 'all');
|
||||
$this->view->allExecutionsNum = count($allExecutionsNum);
|
||||
|
||||
$this->view->executionStats = $executionStats;
|
||||
$this->view->productList = $this->loadModel('product')->getProductPairsByProject($projectID);
|
||||
$this->view->productList = $this->loadModel('product')->getProductPairsByProject(0);
|
||||
$this->view->productID = $productID;
|
||||
$this->view->projectID = $projectID;
|
||||
$this->view->parents = $parents;
|
||||
$this->view->projects = array('') + $this->project->getPairsByProgram();
|
||||
$this->view->pager = $pager;
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
|
||||
@@ -28,10 +28,13 @@ td.flex span.project-type-label {min-width: 40px;}
|
||||
.has-child > span {margin-right: 5px;}
|
||||
.c-name > .text-ellipsis {text-overflow: clip;}
|
||||
.c-code, .c-project {overflow: hidden; white-space: nowrap;}
|
||||
th.c-status, .c-begin, .c-end, .c-realBegan, .c-realEnd {text-align: center;}
|
||||
|
||||
.c-project{text-overflow: unset !important;}
|
||||
canvas {height: 28px;}
|
||||
.parent.has-child.c-name.flex, .table-child-bottom > .c-name.flex {border-bottom: 0px solid #cbd0db !important;}
|
||||
.parent.has-child.c-name.flex {margin-bottom: -2px !important;}
|
||||
#tableCustomBtn {padding-bottom: 5px;}
|
||||
#bysearchTab {margin-left: 5px;}
|
||||
#datatable-executionList .table-child-bottom > .c-name.flex {border-bottom: 1px solid #cbd0db !important;}
|
||||
#datatable-executionList .table-child-bottom.table-child-top > .c-name.flex {border-bottom: 2px solid #cbd0db !important;}
|
||||
#datatable-executionList .parent.has-child.c-name.flex {border-bottom: 1px solid #cbd0db !important;}
|
||||
#datatable-executionList tr:last-child .c-name.flex {margin-top: 1px !important;}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
td.delayed {background: #e84e0f !important; color: white;}
|
||||
#int-dropdown {margin-left: -8px; border-radius: 4px; border: 1px solid #0c64eb;}
|
||||
#projectTaskForm table tbody tr td {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
th.c-deadline {text-align: center;}
|
||||
.table td.c-estimate, .table td.c-consumed, .table td.c-left {padding-right: 12px;}
|
||||
.c-estimate {text-align: right;}
|
||||
.c-consumed {text-align: right;}
|
||||
.c-deadline {text-align: center;}
|
||||
.c-left {text-align: right;}
|
||||
.table-footer {z-index: 1;}
|
||||
.btn-toolbar > .btn {margin-right: 5px !important;}
|
||||
|
||||
@@ -11,7 +11,7 @@ $(function()
|
||||
if(isCNLang && nameWidth < 150 && !useDatatable) $('#executionsForm thead th.c-name').css('width', '150px');
|
||||
if(!isCNLang && nameWidth < 200 && !useDatatable) $('#executionsForm thead th.c-name').css('width', '200px');
|
||||
|
||||
toggleFold('#executionsForm', unfoldExecutions, projectID, 'execution');
|
||||
toggleFold('#executionsForm', unfoldExecutions, 0, 'execution');
|
||||
|
||||
$('.table td.has-child > .plan-toggle').each(function()
|
||||
{
|
||||
|
||||
@@ -137,7 +137,7 @@ $(function()
|
||||
location.href = createLink('execution', 'cfd', 'executionID=' + executionID + '&type=' + type + '&withWeekend=' + withWeekend + '&begin=' + begin + '&end=' + end);
|
||||
});
|
||||
|
||||
$("#end, #begin").datetimepicker('setEndDate', today);
|
||||
$("#end, #begin").datetimepicker('setStartDate', executionBegin);
|
||||
$("#end, #begin").datetimepicker('setEndDate', maxDate);
|
||||
$("#end, #begin").datetimepicker('setStartDate', minDate);
|
||||
$('.datetimepicker-days table tfoot').append('<tr><th colspan="7">' + dateRangeTip + '</th></tr>');
|
||||
});
|
||||
|
||||
@@ -761,14 +761,15 @@ function renderCount($count, count, column)
|
||||
{
|
||||
if(groupBy == 'story' && column.type == 'story')
|
||||
{
|
||||
var orderButton = '<button class="btn btn-link action storyColumn" type="button" data-toggle="dropdown">'
|
||||
+ ' <span class="text">' + (kanbanLang.orderList[orderBy] == undefined ? kanbanLang.orderList['pri_asc'] : kanbanLang.orderList[orderBy]) + '</span><span class="caret"></span>'
|
||||
+ '</button>'
|
||||
var orderButton = '<a class="btn btn-link action storyColumn ' + (changeOrder ? 'text-primary' : '') + '" type="button" data-toggle="dropdown">'
|
||||
+ "<i class='icon icon-swap'></i>"
|
||||
+ '</a>'
|
||||
+ '<ul class="dropdown-menu">';
|
||||
for(var order in kanbanLang.orderList) orderButton += '<li class="' + (order == orderBy ? 'active' : '') + '"><a href="###" onclick="searchCards(rdSearchValue, \'' + order + '\')">' + kanbanLang.orderList[order] + '</a></li>';
|
||||
orderButton += '</ul>';
|
||||
|
||||
$count.prev().replaceWith(orderButton);
|
||||
$count.parent().next().html(orderButton);
|
||||
$count.parent().next().addClass('createButton');
|
||||
$count.remove();
|
||||
return;
|
||||
}
|
||||
@@ -1484,6 +1485,8 @@ $(function()
|
||||
|
||||
if($.cookie('isFullScreen') == 1) $.cookie('isFullScreen', 0);
|
||||
|
||||
changeOrder = false;
|
||||
|
||||
window.kanbanScaleSize = +$.zui.store.get('executionKanbanScaleSize', 1);
|
||||
$('#kanbanScaleSize').text(window.kanbanScaleSize);
|
||||
$('#kanbanScaleControl .btn[data-type="+"]').attr('disabled', window.kanbanScaleSize >= 4 ? 'disabled' : null);
|
||||
@@ -1838,6 +1841,7 @@ function searchCards(value, order = '')
|
||||
{
|
||||
rdSearchValue = value;
|
||||
orderBy = order == '' ? orderBy : order;
|
||||
if(order != '') changeOrder = true;
|
||||
$.get(createLink('execution', 'ajaxUpdateKanban', "executionID=" + executionID + "&entertime=0&browseType=" + browseType + "&groupBy=" + groupBy + '&from=RD&searchValue=' + rdSearchValue + '&orderBy=' + orderBy), function(data)
|
||||
{
|
||||
lastUpdateData = data;
|
||||
@@ -1857,7 +1861,7 @@ function searchCards(value, order = '')
|
||||
|
||||
if(hideAll && rdSearchValue != '')
|
||||
{
|
||||
if($('.table-empty-tip').length == 0) $('#kanban').append('<div class="table-empty-tip"><p><span class="text-muted">' + kanbanLang.empty + '</span></p></div>');
|
||||
if($('.table-empty-tip').length == 0) $('#kanban').append('<div class="table-empty-tip"><p><span class="text-muted">' + kanbancardLang.empty + '</span></p></div>');
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -32,7 +32,7 @@ $(function()
|
||||
})
|
||||
|
||||
/* Get checked stories. */
|
||||
$('#batchToTaskButton').on('click', function()
|
||||
$(document).on('click', '#batchToTaskButton', function()
|
||||
{
|
||||
storyIdList = '';
|
||||
linedTaskIdList = '';
|
||||
@@ -49,10 +49,34 @@ $(function()
|
||||
}
|
||||
storyIdList += $(this).val() + ',';
|
||||
});
|
||||
|
||||
$('#type').val('').trigger("chosen:updated");
|
||||
$('#hourPointValue').val('');
|
||||
$('input[name^=fields]').prop('checked', true);
|
||||
});
|
||||
|
||||
$('#submit').click(function()
|
||||
{
|
||||
var taskType = $('#type').val();
|
||||
var hourPoint = $('#hourPointValue').val();
|
||||
if(taskType.length == 0)
|
||||
{
|
||||
alert(typeNotEmpty);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(hourPoint == 0)
|
||||
{
|
||||
alert(hourPointNotEmpty);
|
||||
return false;
|
||||
}
|
||||
else if(typeof(hourPoint) != 'undefined' && (isNaN(hourPoint) || hourPoint < 0))
|
||||
{
|
||||
alert(hourPointNotError);
|
||||
return false;
|
||||
}
|
||||
hourPoint = typeof(hourPoint) == 'undefined' ? 0 : hourPoint;
|
||||
|
||||
if(linedTaskIdList)
|
||||
{
|
||||
confirmStoryToTask = confirmStoryToTask.replace('%s', linedTaskIdList);
|
||||
|
||||
@@ -341,15 +341,15 @@ function renderColumnCount($count, count, col)
|
||||
{
|
||||
if(groupBy == 'story' && col.type == 'story')
|
||||
{
|
||||
var orderButton = '<button class="btn btn-link action storyColumn" type="button" data-toggle="dropdown">'
|
||||
+ ' <span class="text">' + (kanbanLang.orderList[orderBy] == undefined ? kanbanLang.orderList['pri_asc'] : kanbanLang.orderList[orderBy]) + '</span><span class="caret"></span>'
|
||||
+ '</button>'
|
||||
var orderButton = '<a class="btn btn-link action storyColumn ' + (changeOrder ? 'text-primary' : '') + '" type="button" data-toggle="dropdown">'
|
||||
+ "<i class='icon icon-swap'></i>"
|
||||
+ '</a>'
|
||||
+ '<ul class="dropdown-menu">';
|
||||
for(var order in kanbanLang.orderList) orderButton += '<li class="' + (order == orderBy ? 'active' : '') + '"><a href="###" onclick="searchCards(searchValue, \'' + order + '\')">' + kanbanLang.orderList[order] + '</a></li>';
|
||||
orderButton += '</ul>';
|
||||
|
||||
$count.siblings('.storyColumn').remove();
|
||||
$count.prev().replaceWith(orderButton);
|
||||
$count.parent().next().html(orderButton);
|
||||
$count.parent().next().addClass('createButton');
|
||||
$count.hide();
|
||||
return;
|
||||
}
|
||||
@@ -1227,6 +1227,7 @@ $(function()
|
||||
$('#kanbanScaleControl .btn[data-type="+"]').attr('disabled', window.kanbanScaleSize >= 4 ? 'disabled' : null);
|
||||
$('#kanbanScaleControl .btn[data-type="-"]').attr('disabled', window.kanbanScaleSize <= 1 ? 'disabled' : null);
|
||||
|
||||
changeOrder = false;
|
||||
/* Common options */
|
||||
var commonOptions =
|
||||
{
|
||||
@@ -1484,6 +1485,7 @@ function searchCards(value, order = '')
|
||||
{
|
||||
searchValue = value;
|
||||
orderBy = order == '' ? orderBy : order;
|
||||
if(order != '') changeOrder = true;
|
||||
$.get(createLink('execution', 'ajaxUpdateKanban', "executionID=" + executionID + "&entertime=0&browseType=" + browseType + "&groupBy=" + groupBy + '&from=execution&searchValue=' + value + '&orderBy=' + orderBy), function(data)
|
||||
{
|
||||
lastUpdateData = data;
|
||||
|
||||
@@ -154,6 +154,7 @@ $lang->execution->putoff = 'Zurückstellen';
|
||||
$lang->execution->suspend = 'Aussetzen';
|
||||
$lang->execution->close = 'Schließen';
|
||||
$lang->execution->export = 'Export';
|
||||
$lang->execution->next = "Next";
|
||||
|
||||
$lang->execution->endList[7] = '1 Woche';
|
||||
$lang->execution->endList[14] = '2 Wochen';
|
||||
@@ -173,6 +174,7 @@ $lang->execution->cfdTypeList['bug'] = "View By bug";
|
||||
|
||||
$lang->team->account = 'Konto';
|
||||
$lang->team->role = 'Rolle';
|
||||
$lang->team->roleAB = 'Meine Rolle';
|
||||
$lang->team->join = 'Beigetreten';
|
||||
$lang->team->hours = 'Stunde/Tag';
|
||||
$lang->team->days = 'Arbeitstage';
|
||||
@@ -514,6 +516,9 @@ $lang->execution->featureBar['all']['doing'] = $lang->execution->statusList[
|
||||
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
|
||||
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
|
||||
|
||||
$lang->execution->featureBar['bug']['all'] = 'All';
|
||||
$lang->execution->featureBar['bug']['unresolved'] = 'Active';
|
||||
|
||||
$lang->execution->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->execution->myExecutions = 'Ich bin beteiligt.';
|
||||
@@ -543,11 +548,37 @@ $lang->execution->statusColorList['suspended'] = '#fdc137';
|
||||
$lang->execution->statusColorList['closed'] = '#838A9D';
|
||||
|
||||
if(!isset($lang->execution->gantt)) $lang->execution->gantt = new stdclass();
|
||||
$lang->execution->gantt->color[0] = 'bbb';
|
||||
$lang->execution->gantt->color[1] = 'ff5d5d';
|
||||
$lang->execution->gantt->color[2] = 'ff9800';
|
||||
$lang->execution->gantt->color[3] = '16a8f8';
|
||||
$lang->execution->gantt->color[4] = '00da88';
|
||||
$lang->execution->gantt->progressColor[0] = '#B7B7B7';
|
||||
$lang->execution->gantt->progressColor[1] = '#FF8287';
|
||||
$lang->execution->gantt->progressColor[2] = '#FFC73A';
|
||||
$lang->execution->gantt->progressColor[3] = '#6BD5F5';
|
||||
$lang->execution->gantt->progressColor[4] = '#9DE88A';
|
||||
$lang->execution->gantt->progressColor[5] = '#9BA8FF';
|
||||
|
||||
$lang->execution->gantt->color[0] = '#E7E7E7';
|
||||
$lang->execution->gantt->color[1] = '#FFDADB';
|
||||
$lang->execution->gantt->color[2] = '#FCECC1';
|
||||
$lang->execution->gantt->color[3] = '#D3F3FD';
|
||||
$lang->execution->gantt->color[4] = '#DFF5D9';
|
||||
$lang->execution->gantt->color[5] = '#EBDCF9';
|
||||
|
||||
$lang->execution->gantt->textColor[0] = '#2D2D2D';
|
||||
$lang->execution->gantt->textColor[1] = '#8D0308';
|
||||
$lang->execution->gantt->textColor[2] = '#9D4200';
|
||||
$lang->execution->gantt->textColor[3] = '#006D8E';
|
||||
$lang->execution->gantt->textColor[4] = '#1A8100';
|
||||
$lang->execution->gantt->textColor[5] = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->stage = new stdclass();
|
||||
$lang->execution->gantt->stage->progressColor = '#70B8FE';
|
||||
$lang->execution->gantt->stage->color = '#D2E7FC';
|
||||
$lang->execution->gantt->stage->textColor = '#0050A7';
|
||||
|
||||
$lang->execution->gantt->defaultColor = '#EBDCF9';
|
||||
$lang->execution->gantt->defaultProgressColor = '#9BA8FF';
|
||||
$lang->execution->gantt->defaultTextColor = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->bar_height = '24';
|
||||
|
||||
$lang->execution->gantt->exportImg = 'Export as Image';
|
||||
$lang->execution->gantt->exportPDF = 'Export as PDF';
|
||||
|
||||
@@ -154,6 +154,7 @@ $lang->execution->putoff = 'Delay';
|
||||
$lang->execution->suspend = 'Suspend';
|
||||
$lang->execution->close = 'Close';
|
||||
$lang->execution->export = 'Export';
|
||||
$lang->execution->next = "Next";
|
||||
|
||||
$lang->execution->endList[7] = '1 Week';
|
||||
$lang->execution->endList[14] = '2 Weeks';
|
||||
@@ -173,6 +174,7 @@ $lang->execution->cfdTypeList['bug'] = "View By bug";
|
||||
|
||||
$lang->team->account = 'User';
|
||||
$lang->team->role = 'Role';
|
||||
$lang->team->roleAB = 'My Role';
|
||||
$lang->team->join = 'Joined';
|
||||
$lang->team->hours = 'Hours/day';
|
||||
$lang->team->days = 'Day';
|
||||
@@ -514,6 +516,9 @@ $lang->execution->featureBar['all']['doing'] = $lang->execution->statusList[
|
||||
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
|
||||
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
|
||||
|
||||
$lang->execution->featureBar['bug']['all'] = 'All';
|
||||
$lang->execution->featureBar['bug']['unresolved'] = 'Active';
|
||||
|
||||
$lang->execution->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->execution->myExecutions = 'Mine';
|
||||
@@ -543,11 +548,37 @@ $lang->execution->statusColorList['suspended'] = '#fdc137';
|
||||
$lang->execution->statusColorList['closed'] = '#838A9D';
|
||||
|
||||
if(!isset($lang->execution->gantt)) $lang->execution->gantt = new stdclass();
|
||||
$lang->execution->gantt->color[0] = 'bbb';
|
||||
$lang->execution->gantt->color[1] = 'ff5d5d';
|
||||
$lang->execution->gantt->color[2] = 'ff9800';
|
||||
$lang->execution->gantt->color[3] = '16a8f8';
|
||||
$lang->execution->gantt->color[4] = '00da88';
|
||||
$lang->execution->gantt->progressColor[0] = '#B7B7B7';
|
||||
$lang->execution->gantt->progressColor[1] = '#FF8287';
|
||||
$lang->execution->gantt->progressColor[2] = '#FFC73A';
|
||||
$lang->execution->gantt->progressColor[3] = '#6BD5F5';
|
||||
$lang->execution->gantt->progressColor[4] = '#9DE88A';
|
||||
$lang->execution->gantt->progressColor[5] = '#9BA8FF';
|
||||
|
||||
$lang->execution->gantt->color[0] = '#E7E7E7';
|
||||
$lang->execution->gantt->color[1] = '#FFDADB';
|
||||
$lang->execution->gantt->color[2] = '#FCECC1';
|
||||
$lang->execution->gantt->color[3] = '#D3F3FD';
|
||||
$lang->execution->gantt->color[4] = '#DFF5D9';
|
||||
$lang->execution->gantt->color[5] = '#EBDCF9';
|
||||
|
||||
$lang->execution->gantt->textColor[0] = '#2D2D2D';
|
||||
$lang->execution->gantt->textColor[1] = '#8D0308';
|
||||
$lang->execution->gantt->textColor[2] = '#9D4200';
|
||||
$lang->execution->gantt->textColor[3] = '#006D8E';
|
||||
$lang->execution->gantt->textColor[4] = '#1A8100';
|
||||
$lang->execution->gantt->textColor[5] = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->stage = new stdclass();
|
||||
$lang->execution->gantt->stage->progressColor = '#70B8FE';
|
||||
$lang->execution->gantt->stage->color = '#D2E7FC';
|
||||
$lang->execution->gantt->stage->textColor = '#0050A7';
|
||||
|
||||
$lang->execution->gantt->defaultColor = '#EBDCF9';
|
||||
$lang->execution->gantt->defaultProgressColor = '#9BA8FF';
|
||||
$lang->execution->gantt->defaultTextColor = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->bar_height = '24';
|
||||
|
||||
$lang->execution->gantt->exportImg = 'Export as Image';
|
||||
$lang->execution->gantt->exportPDF = 'Export as PDF';
|
||||
|
||||
@@ -154,6 +154,7 @@ $lang->execution->putoff = 'Ajourner';
|
||||
$lang->execution->suspend = 'Suspendre';
|
||||
$lang->execution->close = 'Fermer';
|
||||
$lang->execution->export = 'Exporter';
|
||||
$lang->execution->next = "Suivant";
|
||||
|
||||
$lang->execution->endList[7] = '1 Semaine';
|
||||
$lang->execution->endList[14] = '2 Semaines';
|
||||
@@ -173,6 +174,7 @@ $lang->execution->cfdTypeList['bug'] = "View By bug";
|
||||
|
||||
$lang->team->account = 'Utilisateur';
|
||||
$lang->team->role = 'Rôle';
|
||||
$lang->team->roleAB = 'Mon Rôle';
|
||||
$lang->team->join = 'Ajouté';
|
||||
$lang->team->hours = 'Heure/jour';
|
||||
$lang->team->days = 'Jour';
|
||||
@@ -514,6 +516,9 @@ $lang->execution->featureBar['all']['doing'] = $lang->execution->statusList[
|
||||
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
|
||||
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
|
||||
|
||||
$lang->execution->featureBar['bug']['all'] = 'All';
|
||||
$lang->execution->featureBar['bug']['unresolved'] = 'Active';
|
||||
|
||||
$lang->execution->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->execution->myExecutions = "J'étais impliqué";
|
||||
@@ -543,11 +548,37 @@ $lang->execution->statusColorList['suspended'] = '#fdc137';
|
||||
$lang->execution->statusColorList['closed'] = '#838A9D';
|
||||
|
||||
if(!isset($lang->execution->gantt)) $lang->execution->gantt = new stdclass();
|
||||
$lang->execution->gantt->color[0] = 'bbb';
|
||||
$lang->execution->gantt->color[1] = 'ff5d5d';
|
||||
$lang->execution->gantt->color[2] = 'ff9800';
|
||||
$lang->execution->gantt->color[3] = '16a8f8';
|
||||
$lang->execution->gantt->color[4] = '00da88';
|
||||
$lang->execution->gantt->progressColor[0] = '#B7B7B7';
|
||||
$lang->execution->gantt->progressColor[1] = '#FF8287';
|
||||
$lang->execution->gantt->progressColor[2] = '#FFC73A';
|
||||
$lang->execution->gantt->progressColor[3] = '#6BD5F5';
|
||||
$lang->execution->gantt->progressColor[4] = '#9DE88A';
|
||||
$lang->execution->gantt->progressColor[5] = '#9BA8FF';
|
||||
|
||||
$lang->execution->gantt->color[0] = '#E7E7E7';
|
||||
$lang->execution->gantt->color[1] = '#FFDADB';
|
||||
$lang->execution->gantt->color[2] = '#FCECC1';
|
||||
$lang->execution->gantt->color[3] = '#D3F3FD';
|
||||
$lang->execution->gantt->color[4] = '#DFF5D9';
|
||||
$lang->execution->gantt->color[5] = '#EBDCF9';
|
||||
|
||||
$lang->execution->gantt->textColor[0] = '#2D2D2D';
|
||||
$lang->execution->gantt->textColor[1] = '#8D0308';
|
||||
$lang->execution->gantt->textColor[2] = '#9D4200';
|
||||
$lang->execution->gantt->textColor[3] = '#006D8E';
|
||||
$lang->execution->gantt->textColor[4] = '#1A8100';
|
||||
$lang->execution->gantt->textColor[5] = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->stage = new stdclass();
|
||||
$lang->execution->gantt->stage->progressColor = '#70B8FE';
|
||||
$lang->execution->gantt->stage->color = '#D2E7FC';
|
||||
$lang->execution->gantt->stage->textColor = '#0050A7';
|
||||
|
||||
$lang->execution->gantt->defaultColor = '#EBDCF9';
|
||||
$lang->execution->gantt->defaultProgressColor = '#9BA8FF';
|
||||
$lang->execution->gantt->defaultTextColor = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->bar_height = '24';
|
||||
|
||||
$lang->execution->gantt->exportImg = 'Export as Image';
|
||||
$lang->execution->gantt->exportPDF = 'Export as PDF';
|
||||
|
||||
@@ -127,6 +127,7 @@ $lang->execution->lifeTimeList['ops'] = "DevOps";
|
||||
$lang->team = new stdclass();
|
||||
$lang->team->account = 'Người dùng';
|
||||
$lang->team->role = 'Vai trò';
|
||||
$lang->team->roleAB = 'Vai trò của tôi';
|
||||
$lang->team->join = 'Đã tham gia';
|
||||
$lang->team->hours = 'Giờ/ngày';
|
||||
$lang->team->days = 'Ngày';
|
||||
@@ -418,6 +419,9 @@ $lang->execution->featureBar['all']['doing'] = $lang->execution->statusList[
|
||||
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
|
||||
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
|
||||
|
||||
$lang->execution->featureBar['bug']['all'] = 'All';
|
||||
$lang->execution->featureBar['bug']['unresolved'] = 'Active';
|
||||
|
||||
$lang->execution->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->execution->myExecutions = 'Tôi tham gia';
|
||||
|
||||
@@ -154,6 +154,7 @@ $lang->execution->putoff = "延期";
|
||||
$lang->execution->suspend = "挂起";
|
||||
$lang->execution->close = "关闭";
|
||||
$lang->execution->export = "导出";
|
||||
$lang->execution->next = "下一步";
|
||||
|
||||
$lang->execution->endList[7] = '一星期';
|
||||
$lang->execution->endList[14] = '两星期';
|
||||
@@ -173,6 +174,7 @@ $lang->execution->cfdTypeList['bug'] = "按Bug查看";
|
||||
|
||||
$lang->team->account = '用户';
|
||||
$lang->team->role = '角色';
|
||||
$lang->team->roleAB = '我的角色';
|
||||
$lang->team->join = '加盟日';
|
||||
$lang->team->hours = '可用工时/天';
|
||||
$lang->team->days = '可用工日';
|
||||
@@ -514,6 +516,9 @@ $lang->execution->featureBar['all']['doing'] = $lang->execution->statusList[
|
||||
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
|
||||
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
|
||||
|
||||
$lang->execution->featureBar['bug']['all'] = '所有';
|
||||
$lang->execution->featureBar['bug']['unresolved'] = '未解决';
|
||||
|
||||
$lang->execution->featureBar['build']['all'] = '所有版本';
|
||||
|
||||
$lang->execution->myExecutions = '我参与的';
|
||||
@@ -543,11 +548,37 @@ $lang->execution->statusColorList['suspended'] = '#fdc137';
|
||||
$lang->execution->statusColorList['closed'] = '#838A9D';
|
||||
|
||||
if(!isset($lang->execution->gantt)) $lang->execution->gantt = new stdclass();
|
||||
$lang->execution->gantt->color[0] = 'bbb';
|
||||
$lang->execution->gantt->color[1] = 'ff5d5d';
|
||||
$lang->execution->gantt->color[2] = 'ff9800';
|
||||
$lang->execution->gantt->color[3] = '16a8f8';
|
||||
$lang->execution->gantt->color[4] = '00da88';
|
||||
$lang->execution->gantt->progressColor[0] = '#B7B7B7';
|
||||
$lang->execution->gantt->progressColor[1] = '#FF8287';
|
||||
$lang->execution->gantt->progressColor[2] = '#FFC73A';
|
||||
$lang->execution->gantt->progressColor[3] = '#6BD5F5';
|
||||
$lang->execution->gantt->progressColor[4] = '#9DE88A';
|
||||
$lang->execution->gantt->progressColor[5] = '#9BA8FF';
|
||||
|
||||
$lang->execution->gantt->color[0] = '#E7E7E7';
|
||||
$lang->execution->gantt->color[1] = '#FFDADB';
|
||||
$lang->execution->gantt->color[2] = '#FCECC1';
|
||||
$lang->execution->gantt->color[3] = '#D3F3FD';
|
||||
$lang->execution->gantt->color[4] = '#DFF5D9';
|
||||
$lang->execution->gantt->color[5] = '#EBDCF9';
|
||||
|
||||
$lang->execution->gantt->textColor[0] = '#2D2D2D';
|
||||
$lang->execution->gantt->textColor[1] = '#8D0308';
|
||||
$lang->execution->gantt->textColor[2] = '#9D4200';
|
||||
$lang->execution->gantt->textColor[3] = '#006D8E';
|
||||
$lang->execution->gantt->textColor[4] = '#1A8100';
|
||||
$lang->execution->gantt->textColor[5] = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->stage = new stdclass();
|
||||
$lang->execution->gantt->stage->progressColor = '#70B8FE';
|
||||
$lang->execution->gantt->stage->color = '#D2E7FC';
|
||||
$lang->execution->gantt->stage->textColor = '#0050A7';
|
||||
|
||||
$lang->execution->gantt->defaultColor = '#EBDCF9';
|
||||
$lang->execution->gantt->defaultProgressColor = '#9BA8FF';
|
||||
$lang->execution->gantt->defaultTextColor = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->bar_height = '24';
|
||||
|
||||
$lang->execution->gantt->exportImg = '导出图片';
|
||||
$lang->execution->gantt->exportPDF = '导出 PDF';
|
||||
|
||||
+38
-29
@@ -100,7 +100,7 @@ class executionModel extends model
|
||||
include $this->app->getModulePath('', 'execution') . 'lang/' . $this->app->getClientLang() . '.php';
|
||||
}
|
||||
|
||||
if(isset($execution->cal) and $execution->acl != 'private') unset($this->lang->execution->menu->settings['subMenu']->whitelist);
|
||||
if(isset($execution->acl) and $execution->acl != 'private') unset($this->lang->execution->menu->settings['subMenu']->whitelist);
|
||||
|
||||
if($execution and $execution->lifetime == 'ops')
|
||||
{
|
||||
@@ -396,7 +396,7 @@ class executionModel extends model
|
||||
$this->dao->insert(TABLE_EXECUTION)->data($sprint)
|
||||
->autoCheck($skipFields = 'begin,end')
|
||||
->batchcheck($this->config->execution->create->requiredFields, 'notempty')
|
||||
->checkIF((!empty($sprint->name) and $this->config->systemMode == 'new'), 'name', 'unique', "`type` in ('sprint','stage', 'kanban') and `project` = $sprintProject and `deleted` = '0'")
|
||||
->checkIF(!empty($sprint->name), 'name', 'unique', "`type` in ('sprint','stage', 'kanban') and `project` = $sprintProject and `deleted` = '0'")
|
||||
->checkIF(!empty($sprint->code), 'code', 'unique', "`type` in ('sprint','stage', 'kanban') and `deleted` = '0'")
|
||||
->checkIF($sprint->begin != '', 'begin', 'date')
|
||||
->checkIF($sprint->end != '', 'end', 'date')
|
||||
@@ -420,6 +420,8 @@ class executionModel extends model
|
||||
/* Update the path. */
|
||||
if($this->config->systemMode == 'new') $this->setTreePath($executionID);
|
||||
|
||||
$this->updateProducts($executionID);
|
||||
|
||||
/* Set team of execution. */
|
||||
$members = isset($_POST['teamMembers']) ? $_POST['teamMembers'] : array();
|
||||
array_push($members, $sprint->PO, $sprint->QD, $sprint->PM, $sprint->RD, $sprint->openedBy);
|
||||
@@ -499,8 +501,8 @@ class executionModel extends model
|
||||
->setIF(helper::isZeroDate($this->post->begin), 'begin', '')
|
||||
->setIF(helper::isZeroDate($this->post->end), 'end', '')
|
||||
->setIF(!isset($_POST['whitelist']), 'whitelist', '')
|
||||
->setIF($this->post->status == 'closed', 'closedDate', helper::now())
|
||||
->setIF($this->post->status == 'suspended', 'suspendedDate', helper::today())
|
||||
->setIF($this->post->status == 'closed' and $oldExecution->status != 'closed', 'closedDate', helper::now())
|
||||
->setIF($this->post->status == 'suspended' and $oldExecution->status != 'suspended', 'suspendedDate', helper::today())
|
||||
->setIF($oldExecution->type == 'stage', 'project', $oldExecution->project)
|
||||
->setDefault('team', $this->post->name)
|
||||
->join('whitelist', ',')
|
||||
@@ -549,7 +551,7 @@ class executionModel extends model
|
||||
->checkIF($execution->begin != '', 'begin', 'date')
|
||||
->checkIF($execution->end != '', 'end', 'date')
|
||||
->checkIF($execution->end != '', 'end', 'ge', $execution->begin)
|
||||
->checkIF((!empty($execution->name) and $this->config->systemMode == 'new'), 'name', 'unique', "id != $executionID and type in ('sprint','stage', 'kanban') and `project` = $executionProject and `deleted` = '0'")
|
||||
->checkIF(!empty($execution->name), 'name', 'unique', "id != $executionID and type in ('sprint','stage', 'kanban') and `project` = $executionProject and `deleted` = '0'")
|
||||
->checkIF(!empty($execution->code), 'code', 'unique', "id != $executionID and type in ('sprint','stage', 'kanban') and `deleted` = '0'")
|
||||
->checkFlow()
|
||||
->where('id')->eq($executionID)
|
||||
@@ -698,8 +700,8 @@ class executionModel extends model
|
||||
if(isset($data->codes)) $executions[$executionID]->code = $executionCode;
|
||||
if(isset($data->projects)) $executions[$executionID]->project = zget($data->projects, $executionID, 0);
|
||||
if(isset($data->attributes)) $executions[$executionID]->attribute = zget($data->attributes, $executionID, '');
|
||||
if($executions[$executionID]->status == 'closed') $executions[$executionID]->closedDate = helper::now();
|
||||
if($executions[$executionID]->status == 'suspended') $executions[$executionID]->suspendedDate = helper::today();
|
||||
if($executions[$executionID]->status == 'closed' and $oldExecutions[$executionID]->status != 'closed') $executions[$executionID]->closedDate = helper::now();
|
||||
if($executions[$executionID]->status == 'suspended' and $oldExecutions[$executionID]->status != 'suspended') $executions[$executionID]->suspendedDate = helper::today();
|
||||
|
||||
/* Check unique code for edited executions. */
|
||||
if($projectModel == 'scrum' and isset($executionCode) and empty($executionCode))
|
||||
@@ -3179,24 +3181,8 @@ class executionModel extends model
|
||||
*/
|
||||
public function getBeginEnd4CFD($execution)
|
||||
{
|
||||
$begin = $execution->begin;
|
||||
$end = $execution->end;
|
||||
if(helper::today() < $execution->begin)
|
||||
{
|
||||
$begin = helper::today();
|
||||
$end = helper::today();
|
||||
}
|
||||
elseif((helper::today() >= $execution->begin) and (helper::today() <= $execution->end))
|
||||
{
|
||||
$begin = (date('Y-m-d', strtotime('-13 days')) < $execution->begin) ? $execution->begin : date('Y-m-d', strtotime('-13 days'));
|
||||
$end = helper::today();
|
||||
}
|
||||
elseif((helper::today() > $execution->end))
|
||||
{
|
||||
$begin = date('Y-m-d', strtotime('-13 days', strtotime($execution->end))) > $execution->begin ? date('Y-m-d', strtotime('-13 days', strtotime($execution->end))) : $execution->begin;
|
||||
$end = $execution->end;
|
||||
}
|
||||
|
||||
$end = (!helper::isZeroDate($execution->closedDate) and date('Y-m-d', strtotime($execution->closedDate)) < helper::today()) ? date('Y-m-d', strtotime($execution->closedDate)) : helper::today();
|
||||
$begin = (!helper::isZeroDate($execution->openedDate) and date('Y-m-d', strtotime($execution->openedDate)) > date('Y-m-d', strtotime('-13 days', strtotime($end)))) ? date('Y-m-d', strtotime($execution->openedDate)) : date('Y-m-d', strtotime('-13 days', strtotime($end)));
|
||||
return array($begin, $end);
|
||||
}
|
||||
|
||||
@@ -4361,6 +4347,8 @@ class executionModel extends model
|
||||
$this->loadModel('execution');
|
||||
$this->loadModel('programplan');
|
||||
|
||||
$today = helper::today();
|
||||
|
||||
if(!$isChild)
|
||||
{
|
||||
$trClass = 'is-top-level table-nest-child-hide';
|
||||
@@ -4381,12 +4369,33 @@ 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);
|
||||
if(!helper::isZeroDate($execution->end))
|
||||
{
|
||||
if($execution->status != 'closed')
|
||||
{
|
||||
echo strtotime($today) > strtotime($execution->end) ? '<span class="label label-danger label-badge">' . $this->lang->execution->delayed . '</span>' : '';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
echo $execution->name;
|
||||
if(!helper::isZeroDate($execution->end))
|
||||
{
|
||||
if($execution->status != 'closed')
|
||||
{
|
||||
echo strtotime($today) > strtotime($execution->end) ? '<span class="label label-danger label-badge">' . $this->lang->execution->delayed . '</span>' : '';
|
||||
}
|
||||
}
|
||||
}
|
||||
echo '<td>' . zget($users, $execution->PM) . '</td>';
|
||||
echo "<td class='status-{$execution->status}'>" . zget($this->lang->project->statusList, $execution->status) . '</td>';
|
||||
echo "<td class='status-{$execution->status} text-center'>" . zget($this->lang->project->statusList, $execution->status) . '</td>';
|
||||
echo '<td>' . html::ring($execution->hours->progress) . '</td>';
|
||||
echo '<td>' . $execution->begin . '</td>';
|
||||
echo '<td>' . $execution->end . '</td>';
|
||||
echo helper::isZeroDate($execution->begin) ? '<td class="c-date"></td>' : '<td class="c-date">' . $execution->begin . '</td>';
|
||||
echo helper::isZeroDate($execution->end) ? '<td class="c-date"></td>' : '<td class="c-date">' . $execution->end . '</td>';
|
||||
echo "<td class='hours' title='{$execution->hours->totalEstimate}{$this->lang->execution->workHour}'>" . $execution->hours->totalEstimate . $this->lang->execution->workHourUnit . '</td>';
|
||||
echo "<td class='hours' title='{$execution->hours->totalConsumed}{$this->lang->execution->workHour}'>" . $execution->hours->totalConsumed . $this->lang->execution->workHourUnit . '</td>';
|
||||
echo "<td class='hours' title='{$execution->hours->totalLeft}{$this->lang->execution->workHour}'>" . $execution->hours->totalLeft . $this->lang->execution->workHourUnit . '</td>';
|
||||
|
||||
@@ -16,14 +16,11 @@
|
||||
$datatableId = $this->moduleName . ucfirst($this->methodName);
|
||||
$useDatatable = (isset($config->datatable->$datatableId->mode) and $config->datatable->$datatableId->mode == 'datatable');
|
||||
?>
|
||||
<?php js::set('unfoldExecutions', array());?>
|
||||
<?php js::set('useDatatable', $useDatatable);?>
|
||||
<?php js::set('from', $from);?>
|
||||
<?php js::set('projectID', $projectID);?>
|
||||
<?php
|
||||
/* Set unfold parent executionID. */
|
||||
$unfoldExecutions = isset($config->execution->all->unfoldExecutions) ? json_decode($config->execution->all->unfoldExecutions, true) : array();
|
||||
$unfoldExecutions = zget($unfoldExecutions, $projectID, array());
|
||||
js::set('unfoldExecutions', $unfoldExecutions);
|
||||
js::set('unfoldAll', $lang->execution->treeLevel['all']);
|
||||
js::set('foldAll', $lang->execution->treeLevel['root']);
|
||||
js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
@@ -38,11 +35,11 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
<?php
|
||||
$class = '';
|
||||
if($productID == 0) $class = 'class="active"';
|
||||
echo "<li $class>" . html::a($this->createLink('project', 'execution', "status=$status&projectID=$projectID&orderby=$orderBy"), $lang->product->allProduct) . "</li>";
|
||||
echo "<li $class>" . html::a($this->createLink('project', 'execution', "status=$status&orderby=$orderBy"), $lang->product->allProduct) . "</li>";
|
||||
foreach($productList as $key => $product)
|
||||
{
|
||||
$class = $productID == $key ? 'class="active"' : '';
|
||||
echo "<li $class>" . html::a($this->createLink('project', 'execution', "status=$status&projectID=$projectID&orderby=$orderBy&productID=$key"), $product) . "</li>";
|
||||
echo "<li $class>" . html::a($this->createLink('project', 'execution', "status=$status&orderby=$orderBy&productID=$key"), $product) . "</li>";
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
@@ -52,22 +49,13 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
<?php foreach($lang->execution->featureBar['all'] as $key => $label):?>
|
||||
<?php $label = "<span class='text'>$label</span>";?>
|
||||
<?php if($status == $key) $label .= " <span class='label label-light label-badge'>{$pager->recTotal}</span>";?>
|
||||
<?php echo html::a($this->createLink($this->app->rawModule, $this->app->rawMethod, "status=$key&projectID=$projectID&orderBy=$orderBy&productID=$productID"), $label, '', "class='btn btn-link' id='{$key}Tab' data-app='$from'");?>
|
||||
<?php echo html::a($this->createLink($this->app->rawModule, $this->app->rawMethod, "status=$key&orderBy=$orderBy&productID=$productID"), $label, '', "class='btn btn-link' id='{$key}Tab' data-app='$from'");?>
|
||||
<?php endforeach;?>
|
||||
<?php if($from == 'execution' and $this->config->systemMode == 'new'):?>
|
||||
<div class='input-control w-180px'>
|
||||
<?php echo html::select('project', $projects, $projectID, "class='form-control chosen' data-placeholder='{$lang->execution->selectProject}'");?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<a class="btn btn-link querybox-toggle" id='bysearchTab'><i class="icon icon-search muted"></i> <?php echo $lang->execution->byQuery;?></a>
|
||||
</div>
|
||||
<div class='btn-toolbar pull-right'>
|
||||
<?php common::printLink('execution', 'export', "status=$status&productID=$productID&orderBy=$orderBy&from=$from", "<i class='icon-export muted'> </i> " . $lang->export, '', "class='btn btn-link export'")?>
|
||||
<?php if(common::hasPriv('programplan', 'create') and $isStage):?>
|
||||
<?php echo html::a($this->createLink('programplan', 'create', "projectID=$projectID&productID=$productID"), "<i class='icon icon-plus'></i> " . $lang->programplan->create, '', "class='btn btn-primary'");?>
|
||||
<?php else: ?>
|
||||
<?php if(common::hasPriv('execution', 'create')) echo html::a($this->createLink('execution', 'create', "projectID=$projectID"), "<i class='icon icon-sm icon-plus'></i> " . ((($from == 'execution') and ($config->systemMode == 'new')) ? $lang->execution->createExec : $lang->execution->create), '', "class='btn btn-primary create-execution-btn' data-app='execution' onclick='$(this).removeAttr(\"data-toggle\")'");?>
|
||||
<?php endif;?>
|
||||
<?php if(common::hasPriv('execution', 'create')) echo html::a($this->createLink('execution', 'create'), "<i class='icon icon-sm icon-plus'></i> " . ((($from == 'execution') and ($config->systemMode == 'new')) ? $lang->execution->createExec : $lang->execution->create), '', "class='btn btn-primary create-execution-btn' data-app='execution' onclick='$(this).removeAttr(\"data-toggle\")'");?>
|
||||
</div>
|
||||
</div>
|
||||
<div id='mainContent' class="main-row fade">
|
||||
@@ -77,12 +65,8 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $from == 'execution' ? $lang->execution->noExecutions : $lang->execution->noExecution;?></span>
|
||||
<?php if(empty($allExecutionsNum)):?>
|
||||
<?php if(common::hasPriv('programplan', 'create') and $isStage):?>
|
||||
<?php echo html::a($this->createLink('programplan', 'create', "projectID=$projectID&productID=$productID"), "<i class='icon icon-plus'></i> " . $lang->programplan->create, '', "class='btn btn-info'");?>
|
||||
<?php else: ?>
|
||||
<?php if(common::hasPriv('execution', 'create')):?>
|
||||
<?php echo html::a($this->createLink('execution', 'create', "projectID=$projectID"), "<i class='icon icon-plus'></i> " . (($from == 'execution' and $config->systemMode == 'new') ? $lang->execution->createExec : $lang->execution->create), '', "class='btn btn-info' data-app='execution'");?>
|
||||
<?php endif;?>
|
||||
<?php if(common::hasPriv('execution', 'create')):?>
|
||||
<?php echo html::a($this->createLink('execution', 'create'), "<i class='icon icon-plus'></i> " . (($from == 'execution' and $config->systemMode == 'new') ? $lang->execution->createExec : $lang->execution->create), '', "class='btn btn-info' data-app='execution'");?>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
</p>
|
||||
@@ -94,7 +78,7 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
<nav class="btn-toolbar pull-right setting"></nav>
|
||||
</div>
|
||||
<?php
|
||||
$vars = "status=$status&projectID=$projectID&orderBy=%s&productID=$productID¶m=$param&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";
|
||||
$vars = "status=$status&orderBy=%s&productID=$productID¶m=$param&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";
|
||||
if($useDatatable) include '../../common/view/datatable.html.php';
|
||||
else include '../../common/view/tablesorter.html.php';
|
||||
|
||||
@@ -167,12 +151,6 @@ $(document).on('click', '.plan-toggle', function(e)
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
$('#project').change(function()
|
||||
{
|
||||
var projectID = $('#project').val();
|
||||
location.href = createLink('execution', 'all', 'status=' + status + '&projectID=' + projectID);
|
||||
});
|
||||
</script>
|
||||
<?php js::set('orderBy', $orderBy)?>
|
||||
<?php js::set('status', $status)?>
|
||||
|
||||
@@ -31,12 +31,17 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
$buildName = $build ? " <span class='label label-danger'>Build:{$build->name}</span>" : '';
|
||||
$module = $type != 'bysearch' ? "¶m=$param" : '';
|
||||
echo html::a($this->inlink('bug', "executionID={$execution->id}&productID={$productID}&branch={$branchID}&orderBy=status,id_desc&build=$buildID&type=all$module"), "<span class='text'>{$lang->bug->allBugs}</span>" . ($type == 'all' ? " <span class='label label-light label-badge'>{$pager->recTotal}</span>$buildName" : ''), '', "id='allTab' class='btn btn-link" . ('all' == $type ? ' btn-active-text' : '') . "'");
|
||||
echo html::a($this->inlink('bug', "executionID={$execution->id}&productID={$productID}&branch={$branchID}&orderBy=status,id_desc&build=$buildID&type=unresolved$module"), "<span class='text'>{$lang->bug->unResolved}</span>" . ($type == 'unresolved' ? " <span class='label label-light label-badge'>{$pager->recTotal}</span>$buildName" : ''), '', "id='unresolvedTab' class='btn btn-link" . ('unresolved' == $type ? ' btn-active-text' : '') . "'");
|
||||
?>
|
||||
<?php common::sortFeatureMenu();?>
|
||||
<?php foreach($lang->execution->featureBar['bug'] as $featureType => $label):?>
|
||||
<?php $active = $type == $featureType ? 'btn-active-text' : '';?>
|
||||
<?php $label = "<span class='text'>$label</span>";?>
|
||||
<?php if($type == $featureType):?>
|
||||
<?php $label .= " <span class='label label-light label-badge'>{$pager->recTotal}</span>";?>
|
||||
<?php $label .= $build ? " <span class='label label-danger'>Build:{$build->name}</span>" : '';?>
|
||||
<?php endif;?>
|
||||
<?php $module = $type != 'bysearch' ? "¶m=$param" : '';?>
|
||||
<?php echo html::a(inlink('bug', "executionID=$execution->id&productID={$productID}&branch={$branchID}&orderBy=status,id_desc&build=$buildID&type={$featureType}$module"), $label, '', "class='btn btn-link $active' id='{$featureType}Tab'");?>
|
||||
<?php endforeach;?>
|
||||
<a class="btn btn-link querybox-toggle" id="bysearchTab"><i class="icon icon-search muted"></i> <?php echo $lang->bug->search;?></a>
|
||||
</div>
|
||||
<div class="btn-toolbar pull-right">
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
<?php js::set('YUnit', $lang->execution->count); ?>
|
||||
<?php js::set('XUnit', $lang->execution->burnXUnit); ?>
|
||||
<?php js::set('dateRangeTip', $lang->execution->charts->cfd->dateRangeTip); ?>
|
||||
<?php js::set('today', date(DT_DATE1)); ?>
|
||||
<?php js::set('executionBegin', $execution->begin); ?>
|
||||
<?php js::set('minDate', $minDate); ?>
|
||||
<?php js::set('maxDate', $maxDate); ?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php
|
||||
@@ -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>
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
<th><?php echo $lang->execution->days;?></th>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<?php echo html::input('days', (isset($plan) && !empty($plan->begin) ? helper::workDays($plan->begin, $plan->end) : ''), "class='form-control'");?>
|
||||
<?php echo html::input('days', (isset($plan) && !empty($plan->begin) ? (helper::workDays($plan->begin, $plan->end) + 1) : ''), "class='form-control'");?>
|
||||
<span class='input-group-addon'><?php echo $lang->execution->day;?></span>
|
||||
</div>
|
||||
</td><td></td><td></td>
|
||||
@@ -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>
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
<small><?php echo $lang->arrow . ' ' . $lang->execution->edit;?></small>
|
||||
</h2>
|
||||
</div>
|
||||
<?php if($config->systemMode == 'new') 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)):?>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user