Merge branch 'zentaopms_283_task_#82064'
This commit is contained in:
@@ -124,6 +124,7 @@ $filter->project->story = new stdclass();
|
||||
$filter->project->export = new stdclass();
|
||||
$filter->project->task = new stdclass();
|
||||
$filter->project->execution = new stdclass();
|
||||
$filter->project->testcase = new stdclass();
|
||||
$filter->projectstory->story = new stdclass();
|
||||
$filter->qa->default = new stdclass();
|
||||
$filter->story->create = new stdclass();
|
||||
@@ -287,6 +288,7 @@ $filter->project->task->cookie['windowWidth'] = 'int';
|
||||
$filter->project->export->cookie['checkedItem'] = 'reg::checked';
|
||||
$filter->project->execution->cookie['pagerExecutionAll'] = 'int';
|
||||
$filter->project->execution->cookie['showTask'] = 'code';
|
||||
$filter->project->testcase->cookie['showAutoCase'] = 'int';
|
||||
|
||||
$filter->projectstory->story->cookie['storyModuleParam'] = 'int';
|
||||
$filter->projectstory->story->cookie['pagerProductBrowse'] = 'int';
|
||||
|
||||
+82
-82
File diff suppressed because one or more lines are too long
+30
-30
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
a:1:{i:0;O:8:"stdClass":12:{s:2:"id";s:1:"1";s:3:"lib";s:3:"833";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:7:"version";s:1:"2";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2022-12-22 10:35:42";s:8:"editedBy";s:6:"wwccss";s:10:"editedDate";s:19:"2022-12-22 10:35:42";s:7:"deleted";s:1:"0";}}
|
||||
a:1:{i:0;O:8:"stdClass":12:{s:2:"id";s:1:"1";s:3:"lib";s:3:"853";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:7:"version";s:1:"2";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2023-01-05 10:41:36";s:8:"editedBy";s:6:"wwccss";s:10:"editedDate";s:19:"2023-01-05 10:41:36";s:7:"deleted";s:1:"0";}}
|
||||
@@ -1 +1 @@
|
||||
a:3:{i:0;O:8:"stdClass":8:{s:2:"id";s:1:"1";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"version";s:1:"1";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2022-12-22 10:35:42";}i:1;O:8:"stdClass":8:{s:2:"id";s:1:"2";s:4:"name";s:3:"aaa";s:4:"type";s:8:"formData";s:4:"desc";s:0:"";s:9:"attribute";s:137:"[{"field":"aaa","paramsType":"object","required":"","desc":"","structType":"formData","sub":1,"key":"l11gznwwu2chih9mc28","children":[]}]";s:7:"version";s:1:"1";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2022-12-22 10:35:42";}i:2;O:8:"stdClass":8:{s:2:"id";s:1:"3";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"version";s:1:"2";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2022-12-22 10:35:42";}}
|
||||
a:3:{i:0;O:8:"stdClass":8:{s:2:"id";s:1:"1";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"version";s:1:"1";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2023-01-05 10:41:36";}i:1;O:8:"stdClass":8:{s:2:"id";s:1:"2";s:4:"name";s:3:"aaa";s:4:"type";s:8:"formData";s:4:"desc";s:0:"";s:9:"attribute";s:137:"[{"field":"aaa","paramsType":"object","required":"","desc":"","structType":"formData","sub":1,"key":"l11gznwwu2chih9mc28","children":[]}]";s:7:"version";s:1:"1";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2023-01-05 10:41:36";}i:2;O:8:"stdClass":8:{s:2:"id";s:1:"3";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"version";s:1:"2";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2023-01-05 10:41:36";}}
|
||||
+1
-1
@@ -1 +1 @@
|
||||
a:15:{i:0;O:8:"stdClass":13:{s:2:"id";s:3:"118";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:6:"反馈";s:6:"parent";s:1:"0";s:4:"path";s:5:",118,";s:5:"grade";s:1:"1";s:5:"order";s:3:"150";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:1;O:8:"stdClass":13:{s:2:"id";s:3:"117";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:5:"Token";s:6:"parent";s:1:"0";s:4:"path";s:5:",117,";s:5:"grade";s:1:"1";s:5:"order";s:2:"10";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:2;O:8:"stdClass":13:{s:2:"id";s:3:"116";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:6:"需求";s:6:"parent";s:1:"0";s:4:"path";s:5:",116,";s:5:"grade";s:1:"1";s:5:"order";s:2:"70";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:3;O:8:"stdClass":13:{s:2:"id";s:3:"115";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:6:"任务";s:6:"parent";s:1:"0";s:4:"path";s:5:",115,";s:5:"grade";s:1:"1";s:5:"order";s:3:"110";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:4;O:8:"stdClass":13:{s:2:"id";s:3:"114";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:3:"Bug";s:6:"parent";s:1:"0";s:4:"path";s:5:",114,";s:5:"grade";s:1:"1";s:5:"order";s:3:"120";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:5;O:8:"stdClass":13:{s:2:"id";s:3:"113";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:6:"用例";s:6:"parent";s:1:"0";s:4:"path";s:5:",113,";s:5:"grade";s:1:"1";s:5:"order";s:3:"130";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:6;O:8:"stdClass":13:{s:2:"id";s:3:"112";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:12:"产品计划";s:6:"parent";s:1:"0";s:4:"path";s:5:",112,";s:5:"grade";s:1:"1";s:5:"order";s:2:"50";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:7;O:8:"stdClass":13:{s:2:"id";s:3:"111";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:6:"发布";s:6:"parent";s:1:"0";s:4:"path";s:5:",111,";s:5:"grade";s:1:"1";s:5:"order";s:2:"60";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:8;O:8:"stdClass":13:{s:2:"id";s:3:"110";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:9:"测试单";s:6:"parent";s:1:"0";s:4:"path";s:5:",110,";s:5:"grade";s:1:"1";s:5:"order";s:3:"140";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:9;O:8:"stdClass":13:{s:2:"id";s:3:"109";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:6:"版本";s:6:"parent";s:1:"0";s:4:"path";s:5:",109,";s:5:"grade";s:1:"1";s:5:"order";s:2:"90";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:10;O:8:"stdClass":13:{s:2:"id";s:3:"108";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:6:"用户";s:6:"parent";s:1:"0";s:4:"path";s:5:",108,";s:5:"grade";s:1:"1";s:5:"order";s:2:"20";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:11;O:8:"stdClass":13:{s:2:"id";s:3:"107";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:6:"执行";s:6:"parent";s:1:"0";s:4:"path";s:5:",107,";s:5:"grade";s:1:"1";s:5:"order";s:3:"100";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:12;O:8:"stdClass":13:{s:2:"id";s:3:"106";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:6:"项目";s:6:"parent";s:1:"0";s:4:"path";s:5:",106,";s:5:"grade";s:1:"1";s:5:"order";s:2:"80";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:13;O:8:"stdClass":13:{s:2:"id";s:3:"105";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:6:"产品";s:6:"parent";s:1:"0";s:4:"path";s:5:",105,";s:5:"grade";s:1:"1";s:5:"order";s:2:"40";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:14;O:8:"stdClass":13:{s:2:"id";s:3:"104";s:4:"root";s:2:"24";s:6:"branch";s:1:"0";s:4:"name";s:9:"项目集";s:6:"parent";s:1:"0";s:4:"path";s:5:",104,";s:5:"grade";s:1:"1";s:5:"order";s:2:"30";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}}
|
||||
a:16:{i:0;O:8:"stdClass":13:{s:2:"id";s:4:"2964";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:6:"工单";s:6:"parent";s:1:"0";s:4:"path";s:6:",2964,";s:5:"grade";s:1:"1";s:5:"order";s:3:"160";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:1;O:8:"stdClass":13:{s:2:"id";s:4:"2963";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:9:"项目集";s:6:"parent";s:1:"0";s:4:"path";s:6:",2963,";s:5:"grade";s:1:"1";s:5:"order";s:2:"30";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:2;O:8:"stdClass":13:{s:2:"id";s:4:"2962";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:6:"产品";s:6:"parent";s:1:"0";s:4:"path";s:6:",2962,";s:5:"grade";s:1:"1";s:5:"order";s:2:"40";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:3;O:8:"stdClass":13:{s:2:"id";s:4:"2961";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:6:"项目";s:6:"parent";s:1:"0";s:4:"path";s:6:",2961,";s:5:"grade";s:1:"1";s:5:"order";s:2:"80";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:4;O:8:"stdClass":13:{s:2:"id";s:4:"2960";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:6:"执行";s:6:"parent";s:1:"0";s:4:"path";s:6:",2960,";s:5:"grade";s:1:"1";s:5:"order";s:3:"100";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:5;O:8:"stdClass":13:{s:2:"id";s:4:"2959";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:6:"用户";s:6:"parent";s:1:"0";s:4:"path";s:6:",2959,";s:5:"grade";s:1:"1";s:5:"order";s:2:"20";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:6;O:8:"stdClass":13:{s:2:"id";s:4:"2958";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:6:"版本";s:6:"parent";s:1:"0";s:4:"path";s:6:",2958,";s:5:"grade";s:1:"1";s:5:"order";s:2:"90";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:7;O:8:"stdClass":13:{s:2:"id";s:4:"2957";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:9:"测试单";s:6:"parent";s:1:"0";s:4:"path";s:6:",2957,";s:5:"grade";s:1:"1";s:5:"order";s:3:"140";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:8;O:8:"stdClass":13:{s:2:"id";s:4:"2956";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:6:"发布";s:6:"parent";s:1:"0";s:4:"path";s:6:",2956,";s:5:"grade";s:1:"1";s:5:"order";s:2:"60";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:9;O:8:"stdClass":13:{s:2:"id";s:4:"2955";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:12:"产品计划";s:6:"parent";s:1:"0";s:4:"path";s:6:",2955,";s:5:"grade";s:1:"1";s:5:"order";s:2:"50";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:10;O:8:"stdClass":13:{s:2:"id";s:4:"2954";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:6:"用例";s:6:"parent";s:1:"0";s:4:"path";s:6:",2954,";s:5:"grade";s:1:"1";s:5:"order";s:3:"130";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:11;O:8:"stdClass":13:{s:2:"id";s:4:"2953";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:3:"Bug";s:6:"parent";s:1:"0";s:4:"path";s:6:",2953,";s:5:"grade";s:1:"1";s:5:"order";s:3:"120";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:12;O:8:"stdClass":13:{s:2:"id";s:4:"2952";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:6:"任务";s:6:"parent";s:1:"0";s:4:"path";s:6:",2952,";s:5:"grade";s:1:"1";s:5:"order";s:3:"110";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:13;O:8:"stdClass":13:{s:2:"id";s:4:"2951";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:6:"需求";s:6:"parent";s:1:"0";s:4:"path";s:6:",2951,";s:5:"grade";s:1:"1";s:5:"order";s:2:"70";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:14;O:8:"stdClass":13:{s:2:"id";s:4:"2950";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:5:"Token";s:6:"parent";s:1:"0";s:4:"path";s:6:",2950,";s:5:"grade";s:1:"1";s:5:"order";s:2:"10";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}i:15;O:8:"stdClass":13:{s:2:"id";s:4:"2949";s:4:"root";s:3:"853";s:6:"branch";s:1:"0";s:4:"name";s:6:"反馈";s:6:"parent";s:1:"0";s:4:"path";s:6:",2949,";s:5:"grade";s:1:"1";s:5:"order";s:3:"150";s:4:"type";s:3:"api";s:5:"owner";s:0:"";s:9:"collector";s:0:"";s:5:"short";s:0:"";s:7:"deleted";s:1:"0";}}
|
||||
+82
-82
File diff suppressed because one or more lines are too long
+30
-30
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
a:1:{i:0;O:8:"stdClass":12:{s:2:"id";s:1:"1";s:3:"lib";s:3:"833";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:7:"version";s:1:"2";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2022-12-22 10:35:42";s:8:"editedBy";s:6:"wwccss";s:10:"editedDate";s:19:"2022-12-22 10:35:42";s:7:"deleted";s:1:"0";}}
|
||||
a:1:{i:0;O:8:"stdClass":12:{s:2:"id";s:1:"1";s:3:"lib";s:3:"853";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:7:"version";s:1:"2";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2023-01-05 10:41:36";s:8:"editedBy";s:6:"wwccss";s:10:"editedDate";s:19:"2023-01-05 10:41:36";s:7:"deleted";s:1:"0";}}
|
||||
@@ -1 +1 @@
|
||||
a:3:{i:0;O:8:"stdClass":8:{s:2:"id";s:1:"1";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"version";s:1:"1";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2022-12-22 10:35:42";}i:1;O:8:"stdClass":8:{s:2:"id";s:1:"2";s:4:"name";s:3:"aaa";s:4:"type";s:8:"formData";s:4:"desc";s:0:"";s:9:"attribute";s:137:"[{"field":"aaa","paramsType":"object","required":"","desc":"","structType":"formData","sub":1,"key":"l11gznwwu2chih9mc28","children":[]}]";s:7:"version";s:1:"1";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2022-12-22 10:35:42";}i:2;O:8:"stdClass":8:{s:2:"id";s:1:"3";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"version";s:1:"2";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2022-12-22 10:35:42";}}
|
||||
a:3:{i:0;O:8:"stdClass":8:{s:2:"id";s:1:"1";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"version";s:1:"1";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2023-01-05 10:41:36";}i:1;O:8:"stdClass":8:{s:2:"id";s:1:"2";s:4:"name";s:3:"aaa";s:4:"type";s:8:"formData";s:4:"desc";s:0:"";s:9:"attribute";s:137:"[{"field":"aaa","paramsType":"object","required":"","desc":"","structType":"formData","sub":1,"key":"l11gznwwu2chih9mc28","children":[]}]";s:7:"version";s:1:"1";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2023-01-05 10:41:36";}i:2;O:8:"stdClass":8:{s:2:"id";s:1:"3";s:4:"name";s:4:"user";s:4:"type";s:4:"json";s:4:"desc";s:0:"";s:9:"attribute";s:537:"[{"field":"id","paramsType":"int","required":"","desc":"","structType":"json","sub":1,"key":"kwoq04srulxevt93a3h","children":[]},{"field":"account","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0a387on1wpuwntd","children":[]},{"field":"realname","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0i4g80qyu8lqp28","children":[]},{"field":"avatar","paramsType":"string","required":"","desc":"","structType":"json","sub":1,"key":"kwoq0le57o2p6vxc8ov","children":[]}]";s:7:"version";s:1:"2";s:7:"addedBy";s:6:"wwccss";s:9:"addedDate";s:19:"2023-01-05 10:41:36";}}
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -27,7 +27,6 @@
|
||||
40812 将流程图融入使用帮助中的使用教程中
|
||||
40809 地盘仪表盘删除流程图区块,增加使用帮助区块
|
||||
40808 新用户登录禅道后,删除原弹窗引导
|
||||
40806 欢迎总览页面中支持试用的版本类型调整
|
||||
40801 欢迎总览页面改版
|
||||
40797 欢迎总览页面背景颜色调整
|
||||
40615 优化创建执行节点的交互
|
||||
|
||||
@@ -410,6 +410,7 @@ $lang->action->label->submitreview = 'submitted';
|
||||
$lang->action->label->suspend = 'suspended';
|
||||
$lang->action->label->resume = 'resumed';
|
||||
$lang->action->label->reboot = 'reboot';
|
||||
$lang->action->label->boot = 'boot';
|
||||
$lang->action->label->destroy = 'destroyed';
|
||||
$lang->action->label->getvnc = 'remote control';
|
||||
$lang->action->label->synctwins = 'synchronized changes';
|
||||
@@ -652,7 +653,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['boot'] = 'Boot Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['destroy'] = 'Destory Zagent Node';
|
||||
|
||||
$lang->action->dynamicAction->doclib['created'] = 'Create Doc Library';
|
||||
|
||||
@@ -410,6 +410,7 @@ $lang->action->label->submitreview = 'submitted';
|
||||
$lang->action->label->suspend = 'suspended';
|
||||
$lang->action->label->resume = 'resumed';
|
||||
$lang->action->label->reboot = 'reboot';
|
||||
$lang->action->label->boot = 'boot';
|
||||
$lang->action->label->destroy = 'destroyed';
|
||||
$lang->action->label->getvnc = 'remote control';
|
||||
$lang->action->label->synctwins = 'synchronized changes';
|
||||
@@ -652,7 +653,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['boot'] = 'Boot Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['destroy'] = 'Destory Zagent Node';
|
||||
|
||||
$lang->action->dynamicAction->doclib['created'] = 'Create Doc Library';
|
||||
|
||||
@@ -410,6 +410,7 @@ $lang->action->label->submitreview = 'submitted';
|
||||
$lang->action->label->suspend = 'suspended';
|
||||
$lang->action->label->resume = 'resumed';
|
||||
$lang->action->label->reboot = 'reboot';
|
||||
$lang->action->label->boot = 'boot';
|
||||
$lang->action->label->destroy = 'destroyed';
|
||||
$lang->action->label->getvnc = 'remote control';
|
||||
$lang->action->label->synctwins = 'synchronized changes';
|
||||
@@ -652,7 +653,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['boot'] = 'Boot Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['destroy'] = 'Destory Zagent Node';
|
||||
|
||||
$lang->action->dynamicAction->doclib['created'] = 'Créer Doc Library';
|
||||
|
||||
@@ -191,6 +191,7 @@ $lang->action->desc->suspend = '$date, the ZenAgent Node is suspended by
|
||||
$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";
|
||||
|
||||
/* Used to describe the history of operations related to parent-child tasks. */
|
||||
$lang->action->desc->createchildren = '$date, <strong>$actor</strong> created a child task <strong>$extra</strong>。' . "\n";
|
||||
@@ -318,6 +319,7 @@ $lang->action->label->submitreview = 'submitted';
|
||||
$lang->action->label->suspend = 'suspended';
|
||||
$lang->action->label->resume = 'resumed';
|
||||
$lang->action->label->reboot = 'reboot';
|
||||
$lang->action->label->boot = 'boot';
|
||||
$lang->action->label->destroy = 'destroyed';
|
||||
$lang->action->label->synctwins = 'synchronized changes';
|
||||
$lang->action->label->linkedrepo = 'Linked Code Repo';
|
||||
@@ -501,6 +503,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'] = 'Boot Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['destroy'] = 'Destory Zagent Node';
|
||||
|
||||
$lang->action->dynamicAction->doclib['created'] = 'Tạo Doc thư viện';
|
||||
|
||||
@@ -410,6 +410,7 @@ $lang->action->label->submitreview = '提交了评审';
|
||||
$lang->action->label->suspend = '休眠了';
|
||||
$lang->action->label->resume = '恢复了';
|
||||
$lang->action->label->reboot = '重启了';
|
||||
$lang->action->label->boot = '启动了';
|
||||
$lang->action->label->destroy = '关闭了';
|
||||
$lang->action->label->getvnc = '远程操控';
|
||||
$lang->action->label->synctwins = '同步修改了';
|
||||
|
||||
@@ -120,7 +120,7 @@ $(function()
|
||||
<?php if(($tab == 'preference' or $tab == 'systemMode') and $this->config->vision == 'lite') continue;?>
|
||||
<?php if($tab == 'systemMode' and !common::hasPriv('custom', 'mode')) continue;?>
|
||||
<?php if($tab == 'preference' and !common::hasPriv('my', 'preference')) continue;?>
|
||||
<?php if($tab == 'visionSwitch' and !strpos($app->user->visions, ',') and empty($app->user->admin) and strpos($app->company->admins, ",{$app->user->account},") === false) continue;?>
|
||||
<?php if($tab == 'visionSwitch' and !strpos($app->user->visions, ',')) continue;?>
|
||||
<li id="<?php echo $tab;?>">
|
||||
<a href="###" title="<?php echo $tabName?>" data-target='<?php echo "#tab3{$blockNavId}Content{$tab}";?>' data-toggle="tab">
|
||||
<?php echo $tabName;?>
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
<?php if(isset($execution->delay)):?>
|
||||
<span class="status-project status-delayed" title='<?php echo $lang->execution->delayed;?>'><?php echo $lang->execution->delayed;?></span>
|
||||
<?php else:?>
|
||||
<?php $statusName = $this->processStatus('project', $execution);?>
|
||||
<?php $statusName = $this->processStatus('execution', $execution);?>
|
||||
<span class="status-project status-<?php echo $execution->status?>" title='<?php echo $statusName;?>'><?php echo $statusName;?></span>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#selectProgramModal .modal-header {border-bottom: 0;}
|
||||
#selectProgramModal .modal-header h4.modal-title {font-weight: 700;}
|
||||
#selectProgramModal .modal-dialog {width: 550px;}
|
||||
.modal-body {padding: 20px;}
|
||||
#selectProgramModal .modal-footer {border-top: 0px; text-align: center;}
|
||||
<?php if(common::checkNotCN()):?>
|
||||
.block-guide .tab-pane .mode-switch .mode-block:nth-child(1) {padding-bottom: 18px;}
|
||||
|
||||
@@ -205,7 +205,7 @@ $config->bug->datatable->fieldList['branch']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['branch']['width'] = '100';
|
||||
$config->bug->datatable->fieldList['branch']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['branch']['control'] = 'select';
|
||||
$config->bug->datatable->fieldList['branch']['dataSource'] = array('module' => 'bug', 'method' => 'getRelatedObjects', 'params' => 'branch&id,name');
|
||||
$config->bug->datatable->fieldList['branch']['dataSource'] = array('module' => 'branch', 'method' => 'getPairs', 'params' => '$productID');
|
||||
|
||||
$config->bug->datatable->fieldList['type']['title'] = 'type';
|
||||
$config->bug->datatable->fieldList['type']['fixed'] = 'no';
|
||||
|
||||
+14
-6
@@ -863,7 +863,7 @@ class bugModel extends model
|
||||
|
||||
if($bug->assignedTo != $oldBug->assignedTo) $bug->assignedDate = $now;
|
||||
if($bug->resolution != '') $bug->confirmed = 1;
|
||||
if(($bug->resolvedBy != '' or $bug->resolution != '') and $oldBug->status != 'closed')
|
||||
if(($bug->resolvedBy != '' or $bug->resolution != '') and strpos(',resolved,closed,', ",{$oldBug->status},") === false)
|
||||
{
|
||||
$bug->resolvedDate = $now;
|
||||
$bug->status = 'resolved';
|
||||
@@ -1528,16 +1528,24 @@ class bugModel extends model
|
||||
*/
|
||||
public function getBugs2Link($bugID, $browseType = 'bySearch', $queryID = 0, $pager = null, $excludeBugs = '')
|
||||
{
|
||||
$bug = $this->getById($bugID);
|
||||
$bugIDList = $bug->id . ',' . $bug->linkBug . ',' . $excludeBugs;
|
||||
|
||||
if($browseType == 'bySearch')
|
||||
{
|
||||
$bug = $this->getById($bugID);
|
||||
$bugIDList = $bug->id . ',' . $bug->linkBug . ',' . $excludeBugs;
|
||||
$bugs2Link = $this->getBySearch($bug->product, 'all', $queryID, 'id', $bugIDList, $pager);
|
||||
return $bugs2Link;
|
||||
return $this->getBySearch($bug->product, 'all', $queryID, 'id', $bugIDList, $pager);
|
||||
}
|
||||
else
|
||||
{
|
||||
return array();
|
||||
return $this->dao->select('*')->from(TABLE_BUG)
|
||||
->where('deleted')->eq('0')
|
||||
->andWhere('id')->notin($bugIDList)
|
||||
->andWhere('product')->eq($bug->product)
|
||||
->beginIF($bug->project)->andWhere('project')->eq($bug->project)->fi()
|
||||
->beginIF($bug->execution)->andWhere('execution')->eq($bug->execution)->fi()
|
||||
->orderBy('id desc')
|
||||
->page($pager)
|
||||
->fetchAll();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,19 @@ class custom extends control
|
||||
$currentLang = $this->app->getClientLang();
|
||||
|
||||
$this->app->loadLang($module);
|
||||
$fieldList = zget($this->lang->$module, $field, '');
|
||||
if($lang == 'all')
|
||||
{
|
||||
$fieldList = array();
|
||||
$items = $this->custom->getItems("lang=all&module=$module§ion=$field&vision={$this->config->vision}");
|
||||
foreach($items as $key => $item)
|
||||
{
|
||||
$fieldList[$key] = $item->value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$fieldList = zget($this->lang->$module, $field, '');
|
||||
}
|
||||
|
||||
if($module == 'project' and $field == 'unitList')
|
||||
{
|
||||
|
||||
@@ -90,6 +90,9 @@ class datatable extends control
|
||||
}
|
||||
|
||||
$cols = $this->datatable->getFieldList($module);
|
||||
|
||||
if($module == 'story' && $extra != 'requirement') unset($cols['SRS']);
|
||||
|
||||
if($extra == 'requirement')
|
||||
{
|
||||
unset($cols['plan']);
|
||||
@@ -97,6 +100,8 @@ class datatable extends control
|
||||
unset($cols['taskCount']);
|
||||
unset($cols['bugCount']);
|
||||
unset($cols['caseCount']);
|
||||
unset($cols['URS']);
|
||||
|
||||
$cols['title']['title'] = str_replace($this->lang->SRCommon, $this->lang->URCommon, $this->lang->story->title);
|
||||
}
|
||||
|
||||
|
||||
@@ -1760,10 +1760,13 @@ class execution extends control
|
||||
foreach($products as $productIndex => $product)
|
||||
{
|
||||
$productPlans[$productIndex] = array();
|
||||
foreach($branches[$productIndex] as $branchID => $branch)
|
||||
if(isset($branches[$productIndex]))
|
||||
{
|
||||
$linkedBranches[$productIndex][$branchID] = $branchID;
|
||||
$productPlans[$productIndex] += isset($plans[$productIndex][$branchID]) ? $plans[$productIndex][$branchID] : array();
|
||||
foreach($branches[$productIndex] as $branchID => $branch)
|
||||
{
|
||||
$linkedBranches[$productIndex][$branchID] = $branchID;
|
||||
$productPlans[$productIndex] += isset($plans[$productIndex][$branchID]) ? $plans[$productIndex][$branchID] : array();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1550,6 +1550,8 @@ class executionModel extends model
|
||||
*/
|
||||
public function getStatData($projectID = 0, $browseType = 'undone', $productID = 0, $branch = 0, $withTasks = false, $param = '', $orderBy = 'id_asc', $pager = null)
|
||||
{
|
||||
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getExecutionStats($browseType);
|
||||
|
||||
/* Construct the query SQL at search executions. */
|
||||
$executionQuery = '';
|
||||
if($browseType == 'bySearch')
|
||||
|
||||
@@ -312,7 +312,7 @@ class jobModel extends model
|
||||
$pipeline = $this->loadModel('gitlab')->apiGetPipeline($repo->serviceHost, $repo->serviceProject, $this->post->reference);
|
||||
if(!is_array($pipeline) or empty($pipeline))
|
||||
{
|
||||
dao::$errors['repo'] = $this->lang->job->engineTips->error;
|
||||
dao::$errors['gitlabRepo'] = $this->lang->job->engineTips->error;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1920,9 +1920,9 @@ function updateRegionTabAffixState()
|
||||
if(regionTabs.top <= 0 && !$regionTabs.hasClass('affixed'))
|
||||
{
|
||||
$regionTabs.addClass('affixed');
|
||||
$regionTabs.find('#region-tab-actions').addClass('hidden');
|
||||
if( kanbanContainer.top > 0) $regionTabs.find('#region-tab-actions').addClass('hidden');
|
||||
}
|
||||
else if($regionTabs.hasClass('affixed') && kanbanContainer.top >= 0)
|
||||
else if($regionTabs.hasClass('affixed') && kanbanContainer.top > 44)
|
||||
{
|
||||
$regionTabs.removeClass('affixed');
|
||||
$regionTabs.find('#region-tab-actions').removeClass('hidden');
|
||||
|
||||
@@ -395,6 +395,7 @@ $lang->kanbancard->beginAndEnd = 'Begin & End';
|
||||
$lang->kanbancard->begin = 'Begin';
|
||||
$lang->kanbancard->end = 'End';
|
||||
$lang->kanbancard->pri = 'Priority';
|
||||
$lang->kanbancard->status = 'Status';
|
||||
$lang->kanbancard->progress = 'Progress';
|
||||
$lang->kanbancard->desc = 'Description';
|
||||
$lang->kanbancard->estimate = 'Estimate';
|
||||
|
||||
@@ -395,6 +395,7 @@ $lang->kanbancard->beginAndEnd = 'Begin & End';
|
||||
$lang->kanbancard->begin = 'Begin';
|
||||
$lang->kanbancard->end = 'End';
|
||||
$lang->kanbancard->pri = 'Priority';
|
||||
$lang->kanbancard->status = 'Status';
|
||||
$lang->kanbancard->progress = 'Progress';
|
||||
$lang->kanbancard->desc = 'Description';
|
||||
$lang->kanbancard->estimate = 'Estimate';
|
||||
|
||||
@@ -395,6 +395,7 @@ $lang->kanbancard->beginAndEnd = 'Begin & End';
|
||||
$lang->kanbancard->begin = 'Begin';
|
||||
$lang->kanbancard->end = 'End';
|
||||
$lang->kanbancard->pri = 'Priority';
|
||||
$lang->kanbancard->status = 'Status';
|
||||
$lang->kanbancard->progress = 'Progress';
|
||||
$lang->kanbancard->desc = 'Description';
|
||||
$lang->kanbancard->estimate = 'Estimate';
|
||||
|
||||
@@ -395,6 +395,7 @@ $lang->kanbancard->beginAndEnd = '起止日期';
|
||||
$lang->kanbancard->begin = '预计开始';
|
||||
$lang->kanbancard->end = '截止日期';
|
||||
$lang->kanbancard->pri = '优先级';
|
||||
$lang->kanbancard->status = '状态';
|
||||
$lang->kanbancard->progress = '进度';
|
||||
$lang->kanbancard->desc = '描述';
|
||||
$lang->kanbancard->estimate = '预计';
|
||||
|
||||
@@ -1,82 +1,26 @@
|
||||
|
||||
.preference .table-form > tbody > tr > th {font-weight: 400; color: #0B0F18;}
|
||||
.preference .chosen-container-single .chosen-single > span {color: #313C52;}
|
||||
.tip {margin-top: 10px;}
|
||||
|
||||
.preference > .preference-border {
|
||||
display: flex;
|
||||
padding: 5px 16px;
|
||||
border: 1px solid #EDEEF2;
|
||||
}
|
||||
.preference-border > .preference-img {
|
||||
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 {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-around;
|
||||
padding-left: 5px;
|
||||
}
|
||||
.preference-text > .title {
|
||||
color: #0B0F18;
|
||||
font-size: 13px;
|
||||
}
|
||||
.preference-text > .context {
|
||||
color: #838A9D;
|
||||
font-size: 12px;
|
||||
overflow: hidden;
|
||||
white-space: normal;
|
||||
}
|
||||
.preference > .preference-border {display: flex; padding: 5px 16px; border: 1px solid #EDEEF2;}
|
||||
.preference-border > .preference-img {flex: 0 0 80px;}
|
||||
.preference.picker-option-active > .preference-border {box-shadow: 0px 0px 1px 1px #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 {display: flex; flex-direction: column; justify-content: space-around; padding-left: 5px;}
|
||||
.preference-text > .title {color: #0B0F18; font-size: 13px;}
|
||||
.preference-text > .context {color: #838A9D; font-size: 12px; overflow: hidden; white-space: normal;}
|
||||
|
||||
.picker-option.picker-option-active,
|
||||
.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-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 > .border {
|
||||
height: 46px;
|
||||
display: flex;
|
||||
padding: 5px 16px;
|
||||
border: 1px solid #EDEEF2;
|
||||
align-items: center;
|
||||
}
|
||||
.option-ursr > .border > .value {
|
||||
margin-right: 20px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 100%;
|
||||
background: rgba(230,240,255, 0.4);
|
||||
}
|
||||
.option-ursr > .border > .value > p {
|
||||
line-height: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
.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 > .border {height: 46px; display: flex; padding: 5px 16px; border: 1px solid #EDEEF2; align-items: center;}
|
||||
.option-ursr > .border > .value {margin-right: 20px; width: 20px; height: 20px; border-radius: 100%; background: rgba(230,240,255, 0.4);}
|
||||
.option-ursr > .border > .value > p {line-height: 20px; text-align: center;}
|
||||
|
||||
@@ -10,32 +10,15 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php if($preferenceSetted):?>
|
||||
<style>
|
||||
#submit{margin-top: 45px}
|
||||
.chosen-container-single .chosen-single div b {top: 7px !important;}
|
||||
</style>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php else:?>
|
||||
<?php include '../../common/view/header.lite.html.php';?>
|
||||
<style>
|
||||
html,body {height: 100%;}
|
||||
.table {width: 80%;}
|
||||
.container {height: 100%; display: flex; align-items: center;}
|
||||
</style>
|
||||
<?php endif;?>
|
||||
<?php if($preferenceSetted):?>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='main-header'>
|
||||
<h2><i class='icon-key'></i> <?php echo $lang->my->preference;?></h2>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<div class='container'>
|
||||
<div class='modal-dialog'>
|
||||
<div class='modal-header'>
|
||||
<strong><?php echo $lang->my->preference;?></strong>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<form method='post' target='hiddenwin'>
|
||||
<table align='center' class='table table-form w-320px'>
|
||||
<tr>
|
||||
@@ -73,8 +56,4 @@ html,body {height: 100%;}
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
<?php if($preferenceSetted):?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
<?php else:?>
|
||||
<?php include '../../common/view/footer.lite.html.php';?>
|
||||
<?php endif;?>
|
||||
|
||||
@@ -222,9 +222,9 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-group addProduct hidden <?php if($programID) echo 'required';?>">
|
||||
<div class="input-group addProduct hidden">
|
||||
<?php echo html::input('productName', '', "class='form-control'");?>
|
||||
<span class='input-group-addon'><?php echo html::checkBox('newProduct', $lang->project->addProduct, '', "onchange=addNewProduct(this);");?></span>
|
||||
<span class='input-group-addon required'><?php echo html::checkBox('newProduct', $lang->project->addProduct, '', "onchange=addNewProduct(this);");?></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -37,6 +37,7 @@ class qaModel extends model
|
||||
|
||||
if(!in_array($this->app->rawModule, $this->config->qa->noDropMenuModule)) $this->lang->switcherMenu = $this->product->getSwitcher($productID, $extra, $branch);
|
||||
if($this->app->rawModule == 'product' and $this->app->rawMethod == 'showerrornone') $this->lang->switcherMenu = '';
|
||||
if(!common::hasPriv('zahost', 'browse') and !common::hasPriv('zanode', 'browse')) unset($this->lang->qa->menu->automation);
|
||||
common::setMenuVars('qa', $productID);
|
||||
}
|
||||
|
||||
|
||||
+10
-9
@@ -1010,7 +1010,6 @@ class searchModel extends model
|
||||
$programs = $this->app->user->view->programs;
|
||||
$projects = $this->app->user->view->projects;
|
||||
$executions = $this->app->user->view->sprints;
|
||||
$grantProducts = $this->loadModel('feedback')->getGrantProducts();
|
||||
|
||||
$objectPairs = array();
|
||||
$total = count($results);
|
||||
@@ -1025,7 +1024,7 @@ class searchModel extends model
|
||||
$objectExecutions = array();
|
||||
if(!isset($this->config->objectTables[$objectType])) continue;
|
||||
$table = $this->config->objectTables[$objectType];
|
||||
if(strpos(',bug,case,testcase,productplan,release,story,testtask,ticket,', ",$objectType,") !== false)
|
||||
if(strpos(',bug,case,testcase,productplan,release,story,testtask,', ",$objectType,") !== false)
|
||||
{
|
||||
$objectProducts = $this->dao->select('id,product')->from($table)->where('id')->in(array_keys($objectIdList))->fetchGroup('product', 'id');
|
||||
}
|
||||
@@ -1132,15 +1131,17 @@ class searchModel extends model
|
||||
}
|
||||
}
|
||||
}
|
||||
elseif($objectType == 'feedback')
|
||||
elseif(strpos(',feedback,ticket,', ",$objectType,") !== false)
|
||||
{
|
||||
$objectFeedbacks = $this->dao->select('*')->from($table)->where('id')->in(array_keys($objectIdList))->fetchAll('id');
|
||||
foreach($objectFeedbacks as $feedbackID => $feedback)
|
||||
$grantProducts = $this->loadModel('feedback')->getGrantProducts();
|
||||
$objects = $this->dao->select('*')->from($table)->where('id')->in(array_keys($objectIdList))->fetchAll('id');
|
||||
foreach($objects as $objectID => $object)
|
||||
{
|
||||
if($feedback->openedBy == $this->app->user->account or isset($grantProducts[$feedback->product])) continue;
|
||||
if(isset($objectIdList[$feedbackID]))
|
||||
if($objectType == 'feedback' and $object->openedBy == $this->app->user->account) continue;
|
||||
if(isset($grantProducts[$object->product])) continue;
|
||||
if(isset($objectIdList[$objectID]))
|
||||
{
|
||||
$recordID = $objectIdList[$feedbackID];
|
||||
$recordID = $objectIdList[$objectID];
|
||||
unset($results[$recordID]);
|
||||
}
|
||||
}
|
||||
@@ -1149,7 +1150,7 @@ class searchModel extends model
|
||||
foreach($objectProducts as $productID => $idList)
|
||||
{
|
||||
if(empty($productID)) continue;
|
||||
if(strpos(",$products,", ",$productID,") === false or ($objectType == 'ticket' and !isset($grantProducts[$productID])))
|
||||
if(strpos(",$products,", ",$productID,") === false)
|
||||
{
|
||||
foreach($idList as $object)
|
||||
{
|
||||
|
||||
@@ -360,7 +360,7 @@ class sonarqube extends control
|
||||
if($search == true) $keyword = $this->session->sonarqubeIssueKeyword;
|
||||
}
|
||||
|
||||
ini_set('memory_limit', '256M');
|
||||
ini_set('memory_limit', '1024M');
|
||||
|
||||
$cacheFile = $this->sonarqube->getCacheFile($sonarqubeID, $projectKey);
|
||||
if(!$cacheFile or !file_exists($cacheFile) or (time() - filemtime($cacheFile)) / 60 > $this->config->sonarqube->cacheTime)
|
||||
|
||||
@@ -254,5 +254,5 @@ $config->story->datatable->fieldList['caseCount']['name'] = $lang->story->ca
|
||||
|
||||
$config->story->datatable->fieldList['actions']['title'] = 'actions';
|
||||
$config->story->datatable->fieldList['actions']['fixed'] = 'right';
|
||||
$config->story->datatable->fieldList['actions']['width'] = $app->tab == 'project' ? '230' : '210';
|
||||
$config->story->datatable->fieldList['actions']['width'] = $app->tab == 'project' ? '250' : '230';
|
||||
$config->story->datatable->fieldList['actions']['required'] = 'yes';
|
||||
|
||||
@@ -1364,7 +1364,7 @@ class story extends control
|
||||
$buildApp = $tab == 'product' ? 'project' : $tab;
|
||||
$releaseApp = $tab == 'execution' ? 'product' : $tab;
|
||||
$this->session->set('productList', $uri . "#app={$tab}", 'product');
|
||||
if(!isonlybody())$this->session->set('buildList', $uri, $buildApp);
|
||||
if(!isonlybody()) $this->session->set('buildList', $uri, $buildApp);
|
||||
$this->app->loadLang('bug');
|
||||
|
||||
$storyID = (int)$storyID;
|
||||
@@ -1401,7 +1401,8 @@ class story extends control
|
||||
}
|
||||
elseif($from == 'project')
|
||||
{
|
||||
$this->loadModel('project')->setMenu($this->session->project);
|
||||
$projectID = (isset($story->projects[$this->session->project]) || empty($story->projects)) ? $this->session->project : key($story->projects);
|
||||
$this->loadModel('project')->setMenu($projectID);
|
||||
}
|
||||
elseif($from == 'qa')
|
||||
{
|
||||
|
||||
+19
-2
@@ -47,13 +47,30 @@ class storyModel extends model
|
||||
if($setImgSize) $story->spec = $this->file->setImgSize($story->spec);
|
||||
if($setImgSize) $story->verify = $this->file->setImgSize($story->verify);
|
||||
|
||||
$story->executions = $this->dao->select('t1.project, t2.name, t2.status, t2.type, t2.multiple')->from(TABLE_PROJECTSTORY)->alias('t1')
|
||||
$projects = $this->dao->select('t1.project, t2.name, t2.status, t2.type, t2.multiple, t2.project AS parentProject')->from(TABLE_PROJECTSTORY)->alias('t1')
|
||||
->leftJoin(TABLE_EXECUTION)->alias('t2')->on('t1.project = t2.id')
|
||||
->where('t2.type')->in('sprint,stage,kanban')
|
||||
->where('t2.type')->in('sprint,stage,kanban,project')
|
||||
->beginIF($story->twins)->andWhere('t1.story')->in(ltrim($story->twins, ',') . $story->id)
|
||||
->beginIF(!$story->twins)->andWhere('t1.story')->in($story->id)
|
||||
->orderBy('t1.`order` DESC')
|
||||
->fetchAll('project');
|
||||
|
||||
$story->projects = array();
|
||||
$story->executions = array();
|
||||
foreach($projects as $project)
|
||||
{
|
||||
if($project->type == 'project')
|
||||
{
|
||||
$story->projects[$project->project] = $project->project;
|
||||
}
|
||||
else
|
||||
{
|
||||
$story->executions[$project->project] = $project;
|
||||
|
||||
if(!$project->multiple) $story->projects[$project->parentProject] = $project->parentProject;
|
||||
}
|
||||
}
|
||||
|
||||
$story->tasks = $this->dao->select('id, name, assignedTo, execution, project, status, consumed, `left`,type')->from(TABLE_TASK)
|
||||
->where('deleted')->eq(0)
|
||||
->beginIF($story->twins)->andWhere('story')->in(ltrim($story->twins, ',') . $story->id)
|
||||
|
||||
@@ -476,7 +476,7 @@
|
||||
{
|
||||
if(!isset($executions[$task->execution])) continue;
|
||||
$execution = isset($story->executions[$task->execution]) ? $story->executions[$task->execution] : '';
|
||||
$executionLink = !empty($execution->multiple) ? $this->createLink('execution', 'view', "executionID=$task->execution") : $this->createLink('project', 'view', "executionID=$task->project");
|
||||
$executionLink = !empty($execution->multiple) ? $this->createLink('execution', 'view', "executionID=$task->execution") : $this->createLink('project', 'view', "projectID=$task->project");
|
||||
$executionName = $executions[$task->execution];
|
||||
$taskInfo = $task->id . ' <span class="label label-success label-outline">' . $this->lang->task->statusList[$task->status] . '</span> ' . $task->name;
|
||||
$class = isonlybody() ? 'showinonlybody' : 'iframe';
|
||||
@@ -486,7 +486,10 @@
|
||||
}
|
||||
foreach($story->executions as $executionID => $execution)
|
||||
{
|
||||
if(!$execution->multiple) continue;
|
||||
if(!isset($executions[$executionID])) continue;
|
||||
if(isset($story->tasks[$executionID])) continue;
|
||||
|
||||
$execName = ($execution->type == 'kanban' and isonlybody()) ? $executions[$executionID] : html::a($this->createLink('execution', 'view', "executionID=$executionID"), $executions[$executionID], '', "class='text-muted'");
|
||||
echo "<li title='$execution->name'>" . $execName . '</li>';
|
||||
}
|
||||
|
||||
@@ -158,6 +158,6 @@ ksort($myOrders);
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php if($i > 4):?>
|
||||
<?php if(!empty($myCountList) and $i > 4):?>
|
||||
<style>#legendMyEffort > .table {margin-bottom: 5px;}</style>
|
||||
<?php endif;?>
|
||||
|
||||
@@ -449,6 +449,7 @@ class testcase extends control
|
||||
$keywords = '';
|
||||
$steps = array();
|
||||
$color = '';
|
||||
$auto = '';
|
||||
|
||||
/* If testcaseID large than 0, use this testcase as template. */
|
||||
if($testcaseID > 0)
|
||||
@@ -464,6 +465,7 @@ class testcase extends control
|
||||
$keywords = $testcase->keywords;
|
||||
$steps = $testcase->steps;
|
||||
$color = $testcase->color;
|
||||
$auto = $testcase->auto;
|
||||
}
|
||||
|
||||
/* If bugID large than 0, use this bug as template. */
|
||||
@@ -586,6 +588,7 @@ class testcase extends control
|
||||
$this->view->branch = $branch;
|
||||
$this->view->product = $product;
|
||||
$this->view->branches = $branches;
|
||||
$this->view->auto = $auto;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ js::set('cancelURL', $this->createLink('testtask', 'batchRun', "productID=$
|
||||
<nav class="btn-toolbar pull-right setting"></nav>
|
||||
</div>
|
||||
<?php
|
||||
$vars = $projectParam . "productID=$productID&branch=$branch&browseType=$browseType¶m=$param&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}";
|
||||
$vars = $projectParam . "productID=$productID&branch=$branch&browseType=$browseType¶m=$param&caseType=$caseType&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}";
|
||||
|
||||
if($useDatatable) include '../../common/view/datatable.html.php';
|
||||
else include '../../common/view/tablesorter.html.php';
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::a($this->createLink('testcase', 'browse', "productID=$productID&branch=$branch&browseType=$browseType¶m=$param&caseType=$type"), $typeName);
|
||||
echo html::a($this->createLink('testcase', 'browse', "productID=$productID&branch=$branch&browseType=all¶m=$param&caseType=$type"), $typeName);
|
||||
}
|
||||
echo "</li>";
|
||||
}
|
||||
@@ -93,6 +93,7 @@
|
||||
}
|
||||
elseif($hasBrowsePriv and $menuType == 'casetype')
|
||||
{
|
||||
if($currentModule == 'project') continue;
|
||||
if($this->moduleName == 'testtask' and $this->methodName == 'browseunits') continue;
|
||||
if($this->moduleName == 'story' and $this->methodName == 'zerocase') continue;
|
||||
if($browseType == 'bysuite') continue;
|
||||
|
||||
@@ -73,7 +73,7 @@ foreach(explode(',', $config->testcase->create->requiredFields) as $field)
|
||||
<td>
|
||||
<?php echo html::select('type', $lang->testcase->typeList, $type, "class='form-control chosen'");?>
|
||||
<div class="input-group-addon">
|
||||
<?php echo html::checkbox('auto', array('auto' => $lang->testcase->showAutoCase), '', "id='autocase' title='{$lang->testcase->showAutoCase}'");?>
|
||||
<?php echo html::checkbox('auto', array('auto' => $lang->testcase->showAutoCase), $auto, "id='autocase' title='{$lang->testcase->showAutoCase}'");?>
|
||||
</div>
|
||||
</td>
|
||||
<?php if(strpos(",$showFields,", 'stage') !== false):?>
|
||||
@@ -278,14 +278,25 @@ foreach(explode(',', $config->testcase->create->requiredFields) as $field)
|
||||
</div>
|
||||
<?php js::set('caseModule', $lang->testcase->module)?>
|
||||
<script>
|
||||
$(":checkbox[name^='auto']").on('click', function(){
|
||||
if($(this).attr('checked'))
|
||||
$(function()
|
||||
{
|
||||
checkScript();
|
||||
})
|
||||
|
||||
function checkScript()
|
||||
{
|
||||
var autoScript = $(":checkbox[name^='auto']");
|
||||
if(autoScript.attr('checked'))
|
||||
{
|
||||
$('.autoScript').removeClass('hide')
|
||||
}else
|
||||
{
|
||||
$('.autoScript').addClass('hide')
|
||||
}
|
||||
|
||||
}
|
||||
$(":checkbox[name^='auto']").on('click', function(){
|
||||
checkScript();
|
||||
});
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -1427,17 +1427,19 @@ class testtask extends control
|
||||
*
|
||||
* @param int $runID
|
||||
* @param int $caseID
|
||||
* @param int $version
|
||||
* @param string $status all|done
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function results($runID, $caseID = 0, $version = 0)
|
||||
public function results($runID, $caseID = 0, $version = 0, $status = 'done')
|
||||
{
|
||||
if($this->app->tab == 'project') $this->loadModel('project')->setMenu($this->session->project);
|
||||
|
||||
if($runID)
|
||||
{
|
||||
$case = $this->testtask->getRunById($runID)->case;
|
||||
$results = $this->testtask->getResults($runID);
|
||||
$results = $this->testtask->getResults($runID, 0, $status);
|
||||
|
||||
$testtaskID = $this->dao->select('task')->from(TABLE_TESTRUN)->where('id')->eq($runID)->fetch('task');
|
||||
$testtask = $this->dao->select('id, build, execution, product')->from(TABLE_TESTTASK)->where('id')->eq($testtaskID)->fetch();
|
||||
@@ -1447,7 +1449,7 @@ class testtask extends control
|
||||
else
|
||||
{
|
||||
$case = $this->loadModel('testcase')->getByID($caseID, $version);
|
||||
$results = $this->testtask->getResults(0, $caseID);
|
||||
$results = $this->testtask->getResults(0, $caseID, $status);
|
||||
}
|
||||
|
||||
$this->view->case = $case;
|
||||
|
||||
@@ -25,6 +25,7 @@ $(function()
|
||||
});
|
||||
|
||||
$('#casesResults table caption .result-tip').html($('#resultTip').html());
|
||||
if($('tr:first').length == 0) return false;
|
||||
|
||||
if($('tr:first').data('status') == 'ready')
|
||||
{
|
||||
@@ -35,14 +36,14 @@ $(function()
|
||||
var times = 0;
|
||||
var id = $('tr:first').data('id')
|
||||
var link = createLink('testtask', 'ajaxGetResult', 'resultID=' + id);
|
||||
|
||||
|
||||
var resultInterval = setInterval(() => {
|
||||
times++;
|
||||
if(times > 600)
|
||||
{
|
||||
clearInterval(resultInterval);
|
||||
}
|
||||
|
||||
|
||||
$.get(link, function(task)
|
||||
{
|
||||
task = JSON.parse(task);
|
||||
|
||||
@@ -1376,20 +1376,29 @@ class testtaskModel extends model
|
||||
/**
|
||||
* Get results by runID or caseID
|
||||
*
|
||||
* @param int $runID
|
||||
* @param int $caseID
|
||||
* @param int $runID
|
||||
* @param int $caseID
|
||||
* @param string $status all|done
|
||||
* @access public
|
||||
* @return array
|
||||
* @return void
|
||||
*/
|
||||
public function getResults($runID, $caseID = 0)
|
||||
public function getResults($runID, $caseID = 0, $status = 'all')
|
||||
{
|
||||
if($runID > 0)
|
||||
{
|
||||
$results = $this->dao->select('*')->from(TABLE_TESTRESULT)->where('run')->eq($runID)->orderBy('id desc')->fetchAll('id');
|
||||
$results = $this->dao->select('*')->from(TABLE_TESTRESULT)
|
||||
->where('run')->eq($runID)
|
||||
->beginIF($status == 'done')->andWhere('caseResult')->ne('')->fi()
|
||||
->orderBy('id desc')
|
||||
->fetchAll('id');
|
||||
}
|
||||
else
|
||||
{
|
||||
$results = $this->dao->select('*')->from(TABLE_TESTRESULT)->where('`case`')->eq($caseID)->orderBy('id desc')->fetchAll('id');
|
||||
$results = $this->dao->select('*')->from(TABLE_TESTRESULT)
|
||||
->where('`case`')->eq($caseID)
|
||||
->beginIF($status == 'done')->andWhere('caseResult')->ne('')->fi()
|
||||
->orderBy('id desc')
|
||||
->fetchAll('id');
|
||||
}
|
||||
|
||||
if(!$results) return array();
|
||||
|
||||
@@ -125,7 +125,7 @@ $(function()
|
||||
});
|
||||
function loadResult()
|
||||
{
|
||||
$('#resultsContainer').load("<?php echo $this->createLink('testtask', 'results', "runID={$runID}&caseID=$caseID&version=$version");?> #casesResults", function()
|
||||
$('#resultsContainer').load("<?php echo $this->createLink('testtask', 'results', "runID={$runID}&caseID=$caseID&version=$version&status=all");?> #casesResults", function()
|
||||
{
|
||||
$('.result-item').click(function()
|
||||
{
|
||||
@@ -147,14 +147,14 @@ function loadResult()
|
||||
var times = 0;
|
||||
var id = $('.result-item:first').data('id')
|
||||
var link = createLink('testtask', 'ajaxGetResult', 'resultID=' + id);
|
||||
|
||||
|
||||
var resultInterval = setInterval(() => {
|
||||
times++;
|
||||
if(times > 600)
|
||||
{
|
||||
clearInterval(resultInterval);
|
||||
}
|
||||
|
||||
|
||||
$.get(link, function(task)
|
||||
{
|
||||
task = JSON.parse(task);
|
||||
|
||||
@@ -71,6 +71,7 @@ class tutorialModel extends model
|
||||
$product->type = 'normal';
|
||||
$product->status = 'normal';
|
||||
$product->desc = '';
|
||||
$product->shadow = '0';
|
||||
$product->PO = $this->app->user->account;
|
||||
$product->QD = '';
|
||||
$product->RD = '';
|
||||
@@ -166,6 +167,9 @@ class tutorialModel extends model
|
||||
$project->displayCards = 0;
|
||||
$project->fluidBoard = 0;
|
||||
$project->deleted = '0';
|
||||
$project->hasProduct = '1';
|
||||
$project->multiple = '';
|
||||
$project->division = 0;
|
||||
|
||||
return $project;
|
||||
}
|
||||
@@ -204,6 +208,36 @@ class tutorialModel extends model
|
||||
return $projectStat;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get execution stats for tutorial.
|
||||
*
|
||||
* @param string $browseType
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getExecutionStats($browseType = '')
|
||||
{
|
||||
$execution = $this->getProject();
|
||||
$emptyHour = array('totalEstimate' => 0, 'totalConsumed' => 0, 'totalLeft' => 0, 'progress' => 0);
|
||||
|
||||
$execution->hours = (object)$emptyHour;
|
||||
$execution->leftTasks = '—';
|
||||
$execution->teamMembers = array_keys($this->getTeamMembers());
|
||||
$execution->teamCount = count($execution->teamMembers);
|
||||
$execution->hasProduct = '';
|
||||
$execution->multiple = '';
|
||||
$execution->order = 1;
|
||||
$execution->burns = array('');
|
||||
$execution->type = 'sprint';
|
||||
$execution->projectName = '';
|
||||
$execution->projectModel = '';
|
||||
|
||||
if($browseType and $browseType != 'all') $execution->name .= '-' . $browseType; // Fix bug #21096
|
||||
|
||||
$executionStat[0] = $execution;
|
||||
return $executionStat;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tutorial stories.
|
||||
*
|
||||
@@ -320,6 +354,8 @@ class tutorialModel extends model
|
||||
$execution->fluidBoard = 0;
|
||||
$execution->hours = $hours;
|
||||
$execution->burns = array(35, 35);
|
||||
$execution->hasProduct = '';
|
||||
$execution->multiple = '';
|
||||
return $execution;
|
||||
}
|
||||
|
||||
|
||||
@@ -411,6 +411,17 @@ $config->delete['18_0'][] = 'extension/max/common/ext/lang/fr/report.php';
|
||||
$config->delete['18_0'][] = 'extension/max/common/ext/lang/vi/report.php';
|
||||
$config->delete['18_0'][] = 'extension/max/common/ext/lang/zh-cn/report.php';
|
||||
$config->delete['18_0'][] = 'extension/max/common/ext/lang/zh-tw/report.php';
|
||||
$config->delete['18_0'][] = 'extension/max/block/ext/config/zentaomax.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/repo/ext/control/ajaxgetcommitinfo.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/repo/ext/control/ajaxgetbranchesandtags.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/repo/ext/control/ajaxgetbranchesandtags.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/repo/ext/control/editbug.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/repo/ext/view/ajaxgetcommitinfo.html.php';
|
||||
$config->delete['18_0'][] = 'extension/max/repo/ext/control/ajaxgetcommitinfo.php';
|
||||
$config->delete['18_0'][] = 'extension/max/repo/ext/control/ajaxgetbranchesandtags.php';
|
||||
$config->delete['18_0'][] = 'extension/max/repo/ext/control/ajaxgetbranchesandtags.php';
|
||||
$config->delete['18_0'][] = 'extension/max/repo/ext/control/editbug.php';
|
||||
$config->delete['18_0'][] = 'extension/max/repo/ext/view/ajaxgetcommitinfo.html.php';
|
||||
|
||||
$config->upgrade->openModules = array('action', 'admin', 'api', 'automation', 'backup', 'block', 'branch', 'budget', 'bug', 'build', 'caselib', 'ci', 'client', 'common', 'company', 'compile', 'convert', 'cron', 'custom', 'datatable', 'dept', 'design', 'dev', 'doc', 'durationestimation', 'entry', 'execution', 'extension', 'file', 'git', 'gitlab', 'group', 'holiday', 'im', 'index', 'index.html', 'install', 'issue', 'jenkins', 'job', 'kanban', 'license', 'mail', 'message', 'misc', 'mr', 'my', 'personnel', 'pipeline', 'product', 'productplan', 'productset', 'program', 'programplan', 'project', 'projectbuild', 'projectplan', 'projectrelease', 'projectstory', 'qa', 'release', 'repo', 'report', 'risk', 'score', 'screen', 'search', 'setting', 'sonarqube', 'sso', 'stage', 'stakeholder', 'story', 'subject', 'svn', 'task', 'testcase', 'testreport', 'testsuite', 'testtask', 'todo', 'tree', 'tutorial', 'upgrade', 'user', 'webhook', 'weekly', 'workestimation', 'gitea', 'gogs', 'transfer', 'zahost', 'zanode');
|
||||
|
||||
|
||||
@@ -485,7 +485,7 @@ class userModel extends model
|
||||
}
|
||||
|
||||
$accounts[$i] = $data[$i]->account;
|
||||
$prev['company'] = $data[$i]->company;
|
||||
if($users->userType == 'outside') $prev['company'] = $data[$i]->company;
|
||||
$prev['dept'] = $data[$i]->dept;
|
||||
$prev['role'] = $data[$i]->role;
|
||||
$prev['group'] = $data[$i]->group;
|
||||
|
||||
@@ -18,11 +18,11 @@ global $lang;
|
||||
$config->zahost->search['module'] = 'zahost';
|
||||
$config->zahost->search['fields']['name'] = $lang->zahost->name;
|
||||
$config->zahost->search['fields']['id'] = $lang->zahost->id;
|
||||
$config->zahost->search['fields']['type'] = $lang->zahost->type;
|
||||
$config->zahost->search['fields']['extranet'] = $lang->zahost->IP;
|
||||
$config->zahost->search['fields']['cpuCores'] = $lang->zahost->cpuCores;
|
||||
$config->zahost->search['fields']['memory'] = $lang->zahost->memory;
|
||||
$config->zahost->search['fields']['diskSize'] = $lang->zahost->diskSize;
|
||||
$config->zahost->search['fields']['hostType'] = $lang->zahost->type;
|
||||
$config->zahost->search['fields']['vsoft'] = $lang->zahost->vsoft;
|
||||
$config->zahost->search['fields']['status'] = $lang->zahost->status;
|
||||
$config->zahost->search['fields']['createdBy'] = $lang->zahost->createdBy;
|
||||
@@ -33,12 +33,12 @@ $config->zahost->search['fields']['editedDate'] = $lang->zahost->editedDate
|
||||
|
||||
$config->zahost->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
|
||||
$config->zahost->search['params']['id'] = array('operator' => '=', 'control' => 'input', 'values' => '');
|
||||
$config->zahost->search['params']['type'] = array('operator' => '=', 'control' => 'input', 'values' => $lang->zahost->zaHostType);
|
||||
$config->zahost->search['params']['extranet'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
|
||||
$config->zahost->search['params']['cpuCores'] = array('operator' => '=', 'control' => 'input', 'values' => '');
|
||||
$config->zahost->search['params']['memory'] = array('operator' => '=', 'control' => 'input', 'values' => '');
|
||||
$config->zahost->search['params']['diskSize'] = array('operator' => '=', 'control' => 'input', 'values' => '');
|
||||
$config->zahost->search['params']['vsoft'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
|
||||
$config->zahost->search['params']['hostType'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->zahost->zaHostTypeList);
|
||||
$config->zahost->search['params']['vsoft'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->zahost->softwareList);
|
||||
$config->zahost->search['params']['status'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->zahost->statusList);
|
||||
$config->zahost->search['params']['instanceNum'] = array('operator' => '=', 'control' => 'input', 'values' => '');
|
||||
$config->zahost->search['params']['createdBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
|
||||
@@ -50,6 +50,7 @@ $config->zahost->search['params']['editedDate'] = array('operator' => '=',
|
||||
$config->zahost->editor = new stdclass();
|
||||
$config->zahost->editor->create = array('id' => 'desc', 'tools' => 'simpleTools');
|
||||
$config->zahost->editor->edit = array('id' => 'desc', 'tools' => 'simpleTools');
|
||||
$config->zahost->editor->view = array('id' => 'comment', 'tools' => 'simpleTools');
|
||||
|
||||
$config->zahost->automation = new stdclass();
|
||||
$config->zahost->automation->zenAgentURL = 'https://github.com/easysoft/zenagent/blob/main/guide/deploy/index.md';
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
.c-status,.c-progress{width: 80px;}
|
||||
.c-osName{width: 150px;}
|
||||
.main-header-image{border:none;margin-left: 0!important;padding-left:0;}
|
||||
.c-name,.c-status,.c-progress,.c-osName{width: 130px;}
|
||||
.main-header-image{border:none;margin-left: 0!important;padding-left:0;}
|
||||
|
||||
@@ -13,7 +13,10 @@
|
||||
.fail{color:red;}
|
||||
.dot-symbol{padding-right:10px;}
|
||||
#statusContainer{margin:0px 0px 10px 0px;}
|
||||
#checkServiceStatus{background-color: #ffffff;}
|
||||
#checkServiceStatus:hover{background-color: #f0fdfb;}
|
||||
#serviceContent{overflow: hidden;}
|
||||
.service-check{margin-top: 0px;}
|
||||
.checkStatus{color: #313c52;}
|
||||
.btn-info {background-color: unset;}
|
||||
.icon-refresh {font-size: 15px;}
|
||||
.load-indicator:after {top: 33%;}
|
||||
.c-number {width: 120px;}
|
||||
|
||||
@@ -128,7 +128,7 @@ $lang->zahost->notice->registerCommand = 'Register command: ./zagent-host -t hos
|
||||
$lang->zahost->notice->loading = 'loading...';
|
||||
$lang->zahost->notice->noImage = 'No available image';
|
||||
|
||||
$lang->zahost->tips = 'Host include physical host, k8s clusters, cloud servers, and cloud container instances. Host used to create VMS or container instances. The recommended host OS is ubuntu or CentOS LTS.';
|
||||
$lang->zahost->tips = 'Host include physical host, K8s clusters, cloud servers, and cloud container instances. Host used to create VMS or container instances. The recommended host OS is Ubuntu or CentOS LTS.';
|
||||
|
||||
$lang->zahost->automation = new stdclass();
|
||||
$lang->zahost->automation->title = 'Test Automation Solutions';
|
||||
@@ -138,7 +138,7 @@ $lang->zahost->automation->framework = 'Framework';
|
||||
$lang->zahost->automation->frameworkSpec = 'The solution architecture based on the KVM virtualization software:';
|
||||
|
||||
$lang->zahost->automation->feature1 = '1、Core concepts';
|
||||
$lang->zahost->automation->feature1Spec = "Hosts include physical hosts, k8s clusters, cloud servers, and cloud container instances, which are mainly used to create virtual machines or container instances. The recommended operating system for the host is ubuntu or the LTS version of CentOS.<br/> An execution node is a virtual machine or container instance created by the host and is a test environment where test tasks are executed.";
|
||||
$lang->zahost->automation->feature1Spec = "Hosts include physical hosts, K8s clusters, cloud servers, and cloud container instances, which are mainly used to create virtual machines or container instances. The recommended operating system for the host is Ubuntu or the LTS version of CentOS.<br/> An execution node is a virtual machine or container instance created by the host and is a test environment where test tasks are executed.";
|
||||
$lang->zahost->automation->feature2 = '2、Application introduction';
|
||||
$lang->zahost->automation->feature2ZenAgent = 'ZenAgent is an open source software test automation and scheduling platform, which provides users with a distributed and centrally managed test environment with the help of virtualization technology.';
|
||||
$lang->zahost->automation->feature2ZTF = 'ZTF is an open source automated test management framework of Zen Tao, which helps users to manage test scripts in a unified way. ZTF is deeply integrated with Zen Tao, each script can be associated with a use case in the test management system, and the step information in the script and the use case information in the management system can be synchronized with each other.';
|
||||
|
||||
@@ -128,7 +128,7 @@ $lang->zahost->notice->registerCommand = 'Register command: ./zagent-host -t hos
|
||||
$lang->zahost->notice->loading = 'loading...';
|
||||
$lang->zahost->notice->noImage = 'No available image';
|
||||
|
||||
$lang->zahost->tips = 'Host include physical host, k8s clusters, cloud servers, and cloud container instances. Host used to create VMS or container instances. The recommended host OS is ubuntu or CentOS LTS.';
|
||||
$lang->zahost->tips = 'Host include physical host, K8s clusters, cloud servers, and cloud container instances. Host used to create VMS or container instances. The recommended host OS is Ubuntu or CentOS LTS.';
|
||||
|
||||
$lang->zahost->automation = new stdclass();
|
||||
$lang->zahost->automation->title = 'Test Automation Solutions';
|
||||
@@ -138,7 +138,7 @@ $lang->zahost->automation->framework = 'Framework';
|
||||
$lang->zahost->automation->frameworkSpec = 'The solution architecture based on the KVM virtualization software:';
|
||||
|
||||
$lang->zahost->automation->feature1 = '1、Core concepts';
|
||||
$lang->zahost->automation->feature1Spec = "Hosts include physical hosts, k8s clusters, cloud servers, and cloud container instances, which are mainly used to create virtual machines or container instances. The recommended operating system for the host is ubuntu or the LTS version of CentOS.<br/> An execution node is a virtual machine or container instance created by the host and is a test environment where test tasks are executed.";
|
||||
$lang->zahost->automation->feature1Spec = "Hosts include physical hosts, K8s clusters, cloud servers, and cloud container instances, which are mainly used to create virtual machines or container instances. The recommended operating system for the host is Ubuntu or the LTS version of CentOS.<br/> An execution node is a virtual machine or container instance created by the host and is a test environment where test tasks are executed.";
|
||||
$lang->zahost->automation->feature2 = '2、Application introduction';
|
||||
$lang->zahost->automation->feature2ZenAgent = 'ZenAgent is an open source software test automation and scheduling platform, which provides users with a distributed and centrally managed test environment with the help of virtualization technology.';
|
||||
$lang->zahost->automation->feature2ZTF = 'ZTF is an open source automated test management framework of Zen Tao, which helps users to manage test scripts in a unified way. ZTF is deeply integrated with Zen Tao, each script can be associated with a use case in the test management system, and the step information in the script and the use case information in the management system can be synchronized with each other.';
|
||||
|
||||
@@ -128,7 +128,7 @@ $lang->zahost->notice->registerCommand = 'Register command: ./zagent-host -t hos
|
||||
$lang->zahost->notice->loading = 'loading...';
|
||||
$lang->zahost->notice->noImage = 'No available image';
|
||||
|
||||
$lang->zahost->tips = 'Host include physical host, k8s clusters, cloud servers, and cloud container instances. Host used to create VMS or container instances. The recommended host OS is ubuntu or CentOS LTS.';
|
||||
$lang->zahost->tips = 'Host include physical host, K8s clusters, cloud servers, and cloud container instances. Host used to create VMS or container instances. The recommended host OS is Ubuntu or CentOS LTS.';
|
||||
|
||||
$lang->zahost->automation = new stdclass();
|
||||
$lang->zahost->automation->title = 'Test Automation Solutions';
|
||||
@@ -138,7 +138,7 @@ $lang->zahost->automation->framework = 'Framework';
|
||||
$lang->zahost->automation->frameworkSpec = 'The solution architecture based on the KVM virtualization software:';
|
||||
|
||||
$lang->zahost->automation->feature1 = '1、Core concepts';
|
||||
$lang->zahost->automation->feature1Spec = "Hosts include physical hosts, k8s clusters, cloud servers, and cloud container instances, which are mainly used to create virtual machines or container instances. The recommended operating system for the host is ubuntu or the LTS version of CentOS.<br/> An execution node is a virtual machine or container instance created by the host and is a test environment where test tasks are executed.";
|
||||
$lang->zahost->automation->feature1Spec = "Hosts include physical hosts, K8s clusters, cloud servers, and cloud container instances, which are mainly used to create virtual machines or container instances. The recommended operating system for the host is Ubuntu or the LTS version of CentOS.<br/> An execution node is a virtual machine or container instance created by the host and is a test environment where test tasks are executed.";
|
||||
$lang->zahost->automation->feature2 = '2、Application introduction';
|
||||
$lang->zahost->automation->feature2ZenAgent = 'ZenAgent is an open source software test automation and scheduling platform, which provides users with a distributed and centrally managed test environment with the help of virtualization technology.';
|
||||
$lang->zahost->automation->feature2ZTF = 'ZTF is an open source automated test management framework of Zen Tao, which helps users to manage test scripts in a unified way. ZTF is deeply integrated with Zen Tao, each script can be associated with a use case in the test management system, and the step information in the script and the use case information in the management system can be synchronized with each other.';
|
||||
|
||||
@@ -128,7 +128,7 @@ $lang->zahost->notice->registerCommand = '宿主机注册命令:./zagent-host
|
||||
$lang->zahost->notice->loading = '加载中...';
|
||||
$lang->zahost->notice->noImage = '无可用的镜像文件';
|
||||
|
||||
$lang->zahost->tips = '宿主机包括实体主机、k8s集群、云服务器以及云容器实例,主要用于创建虚拟机或容器实例。宿主机推荐安装的操作系统为ubuntu或CentOS的LTS版本。';
|
||||
$lang->zahost->tips = '宿主机包括实体主机、K8s集群、云服务器以及云容器实例,主要用于创建虚拟机或容器实例。宿主机推荐安装的操作系统为Ubuntu或CentOS的LTS版本。';
|
||||
|
||||
$lang->zahost->automation = new stdclass();
|
||||
$lang->zahost->automation->title = '自动化测试解决方案';
|
||||
@@ -138,7 +138,7 @@ $lang->zahost->automation->framework = '架构';
|
||||
$lang->zahost->automation->frameworkSpec = '基于KVM虚拟化软件的解决方案架构:';
|
||||
|
||||
$lang->zahost->automation->feature1 = '1、核心概念';
|
||||
$lang->zahost->automation->feature1Spec = "宿主机包括实体主机、k8s集群、云服务器以及云容器实例,主要用于创建虚拟机或容器实例。宿主机推荐安装的操作系统为ubuntu或CentOS的LTS版本。<br/> 执行节点是由宿主机创建的虚拟机或容器实例,是执行测试任务的测试环境。";
|
||||
$lang->zahost->automation->feature1Spec = "宿主机包括实体主机、K8s集群、云服务器以及云容器实例,主要用于创建虚拟机或容器实例。宿主机推荐安装的操作系统为Ubuntu或CentOS的LTS版本。<br/> 执行节点是由宿主机创建的虚拟机或容器实例,是执行测试任务的测试环境。";
|
||||
$lang->zahost->automation->feature2 = '2、应用介绍';
|
||||
$lang->zahost->automation->feature2ZenAgent = 'ZenAgent是禅道开源的软件自动化测试调度平台,它借助虚拟化技术,为用户提供了一个分布式、集中管理的的测试环境。';
|
||||
$lang->zahost->automation->feature2ZTF = 'ZTF是禅道开源的自动化测试管理框架,它帮助用户将测试脚本统一管理。ZTF与禅道深度集成,每一个脚本都可以和测试管理系统里面的一个用例进行关联,脚本里面的步骤信息和管理系统里面的用例信息可以互相同步。';
|
||||
|
||||
@@ -20,7 +20,7 @@ class zahostModel extends model
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->app->lang->host = $this->lang->zahost;
|
||||
$this->app->lang->host = $this->lang->zahost;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -540,14 +540,18 @@ class zahostModel extends model
|
||||
public function buildOperateViewMenu($host)
|
||||
{
|
||||
if($host->deleted) return '';
|
||||
$nodeList = $this->loadModel('zanode')->getListByHost($host->id);
|
||||
$disabled = '';
|
||||
$title = !empty($nodeList) ? $this->lang->zahost->undeletedNotice : $this->lang->zahost->delete;
|
||||
if($nodeList) $disabled = 'disabled';
|
||||
|
||||
$menu = '';
|
||||
$params = "hostID=$host->id";
|
||||
|
||||
$menu .= $this->buildMenu('zahost', 'browseImage', $params, $host, 'view', 'snap-house', '', 'iframe', true, '', $this->lang->zahost->image->browseImage);
|
||||
$menu .= $this->buildMenu('zahost', 'browseImage', $params, $host, 'view', 'mirror', '', 'iframe', true, '', $this->lang->zahost->image->browseImage);
|
||||
$menu .= "<div class='divider'></div>";
|
||||
$menu .= $this->buildMenu('zahost', 'edit', $params, $host, 'view');
|
||||
$menu .= $this->buildMenu('zahost', 'delete', $params, $host, 'view', 'trash', 'hiddenwin');
|
||||
$menu .= $this->buildMenu('zahost', 'delete', $params, $host, 'view', 'trash', 'hiddenwin', $disabled, true, '', $title);
|
||||
|
||||
return $menu;
|
||||
}
|
||||
|
||||
@@ -52,8 +52,8 @@
|
||||
<th class='c-memory'> <?php common::printOrderLink('memory', $orderBy, $vars, $lang->zahost->memory);?></th>
|
||||
<th class='c-diskSize'> <?php common::printOrderLink('diskSize', $orderBy, $vars, $lang->zahost->diskSize);?></th>
|
||||
<th class='c-software'> <?php common::printOrderLink('vsoft', $orderBy, $vars, $lang->zahost->vsoft);?></th>
|
||||
<th class='c-status'> <?php common::printOrderLink('t2.status', $orderBy, $vars, $lang->zahost->status);?></th>
|
||||
<th class='c-datetime'> <?php common::printOrderLink('registerDate', $orderBy, $vars, $lang->zahost->registerDate);?></th>
|
||||
<th class='c-status'> <?php common::printOrderLink('status', $orderBy, $vars, $lang->zahost->status);?></th>
|
||||
<th class='c-datetime'> <?php common::printOrderLink('heartbeat', $orderBy, $vars, $lang->zahost->registerDate);?></th>
|
||||
<th class='c-actions-3 text-center'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -73,7 +73,7 @@
|
||||
<td class='c-actions'>
|
||||
<?php $disabled = ($host->status == 'wait') ? 'disabled' : '';?>
|
||||
<?php $title = ($host->status == 'wait') ? $lang->zahost->uninitNotice: $lang->zahost->image->browseImage;?>
|
||||
<?php common::printIcon('zahost', 'browseImage', "hostID={$host->hostID}", $host, 'list', 'snap-house', '', "iframe $disabled", true, "data-width='60%'", $title);?>
|
||||
<?php common::printIcon('zahost', 'browseImage', "hostID={$host->hostID}", $host, 'list', 'mirror', '', "iframe $disabled", true, "data-width='80%'", $title);?>
|
||||
<?php $disabled = !empty($nodeList[$host->hostID]) ? 'disabled' : '';?>
|
||||
<?php $title = !empty($nodeList[$host->hostID]) ? $lang->zahost->undeletedNotice : $lang->zahost->delete;?>
|
||||
<?php common::printIcon('zahost', 'edit', "hostID={$host->hostID}", $host, 'list');?>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<?php $vars = "id={$zahost->hostID}&orderBy=%s";?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php echo html::backButton('<i class="icon icon-back icon-sm"></i> ' . $lang->goback, "data-app='{$app->tab}'", 'btn btn-secondary');?>
|
||||
<?php echo html::linkButton('<i class="icon icon-back icon-sm"></i> ' . $lang->goback, $browseLink, 'self', "data-app='{$app->tab}'", 'btn btn-secondary');?>
|
||||
<div class='divider'></div>
|
||||
<div class='page-title'>
|
||||
<span class='label label-id'><?php echo $zahost->id;?></span>
|
||||
@@ -170,7 +170,7 @@
|
||||
<?php $this->printExtendFields($zahost, 'div', "position=left&inForm=0&inCell=1");?>
|
||||
<div class='main-actions'>
|
||||
<div class="btn-toolbar">
|
||||
<?php echo html::backButton('<i class="icon icon-back icon-sm"></i> ' . $lang->goback, '', 'btn btn-secondary');?>
|
||||
<?php echo html::linkButton('<i class="icon icon-back icon-sm"></i> ' . $lang->goback, $browseLink, 'self', "data-app='{$app->tab}'", 'btn btn-secondary');?>
|
||||
<div class='divider'></div>
|
||||
<?php echo $this->zahost->buildOperateMenu($zahost, 'view');?>
|
||||
</div>
|
||||
|
||||
@@ -46,6 +46,7 @@ $config->zanode->search['params']['memory'] = array('operator' => '=', 'cont
|
||||
$config->zanode->search['params']['diskSize'] = array('operator' => '=', 'control' => 'input', 'values' => '');
|
||||
|
||||
$config->zanode->editor = new stdclass();
|
||||
$config->zanode->editor->create = array('id' => 'desc', 'tools' => 'simpleTools');
|
||||
$config->zanode->editor->edit = array('id' => 'desc', 'tools' => 'simpleTools');
|
||||
$config->zanode->editor->create = array('id' => 'desc', 'tools' => 'simpleTools');
|
||||
$config->zanode->editor->edit = array('id' => 'desc', 'tools' => 'simpleTools');
|
||||
$config->zanode->editor->createimage = array('id' => 'desc', 'tools' => 'simpleTools');
|
||||
$config->zanode->editor->view = array('id' => 'comment', 'tools' => 'simpleTools');
|
||||
|
||||
@@ -68,7 +68,6 @@ class zanode extends control
|
||||
*/
|
||||
public function create($hostID = 0)
|
||||
{
|
||||
$this->loadModel('zahost');
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$nodeID = $this->zanode->create();
|
||||
@@ -234,7 +233,9 @@ class zanode extends control
|
||||
|
||||
if($error)
|
||||
{
|
||||
return print(js::error($error));
|
||||
$response['result'] = 'fail';
|
||||
$response['message'] = $error;
|
||||
return $this->send($response);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
.zanode-detail .text-right{text-align: right;}
|
||||
.zanode-detail .col-8{padding-left: 10px;}
|
||||
.zanode-detail .col-7{padding-left: 10px;}
|
||||
.table.has-sort-head thead tr th a:after{line-height: 22px;}
|
||||
.table.has-sort-head thead tr th a:before{line-height: 22px;}
|
||||
.main-row-last{table-layout: auto;}
|
||||
@@ -12,7 +13,6 @@
|
||||
.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: #ffffff;}
|
||||
#checkServiceStatus:hover{background-color: #f0fdfb;}
|
||||
.checkStatus{color: #313c52;}
|
||||
.node-not-wrap{white-space: nowrap;}
|
||||
.btn-info {background-color: unset;}
|
||||
|
||||
@@ -30,6 +30,7 @@ function checkServiceStatus(){
|
||||
{
|
||||
$('.ztf-status').text(zanodeLang.init[resultData.data[key]])
|
||||
$('.ztf-install').text('');
|
||||
$('.ztf-install-icon').hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -79,7 +80,7 @@ function checkServiceStatus(){
|
||||
}
|
||||
}
|
||||
}
|
||||
if(resultData.data[key] !== 'ready')
|
||||
if(resultData.data[key] !== 'ready' && key != 'node')
|
||||
{
|
||||
isSuccess = false
|
||||
}
|
||||
|
||||
@@ -83,6 +83,7 @@ $lang->zanode->imageNameEmpty = 'Name can not be empty.';
|
||||
$lang->zanode->runTimeout = 'Network connection timeout, please check the host and execution node status.';
|
||||
|
||||
$lang->zanode->apiError['-10100'] = 'ZenAgent Node not found.';
|
||||
$lang->zanode->apiError['fail'] = 'Connection timeout, Please check the host and execution node status.';
|
||||
|
||||
$lang->zanode->publicList[0] = 'Private';
|
||||
$lang->zanode->publicList[1] = 'Public';
|
||||
@@ -129,3 +130,4 @@ $lang->zanode->tips = "The execution node is a virtual machine or container inst
|
||||
$lang->zanode->scriptTips = 'Write the directory where the script is located on the execution node.';
|
||||
$lang->zanode->shellTips = 'Before running the automated test script on the execution node, you can execute a custom shell command.';
|
||||
$lang->zanode->automationTips = 'Before executing the test task on the execution node, you need to set up the execution node corresponding to the product, the directory of the automated test script, and the custom Shell command to execute.';
|
||||
$lang->zanode->nameUnique = $lang->zanode->name . 'already exist';
|
||||
|
||||
@@ -83,6 +83,7 @@ $lang->zanode->imageNameEmpty = 'Name can not be empty.';
|
||||
$lang->zanode->runTimeout = 'Network connection timeout, please check the host and execution node status.';
|
||||
|
||||
$lang->zanode->apiError['-10100'] = 'ZenAgent Node not found.';
|
||||
$lang->zanode->apiError['fail'] = 'Connection timeout, Please check the host and execution node status.';
|
||||
|
||||
$lang->zanode->publicList[0] = 'Private';
|
||||
$lang->zanode->publicList[1] = 'Public';
|
||||
@@ -129,3 +130,4 @@ $lang->zanode->tips = "The execution node is a virtual machine or container inst
|
||||
$lang->zanode->scriptTips = 'Write the directory where the script is located on the execution node.';
|
||||
$lang->zanode->shellTips = 'Before running the automated test script on the execution node, you can execute a custom shell command.';
|
||||
$lang->zanode->automationTips = 'Before executing the test task on the execution node, you need to set up the execution node corresponding to the product, the directory of the automated test script, and the custom Shell command to execute.';
|
||||
$lang->zanode->nameUnique = $lang->zanode->name . 'already exist';
|
||||
|
||||
@@ -83,6 +83,7 @@ $lang->zanode->imageNameEmpty = 'Name can not be empty.';
|
||||
$lang->zanode->runTimeout = 'Network connection timeout, please check the host and execution node status.';
|
||||
|
||||
$lang->zanode->apiError['-10100'] = 'ZenAgent Node not found.';
|
||||
$lang->zanode->apiError['fail'] = 'Connection timeout, Please check the host and execution node status.';
|
||||
|
||||
$lang->zanode->publicList[0] = 'Private';
|
||||
$lang->zanode->publicList[1] = 'Public';
|
||||
@@ -129,3 +130,4 @@ $lang->zanode->tips = "The execution node is a virtual machine or container inst
|
||||
$lang->zanode->scriptTips = 'Write the directory where the script is located on the execution node.';
|
||||
$lang->zanode->shellTips = 'Before running the automated test script on the execution node, you can execute a custom shell command.';
|
||||
$lang->zanode->automationTips = 'Before executing the test task on the execution node, you need to set up the execution node corresponding to the product, the directory of the automated test script, and the custom Shell command to execute.';
|
||||
$lang->zanode->nameUnique = $lang->zanode->name . 'already exist';
|
||||
|
||||
@@ -83,6 +83,7 @@ $lang->zanode->imageNameEmpty = '名称不能为空';
|
||||
$lang->zanode->runTimeout = '自动执行失败,请检查宿主机和执行节点状态';
|
||||
|
||||
$lang->zanode->apiError['-10100'] = '执行节点不存在';
|
||||
$lang->zanode->apiError['fail'] = '执行失败,请检查宿主机和执行节点状态';
|
||||
|
||||
$lang->zanode->publicList[0] = '不共享';
|
||||
$lang->zanode->publicList[1] = '共享';
|
||||
@@ -129,3 +130,4 @@ $lang->zanode->tips = '执行节点是由宿主机创建的虚拟机或容器实
|
||||
$lang->zanode->scriptTips = '填写执行节点上自动化测试脚本所在的目录。';
|
||||
$lang->zanode->shellTips = '在执行节点上运行自动化测试脚本前,可以执行自定义的shell命令。';
|
||||
$lang->zanode->automationTips = '在执行节点上执行测试任务前,需要设置产品对应的执行节点,自动化测试脚本的目录以及需要执行的自定义Shell命令。';
|
||||
$lang->zanode->nameUnique = $lang->zanode->name . '已存在';
|
||||
|
||||
+20
-3
@@ -28,6 +28,17 @@ class zanodemodel extends model
|
||||
const KVM_EXPORT_PATH = '/api/v1/kvm/exportVm';
|
||||
const KVM_STATUS_PATH = '/api/v1/task/getStatus';
|
||||
|
||||
/**
|
||||
* Set lang;
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->app->lang->host = $this->lang->zanode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an Node.
|
||||
@@ -41,11 +52,10 @@ class zanodemodel extends model
|
||||
$data = fixer::input('post')->get();
|
||||
|
||||
/* Batch check fields. */
|
||||
$this->lang->vm = $this->lang->zanode;
|
||||
$data->type = 'node';
|
||||
$this->dao->update(TABLE_ZAHOST)->data($data)
|
||||
->batchCheck($this->config->zanode->create->requiredFields, 'notempty')
|
||||
->check('name', 'unique', "type='node'");
|
||||
->batchCheck($this->config->zanode->create->requiredFields, 'notempty');
|
||||
|
||||
if(dao::isError()) return false;
|
||||
|
||||
if(!preg_match("/^(?!_)(?!-)(?!\.)[a-zA-Z0-9\_\.\-]+$/", $data->name))
|
||||
@@ -54,6 +64,10 @@ class zanodemodel extends model
|
||||
return false;
|
||||
}
|
||||
|
||||
/* If name already exists return error. */
|
||||
$node = $this->dao->select('*')->from(TABLE_ZAHOST)->where('name')->eq($data->name)->andWhere('type')->eq('node')->fetch();
|
||||
if($node) return dao::$errors[] = $this->lang->zanode->nameUnique;
|
||||
|
||||
/* Get image. */
|
||||
$image = $this->getImageByID($data->image);
|
||||
|
||||
@@ -179,6 +193,8 @@ class zanodemodel extends model
|
||||
if($type != 'reboot')
|
||||
{
|
||||
$status = $type == 'suspend' ? 'suspend' : 'running';
|
||||
if($type == 'destroy') $status = 'shutoff';
|
||||
|
||||
$this->dao->update(TABLE_ZAHOST)->set('status')->eq($status)->where('id')->eq($id)->exec();
|
||||
}
|
||||
|
||||
@@ -777,6 +793,7 @@ class zanodemodel extends model
|
||||
$data = fixer::input('post')
|
||||
->setDefault('createdBy', $this->app->user->account)
|
||||
->setDefault('createdDate', $now)
|
||||
->setDefault('node', 0)
|
||||
->remove('uid')
|
||||
->get();
|
||||
|
||||
|
||||
@@ -85,19 +85,19 @@
|
||||
$rebootAttr = "title='{$lang->zanode->reboot}' target='hiddenwin'";
|
||||
$rebootAttr .= $node->status == 'shutoff' ? ' class="btn disabled"' : "class='btn' target='hiddenwin' onclick='if(confirm(\"{$lang->zanode->confirmReboot}\")==false) return false;'";
|
||||
|
||||
common::printLink('zanode', 'getVNC', "id={$node->id}", "<i class='icon icon-desktop'></i> ", '_blank', "title='{$lang->zanode->getVNC}' class='btn desktop " . (in_array($node->status ,array('running', 'launch', 'wait')) ? '':'disabled') . "'", '');
|
||||
common::printLink('zanode', 'getVNC', "id={$node->id}", "<i class='icon icon-remote'></i> ", (in_array($node->status ,array('running', 'launch', 'wait')) ? '_blank' : ''), "title='{$lang->zanode->getVNC}' class='btn desktop " . (in_array($node->status ,array('running', 'launch', 'wait')) ? '':'disabled') . "'", '');
|
||||
if($node->status == "suspend")
|
||||
{
|
||||
common::printLink('zanode', 'resume', "zanodeID={$node->id}", "<i class='icon icon-back'></i> ", '', $resumeAttr);
|
||||
common::printLink('zanode', 'resume', "zanodeID={$node->id}", "<i class='icon icon-resume'></i> ", '', $resumeAttr);
|
||||
}
|
||||
else
|
||||
{
|
||||
common::printLink('zanode', 'suspend', "zanodeID={$node->id}", "<i class='icon icon-pause'></i> ", '', $suspendAttr);
|
||||
common::printLink('zanode', 'suspend', "zanodeID={$node->id}", "<i class='icon icon-moon'></i> ", '', $suspendAttr);
|
||||
}
|
||||
|
||||
if($node->status == "shutoff")
|
||||
{
|
||||
common::printLink('zanode', 'start', "zanodeID={$node->id}", "<i class='icon icon-magic'></i> ", '', "class='btn ' title='{$lang->zanode->boot}'");
|
||||
common::printLink('zanode', 'start', "zanodeID={$node->id}", "<i class='icon icon-play'></i> ", '', "class='btn ' title='{$lang->zanode->boot}'");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -107,13 +107,16 @@
|
||||
common::printLink('zanode', 'reboot', "zanodeID={$node->id}", "<i class='icon icon-restart'></i> ", '', $rebootAttr);
|
||||
common::printIcon('zanode', 'edit', "id={$node->id}", $node, 'list');
|
||||
|
||||
echo "<div class='btn-group'>";
|
||||
echo "<button type='button' class='btn dropdown-toggle' data-toggle='context-dropdown' title='{$this->lang->more}'><i class='icon-ellipsis-v'></i></button>";
|
||||
echo "<ul class='dropdown-menu pull-right text-center' role='menu'>";
|
||||
common::printLink('zanode', 'createImage', "zanodeID={$node->id}", "<i class='icon icon-export'></i> ", '', "class='btn btn-action iframe createImage' title='{$lang->zanode->createImage}' data-width='55%'", '', true);
|
||||
common::printLink('zanode', 'destroy', "zanodeID={$node->id}", "<i class='icon icon-trash'></i> ", '', "title='{$lang->zanode->destroy}' class='btn btn-action' target='hiddenwin'");
|
||||
echo "</ul>";
|
||||
echo "</div>";
|
||||
if(common::hasPriv('zanode', 'createImage') or common::hasPriv('zanode', 'destroy'))
|
||||
{
|
||||
echo "<div class='btn-group'>";
|
||||
echo "<button type='button' class='btn dropdown-toggle' data-toggle='context-dropdown' title='{$this->lang->more}'><i class='icon-ellipsis-v'></i></button>";
|
||||
echo "<ul class='dropdown-menu pull-right text-center' role='menu'>";
|
||||
common::printLink('zanode', 'createImage', "zanodeID={$node->id}", "<i class='icon icon-export'></i> ", '', "class='btn btn-action iframe createImage' title='{$lang->zanode->createImage}' data-width='55%'", '', true);
|
||||
common::printLink('zanode', 'destroy', "zanodeID={$node->id}", "<i class='icon icon-trash'></i> ", '', "title='{$lang->zanode->destroy}' class='btn btn-action' target='hiddenwin'");
|
||||
echo "</ul>";
|
||||
echo "</div>";
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -28,7 +28,7 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
|
||||
?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php echo html::backButton('<i class="icon icon-back icon-sm"></i> ' . $lang->goback, "data-app='{$app->tab}'", 'btn btn-secondary'); ?>
|
||||
<?php echo html::linkButton('<i class="icon icon-back icon-sm"></i> ' . $lang->goback, $browseLink, 'self', "data-app='{$app->tab}'", 'btn btn-secondary');?>
|
||||
<div class='divider'></div>
|
||||
<div class='page-title'>
|
||||
<span class='label label-id'><?php echo $zanode->id; ?></span>
|
||||
@@ -48,16 +48,16 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
|
||||
<div class="main-row zanode-mt-8">
|
||||
<div class="col-4">
|
||||
<div class="main-row">
|
||||
<div class="col-3 text-right"><?php echo $lang->zanode->osName; ?>:</div>
|
||||
<div class="col-8"><?php echo $zanode->osName; ?></div>
|
||||
<div class="col-4 text-right"><?php echo $lang->zanode->osName; ?>:</div>
|
||||
<div class="col-7"><?php echo $zanode->osName; ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<div class="main-row">
|
||||
<div class="col-3 text-right"><?php echo $lang->zanode->sshAddress; ?>:</div>
|
||||
<div class="col-8 node-not-wrap">ssh <?php echo $account . '@' . $zanode->ip . ' -p ' . $zanode->ssh; ?> <?php echo "<button type='button' class='btn btn-info btn-mini btn-ssh-copy'><i class='icon-common-copy icon-copy' title='" . $lang->zanode->copy . "'></i></button>"; ?></div>
|
||||
<div class="col-8 node-not-wrap">ssh <?php echo $account . '@' . $zanode->ip . ' -p ' . $zanode->ssh; ?><?php echo " <button type='button' class='btn btn-info btn-mini btn-ssh-copy'><i class='icon-common-copy icon-copy' title='" . $lang->zanode->copy . "'></i></button>"; ?></div>
|
||||
</div>
|
||||
<textarea style="display:none;" id="ssh-copy"><?php echo $account . '@' . $zanode->ip . ' -p ' . $zanode->ssh; ?></textarea>
|
||||
<textarea style="display:none;" id="ssh-copy">ssh <?php echo $account . '@' . $zanode->ip . ' -p ' . $zanode->ssh; ?></textarea>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<div class="main-row">
|
||||
@@ -69,8 +69,8 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
|
||||
<div class="main-row zanode-mt-8">
|
||||
<div class="col-4">
|
||||
<div class="main-row">
|
||||
<div class="col-3 text-right"><?php echo $lang->zanode->status; ?>:</div>
|
||||
<div class="col-8"><?php echo zget($lang->zanode->statusList, $zanode->status); ?></div>
|
||||
<div class="col-4 text-right"><?php echo $lang->zanode->status; ?>:</div>
|
||||
<div class="col-7"><?php echo zget($lang->zanode->statusList, $zanode->status); ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
@@ -89,8 +89,8 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
|
||||
<div class="main-row main-row-last zanode-mt-8">
|
||||
<div class="col-4">
|
||||
<div class="main-row">
|
||||
<div class="col-3 text-right"><?php echo $lang->zanode->hostName; ?>:</div>
|
||||
<div class="col-8"><?php echo $zanode->hostName; ?></div>
|
||||
<div class="col-4 text-right"><?php echo $lang->zanode->hostName; ?>:</div>
|
||||
<div class="col-7"><?php echo $zanode->hostName; ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
@@ -133,11 +133,11 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
|
||||
<span class='dot-symbol dot-ztf text-danger'>●</span>
|
||||
<span> ZTF
|
||||
<span class="ztf-status"><?php echo $lang->zanode->initializing; ?></span>
|
||||
<a class='node-init-install hide' target='hiddenwin' herf='javascript:;' data-href='<?php echo $this->createLink('zanode', 'ajaxInstallService', 'nodeID=' . $zanode->id . '&service=ztf');?>'><i class="icon icon-download icon-sm"></i><span class="ztf-install"><?php echo $lang->zanode->install ?></span></a>
|
||||
<a class='node-init-install hide' target='hiddenwin' href='javascript:;' data-href='<?php echo $this->createLink('zanode', 'ajaxInstallService', 'nodeID=' . $zanode->id . '&service=ztf');?>'><i class="icon icon-download icon-sm ztf-install-icon"></i><span class="ztf-install"><?php echo $lang->zanode->install ?></span></a>
|
||||
</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/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-success hide'><?php echo sprintf($lang->zanode->init->initSuccessNoticeTitle, "<a href='https://www.zentao.net/book/zentaopms/configure-environment-974.html' target='_blank'>{$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>
|
||||
@@ -152,7 +152,7 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
|
||||
<?php $this->printExtendFields($zanode, 'div', "position=left&inForm=0&inCell=1"); ?>
|
||||
<div class='main-actions'>
|
||||
<div class="btn-toolbar">
|
||||
<?php echo html::backButton('<i class="icon icon-back icon-sm"></i> ' . $lang->goback, '', 'btn btn-secondary'); ?>
|
||||
<?php echo html::linkButton('<i class="icon icon-back icon-sm"></i> ' . $lang->goback, $browseLink, 'self', "data-app='{$app->tab}'", 'btn btn-secondary');?>
|
||||
<div class='divider'></div>
|
||||
<?php
|
||||
if (empty($zanode->deleted)) {
|
||||
@@ -164,20 +164,20 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
|
||||
|
||||
$rebootAttr = "title='{$lang->zanode->reboot}' target='hiddenwin'";
|
||||
$rebootAttr .= $zanode->status == 'shutoff' ? ' class="btn disabled"' : "class='btn' target='hiddenwin' onclick='if(confirm(\"{$lang->zanode->confirmReboot}\")==false) return false;'";
|
||||
common::printLink('zanode', 'getVNC', "id={$zanode->id}", "<i class='icon icon-desktop'></i> " . $lang->zanode->getVNC, '_blank', "title='{$lang->zanode->getVNC}' class='btn desktop " . (in_array($zanode->status ,array('running', 'launch', 'wait')) ? '':'disabled') . "'", '');
|
||||
common::printLink('zanode', 'getVNC', "id={$zanode->id}", "<i class='icon icon-remote'></i> " . $lang->zanode->getVNC, in_array($zanode->status ,array('running', 'launch', 'wait')) ? '_blank' : '', "title='{$lang->zanode->getVNC}' class='btn desktop " . (in_array($zanode->status ,array('running', 'launch', 'wait')) ? '':'disabled') . "'", '');
|
||||
|
||||
if($zanode->status == "suspend")
|
||||
{
|
||||
common::printLink('zanode', 'resume', "zanodeID={$zanode->id}", "<i class='icon icon-back'></i> " . $lang->zanode->resumeNode, '', $resumeAttr);
|
||||
common::printLink('zanode', 'resume', "zanodeID={$zanode->id}", "<i class='icon icon-resume'></i> " . $lang->zanode->resumeNode, '', $resumeAttr);
|
||||
}
|
||||
else
|
||||
{
|
||||
common::printLink('zanode', 'suspend', "zanodeID={$zanode->id}", "<i class='icon icon-pause'></i> " . $lang->zanode->suspendNode, '', $suspendAttr);
|
||||
common::printLink('zanode', 'suspend', "zanodeID={$zanode->id}", "<i class='icon icon-moon'></i> " . $lang->zanode->suspendNode, '', $suspendAttr);
|
||||
}
|
||||
|
||||
if($zanode->status == "shutoff")
|
||||
{
|
||||
common::printLink('zanode', 'start', "zanodeID={$zanode->id}", "<i class='icon icon-magic'></i> " . $lang->zanode->bootNode, '', "title='{$lang->zanode->boot}' class='btn '");
|
||||
common::printLink('zanode', 'start', "zanodeID={$zanode->id}", "<i class='icon icon-play'></i> " . $lang->zanode->bootNode, '', "title='{$lang->zanode->boot}' class='btn '");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+357
-10
@@ -15,6 +15,90 @@ class programTest
|
||||
$this->program = $tester->loadModel('program');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get switcher.
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getSwitcherTest($programID = 0)
|
||||
{
|
||||
return $this->program->getSwitcher($programID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get list by search.
|
||||
*
|
||||
* @param string $orderBy
|
||||
* @param int $queryID
|
||||
* @param string $sql
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getListBySearchTest($orderBy = 'id_asc', $queryID = 0, $sql = '')
|
||||
{
|
||||
if(!empty($sql)) $_SESSION['programQuery'] = $sql;
|
||||
|
||||
return $this->program->getListBySearch($orderBy, $queryID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get pairs.
|
||||
*
|
||||
* @param bool $isQueryAll
|
||||
* @param string $orderBy
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getPairsTest($isQueryAll = false, $orderBy = 'id_desc')
|
||||
{
|
||||
return $this->program->getPairs($isQueryAll, $orderBy);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get pairs by id list.
|
||||
*
|
||||
* @param string $programIDList
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getPairsByListTest($programIDList = '')
|
||||
{
|
||||
return $this->program->getPairsByList($programIDList);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get parent pairs.
|
||||
*
|
||||
* @param string $model
|
||||
* @param string $mode
|
||||
* @param bool $showRoot
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getParentPairsTest($model = '', $mode = 'noclosed', $showRoot = true)
|
||||
{
|
||||
return $this->program->getParentPairs($model, $mode, $showRoot);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the product associated with the program.
|
||||
*
|
||||
* @param int $programID
|
||||
* @param string $mode
|
||||
* @param string $status
|
||||
* @param string|array $append
|
||||
* @param int|string $shadow
|
||||
* @param bool $withProgram
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProductPairsTest($programID = 0, $mode = 'assign', $status = 'all', $append = '', $shadow = 0, $withProgram = false)
|
||||
{
|
||||
return $this->program->getProductPairs($programID, $mode, $status, $append, $shadow, $withProgram);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test create program.
|
||||
*
|
||||
@@ -22,7 +106,7 @@ class programTest
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function create($data)
|
||||
public function createTest($data)
|
||||
{
|
||||
$_POST = $data;
|
||||
|
||||
@@ -30,21 +114,34 @@ class programTest
|
||||
|
||||
if(dao::isError()) return array('message' => dao::getError());
|
||||
|
||||
$program = $this->program->getById($programID);
|
||||
$program = $this->program->getByID($programID);
|
||||
|
||||
return $program;
|
||||
}
|
||||
|
||||
/**
|
||||
* createStakeholder
|
||||
* Get parent PM.
|
||||
*
|
||||
* @param int mixed $programID
|
||||
* @param array $programIdList
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getParentPMTest($programIdList)
|
||||
{
|
||||
return $this->program->getParentPM($programIdList);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create stakeholder.
|
||||
*
|
||||
* @param int $programID
|
||||
* @param array $accounts
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function createStakeholder($programID)
|
||||
public function createStakeholderTest($programID, $accounts = array())
|
||||
{
|
||||
$_POST['accounts'] = array('dev1', 'dev2');
|
||||
$_POST['accounts'] = $accounts;
|
||||
$stakeHolder = $this->program->createStakeholder($programID);
|
||||
|
||||
return $this->program->getStakeholdersByPrograms($programID);
|
||||
@@ -60,7 +157,7 @@ class programTest
|
||||
{
|
||||
$programID = $this->program->createDefaultProgram();
|
||||
|
||||
return $programID;
|
||||
return $programID > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -74,7 +171,7 @@ class programTest
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getList($status = 'all', $orderBy = 'id_asc', $pager = NULL, $type = '', $idList = '')
|
||||
public function getListTest($status = 'all', $orderBy = 'id_asc', $pager = NULL, $type = '', $idList = '')
|
||||
{
|
||||
$this->program->cookie->showClosed = 'ture';
|
||||
$programs = $this->program->getList($status, $orderBy, $pager, $type, $idList);
|
||||
@@ -86,14 +183,14 @@ class programTest
|
||||
|
||||
|
||||
/**
|
||||
* update
|
||||
* Test update program.
|
||||
*
|
||||
* @param mixed $proguamID
|
||||
* @param mixed $data
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function update($programID, $data)
|
||||
public function updateTest($programID, $data)
|
||||
{
|
||||
$_POST = $data;
|
||||
$this->program->update($programID);
|
||||
@@ -101,4 +198,254 @@ class programTest
|
||||
|
||||
return $this->program->getByID($programID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get program by id.
|
||||
*
|
||||
* @param int $proguamID
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function getByIDTest($programID)
|
||||
{
|
||||
$program = $this->program->getByID($programID);
|
||||
if(dao::isError()) return array('message' => dao::getError());
|
||||
|
||||
return $program;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get budget left.
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
public function getBudgetLeftTest($programID)
|
||||
{
|
||||
$program = $this->program->getByID($programID);
|
||||
$budget = $this->program->getBudgetLeft($program);
|
||||
|
||||
if(dao::isError()) return array('message' => dao::getError());
|
||||
|
||||
return $budget;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set tree path.
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function setTreePathTest($programID)
|
||||
{
|
||||
$this->program->setTreePath($programID);
|
||||
$program = $this->program->getByID($programID);
|
||||
|
||||
return $program;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get children.
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
public function getChildrenTest($programID)
|
||||
{
|
||||
return $this->program->getChildren($programID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check clickable.
|
||||
*
|
||||
* @param int $programID
|
||||
* @param string $status
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
public function isClickableTest($programID, $status)
|
||||
{
|
||||
return $this->program->isClickable($programID, $status);
|
||||
}
|
||||
|
||||
/**
|
||||
* Has unfinished.
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
public function hasUnfinishedTest($programID)
|
||||
{
|
||||
$program = $this->program->getByID($programID);
|
||||
return $this->program->hasUnfinished($program);
|
||||
}
|
||||
|
||||
/*
|
||||
* get involved programs.
|
||||
*
|
||||
* @param string $account
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getInvolvedProgramsTest($account)
|
||||
{
|
||||
return $this->program->getInvolvedPrograms($account);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get Tree menu.
|
||||
*
|
||||
* @param string $programID
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getTreeMenuTest($programID)
|
||||
{
|
||||
return $this->program->getTreeMenu($programID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get top pairs.
|
||||
*
|
||||
* @param string $model
|
||||
* @param string $mode
|
||||
* @param bool $isQueryAll
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getTopPairsTest($model = '', $mode = '', $isQueryAll = false)
|
||||
{
|
||||
return $this->program->getTopPairs($model, $mode, $isQueryAll);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get kanban group.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getKanbanGroupTest()
|
||||
{
|
||||
return $this->program->getKanbanGroup();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get team member pairs .
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getTeamMemberPairsTest($programID)
|
||||
{
|
||||
return $this->program->getTeamMemberPairs($programID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get project stats.
|
||||
*
|
||||
* @param int $programID
|
||||
* @param string $browseType
|
||||
* @param int $queryID
|
||||
* @param string $orderBy
|
||||
* @param object $pager
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProjectStatsTest($programID = 0, $browseType = 'undone', $queryID = 0, $orderBy = 'id_desc', $pager = null)
|
||||
{
|
||||
return $this->program->getProjectStats($programID, $browseType, $queryID, $orderBy, $pager);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get project list.
|
||||
*
|
||||
* @param int $programID
|
||||
* @param string $browseType
|
||||
* @param int $queryID
|
||||
* @param string $orderBy
|
||||
* @param int $pager
|
||||
* @param int $programTitle
|
||||
* @param int $involved
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProjectListTest($programID = 0, $browseType = 'all', $queryID = 0, $orderBy = 'id_desc', $pager = null, $programTitle = 0, $involved = 0)
|
||||
{
|
||||
return $this->program->getProjectList($programID, $browseType, $queryID, $orderBy, $pager, $programTitle, $involved);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get progress list.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProgressListTest()
|
||||
{
|
||||
return $this->program->getProgressList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get stakeholders.
|
||||
*
|
||||
* @param int $programID
|
||||
* @param string $orderBy
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getStakeholdersTest($programID, $orderBy = 'id_desc')
|
||||
{
|
||||
return $this->program->getStakeholders($programID, $orderBy);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test save state.
|
||||
*
|
||||
* @param int $programID
|
||||
* @param array $programs
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function saveStateTest($programID = 0, $programs = array())
|
||||
{
|
||||
return $this->program->saveState($programID, $programs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test build operate menu.
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function buildOperateMenuTest($programID = 0)
|
||||
{
|
||||
$program = $this->program->getByID($programID);
|
||||
if(empty($program)) return '0';
|
||||
|
||||
return $this->program->buildOperateMenu($program);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test set menu.
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function setMenuTest($programID = 0)
|
||||
{
|
||||
$program = $this->program->getByID($programID);
|
||||
if(empty($program)) return '0';
|
||||
|
||||
$this->program->setMenu($programID);
|
||||
|
||||
global $lang;
|
||||
return strip_tags($lang->switcherMenu);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,9 +14,9 @@ class userTest
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getListTest($count = false)
|
||||
public function getListTest($params = 'nodeleted', $count = false)
|
||||
{
|
||||
$objects = $this->objectModel->getList();
|
||||
$objects = $this->objectModel->getList($params);
|
||||
if(dao::isError())
|
||||
{
|
||||
$error = dao::getError();
|
||||
@@ -32,13 +32,14 @@ class userTest
|
||||
* Test get user information by accounts.
|
||||
*
|
||||
* @param array $accounts
|
||||
* @param string $keyField
|
||||
* @param bool $count
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getListByAccountsTest($accounts = array(), $count = false)
|
||||
public function getListByAccountsTest($accounts = array(), $keyField = 'id', $count = false)
|
||||
{
|
||||
$objects = $this->objectModel->getListByAccounts($accounts);
|
||||
$objects = $this->objectModel->getListByAccounts($accounts, $keyField);
|
||||
if(dao::isError())
|
||||
{
|
||||
$error = dao::getError();
|
||||
@@ -77,12 +78,13 @@ class userTest
|
||||
/**
|
||||
* Test get avatar pairs.
|
||||
*
|
||||
* @param string $params
|
||||
* @access public
|
||||
* @return void
|
||||
* @return array
|
||||
*/
|
||||
public function getAvatarPairsTest()
|
||||
public function getAvatarPairsTest($param = 'nodeleted')
|
||||
{
|
||||
$objects = $this->objectModel->getAvatarPairs();
|
||||
$objects = $this->objectModel->getAvatarPairs($param);
|
||||
if(dao::isError())
|
||||
{
|
||||
$error = dao::getError();
|
||||
@@ -955,4 +957,18 @@ class userTest
|
||||
{
|
||||
return $this->objectModel->processAccountSort($users);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set users list.
|
||||
*
|
||||
* @param array $users
|
||||
* @param string $account
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function setUserListTest($users, $account)
|
||||
{
|
||||
$string = $this->objectModel->setUserList($users, $account);
|
||||
return strpos($string, "<option value='$account' selected='selected'") !== false ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ fields:
|
||||
note: "真实姓名"
|
||||
fields:
|
||||
- field: realname1
|
||||
range: admin,用户,测试{100},开发{100},项目经理{100},产品经理{100},研发主管{100},产品主管{100},测试主管{100},高层管理{100},用户{100},其他{100},A,BB,CCC,非常长非常长的用户名怎么这么长?
|
||||
range: admin,用户{99},测试{100},开发{100},项目经理{100},产品经理{100},研发主管{100},产品主管{100},测试主管{100},高层管理{100},外用户{100},其他{100},A,BB,CCC,非常长非常长的用户名怎么这么长?
|
||||
- field: realname2
|
||||
range: [],1-99,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,[]{4}
|
||||
- field: nickname
|
||||
|
||||
@@ -119,6 +119,3 @@ $builder->job = array('rows' => 2, 'extends' => array('job'));
|
||||
$builder->mr = array('rows' => 1, 'extends' => array('mr'));
|
||||
$builder->oauth = array('rows' => 100, 'extends' => array('oauth'));
|
||||
$builder->notify = array('rows' => 10, 'extends' => array('notify'));
|
||||
|
||||
$builder->vm = array('rows' => 1, 'extends' => array('vm'));
|
||||
$builder->host = array('rows' => 1, 'extends' => array('host'));
|
||||
|
||||
@@ -52,7 +52,6 @@ class Processor
|
||||
$this->initTest();
|
||||
$this->initTodo();
|
||||
$this->initSonPlan();
|
||||
$this->initBassicSql();
|
||||
|
||||
$this->dao->commit();
|
||||
}
|
||||
@@ -298,7 +297,6 @@ class Processor
|
||||
{
|
||||
global $app;
|
||||
$sqlRoot = $app->getAppRoot();
|
||||
$this->dao->exec(file_get_contents($sqlRoot . '/data/zt_config.sql'));
|
||||
$this->dao->exec(file_get_contents($sqlRoot . '/data/zt_block.sql'));
|
||||
$this->dao->exec(file_get_contents($sqlRoot . '/data/zt_lang.sql'));
|
||||
$this->dao->exec(file_get_contents($sqlRoot . '/data/zt_cron.sql'));
|
||||
|
||||
@@ -4,11 +4,11 @@ INSERT INTO `zt_config` (`id`, `vision`, `owner`, `module`, `section`, `key`, `v
|
||||
(2, 'rnd', 'system', 'common', '', 'CRProduct', '1'),
|
||||
(3, 'rnd', 'system', 'common', '', 'CRExecution', '1'),
|
||||
(4, 'rnd', 'system', 'custom', '', 'URSR', '2'),
|
||||
(9, 'rnd', 'system', 'common', 'global', 'mode', 'new'),
|
||||
(9, 'rnd', 'system', 'common', 'global', 'mode', 'ALM'),
|
||||
(6, 'rnd', 'system', 'project', '', 'unitList', 'CNY,USD'),
|
||||
(7, 'rnd', 'system', 'project', '', 'defaultCurrency', 'CNY'),
|
||||
(8, 'rnd', 'system', 'story', '', 'reviewRules', 'allpass'),
|
||||
(10, '', 'system', 'common', 'global', 'version', '17.4'),
|
||||
(10, '', 'system', 'common', 'global', 'version', '18.0'),
|
||||
(11, 'rnd', 'system', 'common', 'global', 'sn', 'c8aa3269e181f2b9258ce96625de1497'),
|
||||
(12, 'rnd', 'system', 'common', 'global', 'flow', 'full'),
|
||||
(13, 'rnd', 'system', 'common', 'safe', 'mode', '1'),
|
||||
|
||||
+1
-1
@@ -259,7 +259,7 @@ function zdImport($table, $yaml, $count = 10)
|
||||
function su($account)
|
||||
{
|
||||
$userModel = new userModel();
|
||||
$user = $userModel->identify($account, '123qwe!@#');
|
||||
$user = $userModel->identify($account, '123Qwe!@#');
|
||||
if($user) return $userModel->login($user);
|
||||
return false;
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
include dirname(__FILE__, 3) . DIRECTORY_SEPARATOR . 'lib/requests/requests.class.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'lib/requests/requests.class.php';
|
||||
/**
|
||||
* The rest class.
|
||||
*
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@
|
||||
|
||||
define('RUNTIME_ROOT', dirname(dirname(__FILE__)) . '/runtime/');
|
||||
define('LIB_ROOT', dirname(dirname(__FILE__)) . '/lib/');
|
||||
define('TEST_BASEHPATH', dirname(__FILE__, 2));
|
||||
define('TEST_BASEHPATH', dirname(dirname(__FILE__)));
|
||||
|
||||
include LIB_ROOT . 'init.php';
|
||||
|
||||
|
||||
@@ -257,19 +257,20 @@ class yaml
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function gen($rows, $version = '')
|
||||
public function gen($rows, $version = '1.0')
|
||||
{
|
||||
$runFileDir = $_SERVER['PWD'];
|
||||
$runFileDir = dirname(getcwd() . DS . $_SERVER['SCRIPT_FILENAME']);
|
||||
$runFileName = str_replace(strrchr($_SERVER['SCRIPT_FILENAME'], "."), "", $_SERVER['SCRIPT_FILENAME']);
|
||||
$runFileName = mb_substr($runFileName, strripos($runFileName, DS) + 1);
|
||||
|
||||
if(!is_dir("$runFileDir/data")) mkdir("$runFileDir/data", 0700);
|
||||
if(!is_dir("$runFileDir/data")) mkdir("$runFileDir/data", 0777, true);
|
||||
$yamlFile = "{$runFileDir}/data/{$this->tableName}_{$runFileName}.yaml";
|
||||
|
||||
$yamlDataArr = array();
|
||||
|
||||
$yamlDataArr['title'] = "zt_{$this->tableName}";
|
||||
$yamlDataArr['author'] = "auto_{$runFileName}";
|
||||
$version ? $yamlDataArr['version'] = $version : $yamlDataArr['version'] = '1.0';
|
||||
$yamlDataArr['title'] = "zt_{$this->tableName}";
|
||||
$yamlDataArr['author'] = "auto_{$runFileName}";
|
||||
$yamlDataArr['version'] = $version;
|
||||
|
||||
if(empty($this->fields->fieldArr))
|
||||
{
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
|
||||
/**
|
||||
|
||||
title=测试 programModel::getStakeholdersByPrograms();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
权限不足跳转 >> html
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('program');
|
||||
ob_start();
|
||||
$tester->program->accessDenied();
|
||||
$result = ob_get_clean();
|
||||
|
||||
r(substr($result, 1, 4)) && p() && e('html'); // 权限不足跳转
|
||||
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
|
||||
$program = zdTable('project');
|
||||
$program->id->range('1,2');
|
||||
$program->name->range('父项目集1,父项目集2');
|
||||
$program->type->range('program');
|
||||
$program->budget->range('900000,899900');
|
||||
$program->path->range('1,2')->prefix(',')->postfix(',');
|
||||
$program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->gen(2);
|
||||
|
||||
su('admin');
|
||||
/**
|
||||
|
||||
title=测试 programModel::buildOperateMenu();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
项目集不存在 >> 0
|
||||
项目集存在 >> div
|
||||
|
||||
*/
|
||||
|
||||
$programTester = new programTest();
|
||||
$menus1 = $programTester->buildOperateMenuTest(0);
|
||||
$menus2 = $programTester->buildOperateMenuTest(1);
|
||||
|
||||
r($menus1) && p() && e('0'); // 项目集不存在
|
||||
r(substr($menus2, 1, 3)) && p() && e('div'); // 项目集存在
|
||||
@@ -2,30 +2,37 @@
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
$db->switchDB();
|
||||
su('admin');
|
||||
|
||||
$program = zdTable('project');
|
||||
$program->id->range('1');
|
||||
$program->name->range('父项目集1');
|
||||
$program->type->range('program');
|
||||
$program->path->range('1')->prefix(',')->postfix(',');
|
||||
$program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->gen(1);
|
||||
|
||||
/**
|
||||
|
||||
title=测试 programModel::create();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
创建新项目集 >> 测试新增项目集一
|
||||
项目集名称为空时 >> 『项目集名称』不能为空。
|
||||
项目集的开始时间为空 >> 『计划开始』不能为空。
|
||||
项目集的完成时间为空 >> 『计划完成』不能为空。
|
||||
项目集的计划完成时间大于计划开始时间 >> 『计划完成』应当大于『2022-01-12』。
|
||||
项目集的完成日期大于父项目集的完成日期(需要实时更新日期) >> 父项目集的开始日期:2022-01-16,开始日期不能小于父项目集的开始日期
|
||||
创建新项目集 >> 测试新增项目集一
|
||||
项目集名称为空时 >> 『项目集名称』不能为空。
|
||||
项目集的开始时间为空 >> 『计划开始』不能为空。
|
||||
项目集的完成时间为空 >> 『计划完成』不能为空。
|
||||
『计划完成』应当大于『2022-01-12』。 >> 『计划完成』应当大于『2022-01-12』。
|
||||
|
||||
*/
|
||||
|
||||
$program = new programTest();
|
||||
$programTester = new programTest();
|
||||
|
||||
$data = array(
|
||||
'parent' => 0,
|
||||
'name' => '测试新增项目集一',
|
||||
'budget' => '',
|
||||
'budget' => '',
|
||||
'budgetUnit' => 'CNY',
|
||||
'begin' => '2022-01-12',
|
||||
'end' => '2022-02-12',
|
||||
@@ -48,15 +55,8 @@ $emptyEndProgram['end'] = '';
|
||||
$beginGtEndProgram = $data;
|
||||
$beginGtEndProgram['end'] = '2022-01-10';
|
||||
|
||||
$moreThanParent = $data;
|
||||
$moreThanParent['parent'] = '1';
|
||||
$moreThanParent['begin'] = '2018-01-01';
|
||||
$moreThanParent['end'] = '2022-02-10';
|
||||
|
||||
r($program->create($normalProgram)) && p('name') && e('测试新增项目集一'); // 创建新项目集
|
||||
r($program->create($emptyNameProgram)) && p('message[name]:0') && e('『项目集名称』不能为空。'); // 项目集名称为空时
|
||||
r($program->create($emptyBeginProgram)) && p('message[begin]:0') && e('『计划开始』不能为空。'); // 项目集的开始时间为空
|
||||
r($program->create($emptyEndProgram)) && p('message[end]:0') && e('『计划完成』不能为空。'); // 项目集的完成时间为空
|
||||
r($program->create($beginGtEndProgram)) && p('message[end]:0') && e('『计划完成』应当大于『2022-01-12』。'); // 项目集的计划完成时间大于计划开始时间
|
||||
r($program->create($moreThanParent)) && p('message:begin;message:end') && e('父项目集的开始日期:2022-01-16,开始日期不能小于父项目集的开始日期'); // 项目集的完成日期大于父项目集的完成日期(需要实时更新日期)
|
||||
$db->restoreDB();
|
||||
r($programTester->createTest($normalProgram)) && p('name') && e('测试新增项目集一'); // 创建新项目集
|
||||
r($programTester->createTest($emptyNameProgram)) && p('message[name]:0') && e('『项目集名称』不能为空。'); // 项目集名称为空时
|
||||
r($programTester->createTest($emptyBeginProgram)) && p('message[begin]:0') && e('『计划开始』不能为空。'); // 项目集的开始时间为空
|
||||
r($programTester->createTest($emptyEndProgram)) && p('message[end]:0') && e('『计划完成』不能为空。'); // 项目集的完成时间为空
|
||||
r($programTester->createTest($beginGtEndProgram)) && p('message[end]:0') && e('『计划完成』应当大于『2022-01-12』。'); // 『计划完成』应当大于『2022-01-12』。
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
$db->switchDB();
|
||||
|
||||
/**
|
||||
|
||||
@@ -10,14 +9,12 @@ title=测试 programModel::createDefaultProgram();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
创建默认项目集并返回ID >> 751
|
||||
创建默认项目集 >> 1
|
||||
|
||||
*/
|
||||
|
||||
$test = new programTest();
|
||||
$programTester = new programTest();
|
||||
|
||||
$result = $test->createDefaultProgramTest();
|
||||
$result = $programTester->createDefaultProgramTest();
|
||||
|
||||
r($result) && p('') && e('751'); // 创建默认项目集并返回ID
|
||||
|
||||
$db->restoreDB();
|
||||
r($result) && p('') && e('1'); // 创建默认项目集
|
||||
|
||||
@@ -2,7 +2,15 @@
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
$db->switchDB();
|
||||
|
||||
$program = zdTable('project');
|
||||
$program->id->range('1');
|
||||
$program->name->range('父项目集1');
|
||||
$program->type->range('program');
|
||||
$program->path->range('1')->prefix(',')->postfix(',');
|
||||
$program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->gen(1);
|
||||
|
||||
/**
|
||||
|
||||
@@ -11,17 +19,14 @@ cid=1
|
||||
pid=1
|
||||
|
||||
创建id=1的项目集的干系人并查看数量。 >> 2
|
||||
创建id=1的项目集的干系人dev1,dev2并查看Account。 >> dev2;dev1
|
||||
创建id=1的项目集的干系人dev1,dev2并查看Account。 >> dev1;dev2
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('program');
|
||||
$programTester = new programTest();
|
||||
|
||||
$_POST['accounts'] = array('dev1', 'dev2');
|
||||
$tester->program->createStakeholder(1);
|
||||
$result = $tester->program->getStakeholdersByPrograms(1);
|
||||
$accounts = array('dev1', 'dev2');
|
||||
$result = $programTester->createStakeholderTest(1, $accounts);
|
||||
|
||||
r(count($result)) && p('') && e('2'); // 创建id=1的项目集的干系人并查看数量。
|
||||
r($result) && p('0:account;1:account') && e('dev2;dev1'); // 创建id=1的项目集的干系人dev1,dev2并查看Account。
|
||||
$db->restoreDB();
|
||||
r($result) && p('0:account;1:account') && e('dev1;dev2'); // 创建id=1的项目集的干系人dev1,dev2并查看Account。
|
||||
|
||||
@@ -1,25 +1,33 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
su('admin');
|
||||
|
||||
$program = zdTable('project');
|
||||
$program->id->range('1,2');
|
||||
$program->name->range('父项目集1,父项目集2');
|
||||
$program->type->range('program');
|
||||
$program->budget->range('900000,899900');
|
||||
$program->path->range('1,2')->prefix(',')->postfix(',');
|
||||
$program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->gen(2);
|
||||
|
||||
/**
|
||||
|
||||
title=测试 programModel::getBudgetLeft();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
查看项目11的所有父项目集的预算剩余 >> 900000
|
||||
查看项目12的所有父项目集的预算剩余 >> 899900
|
||||
查看项目集1的所有父项目集的预算剩余 >> 900000
|
||||
查看项目集2的所有父项目集的预算剩余 >> 899900
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('program');
|
||||
$program1 = $tester->program->getById(11);
|
||||
$program2 = $tester->program->getById(12);
|
||||
$result1 = $tester->program->getBudgetLeft($program1);
|
||||
$result2 = $tester->program->getBudgetLeft($program2);
|
||||
$programTester = new programTest();
|
||||
$result1 = $programTester->getBudgetLeftTest(1);
|
||||
$result2 = $programTester->getBudgetLeftTest(2);
|
||||
|
||||
r($result) && p() && e('900000'); // 查看项目11的所有父项目集的预算剩余
|
||||
r($result) && p() && e('899900'); // 查看项目12的所有父项目集的预算剩余
|
||||
r($result1) && p() && e('900000'); // 查看项目集1的所有父项目集的预算剩余
|
||||
r($result2) && p() && e('899900'); // 查看项目集2的所有父项目集的预算剩余
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试 programModel::getBudgetUnitList();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
获取货币类型列表 >> 人民币;美元
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('project');
|
||||
|
||||
r($tester->loadModel('program')->getBudgetUnitList()) && p('CNY;USD') && e('人民币;美元'); //获取货币类型列表
|
||||
@@ -1,6 +1,17 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
su('admin');
|
||||
|
||||
$program = zdTable('project');
|
||||
$program->id->range('1-10');
|
||||
$program->type->range('program');
|
||||
$program->name->setFields(array(
|
||||
array('field' => 'name1', 'range' => '项目集'),
|
||||
array('field' => 'name2', 'range' => '1-10')
|
||||
));
|
||||
$program->gen(5);
|
||||
|
||||
/**
|
||||
|
||||
@@ -10,13 +21,16 @@ pid=1
|
||||
|
||||
通过id字段获取id=1的项目集并验证它的name。 >> 项目集1
|
||||
通过id字段获取id=1000的项目集,返回空 >> 0
|
||||
通过id字段获取id=0的项目集,返回空 >> 0
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('program');
|
||||
$program1 = $tester->program->getById(1);
|
||||
$program2 = $tester->program->getById(1000);
|
||||
$programTester = new programTest();
|
||||
|
||||
$program1 = $programTester->getByIDTest(1);
|
||||
$program2 = $programTester->getByIDTest(1000);
|
||||
$program3 = $programTester->getByIDTest(0);
|
||||
|
||||
r($program1) && p('name') && e('项目集1'); // 通过id字段获取id=1的项目集并验证它的name。
|
||||
r($program2) && p() && e('0'); // 通过id字段获取id=1000的项目集,返回空
|
||||
r($program2) && p() && e('0'); // 通过id字段获取id=1000的项目集,返回空
|
||||
r($program3) && p() && e('0'); // 通过id字段获取id=0的项目集,返回空
|
||||
|
||||
@@ -1,23 +1,30 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
su('admin');
|
||||
|
||||
$program = zdTable('project');
|
||||
$program->id->range('1-3');
|
||||
$program->name->range('父项目集1,子项目集1,子项目集2');
|
||||
$program->parent->range('0,1,1');
|
||||
$program->grade->range('1,2,2');
|
||||
$program->type->range('program');
|
||||
$program->path->range('`,1,`,`,1,2,`,`,1,3,`');
|
||||
$program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->gen(3);
|
||||
|
||||
/**
|
||||
|
||||
title=测试 programModel:: getChildren();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
通过id查找id=1的子项目集个数 >> 9
|
||||
通过id查找id=22的子项目集个数 >> 7
|
||||
通过id查找id=221的子项目集个数 >> 0
|
||||
通过id查找id=1的子项目集个数 >> 2
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('program');
|
||||
$programTester = new programTest();
|
||||
|
||||
r($tester->program->getChildren(1)) && p() && e('9'); // 通过id查找id=1的子项目集个数
|
||||
r($tester->program->getChildren(22)) && p() && e('7'); // 通过id查找id=22的子项目集个数
|
||||
r($tester->program->getChildren(221)) && p() && e('0'); // 通过id查找id=221的子项目集个数
|
||||
r($programTester->getChildrenTest(1)) && p() && e('2'); // 通过id查找id=1的子项目集个数
|
||||
|
||||
@@ -1,8 +1,20 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
su('admin');
|
||||
|
||||
$program = zdTable('project');
|
||||
$program->id->range('1-3');
|
||||
$program->name->range('1-3')->prefix('项目集');
|
||||
$program->type->range('program');
|
||||
$program->path->range('1-3')->prefix(',')->postfix(',');
|
||||
$program->grade->range('1');
|
||||
$program->openedBy->range('admin,test1');
|
||||
$program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->gen(3);
|
||||
|
||||
/**
|
||||
|
||||
title=测试 programModel::getInvolvedPrograms();
|
||||
@@ -10,18 +22,17 @@ cid=1
|
||||
pid=1
|
||||
|
||||
获取admin参与的项目集数量 >> 2
|
||||
获取test2参与的项目集数量 >> 1
|
||||
获取admin参与的项目集ID >> 10
|
||||
获取test2参与的项目集ID >> 1
|
||||
获取test1参与的项目集数量 >> 1
|
||||
获取admin参与的项目集ID >> 1
|
||||
获取test1参与的项目集ID >> 2
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('program');
|
||||
$adminPrograms = $tester->program->getInvolvedPrograms('admin');
|
||||
$test2Programs = $tester->program->getInvolvedPrograms('test2');
|
||||
$programTester = new programTest();
|
||||
$adminPrograms = $programTester->getInvolvedProgramsTest('admin');
|
||||
$test1Programs = $programTester->getInvolvedProgramsTest('test1');
|
||||
|
||||
r(count($adminPrograms)) && p() && e('2'); // 获取admin参与的项目集数量
|
||||
r(count($test2Programs)) && p() && e('1'); // 获取test2参与的项目集数量
|
||||
r($adminPrograms) && p('10') && e('10'); // 获取admin参与的项目集ID
|
||||
r($test2Programs) && p('1') && e('1'); // 获取test2参与的项目集ID
|
||||
r(count($adminPrograms)) && p() && e('2'); // 获取admin参与的项目集数量
|
||||
r(count($test1Programs)) && p() && e('1'); // 获取test1参与的项目集数量
|
||||
r($adminPrograms) && p('1') && e('1'); // 获取admin参与的项目集ID
|
||||
r($test1Programs) && p('2') && e('2'); // 获取test1参与的项目集ID
|
||||
|
||||
@@ -1,8 +1,21 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
su('admin');
|
||||
|
||||
$program = zdTable('project');
|
||||
$program->id->range('1-3');
|
||||
$program->name->range('1-3')->prefix('项目集');
|
||||
$program->type->range('program');
|
||||
$program->path->range('1-3')->prefix(',')->postfix(',');
|
||||
$program->grade->range('1');
|
||||
$program->status->range('wait');
|
||||
$program->openedBy->range('admin,test1');
|
||||
$program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->gen(3);
|
||||
|
||||
/**
|
||||
|
||||
title=测试 programModel::getKanbanGroup();
|
||||
@@ -10,16 +23,15 @@ cid=1
|
||||
pid=1
|
||||
|
||||
查看当前用户负责的项目集看板数量 >> 2
|
||||
查看当前用户其他的项目集看板数量 >> 8
|
||||
查看当前用户其他的项目集看板数量 >> 1
|
||||
查看当前用户其他的项目集看板详情 >> 项目集2
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('program');
|
||||
$programTester = new programTest();
|
||||
|
||||
$kanbanGroup = $tester->program->getKanbanGroup();
|
||||
$kanbanGroup = $programTester->getKanbanGroupTest();
|
||||
|
||||
r(count($kanbanGroup['my'])) && p('') && e('2'); //查看当前用户负责的项目集看板数量
|
||||
r(count($kanbanGroup['others'])) && p('') && e('8'); //查看当前用户其他的项目集看板数量
|
||||
r($kanbanGroup['others']) && p('0:name') && e('项目集2'); //查看当前用户其他的项目集看板详情
|
||||
r(count($kanbanGroup['others'])) && p('') && e('1'); //查看当前用户其他的项目集看板数量
|
||||
r($kanbanGroup['others']) && p('0:name') && e('项目集2'); //查看当前用户其他的项目集看板详情
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
|
||||
/**
|
||||
|
||||
title=测试 programModel::getLink();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
项目集页面跳转项目集项目列表 >> project
|
||||
非项目集页面跳转项目集列表 >> all
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('program');
|
||||
$link1 = $tester->program->getLink('program', 'project', 1);
|
||||
$result = '';
|
||||
if(strpos($link1, 'project')) $result = 'project';
|
||||
r($result) && p() && e('project'); // 项目集页面跳转项目集项目列表
|
||||
|
||||
$link2 = $tester->program->getLink('program', 'project', 1, '', 'product');
|
||||
if(strpos($link2, 'all')) $result = 'all';
|
||||
r($result) && p() && e('all'); // 非项目集页面跳转项目集列表
|
||||
@@ -4,45 +4,57 @@ include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
su('admin');
|
||||
|
||||
$program = zdTable('project');
|
||||
$program->id->range('1-20');
|
||||
$program->name->range('1-20')->prefix('项目集');
|
||||
$program->type->range('program');
|
||||
$program->path->range('1-20')->prefix(',')->postfix(',');
|
||||
$program->grade->range('1');
|
||||
$program->status->range('wait,doing,suspended,closed');
|
||||
$program->openedBy->range('admin,test1');
|
||||
$program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->gen(20);
|
||||
|
||||
/**
|
||||
|
||||
title=测试 programModel::getList();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
查看所有项目和项目集的个数 >> 120
|
||||
查看所有项目和项目集的个数 >> 20
|
||||
查看分页后项目集和项目的个数 >> 10
|
||||
查看所有'closed'的项目和项目集的个数 >> 11
|
||||
查看所有'suspended'的项目和项目集的个数 >> 11
|
||||
查看所有'closed'的项目和项目集的个数 >> 5
|
||||
查看所有'suspended'的项目和项目集的个数 >> 5
|
||||
按照项目和项目集名称倒序获取第一个ID >> 9
|
||||
按照ID正序获取项目和项目集列表第一个ID >> 1
|
||||
获取顶级项目集个数 >> 30
|
||||
获取顶级项目集个数 >> 20
|
||||
获取分页后顶级项目集个数 >> 10
|
||||
获取分页后顶级项目集个数 >> 120
|
||||
获取所有项目集个数 >> 20
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$program = new programTest();
|
||||
$programTester = new programTest();
|
||||
$tester->app->loadClass('pager', $static = true);
|
||||
$pager = new pager(0, 10, 1);
|
||||
|
||||
$allPorgrams = $program->getList('all');
|
||||
$pagerPrograms = $program->getList('all', 'id_asc', $pager);
|
||||
$closedPrograms = $program->getList('closed');
|
||||
$suspendedPrograms = $program->getList('closed');
|
||||
$namedescPrograms = $program->getList('all', 'name_desc');
|
||||
$idascPrograms = $program->getList('all', 'id_asc');
|
||||
$topPrograms = $program->getList('all', 'id_asc', null, 'top');
|
||||
$topPagePrograms = $program->getList('all', 'id_asc', $pager, 'top');
|
||||
$childPrograms = $program->getList('all', 'id_asc', null, 'child', $topPrograms);
|
||||
$allPorgrams = $programTester->getListTest('all');
|
||||
$pagerPrograms = $programTester->getListTest('all', 'id_asc', $pager);
|
||||
$closedPrograms = $programTester->getListTest('closed');
|
||||
$suspendedPrograms = $programTester->getListTest('closed');
|
||||
$namedescPrograms = $programTester->getListTest('all', 'name_desc');
|
||||
$idascPrograms = $programTester->getListTest('all', 'id_asc');
|
||||
$topPrograms = $programTester->getListTest('all', 'id_asc', null, 'top');
|
||||
$topPagePrograms = $programTester->getListTest('all', 'id_asc', $pager, 'top');
|
||||
$childPrograms = $programTester->getListTest('all', 'id_asc', null, 'child', $topPrograms);
|
||||
|
||||
r(count($allPorgrams)) && p() && e('120'); // 查看所有项目和项目集的个数
|
||||
r(count($pagerPrograms)) && p() && e('10'); // 查看分页后项目集和项目的个数
|
||||
r(count($closedPrograms)) && p() && e('11'); // 查看所有'closed'的项目和项目集的个数
|
||||
r(count($suspendedPrograms)) && p() && e('11'); // 查看所有'suspended'的项目和项目集的个数
|
||||
r(key($namedescPrograms)) && p() && e('9'); // 按照项目和项目集名称倒序获取第一个ID
|
||||
r(key($idascPrograms)) && p() && e('1'); // 按照ID正序获取项目和项目集列表第一个ID
|
||||
r(count($topPrograms)) && p() && e('30'); // 获取顶级项目集个数
|
||||
r(count($topPagePrograms)) && p() && e('10'); // 获取分页后顶级项目集个数
|
||||
r(count($childPrograms)) && p() && e('120'); // 获取分页后顶级项目集个数
|
||||
r(count($allPorgrams)) && p() && e('20'); // 查看所有项目和项目集的个数
|
||||
r(count($pagerPrograms)) && p() && e('10'); // 查看分页后项目集和项目的个数
|
||||
r(count($closedPrograms)) && p() && e('5'); // 查看所有'closed'的项目和项目集的个数
|
||||
r(count($suspendedPrograms)) && p() && e('5'); // 查看所有'suspended'的项目和项目集的个数
|
||||
r(key($namedescPrograms)) && p() && e('9'); // 按照项目和项目集名称倒序获取第一个ID
|
||||
r(key($idascPrograms)) && p() && e('1'); // 按照ID正序获取项目和项目集列表第一个ID
|
||||
r(count($topPrograms)) && p() && e('20'); // 获取顶级项目集个数
|
||||
r(count($topPagePrograms)) && p() && e('10'); // 获取分页后顶级项目集个数
|
||||
r(count($childPrograms)) && p() && e('20'); // 获取所有项目集个数
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
zdTable('user')->gen(5);
|
||||
su('admin');
|
||||
|
||||
$program = zdTable('project');
|
||||
$program->id->range('1-20');
|
||||
$program->name->range('1-20')->prefix('项目集');
|
||||
$program->type->range('program');
|
||||
$program->path->range('1-20')->prefix(',')->postfix(',');
|
||||
$program->grade->range('1');
|
||||
$program->status->range('wait,doing,suspended,closed');
|
||||
$program->openedBy->range('admin,user1');
|
||||
$program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->gen(20);
|
||||
|
||||
$query = zdTable('userquery');
|
||||
$query->id->range('1');
|
||||
$query->account->range('admin');
|
||||
$query->module->range('program');
|
||||
$query->title->range('搜索条件1');
|
||||
$query->form->range('`a:41:{s:9:"fieldname";s:0:"";s:11:"fieldstatus";s:0:"";s:9:"fielddesc";s:0:"";s:7:"fieldPM";s:0:"";s:15:"fieldopenedDate";s:0:"";s:10:"fieldbegin";s:0:"";s:8:"fieldend";s:0:"";s:13:"fieldopenedBy";s:0:"";s:19:"fieldlastEditedDate";s:0:"";s:14:"fieldrealBegan";s:0:"";s:12:"fieldrealEnd";s:0:"";s:15:"fieldclosedDate";s:0:"";s:6:"andOr1";s:3:"AND";s:6:"field1";s:4:"name";s:9:"operator1";s:7:"include";s:6:"value1";s:9:"项目集";s:6:"andOr2";s:3:"and";s:6:"field2";s:6:"status";s:9:"operator2";s:1:"=";s:6:"value2";s:0:"";s:6:"andOr3";s:3:"and";s:6:"field3";s:4:"desc";s:9:"operator3";s:7:"include";s:6:"value3";s:0:"";s:10:"groupAndOr";s:3:"and";s:6:"andOr4";s:3:"AND";s:6:"field4";s:6:"status";s:9:"operator4";s:1:"=";s:6:"value4";s:4:"wait";s:6:"andOr5";s:3:"and";s:6:"field5";s:10:"openedDate";s:9:"operator5";s:1:"=";s:6:"value5";s:0:"";s:6:"andOr6";s:3:"and";s:6:"field6";s:5:"begin";s:9:"operator6";s:1:"=";s:6:"value6";s:0:"";s:6:"module";s:7:"program";s:9:"actionURL";s:56:"/program-browse-bySearch-order_asc-0-10-1-myQueryID.html";s:10:"groupItems";s:1:"3";s:8:"formType";s:4:"lite";}`');
|
||||
$query->sql->range("`(( 1 AND `name` LIKE '%项目集%' ) AND ( 1 AND `status` = 'wait' ))`");
|
||||
$query->gen(1);
|
||||
|
||||
/**
|
||||
|
||||
title=测试 programModel::getListBySearch();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
按照id倒序查看,所有名称包含项目集并且未开始的第一个项目集 >> 项目集17
|
||||
按照id正序查看,所有名称包含项目集并且进行中的第一个项目集 >> 项目集1
|
||||
按照id正序查看,符合搜索条件id=1,的第一个项目集 >> 项目集1
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$programTester = new programTest();
|
||||
|
||||
$sql1 = "(( 1 AND `name` LIKE '%项目集%' ) AND ( 1 AND `status` = 'wait' ))";
|
||||
$sql2 = "(( 1 AND `name` LIKE '%项目集%' ) AND ( 1 AND `status` = 'doing' ))";
|
||||
|
||||
r($programTester->getListBySearchTest('id_desc', 0, $sql)) && p('17:name') && e('项目集17'); // 按照id倒序查看,所有名称包含项目集并且未开始的第一个项目集
|
||||
r($programTester->getListBySearchTest('id_asc', 0, $sql)) && p('1:name') && e('项目集1'); // 按照id正序查看,所有名称包含项目集并且进行中的第一个项目集
|
||||
r($programTester->getListBySearchTest('id_asc', 1)) && p('1:name') && e('项目集1'); // 按照id正序查看,符合搜索条件id=1,的第一个项目集
|
||||
@@ -1,6 +1,21 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/program.class.php';
|
||||
su('admin');
|
||||
|
||||
$program = zdTable('project');
|
||||
$program->id->range('1-20');
|
||||
$program->name->range('1-20')->prefix('项目集');
|
||||
$program->type->range('program');
|
||||
$program->path->range('1-20')->prefix(',')->postfix(',');
|
||||
$program->grade->range('1');
|
||||
$program->status->range('wait,doing,suspended,closed');
|
||||
$program->openedBy->range('admin,test1');
|
||||
$program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD');
|
||||
$program->deleted->range('0{15},1{5}');
|
||||
$program->gen(20);
|
||||
|
||||
/**
|
||||
|
||||
@@ -8,18 +23,18 @@ title=测试 programModel::getPairs();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
获取项目集个数 >> 6
|
||||
获取项目集个数 >> 10
|
||||
获取项目集id为9的名称 >> 项目集9
|
||||
获取项目集个数 >> 15
|
||||
获取所有项目集个数 >> 15
|
||||
获取按照id正序的第一个项目集名称 >> 项目集1
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('program');
|
||||
$programs1 = $tester->program->getPairs();
|
||||
$programs2 = $tester->program->getPairs('true');
|
||||
$programTester = new programTest();
|
||||
|
||||
r(count($programs1)) && p() && e('6'); // 获取项目集个数
|
||||
r(count($programs2)) && p() && e('10'); // 获取项目集个数
|
||||
r($programs1) && p('9') && e('项目集9'); // 获取项目集id为9的名称
|
||||
r($programs2) && p('11') && e(''); // 获取不存在的项目集
|
||||
$programs1 = $programTester->getPairsTest();
|
||||
$programs2 = $programTester->getPairsTest('true');
|
||||
$programs3 = $programTester->getPairsTest('false', 'id_asc');
|
||||
|
||||
r(count($programs1)) && p() && e('15'); // 获取项目集个数
|
||||
r(count($programs2)) && p() && e('15'); // 获取所有项目集个数
|
||||
r(current($programs3)) && p('1') && e('项目集1'); // 获取按照id正序的第一个项目集名称
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user