Merge branch 'master' into cyy_bug

This commit is contained in:
caoyanyi
2023-01-04 09:34:04 +08:00
76 changed files with 5153 additions and 264 deletions
+1 -1
View File
@@ -1 +1 @@
18.0.beta3
18.0
+1 -1
View File
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
if(!function_exists('getWebRoot')){function getWebRoot(){}}
/* 基本设置。Basic settings. */
$config->version = '18.0.beta3'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->version = '18.0'; // 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.
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+2 -3
View File
File diff suppressed because one or more lines are too long
+130
View File
@@ -1,3 +1,133 @@
2023-01-03 18.0
完成的需求
开源版:
41337 创建/编辑用例支持选择自动化类型
41317 增加自动化设置的说明
41316 调整添加执行节点后的交互流程
41315 调整添加宿主机后的交互流程
41314 优化宿主机详情页面
41311 自动化设置页面增加目录和命令的说明
41310 添加/编辑执行节点表单添加说明
41309 添加/编辑宿主机表单添加说明
41256 优化批量关闭效率
41218 实现执行节点的开启/关闭功能
41124 瀑布项目阶段列表产品下拉展示已删除有阶段的产品
41067 初始化执行节点时可以安装单个服务
41008 优化执行节点的远程管理页面
40979 计划看板的卡片样式参考通用看板优化
40966 使用帮助中运行模式的内容展示
40834 在地盘仪表盘中添加区块时,将区块下拉菜单中的流程图选项改为使用帮助
40833 使用帮助中移动端下载的样式
40832 使用帮助中客户端下载的样式
40827 使用帮助中个性化设置的下拉菜单样式修改
40826 将个性化设置融入使用帮助中
40824 使用帮助中主题切换的交互
40822 使用帮助中使用界面切换的内容展示
40821 地盘仪表盘中使用帮助区块的样式
40812 将流程图融入使用帮助中的使用教程中
40809 地盘仪表盘删除流程图区块,增加使用帮助区块
40808 新用户登录禅道后,删除原弹窗引导
40806 欢迎总览页面中支持试用的版本类型调整
40801 欢迎总览页面改版
40797 欢迎总览页面背景颜色调整
40615 优化创建执行节点的交互
40524 批量执行自动化用例
40358 在宿主机列表添加初始化的引导
40352 优化初始化宿主机的交互
40350 优化创建宿主机的交互
39893 编辑执行节点
39657 浏览创建镜像进度
39656 取消下载镜像
39653 优化下载镜像的交互
39636 浏览镜像仓库
39566 有执行节点的宿主机不能删除
39564 浏览宿主机详情
39353 编写更新镜像下载状态的接口
39269 根据提供的ostype文件表的结构维护操作系统
39224 子初始化宿主机
39177 基于执行节点创建镜像
39150 宿主机网络连通性检验常用端口
39148 子编写初始化宿主机脚本
39145 从镜像创建执行节点
39143 宿主机列表添加初始化按钮
39142 调整添加和编辑执行节点页面控件
39141 调整添加和编辑执行节点页面的样式
39138 调整添加和编辑宿主机页面控件
39085 子下载镜像
39084 调整添加和编辑宿主机表单样式
39083 调整测试下二级导航栏
39061 测试自动化环境管理功能
38486 初始化执行节点
38482 用例列表添加自动化测试设置
38467 调整测试自动化导航栏交互
37820 异常状态的宿主机仅能编辑和删除
37818 禅道向执行节点发送请求时带上token
37618 浏览执行节点详情
37614 查看自动化用例执行结果
37611 执行自动化用例
36993 通过NoVNC远程操控执行节点
36991 实现删除执行节点的功能
36988 实现销毁执行节点的功能
36987 实现重启执行节点的功能
36986 实现恢复执行节点的功能
36985 实现暂停执行节点的功能
36980 实现基于宿主机添加执行节点的功能
36978 在测试自动化下增加执行节点列表页面
36965 实现删除宿主机的功能
36963 实现编辑宿主机的功能
36951 实现添加物理机资源时的校验功能
36892 在测试自动化下增加宿主机列表页面
36891 实现添加宿主机的功能
35353 测试用例列表增加查看脚本功能
35352 测试用例列表增加查看脚本按钮
35350 测试用例列表添加自动化用例标识
35349 测试用例列表可以按用例类型进行筛选
33484 主干需求的阶段仅展示主干自己的
企业版:
41220 创建孪生需求页所属模块字段根据后台配置增加必填标识
41100 全局搜索支持搜索工单数据
41010 地盘日志列表部分子段列宽调整
40923 工作流更新反馈字段和动作
40921 后台API更新反馈功能
40919 后台API支持工单功能
40880 运营管理界面的工单列表增加未关闭和全部的标签
40852 反馈切换1.5级导航/模块时,标签不切换
40618 关闭课程上传窗口时增加提示信息
40557 工单支持工作流配置
40499 工单详情页面的工单一生标签页字段优化
40495 反馈列表字段调整
40418 反馈列表批量关闭增加一个批量关闭的页面
40395 工单列表字段调整
40146 保存LDAP配置后,提示信息中增加导入用户的引导
40145 未配置LDAP时,从LDAP导入用户按钮置灰
40144 后台LDAP配置页面删除返回按钮
39733 反馈中工单菜单位置改到反馈后
39731 反馈工单创建页面样式优化
39712 运营管理界面增加工单权限
39710 运营管理界面增加工单功能
30221 反馈的审批人增加反馈负责人选项
旗舰版:
41274 运营管理界面的全局搜索支持搜索反馈和工单数据
41240 质量保证计划每次编辑可以看到之前填写的备注信息
40799 复制项目迭代信息关联产品与项目一致
禅道客户端:
40205 实现定时清理消息列表上方的旧消息
修复的Bug
28021 任务列表搜索选项“Bug来源”输入框加文案提示
29010 反馈详情页标题行不协调
29033 测试报告中bug状态颜色未修改
29041 权限分组成员维护页面复选框选中后样式不对
29226 禅道蓝主题下复选框选中后颜色与主题色不一致
29365 批量编辑研发页面,指派给字段值与删除符号重叠
29805 提Bug页面操作系统和浏览器字段样式不正确
31117 选中运行模式后,点击没反应
31123 英文下,使用帮助中运行模式样式问题
31124 从轻量模式切换到全周期,再点击轻量模式未出现弹窗
31194 英文下项目默认着陆页下拉样式不对
30084 存在偶发点击后没有跳转到相应会话的情况
27287 点击搜索结果消息记录窗口白屏问题
30697 单套阶段的瀑布项目重新关联产品后,甘特图中不显示数据
2022-12-26 18.0.beta3
完成的需求
开源版:
+3
View File
@@ -232,6 +232,7 @@ $lang->action->desc->suspend = '$date, the ZenAgent Node is suspend
$lang->action->desc->resume = '$date, the ZenAgent Node is resumed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->reboot = '$date, the ZenAgent Node is reboot by <strong>$actor</strong> .' . "\n";
$lang->action->desc->destroy = '$date, the ZenAgent Node is destroyed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->boot = '$date, the ZenAgent Node is boot by <strong>$actor</strong> .' . "\n";
$lang->action->desc->relieved = '$date, relieved by <strong>$actor</strong> .' . "\n";
$lang->action->desc->switchtolight = '$date, Switch from ALM mode to light mode by <strong>'. $lang->admin->system .'</strong>.' . "\n";
$lang->action->desc->getvnc = '$date, Remote control <strong>$extra</strong> by <strong>$actor</strong> .' . "\n";
@@ -410,6 +411,7 @@ $lang->action->label->suspend = 'suspended';
$lang->action->label->resume = 'resumed';
$lang->action->label->reboot = 'reboot';
$lang->action->label->destroy = 'destroyed';
$lang->action->label->getvnc = 'remote control';
$lang->action->label->synctwins = 'synchronized changes';
$lang->action->label->relieved = 'relieved';
$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
@@ -650,6 +652,7 @@ $lang->action->dynamicAction->zanode['created'] = 'Create Zagent Node';
$lang->action->dynamicAction->zanode['suspend'] = 'Suspend Zagent Node';
$lang->action->dynamicAction->zanode['resume'] = 'Resume Zagent Node';
$lang->action->dynamicAction->zanode['reboot'] = 'Reboot Zagent Node';
$lang->action->dynamicAction->zanode['boot'] = 'Start Zagent Node';
$lang->action->dynamicAction->zanode['destroy'] = 'Destory Zagent Node';
$lang->action->dynamicAction->doclib['created'] = 'Create Doc Library';
+3 -1
View File
@@ -232,6 +232,7 @@ $lang->action->desc->suspend = '$date, the ZenAgent Node is suspend
$lang->action->desc->resume = '$date, the ZenAgent Node is resumed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->reboot = '$date, the ZenAgent Node is reboot by <strong>$actor</strong> .' . "\n";
$lang->action->desc->destroy = '$date, the ZenAgent Node is destroyed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->boot = '$date, the ZenAgent Node is boot by <strong>$actor</strong> .' . "\n";
$lang->action->desc->relieved = '$date, relieved by <strong>$actor</strong> .' . "\n";
$lang->action->desc->switchtolight = '$date, Switch from ALM mode to light mode by <strong>'. $lang->admin->system .'</strong>.' . "\n";
$lang->action->desc->getvnc = '$date, Remote control <strong>$extra</strong> by <strong>$actor</strong> .' . "\n";
@@ -410,6 +411,7 @@ $lang->action->label->suspend = 'suspended';
$lang->action->label->resume = 'resumed';
$lang->action->label->reboot = 'reboot';
$lang->action->label->destroy = 'destroyed';
$lang->action->label->getvnc = 'remote control';
$lang->action->label->synctwins = 'synchronized changes';
$lang->action->label->relieved = 'relieved';
$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
@@ -490,7 +492,6 @@ $lang->action->dynamicAction->story['linked2release'] = 'Link Story to Re
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2revision'] = 'Link Story to Revision';
$lang->action->dynamicAction->story['unlinkedfromrevision'] = 'Unlink Story from Revision';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2build'] = 'Link Story to Build';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Unlink Story from Build';
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Unlink Project';
@@ -651,6 +652,7 @@ $lang->action->dynamicAction->zanode['created'] = 'Create Zagent Node';
$lang->action->dynamicAction->zanode['suspend'] = 'Suspend Zagent Node';
$lang->action->dynamicAction->zanode['resume'] = 'Resume Zagent Node';
$lang->action->dynamicAction->zanode['reboot'] = 'Reboot Zagent Node';
$lang->action->dynamicAction->zanode['boot'] = 'Start Zagent Node';
$lang->action->dynamicAction->zanode['destroy'] = 'Destory Zagent Node';
$lang->action->dynamicAction->doclib['created'] = 'Create Doc Library';
+62 -59
View File
@@ -232,6 +232,7 @@ $lang->action->desc->suspend = '$date, the ZenAgent Node is suspend
$lang->action->desc->resume = '$date, the ZenAgent Node is resumed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->reboot = '$date, the ZenAgent Node is reboot by <strong>$actor</strong> .' . "\n";
$lang->action->desc->destroy = '$date, the ZenAgent Node is destroyed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->boot = '$date, the ZenAgent Node is boot by <strong>$actor</strong> .' . "\n";
$lang->action->desc->relieved = '$date, relieved by <strong>$actor</strong> .' . "\n";
$lang->action->desc->switchtolight = '$date, Switch from ALM mode to light mode by <strong>'. $lang->admin->system .'</strong>.' . "\n";
$lang->action->desc->getvnc = '$date, Remote control <strong>$extra</strong> by <strong>$actor</strong> .' . "\n";
@@ -313,7 +314,7 @@ $lang->action->label->unlinkedfrombuild = "a enlevé du Build ";
$lang->action->label->linked2release = "a ajouté à une Release ";
$lang->action->label->unlinkedfromrelease = "a enlevé de la Release ";
$lang->action->label->linked2revision = "Link Revision";
$lang->action->label->unlinked2revision = "Unlink Revision";
$lang->action->label->unlinkedfromrevision = "Unlink Revision";
$lang->action->label->linkrelatedbug = "a lié à un Bug ";
$lang->action->label->unlinkrelatedbug = "a délié du Bug ";
$lang->action->label->linkrelatedcase = "a mis en relation avec un CasTest ";
@@ -410,6 +411,7 @@ $lang->action->label->suspend = 'suspended';
$lang->action->label->resume = 'resumed';
$lang->action->label->reboot = 'reboot';
$lang->action->label->destroy = 'destroyed';
$lang->action->label->getvnc = 'remote control';
$lang->action->label->synctwins = 'synchronized changes';
$lang->action->label->relieved = 'relieved';
$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
@@ -487,9 +489,9 @@ $lang->action->dynamicAction->story['changed'] = 'Changer Story';
$lang->action->dynamicAction->story['linked2plan'] = 'Inclure Story au Plan';
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Enlever Story du Plan';
$lang->action->dynamicAction->story['linked2release'] = 'Inclure Story à la Release';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Enlever Story de la Release';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2revision'] = 'Inclure Story à la Revision';
$lang->action->dynamicAction->story['unlinked2revision'] = 'Unlink Stroy to Revision';
$lang->action->dynamicAction->story['unlinkedfromrevision'] = 'Unlink Story from Revision';
$lang->action->dynamicAction->story['linked2build'] = 'Ajouter Story au Build';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Détacher Story du Build';
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Détacher du Project';
@@ -547,66 +549,66 @@ $lang->action->dynamicAction->kanbancard['deleted'] = 'Delete Card';
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
$lang->action->dynamicAction->task['opened'] = 'Créer Tâche';
$lang->action->dynamicAction->task['importfromgitlab'] = "Issue associate create task";
$lang->action->dynamicAction->task['edited'] = 'Editer Tâche';
$lang->action->dynamicAction->task['commented'] = 'Commenter Tâche';
$lang->action->dynamicAction->task['assigned'] = 'Assigner Tâche';
$lang->action->dynamicAction->task['confirmed'] = 'Confirmer Tâche';
$lang->action->dynamicAction->task['started'] = 'Commencer Tâche';
$lang->action->dynamicAction->task['finished'] = 'Terminer Tâche';
$lang->action->dynamicAction->task['recordestimate'] = 'Ajouter Estimation';
$lang->action->dynamicAction->task['editestimate'] = 'Editer Estimation';
$lang->action->dynamicAction->task['deleteestimate'] = 'RAZ Estimation';
$lang->action->dynamicAction->task['paused'] = 'Stopper Tâche';
$lang->action->dynamicAction->task['closed'] = 'Fermer Tâche';
$lang->action->dynamicAction->task['canceled'] = 'Supprimer Tâche';
$lang->action->dynamicAction->task['activated'] = 'Activer Tâche';
$lang->action->dynamicAction->task['createchildren'] = 'Créer Sous-Tâche';
$lang->action->dynamicAction->task['unlinkparenttask'] = 'Délier Tâche Parent';
$lang->action->dynamicAction->task['deletechildrentask'] = 'Delete children task';
$lang->action->dynamicAction->task['linkparenttask'] = 'Lier Tâche Parent';
$lang->action->dynamicAction->task['linkchildtask'] = 'Lier sous-tâche';
$lang->action->dynamicAction->task['createchildrenstory'] = 'Créer sous-story';
$lang->action->dynamicAction->task['unlinkparentstory'] = 'Délier Story Parent';
$lang->action->dynamicAction->task['deletechildrenstory'] = 'Supprimer sous-story';
$lang->action->dynamicAction->task['linkparentstory'] = 'Lier Story Parent';
$lang->action->dynamicAction->task['linkchildstory'] = 'Lier sous-Story';
$lang->action->dynamicAction->task['undeleted'] = 'Restaurer Tâche';
$lang->action->dynamicAction->task['hidden'] = 'Masquer Tâche';
$lang->action->dynamicAction->task['svncommited'] = 'Committer SVN';
$lang->action->dynamicAction->task['gitcommited'] = 'Committer GIT';
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
$lang->action->dynamicAction->task['linked2revision'] = 'Link Task to Revision';
$lang->action->dynamicAction->task['unlinked2revision'] = 'Unlink Task to Revision';
$lang->action->dynamicAction->task['opened'] = 'Créer Tâche';
$lang->action->dynamicAction->task['importfromgitlab'] = "Issue associate create task";
$lang->action->dynamicAction->task['edited'] = 'Editer Tâche';
$lang->action->dynamicAction->task['commented'] = 'Commenter Tâche';
$lang->action->dynamicAction->task['assigned'] = 'Assigner Tâche';
$lang->action->dynamicAction->task['confirmed'] = 'Confirmer Tâche';
$lang->action->dynamicAction->task['started'] = 'Commencer Tâche';
$lang->action->dynamicAction->task['finished'] = 'Terminer Tâche';
$lang->action->dynamicAction->task['recordestimate'] = 'Ajouter Estimation';
$lang->action->dynamicAction->task['editestimate'] = 'Editer Estimation';
$lang->action->dynamicAction->task['deleteestimate'] = 'RAZ Estimation';
$lang->action->dynamicAction->task['paused'] = 'Stopper Tâche';
$lang->action->dynamicAction->task['closed'] = 'Fermer Tâche';
$lang->action->dynamicAction->task['canceled'] = 'Supprimer Tâche';
$lang->action->dynamicAction->task['activated'] = 'Activer Tâche';
$lang->action->dynamicAction->task['createchildren'] = 'Créer Sous-Tâche';
$lang->action->dynamicAction->task['unlinkparenttask'] = 'Délier Tâche Parent';
$lang->action->dynamicAction->task['deletechildrentask'] = 'Delete children task';
$lang->action->dynamicAction->task['linkparenttask'] = 'Lier Tâche Parent';
$lang->action->dynamicAction->task['linkchildtask'] = 'Lier sous-tâche';
$lang->action->dynamicAction->task['createchildrenstory'] = 'Créer sous-story';
$lang->action->dynamicAction->task['unlinkparentstory'] = 'Délier Story Parent';
$lang->action->dynamicAction->task['deletechildrenstory'] = 'Supprimer sous-story';
$lang->action->dynamicAction->task['linkparentstory'] = 'Lier Story Parent';
$lang->action->dynamicAction->task['linkchildstory'] = 'Lier sous-Story';
$lang->action->dynamicAction->task['undeleted'] = 'Restaurer Tâche';
$lang->action->dynamicAction->task['hidden'] = 'Masquer Tâche';
$lang->action->dynamicAction->task['svncommited'] = 'Committer SVN';
$lang->action->dynamicAction->task['gitcommited'] = 'Committer GIT';
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
$lang->action->dynamicAction->task['linked2revision'] = 'Link Task to Revision';
$lang->action->dynamicAction->task['unlinkedfromrevision'] = 'Unlink Task from Revision';
$lang->action->dynamicAction->build['opened'] = 'Créer Build';
$lang->action->dynamicAction->build['edited'] = 'Editer Build';
$lang->action->dynamicAction->build['deleted'] = 'Delete Build';
$lang->action->dynamicAction->bug['opened'] = 'Remonter Bug';
$lang->action->dynamicAction->bug['importfromgitlab'] = "Issue associate create bug";
$lang->action->dynamicAction->bug['edited'] = 'Editer Bug';
$lang->action->dynamicAction->bug['activated'] = 'Activer Bug';
$lang->action->dynamicAction->bug['assigned'] = 'Assigner Bug';
$lang->action->dynamicAction->bug['closed'] = 'Fermer Bug';
$lang->action->dynamicAction->bug['bugconfirmed'] = 'Confirmer Bug';
$lang->action->dynamicAction->bug['resolved'] = 'Resolu Bug';
$lang->action->dynamicAction->bug['undeleted'] = 'Restaurer Bug';
$lang->action->dynamicAction->bug['hidden'] = 'Masquer Bug';
$lang->action->dynamicAction->bug['deleted'] = 'Supprimé Bug';
$lang->action->dynamicAction->bug['confirmed'] = 'Confirme Chang.Story';
$lang->action->dynamicAction->bug['tostory'] = 'Converti en Story';
$lang->action->dynamicAction->bug['totask'] = 'Converti en Tâche';
$lang->action->dynamicAction->bug['linked2plan'] = 'Lié au Plan';
$lang->action->dynamicAction->bug['unlinkedfromplan'] = 'Enlevé du Plan';
$lang->action->dynamicAction->bug['linked2release'] = 'Ajouté à la Release';
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = 'Enlevé de la Release';
$lang->action->dynamicAction->bug['linked2revision'] = 'Ajouté à la Revision';
$lang->action->dynamicAction->bug['unlinked2revision'] = 'Unlink Bug to Revision';
$lang->action->dynamicAction->bug['linked2bug'] = 'Lié au Build';
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = 'Retiré du Build';
$lang->action->dynamicAction->bug['fromsonarqube'] = 'Create Bug from SonarQube Issue';
$lang->action->dynamicAction->bug['opened'] = 'Remonter Bug';
$lang->action->dynamicAction->bug['importfromgitlab'] = "Issue associate create bug";
$lang->action->dynamicAction->bug['edited'] = 'Editer Bug';
$lang->action->dynamicAction->bug['activated'] = 'Activer Bug';
$lang->action->dynamicAction->bug['assigned'] = 'Assigner Bug';
$lang->action->dynamicAction->bug['closed'] = 'Fermer Bug';
$lang->action->dynamicAction->bug['bugconfirmed'] = 'Confirmer Bug';
$lang->action->dynamicAction->bug['resolved'] = 'Resolu Bug';
$lang->action->dynamicAction->bug['undeleted'] = 'Restaurer Bug';
$lang->action->dynamicAction->bug['hidden'] = 'Masquer Bug';
$lang->action->dynamicAction->bug['deleted'] = 'Supprimé Bug';
$lang->action->dynamicAction->bug['confirmed'] = 'Confirme Chang.Story';
$lang->action->dynamicAction->bug['tostory'] = 'Converti en Story';
$lang->action->dynamicAction->bug['totask'] = 'Converti en Tâche';
$lang->action->dynamicAction->bug['linked2plan'] = 'Lié au Plan';
$lang->action->dynamicAction->bug['unlinkedfromplan'] = 'Enlevé du Plan';
$lang->action->dynamicAction->bug['linked2release'] = 'Ajouté à la Release';
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = 'Enlevé de la Release';
$lang->action->dynamicAction->bug['linked2revision'] = 'Ajouté à la Revision';
$lang->action->dynamicAction->bug['unlinkedfromrevision'] = 'Unlink Bug from Revision';
$lang->action->dynamicAction->bug['linked2bug'] = 'Lié au Build';
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = 'Retiré du Build';
$lang->action->dynamicAction->bug['fromsonarqube'] = 'Create Bug from SonarQube Issue';
$lang->action->dynamicAction->testtask['opened'] = 'Créé Recette';
$lang->action->dynamicAction->testtask['edited'] = 'Edité Recette';
@@ -650,6 +652,7 @@ $lang->action->dynamicAction->zanode['created'] = 'Create Zagent Node';
$lang->action->dynamicAction->zanode['suspend'] = 'Suspend Zagent Node';
$lang->action->dynamicAction->zanode['resume'] = 'Resume Zagent Node';
$lang->action->dynamicAction->zanode['reboot'] = 'Reboot Zagent Node';
$lang->action->dynamicAction->zanode['boot'] = 'Start Zagent Node';
$lang->action->dynamicAction->zanode['destroy'] = 'Destory Zagent Node';
$lang->action->dynamicAction->doclib['created'] = 'Créer Doc Library';
@@ -904,7 +907,7 @@ $lang->action->apiTitle->unlinkedfrombuild = "Unlinked from build";
$lang->action->apiTitle->linked2release = "Linked to release";
$lang->action->apiTitle->unlinkedfromrelease = "Unlinked from release";
$lang->action->apiTitle->linked2revision = "Linked to revision";
$lang->action->apiTitle->unlinked2revision = "Unlinked to revision";
$lang->action->apiTitle->unlinkedfromrevision = "Unlinked from revision";
$lang->action->apiTitle->linkrelatedbug = "Linked related Bug";
$lang->action->apiTitle->unlinkrelatedbug = "Unlinked related Bug";
$lang->action->apiTitle->linkrelatedstory = "Link related story {$lang->SRCommon}";
+4 -2
View File
@@ -1237,7 +1237,8 @@ class block extends control
$this->view->sv = $this->weekly->getSV($this->view->ev, $this->view->pv);
$this->view->cv = $this->weekly->getCV($this->view->ev, $this->view->ac);
$progress = !empty($this->view->pv) ? floor($this->view->ac / $this->view->pv * 1000) / 1000 * 100 : 0;
$left = (float)$this->weekly->getLeft($this->session->project, $today);
$progress = (!empty($this->view->ac) or !empty($left)) ? floor($this->view->ac / ($this->view->ac + $left) * 1000) / 1000 * 100 : 0;
$this->view->progress = $progress > 100 ? 100 : $progress;
$this->view->current = $current;
}
@@ -1261,7 +1262,8 @@ class block extends control
$this->view->sv = $this->weekly->getSV($this->view->ev, $this->view->pv);
$this->view->cv = $this->weekly->getCV($this->view->ev, $this->view->ac);
$progress = !empty($this->view->pv) ? floor($this->view->ac / $this->view->pv * 1000) / 1000 * 100 : 0;
$left = (float)$data['left'];
$progress = (!empty($this->view->ac) or !empty($left)) ? floor($this->view->ac / ($this->view->ac + $left) * 1000) / 1000 * 100 : 0;
$this->view->progress = $progress > 100 ? 100 : $progress;
}
+1 -1
View File
@@ -574,7 +574,7 @@ $lang->block->flowchart['dev'] = array('Entwickler', 'Aufgabe/Bugs anfordern
$lang->block->flowchart['tester'] = array('QS Team', 'Fälle erstellen', 'Fälle ausführen', 'Bug Berichte', 'Bugs überprüfen', 'Bugs schließen');
$lang->block->zentaoapp = new stdclass();
$lang->block->zentaoapp->commom = 'ZenTao App';
$lang->block->zentaoapp->common = 'ZenTao App';
$lang->block->zentaoapp->thisYearInvestment = 'Investment The Year';
$lang->block->zentaoapp->sinceTotalInvestment = 'Total Investment';
$lang->block->zentaoapp->myStory = 'My Story';
+1 -1
View File
@@ -574,7 +574,7 @@ $lang->block->flowchart['dev'] = array('Dev Team', 'Claim Tasks/Bugs', 'Desi
$lang->block->flowchart['tester'] = array('Test Team', 'Write Cases', 'Run Cases', 'Report Bugs', 'Verify Bugs', 'Close Bugs');
$lang->block->zentaoapp = new stdclass();
$lang->block->zentaoapp->commom = 'ZenTao App';
$lang->block->zentaoapp->common = 'ZenTao App';
$lang->block->zentaoapp->thisYearInvestment = 'Investment The Year';
$lang->block->zentaoapp->sinceTotalInvestment = 'Total Investment';
$lang->block->zentaoapp->myStory = 'My Story';
+1 -1
View File
@@ -574,7 +574,7 @@ $lang->block->flowchart['dev'] = array('Développeurs', 'Réclament Tâches/
$lang->block->flowchart['tester'] = array('Testeurs', 'Rédigent CasTests', 'Jouent CasTests', 'Détectent Bugs', 'Vérifient Corrections', 'Ferment Bugs');
$lang->block->zentaoapp = new stdclass();
$lang->block->zentaoapp->commom = 'ZenTao App';
$lang->block->zentaoapp->common = 'ZenTao App';
$lang->block->zentaoapp->thisYearInvestment = 'Investment The Year';
$lang->block->zentaoapp->sinceTotalInvestment = 'Total Investment';
$lang->block->zentaoapp->myStory = 'My Story';
+25 -8
View File
@@ -9,12 +9,21 @@
border: 1px solid #EDEEF2;
}
.preference-border > .preference-img {
flex: 0 0 160px;
flex: 0 0 80px;
}
.preference.picker-option-active >.preference-border {
border: 2px solid #2E7FFF;
}
.preference.picker-option-active {
background: unset!important;
}
.preference.picker-option-active > .preference-border {
background: rgba(230,240,255, 0.4)!important;
}
.picker-option.picker-option-selected.preference {
background: unset!important;
}
.picker-option.picker-option-selected.preference > .preference-border {
background: rgba(230,240,255, 0.4)!important;
}
.preference-text {
@@ -34,17 +43,25 @@
white-space: normal;
}
#pickerDropMenu-pk_URSR > .picker-option-list{
.picker-option.picker-option-active,
.picker-single .picker-option.picker-option-selected.picker-option-active.option-ursr,
.picker-option.picker-option-selected.option-ursr {
background: unset!important;
color: unset;
}
.picker-option.picker-option-active > .border,
.picker-single .picker-option.picker-option-selected.picker-option-active.option-ursr > .border,
.picker-single .picker-option.picker-option-selected.picker-option-active.option-ursr > .border {
background: rgba(230,240,255, 0.4)!important;
border: 1px solid #2E7FFF;
}
#pickerDropMenu-pk_URSR > .picker-option-list {
display: flex;
flex-wrap: wrap;
}
.option-ursr {
flex: 1 1 50%;
}
.option-ursr.picker-option-selected > .border,
.option-ursr.picker-option-active> .border {
border: none;
}
.option-ursr > .border {
height: 46px;
display: flex;
@@ -116,8 +133,8 @@ function initPreference() {
'project-kanban': 'kanban',
'execution-all': 'list',
'execution-task': 'kanban',
'execution-executionkanban': 'list-recent',
'execution-task': 'list-recent',
'execution-executionkanban': 'kanban',
}
function optionRenderProgram($option, b)
{
@@ -99,6 +99,8 @@ function changeMoreBtn(type, label)
var $moreBtn = $('#assigntomeBlock .moreBtn');
var text = $(label).html();
text += '<span class="caret"></span>';
$moreBtn.html(text);
setTimeout(function()
@@ -14,9 +14,30 @@
.block-waterfallreport .progress {position: absolute; left: 45px; top: 90px; right: 40px;}
.block-waterfallreport .progress-num {font-size: 20px; font-weight: 700;}
.block-waterfallreport .col-right .tile-amount {font-size: 20px;}
</style>
<div class="panel-move-handler"><span class='stage text-muted'><?php echo $current;?></span></div>
.block-waterfallreport #helpDropdown{display:inline-block; padding-left:5px; padding-right:10px;}
.block-waterfallreport #helpDropdown .dropdown-menu{width:600px; text-align:left; height:300px; overflow:auto; background: #fff; padding-left:8px;font-weight: normal;}
.block-waterfallreport #helpDropdown h2{font-size:14px; padding:0px; margin:0px; margin-top:10px;}
.block-waterfallreport #helpDropdown p{padding:0px; margin:0px; margin-top:10px;}
</style>
<script>
$(function()
{
$('.block-waterfallreport').each(function()
{
$(this).find('.panel-heading .panel-title #helpDropdown').remove();
$(this).find('.panel-heading .panel-title').append($('#helpDropdown.hidden'));
$(this).find('.panel-heading .panel-title #helpDropdown').removeClass('hidden');
})
})
</script>
<div id='helpDropdown' class="dropdown dropdown-hover hidden">
<a data-toggle="dropdown"><i class="icon-help"></i></a>
<div class="dropdown-menu">
<?php echo $lang->weekly->blockHelpNotice;?>
</div>
</div>
<div class="panel-body conatiner-fluid">
<div class='table-row'>
<div class="col col-left hide-in-sm">
+1 -1
View File
@@ -405,8 +405,8 @@ $lang->bug->action->linked2plan = array('main' => '$date, verknüpft vo
$lang->bug->action->unlinkedfromplan = array('main' => '$date, verknüpfung aufgehoben von <strong>$actor</strong> von Plan <strong>$extra</strong>.');
$lang->bug->action->linked2build = array('main' => '$date, verknüpft von <strong>$actor</strong> zum Build <strong>$extra</strong>.');
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, verknüpfung aufgehoben von <strong>$actor</strong> von Build <strong>$extra</strong>.');
$lang->bug->action->linked2release = array('main' => '$date, verknüpft von <strong>$actor</strong> zu Release <strong>$extra</strong>.');
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, verknüpfung aufgehoben von <strong>$actor</strong> vom Release <strong>$extra</strong>.');
$lang->bug->action->linked2release = array('main' => '$date, verknüpft von <strong>$actor</strong> zu Release <strong>$extra</strong>.');
$lang->bug->action->linked2revision = array('main' => '$date, linked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
$lang->bug->action->unlinkedfromrevision = array('main' => '$date, unlinked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
$lang->bug->action->linkrelatedbug = array('main' => '$date, verknüpft von <strong>$actor</strong> mit Bug <strong>$extra</strong>.');
+1 -1
View File
@@ -405,8 +405,8 @@ $lang->bug->action->linked2plan = array('main' => '$date, linked by <st
$lang->bug->action->unlinkedfromplan = array('main' => '$date, deleted by <strong>$actor</strong> from Plan <strong>$extra</strong>.');
$lang->bug->action->linked2build = array('main' => '$date, linked by <strong>$actor</strong> to Build <strong>$extra</strong>.');
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, unlinked by <strong>$actor</strong> from Build <strong>$extra</strong>.');
$lang->bug->action->linked2release = array('main' => '$date, linked by <strong>$actor</strong> to Release <strong>$extra</strong>.');
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, unlinked by <strong>$actor</strong> from Release <strong>$extra</strong>.');
$lang->bug->action->linked2release = array('main' => '$date, linked by <strong>$actor</strong> to Release <strong>$extra</strong>.');
$lang->bug->action->linked2revision = array('main' => '$date, linked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
$lang->bug->action->unlinkedfromrevision = array('main' => '$date, unlinked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
$lang->bug->action->linkrelatedbug = array('main' => '$date, linked by <strong>$actor</strong> to Bug <strong>$extra</strong>.');
+1 -1
View File
@@ -405,8 +405,8 @@ $lang->bug->action->linked2plan = array('main' => '$date, lié par <str
$lang->bug->action->unlinkedfromplan = array('main' => '$date, supprimé par <strong>$actor</strong> du Plan <strong>$extra</strong>.');
$lang->bug->action->linked2build = array('main' => '$date, lié par <strong>$actor</strong> au Build <strong>$extra</strong>.');
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, retiré par <strong>$actor</strong> du Build <strong>$extra</strong>.');
$lang->bug->action->linked2release = array('main' => '$date, ajouté par <strong>$actor</strong> à la Release <strong>$extra</strong>.');
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, retiré par <strong>$actor</strong> de la Release <strong>$extra</strong>.');
$lang->bug->action->linked2release = array('main' => '$date, ajouté par <strong>$actor</strong> à la Release <strong>$extra</strong>.');
$lang->bug->action->linked2revision = array('main' => '$date, linked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
$lang->bug->action->unlinkedfromrevision = array('main' => '$date, unlinked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
$lang->bug->action->linkrelatedbug = array('main' => '$date, associé par <strong>$actor</strong> au Bug <strong>$extra</strong>.');
+3 -3
View File
@@ -3204,7 +3204,7 @@ EOD;
* @access public
* @return string
*/
public static function http($url, $data = null, $options = array(), $headers = array(), $dataType = 'data', $method = 'POST')
public static function http($url, $data = null, $options = array(), $headers = array(), $dataType = 'data', $method = 'POST', $timeout = 30)
{
global $lang, $app;
if(!extension_loaded('curl'))
@@ -3226,8 +3226,8 @@ EOD;
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($curl, CURLOPT_USERAGENT, 'Sae T OAuth2 v0.1');
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_ENCODING, "");
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
+1
View File
@@ -31,6 +31,7 @@
.kanban-header-col > .title > .text {max-width: 110px !important;}
.kanban-header-col > .title > .storyColumn .text {font-weight: 700; color:rgb(51, 51, 51);}
.kanban-header-col > .title > .storyColumn + .dropdown-menu {top: 45px; left: auto;}
.kanban-header-sub-cols .kanban-header-col > .title .text {max-width: calc(100% - 120px) !important;}
#kanbanContainer {margin: 0;}
#kanbanContainer > .panel-body {overflow: auto;}
+1 -1
View File
@@ -69,7 +69,7 @@
<?php if($showBranch):?>
<td class="c-name text-left <?php echo $hidden;?>" title='<?php echo $build->branchName;?>'><?php echo $build->branchName;?></td>
<?php endif;?>
<td class="c-name"><?php echo html::a($this->createLink('build', 'view', "build=$build->id"), $build->name);?></td>
<td class="c-name" title="<?php echo $build->name;?>"><?php echo html::a($this->createLink('build', 'view', "build=$build->id"), $build->name);?></td>
<td class="c-url text-left">
<?php
if($build->scmPath)
+10 -6
View File
@@ -1220,12 +1220,14 @@ $lang->caselib->methodOrder[45] = 'import';
$lang->caselib->methodOrder[50] = 'showImport';
$lang->resource->zahost = new stdclass();
$lang->resource->zahost->browse = 'browse';
$lang->resource->zahost->create = 'create';
$lang->resource->zahost->edit = 'editAction';
$lang->resource->zahost->delete = 'deleteAction';
$lang->resource->zahost->view = 'view';
$lang->resource->zahost->browseImage = 'browseImage';
$lang->resource->zahost->browse = 'browse';
$lang->resource->zahost->create = 'create';
$lang->resource->zahost->edit = 'editAction';
$lang->resource->zahost->delete = 'deleteAction';
$lang->resource->zahost->view = 'view';
$lang->resource->zahost->browseImage = 'browseImage';
$lang->resource->zahost->downloadImage = 'downloadImage';
$lang->resource->zahost->cancelDownload = 'cancel';
$lang->zahost->methodOrder[0] = 'browse';
$lang->zahost->methodOrder[5] = 'create';
@@ -1233,6 +1235,8 @@ $lang->zahost->methodOrder[10] = 'edit';
$lang->zahost->methodOrder[15] = 'delete';
$lang->zahost->methodOrder[20] = 'view';
$lang->zahost->methodOrder[25] = 'browseImage';
$lang->zahost->methodOrder[30] = 'downloadImage';
$lang->zahost->methodOrder[35] = 'cancelDownload';
$lang->resource->zanode = new stdclass();
$lang->resource->zanode->browse = 'browse';
+2 -1
View File
@@ -21,7 +21,7 @@
.region .region-actions {float: right; position: relative; top: -6px; right: -6px;}
.region .region-header .icon-double-angle-up,.icon-double-angle-down {cursor: pointer;}
.region .kanban-header-sub-cols {margin-left: -2px;}
.region .kanban-header-sub-cols .kanban-header-col > .title {max-width: 100% !important;min-width:240px;}
.region .kanban-header-sub-cols .kanban-header-col > .title {max-width: 100% !important;min-width:200px;}
.region .sort .region-header {cursor: move;}
.region .kanban.kanban-dragging {overflow: hidden;}
@@ -156,6 +156,7 @@
.region .kanban-board .kanban-header-sub-cols .kanban-header-col > .title > span {max-width: calc(100% - 165px) !important;}
.region .kanban-board .kanban-header-sub-cols .kanban-header-col.left > .title > span {max-width: calc(100% - 120px) !important;}
.executionName .delayed {margin-right: 10px;}
.region .kanban-board .kanban-header-sub-cols .kanban-header-col > .title > .text {max-width: calc(100% - 150px) !important;}
#kanbanBox {position: relative;}
#regionTabs {background-color: #efefef; z-index: 100; display: flex; align-items: center; gap: 1.5rem; justify-content: space-between;}
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[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'] = '2023-01-03';
$lang->misc->releaseDate['18.0.beta3'] = '2022-12-26';
$lang->misc->releaseDate['18.0.beta2'] = '2022-12-14';
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
@@ -195,6 +196,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'][] = array('title' => "Automated test solutions are proposed. Work order related functions are added to the Operation Management Interface. Approval workflow support for adding all types of notifications. And at the same time, we have further improved the earned value calculation rules.", 'desc' => '');
$lang->misc->feature->all['18.0.beta3'][] = array('title' => "The module Statistic is upgraded to BI, with 5 built-in large screens of macro management dimensions.", 'desc' => '');
$lang->misc->feature->all['18.0.beta2'][] = array('title' => "We have optimized the product with multi-branches/multi-platforms. It's supported to create siblings stories. It's possible for Plan, Build, and Release to link requirements or bugs beyond their parent branch. ZenTao Client has implemented the robot chatting mechanism.", 'desc' => '');
$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' => '');
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[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'] = '2023-01-03';
$lang->misc->releaseDate['18.0.beta3'] = '2022-12-26';
$lang->misc->releaseDate['18.0.beta2'] = '2022-12-14';
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
@@ -195,6 +196,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'][] = array('title' => "Automated test solutions are proposed. Work order related functions are added to the Operation Management Interface. Approval workflow support for adding all types of notifications. And at the same time, we have further improved the earned value calculation rules.", 'desc' => '');
$lang->misc->feature->all['18.0.beta3'][] = array('title' => "The module Statistic is upgraded to BI, with 5 built-in large screens of macro management dimensions.", 'desc' => '');
$lang->misc->feature->all['18.0.beta2'][] = array('title' => "We have optimized the product with multi-branches/multi-platforms. It's supported to create siblings stories. It's possible for Plan, Build, and Release to link requirements or bugs beyond their parent branch. ZenTao Client has implemented the robot chatting mechanism.", 'desc' => '');
$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' => '');
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[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'] = '2023-01-03';
$lang->misc->releaseDate['18.0.beta3'] = '2022-12-26';
$lang->misc->releaseDate['18.0.beta2'] = '2022-12-14';
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
@@ -195,6 +196,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'][] = array('title' => "Automated test solutions are proposed. Work order related functions are added to the Operation Management Interface. Approval workflow support for adding all types of notifications. And at the same time, we have further improved the earned value calculation rules.", 'desc' => '');
$lang->misc->feature->all['18.0.beta3'][] = array('title' => "The module Statistic is upgraded to BI, with 5 built-in large screens of macro management dimensions.", 'desc' => '');
$lang->misc->feature->all['18.0.beta2'][] = array('title' => "We have optimized the product with multi-branches/multi-platforms. It's supported to create siblings stories. It's possible for Plan, Build, and Release to link requirements or bugs beyond their parent branch. ZenTao Client has implemented the robot chatting mechanism.", 'desc' => '');
$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' => '');
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = "<p>禅道15系列上线了全新的“
$lang->misc->feature->visionsDesc = "<p>从16.5开始增加了界面概念,用户可以在<span style='color:#0c60e1'>[研发综合界面]</span>中处理研发事务、在<span style='color:#0c60e1'>[运营管理界面]</span>处理日常办公事务。</p><p>在头像右侧即可查看当前所处界面,点击当前界面名称可查看和切换其他的界面。</p>";
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions.png';
$lang->misc->releaseDate['18.0'] = '2023-01-03';
$lang->misc->releaseDate['18.0.beta3'] = '2022-12-26';
$lang->misc->releaseDate['18.0.beta2'] = '2022-12-14';
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
@@ -195,6 +196,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'][] = array('title' => '推出自动化测试解决方案;运营管理界面增加工单功能;审批流支持增加所有类型的通知以及挣值计算规则完善。', 'desc' => '');
$lang->misc->feature->all['18.0.beta3'][] = array('title' => '统计模块升级为BI,内置5张宏观管理维度大屏。', 'desc' => '');
$lang->misc->feature->all['18.0.beta2'][] = array('title' => '优化多分支/多平台产品,支持创建孪生需求,计划、版本、发布支持跨分支关联需求和bug,并且禅道客户端实现了机器人会话机制。', 'desc' => '');
$lang->misc->feature->all['18.0.beta1'][] = array('title' => '主要对禅道多项核心流程进行改进,新增项目型项目、无迭代项目;支持项目跨项目集关联产品;支持轻量管理模式和全生命周期管理模式进行切换。', 'desc' => '');
+27 -9
View File
@@ -1,6 +1,7 @@
.preference .table-form > tbody > tr > th {font-weight: 400; color: #0B0F18;}
.preference .chosen-container-single .chosen-single > span {color: #313C52;}
.tip {margin-top: 10px;}
.table-form>tbody>tr>th {white-space: nowrap!important}
.table-form>tbody>tr>td {width: 75%!important}
.preference > .preference-border {
display: flex;
@@ -8,12 +9,21 @@
border: 1px solid #EDEEF2;
}
.preference-border > .preference-img {
flex: 0 0 160px;
flex: 0 0 80px;
}
.preference.picker-option-active >.preference-border {
border: 2px solid #2E7FFF;
}
.preference.picker-option-active {
background: unset!important;
}
.preference.picker-option-active > .preference-border {
background: rgba(230,240,255, 0.4)!important;
}
.picker-option.picker-option-selected.preference {
background: unset!important;
}
.picker-option.picker-option-selected.preference > .preference-border {
background: rgba(230,240,255, 0.4)!important;
}
.preference-text {
@@ -33,17 +43,25 @@
white-space: normal;
}
#pickerDropMenu-pk_URSR > .picker-option-list{
.picker-option.picker-option-active,
.picker-single .picker-option.picker-option-selected.picker-option-active.option-ursr,
.picker-option.picker-option-selected.option-ursr {
background: unset!important;
color: unset;
}
.picker-option.picker-option-active > .border,
.picker-single .picker-option.picker-option-selected.picker-option-active.option-ursr > .border,
.picker-single .picker-option.picker-option-selected.picker-option-active.option-ursr > .border {
background: rgba(230,240,255, 0.4)!important;
border: 1px solid #2E7FFF;
}
#pickerDropMenu-pk_URSR > .picker-option-list {
display: flex;
flex-wrap: wrap;
}
.option-ursr {
flex: 1 1 50%;
}
.option-ursr.picker-option-selected > .border,
.option-ursr.picker-option-active> .border {
border: none;
}
.option-ursr > .border {
height: 46px;
display: flex;
@@ -61,4 +79,4 @@
.option-ursr > .border > .value > p {
line-height: 20px;
text-align: center;
}
}
+2 -2
View File
@@ -16,8 +16,8 @@ function initPreference() {
'project-kanban': 'kanban',
'execution-all': 'list',
'execution-task': 'kanban',
'execution-executionkanban': 'list-recent',
'execution-task': 'list-recent',
'execution-executionkanban': 'kanban',
}
function optionRenderProgram($option, b)
{
+2 -2
View File
@@ -139,14 +139,14 @@ $lang->my->productLinkList['product-browse'] = 'Demand list of the latest pro
$lang->my->projectLinkList = array();
$lang->my->projectLinkList['project-browse'] = 'Project List/Can view all items';
$lang->my->projectLinkList['project-kanban'] = 'Project Kanban/The project board can visually view the progress of all projects';
$lang->my->projectLinkList['project-execution'] = 'All execution lists under the project/View all execution information';
$lang->my->projectLinkList['project-index'] = 'Recent Project Dashboard/You can view the current project overview';
$lang->my->projectLinkList['project-kanban'] = 'Project Kanban/The project board can visually view the progress of all projects';
$lang->my->executionLinkList = array();
$lang->my->executionLinkList['execution-all'] = 'Execution list/You can view all executions';
$lang->my->executionLinkList['execution-task'] = 'List of recently executed tasks/You can view the task information under the current iteration';
$lang->my->executionLinkList['execution-executionkanban'] = 'Execute Kanban/You can view the implementation status of projects in progress';
$lang->my->executionLinkList['execution-task'] = 'List of recently executed tasks/You can view the task information under the current iteration';
$lang->my->confirmReview['pass'] = 'Do you want to pass it?';
$lang->my->guideChangeTheme = <<<EOT
+2 -2
View File
@@ -139,14 +139,14 @@ $lang->my->productLinkList['product-browse'] = 'Demand list of the latest pro
$lang->my->projectLinkList = array();
$lang->my->projectLinkList['project-browse'] = 'Project List/Can view all items';
$lang->my->projectLinkList['project-kanban'] = 'Project Kanban/The project board can visually view the progress of all projects';
$lang->my->projectLinkList['project-execution'] = 'All execution lists under the project/View all execution information';
$lang->my->projectLinkList['project-index'] = 'Recent Project Dashboard/You can view the current project overview';
$lang->my->projectLinkList['project-kanban'] = 'Project Kanban/The project board can visually view the progress of all projects';
$lang->my->executionLinkList = array();
$lang->my->executionLinkList['execution-all'] = 'Execution list/You can view all executions';
$lang->my->executionLinkList['execution-task'] = 'List of recently executed tasks/You can view the task information under the current iteration';
$lang->my->executionLinkList['execution-executionkanban'] = 'Execute Kanban/You can view the implementation status of projects in progress';
$lang->my->executionLinkList['execution-task'] = 'List of recently executed tasks/You can view the task information under the current iteration';
$lang->my->confirmReview['pass'] = 'Do you want to pass it?';
$lang->my->guideChangeTheme = <<<EOT
+2 -2
View File
@@ -139,14 +139,14 @@ $lang->my->productLinkList['product-browse'] = 'Demand list of the latest pro
$lang->my->projectLinkList = array();
$lang->my->projectLinkList['project-browse'] = 'Project List/Can view all items';
$lang->my->projectLinkList['project-kanban'] = 'Project Kanban/The project board can visually view the progress of all projects';
$lang->my->projectLinkList['project-execution'] = 'All execution lists under the project/View all execution information';
$lang->my->projectLinkList['project-index'] = 'Recent Project Dashboard/You can view the current project overview';
$lang->my->projectLinkList['project-kanban'] = 'Project Kanban/The project board can visually view the progress of all projects';
$lang->my->executionLinkList = array();
$lang->my->executionLinkList['execution-all'] = 'Execution list/You can view all executions';
$lang->my->executionLinkList['execution-task'] = 'List of recently executed tasks/You can view the task information under the current iteration';
$lang->my->executionLinkList['execution-executionkanban'] = 'Execute Kanban/You can view the implementation status of projects in progress';
$lang->my->executionLinkList['execution-task'] = 'List of recently executed tasks/You can view the task information under the current iteration';
$lang->my->confirmReview['pass'] = 'Do you want to pass it?';
$lang->my->guideChangeTheme = <<<EOT
+12 -12
View File
@@ -131,22 +131,22 @@ $lang->my->programLinkList['program-kanban'] = '项目集看板/可以可视化
$lang->my->programLinkList['program-project'] = '最近一个项目集的项目列表/可以查看当前项目集下所有项目';
$lang->my->productLinkList = array();
$lang->my->productLinkList['product-all'] = '产品列表/可以查看所有的产品';
$lang->my->productLinkList['product-kanban'] = '产品看板/可以可视化的查看到所有产品的进展情况';
$lang->my->productLinkList['product-index'] = '所有产品仪表盘/可以查看所有产品的统计';
$lang->my->productLinkList['product-dashboard'] = '最近一个产品仪表盘/可以查看当前产品概况';
$lang->my->productLinkList['product-browse'] = '最近一个产品的需求列表/可以查看当前产品下的需求信息';
$lang->my->productLinkList['product-all'] = '产品列表/可以查看所有产品';
$lang->my->productLinkList['product-kanban'] = '产品看板/以可视化的方式查看到所有产品的整体情况';
$lang->my->productLinkList['product-index'] = '所有产品仪表盘/可以查看所有产品的统计,概况,总览等';
$lang->my->productLinkList['product-dashboard'] = '最近一个产品仪表盘/可以查看最近查看过的一个产品仪表盘';
$lang->my->productLinkList['product-browse'] = '最近一个产品的需求列表/可以进入最近查看过的一个产品下的研发需求列表';
$lang->my->projectLinkList = array();
$lang->my->projectLinkList['project-browse'] = '项目列表/可以查看所有的项目';
$lang->my->projectLinkList['project-execution'] = '项目下所有执行列表/查看所有执行信息';
$lang->my->projectLinkList['project-index'] = '最近一个项目仪表盘/可以查看当前项目概况';
$lang->my->projectLinkList['project-kanban'] = '项目看板/可以可视化的查看到所有项目的进展情况';
$lang->my->projectLinkList['project-browse'] = '项目列表/可以查看所有项目';
$lang->my->projectLinkList['project-kanban'] = '项目看板/以可视化的查看到所有项目的整体情况';
$lang->my->projectLinkList['project-execution'] = '最近一个项目执行列表/可以查看项目下所有的执行列表';
$lang->my->projectLinkList['project-index'] = '最近一个项目仪表盘/可以进入最近查看过的一个项目的仪表盘';
$lang->my->executionLinkList = array();
$lang->my->executionLinkList['execution-all'] = '执行列表/可以查看所有的执行';
$lang->my->executionLinkList['execution-task'] = '最近一个执行的任务列表/可以查看当前迭代下的任务信息';
$lang->my->executionLinkList['execution-executionkanban'] = '执行看板/可以查看进行中项目的执行情况';
$lang->my->executionLinkList['execution-all'] = '执行列表/可以查看所有执行';
$lang->my->executionLinkList['execution-executionkanban'] = '执行看板/以可视化的方式查看所有执行的整体情况';
$lang->my->executionLinkList['execution-task'] = '最近一个执行的任务列表/可以查看最近创建的一个执行下的任务';
$lang->my->confirmReview['pass'] = '您确定要执行通过操作吗?';
$lang->my->guideChangeTheme = <<<EOT
+2 -2
View File
@@ -125,14 +125,14 @@ $config->project->datatable->fieldList['consume']['pri'] = '7';
$config->project->datatable->fieldList['progress']['title'] = 'progress';
$config->project->datatable->fieldList['progress']['fixed'] = 'no';
$config->project->datatable->fieldList['progress']['width'] = '60';
$config->project->datatable->fieldList['progress']['width'] = '65';
$config->project->datatable->fieldList['progress']['required'] = 'no';
$config->project->datatable->fieldList['progress']['sort'] = 'no';
$config->project->datatable->fieldList['progress']['pri'] = '6';
$config->project->datatable->fieldList['actions']['title'] = 'actions';
$config->project->datatable->fieldList['actions']['fixed'] = 'right';
$config->project->datatable->fieldList['actions']['width'] = '180';
$config->project->datatable->fieldList['actions']['width'] = '165';
$config->project->datatable->fieldList['actions']['required'] = 'yes';
$config->project->datatable->fieldList['actions']['pri'] = '1';
+13 -9
View File
@@ -457,17 +457,15 @@ class projectModel extends model
public function getWaterfallPVEVAC($projectID)
{
$executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($projectID)->fetchAll('id');
$stmt = $this->dao->select('id,status,estimate,consumed,`left`,closedReason')->from(TABLE_TASK)->where('execution')->in(array_keys($executions))->andWhere("parent")->ge(0)->andWhere("deleted")->eq(0)->query();
$stmt = $this->dao->select('id,status,estimate,consumed,`left`,closedReason')->from(TABLE_TASK)->where('execution')->in(array_keys($executions))->andWhere("parent")->ge(0)->andWhere("deleted")->eq(0)->andWhere('status')->ne('cancel')->query();
$PV = 0;
$EV = 0;
$AC = 0;
$PV = 0;
$EV = 0;
$left = 0;
while($task = $stmt->fetch())
{
if(empty($task->estimate)) continue;
$PV += $task->estimate;
$AC += $task->consumed;
$PV += $task->estimate;
$left += $task->left;
if($task->status == 'done' or $task->closedReason == 'done')
{
$EV += $task->estimate;
@@ -480,7 +478,13 @@ class projectModel extends model
}
}
return array('PV' => sprintf("%.2f", $PV), 'EV' => sprintf("%.2f", $EV), 'AC' => sprintf("%.2f", $AC));
$AC = $this->dao->select('SUM(consumed) as consumed')->from(TABLE_EFFORT)
->where('deleted')->eq(0)
->andWhere('project')->eq($projectID)
->fetch('consumed');
if(is_null($AC)) $AC = 0;
return array('PV' => sprintf("%.2f", $PV), 'EV' => sprintf("%.2f", $EV), 'AC' => sprintf("%.2f", $AC), 'left' => sprintf("%.2f", $left));
}
/**
@@ -11,6 +11,9 @@
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php if(isonlybody()):?>
<style> .body-modal #mainMenu.clearfix > .btn-toolbar {width: unset;}</style>
<?php endif;?>
<?php js::set('unmodifiableProducts', $unmodifiableProducts);?>
<?php js::set('unmodifiableBranches', $unmodifiableBranches);?>
<?php js::set('unmodifiableMainBranches', $unmodifiableMainBranches);?>
+4 -1
View File
@@ -12,6 +12,9 @@
?>
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/kindeditor.html.php';?>
<?php if(!common::checkNotCN()):?>
<style> table.data-stats > tbody > tr.statsTr > td:first-child {width: 60px;}</style>
<?php endif;?>
<div id='mainContent' class="main-row">
<div class="col-8 main-col">
<div class="row">
@@ -195,7 +198,7 @@
<div class="detail-content">
<table class='table table-data data-stats'>
<tbody>
<tr class='statsTr'><td class='w-100px'></td><td></td><td></td><td></td></tr>
<tr class='statsTr'><td></td><td></td><td></td><td></td></tr>
<tr>
<td colspan="4">
<?php $progress = $project->model == 'waterfall' ? $this->project->getWaterfallProgress($project->id) : (($workhour->totalConsumed + $workhour->totalLeft) ? floor($workhour->totalConsumed / ($workhour->totalConsumed + $workhour->totalLeft) * 1000) / 1000 * 100 : 0);?>
+4 -1
View File
@@ -374,7 +374,7 @@ class screenModel extends model
if($settings->value->type === 'value')
{
$value = $results[0]->$field;
$value = empty($results[0]) ? 0 : $results[0]->$field;
}
if($settings->value->agg === 'count')
{
@@ -829,6 +829,9 @@ class screenModel extends model
{
$execution = $this->execution->getByID($executionID);
/* Splice project name for the execution name. */
$execution->name = $this->loadModel('project')->getByID($execution->project)->name . '--' . $execution->name;
/* Get date list. */
if(((strpos('closed,suspended', $execution->status) === false and helper::today() > $execution->end)
or ($execution->status == 'closed' and substr($execution->closedDate, 0, 10) > $execution->end)
+2 -1
View File
@@ -35,7 +35,8 @@ function initBurnChar()
title: {
text: execution.name,
textStyle: {
color: '#a1c4e9'
color: '#a1c4e9',
fontSize: 15
}
},
tooltip: {
+2 -1
View File
@@ -4322,8 +4322,9 @@ class taskModel extends model
private function updateExecutionEsDateByGantt($objectID, $objectType, $postData)
{
$objectData = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($objectID)->fetch();
$parent = $objectData->parent;
$project = $objectData->project;
$parent = '';
if($objectData->project != $objectData->parent) $parent = $objectData->parent;
if(empty($parent))
{
+3
View File
@@ -25,3 +25,6 @@ tbody > tr > td .icon-share {font-size: 9px;}
#importToLib .select-lib {width: 100px; text-align: right;}
#subHeader #currentBranch + #dropMenu .col-left {padding-bottom: 30px;}
.status-blocked {left: -5px;}
#mainMenu .pull-left .dividing-line {margin: 7px 5px 0 0;}
.btn-toolbar>.btn, .btn-toolbar>.btn-group, .btn-toolbar>.dropdown {margin-right: 5px;}
+12 -6
View File
@@ -2,9 +2,15 @@
.col-side .chosen-container {width: 218px !important;}
.table-form > tbody > tr > td .btn.addbutton {display: block; margin: 1px 0px; width: 40px; padding: 1px 6px;}
.table-form > tbody > tr > td .btn.delbutton {display: block; margin: 1px 0px; width: 40px; padding: 1px 6px;}
#branch {width: 95px!important;}
.detail > table > tbody th {width: 100px !important;}
[lang^=en] .detail > table > tbody th, [lang^=fr] .detail > table > tbody th {width: 100px !important;}
[lang^=de] .detail > table > tbody th {width: 125px !important;}
.linkCaseTitle, .linkBugTitle {white-space: nowrap;}
#type_chosen{display: table-cell;}
#branch {width: 95px!important;}
.detail > table > tbody th {width: 100px !important;}
[lang^=en] .detail > table > tbody th, [lang^=fr] .detail > table > tbody th {width: 100px !important;}
[lang^=de] .detail > table > tbody th {width: 125px !important;}
.linkCaseTitle, .linkBugTitle {white-space: nowrap;}
#type_chosen{display: table-cell;}
.autoScript .file-input .file-title{max-width: 70px;}
@media screen and (max-width: 1366px) {
#module_chosen{min-width: 60px;}
}
+2 -1
View File
@@ -99,7 +99,7 @@ $lang->testcase->suite = 'Test Suite';
$lang->testcase->executionStatus = 'executionStatus';
$lang->testcase->caseType = 'Case Type';
$lang->testcase->allType = 'All Types';
$lang->testcase->showAutoCase = 'Automated Test Cases';
$lang->testcase->showAutoCase = 'Automated';
$lang->testcase->automation = 'Automation Test';
$lang->case = $lang->testcase; // For dao checking using. Because 'case' is a php keywords, so the module name is testcase, table name is still case.
@@ -152,6 +152,7 @@ $lang->testcase->stepChild = 'Teilschritt';
$lang->testcase->viewAll = 'Alle anziegen';
$lang->testcase->importToLib = "Import To Library";
$lang->testcase->showScript = 'Show Script';
$lang->testcase->autoScript = 'Script';
$lang->testcase->new = 'Neu';
+2 -1
View File
@@ -99,7 +99,7 @@ $lang->testcase->suite = 'Test Suite';
$lang->testcase->executionStatus = 'executionStatus';
$lang->testcase->caseType = 'Case Type';
$lang->testcase->allType = 'All Types';
$lang->testcase->showAutoCase = 'Automated Test Cases';
$lang->testcase->showAutoCase = 'Automated';
$lang->testcase->automation = 'Automation Test';
$lang->case = $lang->testcase; // For dao checking using. Because 'case' is a php keywords, so the module name is testcase, table name is still case.
@@ -152,6 +152,7 @@ $lang->testcase->stepChild = 'Child Steps';
$lang->testcase->viewAll = 'All Cases';
$lang->testcase->importToLib = "Import To Library";
$lang->testcase->showScript = 'Show Script';
$lang->testcase->autoScript = 'Script';
$lang->testcase->new = 'New';
+2 -1
View File
@@ -99,7 +99,7 @@ $lang->testcase->suite = 'Test Suite';
$lang->testcase->executionStatus = 'executionStatus';
$lang->testcase->caseType = 'Case Type';
$lang->testcase->allType = 'All Types';
$lang->testcase->showAutoCase = 'Automated Test Cases';
$lang->testcase->showAutoCase = 'Automated';
$lang->testcase->automation = 'Automation Test';
$lang->case = $lang->testcase; // For dao checking using. Because 'case' is a php keywords, so the module name is testcase, table name is still case.
@@ -152,6 +152,7 @@ $lang->testcase->stepChild = 'Sous-Etapes';
$lang->testcase->viewAll = 'Tous les CasTests';
$lang->testcase->importToLib = "Import To Library";
$lang->testcase->showScript = 'Show Script';
$lang->testcase->autoScript = 'Script';
$lang->testcase->new = 'Nouveau';
+3 -3
View File
@@ -1500,7 +1500,7 @@ class testtaskModel extends model
$failHtml = ': <span class="result-testcase fail">' . $this->lang->testtask->fail . '</span>';
$passHtml = ': <span class="result-testcase pass">' . $this->lang->testtask->pass . '</span>';
$log = preg_replace(array("/:\x20失败/", "/:\x20fail/", "/:\x20成功/", "/:\x20pass/"), array($failHtml, $failHtml, $passHtml, $passHtml), $log);
$logHtml .= "<li>" . $log . "</li>";
@@ -1524,11 +1524,11 @@ class testtaskModel extends model
}
$caseResult = $passCount ? 'pass':'fail';
$logHtml .= "<li class='result-testcase {$caseResult}'>"
$logHtml .= "<li class='result-testcase {$caseResult}'>"
. sprintf($this->lang->testtask->stepSummary, $total, $passCount, $failCount)
. "</li>";
}
return $logHtml;
}
+2
View File
@@ -31,6 +31,7 @@ $config->upgrade->maxVersion['max3_8'] = '17_8';
$config->upgrade->maxVersion['max4_0_beta1'] = '18_0_beta1';
$config->upgrade->maxVersion['max4_0_beta2'] = '18_0_beta2';
$config->upgrade->maxVersion['max4_0_beta3'] = '18_0_beta3';
$config->upgrade->maxVersion['max4_0'] = '18_0';
$config->upgrade->bizVersion = array();
$config->upgrade->bizVersion['biz1_0'] = '9_5_1';
@@ -100,6 +101,7 @@ $config->upgrade->bizVersion['biz7_8'] = '17_8';
$config->upgrade->bizVersion['biz8_0_beta1'] = '18_0_beta1';
$config->upgrade->bizVersion['biz8_0_beta2'] = '18_0_beta2';
$config->upgrade->bizVersion['biz8_0_beta3'] = '18_0_beta3';
$config->upgrade->bizVersion['biz8_0'] = '18_0';
$config->upgrade->proVersion = array();
$config->upgrade->proVersion['pro1_0'] = '3_1';
+3
View File
@@ -172,6 +172,7 @@ $lang->upgrade->fromVersions['17_8'] = '17.8';
$lang->upgrade->fromVersions['18_0_beta1'] = '18.0.beta1';
$lang->upgrade->fromVersions['18_0_beta2'] = '18.0.beta2';
$lang->upgrade->fromVersions['18_0_beta3'] = '18.0.beta3';
$lang->upgrade->fromVersions['18_0'] = '18.0';
global $config;
/* Lite. */
@@ -348,6 +349,7 @@ $lang->upgrade->fromVersions['biz7_8'] = 'Biz7.8';
$lang->upgrade->fromVersions['biz8_0_beta1'] = 'Biz8.0.beta1';
$lang->upgrade->fromVersions['biz8_0_beta2'] = 'Biz8.0.beta2';
$lang->upgrade->fromVersions['biz8_0_beta3'] = 'Biz8.0.beta3';
$lang->upgrade->fromVersions['biz8_0'] = 'Biz8.0';
/* Max. */
$lang->upgrade->fromVersions['max2_0_beta4'] = 'Max2.0.beta4';
@@ -380,3 +382,4 @@ $lang->upgrade->fromVersions['max3_7'] = 'Max3.7';
$lang->upgrade->fromVersions['max3_8'] = 'Max3.8';
$lang->upgrade->fromVersions['max4_0_beta1'] = 'Max4.0.beta1';
$lang->upgrade->fromVersions['max4_0_beta2'] = 'Max4.0.beta2';
$lang->upgrade->fromVersions['max4_0_beta3'] = 'Max4.0.beta3';
+2
View File
@@ -1079,6 +1079,8 @@ class upgradeModel extends model
$confirmContent .= file_get_contents($xuanxuanSql);
case '18_0_beta2':
$confirmContent .= file_get_contents($this->getUpgradeFile('18.0.beta2'));
case '18_0_beta3':
$confirmContent .= file_get_contents($this->getUpgradeFile('18.0.beta3'));
}
return $confirmContent;
+5
View File
@@ -1,3 +1,8 @@
#mainContent td.projectName {white-space: nowrap; overflow-x: hidden;}
#pageNav .angle-btn:first-child a.btn {max-width: 300px; overflow: hidden;}
.totalCount {height: 36px !important; line-height: 30px; font-weight: bold; text-align: right !important; padding: 0px 50px 0px 8px !important; width: 100%;}
#helpDropdown{display:inline-block; padding-left:5px; padding-right:10px;}
#helpDropdown .dropdown-menu{width:600px; text-align:left; height:300px; overflow:auto; background: #fff; padding-left:8px;}
#helpDropdown h2{font-size:14px; padding:0px; margin:0px; margin-top:10px;}
#helpDropdown p{padding:0px; margin:0px; margin-top:10px;}
+102
View File
@@ -41,3 +41,105 @@ $lang->weekly->cv = 'Cost Variance(CV%)';
$lang->weekly->totalCount = 'Total : %u tasks';
$lang->weekly->exportWeeklyReport = 'Export Weekly Report';
$lang->weekly->reportHelpNotice = <<<EOD
<h2>PV Planned Value</h2>
Calculation method:
<br />1) The estimated start date and end date of the task are within the range of the start and end dates of this week, and the estimated work hours are accumulated
<br />2) The estimated start date and end date of the task are before the start and end date of this week, and the estimated work hours are accumulated
<br />3) The scheduled start date of the task is earlier than the start date of this week, the end date is later than the start date of this week, and the scheduled work hours are accumulated when it is earlier than the end date of this week
<br />4) The expected start date of a task is later than the start date of this week, less than the end date of this week, and the end date is later than the end date of this week. The cumulative (expected work hours of the task ÷ task duration days) x the days from the expected start date of the task to the end date of this week
<br />5) The estimated start date of a task is equal to the start date of this week, and the end date is greater than the end date of this week. The cumulative (estimated work hours of the task ÷ task duration days) x the number of days from the estimated start date of the task to the end date of this week
<br />6) The scheduled start date of the task is earlier than the start date of this week, and the end date is equal to the end date of this week. The scheduled work hours are accumulated
<br />7) If the expected start date of a task is earlier than the start date of this week and the end date is later than the end date of this week, the cumulative (expected work hours of the task ÷ task duration days) x the days from the expected start date of the task to the end date of this week
<p>Statistical range:</p>
1) Start date of this week: 00:00:00 on Monday End date of this week: determined according to the calculation of working days and holidays
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude tasks in deleted execution
<br />6) No expected start date is filled in the task. The expected start date defaults to the planned start date of the phase to which the task belongs
<br />7) No expected end date is filled in the task. By default, the expected end date is the planned completion date of the phase to which the task belongs
<br />8) Calculation formula only calculates working days
<h2>EV Earned Value</h2>
Calculation method:
<br />1) The task status is done, and the estimated work hours are accumulated
<br />2) The task status is closed and the reason for closing is done, and the estimated work hours are accumulated
<br />3) The task status is in doing, suspended, and the estimated work hours are accumulated × progress
<p>Statistical range:</p>
1) Tasks whose work consumption is not 0 before the end date of this week
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude tasks in deleted execution
<br />6) Progress= consumed man hours ÷(consumed man hours+remaining man hours)
<h2>AC Actual Cost</h2>
Calculation method:
<br />1) Accumulate all consumed work hours before the end date of this week
<p>Statistical range:</p>
1) All consumed man hours include task, requirement, bug, use case, version, test sheet, problem, risk, document and review time
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Including deleted tasks, requirements, bugs, use cases, versions, test sheets, problems, risks, documents, and time consuming of reviews
<br />4) Including the time consumption of deleted tasks, requirements, bugs, use cases, versions, test sheets and documents in execution
<br />5) Including the time consumption of cancelled tasks, problems and risks
<h2>SV(%) Schedule Variance</h2>
Calculation method: SV(%) = -1 * (1 - (EV / PV))%
<h2>CV(%) Cost Variance</h2>
Calculation method: CV(%) = -1 * (1 - (EV / AC))%
EOD;
$lang->weekly->blockHelpNotice = <<<EOD
<h2>Progress this week</h2>
Calculation method:
<br />1) Progress of this week=total consumed man hours/(total consumed man hours+remaining man hours)
<p>Statistical range:</p>
1) The total consumed man hours include task, demand, bug, use case, version, test sheet, problem, risk, document and review time
<br />2) To avoid repeated calculation, the task only contains child tasks, not parent tasks
<br />3) Including deleted tasks, requirements, bugs, use cases, versions, test sheets, problems, risks, documents, and consumed man hours in reviews
<br />4) This includes the work hours consumed by deleted tasks, requirements, bugs, use cases, versions, test sheets, and documents
<br />5) Including work hours consumed by cancelled tasks, problems and risks
<br />6) Exclude remaining work on canceled tasks
<br />7) Exclude remaining work for deleted tasks in progress
<h2>PV Planned Value</h2>
Calculation method:
<br />1) The estimated start date and end date of the task are within the range of the start and end dates of this week, and the estimated work hours are accumulated
<br />2) The estimated start date and end date of the task are before the start and end date of this week, and the estimated work hours are accumulated
<br />3) The scheduled start date of the task is earlier than the start date of this week, the end date is later than the start date of this week, and the scheduled work hours are accumulated when it is earlier than the end date of this week
<br />4) The expected start date of a task is later than the start date of this week, less than the end date of this week, and the end date is later than the end date of this week. The cumulative (expected work hours of the task ÷ task duration days) x the days from the expected start date of the task to the end date of this week
<br />5) The estimated start date of a task is equal to the start date of this week, and the end date is greater than the end date of this week. Accumulate (estimated work hours of a task ÷ task duration days) × The number of days from the expected start of the task to the end of this week
<br />6) The scheduled start date of the task is earlier than the start date of this week, and the end date is equal to the end date of this week. The scheduled work hours are accumulated
<br />7) The expected start date of a task is earlier than the start date of this week, and the end date is later than the end date of this week. Accumulate (the expected work hours of the task ÷ the task duration days) × The number of days from the expected start of the task to the end of this week
<p>Statistical range:</p>
1) Start date of this week: 00:00:00 on Monday End date of this week: determined according to the calculation of working days and holidays
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude tasks in deleted execution
<br />6) No expected start date is filled in the task. The expected start date defaults to the planned start date of the phase to which the task belongs
<br />7) No expected end date is filled in the task. By default, the expected end date is the planned completion date of the phase to which the task belongs
<br />8) Calculation formula only calculates working days
<h2>EV Earned Value</h2>
Calculation method:
<br />1) The task status is done, and the estimated work hours are accumulated
<br />2) The task status is closed and the reason for closing is done, and the estimated work hours are accumulated
<br />3) The task status is in doing, suspended, and the estimated work hours are accumulated ×progress
<p>Statistical range:</p>
1) Tasks whose work consumption is not 0 before the end date of this week
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude deleted tasks in progress
<br />6) Progress=consumed man hours ÷ (consumed man hours+remaining man hours)
<h2>AC Actual Cost</h2>
Calculation method:
<br />1) Accumulate all consumed work hours before the end date of this week
<p>Statistical range:</p>
1) All consumed man hours include task, requirement, bug, use case, version, test sheet, problem, risk, document and review time
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Including deleted tasks, requirements, bugs, use cases, versions, test sheets, problems, risks, documents, and time consuming of reviews
<br />4) Including the time consumption of deleted tasks, requirements, bugs, use cases, versions, test sheets and documents in execution
<br />5) Including the time consumption of cancelled tasks, problems and risks
<h2>SV(%) Schedule Variance</h2>
Calculation method: SV(%) = -1 * (1 - (EV / PV))%
<h2>CV(%) Schedule Variance</h2>
Calculation method: CV(%) = -1 * (1 - (EV / AC))%
EOD;
+102
View File
@@ -41,3 +41,105 @@ $lang->weekly->cv = 'Cost Variance(CV%)';
$lang->weekly->totalCount = 'Total : %u tasks';
$lang->weekly->exportWeeklyReport = 'Export Weekly Report';
$lang->weekly->reportHelpNotice = <<<EOD
<h2>PV Planned Value</h2>
Calculation method:
<br />1) The estimated start date and end date of the task are within the range of the start and end dates of this week, and the estimated work hours are accumulated
<br />2) The estimated start date and end date of the task are before the start and end date of this week, and the estimated work hours are accumulated
<br />3) The scheduled start date of the task is earlier than the start date of this week, the end date is later than the start date of this week, and the scheduled work hours are accumulated when it is earlier than the end date of this week
<br />4) The expected start date of a task is later than the start date of this week, less than the end date of this week, and the end date is later than the end date of this week. The cumulative (expected work hours of the task ÷ task duration days) x the days from the expected start date of the task to the end date of this week
<br />5) The estimated start date of a task is equal to the start date of this week, and the end date is greater than the end date of this week. The cumulative (estimated work hours of the task ÷ task duration days) x the number of days from the estimated start date of the task to the end date of this week
<br />6) The scheduled start date of the task is earlier than the start date of this week, and the end date is equal to the end date of this week. The scheduled work hours are accumulated
<br />7) If the expected start date of a task is earlier than the start date of this week and the end date is later than the end date of this week, the cumulative (expected work hours of the task ÷ task duration days) x the days from the expected start date of the task to the end date of this week
<p>Statistical range:</p>
1) Start date of this week: 00:00:00 on Monday End date of this week: determined according to the calculation of working days and holidays
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude tasks in deleted execution
<br />6) No expected start date is filled in the task. The expected start date defaults to the planned start date of the phase to which the task belongs
<br />7) No expected end date is filled in the task. By default, the expected end date is the planned completion date of the phase to which the task belongs
<br />8) Calculation formula only calculates working days
<h2>EV Earned Value</h2>
Calculation method:
<br />1) The task status is done, and the estimated work hours are accumulated
<br />2) The task status is closed and the reason for closing is done, and the estimated work hours are accumulated
<br />3) The task status is in doing, suspended, and the estimated work hours are accumulated × progress
<p>Statistical range:</p>
1) Tasks whose work consumption is not 0 before the end date of this week
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude tasks in deleted execution
<br />6) Progress= consumed man hours ÷(consumed man hours+remaining man hours)
<h2>AC Actual Cost</h2>
Calculation method:
<br />1) Accumulate all consumed work hours before the end date of this week
<p>Statistical range:</p>
1) All consumed man hours include task, requirement, bug, use case, version, test sheet, problem, risk, document and review time
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Including deleted tasks, requirements, bugs, use cases, versions, test sheets, problems, risks, documents, and time consuming of reviews
<br />4) Including the time consumption of deleted tasks, requirements, bugs, use cases, versions, test sheets and documents in execution
<br />5) Including the time consumption of cancelled tasks, problems and risks
<h2>SV(%) Schedule Variance</h2>
Calculation method: SV(%) = -1 * (1 - (EV / PV))%
<h2>CV(%) Cost Variance</h2>
Calculation method: CV(%) = -1 * (1 - (EV / AC))%
EOD;
$lang->weekly->blockHelpNotice = <<<EOD
<h2>Progress this week</h2>
Calculation method:
<br />1) Progress of this week=total consumed man hours/(total consumed man hours+remaining man hours)
<p>Statistical range:</p>
1) The total consumed man hours include task, demand, bug, use case, version, test sheet, problem, risk, document and review time
<br />2) To avoid repeated calculation, the task only contains child tasks, not parent tasks
<br />3) Including deleted tasks, requirements, bugs, use cases, versions, test sheets, problems, risks, documents, and consumed man hours in reviews
<br />4) This includes the work hours consumed by deleted tasks, requirements, bugs, use cases, versions, test sheets, and documents
<br />5) Including work hours consumed by cancelled tasks, problems and risks
<br />6) Exclude remaining work on canceled tasks
<br />7) Exclude remaining work for deleted tasks in progress
<h2>PV Planned Value</h2>
Calculation method:
<br />1) The estimated start date and end date of the task are within the range of the start and end dates of this week, and the estimated work hours are accumulated
<br />2) The estimated start date and end date of the task are before the start and end date of this week, and the estimated work hours are accumulated
<br />3) The scheduled start date of the task is earlier than the start date of this week, the end date is later than the start date of this week, and the scheduled work hours are accumulated when it is earlier than the end date of this week
<br />4) The expected start date of a task is later than the start date of this week, less than the end date of this week, and the end date is later than the end date of this week. The cumulative (expected work hours of the task ÷ task duration days) x the days from the expected start date of the task to the end date of this week
<br />5) The estimated start date of a task is equal to the start date of this week, and the end date is greater than the end date of this week. Accumulate (estimated work hours of a task ÷ task duration days) × The number of days from the expected start of the task to the end of this week
<br />6) The scheduled start date of the task is earlier than the start date of this week, and the end date is equal to the end date of this week. The scheduled work hours are accumulated
<br />7) The expected start date of a task is earlier than the start date of this week, and the end date is later than the end date of this week. Accumulate (the expected work hours of the task ÷ the task duration days) × The number of days from the expected start of the task to the end of this week
<p>Statistical range:</p>
1) Start date of this week: 00:00:00 on Monday End date of this week: determined according to the calculation of working days and holidays
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude tasks in deleted execution
<br />6) No expected start date is filled in the task. The expected start date defaults to the planned start date of the phase to which the task belongs
<br />7) No expected end date is filled in the task. By default, the expected end date is the planned completion date of the phase to which the task belongs
<br />8) Calculation formula only calculates working days
<h2>EV Earned Value</h2>
Calculation method:
<br />1) The task status is done, and the estimated work hours are accumulated
<br />2) The task status is closed and the reason for closing is done, and the estimated work hours are accumulated
<br />3) The task status is in doing, suspended, and the estimated work hours are accumulated ×progress
<p>Statistical range:</p>
1) Tasks whose work consumption is not 0 before the end date of this week
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude deleted tasks in progress
<br />6) Progress=consumed man hours ÷ (consumed man hours+remaining man hours)
<h2>AC Actual Cost</h2>
Calculation method:
<br />1) Accumulate all consumed work hours before the end date of this week
<p>Statistical range:</p>
1) All consumed man hours include task, requirement, bug, use case, version, test sheet, problem, risk, document and review time
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Including deleted tasks, requirements, bugs, use cases, versions, test sheets, problems, risks, documents, and time consuming of reviews
<br />4) Including the time consumption of deleted tasks, requirements, bugs, use cases, versions, test sheets and documents in execution
<br />5) Including the time consumption of cancelled tasks, problems and risks
<h2>SV(%) Schedule Variance</h2>
Calculation method: SV(%) = -1 * (1 - (EV / PV))%
<h2>CV(%) Schedule Variance</h2>
Calculation method: CV(%) = -1 * (1 - (EV / AC))%
EOD;
+102
View File
@@ -41,3 +41,105 @@ $lang->weekly->cv = 'Cost Variance(CV%)';
$lang->weekly->totalCount = 'Total : %u tasks';
$lang->weekly->exportWeeklyReport = 'Export Weekly Report';
$lang->weekly->reportHelpNotice = <<<EOD
<h2>PV Planned Value</h2>
Calculation method:
<br />1) The estimated start date and end date of the task are within the range of the start and end dates of this week, and the estimated work hours are accumulated
<br />2) The estimated start date and end date of the task are before the start and end date of this week, and the estimated work hours are accumulated
<br />3) The scheduled start date of the task is earlier than the start date of this week, the end date is later than the start date of this week, and the scheduled work hours are accumulated when it is earlier than the end date of this week
<br />4) The expected start date of a task is later than the start date of this week, less than the end date of this week, and the end date is later than the end date of this week. The cumulative (expected work hours of the task ÷ task duration days) x the days from the expected start date of the task to the end date of this week
<br />5) The estimated start date of a task is equal to the start date of this week, and the end date is greater than the end date of this week. The cumulative (estimated work hours of the task ÷ task duration days) x the number of days from the estimated start date of the task to the end date of this week
<br />6) The scheduled start date of the task is earlier than the start date of this week, and the end date is equal to the end date of this week. The scheduled work hours are accumulated
<br />7) If the expected start date of a task is earlier than the start date of this week and the end date is later than the end date of this week, the cumulative (expected work hours of the task ÷ task duration days) x the days from the expected start date of the task to the end date of this week
<p>Statistical range:</p>
1) Start date of this week: 00:00:00 on Monday End date of this week: determined according to the calculation of working days and holidays
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude tasks in deleted execution
<br />6) No expected start date is filled in the task. The expected start date defaults to the planned start date of the phase to which the task belongs
<br />7) No expected end date is filled in the task. By default, the expected end date is the planned completion date of the phase to which the task belongs
<br />8) Calculation formula only calculates working days
<h2>EV Earned Value</h2>
Calculation method:
<br />1) The task status is done, and the estimated work hours are accumulated
<br />2) The task status is closed and the reason for closing is done, and the estimated work hours are accumulated
<br />3) The task status is in doing, suspended, and the estimated work hours are accumulated × progress
<p>Statistical range:</p>
1) Tasks whose work consumption is not 0 before the end date of this week
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude tasks in deleted execution
<br />6) Progress= consumed man hours ÷(consumed man hours+remaining man hours)
<h2>AC Actual Cost</h2>
Calculation method:
<br />1) Accumulate all consumed work hours before the end date of this week
<p>Statistical range:</p>
1) All consumed man hours include task, requirement, bug, use case, version, test sheet, problem, risk, document and review time
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Including deleted tasks, requirements, bugs, use cases, versions, test sheets, problems, risks, documents, and time consuming of reviews
<br />4) Including the time consumption of deleted tasks, requirements, bugs, use cases, versions, test sheets and documents in execution
<br />5) Including the time consumption of cancelled tasks, problems and risks
<h2>SV(%) Schedule Variance</h2>
Calculation method: SV(%) = -1 * (1 - (EV / PV))%
<h2>CV(%) Cost Variance</h2>
Calculation method: CV(%) = -1 * (1 - (EV / AC))%
EOD;
$lang->weekly->blockHelpNotice = <<<EOD
<h2>Progress this week</h2>
Calculation method:
<br />1) Progress of this week=total consumed man hours/(total consumed man hours+remaining man hours)
<p>Statistical range:</p>
1) The total consumed man hours include task, demand, bug, use case, version, test sheet, problem, risk, document and review time
<br />2) To avoid repeated calculation, the task only contains child tasks, not parent tasks
<br />3) Including deleted tasks, requirements, bugs, use cases, versions, test sheets, problems, risks, documents, and consumed man hours in reviews
<br />4) This includes the work hours consumed by deleted tasks, requirements, bugs, use cases, versions, test sheets, and documents
<br />5) Including work hours consumed by cancelled tasks, problems and risks
<br />6) Exclude remaining work on canceled tasks
<br />7) Exclude remaining work for deleted tasks in progress
<h2>PV Planned Value</h2>
Calculation method:
<br />1) The estimated start date and end date of the task are within the range of the start and end dates of this week, and the estimated work hours are accumulated
<br />2) The estimated start date and end date of the task are before the start and end date of this week, and the estimated work hours are accumulated
<br />3) The scheduled start date of the task is earlier than the start date of this week, the end date is later than the start date of this week, and the scheduled work hours are accumulated when it is earlier than the end date of this week
<br />4) The expected start date of a task is later than the start date of this week, less than the end date of this week, and the end date is later than the end date of this week. The cumulative (expected work hours of the task ÷ task duration days) x the days from the expected start date of the task to the end date of this week
<br />5) The estimated start date of a task is equal to the start date of this week, and the end date is greater than the end date of this week. Accumulate (estimated work hours of a task ÷ task duration days) × The number of days from the expected start of the task to the end of this week
<br />6) The scheduled start date of the task is earlier than the start date of this week, and the end date is equal to the end date of this week. The scheduled work hours are accumulated
<br />7) The expected start date of a task is earlier than the start date of this week, and the end date is later than the end date of this week. Accumulate (the expected work hours of the task ÷ the task duration days) × The number of days from the expected start of the task to the end of this week
<p>Statistical range:</p>
1) Start date of this week: 00:00:00 on Monday End date of this week: determined according to the calculation of working days and holidays
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude tasks in deleted execution
<br />6) No expected start date is filled in the task. The expected start date defaults to the planned start date of the phase to which the task belongs
<br />7) No expected end date is filled in the task. By default, the expected end date is the planned completion date of the phase to which the task belongs
<br />8) Calculation formula only calculates working days
<h2>EV Earned Value</h2>
Calculation method:
<br />1) The task status is done, and the estimated work hours are accumulated
<br />2) The task status is closed and the reason for closing is done, and the estimated work hours are accumulated
<br />3) The task status is in doing, suspended, and the estimated work hours are accumulated ×progress
<p>Statistical range:</p>
1) Tasks whose work consumption is not 0 before the end date of this week
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Exclude deleted tasks
<br />4) Exclude canceled tasks
<br />5) Exclude deleted tasks in progress
<br />6) Progress=consumed man hours ÷ (consumed man hours+remaining man hours)
<h2>AC Actual Cost</h2>
Calculation method:
<br />1) Accumulate all consumed work hours before the end date of this week
<p>Statistical range:</p>
1) All consumed man hours include task, requirement, bug, use case, version, test sheet, problem, risk, document and review time
<br />2) To avoid repeated calculation, only child tasks are included, not parent tasks
<br />3) Including deleted tasks, requirements, bugs, use cases, versions, test sheets, problems, risks, documents, and time consuming of reviews
<br />4) Including the time consumption of deleted tasks, requirements, bugs, use cases, versions, test sheets and documents in execution
<br />5) Including the time consumption of cancelled tasks, problems and risks
<h2>SV(%) Schedule Variance</h2>
Calculation method: SV(%) = -1 * (1 - (EV / PV))%
<h2>CV(%) Schedule Variance</h2>
Calculation method: CV(%) = -1 * (1 - (EV / AC))%
EOD;
+103
View File
@@ -41,3 +41,106 @@ $lang->weekly->cv = '成本偏差率(CV%)';
$lang->weekly->totalCount = '总计 : %u 个任务';
$lang->weekly->exportWeeklyReport = '导出周报';
$lang->weekly->reportHelpNotice = <<<EOD
<h2>PV 计划完成的工作</h2>
计算方式:
<br />1)任务预计开始日期、截止日期在本周起止日期范围内,累加预计工时
<br />2)任务预计开始日期、截止日期在本周起止日期之前,累加预计工时
<br />3)任务预计开始日期小于本周开始日期,截止日期大于本周开始日期,小于本周结束日期,累加预计工时
<br />4)任务预计开始日期大于本周开始日期,小于本周截止日期,截止日期大于本周结束日期,累加 (任务的预计工时÷任务工期天数)× 任务预计开始到本周结束日期的天数
<br />5)任务预计开始日期等于本周开始日期,截止日期大于本周结束日期,累加 (任务的预计工时÷任务工期天数)× 任务预计开始到本周结束日期的天数
<br />6)任务预计开始日期小于本周开始日期,截止日期等于本周结束日期,累加预计工时
<br />7)任务预计开始日期小于本周开始日期,截止日期大于本周结束日期,累加 (任务的预计工时÷任务工期天数)× 任务预计开始到本周结束日期的天数
<p>统计范围:</p>
1)本周开始日期:周一 00:00:00 本周结束日期:根据工作日和节假日的计算来确定
<br />2)为避免重复计算,只包含子任务,不包括父任务
<br />3)不包括已删除的任务
<br />4)不包括已取消的任务
<br />5)不包括已删除执行中的任务
<br />6)任务未填写预计开始日期,预计开始日期默认取任务所属阶段的计划开始日期
<br />7)任务未填写预计截止日期,预计截止日期默认取任务所属阶段的计划完成日期
<br />8)计算公式只计算工作日
<h2>EV实际完成的工作</h2>
计算方式:
<br />1)任务状态为已完成,累加预计工时
<br />2)任务状态为已关闭且关闭原因为已完成,累加预计工时
<br />3)任务状态为进行中、已暂停,累加 预计工时×完成进度
<p>统计范围:</p>
1)本周结束日期之前消耗工时不为0的任务
<br />2)为避免重复计算,只包含子任务,不包括父任务
<br />3)不包括已删除的任务
<br />4)不包括已取消的任务
<br />5)不包括已删除执行中的任务
<br />6)完成进度=已消耗工时÷(已消耗工时+剩余工时)
<h2>AC 实际花费(消耗)的成本</h2>
计算方式:
<br />1)累加本周结束日期之前所有消耗的工时
<p>统计范围:</p>
1)所有消耗的工时包括任务、需求、Bug、用例、版本、测试单、问题、风险、文档、评审的耗时
<br />2)为避免重复计算,只包含子任务,不包括父任务
<br />3)包括已删除的任务、需求、Bug、用例、版本、测试单、问题、风险、文档、评审的耗时
<br />4)包括已删除执行中任务、需求、Bug、用例、版本、测试单、文档的耗时
<br />5)包括取消的任务、问题、风险的耗时
<h2>SV(%)进度偏差率</h2>
计算方式:SV(%) = -1 * (1 - (EV / PV))%
<h2>CV(%) 成本偏差率</h2>
计算方式:CV(%) = -1 * (1 - (EV / AC))%
EOD;
$lang->weekly->blockHelpNotice = <<<EOD
<h2>本周进度</h2>
计算方式:
<br />1)本周进度=总消耗工时/(总消耗工时+剩余工时)
<p>统计范围:</p>
1)总消耗的工时包括任务、需求、Bug、用例、版本、测试单、问题、风险、文档、评审的耗时
<br />2)为避免重复计算,任务只包含子任务,不包括父任务
<br />3)包括已删除任务、需求、Bug、用例、版本、测试单、问题、风险、文档、评审中已消耗的工时
<br />4)包括已删除执行中任务、需求、Bug、用例、版本、测试单、文档已消耗的工时
<br />5)包括已取消任务、问题、风险已消耗的工时
<br />6)不包括已取消任务的剩余工时
<br />7)不包括已删除执行中任务的剩余工时
<h2>PV 计划完成的工作</h2>
计算方式:
<br />1)任务预计开始日期、截止日期在本周起止日期范围内,累加预计工时
<br />2)任务预计开始日期、截止日期在本周起止日期之前,累加预计工时
<br />3)任务预计开始日期小于本周开始日期,截止日期大于本周开始日期,小于本周结束日期,累加预计工时
<br />4)任务预计开始日期大于本周开始日期,小于本周截止日期,截止日期大于本周结束日期,累加 (任务的预计工时÷任务工期天数)× 任务预计开始到本周结束日期的天数
<br />5)任务预计开始日期等于本周开始日期,截止日期大于本周结束日期,累加 (任务的预计工时÷任务工期天数)× 任务预计开始到本周结束日期的天数
<br />6)任务预计开始日期小于本周开始日期,截止日期等于本周结束日期,累加预计工时
<br />7)任务预计开始日期小于本周开始日期,截止日期大于本周结束日期,累加 (任务的预计工时÷任务工期天数)× 任务预计开始到本周结束日期的天数
<p>统计范围:</p>
1)本周开始日期:周一 00:00:00 本周结束日期:根据工作日和节假日的计算来确定
<br />2)为避免重复计算,只包含子任务,不包括父任务
<br />3)不包括已删除的任务
<br />4)不包括已取消的任务
<br />5)不包括已删除执行中的任务
<br />6)任务未填写预计开始日期,预计开始日期默认取任务所属阶段的计划开始日期
<br />7)任务未填写预计截止日期,预计截止日期默认取任务所属阶段的计划完成日期
<br />8)计算公式只计算工作日
<h2>EV实际完成的工作</h2>
计算方式:
<br />1)任务状态为已完成,累加预计工时
<br />2)任务状态为已关闭且关闭原因为已完成,累加预计工时
<br />3)任务状态为进行中、已暂停,累加 预计工时×完成进度
<p>统计范围:</p>
1)本周结束日期之前消耗工时不为0的任务
<br />2)为避免重复计算,只包含子任务,不包括父任务
<br />3)不包括已删除的任务
<br />4)不包括已取消的任务
<br />5)不包括已删除执行中的任务
<br />6)完成进度=已消耗工时÷(已消耗工时+剩余工时)
<h2>AC 实际花费(消耗)的成本</h2>
计算方式:
<br />1)累加本周结束日期之前所有消耗的工时
<p>统计范围:</p>
1)所有消耗的工时包括任务、需求、Bug、用例、版本、测试单、问题、风险、文档、评审的耗时
<br />2)为避免重复计算,只包含子任务,不包括父任务
<br />3)包括已删除的任务、需求、Bug、用例、版本、测试单、问题、风险、文档、评审的耗时
<br />4)包括已删除执行中任务、需求、Bug、用例、版本、测试单、文档的耗时
<br />5)包括取消的任务、问题、风险的耗时
<br />
<h2>SV(%)进度偏差率</h2>
计算方式:SV(%) = -1 * (1 - (EV / PV))%
<h2>CV(%) 成本偏差率</h2>
计算方式:CV(%) = -1 * (1 - (EV / AC))%
EOD;
+62 -47
View File
@@ -116,13 +116,9 @@ class weeklyModel extends model
public function save($project, $date)
{
$weekStart = $this->getThisMonday($date);
$this->dao->delete()->from(TABLE_WEEKLYREPORT)
->where('project')->eq($project)
->andWhere('weekStart')->eq($weekStart)
->exec();
$report = new stdclass();
$PVEV = $this->getPVEV($project, $date);
$report = new stdclass;
$PVEV = $this->getPVEV($project, $date);
$report->pv = $PVEV['PV'];
$report->ev = $PVEV['EV'];
$report->ac = $this->getAC($project, $date);
@@ -385,61 +381,49 @@ class weeklyModel extends model
if(!empty($report)) return array('PV' => $report->pv, 'EV' => $report->ev);
if(!$date) $date = date('Y-m-d');
$monday = $this->getThisMonday($date);
$sunday = $this->getThisSunday($date);
$lastDay = $this->getLastDay($date);
$nextMonday = date('Y-m-d', strtotime($sunday) + 24 * 3600);
$workdays = $this->loadModel('holiday')->getActualWorkingDays($monday, $sunday);
$executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($projectID)->fetchAll('id');
$lastDay = $this->getLastDay($date);
$monday = $this->getThisMonday($date);
if(empty($lastDay)) $lastDay = $monday;
$tasks = $this->dao->select('*')->from(TABLE_TASK)
$executions = $this->dao->select('id,begin,end,realBegan,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($projectID)->fetchAll('id');
$stmt = $this->dao->select('*')->from(TABLE_TASK)
->where('execution')->in(array_keys($executions))
->andWhere("parent")->ge(0)
->andWhere("deleted")->eq(0)
->andWhere("((estStarted >= '$monday' AND estStarted < '$nextMonday') OR (deadline >= '$monday' AND deadline < '$nextMonday') OR (estStarted < '$monday' AND deadline > '$nextMonday'))")
->fetchAll('id');
->andWhere("status")->ne('cancel')
->query();
$PV = 0;
$EV = 0;
$this->loadModel('holiday');
foreach($tasks as $task)
while($task = $stmt->fetch())
{
if(empty($task->execution)) continue;
$execution = $executions[$task->execution];
if(helper::isZeroDate($task->estStarted)) $task->estStarted = helper::isZeroDate($task->openedDate) ? $execution->begin : date('Y-m-d', strtotime($task->openedDate));
if(helper::isZeroDate($task->deadline))
{
$task->deadline = helper::isZeroDate($execution->realEnd) ? $execution->end : $execution->realEnd;
if(!helper::isZeroDate($task->finishedDate)) $task->deadline = date('Y-m-d', strtotime($task->finishedDate));
}
if(helper::isZeroDate($task->estStarted)) $task->estStarted = $execution->begin;
if(helper::isZeroDate($task->deadline)) $task->deadline = $execution->end;
$fullDays = $this->holiday->getActualWorkingDays($task->estStarted, $task->deadline);
if($task->estStarted < $monday and $task->deadline >= $nextMonday)
if($task->deadline <= $lastDay)
{
$weekActualDays = $workdays;
$PV += $task->estimate;
}
elseif($task->estStarted >= $monday and $task->estStarted < $nextMonday)
elseif($task->estStarted <= $lastDay)
{
$weekActualDays = $this->holiday->getActualWorkingDays($task->estStarted, $task->deadline >= $nextMonday ? $sunday : $task->deadline);
$fullDays = $this->holiday->getActualWorkingDays($task->estStarted, $task->deadline);
$weekActualDays = $this->holiday->getActualWorkingDays($task->estStarted, $lastDay);
if(!empty($fullDays) and !empty($weekActualDays)) $PV += round(count($weekActualDays) / count($fullDays) * $task->estimate, 2);
}
elseif($task->deadline >= $monday and $task->deadline < $nextMonday)
{
$weekActualDays = $this->holiday->getActualWorkingDays($monday, $task->deadline);
}
if(empty($fullDays) or empty($weekActualDays) or empty($task->estimate)) continue;
$thisPV = round(count($weekActualDays) / count($fullDays) * $task->estimate, 2);
if($task->status == 'done' or $task->closedReason == 'done')
{
$EV += $thisPV;
$EV += $task->estimate;
}
else
{
$task->progress = 0;
if(($task->consumed + $task->left) > 0) $task->progress = round($task->consumed / ($task->consumed + $task->left) * 100, 2);
$EV += round($thisPV * $task->progress / 100, 2);
$EV += round($task->estimate * $task->progress / 100, 2);
}
$PV += $thisPV;
}
return array('PV' => sprintf("%.2f", $PV), 'EV' => sprintf("%.2f", $EV));
@@ -459,19 +443,14 @@ class weeklyModel extends model
if(!empty($report)) return $report->ac;
if(!$date) $date = date('Y-m-d');
$monday = $this->getThisMonday($date);
$nextMonday = date('Y-m-d', strtotime($monday) + (7 * 24 * 3600));
$executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($project)->fetchAll('id');
$taskIdList = $this->dao->select('id')->from(TABLE_TASK)->where('execution')->in(array_keys($executions))->andWhere("parent")->ge(0)->andWhere("deleted")->eq(0)->fetchPairs();
$lastDay = $this->getLastDay($date);
if(empty($lastDay)) $lastDay = $this->getThisMonday($date);
$AC = $this->dao->select('sum(consumed) as consumed')
->from(TABLE_EFFORT)
->where('objectType')->eq('task')
->andWhere('objectID')->in($taskIdList)
->andWhere('date')->ge($monday)
->andWhere('date')->lt($nextMonday)
->andWhere('deleted')->eq('0')
->where('project')->eq($project)
->andWhere('date')->le($lastDay)
->andWhere('deleted')->eq(0)
->fetch('consumed');
if(is_null($AC)) $AC = 0;
@@ -479,6 +458,42 @@ class weeklyModel extends model
return sprintf("%.2f", $AC);
}
/**
* Get left.
*
* @param int $projectID
* @param string $date
* @access public
* @return float
*/
public function getLeft($projectID, $date = '')
{
if(!$date) $date = date('Y-m-d');
$lastDay = $this->getLastDay($date);
$monday = $this->getThisMonday($date);
if(empty($lastDay)) $lastDay = $monday;
$executions = $this->dao->select('id,begin,end,realBegan,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($projectID)->fetchAll('id');
$stmt = $this->dao->select('*')->from(TABLE_TASK)
->where('execution')->in(array_keys($executions))
->andWhere("parent")->ge(0)
->andWhere("deleted")->eq(0)
->andWhere("status")->ne('cancel')
->query();
$left = 0;
while($task = $stmt->fetch())
{
$execution = $executions[$task->execution];
if(helper::isZeroDate($task->estStarted)) $task->estStarted = $execution->begin;
if(helper::isZeroDate($task->deadline)) $task->deadline = $execution->end;
if($task->deadline <= $lastDay or ($task->estStarted <= $lastDay and $task->deadline > $lastDay)) $left += $task->left;
}
return sprintf("%.2f", $left);
}
/**
* Get SV data.
*
+10 -5
View File
@@ -13,10 +13,7 @@
<?php js::set('selectedWeekBegin', $date);?>
<?php if(common::hasPriv('weekly', 'exportweeklyreport')):?>
<script>
$(function()
{
$('#exportreport').modalTrigger();
});
$(function(){$('#exportreport').modalTrigger();});
</script>
<?php endif;?>
<div id="mainMenu" class="clearfix text-center">
@@ -39,7 +36,15 @@ $(function()
<div class='page-title'><h4><?php echo $lang->weekly->summary;?></h4></div>
<table class='table table-bordered'>
<tr>
<td><?php echo $lang->weekly->progress;?></td>
<td>
<?php echo $lang->weekly->progress;?>
<div id='helpDropdown' class="dropdown dropdown-hover">
<a data-toggle="dropdown"><i class="icon-help"></i></a>
<div class="dropdown-menu">
<?php echo $lang->weekly->reportHelpNotice;?>
</div>
</div>
</td>
<td></td>
<td><?php echo $lang->weekly->analysisResult;?></td>
<td></td>
+2 -1
View File
@@ -13,6 +13,7 @@
.fail{color:red;}
.dot-symbol{padding-right:10px;}
#statusContainer{margin:0px 0px 10px 0px;}
#checkServiceStatus{background-color:unset;}
#checkServiceStatus{background-color: #ffffff;}
#checkServiceStatus:hover{background-color: #f0fdfb;}
.service-check{margin-top: 0px;}
.checkStatus{color: #313c52;}
+5
View File
@@ -1,6 +1,7 @@
ajaxGetServiceStatus();
function ajaxGetServiceStatus()
{
$('#serviceContent').addClass('loading');
$.get(createLink('zahost', 'ajaxGetServiceStatus', 'hostID=' + hostID), function(response)
{
var resultData = JSON.parse(response);
@@ -31,6 +32,10 @@ function ajaxGetServiceStatus()
$('.result .init-fail').addClass('hide')
$('.result .init-success').removeClass('hide')
}
setTimeout(function() {
$('#serviceContent').removeClass('loading');
}, 500);
});
return
+8 -7
View File
@@ -4,7 +4,7 @@ $lang->zahost->common = 'ZAhost';
$lang->zahost->browse = 'Host List';
$lang->zahost->create = 'Add Host';
$lang->zahost->view = 'Host View';
$lang->zahost->init = 'Init Host';
$lang->zahost->initTitle = 'Init Host';
$lang->zahost->edit = 'Edit';
$lang->zahost->editAction = 'Edit Host';
$lang->zahost->delete = 'Delete';
@@ -33,11 +33,12 @@ $lang->zahost->editedBy = 'EditedBy';
$lang->zahost->editedDate = 'EditedDate';
$lang->zahost->registerDate = 'RegisterDate';
$lang->zahost->memorySize = $lang->zahost->memory;
$lang->zahost->cpuCoreNum = $lang->zahost->cpuCores;
$lang->zahost->os = 'System';
$lang->zahost->imageName = 'Image File';
$lang->zahost->browseImage = 'Image List';
$lang->zahost->memorySize = $lang->zahost->memory;
$lang->zahost->cpuCoreNum = $lang->zahost->cpuCores;
$lang->zahost->os = 'System';
$lang->zahost->imageName = 'Image File';
$lang->zahost->browseImage = 'Image List';
$lang->zahost->downloadImage = 'Download Image';
$lang->zahost->createZanode = 'Create Node';
$lang->zahost->initNotice = 'Save successfully, initialize the ZAhost or return list';
@@ -73,7 +74,7 @@ $lang->zahost->image = new stdclass;
$lang->zahost->image->browseImage = 'Image List';
$lang->zahost->image->createImage = 'Create Image';
$lang->zahost->image->choseImage = 'Select Image';
$lang->zahost->image->downloadImage = 'Download Image';
$lang->zahost->image->downloadImage = $lang->zahost->downloadImage;
$lang->zahost->image->startDowload = 'Start Download';
$lang->zahost->image->common = 'Image';
+8 -7
View File
@@ -4,7 +4,7 @@ $lang->zahost->common = 'ZAhost';
$lang->zahost->browse = 'Host List';
$lang->zahost->create = 'Add Host';
$lang->zahost->view = 'Host View';
$lang->zahost->init = 'Init Host';
$lang->zahost->initTitle = 'Init Host';
$lang->zahost->edit = 'Edit';
$lang->zahost->editAction = 'Edit Host';
$lang->zahost->delete = 'Delete';
@@ -33,11 +33,12 @@ $lang->zahost->editedBy = 'EditedBy';
$lang->zahost->editedDate = 'EditedDate';
$lang->zahost->registerDate = 'RegisterDate';
$lang->zahost->memorySize = $lang->zahost->memory;
$lang->zahost->cpuCoreNum = $lang->zahost->cpuCores;
$lang->zahost->os = 'System';
$lang->zahost->imageName = 'Image File';
$lang->zahost->browseImage = 'Image List';
$lang->zahost->memorySize = $lang->zahost->memory;
$lang->zahost->cpuCoreNum = $lang->zahost->cpuCores;
$lang->zahost->os = 'System';
$lang->zahost->imageName = 'Image File';
$lang->zahost->browseImage = 'Image List';
$lang->zahost->downloadImage = 'Download Image';
$lang->zahost->createZanode = 'Create Node';
$lang->zahost->initNotice = 'Save successfully, initialize the ZAhost or return list';
@@ -73,7 +74,7 @@ $lang->zahost->image = new stdclass;
$lang->zahost->image->browseImage = 'Image List';
$lang->zahost->image->createImage = 'Create Image';
$lang->zahost->image->choseImage = 'Select Image';
$lang->zahost->image->downloadImage = 'Download Image';
$lang->zahost->image->downloadImage = $lang->zahost->downloadImage;
$lang->zahost->image->startDowload = 'Start Download';
$lang->zahost->image->common = 'Image';
+8 -7
View File
@@ -4,7 +4,7 @@ $lang->zahost->common = 'ZAhost';
$lang->zahost->browse = 'Host List';
$lang->zahost->create = 'Add Host';
$lang->zahost->view = 'Host View';
$lang->zahost->init = 'Init Host';
$lang->zahost->initTitle = 'Init Host';
$lang->zahost->edit = 'Edit';
$lang->zahost->editAction = 'Edit Host';
$lang->zahost->delete = 'Delete';
@@ -33,11 +33,12 @@ $lang->zahost->editedBy = 'EditedBy';
$lang->zahost->editedDate = 'EditedDate';
$lang->zahost->registerDate = 'RegisterDate';
$lang->zahost->memorySize = $lang->zahost->memory;
$lang->zahost->cpuCoreNum = $lang->zahost->cpuCores;
$lang->zahost->os = 'System';
$lang->zahost->imageName = 'Image File';
$lang->zahost->browseImage = 'Image List';
$lang->zahost->memorySize = $lang->zahost->memory;
$lang->zahost->cpuCoreNum = $lang->zahost->cpuCores;
$lang->zahost->os = 'System';
$lang->zahost->imageName = 'Image File';
$lang->zahost->browseImage = 'Image List';
$lang->zahost->downloadImage = 'Download Image';
$lang->zahost->createZanode = 'Create Node';
$lang->zahost->initNotice = 'Save successfully, initialize the ZAhost or return list';
@@ -73,7 +74,7 @@ $lang->zahost->image = new stdclass;
$lang->zahost->image->browseImage = 'Image List';
$lang->zahost->image->createImage = 'Create Image';
$lang->zahost->image->choseImage = 'Select Image';
$lang->zahost->image->downloadImage = 'Download Image';
$lang->zahost->image->downloadImage = $lang->zahost->downloadImage;
$lang->zahost->image->startDowload = 'Start Download';
$lang->zahost->image->common = 'Image';
+7 -6
View File
@@ -33,11 +33,12 @@ $lang->zahost->editedBy = '由谁修改';
$lang->zahost->editedDate = '最后修改时间';
$lang->zahost->registerDate = '最后注册时间';
$lang->zahost->memorySize = $lang->zahost->memory;
$lang->zahost->cpuCoreNum = $lang->zahost->cpuCores;
$lang->zahost->os = '操作系统';
$lang->zahost->imageName = '镜像文件';
$lang->zahost->browseImage = '镜像列表';
$lang->zahost->memorySize = $lang->zahost->memory;
$lang->zahost->cpuCoreNum = $lang->zahost->cpuCores;
$lang->zahost->os = '操作系统';
$lang->zahost->imageName = '镜像文件';
$lang->zahost->browseImage = '镜像列表';
$lang->zahost->downloadImage = '下载镜像';
$lang->zahost->createZanode = '创建执行节点';
$lang->zahost->initNotice = '保存成功,请您初始化宿主机或返回列表。';
@@ -73,7 +74,7 @@ $lang->zahost->image = new stdclass;
$lang->zahost->image->browseImage = '镜像列表';
$lang->zahost->image->createImage = '创建镜像';
$lang->zahost->image->choseImage = '选择镜像';
$lang->zahost->image->downloadImage = '下载镜像';
$lang->zahost->image->downloadImage = $lang->zahost->downloadImage;
$lang->zahost->image->startDowload = '开始下载';
$lang->zahost->image->common = '镜像';
+2 -2
View File
@@ -102,7 +102,7 @@
<?php echo $lang->zahost->init->statusTitle;?>
<button type='button' id='checkServiceStatus' class='btn btn-info'><i class="icon icon-refresh"></i> <span class='checkStatus'><?php echo $lang->zahost->init->checkStatus;?></span></button>
</div>
<div class="detail-content article-content">
<div class="detail-content article-content load-indicator" id='serviceContent'>
<div class="main-row">
<div id="statusContainer">
<div class="text-kvm"><span class="dot-symbol fail"> ●</span><span>KVM</span></div>
@@ -149,7 +149,7 @@
<tbody>
<?php foreach($nodeList as $node):?>
<tr>
<td title="<?php echo $node->name;?>"><?php echo html::a($this->createLink('zanode', 'view', "id=$node->id"), $node->name, '', "");?></td>
<td title="<?php echo $node->name;?>"><?php echo html::a($this->createLink('zanode', 'view', "id=$node->id"), $node->name, '_target', "");?></td>
<td><?php echo zget($config->zanode->os->cpuCores, $node->cpuCores);?></td>
<td><?php echo $node->memory . $this->lang->zahost->unitList['GB'];?></td>
<td><?php echo $node->diskSize . $this->lang->zahost->unitList['GB'];?></td>
+1 -1
View File
@@ -285,7 +285,7 @@ class zanode extends control
{
if($confirm == 'no')
{
return print(js::confirm($this->lang->zanode->confirmDelete, inlink('delete', "zanodeID={$nodeID}&confirm=yes")));
return print(js::confirm($this->lang->zanode->confirmDelete, inlink('destroy', "zanodeID={$nodeID}&confirm=yes")));
}
$error = $this->zanode->destroy($nodeID);
+3 -2
View File
@@ -12,6 +12,7 @@
.service-status{margin-top: 10px;}
.vnc-detail{height: 60vh;min-height: 550px;}
.vnc-mask{width: 100%;height:100%;background-color: rgba(0,0,0,0);position: absolute;z-index: 1;}
#checkServiceStatus{background-color:unset;}
#checkServiceStatus{background-color: #ffffff;}
#checkServiceStatus:hover{background-color: #f0fdfb;}
.checkStatus{color: #313c52;}
.node-not-wrap{white-space: nowrap;}
.node-not-wrap{white-space: nowrap;}
+13 -5
View File
@@ -2,6 +2,11 @@ var checkInterval;
var intervalTimes = 0;
$('#checkServiceStatus').click(function(){
$('#serviceContent').addClass('loading');
checkServiceStatus();
})
function checkServiceStatus(){
$.get(createLink('zanode', 'ajaxGetServiceStatus', 'nodeID=' + nodeID), function(response)
{
var resultData = JSON.parse(response);
@@ -24,7 +29,7 @@ $('#checkServiceStatus').click(function(){
if(resultData.data[key] == 'ready' || resultData.data[key] == 'not_available')
{
$('.ztf-status').text(zanodeLang.init[resultData.data[key]])
$('.ztf-install').text(zanodeLang.reinstall);
$('.ztf-install').text('');
}
else
{
@@ -91,9 +96,12 @@ $('#checkServiceStatus').click(function(){
$('.init-success').show();
// $('.init-fail').hide();
}
setTimeout(function() {
$('#serviceContent').removeClass('loading');
}, 500);
});
return
})
}
$('.node-init-install').on('click', function(){
$(this).addClass('load-indicator loading');
@@ -152,13 +160,13 @@ $('.btn-pwd-copy').live('click', function()
})
$(function(){
$('#checkServiceStatus').trigger("click")
checkServiceStatus();
checkInterval = setInterval(() => {
intervalTimes++;
if(intervalTimes > 300)
{
clearInterval(checkInterval)
}
$('#checkServiceStatus').trigger("click")
checkServiceStatus();
}, 2000);
})
})
+5 -6
View File
@@ -34,8 +34,8 @@ $lang->zanode->cpuCores = 'CPU';
$lang->zanode->defaultUser = 'Default Account Name';
$lang->zanode->defaultPwd = 'Default Password';
$lang->zanode->memory = 'Memory Size';
$lang->zanode->desc = 'Description';
$lang->zanode->diskSize = 'Disk Size';
$lang->zanode->desc = 'Description';
$lang->zanode->status = 'Status';
$lang->zanode->mac = 'MAC';
$lang->zanode->vnc = 'VNC Port';
@@ -67,8 +67,8 @@ $lang->automation->node = $lang->zanode->common;
$lang->zanode->notFoundAgent = 'No Agent service is found';
$lang->zanode->createVmFail = 'Failed to create a ZenAgent Node';
$lang->zanode->noVncPort = 'Failed to get vnc port';
$lang->zanode->nameValid = "Name must be letters, numbers,'-','_','.', And cannot begin with a symbol";
$lang->zanode->empty = 'ZenAgent Node not found.';
$lang->zanode->nameValid = "The name can only be letters, numbers, '-', '_', '.', and cannot start with a symbol";
$lang->zanode->empty = 'No zanode is found';
$lang->zanode->runCaseConfirm = 'The system detects the presence of an automation script. Whether to execute?';
$lang->zanode->createImage = 'Create Image';
@@ -95,7 +95,7 @@ $lang->zanode->statusList['suspend'] = 'Suspend';
$lang->zanode->statusList['offline'] = 'Offline';
$lang->zanode->statusList['destroy'] = 'Destroyed';
$lang->zanode->statusList['shutoff'] = 'Shutoff';
$lang->zanode->statusList['shutdown'] = 'shutdown';
$lang->zanode->statusList['shutodown'] = 'shutdown';
$lang->zanode->statusList['destroy_fail'] = 'Destroy Fail';
$lang->zanode->statusList['wait'] = 'Initializing';
$lang->zanode->statusList['online'] = 'Online';
@@ -103,7 +103,7 @@ $lang->zanode->statusList['online'] = 'Online';
$lang->zanode->initNotice = "Succeeded. Please initialize the execution node or return to the list.";
$lang->zanode->initButton = "Initialize";
$lang->zanode->init = new stdclass;
$lang->zanode->init = new stdClass();
$lang->zanode->init->statusTitle = "Service Status";
$lang->zanode->init->checkStatus = "Check Service Status";
$lang->zanode->init->not_install = "Not installed";
@@ -121,7 +121,6 @@ $lang->zanode->init->serviceStatus = [
"ZenAgent" => 'not_install',
"ZTF" => 'not_install',
];
$lang->zanode->init->title = "Initialize Node";
$lang->zanode->init->descTitle = "Follow these steps to complete the initialization on the node:";
$lang->zanode->init->initDesc = "Execute the init script on the node: %s %s <br>- Click check service status button.";
+2 -3
View File
@@ -34,8 +34,8 @@ $lang->zanode->cpuCores = 'CPU';
$lang->zanode->defaultUser = 'Default Account Name';
$lang->zanode->defaultPwd = 'Default Password';
$lang->zanode->memory = 'Memory Size';
$lang->zanode->desc = 'Description';
$lang->zanode->diskSize = 'Disk Size';
$lang->zanode->desc = 'Description';
$lang->zanode->status = 'Status';
$lang->zanode->mac = 'MAC';
$lang->zanode->vnc = 'VNC Port';
@@ -95,7 +95,7 @@ $lang->zanode->statusList['suspend'] = 'Suspend';
$lang->zanode->statusList['offline'] = 'Offline';
$lang->zanode->statusList['destroy'] = 'Destroyed';
$lang->zanode->statusList['shutoff'] = 'Shutoff';
$lang->zanode->statusList['shutdown'] = 'shutdown';
$lang->zanode->statusList['shutodown'] = 'shutdown';
$lang->zanode->statusList['destroy_fail'] = 'Destroy Fail';
$lang->zanode->statusList['wait'] = 'Initializing';
$lang->zanode->statusList['online'] = 'Online';
@@ -121,7 +121,6 @@ $lang->zanode->init->serviceStatus = [
"ZenAgent" => 'not_install',
"ZTF" => 'not_install',
];
$lang->zanode->init->title = "Initialize Node";
$lang->zanode->init->descTitle = "Follow these steps to complete the initialization on the node:";
$lang->zanode->init->initDesc = "Execute the init script on the node: %s %s <br>- Click check service status button.";
+3 -4
View File
@@ -34,8 +34,8 @@ $lang->zanode->cpuCores = 'CPU';
$lang->zanode->defaultUser = 'Default Account Name';
$lang->zanode->defaultPwd = 'Default Password';
$lang->zanode->memory = 'Memory Size';
$lang->zanode->desc = 'Description';
$lang->zanode->diskSize = 'Disk Size';
$lang->zanode->desc = 'Description';
$lang->zanode->status = 'Status';
$lang->zanode->mac = 'MAC';
$lang->zanode->vnc = 'VNC Port';
@@ -95,7 +95,7 @@ $lang->zanode->statusList['suspend'] = 'Suspend';
$lang->zanode->statusList['offline'] = 'Offline';
$lang->zanode->statusList['destroy'] = 'Destroyed';
$lang->zanode->statusList['shutoff'] = 'Shutoff';
$lang->zanode->statusList['shutdown'] = 'shutdown';
$lang->zanode->statusList['shutodown'] = 'shutdown';
$lang->zanode->statusList['destroy_fail'] = 'Destroy Fail';
$lang->zanode->statusList['wait'] = 'Initializing';
$lang->zanode->statusList['online'] = 'Online';
@@ -103,7 +103,7 @@ $lang->zanode->statusList['online'] = 'Online';
$lang->zanode->initNotice = "Succeeded. Please initialize the execution node or return to the list.";
$lang->zanode->initButton = "Initialize";
$lang->zanode->init = new stdclass;
$lang->zanode->init = new stdClass();
$lang->zanode->init->statusTitle = "Service Status";
$lang->zanode->init->checkStatus = "Check Service Status";
$lang->zanode->init->not_install = "Not installed";
@@ -121,7 +121,6 @@ $lang->zanode->init->serviceStatus = [
"ZenAgent" => 'not_install',
"ZTF" => 'not_install',
];
$lang->zanode->init->title = "Initialize Node";
$lang->zanode->init->descTitle = "Follow these steps to complete the initialization on the node:";
$lang->zanode->init->initDesc = "Execute the init script on the node: %s %s <br>- Click check service status button.";
+1 -1
View File
@@ -695,7 +695,7 @@ class zanodemodel extends model
*/
public function getServiceStatus($node)
{
$result = json_decode(commonModel::http("http://{$node->ip}:{$node->zap}/api/v1/service/check", json_encode(array("services" => "all")), array(), array("Authorization:$node->tokenSN")));
$result = json_decode(commonModel::http("http://{$node->ip}:{$node->zap}/api/v1/service/check", json_encode(array("services" => "all")), array(), array("Authorization:$node->tokenSN"), 'data', 'POST', 2));
if(empty($result->data->ztfStatus) || $result->code != 'success')
{
$result = new stdclass;
+4 -5
View File
@@ -110,7 +110,7 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
</div>
</div>
</div>
<?php
$canBeChanged = common::canBeChanged('zanode', $zanode);
if ($canBeChanged) $actionFormLink = $this->createLink('action', 'comment', "objectType=zanode&objectID=$zanode->id");
@@ -122,7 +122,7 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
<?php echo $lang->zanode->init->statusTitle; ?>
<button type='button' id='checkServiceStatus' class='btn btn-info'><i class="icon icon-refresh"></i> <span class='checkStatus'><?php echo $lang->zanode->init->checkStatus;?></span></button>
</div>
<div class="detail-content statusContainer">
<div class="detail-content statusContainer load-indicator" id='serviceContent'>
<div class="service-status">
<span class='dot-symbol dot-zenagent text-danger'>●</span>
<span>&nbsp;&nbsp;ZenAgent &nbsp;
@@ -137,9 +137,8 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
</span>
</div>
<div class="status-notice">
<span class='init-success hide'><?php echo sprintf($lang->zanode->init->initSuccessNoticeTitle, "<a href='https://www.zentao.net/book/zentaopms/971.html'>{$lang->zanode->manual}</a>", html::a(helper::createLink('testcase', 'automation', "", '', true), $lang->zanode->automation, '', "class='iframe' title='{$lang->zanode->automation}' data-width='50%'", '')); ?></span>
<span class='init-success hide'><?php echo sprintf($lang->zanode->init->initSuccessNoticeTitle, "<a href='https://www.zentao.net/book/zentaopms/configure-environment-974.html'>{$lang->zanode->manual}</a>", html::a(helper::createLink('testcase', 'automation', "", '', true), $lang->zanode->automation, '', "class='iframe' title='{$lang->zanode->automation}' data-width='50%'", '')); ?></span>
<span class='init-fail hide'><?php echo $lang->zanode->init->initFailNoticeTitle . '<br/>' . $lang->zanode->init->initFailNoticeDesc;?></span>
</div>
</div>
</div>
@@ -200,4 +199,4 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
<div id='mainActions' class='main-actions'>
<?php common::printPreAndNext($browseLink); ?>
</div>
<?php include '../../common/view/footer.html.php'; ?>
<?php include '../../common/view/footer.html.php'; ?>
+128
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
839559059945d23f741a9651c547979db4e07fe6
v7.0.0
@@ -1,7 +1,8 @@
<?php
$lang->user->tokenInvalid = "Token 认证失败,请尝试使用密码登录。";
if(strpos($_SERVER['HTTP_USER_AGENT'], 'xuanxuan') != false)
/* When zentaourl?mode=getconfig is called, the $_SERVER does not have HTTP_USER_AGENT. */
if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'xuanxuan') != false)
{
$lang->user->errorDeny = "抱歉,您无权访问『<b>%s</b>』模块的『<b>%s</b>』功能。请联系管理员获取权限。";
}