Merge branch 'master' into zenops_46
This commit is contained in:
+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
File diff suppressed because one or more lines are too long
+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
+1
-1
File diff suppressed because one or more lines are too long
@@ -120,6 +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, ',')) 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;}
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
.kanban-header-col > .title > .text {max-width: 110px !important;}
|
||||
.kanban-header-col > .title > .storyColumn .text {font-weight: 700; color:rgb(51, 51, 51);}
|
||||
.kanban-header-col > .title > .storyColumn + .dropdown-menu {top: 45px; left: auto;}
|
||||
.kanban-header-sub-cols .kanban-header-col > .title .text {max-width: calc(100% - 130px) !important;}
|
||||
|
||||
#kanbanContainer {margin: 0;}
|
||||
#kanbanContainer > .panel-body {overflow: auto;}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
.region .region-actions {float: right; position: relative; top: -6px; right: -6px;}
|
||||
.region .region-header .icon-double-angle-up,.icon-double-angle-down {cursor: pointer;}
|
||||
.region .kanban-header-sub-cols {margin-left: -2px;}
|
||||
.region .kanban-header-sub-cols .kanban-header-col > .title {max-width: 100% !important;min-width:240px;}
|
||||
.region .kanban-header-sub-cols .kanban-header-col > .title {max-width: 100% !important;min-width:200px;}
|
||||
.region .sort .region-header {cursor: move;}
|
||||
.region .kanban.kanban-dragging {overflow: hidden;}
|
||||
|
||||
@@ -156,6 +156,7 @@
|
||||
.region .kanban-board .kanban-header-sub-cols .kanban-header-col > .title > span {max-width: calc(100% - 165px) !important;}
|
||||
.region .kanban-board .kanban-header-sub-cols .kanban-header-col.left > .title > span {max-width: calc(100% - 120px) !important;}
|
||||
.executionName .delayed {margin-right: 10px;}
|
||||
.region .kanban-board .kanban-header-sub-cols .kanban-header-col > .title > .text {max-width: calc(100% - 172px) !important;}
|
||||
|
||||
#kanbanBox {position: relative;}
|
||||
#regionTabs {background-color: #efefef; z-index: 100; display: flex; align-items: center; gap: 1.5rem; justify-content: space-between;}
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[Full Feature Interface]</span> and daily office affairs in <span style='color: #0c60e1'>[Operation Management Interface]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['18.0'] = '2023-01-03';
|
||||
$lang->misc->releaseDate['18.0.beta3'] = '2022-12-26';
|
||||
$lang->misc->releaseDate['18.0.beta2'] = '2022-12-14';
|
||||
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
|
||||
@@ -195,6 +196,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['18.0'][] = array('title' => "Automated test solutions are proposed. Work order related functions are added to the Operation Management Interface. Approval workflow support for adding all types of notifications. And at the same time, we have further improved the earned value calculation rules.", 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta3'][] = array('title' => "The module Statistic is upgraded to BI, with 5 built-in large screens of macro management dimensions.", 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta2'][] = array('title' => "We have optimized the product with multi-branches/multi-platforms. It's supported to create siblings stories. It's possible for Plan, Build, and Release to link requirements or bugs beyond their parent branch. ZenTao Client has implemented the robot chatting mechanism.", 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta1'][] = array('title' => "Multiple core processes in ZenTao are improved: A project without any product linked in is able to be created, as well as creating projects without sprints/iterations linked in; projects are able to link products beyond the father program; switch easily between ZenTao Lite mode and Full Lifecycle Management mode.", 'desc' => '');
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[Full Feature Interface]</span> and daily office affairs in <span style='color: #0c60e1'>[Operation Management Interface]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['18.0'] = '2023-01-03';
|
||||
$lang->misc->releaseDate['18.0.beta3'] = '2022-12-26';
|
||||
$lang->misc->releaseDate['18.0.beta2'] = '2022-12-14';
|
||||
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
|
||||
@@ -195,6 +196,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['18.0'][] = array('title' => "Automated test solutions are proposed. Work order related functions are added to the Operation Management Interface. Approval workflow support for adding all types of notifications. And at the same time, we have further improved the earned value calculation rules.", 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta3'][] = array('title' => "The module Statistic is upgraded to BI, with 5 built-in large screens of macro management dimensions.", 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta2'][] = array('title' => "We have optimized the product with multi-branches/multi-platforms. It's supported to create siblings stories. It's possible for Plan, Build, and Release to link requirements or bugs beyond their parent branch. ZenTao Client has implemented the robot chatting mechanism.", 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta1'][] = array('title' => "Multiple core processes in ZenTao are improved: A project without any product linked in is able to be created, as well as creating projects without sprints/iterations linked in; projects are able to link products beyond the father program; switch easily between ZenTao Lite mode and Full Lifecycle Management mode.", 'desc' => '');
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R&D affairs in <span style='color: #0c60e1'>[Full Feature Interface]</span> and daily office affairs in <span style='color: #0c60e1'>[Operation Management Interface]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['18.0'] = '2023-01-03';
|
||||
$lang->misc->releaseDate['18.0.beta3'] = '2022-12-26';
|
||||
$lang->misc->releaseDate['18.0.beta2'] = '2022-12-14';
|
||||
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
|
||||
@@ -195,6 +196,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['18.0'][] = array('title' => "Automated test solutions are proposed. Work order related functions are added to the Operation Management Interface. Approval workflow support for adding all types of notifications. And at the same time, we have further improved the earned value calculation rules.", 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta3'][] = array('title' => "The module Statistic is upgraded to BI, with 5 built-in large screens of macro management dimensions.", 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta2'][] = array('title' => "We have optimized the product with multi-branches/multi-platforms. It's supported to create siblings stories. It's possible for Plan, Build, and Release to link requirements or bugs beyond their parent branch. ZenTao Client has implemented the robot chatting mechanism.", 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta1'][] = array('title' => "Multiple core processes in ZenTao are improved: A project without any product linked in is able to be created, as well as creating projects without sprints/iterations linked in; projects are able to link products beyond the father program; switch easily between ZenTao Lite mode and Full Lifecycle Management mode.", 'desc' => '');
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = "<p>禅道15系列上线了全新的“
|
||||
$lang->misc->feature->visionsDesc = "<p>从16.5开始增加了界面概念,用户可以在<span style='color:#0c60e1'>[研发综合界面]</span>中处理研发事务、在<span style='color:#0c60e1'>[运营管理界面]</span>处理日常办公事务。</p><p>在头像右侧即可查看当前所处界面,点击当前界面名称可查看和切换其他的界面。</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions.png';
|
||||
|
||||
$lang->misc->releaseDate['18.0'] = '2023-01-03';
|
||||
$lang->misc->releaseDate['18.0.beta3'] = '2022-12-26';
|
||||
$lang->misc->releaseDate['18.0.beta2'] = '2022-12-14';
|
||||
$lang->misc->releaseDate['18.0.beta1'] = '2022-11-16';
|
||||
@@ -195,6 +196,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['18.0'][] = array('title' => '推出自动化测试解决方案;运营管理界面增加工单功能;审批流支持增加所有类型的通知以及挣值计算规则完善。', 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta3'][] = array('title' => '统计模块升级为BI,内置5张宏观管理维度大屏。', 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta2'][] = array('title' => '优化多分支/多平台产品,支持创建孪生需求,计划、版本、发布支持跨分支关联需求和bug,并且禅道客户端实现了机器人会话机制。', 'desc' => '');
|
||||
$lang->misc->feature->all['18.0.beta1'][] = array('title' => '主要对禅道多项核心流程进行改进,新增项目型项目、无迭代项目;支持项目跨项目集关联产品;支持轻量管理模式和全生命周期管理模式进行切换。', 'desc' => '');
|
||||
|
||||
@@ -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;?>
|
||||
|
||||
@@ -425,6 +425,11 @@ class repo extends control
|
||||
if($this->get->repoPath) $entry = $this->get->repoPath;
|
||||
$this->repo->setBackSession('view', $withOtherModule = true);
|
||||
if($repoID == 0) $repoID = $this->session->repoID;
|
||||
if($revision != 'HEAD')
|
||||
{
|
||||
setCookie("repoBranch", $revision, $this->config->cookieLife, $this->config->webRoot, '', false, true);
|
||||
$this->cookie->set('repoBranch', $revision);
|
||||
}
|
||||
|
||||
$this->commonAction($repoID, $objectID);
|
||||
if($browser['name'] != 'ie') return print($this->fetch('repo', 'monaco', "repoID=$repoID&objectID=$objectID&entry=$entry&revision=$revision&showBug=$showBug&encoding=$encoding"));
|
||||
|
||||
@@ -374,7 +374,7 @@ class screenModel extends model
|
||||
|
||||
if($settings->value->type === 'value')
|
||||
{
|
||||
$value = $results[0]->$field;
|
||||
$value = empty($results[0]) ? 0 : $results[0]->$field;
|
||||
}
|
||||
if($settings->value->agg === 'count')
|
||||
{
|
||||
@@ -829,6 +829,9 @@ class screenModel extends model
|
||||
{
|
||||
$execution = $this->execution->getByID($executionID);
|
||||
|
||||
/* Splice project name for the execution name. */
|
||||
$execution->name = $this->loadModel('project')->getByID($execution->project)->name . '--' . $execution->name;
|
||||
|
||||
/* Get date list. */
|
||||
if(((strpos('closed,suspended', $execution->status) === false and helper::today() > $execution->end)
|
||||
or ($execution->status == 'closed' and substr($execution->closedDate, 0, 10) > $execution->end)
|
||||
|
||||
@@ -35,7 +35,8 @@ function initBurnChar()
|
||||
title: {
|
||||
text: execution.name,
|
||||
textStyle: {
|
||||
color: '#a1c4e9'
|
||||
color: '#a1c4e9',
|
||||
fontSize: 15
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
|
||||
+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)
|
||||
|
||||
@@ -486,7 +486,7 @@
|
||||
}
|
||||
foreach($story->executions as $executionID => $execution)
|
||||
{
|
||||
if(isset($story->tasks[$executionID])) continue;
|
||||
if(!isset($executions[$executionID]) or 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>';
|
||||
}
|
||||
|
||||
@@ -166,6 +166,8 @@ class tutorialModel extends model
|
||||
$project->displayCards = 0;
|
||||
$project->fluidBoard = 0;
|
||||
$project->deleted = '0';
|
||||
$project->hasProduct = '';
|
||||
$project->multiple = '';
|
||||
|
||||
return $project;
|
||||
}
|
||||
@@ -204,6 +206,31 @@ 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 = '';
|
||||
|
||||
if($browseType and $browseType != 'all') $execution->name .= '-' . $browseType; // Fix bug #21096
|
||||
|
||||
$executionStat[$execution->id] = $execution;
|
||||
return $executionStat;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tutorial stories.
|
||||
*
|
||||
@@ -320,6 +347,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');
|
||||
|
||||
|
||||
@@ -80,8 +80,14 @@ class weekly extends control
|
||||
->where('deleted')->eq(0)
|
||||
->andWhere('type')->eq('project')
|
||||
->fetchPairs();
|
||||
$date = helper::today();
|
||||
|
||||
foreach($projects as $projectID => $project) $this->weekly->save($projectID, $date);
|
||||
$date = helper::today();
|
||||
$weekStart = $this->weekly->getThisMonday($date);
|
||||
|
||||
foreach($projects as $projectID => $project)
|
||||
{
|
||||
$this->dao->delete()->from(TABLE_WEEKLYREPORT)->where('project')->eq($projectID)->andWhere('weekStart')->eq($weekStart)->exec();
|
||||
$this->weekly->save($projectID, $date);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,4 +101,19 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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'));
|
||||
|
||||
@@ -8,7 +8,7 @@ INSERT INTO `zt_config` (`id`, `vision`, `owner`, `module`, `section`, `key`, `v
|
||||
(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
@@ -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';
|
||||
|
||||
|
||||
@@ -259,10 +259,11 @@ class yaml
|
||||
*/
|
||||
public function gen($rows, $version = '')
|
||||
{
|
||||
$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();
|
||||
|
||||
@@ -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的项目集,返回空
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 186 KiB |
@@ -1,7 +1,8 @@
|
||||
<?php
|
||||
$lang->user->tokenInvalid = "Token 认证失败,请尝试使用密码登录。";
|
||||
|
||||
if(strpos($_SERVER['HTTP_USER_AGENT'], 'xuanxuan') != false)
|
||||
/* When zentaourl?mode=getconfig is called, the $_SERVER does not have HTTP_USER_AGENT. */
|
||||
if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'xuanxuan') != false)
|
||||
{
|
||||
$lang->user->errorDeny = "抱歉,您无权访问『<b>%s</b>』模块的『<b>%s</b>』功能。请联系管理员获取权限。";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user