Merge branch 'master' into zenops_46
This commit is contained in:
@@ -408,8 +408,12 @@ class userEntry extends entry
|
||||
$this->setPost('gender', $gender);
|
||||
|
||||
$password = $this->request('password', zget($_POST, 'password', ''));
|
||||
$this->setPost('password1', md5($password));
|
||||
$this->setPost('password2', md5($password));
|
||||
if($password)
|
||||
{
|
||||
$this->setPost('password1', md5($password));
|
||||
$this->setPost('password2', md5($password));
|
||||
$this->setPost('passwordStrength', 2);
|
||||
}
|
||||
$this->setPost('verifyPassword', md5($this->app->user->password . $this->app->session->rand));
|
||||
|
||||
$control = $this->loadController('user', 'edit');
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
|
||||
if(!function_exists('getWebRoot')){function getWebRoot(){}}
|
||||
|
||||
/* 基本设置。Basic settings. */
|
||||
$config->version = '17.8'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
|
||||
$config->version = '18.0.beta1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
|
||||
$config->liteVersion = '1.2'; // 迅捷版版本。 The version of Lite.
|
||||
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
|
||||
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -1,6 +1,6 @@
|
||||
ALTER TABLE `zt_product` ADD `shadow` tinyint(1) unsigned NOT NULL AFTER `code`;
|
||||
ALTER TABLE `zt_project` ADD `hasProduct` tinyint(1) unsigned NOT NULL DEFAULT 1 AFTER `code`;
|
||||
ALTER table `zt_project` ADD `multiple` enum('0', '1') NOT NULL DEFAULT '1';
|
||||
ALTER table `zt_project` ADD `multiple` enum('0', '1') NOT NULL DEFAULT '1' AFTER `fluidBoard`;
|
||||
ALTER TABLE `zt_repo` ADD `projects` varchar(255) NOT NULL AFTER `product`;
|
||||
ALTER TABLE `zt_release` CHANGE `project` `project` varchar(255) NOT NULL;
|
||||
ALTER TABLE `zt_release` CHANGE `branch` `branch` varchar(255) NOT NULL;
|
||||
@@ -36,6 +36,6 @@ REPLACE INTO `zt_report` (`code`, `name`, `module`, `sql`, `vars`, `langs`, `par
|
||||
('project-progress', '{\"zh-cn\":\"\\u9879\\u76ee\\u8fdb\\u5c55\\u8868\",\"zh-tw\":\"\\u9805\\u76ee\\u9032\\u5c55\\u8868\",\"en\":\"Project Progress Report\",\"de\":\"Project Progress Report\",\"fr\":\"Project Progress Report\",\"vi\":\"Project Progress Report\",\"ja\":\"Project Progress Report\"}', ',project', 'select t1.id,t4.name as project,t4.id,IF(t4.multiple="1",t1.name,"") as execution,t1.status,t2.number as tasks,round(t2.consumed,2) as consumed,round(t2.`left`,2) as `left`,t3.stories,t2.undone as undoneTask,t3.undone as undoneStory,t2.totalReal from TABLE_EXECUTION as t1 \r\nleft join ztv_executionsummary as t2 on t1.id=t2.execution\r\nleft join ztv_projectstories as t3 on t1.id=t3.execution\r\nleft join TABLE_PROJECT as t4 on t4.id=t1.project\r\nwhere t1.deleted=\'0\' and t1.type in (\'sprint\',\'stage\') and if($project=\'\',1,t4.id=$project) and if($execution=\'\',1,t1.id=$execution) and if($status=\'\',1,t1.status=$status)', '{\"varName\":[\"project\",\"execution\",\"status\"],\"showName\":[\"\\u9879\\u76ee\\u5217\\u8868\",\"\\u6267\\u884c\\u5217\\u8868\",\"\\u6267\\u884c\\u72b6\\u6001\"],\"requestType\":[\"select\",\"select\",\"select\"],\"selectList\":[\"project\",\"execution\",\"project.status\"],\"default\":[\"\",\"\",\"\"]}', '{\"stories\":{\"zh-cn\":\"\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u9700\\u6c42\\u6570\",\"en\":\"Stories\"},\"tasks\":{\"zh-cn\":\"\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u4efb\\u52a1\\u6570\",\"en\":\"Tasks\"},\"undoneStory\":{\"zh-cn\":\"\\u5269\\u4f59\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u5269\\u4f59\\u9700\\u6c42\\u6570\",\"en\":\"Undone Story\"},\"undoneTask\":{\"zh-cn\":\"\\u5269\\u4f59\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u5269\\u4f59\\u4efb\\u52a1\\u6570\",\"en\":\"Undone Task\"},\"consumed\":{\"zh-cn\":\"\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\",\"zh-tw\":\"\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\",\"en\":\"Cost(h)\"},\"left\":{\"zh-cn\":\"\\u5269\\u4f59\\u5de5\\u65f6\",\"zh-tw\":\"\\u5269\\u4f59\\u5de5\\u65f6\",\"en\":\"Left(h)\"},\"consumedPercent\":{\"zh-cn\":\"\\u8fdb\\u5ea6\",\"zh-tw\":\"\\u8fdb\\u5ea6\",\"en\":\"Process\"},\"execution\":{\"zh-cn\":\"\\u6267\\u884c\\u540d\\u79f0\"}}', '{\"group1\":\"project\",\"group2\":\"execution\",\"reportField\":[\"stories\",\"undoneStory\",\"tasks\",\"undoneTask\",\"left\",\"consumed\"],\"reportType\":[\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\"],\"sumAppend\":[\"stories\",\"undoneStory\",\"tasks\",\"undoneTask\",\"left\",\"consumed\"],\"percent\":{\"5\":\"1\"},\"contrast\":{\"5\":\"totalReal\"},\"showAlone\":{\"5\":\"1\"}}', 2, '{\"zh-cn\":\"\\u9879\\u76ee\\u7684\\u9700\\u6c42\\u6570\\uff0c\\u4efb\\u52a1\\u6570\\uff0c\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\\uff0c\\u5269\\u4f59\\u5de5\\u65f6\\uff0c\\u5269\\u4f59\\u9700\\u6c42\\u6570\\uff0c\\u5269\\u4f59\\u4efb\\u52a1\\u6570\\uff0c\\u8fdb\\u5ea6\\u3002\",\"zh-tw\":\"\\u9805\\u76ee\\u7684\\u9700\\u6c42\\u6578\\uff0c\\u4efb\\u52d9\\u6578\\uff0c\\u5df2\\u6d88\\u8017\\u5de5\\u6642\\uff0c\\u5269\\u9918\\u5de5\\u6642\\uff0c\\u5269\\u9918\\u9700\\u6c42\\u6578\\uff0c\\u5269\\u9918\\u4efb\\u52d9\\u6578\\uff0c\\u9032\\u5ea6\\u3002\",\"en\":\"\",\"de\":\"\",\"fr\":\"\",\"vi\":\"\",\"ja\":\"\"}', 'admin', '2015-07-23 14:03:06'),
|
||||
('projectbug-type', '{\"zh-cn\":\"\\u9879\\u76eeBug\\u7c7b\\u578b\\u7edf\\u8ba1\\u8868\",\"zh-tw\":\"\\u9805\\u76eeBug\\u985e\\u578b\\u7d71\\u8a08\\u8868\",\"en\":\"Project Bug Type\",\"de\":\"Project Bug Type\",\"fr\":\"Project Bug Type\",\"vi\":\"Project Bug Type\",\"ja\":\"Project Bug Type\"}', ',project,test', 'select t1.id,t3.name as project,t3.id,IF(t3.multiple="1",t1.name,"") as execution,t2.id as bugID,t2.type from TABLE_EXECUTION as t1 \r\nleft join TABLE_BUG as t2 on t1.id=t2.execution\r\nleft join TABLE_PROJECT as t3 on t3.id=t1.project\r\nwhere t1.deleted=\'0\' and t2.deleted=\'0\' and if($project=\'\',1,t3.id=$project) and if($execution=\'\',1,t1.id=$execution)', '{\"varName\":[\"project\",\"execution\"],\"showName\":[\"\\u9879\\u76ee\\u5217\\u8868\",\"\\u6267\\u884c\\u5217\\u8868\"],\"requestType\":[\"select\",\"select\"],\"selectList\":[\"project\",\"execution\"],\"default\":[\"\",\"\"]}', '{\"stories\":{\"zh-cn\":\"\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u9700\\u6c42\\u6570\",\"en\":\"Stories\"},\"tasks\":{\"zh-cn\":\"\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u4efb\\u52a1\\u6570\",\"en\":\"Tasks\"},\"undoneStory\":{\"zh-cn\":\"\\u5269\\u4f59\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u5269\\u4f59\\u9700\\u6c42\\u6570\",\"en\":\"Undone Story\"},\"undoneTask\":{\"zh-cn\":\"\\u5269\\u4f59\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u5269\\u4f59\\u4efb\\u52a1\\u6570\",\"en\":\"Undone Task\"},\"consumed\":{\"zh-cn\":\"\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\",\"zh-tw\":\"\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\",\"en\":\"Cost(h)\"},\"left\":{\"zh-cn\":\"\\u5269\\u4f59\\u5de5\\u65f6\",\"zh-tw\":\"\\u5269\\u4f59\\u5de5\\u65f6\",\"en\":\"Left(h)\"},\"consumedPercent\":{\"zh-cn\":\"\\u8fdb\\u5ea6\",\"zh-tw\":\"\\u8fdb\\u5ea6\",\"en\":\"Process\"},\"execution\":{\"zh-cn\":\"\\u6267\\u884c\\u540d\\u79f0\"}}', '{\"group1\":\"project\",\"group2\":\"execution\",\"reportField\":[\"type\"],\"reportType\":[\"count\"],\"sumAppend\":[\"\"]}', 2, '{\"zh-cn\":\"\\u6309\\u7167\\u9879\\u76ee\\u7edf\\u8ba1Bug\\u7684\\u7c7b\\u578b\\u5206\\u5e03\\u60c5\\u51b5\\u3002\",\"zh-tw\":\"\\u6309\\u7167\\u9805\\u76ee\\u7d71\\u8a08Bug\\u7684\\u985e\\u578b\\u5206\\u5e03\\u60c5\\u6cc1\\u3002\",\"en\":\"\",\"de\":\"\",\"fr\":\"\",\"vi\":\"\",\"ja\":\"\"}', 'admin', '2015-08-04 13:54:22');
|
||||
|
||||
ALTER TABLE `zt_project` ADD `division` enum('0','1') COLLATE 'utf8_general_ci' NOT NULL DEFAULT '1';
|
||||
ALTER TABLE `zt_project` ADD `division` enum('0','1') COLLATE 'utf8_general_ci' NOT NULL DEFAULT '1' AFTER `vision`;
|
||||
|
||||
ALTER TABLE `zt_build` ADD `builds` varchar(255) NOT NULL AFTER `execution`;
|
||||
|
||||
+5
-2
@@ -1151,7 +1151,6 @@ CREATE TABLE IF NOT EXISTS `zt_project` (
|
||||
`project` mediumint(8) NOT NULL DEFAULT 0,
|
||||
`model` char(30) NOT NULL,
|
||||
`type` char(30) NOT NULL DEFAULT 'sprint',
|
||||
`hasProduct` tinyint(1) unsigned NOT NULL DEFAULT 1,
|
||||
`lifetime` char(30) NOT NULL DEFAULT '',
|
||||
`budget` varchar(30) NOT NULL DEFAULT '0',
|
||||
`budgetUnit` char(30) NOT NULL DEFAULT 'CNY',
|
||||
@@ -1165,6 +1164,7 @@ CREATE TABLE IF NOT EXISTS `zt_project` (
|
||||
`grade` tinyint(3) unsigned NOT NULL,
|
||||
`name` varchar(90) NOT NULL,
|
||||
`code` varchar(45) NOT NULL,
|
||||
`hasProduct` tinyint(1) unsigned NOT NULL DEFAULT 1,
|
||||
`begin` date NOT NULL,
|
||||
`end` date NOT NULL,
|
||||
`realBegan` date NOT NULL,
|
||||
@@ -1197,6 +1197,7 @@ CREATE TABLE IF NOT EXISTS `zt_project` (
|
||||
`whitelist` text NOT NULL,
|
||||
`order` mediumint(8) unsigned NOT NULL,
|
||||
`vision` varchar(10) NOT NULL DEFAULT 'rnd',
|
||||
`division` enum('0','1') NOT NULL DEFAULT '1',
|
||||
`displayCards` smallint(6) NOT NULL default '0',
|
||||
`fluidBoard` enum('0','1') NOT NULL DEFAULT '0',
|
||||
`multiple` enum('0','1') NOT NULL DEFAULT '1',
|
||||
@@ -6339,6 +6340,7 @@ CREATE TABLE IF NOT EXISTS `zt_im_chat` (
|
||||
`mergedChats` text NOT NULL DEFAULT '',
|
||||
`adminInvite` enum('0','1') NOT NULL DEFAULT '0',
|
||||
`avatar` text NOT NULL DEFAULT '',
|
||||
`archiveDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `gid` (`gid`),
|
||||
KEY `name` (`name`),
|
||||
@@ -6405,7 +6407,8 @@ CREATE TABLE IF NOT EXISTS `zt_im_message` (
|
||||
KEY `mgid` (`gid`),
|
||||
KEY `mcgid` (`cgid`),
|
||||
KEY `muser` (`user`),
|
||||
KEY `mtype` (`type`)
|
||||
KEY `mtype` (`type`),
|
||||
UNIQUE `unique_msg`(`index`, `cgid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- DROP TABLE IF EXISTS `zt_im_message_backup`;
|
||||
|
||||
+380
-1
@@ -1,6 +1,385 @@
|
||||
2022-11-16 18.0.beta1
|
||||
完成的需求
|
||||
39874 瀑布项目设置中产品页面提示文案修改
|
||||
39873 瀑布项目创建页面按产品创建阶段文案修改
|
||||
39849 发布可以关联多个版本后,调整产品发布中关联软件需求的规则
|
||||
39848 发布可以关联多个版本后,调整产品发布中关联解决的Bug的规则
|
||||
39847 发布可以关联多个版本后,调整项目发布中关联软件需求的规则
|
||||
39846 发布可以关联多个版本后,调整项目发布中关联解决的Bug的规则
|
||||
39659 后台功能设置中项目均关闭了问题、风险、机会功能后资产库中创建库按钮置灰
|
||||
39623 项目发布详情页中,版本可以显示已关联的一个或多个版本信息
|
||||
39622 项目发布列表中,版本列可以显示已关联的一个或多个版本信息
|
||||
39621 项目编辑发布页面版本可以关联多个
|
||||
39620 项目创建发布页面版本可以关联多个
|
||||
39619 产品发布详情页中,版本可以显示已关联的一个或多个版本信息
|
||||
39618 产品发布列表中,版本列可以显示已关联的一个或多个版本信息
|
||||
39617 产品编辑发布页面版本可以关联多个
|
||||
39616 产品创建发布页面版本可以关联多个
|
||||
39615 项目中创建版本时,相关版本中选择了一个或多个版本后给出关联版本的规则提示
|
||||
39614 项目版本的详情页中增加相关版本信息
|
||||
39613 编辑在项目中创建的版本时,可以修改相关版本信息
|
||||
39612 项目下创建版本时增加关联迭代版本功能
|
||||
39527 调整测试单列表中报告列表操作名称
|
||||
39460 从全生命周期管理模式切到轻量管理模式时,使用弹窗来提醒用户选择默认项目集
|
||||
39450 系统层面和界面层面启用或关闭功能后,视野中可同步更新
|
||||
39420 安装和升级界面中更新备注中的信息
|
||||
39419 系统升级界面中增加研发综合界面和运营管理界面的信息
|
||||
39418 新用户安装界面中增加研发综合界面和运营管理界面的信息
|
||||
39417 从轻量管理模式切换到全生命周期管理模式时进行二次确认
|
||||
39415 从全生命周期管理模式切换到轻量管理模式时进行二次确认
|
||||
39381 调整模式切换界面的引导方式
|
||||
39379 将自定义中的模式设置功能调整到后台系统三级导航的第一个菜单
|
||||
39361 父需求自动关闭后调整历史记录的记录方式
|
||||
39302 币种设置中“台元”调整为”台币“
|
||||
39168 迅捷界面名称调整为运营管理界面
|
||||
39167 调整禅道使用模式名称
|
||||
39093 不启用迭代的项目关联或取消关联计划时,计划关联信息自动同步到隐藏的迭代
|
||||
39092 不启用迭代的项目关联或取消关联产品时,产品关联信息自动同步到隐藏的迭代
|
||||
39091 编辑不启用迭代的项目时,项目起止日期自动同步到隐藏迭代的起止日期
|
||||
39090 创建不启用迭代的项目时,项目起止日期自动同步到隐藏迭代的起止日期
|
||||
38949 产品看板中增加显示非当前项目集的项目信息的开关功能
|
||||
38948 项目集看板中增加显示非当前项目集的项目信息的开关功能
|
||||
38934 单迭代无产品项目的研发需求增加报表功能
|
||||
38931 单迭代无产品项目的权限去掉计划和会议相关的权限
|
||||
38928 单迭代无产品项目的版本关联需求和bug时搜索条件去掉所属计划
|
||||
38927 单迭代无产品项目增加发布功能
|
||||
38925 单迭代无产品项目的研发需求相关页面去掉计划信息
|
||||
38924 单迭代无产品项目研发需求看板中去掉关联研发需求的按钮
|
||||
38922 单迭代无产品项目中研发需求列表增加细分按钮
|
||||
38921 单迭代无产品项目增加用户需求功能
|
||||
38920 将地盘待处理中的评审功能与地盘审批功能进行合并
|
||||
38918 无迭代项目的任务列表中,导出数据的字段中所属执行调整为所属项目
|
||||
38917 无迭代项目的任务列表中,导出模板的字段中所属执行调整为所属项目
|
||||
38916 无迭代的项目中隐藏转入任务操作
|
||||
38915 无迭代项目的任务报表中,隐藏掉按迭代任务数统计报表
|
||||
38882 迅捷模式中产品去掉需求跟踪矩阵功能
|
||||
38840 不启用迭代的项目中,日志功能使用隐藏迭代的日志权限
|
||||
38839 不启用迭代的项目中,软件需求功能使用隐藏迭代的软件需求权限
|
||||
38838 不启用迭代的项目中,任务日历功能使用隐藏迭代的任务日历权限
|
||||
38837 不启用迭代的项目中,工时明细表功能使用隐藏迭代的工时明细表权限
|
||||
38836 不启用迭代的项目中,树状图功能使用隐藏迭代的树状图权限
|
||||
38835 不启用迭代的项目中,分组视图功能使用隐藏迭代的分组视图权限
|
||||
38834 不启用迭代的项目中,甘特图功能使用隐藏迭代的甘特图权限
|
||||
38833 不启用迭代的项目中,燃尽图功能使用隐藏迭代的燃尽图权限
|
||||
38832 不启用迭代的项目中,看板功能使用隐藏迭代的看板权限
|
||||
38831 不启用迭代的项目中,任务功能使用隐藏迭代的任务权限
|
||||
38824 不启用迭代的项目,隐藏的迭代可以与项目的状态进行联动
|
||||
38701 办公相关审批可以记录由谁发起的评审流程
|
||||
38700 反馈可以记录由谁发起的评审流程
|
||||
38699 用例可以记录由谁发起的评审流程
|
||||
38698 需求可以记录由谁发起的评审流程
|
||||
38691 执行关联产品列表中可以展示项目关联的所有产品
|
||||
38689 项目关联产品列表中增加关联其他项目集产品的功能
|
||||
38578 地盘待处理的区块中增加评审列表
|
||||
38576 地盘贡献的评审列表中增加反馈的评审类型
|
||||
38575 地盘贡献的评审列表中增加办公相关的评审类型
|
||||
38574 地盘贡献的评审列表中增加用例的评审类型
|
||||
38573 地盘贡献的评审列表中增加需求的评审类型
|
||||
38572 调整贡献中评审列表的字段
|
||||
38571 地盘贡献的三级导航中打印评审菜单
|
||||
38570 地盘待处理的评审列表中增加筛选标签
|
||||
38569 地盘待处理的评审列表中增加反馈的评审类型
|
||||
38568 地盘待处理的评审列表中增加办公相关的评审类型
|
||||
38567 地盘待处理的评审列表中增加用例的评审类型
|
||||
38566 地盘待处理的评审列表中增加需求的评审类型
|
||||
38565 调整待处理中评审列表的字段
|
||||
38564 地盘待处理的三级导航中打印评审菜单
|
||||
38515 迅捷模式下如果未开启瀑布项目,则隐藏后台审批中项目审批功能
|
||||
38511 从综合模式切换到迅捷模式时,地盘待处理区块中根据历史数据来判断是否隐藏问题、风险、会议功能
|
||||
38510 从综合模式切换到迅捷模式时,地盘贡献的三级导航中根据历史数据来判断是否隐藏问题、风险、QA功能
|
||||
38509 从综合模式切换到迅捷模式时,地盘待处理的三级导航中根据历史数据来判断是否隐藏问题、风险、QA、会议功能
|
||||
38508 从经典模式升级到18版本迅捷模式时,地盘待处理区块中隐藏问题、风险、会议功能
|
||||
38507 从经典模式升级到18版本迅捷模式时,地盘贡献的三级导航中隐藏问题、风险、QA功能
|
||||
38506 从经典模式升级到18版本迅捷模式时,地盘待处理的三级导航中隐藏问题、风险、QA、会议功能
|
||||
38505 从12版本升级到18版本迅捷模式时,地盘待处理区块中隐藏问题、风险、会议功能
|
||||
38504 从12版本升级到18版本迅捷模式时,地盘贡献的三级导航中隐藏问题、风险、QA功能
|
||||
38503 从12版本升级到18版本迅捷模式时,地盘待处理的三级导航中隐藏问题、风险、QA、会议功能
|
||||
38496 从综合模式切到迅捷模式后关闭敏捷项目的度量功能
|
||||
38495 12版本升级到禅道18版本迅捷模式后关闭敏捷项目的度量功能
|
||||
38494 新用户安装禅道18版本迅捷模式后关闭敏捷项目的度量功能
|
||||
38464 项目内部权限中隐藏执行、会议和执行列表权限
|
||||
38420 执行创建时,瀑布项目要根据项目的阶段类型关联产品
|
||||
38419 瀑布项目阶段关联产品不可修改
|
||||
38352 从综合模式切到迅捷模式时,敏捷项目根据是否存在会议数据来判断是否开启会议功能
|
||||
38351 从综合模式切到迅捷模式时,敏捷项目根据是否存在QA数据来判断是否开启QA功能
|
||||
38350 从综合模式切到迅捷模式时,敏捷项目根据是否存在过程数据来判断是否开启过程功能
|
||||
38349 从综合模式切到迅捷模式时,敏捷项目根据是否存在机会数据来判断是否开启机会功能
|
||||
38347 从综合模式切到迅捷模式时,敏捷项目根据是否存在风险数据来判断是否开启风险功能
|
||||
38345 从综合模式切到迅捷模式时,敏捷项目根据是否存在问题数据来判断是否开启问题功能
|
||||
38324 项目管理员权限分组中无产品项目的权限特殊处理
|
||||
38281 实现从15版本经典模式直接升级到18本版迅捷模式
|
||||
38234 综合模式下如果没有项目集数据,切换迅捷模式时可以不用选择默认项目集
|
||||
38231 执行创建阶段类型为需求、设计、总结评审的瀑布项目阶段时,隐藏关联计划
|
||||
38230 复制项目的阶段信息确认页面文案修改
|
||||
38229 单套阶段的项目的费用估算的阶段隐藏产品
|
||||
38228 单套阶段的项目的里程牌报告隐藏2.5级产品菜单
|
||||
38223 瀑布项目的设计增加所有产品选项
|
||||
38222 瀑布项目阶段菜单样式优化
|
||||
38221 单阶段的瀑布项目的阶段隐藏产品
|
||||
38220 瀑布项目创建增加阶段类型选项
|
||||
38156 组织统计报表中,任务指派给统计表中执行名称列显示项目名称
|
||||
38155 组织统计报表中,任务完成统计表中执行名称列显示项目名称
|
||||
38154 组织统计报表中,员工负载表中执行名称列不显示隐藏的执行
|
||||
38153 测试统计报表中,项目Bug类型统计表中执行名称列不显示隐藏的执行
|
||||
38152 测试统计报表中,项目Bug指派给分布表中执行名称列不显示隐藏的执行
|
||||
38151 测试统计报表中,项目Bug解决者分布表中执行名称列不显示隐藏的执行
|
||||
38150 测试统计报表中,项目Bug创建者分布表中执行名称列不显示隐藏的执行
|
||||
38149 测试统计报表中,项目Bug状态分布表中执行名称列不显示隐藏的执行
|
||||
38148 测试统计报表中,项目Bug解决者分布表中执行名称列不显示隐藏的执行
|
||||
38147 项目统计报表中,相关执行下拉菜单中不显示隐藏的执行
|
||||
38146 项目统计报表中,项目Bug类型统计表中执行名称列不显示隐藏的执行
|
||||
38145 项目统计报表中,项目进展表中执行名称列不显示隐藏的执行
|
||||
38144 项目统计报表中,项目质量表中执行名称列不显示隐藏的执行
|
||||
38143 项目统计报表中,项目Bug指派给分布表中执行名称列不显示隐藏的执行
|
||||
38142 项目统计报表中,项目Bug解决者分布表中执行名称列不显示隐藏的执行
|
||||
38141 项目统计报表中,项目Bug创建者分布表中执行名称列不显示隐藏的执行
|
||||
38140 项目统计报表中,项目Bug状态分布表中执行名称列不显示隐藏的执行
|
||||
38139 项目统计报表中,项目Bug解决分布表中执行名称列不显示隐藏的执行
|
||||
38138 项目统计报表中,项目需求阶段分布表中执行名称列不显示隐藏的执行
|
||||
38137 项目统计报表中,项目需求状态分布表中执行名称列不显示隐藏的执行
|
||||
38136 项目统计报表中,项目投入统计报表中执行名称列不显示隐藏的执行
|
||||
38135 项目统计报表中,任务完成者报表中执行名称列不显示隐藏的执行
|
||||
38134 项目统计报表中,任务指派统计报表中执行名称列不显示隐藏的执行
|
||||
38133 项目统计报表中,任务类型统计报表中执行名称列不显示隐藏的执行
|
||||
38132 项目统计报表中,任务状态统计报表中执行名称列不显示隐藏的执行
|
||||
38131 项目统计报表中,交付吞吐率报表中不显示隐藏的执行
|
||||
38130 项目统计报表中,执行速率报表中不显示隐藏的执行
|
||||
38129 项目统计报表中,执行偏差报表中不显示隐藏的执行
|
||||
38128 组织的动态列表中,执行的下拉菜单中不显示隐藏的执行
|
||||
38127 组织的动态中,不显示隐藏执行的相关动态
|
||||
38126 项目的动态中,不显示隐藏执行的相关动态
|
||||
38125 地盘贡献的任务列表中,所属执行列不显示隐藏的执行
|
||||
38124 地盘执行列表中,不显示隐藏的执行
|
||||
38123 地盘待处理的质量保证计划列表中,所属执行列显示项目名称
|
||||
38122 地盘待处理的测试单列表中,所属执行列显示项目名称
|
||||
38121 地盘待处理的任务列表中,所属执行列不显示隐藏的执行
|
||||
38120 地盘会议列表中,执行列不显示隐藏的执行
|
||||
38119 地盘日志列表中,执行列显示项目名称
|
||||
38118 地盘动态列表中,不显示隐藏执行的相关动态
|
||||
38117 地盘仪表盘的最新动态中,不显示隐藏执行的相关动态
|
||||
38116 地盘仪表盘的近期项目区块中,不启用迭代的项目不显示近期执行信息
|
||||
38115 地盘仪表盘的执行总览区块中,不显示隐藏的执行
|
||||
38114 地盘仪表盘的项目统计区块中,不启用迭代的项目不显示近期执行信息
|
||||
38113 地盘仪表盘的产品列表区块中,当前执行列显示项目名称
|
||||
38112 会议详情页面,不显示所属执行字段
|
||||
38111 编辑会议页面,不显示所属执行字段
|
||||
38110 创建会议页面,不显示所属执行字段
|
||||
38109 风险详情页面,不显示所属执行字段
|
||||
38108 编辑风险页面,不显示所属执行字段
|
||||
38107 创建风险页面,不显示所属执行字段
|
||||
38106 问题详情页面,不显示所属执行字段
|
||||
38105 编辑问题页面,不显示所属执行字段
|
||||
38104 创建问题页面,不显示所属执行字段
|
||||
38103 版本列表中,不显示所属执行列
|
||||
38102 版本详情页面,不显示所属执行字段
|
||||
38101 编辑版本页面,不显示所属执行字段
|
||||
38100 创建版本页面,不显示所属执行字段
|
||||
38099 测试单概况页面,不显示所属执行字段
|
||||
38098 编辑测试单页面,不显示所属执行字段
|
||||
38097 提交测试单页面,不显示所属执行字段
|
||||
38096 测试报告列表中,所属执行列不显示隐藏的执行
|
||||
38095 测试的Bug列表中,所属执行列不显示隐藏的执行
|
||||
38094 Bug详情页面,不显示所属执行字段
|
||||
38093 编辑Bug页面,不显示所属执行字段
|
||||
38092 批量提Bug页面,不显示所属执行字段
|
||||
38091 提Bug页面,不显示所属执行字段
|
||||
38090 任务详情页面,不显示所属执行字段
|
||||
38089 批量编辑任务页面,不显示所属执行信息
|
||||
38088 编辑任务页面,不显示所属执行字段
|
||||
38087 创建任务页面,不显示所属执行字段
|
||||
38086 执行的1.5级导航的下拉菜单中隐藏不启用执行项目的这个隐藏的执行
|
||||
37875 不启用迭代功能的项目中,在日志中执行相关操作时导航高亮在当前项目菜单
|
||||
37874 不启用迭代功能的项目中,在需求列表中执行相关操作时导航高亮在当前项目菜单
|
||||
37873 不启用迭代功能的项目中,在任务日历中执行相关操作时导航高亮在当前项目菜单
|
||||
37872 不启用迭代功能的项目中,在工时明细表中执行相关操作时导航高亮在当前项目菜单
|
||||
37871 不启用迭代功能的项目中,在树状图中执行相关操作时导航高亮在当前项目菜单
|
||||
37870 项目取消与产品的关联后,同步取消该项目下执行与产品的关联关系
|
||||
37838 不启用迭代功能的项目中,执行分组视图的相关操作时导航高亮在当前项目菜单
|
||||
37830 不启用迭代功能的项目中,执行燃尽图的相关操作时导航高亮在当前项目菜单
|
||||
37829 不启用迭代功能的项目中,执行看板的相关操作时导航高亮在当前项目菜单
|
||||
37827 不启用迭代功能的项目中,执行任务的相关操作时导航高亮在当前项目菜单
|
||||
37804 看板项目中,实现不启用迭代功能项目中的设置功能
|
||||
37803 看板项目中,实现不启用迭代功能项目中的版本功能
|
||||
37802 看板项目中,实现不启用迭代功能项目中的看板功能
|
||||
37801 实现看板项目不启用迭代功能的二级导航菜单
|
||||
37800 敏捷项目中,实现不启用迭代功能项目中的设置功能
|
||||
37799 敏捷项目中,实现不启用迭代功能项目中的版本功能
|
||||
37798 敏捷项目中,实现不启用迭代功能项目中的文档功能
|
||||
37797 敏捷项目中,实现不启用迭代功能项目中的代码功能
|
||||
37796 敏捷项目中,实现不启用迭代功能项目中的测试功能
|
||||
37795 敏捷项目中,实现不启用迭代功能项目中的日志功能
|
||||
37794 敏捷项目中,实现不启用迭代功能项目中的软件需求功能
|
||||
37793 敏捷项目中,实现不启用迭代功能项目中的任务日历功能
|
||||
37792 敏捷项目中,实现不启用迭代功能项目中的工时明细功能
|
||||
37791 敏捷项目中,实现不启用迭代功能项目中的分组视图功能
|
||||
37790 敏捷项目中,实现不启用迭代功能项目中的甘特图功能
|
||||
37789 敏捷项目中,实现不启用迭代功能项目中的燃尽图功能
|
||||
37788 敏捷项目中,实现不启用迭代功能项目中的看板功能
|
||||
37787 敏捷项目中,实现不启用迭代功能项目中的任务功能
|
||||
37786 实现敏捷项目不启用迭代功能的二级导航菜单
|
||||
37779 12版本升级到禅道18版本迅捷模式后关闭敏捷项目的会议功能
|
||||
37778 12版本升级到禅道18版本迅捷模式后关闭敏捷项目的QA功能
|
||||
37777 12版本升级到禅道18版本迅捷模式后关闭敏捷项目的过程功能
|
||||
37776 12版本升级到禅道18版本迅捷模式后关闭敏捷项目的机会功能
|
||||
37775 12版本升级到禅道18版本迅捷模式后关闭敏捷项目的风险功能
|
||||
37774 12版本升级到禅道18版本迅捷模式后关闭敏捷项目的问题功能
|
||||
37773 经典模式升级到禅道18版本迅捷模式后关闭敏捷项目的会议功能
|
||||
37772 经典模式升级到禅道18版本迅捷模式后关闭敏捷项目的QA功能
|
||||
37771 经典模式升级到禅道18版本迅捷模式后关闭敏捷项目的过程功能
|
||||
37770 经典模式升级到禅道18版本迅捷模式后关闭敏捷项目的机会功能
|
||||
37769 经典模式升级到禅道18版本迅捷模式后关闭敏捷项目的风险功能
|
||||
37768 经典模式升级到禅道18版本迅捷模式后关闭敏捷项目的问题功能
|
||||
37767 新用户安装禅道18版本迅捷模式后关闭敏捷项目的会议功能
|
||||
37766 新用户安装禅道18版本迅捷模式后关闭敏捷项目的QA功能
|
||||
37765 新用户安装禅道18版本迅捷模式后关闭敏捷项目的过程功能
|
||||
37764 新用户安装禅道18版本迅捷模式后关闭敏捷项目的机会功能
|
||||
37763 新用户安装禅道18版本迅捷模式后关闭敏捷项目的风险功能
|
||||
37762 新用户安装禅道18版本迅捷模式后关闭敏捷项目的问题功能
|
||||
37758 经典模式版本升级到18版本迅捷模式后,根据是否存在用户需求数据来判断是否开启用户需求功能
|
||||
37757 经典模式版本升级到18版本迅捷模式后关闭资产库功能
|
||||
37756 经典模式版本升级到18版本迅捷模式后关闭瀑布项目功能
|
||||
37755 12版升级到18版本迅捷模式后,根据是否存在用户需求数据来判断是否开启用户需求功能
|
||||
37754 12版升级到18版本迅捷模式后关闭资产库功能
|
||||
37753 新用户安装禅道18版本迅捷模式后关闭用户需求功能
|
||||
37752 从综合模式切到迅捷模式时,根据是否存在用户需求数据来判断是否开启用户需求功能
|
||||
37751 从综合模式切到迅捷模式时,根据是否存在资产库数据来判断是否开启资产库功能
|
||||
37750 新用户安装禅道18版本迅捷模式后关闭资产库功能
|
||||
37746 在后台系统功能列表中实现对系统功能的自定义
|
||||
37745 在后台系统设置中增加系统功能设置菜单
|
||||
37743 从全新项目集模式的版本升级到18版本,无需选择模式直接升级到综合模式
|
||||
37736 创建敏捷项目时可以设置是否启用迭代功能
|
||||
37735 编辑敏捷项目时,是否启用迭代字段不可调整
|
||||
37734 编辑看板项目时,是否启用迭代字段不可调整
|
||||
37733 编辑产品页面所属项目集为空时,不显示产品线字段
|
||||
37732 执行产品列表可以取消已关联的产品
|
||||
37731 编辑执行时可以取消已关联的产品
|
||||
37730 项目的产品列表中可以取消已关联的产品
|
||||
37729 后台自定义的流程中,去掉组合方式之间的减号
|
||||
37675 无产品项目复制模块可以复制产品和无产品项目的模块
|
||||
37674 项目概况中展示产品型项目和无产品项目的标签
|
||||
37673 无产品项目研发需求隐藏移除按钮
|
||||
37660 创建产品页面所属项目集为空时,不显示产品线字段
|
||||
37658 产品调整所属项目集时,可以任意选择一个项目集
|
||||
37657 项目调整所属项目集时,可以任意选择一个项目集
|
||||
37656 编辑项目时可以取消已关联的产品
|
||||
37654 编辑项目的时候,可以跨项目集关联产品
|
||||
37653 创建项目的时候,可以跨项目集关联产品
|
||||
37613 12版升级到18版本迅捷模式后关闭瀑布项目功能
|
||||
37612 新用户安装禅道18版本迅捷模式后关闭瀑布项目功能
|
||||
37603 从综合模式切到迅捷模式时,根据是否存在瀑布项目数据来判断是否开启瀑布项目功能
|
||||
37596 从综合模式切到迅捷模式时,访问权限是项目集内公开的项目统一调整为私有
|
||||
37572 无产品项目项目复制
|
||||
37553 无产品项目的权限通过项目维护
|
||||
37552 无产品项目的视野权限在产品中进行过滤,通过项目维护
|
||||
37551 无产品项目恢复时同步恢复影子产品
|
||||
37549 测试模块测试单功能展示产品和无产品项目的信息
|
||||
37546 测试模块用例功能统计产品和无产品项目的信息
|
||||
37544 测试模块bug功能统计产品和无产品项目的信息
|
||||
37542 实现从12版本升级到18版本综合模式的手工归并数据功能
|
||||
37541 无产品项目在测试区块仪表盘的所属产品展示为无产品项目名
|
||||
37540 地盘动态不展示影子产品的动态
|
||||
37539 无产品项目在地盘贡献的产品名称下展示为无产品项目名
|
||||
37538 无产品项目在地盘待处理的产品名称下展示为无产品项目名
|
||||
37537 无产品项目在地盘日志的所属产品展示为无产品项目名
|
||||
37534 无产品项目在地盘区块的产品名称下展示为无产品项目名
|
||||
37533 反馈不支持无产品项目
|
||||
37532 组织中无产品项目的所属产品展示为项目名
|
||||
37531 统计产品和测试菜单下的列表,无产品项目进行特殊处理
|
||||
37530 资产库导入需求不展示无产品的产品名称
|
||||
37529 通用看板导入发布与导入计划的产品中增加无产品项目的层级,展示无产品项目名
|
||||
37528 从12版本升级到18版本的综合模式时,增加自动或手工归并数据的功能
|
||||
37527 从12版本升级到18版本的迅捷模式时,增加自动或手工归并数据的功能
|
||||
37525 从综合模式切换为迅捷模式时可以选择一个项目集作为默认项目集
|
||||
37517 创建看板项目时可以设置是否启用迭代功能
|
||||
37504 迅捷模式下默认创建一个隐藏的项目集,关联所有产品和项目数据
|
||||
37462 无产品项目仪表盘隐藏所属产品字段
|
||||
37461 无产品项目执行的任务导入bug隐藏搜索的所属产品字段
|
||||
37460 无产品项目执行的日志导出数据隐藏所属产品
|
||||
37458 无产品项目中测试单功能隐藏产品信息
|
||||
37457 无产品项目中用例功能隐藏产品信息
|
||||
37456 无产品项目中bug功能隐藏产品信息
|
||||
37455 无产品项目中研发需求和用户需求列表导出和导入功能隐藏产品信息
|
||||
37454 无产品项目中研发需求和用户需求列表增加维护模块按钮
|
||||
37453 无产品项目中研发需求和用户需求列表隐藏所属产品信息
|
||||
37452 无产品项目执行的看板新建隐藏产品与计划
|
||||
37451 看板项目的设置隐藏产品与计划字段
|
||||
37450 无产品项目中研发需求隐藏所属产品信息
|
||||
37449 无产品项目中增加用户需求模块
|
||||
37448 无产品项目中二级菜单研发需求改为需求,包含研发需求和用户需求
|
||||
37447 瀑布项目的报告隐藏产品
|
||||
37445 瀑布项目的估算的阶段隐藏产品
|
||||
37444 瀑布项目的评审隐藏产品
|
||||
37443 瀑布项目的矩阵隐藏产品
|
||||
37442 瀑布项目的阶段隐藏产品
|
||||
37441 看板执行的看板编辑隐藏产品与计划
|
||||
37438 敏捷、瀑布项目的设置隐藏产品与计划字段
|
||||
37437 敏捷、瀑布、看板项目的版本隐藏产品字段
|
||||
37424 项目模块中执行的相关页面隐藏“所属产品”字段
|
||||
37422 项目列表页导出列表中增加“项目类型”,无产品项目的所属产品为“”
|
||||
37421 项目列表搜索项增加“项目类型”
|
||||
37420 创建项目选择“项目类型”,可以创建产品型项目或无产品项目
|
||||
37346 项目列表页增加字段“项目类型”
|
||||
37336 迅捷模式中隐藏产品线的相关功能
|
||||
37333 无产品项目的需求列表中增加批量创建功能
|
||||
37332 无产品项目的需求列表中取消关联研发需求功能
|
||||
37331 敏捷无产品项目中增加计划功能
|
||||
37328 无产品项目中发布隐藏产品信息
|
||||
37308 实现从15版本经典模式升级到18本版迅捷模式
|
||||
37292 实现从12版本升级到18版本迅捷模式的手工归并数据功能
|
||||
37291 12版本升级到18版本时,提供综合模式和迅捷模式的介绍和选择
|
||||
37290 新用户安装禅道时提供综合模式和迅捷模式的介绍和选择
|
||||
37289 迅捷模式切换到综合模式后开启项目集功能
|
||||
37284 从综合模式切换到迅捷模式后隐藏项目集相关功能和数据
|
||||
37275 从迅捷模式切换到综合模式增加功能影响的提示信息
|
||||
37272 从综合模式切换到迅捷模式时增加功能影响的提示信息
|
||||
37270 迅捷模式和综合模式的切换不做次数限制
|
||||
37268 调整后台自定义模式中的名称
|
||||
38176 无产品项目下可以设置与代码库的关联关系
|
||||
37635 在无产品项目下可以创建代码库
|
||||
37465 在无产品项目下可以提交评审问题
|
||||
37464 代码库可以关联项目
|
||||
36616 实现版本升级后原存档讨论组逻辑处理
|
||||
36543 实现群主取消归档讨论组相关提醒及操作
|
||||
36540 实现对已归档的讨论组限制移动分组
|
||||
36542 限制对已归档讨论组相关操作
|
||||
32237 实现归档后的讨论组交互显示
|
||||
36541 实现对已归档讨论组消息的处理
|
||||
36832 实现讨论组归档提醒的功能
|
||||
36831 实现讨论组归档入口
|
||||
37463 实现群管理应用对已归档讨论组的相关操作
|
||||
37670 实现讨论组会话中@成员时的快捷键操作
|
||||
37669 实现优化讨论组会话中@多个成员的功能
|
||||
37668 实现优化讨论组会话中@单个成员的功能
|
||||
37667 实现讨论组会话中@所有人功能
|
||||
37663 实现讨论组中会话中@成员能够以列表形式展现
|
||||
37631 禅道客户端“反馈”的相关通知增加到喧喧小助手
|
||||
38190 禅道相关通知增加到小喧喧交互设计
|
||||
37661 提升禅道相关通知推送到喧喧小助手的速度
|
||||
37634 喧喧不在前台时使用其快捷键截屏不自动调出界面
|
||||
37642 修改会议初检设置项文案
|
||||
修复的Bug
|
||||
29763 执行关联产品页面未关联的产品应该显示项目集
|
||||
29702 批量编辑产品,自定义表单项显示产品线
|
||||
29650 新建项目时,关联产品下拉列表显示了非所选项目集下的产品
|
||||
29628 Bug默认指派人没指派给产品测试负责人
|
||||
29549 无产品项目和无产品迭代文档下搜索条件“所属产品”未隐藏掉
|
||||
29535 执行中转入任务后F12有报错信息
|
||||
29508 地盘--待处理中Bug列表错乱
|
||||
29499 项目概况页面所属项目集代码报错
|
||||
29452 无产品项目下批量编辑和批量指派给下拉数据与单个指派下拉数据范围不一致
|
||||
27994 禅道系统使用时切换页面会突然登录超时退出
|
||||
28255 无产品权限人员编辑代码库显示项目不正确
|
||||
27516 可合并讨论组的列表中列出了已经被合并的群
|
||||
27458 新加入群聊后未读消息会显示新加入群所有消息的条数
|
||||
26453 引用小喧喧的推送不显示小喧喧的头像和名称
|
||||
28077 快捷键截图后打开xxc偶发xxc窗口一直置于桌面最上方
|
||||
27983 用户名大小写不对,提示有问题
|
||||
27629 预览txt文件乱码
|
||||
28095 LDAP密码有特殊字符无法登录
|
||||
|
||||
2022-11-02 17.8
|
||||
完成的需求
|
||||
开源版
|
||||
开源版:
|
||||
39354 项目集列表中恢复项目名称前的模型标识
|
||||
39165 玉烟紫主题下,地盘仪表盘待处理区块中标题颜色调整
|
||||
39164 bug严重程度的样式调整
|
||||
|
||||
@@ -4,7 +4,7 @@ class myExecution extends execution
|
||||
{
|
||||
public function create($projectID = '', $executionID = 0, $copyExecutionID = '', $planID = 0, $confirm = 'no', $productID = 0, $extra = '')
|
||||
{
|
||||
$this->config->execution->create->requiredFields = 'name,code,begin,end';
|
||||
$this->config->execution->create->requiredFields = 'name,code,begin,end';
|
||||
parent::create($projectID, $executionID, $copyExecutionID, $planID, $confirm, $productID, $extra);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,22 +20,25 @@ body {margin-bottom: 25px;}
|
||||
.assignedTo{border-radius: 4px !important;}
|
||||
#productStoryForm table tbody tr td.c-actions .dividing-line {width: 1px; height: 16px; display: inline-block; vertical-align: middle; background: #F4F5F7; margin: 0 4px 0 0;}
|
||||
</style>
|
||||
<?php js::set('browseType', $browseType);?>
|
||||
<?php js::set('productID', $productID);?>
|
||||
<?php js::set('projectID', $projectID);?>
|
||||
<?php js::set('branch', $branch);?>
|
||||
<?php js::set('rawModule', $this->app->rawModule);?>
|
||||
<?php js::set('productType', $this->app->tab == 'product' ? $product->type : '');?>
|
||||
<?php
|
||||
$unfoldStories = isset($config->product->browse->unfoldStories) ? json_decode($config->product->browse->unfoldStories, true) : array();
|
||||
$unfoldStories = zget($unfoldStories, $productID, array());
|
||||
$lang->story->createCommon = $storyType == 'story' ? $lang->story->createStory : $lang->story->createRequirement;
|
||||
$unfoldStories = isset($config->product->browse->unfoldStories) ? json_decode($config->product->browse->unfoldStories, true) : array();
|
||||
$unfoldStories = zget($unfoldStories, $productID, array());
|
||||
$isProjectStory = $this->app->rawModule == 'projectstory';
|
||||
$projectHasProduct = $isProjectStory && !empty($project->hasProduct);
|
||||
$projectIDParam = $isProjectStory ? "projectID=$projectID&" : '';
|
||||
js::set('unfoldStories', $unfoldStories);
|
||||
js::set('unfoldAll', $lang->execution->treeLevel['all']);
|
||||
js::set('foldAll', $lang->execution->treeLevel['root']);
|
||||
js::set('storyType', $storyType);
|
||||
$lang->story->createCommon = $storyType == 'story' ? $lang->story->createStory : $lang->story->createRequirement;
|
||||
$isProjectStory = $this->app->rawModule == 'projectstory';
|
||||
$projectIDParam = $isProjectStory ? "projectID=$projectID&" : '';
|
||||
js::set('browseType', $browseType);
|
||||
js::set('productID', $productID);
|
||||
js::set('projectID', $projectID);
|
||||
js::set('branch', $branch);
|
||||
js::set('rawModule', $this->app->rawModule);
|
||||
js::set('productType', $this->app->tab == 'product' ? $product->type : '');
|
||||
js::set('projectHasProduct', $projectHasProduct);
|
||||
js::set('URAndSR', $this->config->URAndSR);
|
||||
?>
|
||||
<style>
|
||||
.btn-group .icon-close:before {font-size: 5px; vertical-align: 25%;}
|
||||
|
||||
@@ -181,7 +181,7 @@ class router extends baseRouter
|
||||
|
||||
$hourKey = $planKey = $URSR = $URAndSR = 0;
|
||||
|
||||
$mode = 'new';
|
||||
$mode = 'ALM';
|
||||
$score = '0';
|
||||
$projectKey = ITERATION_KEY;
|
||||
$disabledFeatures = '';
|
||||
@@ -200,7 +200,7 @@ class router extends baseRouter
|
||||
}
|
||||
|
||||
/* Lite Version is compatible with classic modes */
|
||||
if($config->vision == 'lite') $mode = 'new';
|
||||
if($config->vision == 'lite') $mode = 'ALM';
|
||||
|
||||
/* Record system mode. */
|
||||
$config->systemMode = $mode;
|
||||
|
||||
@@ -567,7 +567,6 @@ $lang->block->flowchart['admin'] = array('Administrator', 'Abteilung erstellen
|
||||
if($config->systemMode == 'ALM') $lang->block->flowchart['program'] = array('Program Owner', 'Create Program', 'Link Product', "Create Project", "Budgeting and planning", 'Add Stakeholder');
|
||||
$lang->block->flowchart['product'] = array($lang->productCommon . ' Besitzer', $lang->productCommon . ' erstellen', 'Module pflegen', 'Pläne pflegen', 'Storys pflegen', 'Release erstellen');
|
||||
$lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
|
||||
$lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
|
||||
$lang->block->flowchart['dev'] = array('Entwickler', 'Aufgabe/Bugs anfordern', 'Update Status', 'Aufgaben/Bugs abschließen');
|
||||
$lang->block->flowchart['tester'] = array('QS Team', 'Fälle erstellen', 'Fälle ausführen', 'Bug Berichte', 'Bugs überprüfen', 'Bugs schließen');
|
||||
|
||||
|
||||
@@ -567,7 +567,6 @@ $lang->block->flowchart['admin'] = array('Administrator', 'Add Departments', '
|
||||
if($config->systemMode == 'ALM') $lang->block->flowchart['program'] = array('Program Owner', 'Create Program', 'Link Product', "Create Project", "Budgeting and planning", 'Add Stakeholder');
|
||||
$lang->block->flowchart['product'] = array($lang->productCommon . ' Owner', 'Add ' . $lang->productCommon, 'Maintain Modules', 'Maintain Plans', 'Maintain Stories', 'Create Releases');
|
||||
$lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
|
||||
$lang->block->flowchart['project'] = array('Project Manager', 'Add ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
|
||||
$lang->block->flowchart['dev'] = array('Dev Team', 'Claim Tasks/Bugs', 'Design', 'Update Status', 'Finish Tasks/Bugs', 'Commit Code');
|
||||
$lang->block->flowchart['tester'] = array('Test Team', 'Write Cases', 'Run Cases', 'Report Bugs', 'Verify Bugs', 'Close Bugs');
|
||||
|
||||
|
||||
@@ -567,7 +567,6 @@ $lang->block->flowchart['admin'] = array('Administrateur', 'Ajoute Compartimen
|
||||
if($config->systemMode == 'ALM') $lang->block->flowchart['program'] = array('Program Owner', 'Create Program', 'Link Product', "Create Project", "Budgeting and planning", 'Add Stakeholder');
|
||||
$lang->block->flowchart['product'] = array($lang->productCommon . ' Owner', 'Ajoute ' . $lang->productCommon . '/Modules', 'Ajoute ' . $lang->executionCommon . 's', 'Ajoute Stories', 'Maintient Plans', 'Crée Releases');
|
||||
$lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
|
||||
$lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
|
||||
$lang->block->flowchart['dev'] = array('Développeurs', 'Réclament Tâches/Bugs', 'Effectuent Tâches', 'Corrigent Bugs', 'MàJ Statuts', 'Terminent Tâches/Bugs');
|
||||
$lang->block->flowchart['tester'] = array('Testeurs', 'Rédigent CasTests', 'Jouent CasTests', 'Détectent Bugs', 'Vérifient Corrections', 'Ferment Bugs');
|
||||
|
||||
|
||||
+52
-29
@@ -1972,24 +1972,17 @@ class bugModel extends model
|
||||
/**
|
||||
* Get product left bugs.
|
||||
*
|
||||
* @param int $build
|
||||
* @param int $productID
|
||||
* @param int $branch
|
||||
* @param string $linkedBugs
|
||||
* @param object $pager
|
||||
* @param int|string $buildIdList
|
||||
* @param int $productID
|
||||
* @param int $branch
|
||||
* @param string $linkedBugs
|
||||
* @param object $pager
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProductLeftBugs($build, $productID, $branch = '', $linkedBugs = '', $pager = null)
|
||||
public function getProductLeftBugs($buildIdList, $productID, $branch = '', $linkedBugs = '', $pager = null)
|
||||
{
|
||||
$builds = $this->dao->select('*')->from(TABLE_BUILD)->where('id')->in($build)->fetchAll('id');
|
||||
|
||||
$executionIdList = array();
|
||||
foreach($builds as $build)
|
||||
{
|
||||
if(empty($build->execution)) continue;
|
||||
$executionIdList[$build->execution] = $build->execution;
|
||||
}
|
||||
$executionIdList = $this->getLinkedExecutionByIdList($buildIdList);
|
||||
if(empty($executionIdList)) return array();
|
||||
|
||||
$executions = $this->dao->select('*')->from(TABLE_EXECUTION)->where('id')->in($executionIdList)->fetchAll();
|
||||
@@ -2088,28 +2081,26 @@ class bugModel extends model
|
||||
/**
|
||||
* Get bugs according to buildID and productID.
|
||||
*
|
||||
* @param int $buildID
|
||||
* @param int $productID
|
||||
* @param string $branch
|
||||
* @param string $linkedBugs
|
||||
* @param object $pager
|
||||
* @param int|string $buildIdList
|
||||
* @param int $productID
|
||||
* @param string $branch
|
||||
* @param string $linkedBugs
|
||||
* @param object $pager
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getReleaseBugs($buildID, $productID, $branch = 0, $linkedBugs = '', $pager = null)
|
||||
public function getReleaseBugs($buildIdList, $productID, $branch = 0, $linkedBugs = '', $pager = null)
|
||||
{
|
||||
$executions = $this->dao->select('t1.id,t1.begin')->from(TABLE_EXECUTION)->alias('t1')
|
||||
->leftJoin(TABLE_BUILD)->alias('t2')->on('t1.id = t2.execution')
|
||||
->where('t2.id')->in($buildID)
|
||||
->fetchAll('id');
|
||||
if(empty($executions)) return array();
|
||||
$executionIdList = $this->getLinkedExecutionByIdList($buildIdList);
|
||||
if(empty($executionIdList)) return array();
|
||||
|
||||
$condition = 'execution NOT ' . helper::dbIN(array_keys($executions));
|
||||
$minBegin = '';
|
||||
$executions = $this->dao->select('id,type,begin')->from(TABLE_EXECUTION)->where('id')->in($executionIdList)->fetchAll('id');
|
||||
$condition = 'execution NOT ' . helper::dbIN($executionIdList);
|
||||
$minBegin = '';
|
||||
foreach($executions as $execution)
|
||||
{
|
||||
if(empty($minBegin) or $minBegin > $execution->begin) $minBegin = $execution->begin;
|
||||
$condition .= " OR (execution = '{$execution->id}' AND openedDate < '{$execution->begin}')";
|
||||
$condition .= " OR (`execution` = '{$execution->id}' AND openedDate < '{$execution->begin}')";
|
||||
}
|
||||
|
||||
$bugs = $this->dao->select('*')->from(TABLE_BUG)
|
||||
@@ -2122,10 +2113,42 @@ class bugModel extends model
|
||||
->andWhere('deleted')->eq(0)
|
||||
->orderBy('openedDate ASC')
|
||||
->page($pager)
|
||||
->fetchAll();
|
||||
->fetchAll('id');
|
||||
return $bugs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get linked execution by build id list.
|
||||
*
|
||||
* @param string $buildIdList
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getLinkedExecutionByIdList($buildIdList)
|
||||
{
|
||||
$builds = $this->dao->select('id,execution')->from(TABLE_BUILD)->where('id')->in($buildIdList)->fetchAll('id');
|
||||
|
||||
$executionIdList = array();
|
||||
$linkedBuildIdList = array();
|
||||
foreach($builds as $build)
|
||||
{
|
||||
if($build->builds) $linkedBuildIdList = array_merge($linkedBuildIdList, explode(',', $build->builds));
|
||||
|
||||
if(empty($build->execution)) continue;
|
||||
$executionIdList[$build->execution] = $build->execution;
|
||||
}
|
||||
if($linkedBuildIdList)
|
||||
{
|
||||
$linkedBuilds = $this->dao->select('*')->from(TABLE_BUILD)->where('id')->in(array_unique($linkedBuildIdList))->fetchAll('id');
|
||||
foreach($linkedBuilds as $build)
|
||||
{
|
||||
if(empty($build->execution)) continue;
|
||||
$executionIdList[$build->execution] = $build->execution;
|
||||
}
|
||||
}
|
||||
return $executionIdList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get bugs of a story.
|
||||
*
|
||||
|
||||
@@ -8,7 +8,7 @@ $().ready(function()
|
||||
$(document).on('change', '#product, #branch', function()
|
||||
{
|
||||
var productID = $('#product').val();
|
||||
var branch = $('#branch').val();
|
||||
var branch = $('#branch').length > 0 ? $('#branch').val() : '';
|
||||
$.get(createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=builds&build=&branch=' + branch + '&index=&needCreate=&type=noempty,notrunk,separate,noproject&extra=multiple'), function(data)
|
||||
{
|
||||
if(data) $('#buildBox').html(data);
|
||||
|
||||
@@ -232,7 +232,7 @@ class buildModel extends model
|
||||
->leftJoin(TABLE_RELEASE)->alias('t3')->on("FIND_IN_SET(t1.id,t3.build)")
|
||||
->leftJoin(TABLE_BRANCH)->alias('t4')->on('t1.branch = t4.id')
|
||||
->leftJoin(TABLE_PRODUCT)->alias('t5')->on('t1.product = t5.id')
|
||||
->where(1)->eq(1)
|
||||
->where('1=1')
|
||||
->beginIF(strpos($params, 'hasDeleted') === false)->andWhere('t1.deleted')->eq(0)->fi()
|
||||
->beginIF(strpos($params, 'noproject') !== false)->andWhere('t1.execution')->ne(0)->fi()
|
||||
->beginIF($products)->andWhere('t1.product')->in($products)->fi()
|
||||
|
||||
@@ -343,7 +343,7 @@ $lang->execution->menu->view = array('link' => "$lang->view|execution|grouptas
|
||||
if($config->edition != 'open') $lang->execution->menu->view = array('link' => "$lang->view|execution|gantt|executionID=%s", 'alias' => 'grouptask,tree,taskeffort,gantt,calendar,relation,maintainrelation');
|
||||
|
||||
$lang->execution->menu->storyGroup = array('link' => "{$lang->common->story}|execution|story|executionID=%s",'class' => 'dropdown dropdown-hover', 'subModule' => 'story', 'alias' => 'batchcreate,storykanban');
|
||||
$lang->execution->menu->story = array('link' => "$lang->SRCommon|execution|story|executionID=%s", 'subModule' => 'story,execution', 'alias' => 'storykanban,linkstory');
|
||||
$lang->execution->menu->story = array('link' => "$lang->SRCommon|execution|story|executionID=%s", 'subModule' => 'story', 'alias' => 'storykanban,linkstory');
|
||||
$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');
|
||||
@@ -795,6 +795,8 @@ if(!helper::hasFeature('devops'))
|
||||
unset($lang->scrum->menu->devops, $lang->scrum->menuOrder[25]);
|
||||
unset($lang->waterfall->menu->devops, $lang->waterfall->menuOrder[35]);
|
||||
unset($lang->execution->menu->devops, $lang->execution->menuOrder[45]);
|
||||
unset($lang->project->noMultiple->scrum->menu->devops, $lang->project->noMultiple->scrum->menuOrder[35]);
|
||||
unset($lang->scrum->menu->settings['subMenu']->managerepo);
|
||||
}
|
||||
|
||||
if(!helper::hasFeature('kanban'))
|
||||
|
||||
@@ -56,8 +56,8 @@ $lang->custom->dept = 'Dept';
|
||||
$lang->custom->code = $lang->code;
|
||||
$lang->custom->setCode = 'Enable or Disable Code';
|
||||
$lang->custom->execution = 'Execution';
|
||||
$lang->custom->defaultProgram = 'Default program';
|
||||
$lang->custom->selectDefaultProgram = 'Please select default program';
|
||||
$lang->custom->defaultProgram = 'Default program';
|
||||
$lang->custom->modeManagement = 'Mode Management';
|
||||
|
||||
$lang->custom->unitList['efficiency'] = 'Working Hours/';
|
||||
@@ -103,6 +103,7 @@ $lang->custom->object['user'] = 'User';
|
||||
$lang->custom->object['block'] = 'ClosedBlock';
|
||||
$lang->custom->object['flow'] = 'Flow';
|
||||
$lang->custom->object['score'] = 'Score';
|
||||
$lang->custom->object['mode'] = 'Mode';
|
||||
|
||||
$lang->custom->menuOrder[5] = 'project';
|
||||
$lang->custom->menuOrder[10] = 'product';
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->custom->object['user'] = 'User';
|
||||
$lang->custom->object['block'] = 'Block';
|
||||
$lang->custom->object['flow'] = 'Flow';
|
||||
$lang->custom->object['score'] = 'Score';
|
||||
$lang->custom->object['mode'] = 'Mode';
|
||||
|
||||
$lang->custom->menuOrder[5] = 'project';
|
||||
$lang->custom->menuOrder[10] = 'product';
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->custom->object['user'] = 'Utilisateur';
|
||||
$lang->custom->object['block'] = 'Bloc';
|
||||
$lang->custom->object['flow'] = 'Flow';
|
||||
$lang->custom->object['score'] = 'Score';
|
||||
$lang->custom->object['mode'] = 'Mode';
|
||||
|
||||
$lang->custom->menuOrder[5] = 'project';
|
||||
$lang->custom->menuOrder[10] = 'product';
|
||||
|
||||
@@ -115,6 +115,9 @@ class design extends control
|
||||
$pager = pager::init(0, $recPerPage, $pageID);
|
||||
$designs = $this->design->getList($projectID, $productID, $type, $queryID, $orderBy, $pager);
|
||||
|
||||
$project = $this->loadModel('project')->getByID($projectID);
|
||||
$this->view->hiddenProduct = $project->hasProduct ? false : true;
|
||||
|
||||
$this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->browse;
|
||||
$this->view->position[] = $this->lang->design->browse;
|
||||
|
||||
|
||||
@@ -32,9 +32,9 @@
|
||||
<?php $vars = "projectID=$projectID&productID=$productID&type=$type¶m=$param&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}";?>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-left w-60px"> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
|
||||
<th class="text-left"> <?php common::printOrderLink('name', $orderBy, $vars, $lang->design->name);?></th>
|
||||
<th class="text-left w-150px"> <?php common::printOrderLink('product', $orderBy, $vars, $lang->design->product);?></th>
|
||||
<th class="text-left w-60px"> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
|
||||
<th class="text-left"> <?php common::printOrderLink('name', $orderBy, $vars, $lang->design->name);?></th>
|
||||
<th class="text-left w-150px <?php echo $hiddenProduct ? 'hidden' : '';?>"><?php common::printOrderLink('product', $orderBy, $vars, $lang->design->product);?></th>
|
||||
<th class="text-left w-100px"> <?php common::printOrderLink('type', $orderBy, $vars, $lang->design->type);?></th>
|
||||
<th class="c-assignedTo w-120px"><?php common::printOrderLink('assignedTo', $orderBy, $vars, $lang->design->assignedTo);?></th>
|
||||
<th class="text-left w-120px"> <?php common::printOrderLink('createdBy', $orderBy, $vars, $lang->design->createdByAB);?></th>
|
||||
@@ -47,7 +47,7 @@
|
||||
<tr>
|
||||
<td calss="c-id"> <?php printf('%03d', $design->id);?></td>
|
||||
<td class="c-name" title="<?php echo $design->name;?>"><?php echo common::hasPriv('design', 'view') ? html::a($this->createLink('design', 'view', "id={$design->id}"), $design->name) : $design->name;?></td>
|
||||
<td class="c-product"> <?php echo zget($products, $design->product);?></td>
|
||||
<td class="c-product <?php echo $hiddenProduct ? 'hidden' : '';?>"><?php echo zget($products, $design->product);?></td>
|
||||
<td class="c-type"> <?php echo zget($lang->design->typeList, $design->type);?></td>
|
||||
<td class="c-assignedTo"> <?php echo $this->design->printAssignedHtml($design, $users);?></td>
|
||||
<td class="c-createdBy"> <?php echo zget($users, $design->createdBy);?></td>
|
||||
@@ -55,9 +55,9 @@
|
||||
<td class='c-actions text-center'>
|
||||
<?php
|
||||
$vars = "design={$design->id}";
|
||||
common::printIcon('design', 'edit', $vars, $design, 'list', 'alter');
|
||||
common::printIcon('design', 'viewCommit', $vars, $design, 'list', 'list-alt', '', 'iframe showinonlybody', true);
|
||||
common::printIcon('design', 'delete', $vars, $design, 'list', 'trash', 'hiddenwin');
|
||||
common::printIcon('design', 'edit', $vars, $design, 'list', 'alter');
|
||||
if(helper::hasFeature('devops')) common::printIcon('design', 'viewCommit', $vars, $design, 'list', 'list-alt', '', 'iframe showinonlybody', true);
|
||||
common::printIcon('design', 'delete', $vars, $design, 'list', 'trash', 'hiddenwin');
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -291,7 +291,7 @@
|
||||
<?php if($doc->contentType == 'markdown'):?>
|
||||
<?php css::import($jsRoot . "markdown/simplemde.min.css");?>
|
||||
<?php js::import($jsRoot . 'markdown/simplemde.min.js'); ?>
|
||||
<?php js::set('markdownText', $doc->content);?>
|
||||
<?php js::set('markdownText', htmlspecialchars($doc->content));?>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
|
||||
@@ -244,7 +244,7 @@ js::set('docID', $doc->id);
|
||||
<?php if($doc->contentType == 'markdown'):?>
|
||||
<?php css::import($jsRoot . "markdown/simplemde.min.css");?>
|
||||
<?php js::import($jsRoot . 'markdown/simplemde.min.js'); ?>
|
||||
<?php js::set('markdownText', $doc->content);?>
|
||||
<?php js::set('markdownText', htmlspecialchars($doc->content));?>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
|
||||
@@ -215,6 +215,7 @@ class execution extends control
|
||||
/* Build the search form. */
|
||||
$actionURL = $this->createLink('execution', 'task', "executionID=$executionID&status=bySearch¶m=myQueryID");
|
||||
$this->config->execution->search['onMenuBar'] = 'yes';
|
||||
if(!$execution->multiple) unset($this->config->execution->search['fields']['execution']);
|
||||
$this->execution->buildTaskSearchForm($executionID, $this->executions, $queryID, $actionURL);
|
||||
|
||||
/* team member pairs. */
|
||||
@@ -685,7 +686,7 @@ class execution extends control
|
||||
unset($this->config->bug->search['fields']['resolvedDate']);
|
||||
unset($this->config->bug->search['fields']['closedDate']);
|
||||
unset($this->config->bug->search['fields']['branch']);
|
||||
if(empty($execution->multiple) && empty($execution->hasProduct)) unset($this->config->bug->search['fields']['plan']);
|
||||
if(empty($execution->multiple) and empty($execution->hasProduct)) unset($this->config->bug->search['fields']['plan']);
|
||||
if(empty($project->hasProduct))
|
||||
{
|
||||
unset($this->config->bug->search['fields']['product']);
|
||||
@@ -1685,12 +1686,12 @@ class execution extends control
|
||||
$branchGroups = $this->execution->getBranchByProduct(array_keys($products), $projectID);
|
||||
|
||||
$linkedBranches = array();
|
||||
foreach($products as $productID => $product)
|
||||
foreach($products as $productIndex => $product)
|
||||
{
|
||||
foreach($branches[$productID] as $branchID => $branch)
|
||||
foreach($branches[$productIndex] as $branchID => $branch)
|
||||
{
|
||||
$linkedBranches[$productID][$branchID] = $branchID;
|
||||
$productPlans[$productID][$branchID] = isset($plans[$productID][$branchID]) ? $plans[$productID][$branchID] : array();
|
||||
$linkedBranches[$productIndex][$branchID] = $branchID;
|
||||
$productPlans[$productIndex][$branchID] = isset($plans[$productIndex][$branchID]) ? $plans[$productIndex][$branchID] : array();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1720,12 +1721,12 @@ class execution extends control
|
||||
$plans = $this->loadModel('productplan')->getGroupByProduct(array_keys($products), 'skipParent|unexpired');
|
||||
|
||||
$linkedBranches = array();
|
||||
foreach($products as $productID => $product)
|
||||
foreach($products as $productIndex => $product)
|
||||
{
|
||||
foreach($branches[$productID] as $branchID => $branch)
|
||||
foreach($branches[$productIndex] as $branchID => $branch)
|
||||
{
|
||||
$linkedBranches[$productID][$branchID] = $branchID;
|
||||
$productPlans[$productID][$branchID] = isset($plans[$productID][$branchID]) ? $plans[$productID][$branchID] : array();
|
||||
$linkedBranches[$productIndex][$branchID] = $branchID;
|
||||
$productPlans[$productIndex][$branchID] = isset($plans[$productIndex][$branchID]) ? $plans[$productIndex][$branchID] : array();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1733,7 +1734,7 @@ class execution extends control
|
||||
$this->view->linkedBranches = $linkedBranches;
|
||||
}
|
||||
|
||||
if(empty($project->hasProduct))
|
||||
if(isset($project->hasProduct) and empty($project->hasProduct))
|
||||
{
|
||||
$shadowProduct = $this->loadModel('product')->getShadowProductByProject($project->id);
|
||||
$productPlan = $this->loadModel('productplan')->getPairs($shadowProduct->id, '0,0', 'noclosed,unexpired', true);
|
||||
@@ -1744,7 +1745,7 @@ class execution extends control
|
||||
if(isset($_POST['attribute']) and in_array($_POST['attribute'], array('request', 'design', 'review'))) unset($_POST['plans']);
|
||||
|
||||
/* No product execution link plans. */
|
||||
if(empty($project->hasProduct) and !empty($_POST['plans']))
|
||||
if(isset($project->hasProduct) and empty($project->hasProduct) and !empty($_POST['plans']))
|
||||
{
|
||||
$plansItem = array();
|
||||
foreach($_POST['plans'] as $planItem)
|
||||
|
||||
@@ -12,6 +12,8 @@ $(function()
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
if($('#executionList thead th.c-name').width() < 260) $('#executionList thead th.c-name').width(260);
|
||||
|
||||
$('#executionTableList').on('sort.sortable', function(e, data)
|
||||
{
|
||||
var list = '';
|
||||
|
||||
@@ -37,8 +37,11 @@ $(function()
|
||||
/* Assign value to the manage products by the different request type.*/
|
||||
var $product = $('#products0');
|
||||
if(copyExecutionID) productID = $product.val();
|
||||
$product.val(productID);
|
||||
$product.trigger("chosen:updated");
|
||||
if(productID)
|
||||
{
|
||||
$product.val(productID);
|
||||
$product.trigger("chosen:updated");
|
||||
}
|
||||
|
||||
var adjustMainCol = function()
|
||||
{
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[Full Feature Interface]</span> and daily office affairs in <span style='color: #0c60e1'>[Operation Management Interface]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
|
||||
$lang->misc->releaseDate['17.8'] = '2022-11-02';
|
||||
$lang->misc->releaseDate['17.7'] = '2022-10-19';
|
||||
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
|
||||
@@ -192,6 +193,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['18.0.beta1'][] = array('title' => "Multiple core processes in ZenTao are improved: A project without any product linked in is able to be created, as well as creating projects without sprints/iterations linked in; projects are able to link products beyond the father program; switch easily between ZenTao Lite mode and Full Lifecycle Management mode.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.8'][] = array('title' => "We have optimized the color of status in lists, as well as the dashboard color. At the same time, the page of the task effort has been improved.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.7'][] = array('title' => "The table is optimized in the transition version. At the same time, we have added the new feature of Work Order and get the Feedback features improved as well. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.2'][] = array('title' => "3 themes in ZenTao including Green, ZenTao Blue, and Young Blue are updated. At the same time, the attachments could be uploaded in bulk in ZenTao. Fix bugs.", 'desc' => '');
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[Full Feature Interface]</span> and daily office affairs in <span style='color: #0c60e1'>[Operation Management Interface]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
|
||||
$lang->misc->releaseDate['17.8'] = '2022-11-02';
|
||||
$lang->misc->releaseDate['17.7'] = '2022-10-19';
|
||||
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
|
||||
@@ -192,6 +193,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['18.0.beta1'][] = array('title' => "Multiple core processes in ZenTao are improved: A project without any product linked in is able to be created, as well as creating projects without sprints/iterations linked in; projects are able to link products beyond the father program; switch easily between ZenTao Lite mode and Full Lifecycle Management mode.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.8'][] = array('title' => "We have optimized the color of status in lists, as well as the dashboard color. At the same time, the page of the task effort has been improved.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.7'][] = array('title' => "The table is optimized in the transition version. At the same time, we have added the new feature of Work Order and get the Feedback features improved as well. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.2'][] = array('title' => "3 themes in ZenTao including Green, ZenTao Blue, and Young Blue are updated. At the same time, the attachments could be uploaded in bulk in ZenTao. Fix bugs.", 'desc' => '');
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[Full Feature Interface]</span> and daily office affairs in <span style='color: #0c60e1'>[Operation Management Interface]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
|
||||
$lang->misc->releaseDate['17.8'] = '2022-11-02';
|
||||
$lang->misc->releaseDate['17.7'] = '2022-10-19';
|
||||
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
|
||||
@@ -192,6 +193,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['18.0.beta1'][] = array('title' => "Multiple core processes in ZenTao are improved: A project without any product linked in is able to be created, as well as creating projects without sprints/iterations linked in; projects are able to link products beyond the father program; switch easily between ZenTao Lite mode and Full Lifecycle Management mode.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.8'][] = array('title' => "We have optimized the color of status in lists, as well as the dashboard color. At the same time, the page of the task effort has been improved.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.7'][] = array('title' => "The table is optimized in the transition version. At the same time, we have added the new feature of Work Order and get the Feedback features improved as well. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.2'][] = array('title' => "3 themes in ZenTao including Green, ZenTao Blue, and Young Blue are updated. At the same time, the attachments could be uploaded in bulk in ZenTao. Fix bugs.", 'desc' => '');
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = "<p>禅道15系列上线了全新的“
|
||||
$lang->misc->feature->visionsDesc = "<p>从16.5开始增加了界面概念,用户可以在<span style='color:#0c60e1'>[研发综合界面]</span>中处理研发事务、在<span style='color:#0c60e1'>[运营管理界面]</span>处理日常办公事务。</p><p>在头像右侧即可查看当前所处界面,点击当前界面名称可查看和切换其他的界面。</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions.png';
|
||||
|
||||
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
|
||||
$lang->misc->releaseDate['17.8'] = '2022-11-02';
|
||||
$lang->misc->releaseDate['17.7'] = '2022-10-19';
|
||||
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
|
||||
@@ -192,6 +193,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['18.0.beta1'][] = array('title' => '主要对禅道多项核心流程进行改进,新增无产品项目、无迭代项目;支持项目跨项目集关联产品;支持轻量管理模式和全生命周期管理模式进行切换。', 'desc' => '');
|
||||
$lang->misc->feature->all['17.8'][] = array('title' => '列表状态颜色、仪表盘颜色的改版和任务日志页面的优化。', 'desc' => '');
|
||||
$lang->misc->feature->all['17.7'][] = array('title' => '过渡版本表格优化完成。新增工单功能,优化了反馈功能。修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.2'][] = array('title' => '禅道更新叶兰绿、禅道蓝、青春蓝三大主题。实现附件批量上传功能。修复Bug。', 'desc' => '');
|
||||
|
||||
@@ -99,7 +99,7 @@ class programModel extends model
|
||||
$productPrograms = $this->dao->select('id, name')->from(TABLE_PROJECT)->where('type')->eq('program')->andWhere('deleted')->eq('0')->fetchPairs();
|
||||
|
||||
/* Put products of current program first.*/
|
||||
if($mode != 'assign' && $programID)
|
||||
if(!empty($products) and $mode != 'assign' and $programID)
|
||||
{
|
||||
$currentProgramProducts = $products[$programID];
|
||||
unset($products[$programID]);
|
||||
|
||||
@@ -1174,12 +1174,12 @@ class project extends control
|
||||
$products = $this->product->getProducts($projectID);
|
||||
|
||||
if(!$project->multiple) unset($this->config->bug->datatable->fieldList['execution']);
|
||||
|
||||
if(!$project->hasProduct)
|
||||
{
|
||||
unset($this->config->bug->search['fields']['product']);
|
||||
if($project->model != 'scrum') unset($this->config->bug->search['fields']['plan']);
|
||||
}
|
||||
if(!$project->multiple and !$project->hasProduct) unset($this->config->bug->search['fields']['plan']);
|
||||
|
||||
$productPairs = array('0' => $this->lang->product->all);
|
||||
foreach($products as $productData) $productPairs[$productData->id] = $productData->name;
|
||||
|
||||
@@ -23,9 +23,7 @@
|
||||
#productsBox .input-group-addon > div {display: inline-block !important;}
|
||||
#productsBox .required + .text-danger.help-text {position: relative; left: 10px;}
|
||||
#productsBox > #productNameLabel {padding-top: 8px;}
|
||||
#plansBox .row {display: inline-table; width: 102%;}
|
||||
#plansBox .col-sm-4 {float: none; display: inline-block; padding-right: 5px;}
|
||||
.futureBox {vertical-align: top !important; padding-top: 13px !important;}
|
||||
#linkPlan {padding-top: 25px !important;}
|
||||
#projectType {padding-top: 7px !important;}
|
||||
.division .icon-help {margin-left: 15px}
|
||||
|
||||
@@ -165,6 +165,7 @@ function setParentProgram(parentProgram)
|
||||
$(this).find('[name^=products]').attr('name', 'products[' + index + ']').attr('id', 'products' + index).attr('data-branch', selectedBranch).attr('data-plan', selectedPlan);
|
||||
$(this).find('[name^=products]').val(selectedProduct).chosen().change();
|
||||
});
|
||||
$('#productsBox .row .col-sm-4:last').find('.input-group').append($('#productsBox .addProduct .input-group:first .input-group-addon').prop('outerHTML'));
|
||||
}
|
||||
|
||||
if(parentProgram != 0)
|
||||
|
||||
@@ -190,8 +190,11 @@ $lang->project->typeList = array();
|
||||
$lang->project->typeList['my'] = 'Projects Ownedbyme';
|
||||
$lang->project->typeList['other'] = 'Other Projects';
|
||||
|
||||
$lang->project->divisionList['1'] = 'Create by project';
|
||||
$lang->project->divisionList['0'] = 'Create by product';
|
||||
$lang->project->divisionList['0'] = 'Create by project';
|
||||
$lang->project->divisionList['1'] = 'Create by product';
|
||||
|
||||
$lang->project->divisionSwitchList['0'] = 'Close';
|
||||
$lang->project->divisionSwitchList['1'] = "Open";
|
||||
|
||||
$lang->project->waitProjects = 'Waiting Projects';
|
||||
$lang->project->doingProjects = 'Ongoing Projects';
|
||||
@@ -208,7 +211,7 @@ $lang->project->changeProgram = '%s > Change project';
|
||||
$lang->project->changeProgramTip = 'After modifying the project set, the products linked with the project will also modify the project set to which it belongs. Please confirm whether to modify it.';
|
||||
$lang->project->linkedProjectsTip = 'Linked projects are as follows';
|
||||
$lang->project->multiLinkedProductsTip = 'The following products linked to this project are also linked to other projects, please unlink before proceeding.';
|
||||
$lang->project->noticeDivsion = "The current project is a single stage, click [Create by project] to change to multiple stages, each stage is only associated with one product.";
|
||||
$lang->project->noticeDivsion = "The current project is a single stage, click [Open] to change to multiple stages, each stage is only associated with one product.";
|
||||
$lang->project->linkStoryByPlanTips = "This action will associate all {$lang->SRCommon} under the selected plan to this project";
|
||||
$lang->project->createExecution = "There is no {$lang->executionCommon} under this project, please create {$lang->executionCommon} first";
|
||||
$lang->project->unlinkExecutionMember = "The user participated in %s executions such as %s%s. Do you want to remove the user from those executions as well? (The data related to this user will not be deleted.)";
|
||||
@@ -297,6 +300,13 @@ $lang->project->kanbanSubAclList['private'] = "Private (Only the project leader,
|
||||
$lang->project->kanbanSubAclList['open'] = "Open (accessible with project view permissions)";
|
||||
$lang->project->kanbanSubAclList['program'] = 'Open in the program (all upper-level program team leaders and stakeholders, the project leader, team members can access)';
|
||||
|
||||
global $config;
|
||||
if($config->systemMode == 'light')
|
||||
{
|
||||
unset($lang->project->subAclList['program']);
|
||||
unset($lang->project->kanbanSubAclList['program']);
|
||||
}
|
||||
|
||||
$lang->project->authList['extend'] = 'Inherit (system privilege and project privilege)';
|
||||
$lang->project->authList['reset'] = 'Reset (project privilege only)';
|
||||
|
||||
|
||||
@@ -190,8 +190,11 @@ $lang->project->typeList = array();
|
||||
$lang->project->typeList['my'] = 'Projects Ownedbyme';
|
||||
$lang->project->typeList['other'] = 'Other Projects';
|
||||
|
||||
$lang->project->divisionList['1'] = 'Create by project';
|
||||
$lang->project->divisionList['0'] = 'Create by product';
|
||||
$lang->project->divisionList['0'] = 'Create by project';
|
||||
$lang->project->divisionList['1'] = 'Create by product';
|
||||
|
||||
$lang->project->divisionSwitchList['0'] = 'Close';
|
||||
$lang->project->divisionSwitchList['1'] = "Open";
|
||||
|
||||
$lang->project->waitProjects = 'Waiting Projects';
|
||||
$lang->project->doingProjects = 'Ongoing Projects';
|
||||
@@ -208,7 +211,7 @@ $lang->project->changeProgram = '%s > Change project';
|
||||
$lang->project->changeProgramTip = 'Once the program is edited, the product that is linked to this program will be changed. Do you want to edit it?';
|
||||
$lang->project->linkedProjectsTip = 'Linked projects are as follows';
|
||||
$lang->project->multiLinkedProductsTip = 'The following products linked to this project are also linked to other projects, please unlink before proceeding.';
|
||||
$lang->project->noticeDivsion = "The current project is a single stage, click [Create by project] to change to multiple stages, each stage is only associated with one product.";
|
||||
$lang->project->noticeDivsion = "The current project is a single stage, click [Open] to change to multiple stages, each stage is only associated with one product.";
|
||||
$lang->project->linkStoryByPlanTips = "This action will associate all {$lang->SRCommon} under the selected plan to this project";
|
||||
$lang->project->createExecution = "There is no {$lang->executionCommon} under this project, please create {$lang->executionCommon} first";
|
||||
$lang->project->unlinkExecutionMember = "The user participated in %s executions such as %s%s. Do you want to remove the user from those executions as well? (The data related to this user will not be deleted.)";
|
||||
|
||||
@@ -190,8 +190,11 @@ $lang->project->typeList = array();
|
||||
$lang->project->typeList['my'] = 'Projects Ownedbyme';
|
||||
$lang->project->typeList['other'] = 'Other Projects';
|
||||
|
||||
$lang->project->divisionList['1'] = 'Create by project';
|
||||
$lang->project->divisionList['0'] = 'Create by product';
|
||||
$lang->project->divisionList['0'] = 'Create by project';
|
||||
$lang->project->divisionList['1'] = 'Create by product';
|
||||
|
||||
$lang->project->divisionSwitchList['0'] = 'Close';
|
||||
$lang->project->divisionSwitchList['1'] = "Open";
|
||||
|
||||
$lang->project->waitProjects = 'Waiting Projects';
|
||||
$lang->project->doingProjects = 'Ongoing Projects';
|
||||
@@ -208,7 +211,7 @@ $lang->project->changeProgram = '%s > Change project';
|
||||
$lang->project->changeProgramTip = 'After modifying the project set, the products linked with the project will also modify the project set to which it belongs. Please confirm whether to modify it.';
|
||||
$lang->project->linkedProjectsTip = 'Linked projects are as follows';
|
||||
$lang->project->multiLinkedProductsTip = 'The following products linked to this project are also linked to other projects, please unlink before proceeding.';
|
||||
$lang->project->noticeDivsion = "The current project is a single stage, click [Create by project] to change to multiple stages, each stage is only associated with one product.";
|
||||
$lang->project->noticeDivsion = "The current project is a single stage, click [Open] to change to multiple stages, each stage is only associated with one product.";
|
||||
$lang->project->linkStoryByPlanTips = "This action will associate all {$lang->SRCommon} under the selected plan to this project";
|
||||
$lang->project->createExecution = "There is no {$lang->executionCommon} under this project, please create {$lang->executionCommon} first";
|
||||
$lang->project->unlinkExecutionMember = "The user participated in %s executions such as %s%s. Do you want to remove the user from those executions as well? (The data related to this user will not be deleted.)";
|
||||
|
||||
@@ -193,6 +193,9 @@ $lang->project->typeList['other'] = '其他项目';
|
||||
$lang->project->divisionList['0'] = '按项目创建';
|
||||
$lang->project->divisionList['1'] = "按{$lang->productCommon}创建";
|
||||
|
||||
$lang->project->divisionSwitchList['0'] = '关闭';
|
||||
$lang->project->divisionSwitchList['1'] = "开启";
|
||||
|
||||
$lang->project->waitProjects = '未开始的项目';
|
||||
$lang->project->doingProjects = '进行中的项目';
|
||||
$lang->project->doingExecutions = '进行中的执行(最近1个)';
|
||||
@@ -208,7 +211,7 @@ $lang->project->changeProgram = '%s > 修改项目集';
|
||||
$lang->project->changeProgramTip = '修改项目集后,该项目关联产品的项目集也会被修改,请确认是否修改。';
|
||||
$lang->project->linkedProjectsTip = '关联的项目如下';
|
||||
$lang->project->multiLinkedProductsTip = '该项目关联的如下产品还关联了其他项目,请取消关联后再操作';
|
||||
$lang->project->noticeDivsion = "当前项目为单套阶段,点击[按项目创建]可以变为多套阶段,每套阶段只关联一个{$lang->productCommon}。";
|
||||
$lang->project->noticeDivsion = "当前项目为单套阶段,点击[开启]可以变为多套阶段,每套阶段只关联一个{$lang->productCommon}。";
|
||||
$lang->project->linkStoryByPlanTips = "此操作会将所选计划下面的{$lang->SRCommon}全部关联到此项目中";
|
||||
$lang->project->createExecution = "该项目下没有{$lang->executionCommon},请先创建{$lang->executionCommon}";
|
||||
$lang->project->unlinkExecutionMember = "该用户参与了%s%s%s个{$lang->execution->common},是否同时将其移除?(该用户所产生的数据不会受影响。)";
|
||||
|
||||
@@ -1,6 +1,22 @@
|
||||
<?php
|
||||
class projectModel extends model
|
||||
{
|
||||
/**
|
||||
* Check the privilege.
|
||||
*
|
||||
* @param int $projectID
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function checkPriv($projectID)
|
||||
{
|
||||
if(empty($projectID)) return false;
|
||||
|
||||
/* If is admin, return true. */
|
||||
if($this->app->user->admin) return true;
|
||||
return (strpos(",{$this->app->user->view->projects},", ",{$projectID},") !== false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Multiple linked products for project.
|
||||
*
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#swapper li {padding-top: 0; padding-bottom: 0;}
|
||||
#swapper .tree li>.list-toggle {top: -1px;}
|
||||
|
||||
#closed {width: 90px; height: 25px; line-height: 25px; background-color: #ddd; color: #3c495c; text-align: center; margin-left: 15px; border-radius: 2px;}
|
||||
div#closed {width: 90px; height: 25px; line-height: 25px; background-color: #ddd; color: #3c495c; text-align: center; margin-left: 15px; border-radius: 2px;}
|
||||
#gray-line {width:230px; height: 1px; margin-left: 10px; margin-bottom:2px; background-color: #ddd;}
|
||||
</style>
|
||||
<?php
|
||||
|
||||
@@ -25,7 +25,10 @@
|
||||
$colClass = $hasWaterfall ? 'col-xs-4' : 'col-xs-6';
|
||||
?>
|
||||
<div class='<?php echo $colClass?>'>
|
||||
<?php $tab = $from == 'global' ? 'project' : $app->tab;?>
|
||||
<?php
|
||||
$tab = $from == 'global' ? 'project' : $app->tab;
|
||||
if($tab == 'product') $tab = 'project';
|
||||
?>
|
||||
<div class='project-type text-center'>
|
||||
<?php echo html::a($this->createLink("project", "create", "model=scrum&programID=$programID©ProjectID=0&extra=productID=$productID,branchID=$branchID"), "<img class='project-type-img' data-type='scrum' src='{$config->webRoot}theme/default/images/main/scrum.png'>", '', "data-app='{$tab}' class='createButton'")?>
|
||||
<h3><?php echo $lang->project->scrum; ?></h3>
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
|
||||
<?php if(!$project->division and count($linkedProducts) == 1):?>
|
||||
<?php js::set('noticeDivsion', $lang->project->noticeDivsion);?>
|
||||
<?php js::set('divisionList', $lang->project->divisionList);?>
|
||||
<?php js::set('divisionSwitchList', $lang->project->divisionSwitchList);?>
|
||||
<script>
|
||||
$('#submit').click(function()
|
||||
{
|
||||
@@ -145,11 +145,11 @@ $('#submit').click(function()
|
||||
'message' : noticeDivsion,
|
||||
'buttons':{
|
||||
confirm:{
|
||||
label: divisionList['1'],
|
||||
label: divisionSwitchList['1'],
|
||||
className: 'btn'
|
||||
},
|
||||
cancel:{
|
||||
label: divisionList['0'],
|
||||
label: divisionSwitchList['0'],
|
||||
className: 'btn-primary'
|
||||
},
|
||||
},
|
||||
|
||||
@@ -571,11 +571,8 @@ class projectrelease extends control
|
||||
$this->loadModel('search')->setSearchParams($this->config->product->search);
|
||||
|
||||
$executionIdList = array();
|
||||
foreach($builds as $build)
|
||||
{
|
||||
if(empty($build->execution)) continue;
|
||||
$executionIdList[$build->execution] = $build->execution;
|
||||
}
|
||||
foreach($builds as $build) $executionIdList[] = empty($build->execution) ? $build->project : $build->execution;
|
||||
$executionIdList = array_unique($executionIdList);
|
||||
|
||||
$allStories = array();
|
||||
if($browseType == 'bySearch')
|
||||
|
||||
@@ -26,13 +26,18 @@
|
||||
<th><?php echo $lang->release->name;?></th>
|
||||
<td><?php echo html::input('name', '', "class='form-control' required");?></td>
|
||||
<td>
|
||||
<?php if(!$product->shadow):?>
|
||||
<div id='markerBox' class='checkbox-primary'>
|
||||
<input id='marker' name='marker' value='1' type='checkbox' />
|
||||
<label for='marker'><?php echo $lang->release->marker;?></label>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php if($lastRelease) echo '(' . $lang->release->last . ': ' . $lastRelease->name . ')';?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if($product->shadow):?>
|
||||
<?php echo html::hidden('product', $product->id);?>
|
||||
<?php else:?>
|
||||
<tr>
|
||||
<th><?php echo $lang->release->product;?></th>
|
||||
<td>
|
||||
@@ -43,6 +48,7 @@
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<th><?php echo $lang->release->build;?></th>
|
||||
<td id='buildBox'><?php echo html::select('build[]', $builds, '', "class='form-control chosen' multiple");?></td>
|
||||
|
||||
@@ -40,7 +40,7 @@ class projectStory extends control
|
||||
if($projectID)
|
||||
{
|
||||
$project = $this->loadModel('project')->getByID($projectID);
|
||||
if(!$project->hasProduct) $productID = $this->dao->select('product')->from(TABLE_PROJECTPRODUCT)->where('project')->eq($projectID)->fetch('product');
|
||||
if(!$project->hasProduct) $productID = $this->loadModel('product')->getShadowProductByProject($projectID)->id;
|
||||
}
|
||||
|
||||
$this->products = $this->loadModel('product')->getProductPairsByProject($projectID);
|
||||
|
||||
@@ -509,8 +509,14 @@ class release extends control
|
||||
$executionIdList = array();
|
||||
foreach($builds as $build)
|
||||
{
|
||||
if(empty($build->execution)) continue;
|
||||
$executionIdList[$build->execution] = $build->execution;
|
||||
if(!empty($build->execution))
|
||||
{
|
||||
$executionIdList[$build->execution] = $build->execution;
|
||||
}
|
||||
elseif(!empty($build->project))
|
||||
{
|
||||
$executionIdList[$build->project] = $build->project;
|
||||
}
|
||||
}
|
||||
|
||||
if($browseType == 'bySearch')
|
||||
|
||||
@@ -30,6 +30,7 @@ $lang->release->confirmUnlinkBug = "Möchten Sie diesen Bug löschen?";
|
||||
$lang->release->existBuild = '『Build』『%s』 existiert bereits. Sie können den 『name』 ändern oder ein anderes 『build』 wählen.';
|
||||
$lang->release->noRelease = 'Keine Releases. ';
|
||||
$lang->release->errorDate = 'The release date should not be greater than today.';
|
||||
$lang->release->tips = 'If no build is selected for a release, a build with the same name as the release is created by default.';
|
||||
|
||||
$lang->release->basicInfo = 'Basis Info';
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ $lang->release->confirmUnlinkBug = "Voulez-vous retirer ce bug de la release ?
|
||||
$lang->release->existBuild = '『Build』『%s』existant. Vous pouvez changer『name』ou choisir un『build』.';
|
||||
$lang->release->noRelease = 'Pas de release à ce jour.';
|
||||
$lang->release->errorDate = "La date de release ne doit pas être supérieure à aujourd'hui.";
|
||||
$lang->release->tips = 'If no build is selected for a release, a build with the same name as the release is created by default.';
|
||||
|
||||
$lang->release->basicInfo = 'Infos de Base';
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ class releaseModel extends model
|
||||
->page($pager)
|
||||
->fetchAll();
|
||||
|
||||
$builds = $this->dao->select("t1.id, t1.name, t1.execution, IF(t2.name IS NOT NULL, t2.name, '') AS projectName, IF(t3.name IS NOT NULL, t3.name, '{$this->lang->trunk}') AS branchName")
|
||||
$builds = $this->dao->select("t1.id, t1.name, t1.project, t1.execution, IF(t2.name IS NOT NULL, t2.name, '') AS projectName, IF(t3.name IS NOT NULL, t3.name, '{$this->lang->trunk}') AS branchName")
|
||||
->from(TABLE_BUILD)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
|
||||
->leftJoin(TABLE_BRANCH)->alias('t3')->on('t1.branch = t3.id')
|
||||
@@ -171,6 +171,7 @@ class releaseModel extends model
|
||||
->setIF($projectID, 'project', $projectID)
|
||||
->setIF($this->post->build == false, 'build', 0)
|
||||
->setDefault('stories', '')
|
||||
->setDefault('bugs', '')
|
||||
->setDefault('createdBy', $this->app->user->account)
|
||||
->setDefault('createdDate', helper::now())
|
||||
->join('build', ',')
|
||||
@@ -224,7 +225,7 @@ class releaseModel extends model
|
||||
|
||||
if($release->build)
|
||||
{
|
||||
$builds = $this->dao->select('project, branch, stories, bugs')->from(TABLE_BUILD)->where('id')->in($release->build)->fetchAll();
|
||||
$builds = $this->dao->select('id,project,branch,stories,bugs')->from(TABLE_BUILD)->where('id')->in($release->build)->fetchAll('id');
|
||||
foreach($builds as $build)
|
||||
{
|
||||
$branches[$build->branch] = $build->branch;
|
||||
@@ -238,6 +239,11 @@ class releaseModel extends model
|
||||
if($build->bugs) $release->bugs .= ',' . $build->bugs;
|
||||
}
|
||||
}
|
||||
if($this->post->sync == 'true' and $release->bugs)
|
||||
{
|
||||
$releaseBugs = $this->loadModel('bug')->getReleaseBugs(array_keys($builds), $release->product, $release->branch);
|
||||
$release->bugs = join(',', array_intersect(explode(',', $release->bugs), array_keys($releaseBugs)));
|
||||
}
|
||||
|
||||
$release->build = ',' . trim($release->build, ',') . ',';
|
||||
$release->branch = ',' . trim(implode(',', $branches), ',') . ',';
|
||||
@@ -305,6 +311,7 @@ class releaseModel extends model
|
||||
|
||||
$release = fixer::input('post')->stripTags($this->config->release->editor->edit['id'], $this->config->allowedTags)
|
||||
->add('id', $releaseID)
|
||||
->setDefault('build', '')
|
||||
->setDefault('mailto', '')
|
||||
->setDefault('deleteFiles', array())
|
||||
->join('build', ',')
|
||||
|
||||
@@ -63,6 +63,10 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$this->loadModel('project');
|
||||
$this->loadModel('execution');
|
||||
?>
|
||||
<?php foreach($releases as $release):?>
|
||||
<?php $canBeChanged = common::canBeChanged('release', $release);?>
|
||||
<?php $buildCount = count($release->builds);?>
|
||||
@@ -82,7 +86,13 @@
|
||||
<?php if($product->type != 'normal'):?>
|
||||
<span class='label label-outline label-badge'><?php echo $build->branchName;?></span>
|
||||
<?php endif;?>
|
||||
<?php echo html::a($this->createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$build->id"), $build->name);?>
|
||||
<?php
|
||||
$moduleName = $build->execution ? 'build' : 'projectbuild';
|
||||
$canClickable = false;
|
||||
if($moduleName == 'projectbuild' and $this->project->checkPriv($build->project)) $canClickable = true;
|
||||
if($moduleName == 'build' and $this->execution->checkPriv($build->execution)) $canClickable = true;
|
||||
echo $canClickable ? html::a($this->createLink($moduleName, 'view', "buildID=$build->id"), $build->name, '', "data-app='project'") : $build->name;
|
||||
?>
|
||||
</td>
|
||||
<td><?php echo $build->projectName;?></td>
|
||||
<?php if($i == 1):?>
|
||||
|
||||
@@ -356,7 +356,12 @@
|
||||
$buildHtml = array();
|
||||
foreach($release->builds as $build)
|
||||
{
|
||||
$buildHtml[] = html::a($this->createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$build->id"), $build->name, '', "data-app='project'");
|
||||
$moduleName = $build->execution ? 'build' : 'projectbuild';
|
||||
$canClickable = false;
|
||||
if($moduleName == 'projectbuild' and $this->loadModel('project')->checkPriv($build->project)) $canClickable = true;
|
||||
if($moduleName == 'build' and $this->loadModel('execution')->checkPriv($build->execution)) $canClickable = true;
|
||||
|
||||
$buildHtml[] = $canClickable ? html::a($this->createLink($moduleName, 'view', "buildID=$build->id"), $build->name, '', "data-app='project'") : $build->name;
|
||||
}
|
||||
echo join($lang->comma, $buildHtml);
|
||||
?>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
$lang->repo->common = 'Repo';
|
||||
$lang->repo->codeRepo = 'Repo';
|
||||
$lang->repo->codeRepo = 'Code Library';
|
||||
$lang->repo->browse = 'View';
|
||||
$lang->repo->viewRevision = 'View Revision';
|
||||
$lang->repo->product = 'Product';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
$lang->repo->common = 'Repo';
|
||||
$lang->repo->codeRepo = 'Repo';
|
||||
$lang->repo->codeRepo = 'Code Library';
|
||||
$lang->repo->browse = 'View';
|
||||
$lang->repo->viewRevision = 'View Revision';
|
||||
$lang->repo->product = 'Product';
|
||||
|
||||
@@ -972,6 +972,7 @@ class story extends control
|
||||
$project = $this->dao->findByID($executionID)->from(TABLE_PROJECT)->fetch();
|
||||
if($project->type == 'project')
|
||||
{
|
||||
if(!($project->model == 'scrum' and !$project->hasProduct and $project->multiple)) $this->view->hiddenPlan = true;
|
||||
$this->project->setMenu($executionID);
|
||||
}
|
||||
else
|
||||
@@ -2027,6 +2028,8 @@ class story extends control
|
||||
*/
|
||||
public function batchToTask($executionID = 0, $projectID = 0)
|
||||
{
|
||||
if($this->app->tab == 'execution' and $executionID) $this->loadModel('execution')->setMenu($executionID);
|
||||
|
||||
if(!empty($_POST['name']))
|
||||
{
|
||||
$response['result'] = 'success';
|
||||
@@ -2712,6 +2715,7 @@ class story extends control
|
||||
|
||||
$this->story->replaceURLang($storyType);
|
||||
|
||||
$this->products = $this->product->getPairs('', 0, '', 'all');
|
||||
if($this->app->tab == 'project')
|
||||
{
|
||||
$project = $this->dao->findByID($projectID)->from(TABLE_PROJECT)->fetch();
|
||||
@@ -2731,12 +2735,13 @@ class story extends control
|
||||
unset($this->lang->story->report->charts['storysPerPlan']);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->product->setMenu($productID, $branchID);
|
||||
}
|
||||
|
||||
if($storyType != 'story') unset($this->lang->story->report->charts['storysPerStage']);
|
||||
|
||||
$this->products = $this->product->getPairs('', 0, '', 'all');
|
||||
$this->product->setMenu($productID, $branchID);
|
||||
|
||||
$this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->story->reportChart;
|
||||
$this->view->position[] = $this->products[$productID];
|
||||
$this->view->position[] = $this->lang->story->reportChart;
|
||||
@@ -2783,7 +2788,7 @@ class story extends control
|
||||
$this->config->story->datatable->fieldList['plan']['dataSource'] = array('module' => 'productplan', 'method' => 'getPairs', 'params' => $productIdList);
|
||||
}
|
||||
|
||||
$this->post->set('rows', $this->story->getExportStorys($executionID, $orderBy, $storyType));
|
||||
$this->post->set('rows', $this->story->getExportStories($executionID, $orderBy, $storyType));
|
||||
$this->fetch('transfer', 'export', 'model=story');
|
||||
}
|
||||
|
||||
|
||||
@@ -3082,7 +3082,7 @@ class storyModel extends model
|
||||
}
|
||||
elseif($branch !== 'all' and $branch !== '' and strpos($storyQuery, '`branch` =') === false and $queryProductID != 'all')
|
||||
{
|
||||
$storyQuery .= " AND `branch` in($branch)";
|
||||
if($branch and strpos($storyQuery, '`branch` =') === false) $storyQuery .= " AND `branch` " . helper::dbIN($branch);
|
||||
}
|
||||
$storyQuery = preg_replace("/`plan` +LIKE +'%([0-9]+)%'/i", "CONCAT(',', `plan`, ',') LIKE '%,$1,%'", $storyQuery);
|
||||
|
||||
@@ -5882,7 +5882,7 @@ class storyModel extends model
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getExportStorys($executionID, $orderBy = 'id_desc', $storyType = 'story')
|
||||
public function getExportStories($executionID, $orderBy = 'id_desc', $storyType = 'story')
|
||||
{
|
||||
$this->loadModel('file');
|
||||
$this->loadModel('branch');
|
||||
|
||||
@@ -204,26 +204,6 @@
|
||||
<?php echo html::hidden('status', $story->status);?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if(strpos('draft,changing', $story->status) !== false and $story->type == 'story'):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->story->stage;?></th>
|
||||
<td>
|
||||
<?php
|
||||
if($story->stages and $branchTagOption)
|
||||
{
|
||||
foreach($story->stages as $branch => $stage)
|
||||
{
|
||||
if(isset($branchTagOption[$branch])) echo '<p>' . $branchTagOption[$branch] . html::select("stages[$branch]", $lang->story->stageList, $stage, "class='form-control chosen'") . '</p>';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::select('stage', $lang->story->stageList, $story->stage, "class='form-control chosen'");
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<th><?php echo $lang->story->category;?></th>
|
||||
<td><?php echo html::select('category', $lang->story->categoryList, $story->category, "class='form-control chosen'");?></td>
|
||||
|
||||
@@ -127,7 +127,7 @@ class testtask extends control
|
||||
$this->view->branch = $branch;
|
||||
$this->view->beginTime = $beginTime;
|
||||
$this->view->endTime = $endTime;
|
||||
$this->view->product = $this->product->getByID($productID);
|
||||
$this->view->product = $product;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -72,7 +72,9 @@ $status = strtolower($status);
|
||||
<th class='c-id text-left'> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
|
||||
<th class='c-name text-left'> <?php common::printOrderLink('name', $orderBy, $vars, $lang->testtask->name);?></th>
|
||||
<th class='text-left'> <?php common::printOrderLink('build', $orderBy, $vars, $lang->testtask->build);?></th>
|
||||
<?php if(!$product->shadow):?>
|
||||
<th class='text-left'> <?php common::printOrderLink('product', $orderBy, $vars, $lang->testtask->product);?></th>
|
||||
<?php endif;?>
|
||||
<th class='text-left'> <?php common::printOrderLink('execution', $orderBy, $vars, $lang->testtask->execution);?></th>
|
||||
<th class='c-status text-left'><?php common::printOrderLink('status', $orderBy, $vars, $lang->statusAB);?></th>
|
||||
<th class='c-user text-left'> <?php common::printOrderLink('owner', $orderBy, $vars, $lang->testtask->owner);?></th>
|
||||
@@ -101,7 +103,9 @@ $status = strtolower($status);
|
||||
<td><?php echo html::a(inlink('cases', "taskID=$task->id"), sprintf('%03d', $task->id));?></td>
|
||||
<td class='c-name' title="<?php echo $task->name?>"><?php echo html::a(inlink('cases', "taskID=$task->id"), $task->name);?></td>
|
||||
<td class='c-name' title="<?php echo $task->buildName?>"><?php echo ($task->build == 'trunk' || empty($task->buildName)) ? $lang->trunk : html::a($this->createLink('build', 'view', "buildID=$task->build"), $task->buildName, '', "data-group=execution");?></td>
|
||||
<?php if(!$product->shadow):?>
|
||||
<td class='c-name' title="<?php echo $task->productName?>"><?php echo $task->productName?></td>
|
||||
<?php endif;?>
|
||||
<td class='c-name' title="<?php echo $task->executionName?>"><?php echo $task->executionName?></td>
|
||||
<?php $statusName = $this->processStatus('testtask', $task);?>
|
||||
<td title='<?php echo $statusName;?>'>
|
||||
|
||||
@@ -28,6 +28,7 @@ $config->upgrade->maxVersion['max3_6_2'] = '17_6_1';
|
||||
$config->upgrade->maxVersion['max3_6_3'] = '17_6_2';
|
||||
$config->upgrade->maxVersion['max3_7'] = '17_7';
|
||||
$config->upgrade->maxVersion['max3_8'] = '17_8';
|
||||
$config->upgrade->maxVersion['max4_0_beta1'] = '18_0_beta1';
|
||||
|
||||
$config->upgrade->bizVersion = array();
|
||||
$config->upgrade->bizVersion['biz1_0'] = '9_5_1';
|
||||
@@ -94,6 +95,7 @@ $config->upgrade->bizVersion['biz7_6_1'] = '17_6_1';
|
||||
$config->upgrade->bizVersion['biz7_6_2'] = '17_6_2';
|
||||
$config->upgrade->bizVersion['biz7_7'] = '17_7';
|
||||
$config->upgrade->bizVersion['biz7_8'] = '17_8';
|
||||
$config->upgrade->bizVersion['biz8_0_beta1'] = '18_0_beta1';
|
||||
|
||||
$config->upgrade->proVersion = array();
|
||||
$config->upgrade->proVersion['pro1_0'] = '3_1';
|
||||
|
||||
@@ -140,7 +140,7 @@ $lang->upgrade->selectMode = 'Select Mode';
|
||||
$lang->upgrade->mode = 'Mode';
|
||||
$lang->upgrade->usage = 'Usage scenarios';
|
||||
$lang->upgrade->lightUsage = 'Provides the core function of project management, suitable for small R&D teams';
|
||||
$lang->upgrade->newUsage = 'The concept is more complete and rigorous, and the function is more abundant. It is suitable for medium and large R&D teams';
|
||||
$lang->upgrade->ALMUsage = 'The concept is more complete and rigorous, and the function is more abundant. It is suitable for medium and large R&D teams';
|
||||
$lang->upgrade->program = 'Program';
|
||||
$lang->upgrade->productRR = 'Product - R&D requirements';
|
||||
$lang->upgrade->productUR = 'Product - User requirements';
|
||||
|
||||
@@ -169,6 +169,7 @@ $lang->upgrade->fromVersions['17_6_1'] = '17.6.1';
|
||||
$lang->upgrade->fromVersions['17_6_2'] = '17.6.2';
|
||||
$lang->upgrade->fromVersions['17_7'] = '17.7';
|
||||
$lang->upgrade->fromVersions['17_8'] = '17.8';
|
||||
$lang->upgrade->fromVersions['18_0_beta1'] = '18.0.beta1';
|
||||
|
||||
global $config;
|
||||
/* Lite. */
|
||||
@@ -342,6 +343,7 @@ $lang->upgrade->fromVersions['biz7_6_1'] = 'Biz7.6.1';
|
||||
$lang->upgrade->fromVersions['biz7_6_2'] = 'Biz7.6.2';
|
||||
$lang->upgrade->fromVersions['biz7_7'] = 'Biz7.7';
|
||||
$lang->upgrade->fromVersions['biz7_8'] = 'Biz7.8';
|
||||
$lang->upgrade->fromVersions['biz8_0_beta1'] = 'Biz8.0.beta1';
|
||||
|
||||
/* Max. */
|
||||
$lang->upgrade->fromVersions['max2_0_beta4'] = 'Max2.0.beta4';
|
||||
@@ -371,3 +373,4 @@ $lang->upgrade->fromVersions['max3_6_1'] = 'Max3.6.1';
|
||||
$lang->upgrade->fromVersions['max3_6_2'] = 'Max3.6.2';
|
||||
$lang->upgrade->fromVersions['max3_6_3'] = 'Max3.6.3';
|
||||
$lang->upgrade->fromVersions['max3_7'] = 'Max3.7';
|
||||
$lang->upgrade->fromVersions['max3_8'] = 'Max3.8';
|
||||
|
||||
@@ -567,6 +567,15 @@ class upgradeModel extends model
|
||||
$this->execSQL($xuanxuanSql);
|
||||
}
|
||||
break;
|
||||
case '17_8':
|
||||
if(!$executedXuanxuan)
|
||||
{
|
||||
$xuanxuanSql = $this->app->getAppRoot() . 'db' . DS . 'upgradexuanxuan6.5.sql';
|
||||
$this->execSQL($xuanxuanSql);
|
||||
}
|
||||
$this->xuanSetMuteForHiddenGroups();
|
||||
$this->xuanNotifyGroupHiddenUsers();
|
||||
break;
|
||||
}
|
||||
|
||||
$this->deletePatch();
|
||||
@@ -1042,6 +1051,10 @@ class upgradeModel extends model
|
||||
$xuanxuanSql = $this->app->getAppRoot() . 'db' . DS . 'upgradexuanxuan6.4.sql';
|
||||
$confirmContent .= file_get_contents($xuanxuanSql);
|
||||
case '17_7': $confirmContent .= file_get_contents($this->getUpgradeFile('17.7'));
|
||||
case '17_8':
|
||||
$confirmContent .= file_get_contents($this->getUpgradeFile('17.8'));
|
||||
$xuanxuanSql = $this->app->getAppRoot() . 'db' . DS . 'upgradexuanxuan6.5.sql';
|
||||
$confirmContent .= file_get_contents($xuanxuanSql);
|
||||
}
|
||||
|
||||
return $confirmContent;
|
||||
@@ -7899,4 +7912,34 @@ class upgradeModel extends model
|
||||
/* Delete history module */
|
||||
$this->dao->delete()->from(TABLE_MODULE)->where('type')->eq('feedback')->andWhere('root')->eq(0)->exec();
|
||||
}
|
||||
|
||||
/**
|
||||
* Xuan: Set mute and freeze for hidden groups.
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function xuanSetMuteForHiddenGroups()
|
||||
{
|
||||
$this->dao->update(TABLE_IM_CHATUSER)->set('hide')->eq('0')->set('mute')->eq('1')->set('freeze')->eq('1')->where('hide')->eq('1')->andWhere('quit')->eq('0000-00-00 00:00:00')->exec();
|
||||
return !dao::isError();
|
||||
}
|
||||
|
||||
/**
|
||||
* Xuan: Notify users who have hide the group.
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function xuanNotifyGroupHiddenUsers()
|
||||
{
|
||||
$noticeUsers = $this->dao->select('user')->from(TABLE_IM_CHATUSER)->where('hide')->eq('1')->andWhere('quit')->eq('0000-00-00 00:00:00')->groupBy('user')->fetchAll();
|
||||
|
||||
$sender = new stdClass();
|
||||
$sender->avatar = commonModel::getSysURL() . '/www/favicon.ico';
|
||||
$sender->id = 'upgradeArchive';
|
||||
$sender->realname = $this->lang->upgrade->archiveChangeNoticeTitle;
|
||||
$this->loadModel('im')->messageCreateNotify(array_keys($noticeUsers), '', '', $this->lang->upgrade->archiveChangeNoticeContent, 'text', '', array(), $sender);
|
||||
return !dao::isError();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,3 +4,6 @@ td .passwordBox {border-left-width: 0px!important;}
|
||||
.c-id {width: 40px;}
|
||||
.c-realname, .c-visions {width: 130px;}
|
||||
.c-dept, .c-role, .c-group, .c-commiter, .c-join, .c-contact {width: 120px;}
|
||||
.c-company {width: 210px;}
|
||||
|
||||
.user-type{margin: 8px 0px 0px 8px; float: left;}
|
||||
|
||||
@@ -186,3 +186,55 @@ $(document).on('change', "select[id^='visions']", function()
|
||||
}(n)));
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Show or hide companies based on user type.
|
||||
*
|
||||
* @param type $type
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function changeType(type)
|
||||
{
|
||||
if(type == 'inside')
|
||||
{
|
||||
$('#companyBox').addClass('hide');
|
||||
$('select[id^=dept], input[id^=join]').closest('td').removeClass('hide');
|
||||
$('select[id^=company]').closest('td').addClass('hide');
|
||||
$('th.c-dept, th.c-join').removeClass('hide');
|
||||
$('th.c-company').addClass('hide');
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#companyBox').removeClass('hide');
|
||||
$('select[id^=dept], input[id^=join]').closest('td').addClass('hide');
|
||||
$('select[id^=company]').closest('td').removeClass('hide');
|
||||
$('th.c-dept, th.c-join').addClass('hide');
|
||||
$('th.c-company').removeClass('hide');
|
||||
}
|
||||
$('#userType').val(type);
|
||||
}
|
||||
|
||||
$(function()
|
||||
{
|
||||
$(":checkbox[name^='new']").change(function()
|
||||
{
|
||||
var companyNode = $(this).prop('checked') ? $(this).closest('span').prevAll('select') : $(this).closest('span').prevAll('input');
|
||||
var companyNodeID = $(companyNode).attr('id');
|
||||
var companyNodeName = $(companyNode).attr('name');
|
||||
|
||||
if($(this).prop('checked'))
|
||||
{
|
||||
$(companyNode).replaceWith("<input name='" + companyNodeName + "' id='" + companyNodeID + "' class='form-control'/>");
|
||||
$('#' + companyNodeID + '_chosen').remove();
|
||||
}
|
||||
else
|
||||
{
|
||||
var i = companyNodeID.replace(/[^0-9]/ig, '');
|
||||
var dataHtml = $(companies).attr('id', companyNodeID).attr('name', companyNodeName).prop('outerHTML');
|
||||
$('#' + companyNodeID).replaceWith(dataHtml);
|
||||
if(i == 1) $('#' + companyNodeID).find('option[value="ditto"]').remove();
|
||||
$('#' + companyNodeID).chosen();
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
+23
-5
@@ -425,9 +425,19 @@ class userModel extends model
|
||||
}
|
||||
|
||||
$data[$i] = new stdclass();
|
||||
$data[$i]->dept = $users->dept[$i] == 'ditto' ? (isset($prev['dept']) ? $prev['dept'] : 0) : $users->dept[$i];
|
||||
if($users->userType == 'outside')
|
||||
{
|
||||
$data[$i]->company = $users->company[$i] == 'ditto' ? (isset($prev['company']) ? $prev['company'] : 0) : $users->company[$i];
|
||||
$data[$i]->newCompany = isset($users->new[$i]) ? true : false;
|
||||
$data[$i]->type = 'outside';
|
||||
}
|
||||
else
|
||||
{
|
||||
$data[$i]->dept = $users->dept[$i] == 'ditto' ? (isset($prev['dept']) ? $prev['dept'] : 0) : $users->dept[$i];
|
||||
$data[$i]->join = empty($users->join[$i]) ? '0000-00-00' : ($users->join[$i]);
|
||||
$data[$i]->type = 'inside';
|
||||
}
|
||||
$data[$i]->account = $users->account[$i];
|
||||
$data[$i]->type = 'inside';
|
||||
$data[$i]->realname = $users->realname[$i];
|
||||
$data[$i]->role = $role;
|
||||
$data[$i]->group = in_array('ditto', isset($users->group[$i]) ? $users->group[$i] : array()) ? (isset($prev['group']) ? $prev['group'] : '') : $users->group[$i];
|
||||
@@ -435,7 +445,6 @@ class userModel extends model
|
||||
$data[$i]->gender = $users->gender[$i];
|
||||
$data[$i]->password = md5(trim($users->password[$i]));
|
||||
$data[$i]->commiter = $users->commiter[$i];
|
||||
$data[$i]->join = empty($users->join[$i]) ? '0000-00-00' : ($users->join[$i]);
|
||||
$data[$i]->skype = $users->skype[$i];
|
||||
$data[$i]->qq = $users->qq[$i];
|
||||
$data[$i]->dingding = $users->dingding[$i];
|
||||
@@ -474,6 +483,7 @@ class userModel extends model
|
||||
}
|
||||
|
||||
$accounts[$i] = $data[$i]->account;
|
||||
$prev['company'] = $data[$i]->company;
|
||||
$prev['dept'] = $data[$i]->dept;
|
||||
$prev['role'] = $data[$i]->role;
|
||||
$prev['group'] = $data[$i]->group;
|
||||
@@ -486,6 +496,16 @@ class userModel extends model
|
||||
$userIDList = array();
|
||||
foreach($data as $user)
|
||||
{
|
||||
if($user->type == 'outside' and $user->newCompany)
|
||||
{
|
||||
$company = new stdClass();
|
||||
$company->name = $user->company;
|
||||
$this->dao->insert(TABLE_COMPANY)->data($company)->exec();
|
||||
|
||||
$user->company = $this->dao->lastInsertID();
|
||||
}
|
||||
unset($user->newCompany);
|
||||
|
||||
if(is_array($user->group))
|
||||
{
|
||||
foreach($user->group as $group)
|
||||
@@ -547,8 +567,6 @@ class userModel extends model
|
||||
->remove('new, password1, password2, groups,verifyPassword, passwordStrength,passwordLength')
|
||||
->get();
|
||||
|
||||
/* Fix bug for api requests using json. */
|
||||
if($this->app->getViewType() == 'json') $this->post->verifyPassword = md5(md5($this->post->verifyPassword) . $this->session->rand);
|
||||
if(empty($_POST['verifyPassword']) or $this->post->verifyPassword != md5($this->app->user->password . $this->session->rand))
|
||||
{
|
||||
dao::$errors['verifyPassword'][] = $this->lang->user->error->verifyPassword;
|
||||
|
||||
@@ -13,9 +13,11 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php js::import($jsRoot . 'md5.js');?>
|
||||
<?php js::set('roleGroup', $roleGroup);?>
|
||||
<?php js::set('companies', html::select("company", $companies));?>
|
||||
<div id="mainContent" class="main-content">
|
||||
<div class="main-header">
|
||||
<h2><?php echo $lang->user->batchCreate;?></h2>
|
||||
<div class="user-type"><?php echo html::radio('type', $lang->user->typeList , 'inside', "onclick='changeType(this.value)'");?></div>
|
||||
<div class="pull-right btn-toolbar">
|
||||
<?php $customLink = $this->createLink('custom', 'ajaxSaveCustomFields', 'module=user§ion=custom&key=batchCreateFields')?>
|
||||
<?php include '../../common/view/customfield.html.php';?>
|
||||
@@ -42,11 +44,13 @@
|
||||
$showVisionList = count($visionList) > 1;
|
||||
?>
|
||||
<form method='post' class='load-indicator main-form' enctype='multipart/form-data' target='hiddenwin' id="batchCreateForm">
|
||||
<?php echo html::hidden('userType', 'inside');?>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-form">
|
||||
<thead>
|
||||
<tr class='text-center'>
|
||||
<th class='c-id'><?php echo $lang->idAB;?></th>
|
||||
<th class='c-company hide<?php echo zget($requiredFields, 'company', '', ' required');?>'><?php echo $lang->user->company;?></th>
|
||||
<th class='c-dept<?php echo zget($visibleFields, 'dept', ' hidden') . zget($requiredFields, 'dept', '', ' required');?>'> <?php echo $lang->user->dept;?></th>
|
||||
<th class='accountThWidth required'><?php echo $lang->user->account;?></th>
|
||||
<th class='c-realname required'><?php echo $lang->user->realname;?></th>
|
||||
@@ -80,6 +84,12 @@
|
||||
<?php for($i = 1; $i <= $config->user->batchCreate; $i++):?>
|
||||
<tr class='text-center'>
|
||||
<td><?php echo $i;?></td>
|
||||
<td class='text-left hide' style='overflow:visible'>
|
||||
<div class='input-group'>
|
||||
<?php echo html::select("company[$i]", $companies, $i > 1 ? 'ditto' : '', "class='form-control chosen'");?>
|
||||
<span class='input-group-addon'><?php echo html::checkBox("new[$i]", $lang->company->create);?></span>
|
||||
</div>
|
||||
</td>
|
||||
<td class='text-left<?php echo zget($visibleFields, 'dept', ' hidden')?>' style='overflow:visible'><?php echo html::select("dept[$i]", $depts, $i > 1 ? 'ditto' : $deptID, "class='form-control chosen'");?></td>
|
||||
<td><?php echo html::input("account[$i]", '', "class='form-control account_$i' onchange='changeEmail($i)'");?></td>
|
||||
<td><?php echo html::input("realname[$i]", '', "class='form-control'");?></td>
|
||||
|
||||
@@ -63,7 +63,6 @@ include $testPath. 'lib/db.class.php';
|
||||
include $testPath. 'lib/yaml.class.php';
|
||||
include $testPath. 'lib/rest.php';
|
||||
$db = new db();
|
||||
$yaml = new yaml();
|
||||
|
||||
if(!empty($config->test->account) and !empty($config->test->password) and !empty($config->test->base))
|
||||
{
|
||||
|
||||
+145
-90
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
*本文件主要进行生成每个脚本文件对应的测试数据yaml文件。
|
||||
* 本文件主要进行生成每个脚本文件对应的测试数据yaml文件。
|
||||
*
|
||||
* All request of entries should be routed by this router.
|
||||
*
|
||||
@@ -8,26 +8,29 @@
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author liyang <liyang@easycorp.ltd>
|
||||
* @package ZenTaoPMS
|
||||
* @version $Id: $
|
||||
* @version 1.0
|
||||
* @link http://www.zentao.net/
|
||||
*/
|
||||
class yaml
|
||||
|
||||
/**
|
||||
* Set fields for test data yaml file.
|
||||
*
|
||||
* @copyright Copyright 2009-2022 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
|
||||
* @author liyang <liyang@easycorp.ltd>
|
||||
* @package
|
||||
* @license LGPL
|
||||
* @version 1.0
|
||||
* @Link https://www.zentao.net
|
||||
*/
|
||||
class fields
|
||||
{
|
||||
/**
|
||||
* Global config.
|
||||
*
|
||||
* @var object
|
||||
* @access public
|
||||
*/
|
||||
public $config;
|
||||
|
||||
/**
|
||||
* Filed Arr.
|
||||
* Field Arr.
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
public $fieldArr = array();
|
||||
public $fieldArr = array();
|
||||
|
||||
/**
|
||||
* Field.
|
||||
@@ -38,41 +41,7 @@ class yaml
|
||||
private $field;
|
||||
|
||||
/**
|
||||
* Yaml Dir root.
|
||||
*
|
||||
* @var int
|
||||
* @access public
|
||||
*/
|
||||
public $yamlDir;
|
||||
|
||||
/**
|
||||
* __construct function load config.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
global $config;
|
||||
$this->config = $config;
|
||||
$this->yamlDir = dirname(__FILE__, 2) . '/model';
|
||||
}
|
||||
|
||||
/**
|
||||
* Magic method, return fild.
|
||||
*
|
||||
* @param string $property_name
|
||||
* @access protected
|
||||
* @return object
|
||||
*/
|
||||
public function __get($property_name)
|
||||
{
|
||||
$this->setField($property_name);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set yaml filed.
|
||||
* Set yaml field.
|
||||
*
|
||||
* @param string $value
|
||||
* @access public
|
||||
@@ -86,7 +55,7 @@ class yaml
|
||||
}
|
||||
|
||||
/**
|
||||
* Set filed rang.
|
||||
* Set field rang.
|
||||
*
|
||||
* @param string $range
|
||||
* @access public
|
||||
@@ -118,7 +87,7 @@ class yaml
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
function postfix($postfix)
|
||||
public function postfix($postfix)
|
||||
{
|
||||
$this->fieldArr[$this->field]['postfix'] = $postfix;
|
||||
return $this;
|
||||
@@ -131,9 +100,9 @@ class yaml
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
function type($type)
|
||||
public function type($type)
|
||||
{
|
||||
$this->fieldArr[$this->field]['type'] = $type;
|
||||
$this->fieldArr[$this->field]['type'] = $type;
|
||||
return $this;
|
||||
}
|
||||
|
||||
@@ -144,38 +113,38 @@ class yaml
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
function format($format)
|
||||
public function format($format)
|
||||
{
|
||||
$this->fieldArr[$this->field]['format'] = $format;
|
||||
$this->fieldArr[$this->field]['format'] = $format;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* set field fields.
|
||||
* Set field fields.
|
||||
*
|
||||
* @param array $fields
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
function fields($fields)
|
||||
public function setFields($fields)
|
||||
{
|
||||
if(!is_array($fields))
|
||||
{
|
||||
echo "fileds must be an array";
|
||||
echo "fields must be an array";
|
||||
return;
|
||||
}
|
||||
|
||||
$this->fieldArr[$this->field]['fields'] = $fields;
|
||||
$this->fieldArr[$this->field]['fields'] = $fields;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* get field array value.
|
||||
* Get field array.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function getField()
|
||||
public function getFields()
|
||||
{
|
||||
return $this->fieldArr;
|
||||
}
|
||||
@@ -183,18 +152,18 @@ class yaml
|
||||
/**
|
||||
* Assembly field generation rules.
|
||||
*
|
||||
* @param array $filedArr
|
||||
* @param array $fieldArr
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
function setFieldRule($filedArr)
|
||||
public function setFieldRule($fieldArr)
|
||||
{
|
||||
$ruleArr = array();
|
||||
$index = 0;
|
||||
|
||||
foreach($filedArr as $filed => $rule)
|
||||
foreach($fieldArr as $field => $rule)
|
||||
{
|
||||
$ruleArr[$index]['field'] = $filed;
|
||||
$ruleArr[$index]['field'] = $field;
|
||||
|
||||
if(array_key_exists('fields', $rule))
|
||||
{
|
||||
@@ -202,7 +171,7 @@ class yaml
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!empty($rule['range'])) $ruleArr[$index]['range'] = $rule['range'];
|
||||
if(!empty($rule['range'])) $ruleArr[$index]['range'] = $rule['range'];
|
||||
}
|
||||
|
||||
if(!empty($rule['prefix'])) $ruleArr[$index]['prefix'] = $rule['prefix'];
|
||||
@@ -214,46 +183,121 @@ class yaml
|
||||
|
||||
return $ruleArr;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create test data from yaml file.
|
||||
*
|
||||
* @copyright Copyright 2009-2022 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
|
||||
* @author liyang <liyang@easycorp.ltd>
|
||||
* @package
|
||||
* @uses field
|
||||
* @license LGPL
|
||||
* @version 1.0
|
||||
* @Link https://www.zentao.net
|
||||
*/
|
||||
class yaml
|
||||
{
|
||||
/**
|
||||
* Set fields for yaml file.
|
||||
*
|
||||
* @var int
|
||||
* @access public
|
||||
*/
|
||||
public $fields;
|
||||
|
||||
/**
|
||||
* Build yaml file.
|
||||
* Global config.
|
||||
*
|
||||
* @param string $model
|
||||
* @param string $name
|
||||
* @param string $version
|
||||
* @var object
|
||||
* @access public
|
||||
*/
|
||||
public $config;
|
||||
|
||||
/**
|
||||
* The generated data table name.
|
||||
*
|
||||
* @var string
|
||||
* @access public
|
||||
*/
|
||||
public $tableName;
|
||||
|
||||
/**
|
||||
* __construct function load config and tableName.
|
||||
* @param string $tableName
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function build($model, $name, $version = '')
|
||||
public function __construct($tableName)
|
||||
{
|
||||
if(!is_dir($this->yamlDir . "/{$model}/data")) mkdir($this->yamlDir . "/{$model}/data", 0700);
|
||||
$yamlFile = $this->yamlDir . "/{$model}/data/{$name}.yaml";
|
||||
global $config;
|
||||
$this->config = $config;
|
||||
$this->tableName = $tableName;
|
||||
$this->fields = new fields();
|
||||
}
|
||||
|
||||
/**
|
||||
* Magic method, return fild.
|
||||
*
|
||||
* @param string $property_name
|
||||
* @access protected
|
||||
* @return object
|
||||
*/
|
||||
public function __get($property_name)
|
||||
{
|
||||
$this->fields->setField($property_name);
|
||||
return $this->fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build yaml file and insert table.
|
||||
*
|
||||
* @param int $rows
|
||||
* @param string $version
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function gen($rows, $version = '')
|
||||
{
|
||||
$runFileDir = $_SERVER['PWD'];
|
||||
$runFileName = str_replace(strrchr($_SERVER['SCRIPT_FILENAME'], "."), "", $_SERVER['SCRIPT_FILENAME']);
|
||||
|
||||
if(!is_dir("$runFileDir/data")) mkdir("$runFileDir/data", 0700);
|
||||
$yamlFile = "{$runFileDir}/data/{$this->tableName}_{$runFileName}.yaml";
|
||||
|
||||
$yamlDataArr = array();
|
||||
|
||||
$yamlDataArr['title'] = "zt_{$name}";
|
||||
$yamlDataArr['author'] = "auto_{$name}";
|
||||
$yamlDataArr['title'] = "zt_{$this->tableName}";
|
||||
$yamlDataArr['author'] = "auto_{$runFileName}";
|
||||
$version ? $yamlDataArr['version'] = $version : $yamlDataArr['version'] = '1.0';
|
||||
|
||||
if(empty($this->fieldArr)) return;
|
||||
$yamlDataArr['fields'] = $this->setFieldRule($this->fieldArr);
|
||||
if(empty($this->fields->fieldArr))
|
||||
{
|
||||
$yamlFile = dirname(dirname(__FILE__)) . "/data/{$this->tableName}.yaml";
|
||||
}
|
||||
else
|
||||
{
|
||||
$yamlDataArr['fields'] = $this->fields->setFieldRule($this->fields->fieldArr);
|
||||
|
||||
yaml_emit_file($yamlFile, $yamlDataArr);
|
||||
yaml_emit_file($yamlFile, $yamlDataArr, YAML_UTF8_ENCODING);
|
||||
}
|
||||
|
||||
$this->insertDB($yamlFile, $this->tableName, $rows);
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert the data into database.
|
||||
*
|
||||
* @param string $model
|
||||
* @param string $yamlFile
|
||||
* @param string $tableName
|
||||
* @param int $rows
|
||||
* @param bool $isClear
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function insertDB($model, $file, $tableName, $rows, $isClear = false)
|
||||
function insertDB($yamlFile, $tableName, $rows, $isClear = true)
|
||||
{
|
||||
$yamlFile = $this->yamlDir . "/{$model}/data/{$file}.yaml";
|
||||
$tableSqlDir = $this->yamlDir . "/{$model}/data/sql";
|
||||
$tableSqlDir = "{$_SERVER['PWD']}/data/sql";
|
||||
|
||||
if(!is_dir($tableSqlDir)) mkdir($tableSqlDir, 0700);
|
||||
$dumpCommand = "mysqldump -u%s -p%s -h%s -P%s %s %s > {$tableSqlDir}/{$tableName}.sql";
|
||||
@@ -269,7 +313,7 @@ class yaml
|
||||
$dbUser = $this->config->db->user;
|
||||
$dbPWD = $this->config->db->password;
|
||||
|
||||
$command = "$zdPath -c %s -d %s -n %d -t %s --trim -dns mysql://%s:%s@%s:%s/%s#utf8";
|
||||
$command = "$zdPath -c %s -d %s -n %d -t %s -dns mysql://%s:%s@%s:%s/%s#utf8";
|
||||
if($isClear === true) $command .= ' --clear';
|
||||
$execYaml = sprintf($command, $configYaml, $yamlFile, $rows, $tableName, $dbUser, $dbPWD, $dbHost, $dbPort, $dbName);
|
||||
$execDump = sprintf($dumpCommand, $dbUser, $dbPWD, $dbHost, $dbPort, $dbName, $tableName);
|
||||
@@ -280,24 +324,35 @@ class yaml
|
||||
/**
|
||||
* Restore table data.
|
||||
*
|
||||
* @param string $model
|
||||
* @param string $tableName
|
||||
* @access public
|
||||
* @return mixed
|
||||
*/
|
||||
public function restoreTable($model, $tableName)
|
||||
public function restoreTable($tableName)
|
||||
{
|
||||
$tableSql = $this->yamlDir . "/{$model}/data/sql/$tableName.sql";
|
||||
$tableSql = "{$_SERVER['PWD']}/data/sql/$tableName.sql";
|
||||
if(!is_file($tableSql)) return false;
|
||||
|
||||
$dbName = $this->config->db->name;
|
||||
$dbHost = $this->config->db->host;
|
||||
$dbPort = $this->config->db->port;
|
||||
$dbUser = $this->config->db->user;
|
||||
$dbPWD = $this->config->db->password;
|
||||
$dbName = $this->config->db->name;
|
||||
$dbHost = $this->config->db->host;
|
||||
$dbPort = $this->config->db->port;
|
||||
$dbUser = $this->config->db->user;
|
||||
$dbPWD = $this->config->db->password;
|
||||
|
||||
$command = "mysql -u%s -p%s -h%s -P%s %s < %s";
|
||||
$execRestore = sprintf($command, $dbUser, $dbPWD, $dbHost, $dbPort, $dbName, $tableSql);
|
||||
system($execRestore);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return yaml class
|
||||
*
|
||||
* @param string $table
|
||||
* @access public
|
||||
* @return mixed
|
||||
*/
|
||||
function zdTable($table)
|
||||
{
|
||||
return new yaml($table);
|
||||
}
|
||||
|
||||
@@ -4,6 +4,15 @@ include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
su('admin');
|
||||
|
||||
$action = zdTable('action');
|
||||
$action->id->range('101-105');
|
||||
$action->objectType->range("product,story,productplan,release,project");
|
||||
$action->action->range("common,extra,opened,created,changed");
|
||||
$action->comment->range("1-5")->prefix("这是一个系统日志测试备注");
|
||||
$action->gen(5);
|
||||
|
||||
//zdTable('action')->gen(5);
|
||||
|
||||
/**
|
||||
|
||||
title=测试 actionModel->getById();
|
||||
@@ -18,7 +27,7 @@ pid=1
|
||||
|
||||
*/
|
||||
|
||||
$actionIDList = array('1', '2', '3', '4', '5');
|
||||
$actionIDList = array('101', '102', '103', '104', '105');
|
||||
|
||||
$action = new actionTest();
|
||||
|
||||
@@ -26,4 +35,4 @@ r($action->getByIdTest($actionIDList[0])) && p('objectType,objectId,action,comme
|
||||
r($action->getByIdTest($actionIDList[1])) && p('objectType,objectId,action,comment') && e('story,,extra,这是一个系统日志测试备注2'); // 测试获取动态2的信息
|
||||
r($action->getByIdTest($actionIDList[2])) && p('objectType,objectId,action,comment') && e('productplan,,opened,这是一个系统日志测试备注3'); // 测试获取动态3的信息
|
||||
r($action->getByIdTest($actionIDList[3])) && p('objectType,objectId,action,comment') && e('release,,created,这是一个系统日志测试备注4'); // 测试获取动态4的信息
|
||||
r($action->getByIdTest($actionIDList[4])) && p('objectType,objectId,action,comment') && e('project,,changed,这是一个系统日志测试备注5'); // 测试获取动态5的信息
|
||||
r($action->getByIdTest($actionIDList[4])) && p('objectType,objectId,action,comment') && e('project,,changed,这是一个系统日志测试备注5'); // 测试获取动态5的信息
|
||||
|
||||
@@ -75,6 +75,7 @@ $lang->cron = new stdclass();
|
||||
$lang->dev = new stdclass();
|
||||
|
||||
$moduleRoot = '../module/';
|
||||
include '../framework/helper.class.php';
|
||||
include $moduleRoot . '/group/lang/resource.php';
|
||||
foreach(glob($moduleRoot . '/group/ext/lang/zh-cn/*.php') as $resourceFile) include $resourceFile;
|
||||
foreach(glob('../xuanxuan/module/group/ext/lang/zh-cn/*.php') as $resourceFile) include $resourceFile;
|
||||
|
||||
@@ -1 +1 @@
|
||||
v6.5.0
|
||||
v6.6.0
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
6.5
|
||||
6.6
|
||||
|
||||
Reference in New Issue
Block a user