Merge branch '165_package'

This commit is contained in:
王怡栋
2022-04-01 15:30:36 +08:00
60 changed files with 4287 additions and 82 deletions
+1 -1
View File
@@ -1 +1 @@
16.5.beta1
16.5
+1 -1
View File
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
if(!function_exists('getWebRoot')){function getWebRoot(){}}
/* 基本设置。Basic settings. */
$config->version = '16.5.beta1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->version = '16.5'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->liteVersion = '1.0'; // 迅捷版版本。 The version of Lite.
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
+1
View File
@@ -250,6 +250,7 @@ $filter->project->default->cookie['lastPRJ'] = 'int';
$filter->project->default->cookie['projectMode'] = 'code';
$filter->project->default->cookie['kanbanview'] = 'code';
$filter->project->browse->cookie['involved'] = 'code';
$filter->project->export->cookie['involved'] = 'code';
$filter->project->browse->cookie['projectType'] = 'code';
$filter->project->story->cookie['storyModuleParam'] = 'int';
$filter->project->story->cookie['storyPreProjectID'] = 'int';
+8 -8
View File
@@ -377,16 +377,16 @@ INSERT INTO `zt_module` (`id`, `root`, `branch`, `name`, `parent`, `path`, `grad
(13, 1, 0, '合作洽谈', 0, ',13,', 1, 60, 'bug', '', '', '', '0'),
(14, 1, 0, '关于我们', 0, ',14,', 1, 70, 'bug', '', '', '', '0'),
(15, 6, 0, '企业管理', 0, ',15,', 1, 0, 'line', '', '', '', '0');
INSERT INTO `zt_product` (`id`, `program`, `name`, `code`, `bind`, `line`, `type`, `status`, `subStatus`, `desc`, `PO`, `QD`, `RD`, `acl`, `whitelist`, `createdBy`, `createdDate`, `createdVersion`, `order`, `deleted`, `storyConcept`) VALUES
(1, 6, '公司企业网站建设', 'companyWebsite', '0', 0, 'normal', 'normal', '', '建立公司企业网站,可以更好对外展示。<br />', 'productManager', 'testManager', 'productManager', 'open', '', 'productManager', '2012-06-05 09:57:07', '', 5, '0', 0),
(2, 6, '企业内部工时管理系统', 'workhourManage', '0', 0, 'normal', 'normal', '', '', 'productManager', 'testManager', 'productManager', 'open', '', 'productManager', '2012-06-05 11:15:20', '5.2.1', 10, '0', 0);
INSERT INTO `zt_product` (`id`, `program`, `name`, `code`, `bind`, `line`, `type`, `status`, `subStatus`, `desc`, `PO`, `QD`, `RD`, `acl`, `whitelist`, `createdBy`, `createdDate`, `createdVersion`, `order`, `deleted`) VALUES
(1, 6, '公司企业网站建设', 'companyWebsite', '0', 0, 'normal', 'normal', '', '建立公司企业网站,可以更好对外展示。<br />', 'productManager', 'testManager', 'productManager', 'open', '', 'productManager', '2012-06-05 09:57:07', '', 5, '0'),
(2, 6, '企业内部工时管理系统', 'workhourManage', '0', 0, 'normal', 'normal', '', '', 'productManager', 'testManager', 'productManager', 'open', '', 'productManager', '2012-06-05 11:15:20', '5.2.1', 10, '0');
INSERT INTO `zt_productplan` (`id`, `product`, `branch`, `parent`, `title`, `desc`, `begin`, `end`, `order`, `deleted`) VALUES
(1, 1, 0, 0, '1.0版本', '开发出企业网站1.0版本。<br />', '2020-06-05', '2021-06-04', '', '0');
INSERT INTO `zt_project` (`id`, `project`, `model`, `type`, `product`, `lifetime`, `budget`, `budgetUnit`, `attribute`, `percent`, `milestone`, `output`, `auth`, `parent`, `path`, `grade`, `name`, `code`, `begin`, `end`, `realBegan`, `realEnd`, `days`, `status`, `subStatus`, `statge`, `pri`, `desc`, `version`, `parentVersion`, `planDuration`, `realDuration`, `openedBy`, `openedDate`, `openedVersion`, `lastEditedBy`, `lastEditedDate`, `closedBy`, `closedDate`, `canceledBy`, `canceledDate`, `PO`, `PM`, `QD`, `RD`, `team`, `acl`, `whitelist`, `order`, `deleted`, `storyConcept`) VALUES
(1, 7, '', 'sprint', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,1,', 1, '企业网站第一期', 'coWeb1', '2020-06-05', '2021-12-04', '0000-00-00', '0000-00-00', 391, 'doing', '', '1', '1', '开发企业网站的基本雏形。<br />', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 5, '0', 0),
(2, 7, '', 'sprint', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,2,', 1, '企业网站第二期', 'coWebsite2', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 260, 'wait', '', '1', '1', '', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 10, '0', 0),
(7, 0, 'scrum', 'project', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', 'extend', 6, ',6,7,', 2, '企业管理系统', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', 'admin', '2021-04-28 11:22:04', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'projectManager', '', '', '', 'open', ',tester3,admin', 35, '0', 0),
(6, 0, '', 'program', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 0, ',6,', 1, '企业管理', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '', '', '', '', 'open', '', 30, '0', 0);
INSERT INTO `zt_project` (`id`, `project`, `model`, `type`, `product`, `lifetime`, `budget`, `budgetUnit`, `attribute`, `percent`, `milestone`, `output`, `auth`, `parent`, `path`, `grade`, `name`, `code`, `begin`, `end`, `realBegan`, `realEnd`, `days`, `status`, `subStatus`, `statge`, `pri`, `desc`, `version`, `parentVersion`, `planDuration`, `realDuration`, `openedBy`, `openedDate`, `openedVersion`, `lastEditedBy`, `lastEditedDate`, `closedBy`, `closedDate`, `canceledBy`, `canceledDate`, `PO`, `PM`, `QD`, `RD`, `team`, `acl`, `whitelist`, `order`, `deleted`) VALUES
(1, 7, '', 'sprint', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,1,', 1, '企业网站第一期', 'coWeb1', '2020-06-05', '2021-12-04', '0000-00-00', '0000-00-00', 391, 'doing', '', '1', '1', '开发企业网站的基本雏形。<br />', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 5, '0'),
(2, 7, '', 'sprint', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,2,', 1, '企业网站第二期', 'coWebsite2', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 260, 'wait', '', '1', '1', '', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 10, '0'),
(7, 0, 'scrum', 'project', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', 'extend', 6, ',6,7,', 2, '企业管理系统', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', 'admin', '2021-04-28 11:22:04', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'projectManager', '', '', '', 'open', ',tester3,admin', 35, '0'),
(6, 0, '', 'program', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 0, ',6,', 1, '企业管理', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '', '', '', '', 'open', '', 30, '0');
INSERT INTO `zt_projectcase` (`project`, `product`, `case`, `count`, `version`, `order`) VALUES
(1, 1, 2, 1, 1, 4),
(7, 1, 1, 1, 1, 5),
File diff suppressed because it is too large Load Diff
+12
View File
@@ -0,0 +1,12 @@
ALTER TABLE `zt_vmtemplate` ADD COLUMN `name` varchar(255) NOT NULL AFTER `id`;
ALTER TABLE `zt_vmtemplate` CHANGE COLUMN `status` `osVersion` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' AFTER `osCategory`;
ALTER TABLE `zt_vmtemplate` ADD COLUMN `osLang` varchar(50) NOT NULL AFTER `osVersion`;
ALTER TABLE `zt_vmtemplate` ADD COLUMN `osArch` varchar(50) NOT NULL AFTER `osLang`;
ALTER TABLE `zt_vmtemplate` ADD COLUMN `cpuCoreNum` smallint(4) NOT NULL DEFAULT 0 AFTER `osLang`;
ALTER TABLE `zt_vmtemplate` ADD COLUMN `memorySize` int NOT NULL DEFAULT 0 AFTER `cpuCoreNum`;
ALTER TABLE `zt_vmtemplate` ADD COLUMN `diskSize` int NOT NULL DEFAULT 0 AFTER `memorySize`;
ALTER TABLE `zt_vm` ADD COLUMN `osCpu` tinyint(2) NOT NULL DEFAULT 0 AFTER `osLang`;
ALTER TABLE `zt_vm` ADD COLUMN `osMemory` smallint(6) NOT NULL DEFAULT 0 AFTER `osCpu`;
ALTER TABLE `zt_vm` ADD COLUMN `osDisk` smallint(6) NOT NULL DEFAULT 0 AFTER `osMemory`;
ALTER TABLE `zt_vm` DROP COLUMN `ip`, DROP COLUMN `agentPort`;
ALTER TABLE `zt_vm` CHANGE COLUMN `vnc` `vncPort` int(10) NOT NULL DEFAULT 0 AFTER `heatbeat`;
+11 -4
View File
@@ -7170,10 +7170,11 @@ CREATE TABLE IF NOT EXISTS `zt_vm` (
`osType` varchar(50) NOT NULL DEFAULT '',
`osArch` varchar(50) NOT NULL DEFAULT '',
`osLang` varchar(50) NOT NULL DEFAULT '',
`osCpu` tinyint(2) NOT NULL DEFAULT 0,
`osMemory` smallint(6) NOT NULL DEFAULT 0,
`osDisk` smallint(6) NOT NULL DEFAULT 0,
`status` varchar(50) NOT NULL DEFAULT '',
`destroyAt` datetime NULL,
`ip` varchar(200) NOT NULL DEFAULT '',
`agentPort` varchar(255) NOT NULL DEFAULT '',
`macAddress` varchar(255) NOT NULL DEFAULT '',
`workspace` varchar(255) NOT NULL DEFAULT '',
`templateID` int(10) unsigned NOT NULL DEFAULT 0,
@@ -7181,7 +7182,7 @@ CREATE TABLE IF NOT EXISTS `zt_vm` (
`baseImagePath` varchar(255) NOT NULL DEFAULT '',
`desc` varchar(255) NOT NULL DEFAULT '',
`heatbeat` datetime NULL,
`vnc` varchar(255) NOT NULL DEFAULT '',
`vncPort` int(10) NOT NULL DEFAULT 0,
`instance` varchar(255) NOT NULL DEFAULT '',
`eip` varchar(255) NOT NULL DEFAULT '',
`createdBy` varchar(30) NOT NULL,
@@ -7210,11 +7211,17 @@ CREATE TABLE IF NOT EXISTS `zt_baseimage` (
-- DROP TABLE IF EXISTS `zt_vmtemplate`;
CREATE TABLE IF NOT EXISTS `zt_vmtemplate` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`hostID` int(10) unsigned NOT NULL DEFAULT 0,
`templateName` varchar(255) NOT NULL DEFAULT '',
`osType` varchar(50) NOT NULL DEFAULT '',
`osCategory` varchar(50) NOT NULL DEFAULT '',
`status` varchar(50) NOT NULL DEFAULT '',
`osVersion` varchar(50) NOT NULL DEFAULT '',
`osLang` varchar(50) NOT NULL,
`cpuCoreNum` smallint(4) NOT NULL DEFAULT 0,
`memorySize` int NOT NULL DEFAULT 0,
`diskSize` int NOT NULL DEFAULT 0,
`osArch` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_browser`;
+192
View File
@@ -1,3 +1,195 @@
2022-03-24 16.5
修复的bug
21082 泳道被删除后再还原,泳道中的任务显示了两遍
21054 看板中删除看板后没有跳转到最近执行中
21052 产品概况页面,样式显示问题
21044 已关闭执行不支持删除
21037 瀑布项目创建阶段,创建人和负责人没有同步到团队中
21036 批量创建任务页面,左侧模块选中同上后,右侧需求对应的是其他模块的需求
21029 批量创建任务页面选择需求后无法查看需求
20977 需求详情页点击迭代,样式不正确
20976 任务列表中研发需求未显示
20975 任务看板,样式问题
20930 【瀑布项目】执行设置多个产品是报错
20923 专业研发看板中提Bug保存后弹窗未关闭
20918 计划的需求列表展示需求数据不正确
20915 专业研发看板中编辑页面样式有问题
20813 批量编辑阶段会退出编辑界面
20808 产品计划关联需求页面,点击开始按钮后取消,有报错
20807 看板项目在项目集列表中显示图标不正确
20766 不启用进度管理,卡片详情/编辑页还显示进度字段
20742 不填写用户名保存后再补充用户名登录用户没有权限
20713 升级后提Bug,有版本仍显示创建发布
20661 经典模式下,右上角显示研发综合界面
20646 卡片设置为非白色时进度应该显示为白色
20645 历史已完成的卡片进度还是0%应该处理成100%
20588 安装禅道设置账号时不填写密码点击保存可以跳转至安装成功页面
20543 提Bug选择分支或切换产品后默认选中执行
20490 权限页面上执行中老看板权限没有隐藏
20457 研发综合界面全局ID搜索显示了迅捷版内容
20396 批量提Bug切换分支和执行后版本可以选择所有版本
20111 文档执行库创建执行库后跳转项目库界面报错
20098 发布关联版本时带过来的需求不会变成已发布
19709 提Bug页面,更换所属项目,影响版本没有刷新
19698 win32一键安装包中导入jira数据页面报错
19696 国际版16.4面板右下角升级页面显示有误
19680 导入jira数据设置jira和禅道关系页面下一步和返回按钮应该显示在页面下方
19662 导入jira数据,保存成功的样式已系统的不一致
19647 导入jira数据后我近期参与的项目显示重复数据
19644 设置Jira用户页面密码没有必填项标识
19577 设置Jira与禅道数据对应关系保存提示信息样式需优化
19439 富文本类型文档没有对比功能
19382 经典管理模式下,编辑已有项目不能关联新建的产品
19315 调用接口创建、修改bug重现步骤、模块不生效
19261 解决Bug时,提示所属执行不能为空
19256 看板项目下无法创建版本
19251 通用看板中子列卡片数量超出在制品限制时左侧没有间隔
19243 专业项目看板id与通用看板id重复下,通用看板可以修改自定义高度
19238 联系人图标的边框线没闭合
19074 创建空间,切换空间类型时弹窗页面抖动
19004 子列归档时下方显示了更多菜单列
18344 php8.0,看板新建卡片时不输入预计工时,点击保存提示预计不能为负数
18269 瀑布项目下创建阶段,没有把创建者添加到阶段的团队中
18018 公司名输入代码内容,导致登录时有空白弹窗提示
18017 当用户里面有中文用户名时 , 所有搜索功能无法加载
17963 没有产品权限也没有创建产品权限点击产品库提示没有产品权限
17944 API 创建的数据 触发发信通知 邮箱里面的超链接网址拼接有问题
17943 瀑布模型下已删除任务的阶段不能创建子阶段
17668 修改区域名称为特殊字符不能正确显示特殊字符
17627 已选择的干系人再次添加时不应该显示在下拉菜单里
17415 在项目--迭代页面关闭提示框会自动跳转到执行
17396 项目集中创建项目时点击选择项目管理方式后选择项目页面没关闭
17341 经典模式下研发需求分解任务时同上模块之后相关需求联动错误
17330 提需求页面创建计划弹窗大小与其他弹窗大小不一致
17284 项目集列表页创建项目后,选择项目管理方式弹窗仍存在
17264 编辑接口库名称输入空格之后保存成功且页面显示不对
17254 在项目-Bug提Bug页面刷新回调转到测试-Bug中
17191 添加执行时有多个分支保存报错提示框显示错误
17180 经典模式下任务详情所属模块换行显示
17139 头像权限问题报错
17110 项目团队成员没有项目文档主库的权限
17062 任务看板中,表格错位
17054 chrome浏览器,调整卡片显示数量,出现更多按钮
17048 数据迁移提示,相关文案需修改
17023 项目需求下,减少添加研发需求的入口
16841 优先级名称过长导致优先级名称与Bug名称重叠了
16718 需求名称控件宽度不够
16662 创建版本库没自动列出关联的产品
16646 文档的产品库中产品显示错误
16575 编辑执行页面可以关联已过期的计划需与创建关联逻辑一致
16313 经典模式升级后必填项页面展示不正确
16299 项目集下批量编辑产品负责人下拉中的closed需去掉
16264 收起左侧模块树状图后,任务、Bug等列表页面设置图标显示有问题
16207 接口库的目录和接口没有悬浮菜单
16204 文档-产品库中编辑文档,跳转到产品-文档
16114 接口库中接口切换版本后显示错误
16102 项目看板下个别项目没有显示项目集
16004 经典模式下项目编辑页面关联产品下拉没有数据
15823 安装过甘特图插件的代码,升级到15.5以上版本项目看板报错
15554 部分文档大小不显示
15517 删除项目时项目下的执行也被删除了
15269 项目文档因权限问题显示错误
15064 项目集下拉菜单鼠标悬浮闪烁
14981 点击项目集看板中的项目无法跳到相应的项目下
14595 管理执行团队复制团队项目名称过长显示错误
14573 项目集列表进度图标显示不正确
14560 产品下拉组件的样式不一致
14363 用例库中用例批量编辑的时候左上角显示为了产品名
14233 优化和统一文档无数据时的提示文案
14134 记录工时工作内容为必填项没有标注必填
14090 执行/迭代 列表页面 ,执行/迭代 代号没有展示
14050 markdown文本框中粘贴内容后部分内容未显示
13910 执行-建任务界面,返回页面错误
13884 markdown类型文档浏览显示问题
13855 未对团队人员的可用工日和可用工时/天进行校验
13345 创建文档库界面选择分组列表显示不完整
13031 不分配模块权限,文档页面还是会显示分类按钮
12951 全部折叠按钮只能折叠当前页的数据
12790 批量执行用例后,跳转的页面需要调整
12671 创建用例页面优先级超出页面
12655 恢复默认对隐藏和显示已关闭已取消列不生效
12638 Bug编辑页面相关需求下拉超出提Bug页面
12617 列表设置简单表格,在列表最下面才能滚动
12475 使用功能点估算时任务列表还是显示为工时
12419 关闭的项目中还可以创建任务
12390 编辑修改bug的解决版本后,在之前版本的解决bug列表中还会显示
12313 通过首页最新动态点击查看文档,文档详情页面无内容
12086 内禅项目需求关联需求页面中,全选操作会和ID排序同时进行
11997 批量提bug时多项录入功能导致页面卡住
11983 设置项目团队后无法访问项目
11784 项目集的投入人员列表中出现了人员名称为空的数据
11673 用户需求显示了阶段字段
11668 需求详情页历史记录中关联到的迭代无法点击
11323 产品发布详情中,遗留的Bug列表出现折行显示
11322 产品发布中,打开具体的发布详情页面,完成的研发需求列表需求出现折行显示
11138 任务列表状态字段内容显示不全
11009 多平台子需求模块无法正常编辑
2022-03-16 16.5.beta1
完成的需求
50241 增加专业研发看板中需求/任务/Bug删除功能
50240 增加Scrum看板中需求/任务/Bug删除功能
49889 提需求页面需求类别统一显示为需求类型
49888 泳道组中有多个共享列的泳道时,创建页面中增加所属泳道的选择
49886 计划的需求列表中提需求后返回计划的需求列表
49885 完善飞书工作消息通知添加Webhook之后,绑定用户页面,等待近一分钟后才打开页面的功能。
49883 单个计划增加关闭操作
49882 计划列表中子计划前增加标识
49881 计划列表中计划名称字段最小宽度250px
49880 计划富文本框中的格式在计划列表描述中格式有误
49696 专业研发看板中任务泳道实现导入Bug功能
49695 专业研发看板中实现任务的更多操作功能
49694 专业研发看板中实现Bug的更多操作功能
49693 专业研发看板中实现需求的更多操作功能
49692 设置空间页面增加空间类型的调整
49318 从用例库导入用例,确认页面分支平台栏默认同上
49303 计划未开启分支功能时,可根据浏览器高度自适应显示看板高度
49302 计划列表增加批量调整状态功能
49301 经典模式下项目列表标签后显示项目数量
49299 执行关联了多个产品时,在所有产品条件下不提供批量创建需求功能
49298 看板关联了多个产品时,在批量提需求页面中提供产品的选择功能
49297 专业研发看板在批量提交Bug页面的多产品时,提供产品的选择功能
49296 添加需求页面增加所属父需求的下拉选项
49295 系统头像中无头像时显示具体的人名
49294 已提交评审的需求在详情页中增加撤销评审按钮
49293 调整需求变更后消息通知的范围
49292 项目选择重新定义权限时创建者和负责人取系统权限
49289 计划详情信息中增加计划状态字段
49286 可以将保存的搜索条件设置为公共搜索条件
49285 通过编号搜索时可以指定多个ID进行检索
49284 搜索中增加加激活日期的条件
49283 列表中优先级P鼠标悬浮时显示为优先级
49282 执行看板中对延期执行增加已延期标识
49281 批量创建需求页面由谁评审可以默认选择同上
49280 项目看板中对延期项目增加已延期标识
修复 Bug
19646 导入的Jira数据查看执行的研发需求、设置报错
19639 导入的Jira数据任务下没有显示相关的附件
19614 从文件导入Jira数据时,不导入文件点击下一步后无法继续进行
19592 编辑需求概念弹窗保存成功提示信息样式需调整下
19565 不清空tmp下的jirafile重新导入新的数据库会有代码报错
19557 创建产品报错
19506 提交测试页面中相关测试报告只能选择当前版本下的测试报告
19471 项目集添加干系人页面显示不正确
19445 待处理下鼠标悬浮Bug标题title显示不全
19408 多分支产品导出用例模板错误
19389 看板项目中的看板新增区域选择复制自定义的区域报错
19383 集成GitLab后只能同步到1000个项目
19335 php74下进入GitLab项目列表报错
19327 研发看板下按计划关联需求页面“迭代”文案不合理
19323 用户名包含特殊字符,例如 . ,更换头像后,点保存不自动跳转
19307 项目左上角下拉框内已关闭的看板项目标题 展示不正确
19306 地盘日程添加任务、bug待办点击完成界面报错
19255 看板创建Bug显示所属执行
19249 需求概念设置页面样式不正确
19161 归档功能默认不启用
19137 无法设置禅道主题
18741 待评审需求,编辑页面没有带入关闭原因
18305 地盘创建Bug类型的日程开始待办提示Todo
17338 无权限提示,显示为英文
17336 项目关联研发需求时显示已关联的需求
17312 保存和返回按钮没表单居中
2022-02-15 16.4
完成的需求
30526 实现JIRA数据导入到禅道功能
@@ -263,3 +263,35 @@ $lang->createObjects['execution'] = 'TaskKanban';
$lang->createObjects['kanban'] = 'Kanban';
$lang->createIcons['execution'] = 'kanban';
/* Xuan */
global $config;
if(isset($config->xuanxuan) && strpos($config->visions, ',rnd,') === false)
{
$lang->xuanxuan = new stdclass();
$lang->admin->menu->xuanxuan = array('link' => 'Chat|admin|xuanxuan', 'subModule' => 'client,setting');
$lang->admin->menuOrder[6] = 'xuanxuan';
$lang->admin->menu->xuanxuan['subMenu'] = new stdclass();
$lang->admin->menu->xuanxuan['subMenu']->index = array('link' => 'Home|admin|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->setting = array('link' => 'Parameter|setting|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->update = array('link' => 'Update|client|browse', 'subModule' => 'client');
$lang->admin->menu->xuanxuan['menuOrder'][0] = 'index';
$lang->admin->menu->xuanxuan['menuOrder'][5] = 'setting';
$lang->admin->menu->xuanxuan['menuOrder'][10] = 'update';
if($config->edition != 'open')
{
$lang->admin->menu->xuanxuan['subModule'] = 'client,setting,conference';
$lang->admin->menu->xuanxuan['subMenu']->conference = array('link' => 'Conference|conference|admin');
$lang->admin->menu->xuanxuan['menuOrder'][7] = 'conference';
$lang->navGroup->conference = 'admin';
}
$lang->navGroup->im = 'admin';
$lang->navGroup->setting = 'admin';
$lang->navGroup->client = 'admin';
$lang->confirmDelete = 'Do you want to delete it?';
}
@@ -263,3 +263,35 @@ $lang->createObjects['execution'] = '任务看板';
$lang->createObjects['kanban'] = '通用看板';
$lang->createIcons['execution'] = 'kanban';
/* Xuan */
global $config;
if(isset($config->xuanxuan) && strpos($config->visions, ',rnd,') === false)
{
$lang->xuanxuan = new stdclass();
$lang->admin->menu->xuanxuan = array('link' => '聊天|admin|xuanxuan', 'subModule' => 'client,setting');
$lang->admin->menuOrder[6] = 'xuanxuan';
$lang->admin->menu->xuanxuan['subMenu'] = new stdclass();
$lang->admin->menu->xuanxuan['subMenu']->index = array('link' => '首页|admin|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->setting = array('link' => '参数|setting|xuanxuan');
$lang->admin->menu->xuanxuan['subMenu']->update = array('link' => '更新|client|browse', 'subModule' => 'client');
$lang->admin->menu->xuanxuan['menuOrder'][0] = 'index';
$lang->admin->menu->xuanxuan['menuOrder'][5] = 'setting';
$lang->admin->menu->xuanxuan['menuOrder'][10] = 'update';
if($config->edition != 'open')
{
$lang->admin->menu->xuanxuan['subModule'] = 'client,setting,conference';
$lang->admin->menu->xuanxuan['subMenu']->conference = array('link' => '音视频|conference|admin');
$lang->admin->menu->xuanxuan['menuOrder'][7] = 'conference';
$lang->navGroup->conference = 'admin';
}
$lang->navGroup->im = 'admin';
$lang->navGroup->setting = 'admin';
$lang->navGroup->client = 'admin';
$lang->confirmDelete = '您确定要执行删除操作吗?';
}
+13 -6
View File
@@ -127,13 +127,20 @@ public function getTRActions($currentMethod)
foreach($subMenu as $key => $value)
{
$tmpValue = explode('|', $value['link']);
$subMenu->{$key}['name'] = $tmpValue[0];
$subMenu->{$key}['module'] = $tmpValue[1];
$subMenu->{$key}['method'] = $tmpValue[2];
$subMenu->{$key}['vars'] = $tmpValue[3];
if(common::hasPriv('execution', $key))
{
$tmpValue = explode('|', $value['link']);
$subMenu->{$key}['name'] = $tmpValue[0];
$subMenu->{$key}['module'] = $tmpValue[1];
$subMenu->{$key}['method'] = $tmpValue[2];
$subMenu->{$key}['vars'] = $tmpValue[3];
}
else
{
unset($subMenu->$key);
}
}
$TRActions = '';
$TRActions .= "<div class='btn-group dropdown'>";
$TRActions .= html::a("javascript:;", "<i class='icon icon-" . $this->lang->execution->icons[$currentMethod]."'> </i>" . $subMenu->{$currentMethod}['name'] . " <span class='caret'></span>", '', "class='btn btn-link' data-toggle='dropdown'");
+31 -1
View File
@@ -1,4 +1,7 @@
<?php
global $config;
/* Module order. */
$lang->moduleOrder = array();
@@ -35,8 +38,27 @@ $lang->moduleOrder[200] = 'backup';
$lang->moduleOrder[205] = 'cron';
$lang->moduleOrder[215] = 'message';
/* Backup xuan related stuff. */
if(isset($config->xuanxuan))
{
$imResource = $lang->resource->im;
$clientResource = $lang->resource->client;
$settingResource = $lang->resource->setting;
}
/* Reset resource. */
$lang->resource = new stdclass();
/* Reapply xuan stuff. */
if(isset($config->xuanxuan))
{
$lang->resource->im = $imResource;
$lang->resource->client = $clientResource;
$lang->resource->setting = $settingResource;
$lang->admin->methodOrder[26] = 'xuanxuan';
$lang->setting->methodOrder[26] = 'xuanxuan';
}
/* Index module. */
$lang->resource->index = new stdclass();
$lang->resource->index->index = 'index';
@@ -127,7 +149,6 @@ $lang->personnel->methodOrder[15] = 'whitelist';
$lang->personnel->methodOrder[20] = 'addWhitelist';
$lang->personnel->methodOrder[25] = 'unbindWhitelist';
global $config;
if($config->systemMode == 'new')
{
$lang->resource->my->project = 'project';
@@ -444,6 +465,8 @@ $lang->resource->execution->unbindWhitelist = 'unbindWhitelist';
//$lang->resource->execution->storyEstimate = 'storyEstimate';
$lang->resource->execution->kanban = 'kanban';
//if($config->systemMode == 'classic') $lang->resource->project->list = 'list';
if($config->edition != 'open') $lang->resource->execution->gantt = 'ganttchart';
if($config->edition != 'open') $lang->resource->execution->calendar = 'calendar';
//$lang->execution->methodOrder[0] = 'index';
//if($config->systemMode == 'classic') $lang->project->methodOrder[1] = 'list';
@@ -498,6 +521,8 @@ $lang->execution->methodOrder[250] = 'addWhitelist';
$lang->execution->methodOrder[255] = 'unbindWhitelist';
$lang->execution->methodOrder[260] = 'storyEstimate';
$lang->execution->methodOrder[270] = 'kanban';
$lang->execution->methodOrder[280] = 'gantt';
$lang->execution->methodOrder[285] = 'calendar';
/* Task. */
$lang->resource->task = new stdclass();
@@ -791,6 +816,11 @@ $lang->admin->methodOrder[20] = 'sso';
$lang->admin->methodOrder[25] = 'register';
$lang->admin->methodOrder[30] = 'ztCompany';
if(isset($config->xuanxuan))
{
$lang->resource->admin->xuanxuan = 'xuanxuan';
}
/* Extension. */
$lang->resource->extension = new stdclass();
$lang->resource->extension->browse = 'browseAction';
@@ -0,0 +1,19 @@
<?php if($config->edition == 'biz' && $config->vision == 'lite' && trim($config->visions, ',') != 'lite'):?>
<script>
$(function()
{
$('#globalBarLogo a').eq(1).attr('title', '<?php echo str_replace('biz', $lang->bizName . ' ', $config->version);?>');
$('#globalBarLogo a .version').html('<?php echo ' ' . str_replace('biz', $lang->bizName . ' ', $config->version);?>');
$('#globalBarLogo a .upgrade').html('<?php echo $lang->maxName;?>');
})
</script>
<?php elseif($config->edition == 'max' && $config->vision == 'lite' && trim($config->visions, ',') != 'lite'):?>
<script>
$(function()
{
$('#globalBarLogo a').eq(1).attr('title', '<?php echo str_replace('max', $lang->maxName . ' ', $config->version);?>');
$('#globalBarLogo a .version').html('<?php echo ' ' . str_replace('max', $lang->maxName . ' ', $config->version);?>');
$('#globalBarLogo a .upgrade').html('<?php echo $lang->upgrade->common;?>');
})
</script>
<?php endif;?>
@@ -1,4 +1,3 @@
<script>
$('#zentaoLinks > .row > .col-sm-2').removeClass('col-sm-2').addClass('col-sm-4');
$('#mainContent tbody > tr:first-child > td.text-center > h4').text('<?php printf($lang->misc->zentao->version, $config->liteVersion);?>');
</script>
@@ -0,0 +1,3 @@
<script>
$('#plansBox').parent().remove();
</script>
@@ -37,8 +37,20 @@
</div>
<?php else:?>
<div class='kanban-cards'>
<?php
$kanbanview = 'kanban';
if($this->cookie->kanbanview) $kanbanview = $this->cookie->kanbanview;
if(!common::hasPriv('execution', $kanbanview))
{
foreach (explode('|', 'kanban|task|calendar|gantt|tree|grouptask') as $view)
{
if(common::hasPriv('execution', $view)) $kanbanview = $view; break;
}
}
?>
<?php foreach($kanbanList as $index => $kanban):?>
<div id="kanban-<?php echo $kanban->id;?>" class='kanban-card col' data-url='<?php echo $this->createLink('execution', $this->cookie->kanbanview ? $this->cookie->kanbanview : 'kanban', "kanbanID=$kanban->id");?>'>
<div id="kanban-<?php echo $kanban->id;?>" class='kanban-card col' data-url='<?php echo $this->createLink('execution', $kanbanview, "kanbanID=$kanban->id");?>'>
<div class="panel">
<div class="panel-heading">
<span class="label kanban-status-<?php echo $kanban->status;?>"><?php echo zget($lang->execution->statusList, $kanban->status);?></span>
@@ -252,7 +252,7 @@ $(function()
{
for(var num = 1; num <= 10; num++)
{
$('#lane' + num).replaceWith(data.replace('lane1', 'lane' + num));
$('#lane' + num).replaceWith(data.replace('lane1', 'lane' + num).replace('lane[1]', 'lane[' + num + ']'));
$('#lane' + num + '_chosen').remove();
$('#lane' + num).chosen();
}
@@ -1,5 +1,4 @@
<?php
#
#
# Parsedown Extra Plugin
+1 -1
View File
@@ -23,7 +23,7 @@
<h2>
<?php
$versionName = $config->version;
if($config->vision == 'lite') $versionName = $lang->liteName . $config->liteVersion;
if(trim($config->visions, ',') == 'lite') $versionName = $lang->liteName . $config->liteVersion;
printf($lang->admin->info->version, $versionName);
if($bind) echo sprintf($lang->admin->info->account, '<span class="red">' . $account . '</span>');
echo $lang->admin->info->links;
+1 -1
View File
@@ -1822,7 +1822,7 @@ class block extends control
/* load pager. */
$this->app->loadClass('pager', $static = true);
$pager = new pager(0, 3, 1);
$this->view->projects = $this->loadModel('project')->getInfoList('all', 'id_desc', $pager);
$this->view->projects = $this->loadModel('project')->getInfoList('all', 'id_desc', $pager, 1);
}
/**
@@ -44,8 +44,10 @@
<div class='col'>
<div class='panel-content'>
<div class='panel-heading not-move-handler'>
<?php $labelClass = $project->model == 'waterfall' ? 'label-warning' : 'label-info';?>
<?php if($config->systemMode == 'new'):?>
<?php $labelClass = $project->model == 'waterfall' ? 'label-warning' : 'label-info';?>
<span class='project-type-label label <?php echo $labelClass;?> label-outline'><?php echo $lang->project->{$project->model};?></span>
<?php endif;?>
<strong class='project-name' title='<?php echo $project->name;?>'> <?php echo html::a($viewLink, $project->name);?> </strong>
<nav class='panel-actions nav nav-default'>
<li class='dropdown'>
+1
View File
@@ -30,6 +30,7 @@ $lang->zentaoPMS = '禅道';
$lang->pmsName = '开源版';
$lang->proName = '专业版';
$lang->bizName = '企业版';
$lang->maxName = '旗舰版';
$lang->liteName = '迅捷版';
$lang->logoImg = 'zt-logo.png';
$lang->welcome = "%s项目管理系统";
+4 -1
View File
@@ -7,7 +7,7 @@ $.initSidebar();
<iframe frameborder='0' name='hiddenwin' id='hiddenwin' scrolling='no' class='debugwin hidden'></iframe>
<?php if($onlybody != 'yes' and $app->viewType != 'xhtml'):?>
</main><?php /* end '#wrap' in 'header.html.php'. */ ?>
<div id="noticeBox"><?php echo $this->loadModel('score')->getNotice(); ?></div>
<div id="noticeBox"><?php if($config->vision != 'lite') echo $this->loadModel('score')->getNotice(); ?></div>
<script>
<?php $this->app->loadConfig('message');?>
<?php if($config->message->browser->turnon):?>
@@ -73,6 +73,9 @@ if($this->config->vision == 'lite')
$extHookFiles = glob($extHookRule);
if($extHookFiles) foreach($extHookFiles as $extHookFile) include $extHookFile;
}
$extHookRule = $extensionRoot . 'custom/common/ext/view/footer.*.hook.php';
$extHookFiles = glob($extHookRule);
if($extHookFiles) foreach($extHookFiles as $extHookFile) include $extHookFile;
?>
</body>
</html>
+2 -2
View File
@@ -204,7 +204,8 @@ class company extends control
$pager = new pager($recTotal, $recPerPage = 50, $pageID = 1);
/* Append id for secend sort. */
$orderBy = $direction == 'next' ? 'date_desc' : 'date_asc';
if($direction == 'next') $orderBy = 'date_desc';
if($direction == 'pre') $orderBy = 'date_asc';
$queryID = ($browseType == 'bysearch') ? (int)$param : 0;
$date = empty($date) ? '' : date('Y-m-d', $date);
@@ -288,7 +289,6 @@ class company extends control
$this->view->pager = $pager;
$this->view->userID = $userID;
$this->view->param = $param;
$this->view->browseType = $browseType;
$this->view->dateGroups = $this->action->buildDateGroup($actions, $direction, $browseType, $orderBy);
$this->view->direction = $direction;
$this->display();
+2 -2
View File
@@ -1,12 +1,12 @@
$('#account, #product, #project, #execution, #orderBy').change(function()
{
var userID = $('#account').val();
var productID = $('#product').val();
var productID = $('#product').length ? $('#product').val() : 0;
var projectID = systemMode == 'new' ? $('#project').val() : 0;
var executionID = $('#execution').val();
var orderBy = $('#orderBy').val();
browseType = browseType == 'bysearch' ? 'all' : browseType;
link = createLink('company', 'dynamic', 'browseType=' + browseType + '&param=&recTotal=0&date=&direction=next&userID=' + userID + '&productID=' + productID + '&projectID=' + projectID + '&executionID=' + executionID + '&orderBy=' + orderBy);
link = createLink('company', 'dynamic', 'browseType=' + browseType + '&param=&recTotal=0&date=&direction=no&userID=' + userID + '&productID=' + productID + '&projectID=' + projectID + '&executionID=' + executionID + '&orderBy=' + orderBy);
location.href = link;
})
+4 -2
View File
@@ -233,13 +233,15 @@ $('.c-group').change(function()
*/
function createLaneMenu(options)
{
var lane = options.$trigger.closest('.kanban-lane').data('lane');
var lane = options.$trigger.closest('.kanban-lane').data('lane');
var laneCount = options.$trigger.closest('.kanban-board').children('.kanban-lane').length;
var privs = lane.actions;
if(!privs.length) return [];
var items = [];
if(privs.includes('setLane')) items.push({label: kanbanLang.setLane, icon: 'edit', url: createLink('kanban', 'setLane', 'laneID=' + lane.id + '&executionID=0&from=kanban'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '635px'}});
if(privs.includes('deleteLane')) items.push({label: kanbanLang.deleteLane, icon: 'trash', url: createLink('kanban', 'deleteLane', 'lane=' + lane.id), attrs: {'target': 'hiddenwin'}});
if(privs.includes('deleteLane') && laneCount > 1) items.push({label: kanbanLang.deleteLane, icon: 'trash', url: createLink('kanban', 'deleteLane', 'lane=' + lane.id), attrs: {'target': 'hiddenwin'}});
var bounds = options.$trigger[0].getBoundingClientRect();
items.$options = {x: bounds.right, y: bounds.top};
+6 -3
View File
@@ -246,7 +246,10 @@ class executionModel extends model
$executionID = (int)$this->cookie->lastExecution;
$executionID = in_array($executionID, array_keys($executions)) ? $executionID : key($executions);
}
if($executionID == 0 and $this->session->execution == '') $executionID = key($executions);
if($executionID == 0 and $this->session->execution) $executionID = $this->session->execution;
if($executionID == 0) $executionID = key($executions);
$this->session->set('execution', (int)$executionID, $this->app->tab);
if(!isset($executions[$executionID]))
@@ -683,12 +686,12 @@ class executionModel extends model
$projectID = isset($execution->project) ? $execution->project : $oldExecution->project;
$project = $this->project->getByID($projectID);
if($execution->begin < $project->begin)
if($project and $execution->begin < $project->begin)
{
dao::$errors['begin'] = sprintf($this->lang->execution->errorLetterProject, $project->begin);
return false;
}
if($execution->end > $project->end)
if($project and $execution->end > $project->end)
{
dao::$errors['end'] = sprintf($this->lang->execution->errorGreaterProject, $project->end);
return false;
+1 -1
View File
@@ -11,7 +11,7 @@
*/
?>
<?php if(isset($tips)):?>
<?php $defaultURL = $this->createLink('execution', 'all');?>
<?php $defaultURL = $this->createLink('execution', 'task', "execution=$executionID");?>
<?php include '../../common/view/header.html.php';?>
<body>
<div class='modal-dialog mw-500px' id='tipsModal'>
+1
View File
@@ -645,6 +645,7 @@
if(!defaultOpenUrl && location.hash.indexOf('#app=') === 0)
{
defaultOpenUrl = decodeURIComponent(location.hash.substr(5));
if(defaultOpenUrl.indexOf('#app=') < 0) defaultOpenUrl += '#app=' + ($.cookie('tab') ? $.cookie('tab') : defaultApp);
}
openTab(defaultOpenUrl ? defaultOpenUrl : defaultApp);
+1 -1
View File
@@ -82,7 +82,7 @@ js::set('showFeatures', $showFeatures);
<ul id='bars' class='nav nav-default'></ul>
<div id='poweredBy'>
<div id="globalBarLogo">
<?php if($config->vision == 'lite'):?>
<?php if(trim($config->visions, ',') == 'lite'):?>
<?php $version = $config->liteVersion;?>
<?php $versionName = $lang->liteName . $config->liteVersion;?>
<?php else:?>
+2
View File
@@ -97,6 +97,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
$lang->misc->releaseDate['16.5'] = '2022-03-24';
$lang->misc->releaseDate['16.5.beta1'] = '2022-03-16';
$lang->misc->releaseDate['16.4'] = '2022-02-15';
$lang->misc->releaseDate['16.3'] = '2022-01-26';
@@ -172,6 +173,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['16.5'][] = array('title' => 'Fix bug.', 'desc' => '');
$lang->misc->feature->all['16.5.beta1'][] = array('title' => 'Fix bug, merge all code to one package', 'desc' => '');
$lang->misc->feature->all['16.4'][] = array('title' => 'Implement JIRA import function and improve plug-in extension mechanism.', 'desc' => '');
$lang->misc->feature->all['16.3'][] = array('title' => 'Kanban adds related plan/release/version/iteration functions, and the detail experience is optimized, fix bugs.', 'desc' => '');
+2
View File
@@ -97,6 +97,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['16.5'] = '2022-03-24';
$lang->misc->releaseDate['16.5.beta1'] = '2022-03-16';
$lang->misc->releaseDate['16.4'] = '2022-02-15';
$lang->misc->releaseDate['16.3'] = '2022-01-26';
@@ -172,6 +173,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['16.5'][] = array('title' => '修复Bug。', 'desc' => '');
$lang->misc->feature->all['16.5.beta1'][] = array('title' => '将禅道收费版和开源版集成到一个包中,优化升级步骤。', 'desc' => '');
$lang->misc->feature->all['16.4'][] = array('title' => '实现JIRA导入功能,完善插件扩展机制。', 'desc' => '');
$lang->misc->feature->all['16.3'][] = array('title' => '看板增加关联计划/发布/版本/迭代功能,细节体验优化。', 'desc' => '');
+7 -1
View File
@@ -9,7 +9,13 @@
<tr>
<td class='text-center w-160px'>
<img src='<?php echo $config->webRoot . 'theme/default/images/main/' . $lang->logoImg;?>' />
<h4><?php printf($lang->misc->zentao->version, $config->version);?></h4>
<h4>
<?php if(trim($config->visions, ',') == 'lite'):?>
<?php printf($lang->misc->zentao->version, $config->liteVersion); ?>
<?php else:?>
<?php printf($lang->misc->zentao->version, $config->version); ?>
<?php endif;?>
</h4>
</td>
<td><?php include './links.html.php';?></td>
</tr>
+2 -1
View File
@@ -53,7 +53,8 @@ class project extends control
unset($fields[$key]);
}
$projects = $this->project->getInfoList($status, $orderBy);
$involved = $this->cookie->involved ? $this->cookie->involved : 0;
$projects = $this->project->getInfoList($status, $orderBy, '', $involved);
$users = $this->loadModel('user')->getPairs('noletter');
$this->loadModel('product');
+8 -3
View File
@@ -182,7 +182,11 @@ class projectModel extends model
{
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProject();
$project = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($projectID)->andWhere('`type`')->in($type)->fetch();
$project = $this->dao->select('*')->from(TABLE_PROJECT)
->where('id')->eq($projectID)
->beginIF($this->config->system == 'new')->andWhere('`type`')->in($type)->fi()
->fetch();
if(!$project) return false;
if($project->end == '0000-00-00') $project->end = '';
@@ -196,13 +200,14 @@ class projectModel extends model
* @param string $status
* @param string $orderBy
* @param int $pager
* @param int $involved
* @access public
* @return array
*/
public function getInfoList($status = 'undone', $orderBy = 'order_desc', $pager = null)
public function getInfoList($status = 'undone', $orderBy = 'order_desc', $pager = null, $involved = 0)
{
/* Init vars. */
$projects = $this->loadModel('program')->getProjectList(0, $status, 0, $orderBy, $pager, 0, 1);
$projects = $this->loadModel('program')->getProjectList(0, $status, 0, $orderBy, $pager, 0, $involved);
if(empty($projects)) return array();
$projectIdList = array_keys($projects);
+3 -2
View File
@@ -92,8 +92,8 @@
</td>
<td colspan='2'><?php echo html::radio('delta', $lang->project->endList , '', "onclick='computeEndDate(this.value)'");?></td>
</tr>
<?php $hiddenDays = $model == 'scrum' ? '' : 'hidden';?>
<tr id='daysBox' class="<?php echo $hiddenDays;?>">
<?php if($model == 'scrum'):?>
<tr id='daysBox'>
<th><?php echo $lang->execution->days;?></th>
<td>
<div class='input-group'>
@@ -102,6 +102,7 @@
</div>
</td><td></td><td></td>
</tr>
<?php endif;?>
<tr>
<th id='productTitle'><?php echo $lang->project->manageProducts;?></th>
<td class='text-left' id='productsBox' colspan="3">
+3 -2
View File
@@ -103,8 +103,8 @@
<?php $deltaValue = $project->end == LONG_TIME ? 999 : (strtotime($project->end) - strtotime($project->begin)) / 3600 / 24 + 1;?>
<td colspan='2'><?php echo html::radio('delta', $lang->project->endList , $deltaValue, "onclick='computeEndDate(this.value)'");?></td>
</tr>
<?php $hidden = ($model != 'scrum' or $project->end == LONG_TIME) ? "class='hidden'" : '';?>
<tr id='daysBox' <?php echo $hidden;?>>
<?php if($project->model == 'scrum'):?>
<tr id='daysBox' <?php if($project->end == LONG_TIME) echo "class='hidden'";?>>
<th><?php echo $lang->project->days;?></th>
<td>
<div class='input-group'>
@@ -115,6 +115,7 @@
<td></td>
<td></td>
</tr>
<?php endif;?>
<tr>
<th><?php echo $lang->project->manageProducts;?></th>
<td class='text-left' id='productsBox' colspan="3">
+1
View File
@@ -30,6 +30,7 @@
<td><?php echo html::input('realBegan', helper::today(), "class='form-control form-date'");?></td>
<td></td>
</tr>
<?php $this->printExtendFields($project, 'table', 'columns=3');?>
<tr>
<th class='w-40px'><?php echo $lang->comment;?></th>
<td colspan='2'><?php echo html::textarea('comment', '', "rows='6' class='form-control kindeditor' hidefocus='true'");?></td>
+6 -1
View File
@@ -81,6 +81,11 @@
</div>
</div>
</div>
<div class="col-sm-12">
<div class='panel'>
<?php $this->printExtendFields($project, 'div', "position=left&inForm=0");?>
</div>
</div>
<div class="col-sm-12">
<?php $blockHistory = true;?>
<?php $actionFormLink = $this->createLink('action', 'comment', "objectType=project&objectID=$project->id");?>
@@ -235,8 +240,8 @@
<p><?php echo $aclList[$project->acl];?></p>
</div>
</div>
<?php $this->printExtendFields($project, 'div', "position=right&inForm=0&inCell=1");?>
</div>
<?php $this->printExtendFields($project, 'div', "position=right&inForm=0&inCell=1");?>
</div>
</div>
</div>
+1 -1
View File
@@ -2502,7 +2502,7 @@ class story extends control
$story->reviewedBy = rtrim($story->reviewedBy, ',');
/* Set child story title. */
if($story->parent > 0 && strpos($story->title, htmlentities('>'), ENT_COMPAT | ENT_HTML401, 'UTF-8') !== 0) $story->title = '>' . $story->title;
if($story->parent > 0 && strpos($story->title, htmlentities('>', ENT_COMPAT | ENT_HTML401, 'UTF-8')) !== 0) $story->title = '>' . $story->title;
}
if($executionID)
+1
View File
@@ -23,6 +23,7 @@ class todo extends control
$this->app->loadClass('date');
$this->loadModel('task');
$this->loadModel('bug');
$this->app->loadLang('my');
}
/**
+2
View File
@@ -14,6 +14,7 @@ $config->upgrade->maxVersion['max2_6'] = '16_2';
$config->upgrade->maxVersion['max2_7'] = '16_3';
$config->upgrade->maxVersion['max2_8'] = '16_4';
$config->upgrade->maxVersion['max3_0_beta1'] = '16_5_beta1';
$config->upgrade->maxVersion['max3_0'] = '16_5';
$config->upgrade->bizVersion = array();
$config->upgrade->bizVersion['biz1_0'] = '9_5_1';
@@ -66,6 +67,7 @@ $config->upgrade->bizVersion['biz6_2'] = '16_2';
$config->upgrade->bizVersion['biz6_3'] = '16_3';
$config->upgrade->bizVersion['biz6_4'] = '16_4';
$config->upgrade->bizVersion['biz6_5_beta1'] = '16_5_beta1';
$config->upgrade->bizVersion['biz6_5'] = '16_5';
$config->upgrade->proVersion = array();
$config->upgrade->proVersion['pro1_0'] = '3_1';
+11 -5
View File
@@ -400,8 +400,8 @@ class upgrade extends control
}
/* Get no merged product and project count. */
$noMergedProductCount = $this->dao->select('count(*) as count')->from(TABLE_PRODUCT)->where('program')->eq(0)->fetch('count');
$noMergedSprintCount = $this->dao->select('count(*) as count')->from(TABLE_PROJECT)->where('grade')->eq(0)->andWhere('path')->eq('')->andWhere('type')->ne('program')->andWhere('deleted')->eq(0)->fetch('count');
$noMergedProductCount = $this->dao->select('count(*) as count')->from(TABLE_PRODUCT)->where('program')->eq(0)->andWhere('vision')->eq('rnd')->fetch('count');
$noMergedSprintCount = $this->dao->select('count(*) as count')->from(TABLE_PROJECT)->where('grade')->eq(0)->andWhere('vision')->eq('rnd')->andWhere('path')->eq('')->andWhere('type')->ne('program')->andWhere('deleted')->eq(0)->fetch('count');
/* When all products and projects merged then finish and locate afterExec page. */
if(empty($noMergedProductCount) and empty($noMergedSprintCount))
@@ -432,13 +432,14 @@ class upgrade extends control
{
$productlines = $this->dao->select('*')->from(TABLE_MODULE)->where('type')->eq('line')->andWhere('root')->eq(0)->orderBy('id_desc')->fetchAll('id');
$noMergedProducts = $this->dao->select('*')->from(TABLE_PRODUCT)->where('line')->in(array_keys($productlines))->orderBy('id_desc')->fetchAll('id');
$noMergedProducts = $this->dao->select('*')->from(TABLE_PRODUCT)->where('line')->in(array_keys($productlines))->andWhere('vision')->eq('rnd')->orderBy('id_desc')->fetchAll('id');
if(empty($productlines) || empty($noMergedProducts)) $this->locate($this->createLink('upgrade', 'mergeProgram', "type=product&programID=0&projectType=$projectType"));
$noMergedSprints = $this->dao->select('t1.*')->from(TABLE_PROJECT)->alias('t1')
->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id=t2.project')
->where('t1.project')->eq(0)
->andWhere('t1.deleted')->eq(0)
->andWhere('t1.vision')->eq('rnd')
->andWhere('t1.type')->eq('sprint')
->andWhere('t2.product')->in(array_keys($noMergedProducts))
->orderBy('t1.id_desc')
@@ -483,6 +484,7 @@ class upgrade extends control
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
->where('t2.model')->eq('')
->andWhere('t2.project')->eq(0)
->andWhere('t2.vision')->eq('rnd')
->andWhere('t2.deleted')->eq(0)
->andWhere('t2.type')->eq('sprint')
->fetchAll('id');
@@ -503,10 +505,11 @@ class upgrade extends control
$noMergedProducts = $this->dao->select('t1.*')->from(TABLE_PRODUCT)->alias('t1')
->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id=t2.product')
->where('t2.project')->in(array_keys($noMergedSprints))
->andWhere('t1.vision')->eq('rnd')
->fetchAll('id');
/* Add products without sprints. */
$noMergedProducts += $this->dao->select('*')->from(TABLE_PRODUCT)->where('program')->eq(0)->fetchAll('id');
$noMergedProducts += $this->dao->select('*')->from(TABLE_PRODUCT)->where('program')->eq(0)->andWhere('vision')->eq('rnd')->fetchAll('id');
if(empty($noMergedProducts)) $this->locate($this->createLink('upgrade', 'mergeProgram', "type=sprint&programID=0&projectType=$projectType"));
@@ -531,6 +534,7 @@ class upgrade extends control
$noMergedSprints = $this->dao->select('*')->from(TABLE_PROJECT)
->where('parent')->eq(0)
->andWhere('path')->eq('')
->andWhere('vision')->eq('rnd')
->andWhere('deleted')->eq(0)
->orderBy('id_desc')
->fetchAll('id');
@@ -548,6 +552,7 @@ class upgrade extends control
{
$noMergedSprints = $this->dao->select('*')->from(TABLE_PROJECT)
->where('parent')->eq(0)
->andWhere('vision')->eq('rnd')
->andWhere('path')->eq('')
->andWhere('deleted')->eq(0)
->orderBy('id_desc')
@@ -566,6 +571,7 @@ class upgrade extends control
$projects = $this->dao->select('t1.*,t2.product as productID')->from(TABLE_PROJECT)->alias('t1')
->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id=t2.project')
->where('t2.product')->in($productPairs)
->andWhere('t1.vision')->eq('rnd')
->andWhere('t1.type')->eq('project')
->fetchAll('productID');
@@ -578,7 +584,7 @@ class upgrade extends control
if($project) $sprint->projects[$project->id] = $project->name;
}
if(!isset($sprint->projects)) $sprint->projects = $this->dao->select('id,name')->from(TABLE_PROJECT)->where('type')->eq('project')->fetchPairs();
if(!isset($sprint->projects)) $sprint->projects = $this->dao->select('id,name')->from(TABLE_PROJECT)->where('type')->eq('project')->andWhere('vision')->eq('rnd')->fetchPairs();
}
$this->view->noMergedSprints = $noMergedSprints;
+3
View File
@@ -155,6 +155,7 @@ $lang->upgrade->fromVersions['16_2'] = '16.2';
$lang->upgrade->fromVersions['16_3'] = '16.3';
$lang->upgrade->fromVersions['16_4'] = '16.4';
$lang->upgrade->fromVersions['16_5_beta1'] = '16.5.beta1';
$lang->upgrade->fromVersions['16_5'] = '16.5';
/* Pro. */
$lang->upgrade->fromVersions['pro1_0'] = 'Pro1.0';
@@ -308,6 +309,7 @@ $lang->upgrade->fromVersions['biz6_2'] = 'Biz6.2';
$lang->upgrade->fromVersions['biz6_3'] = 'Biz6.3';
$lang->upgrade->fromVersions['biz6_4'] = 'Biz6.4';
$lang->upgrade->fromVersions['biz6_5_beta1'] = 'Biz6.5.beta1';
$lang->upgrade->fromVersions['biz6_5'] = 'Biz6.5';
/* Max. */
$lang->upgrade->fromVersions['max2_0_beta4'] = 'Max2.0.beta4';
@@ -323,3 +325,4 @@ $lang->upgrade->fromVersions['max2_5'] = 'Max2.5';
$lang->upgrade->fromVersions['max2_6'] = 'Max2.6';
$lang->upgrade->fromVersions['max2_7'] = 'Max2.7';
$lang->upgrade->fromVersions['max2_8'] = 'Max2.8';
$lang->upgrade->fromVersions['max3_0_beta1'] = 'Max3.0.beta1';
+4
View File
@@ -917,6 +917,8 @@ class upgradeModel extends model
}
$confirmContent .= file_get_contents($this->getUpgradeFile('16.4'));
case '16_5_beta1': $confirmContent .= file_get_contents($this->getUpgradeFile('16.5.beta1'));
}
return $confirmContent;
@@ -4535,6 +4537,7 @@ class upgradeModel extends model
$program->acl = isset($data->programAcl) ? $data->programAcl : 'open';
$program->days = $this->computeDaysDelta($program->begin, $program->end);
$program->PM = $data->projectType == 'project' ? $data->PM : '';
$program->vision = 'rnd';
$this->app->loadLang('program');
$this->app->loadLang('project');
@@ -4582,6 +4585,7 @@ class upgradeModel extends model
$line->order = $maxOrder;
$this->dao->insert(TABLE_MODULE)->data($line)->exec();
$lineID = $this->dao->lastInsertID();
$path = ",$lineID,";
$this->dao->update(TABLE_MODULE)->set('path')->eq($path)->where('id')->eq($lineID)->exec();
-2
View File
@@ -2732,8 +2732,6 @@ class userModel extends model
{
$visionList = $this->lang->visionList;
if($this->config->systemMode != 'new') unset($visionList['lite']);
foreach($visionList as $visionKey => $visionName)
{
if(strpos($this->config->visions, ",{$visionKey},") === false) unset($visionList[$visionKey]);
+2 -3
View File
@@ -84,9 +84,8 @@
<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>
<?php if($showVisionList):?>
<td class="<?php echo $config->systemMode == 'new' ? 'text-left' : 'text-center';?>" style='overflow:visible'>
<?php if($config->systemMode == 'new') echo html::select("visions[$i][]", $visionList, $i > 1 ? 'ditto' : (isset($visionList[$this->config->vision]) ? $this->config->vision : key($visionList)), "class='form-control chosen' multiple");?>
<?php if($config->systemMode == 'classic') echo $visionList['rnd'] . html::hidden("visions[$i][]", 'rnd');?>
<td class='text-left' style='overflow:visible'>
<?php echo html::select("visions[$i][]", $visionList, $i > 1 ? 'ditto' : (isset($visionList[$this->config->vision]) ? $this->config->vision : key($visionList)), "class='form-control chosen' multiple");?>
</td>
<?php else:?>
<?php echo html::hidden("visions[$i][]", $this->config->vision);?>
+1 -2
View File
@@ -86,8 +86,7 @@
<td><?php echo html::input("account[$user->id]", $user->account, "class='form-control'");?></td>
<td><?php echo html::input("realname[$user->id]", $user->realname, "class='form-control'");?></td>
<?php if($showVisionList):?>
<td class="<?php echo $config->systemMode == 'new' ? 'text-left' : 'text-center';?>"><?php echo $config->systemMode == 'new' ? html::select("visions[$user->id][]", $visionList, $user->visions, "class='form-control chosen' multiple") : $visionList['rnd'];?></td>
<?php if($config->systemMode == 'classic') echo html::hidden("visions[$user->id][]", 'rnd');?>
<td class='text-left'><?php echo html::select("visions[$user->id][]", $visionList, $user->visions, "class='form-control chosen' multiple");?></td>
<?php else:?>
<?php echo html::hidden("visions[$user->id][]", $this->config->vision);?>
<?php endif;?>
+2
View File
@@ -23,6 +23,8 @@ include '../../common/view/header.lite.html.php';
$moduleName = isset($lang->$module->common) ? $lang->$module->common : $module;
$methodName = isset($lang->$module->$method) ? $lang->$module->$method : $method;
if($module == 'execution' && $method == 'gantt') $methodName = $methodName->common;
/* find method name if method is lowercase letter. */
if(!isset($lang->$module->$method))
{
+1 -2
View File
@@ -82,8 +82,7 @@
<th><?php echo $lang->user->commiter;?></th>
<td><?php echo html::input('commiter', $user->commiter, "class='form-control'");?></td>
<th><?php echo $lang->user->visions;?></th>
<?php $multiple = $config->systemMode == 'new' ? 'multiple' : '';?>
<td><?php echo html::select('visions[]', $visionList, $user->visions, "class='form-control chosen' $multiple");?></td>
<td><?php echo html::select('visions[]', $visionList, $user->visions, "class='form-control chosen' multiple");?></td>
</tr>
</table>
<table align='center' class='table table-form'>
+6 -4
View File
@@ -51,9 +51,11 @@ foreach(array('zh-cn', 'en') as $langType)
/* The commands of the shell. */
$command = "cd $workDir\n";
$command .= "if [ ! -d ../$dirName ]; then unzip ../../$packPrefix.{$version}.zip -d ../ ; fi\n";
$command .= "cp -rf ../$dirName .\n";
$command .= "unzip ../../zentaobiz.php{$phpVersion}.zip -d $dirName/extension/\n";
$command .= "unzip ../../zentaomax.php{$phpVersion}.zip -d $dirName/extension/\n";
$command .= "cp -raf ../$dirName .\n";
$command .= "unzip ../../zentaobiz.php{$phpVersion}.zip\n";
$command .= "unzip ../../zentaomax.php{$phpVersion}.zip\n";
$command .= "cp -rf biz/* $dirName/\n";
$command .= "cp -rf max/* $dirName/\n";
$command .= "zip -r ../../$packPrefix.{$version}.php{$phpVersion}.zip $dirName\n";
if(!empty($liteVersion))
@@ -63,7 +65,7 @@ foreach(array('zh-cn', 'en') as $langType)
$command .= "zip -r ../../$packPrefix.{$liteVersionAB}.php{$phpVersion}.zip $dirName\n";
}
$command .= "rm -rf $dirName/\n";
$command .= "rm -rf $dirName/ biz/ max/\n";
file_put_contents($shellName, $command);
+1 -1
View File
@@ -1 +1 @@
v5.3.1
v5.3.2-rc.3
+1 -1
View File
@@ -1 +1 @@
5.3.1
5.3.2
@@ -1,5 +1,5 @@
<?php
$lang->admin->xuanxuan = 'Clien Home';
$lang->admin->xuanxuan = 'Chat Status';
$lang->admin->blockStatus = 'Status';
$lang->admin->blockStatistics = 'Statistics';
$lang->admin->xuanxuanSetting = 'Settings';
@@ -14,8 +14,8 @@ $lang->admin->xxdStartDate = 'XXD Last Start';
$lang->admin->message = array();
$lang->admin->message['total'] = 'Total Messages';
$lang->admin->message['hour'] = 'Last Hour Messages';
$lang->admin->message['day'] = 'Last 24 Hours Messages';
$lang->admin->message['hour'] = 'Last Hour Messages';
$lang->admin->message['day'] = 'Last 24 Hours Messages';
$lang->admin->sizeType = array();
$lang->admin->sizeType['K'] = 1024;
@@ -1,5 +1,5 @@
<?php
$lang->admin->xuanxuan = '客户端首页';
$lang->admin->xuanxuan = '聊天状态';
$lang->admin->blockStatus = '状态监控';
$lang->admin->blockStatistics = '系统统计';
$lang->admin->xuanxuanSetting = '参数设置';
@@ -13,9 +13,9 @@ $lang->admin->totalMessages = '消息数量';
$lang->admin->xxdStartDate = 'XXD上次启动时间';
$lang->admin->message = array();
$lang->admin->message['total'] = '总消息数';
$lang->admin->message['hour'] = '最近一小时消息数';
$lang->admin->message['day'] = '最近一天消息数';
$lang->admin->message['total'] = '总消息数';
$lang->admin->message['hour'] = '最近一小时消息数';
$lang->admin->message['day'] = '最近一天消息数';
$lang->admin->sizeType = array();
$lang->admin->sizeType['K'] = 1024;
@@ -1,6 +1,6 @@
<?php
$lang->xuanxuan = new stdclass();
$lang->admin->menu->xuanxuan = array('link' => '客户端|admin|xuanxuan', 'subModule' => 'client,setting');
$lang->admin->menu->xuanxuan = array('link' => '聊天|admin|xuanxuan', 'subModule' => 'client,setting');
$lang->admin->menuOrder[6] = 'xuanxuan';
$lang->admin->menu->xuanxuan['subMenu'] = new stdclass();
@@ -31,3 +31,8 @@ $lang->im->xxServerConfirm = 'Go to User dropmenu to download the ZenTao Deskto
$lang->im->xxdServerTip = 'XXD server address contains protocol, host and port,such as http://192.168.1.35 or http://domain. It should not be 127.0.0.1.';
$lang->im->xxdServerEmpty = 'XXD server address is empty.';
$lang->im->xxdServerError = 'XXD server address should not be 127.0.0.1.';
$lang->im->xxd->aes = 'Server-side AES';
$lang->im->xxdAESTip = 'This only affects server-side AES encryption between XXB and XXD.';
$lang->im->aesOptions['on'] = 'Enabled';
$lang->im->aesOptions['off'] = 'Disabled';
@@ -31,3 +31,8 @@ $lang->im->xxServerConfirm = '与禅道深度集成,支持成员沟通,小
$lang->im->xxdServerTip = '禅道服务器地址为完整的协议+地址+端口,示例:http://192.168.1.35 或 http://pms.zentao.com ,不能使用127.0.0.1。';
$lang->im->xxdServerEmpty = '禅道服务器地址为空。';
$lang->im->xxdServerError = '禅道服务器地址不能为 127.0.0.1。';
$lang->im->xxd->aes = '服务端通信 AES';
$lang->im->xxdAESTip = '该设置仅针对 XXB 和 XXD 之间的通讯加密,不影响客户端通讯加密。';
$lang->im->aesOptions['on'] = '开启';
$lang->im->aesOptions['off'] = '关闭';
@@ -1,6 +1,6 @@
<?php
$lang->setting->common = 'Settings';
$lang->setting->xuanxuan = 'Chat';
$lang->setting->common = 'Chat Settings';
$lang->setting->xuanxuan = 'Chat Integration';
$lang->setting->downloadXXD = 'Download XXD';
$lang->setting->langs['zh-cn'] = 'Simplified Chinese';
$lang->setting->langs['zh-tw'] = 'Traditional Chinese';
@@ -1,5 +1,5 @@
<?php
$lang->setting->common = '设置';
$lang->setting->common = '聊天设置';
$lang->setting->xuanxuan = '聊天集成';
$lang->setting->downloadXXD = '下载聊天服务端';
$lang->setting->langs['zh-cn'] = '简体';