This commit is contained in:
Yagami
2023-02-22 11:23:08 +08:00
32 changed files with 79 additions and 18 deletions
+3
View File
@@ -25,3 +25,6 @@ ALTER table `zt_reviewcl` ADD `type` varchar(255) NOT NULL DEFAULT '' AFTER `cat
UPDATE `zt_reviewcl` SET `type` = 'waterfall' WHERE `type` = '';
UPDATE `zt_activity` SET `order` = `id` * 5 WHERE `order` = '0';
ALTER table `zt_cmcl` ADD `projectType` varchar(255) NOT NULL DEFAULT '' AFTER `type`;
UPDATE `zt_cmcl` SET `projectType` = 'waterfall' WHERE `projectType` = '';
+1
View File
@@ -9780,6 +9780,7 @@ CREATE TABLE IF NOT EXISTS `zt_reviewlist` (
CREATE TABLE IF NOT EXISTS `zt_cmcl` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`type` char(30) NOT NULL,
`projectType` varchar(255) NOT NULL,
`title` int(11) NOT NULL,
`contents` text NOT NULL,
`assignedTo` varchar(30) NOT NULL,
+6 -6
View File
@@ -339,12 +339,12 @@ class helper extends baseHelper
$dateInterval->hour = $interval->format('%H');
$dateInterval->minute = $interval->format('%i');
$dateInterval->secound = $interval->format('%s');
$dateInterval->year = ltrim($dateInterval->year, '0');
$dateInterval->month = ltrim($dateInterval->month, '0');
$dateInterval->day = ltrim($dateInterval->day, '0');
$dateInterval->hour = ltrim($dateInterval->hour, '0');
$dateInterval->minute = ltrim($dateInterval->minute, '0');
$dateInterval->secound = ltrim($dateInterval->secound, '0');
$dateInterval->year = $dateInterval->year == '00' ? 0 : ltrim($dateInterval->year, '0');
$dateInterval->month = $dateInterval->month == '00' ? 0 : ltrim($dateInterval->month, '0');
$dateInterval->day = $dateInterval->day == '00' ? 0 : ltrim($dateInterval->day, '0');
$dateInterval->hour = $dateInterval->hour == '00' ? 0 : ltrim($dateInterval->hour, '0');
$dateInterval->minute = $dateInterval->minute == '00' ? 0 : ltrim($dateInterval->minute, '0');
$dateInterval->secound = $dateInterval->secound == '00' ? 0 : ltrim($dateInterval->secound, '0');
}
return $dateInterval;
}
+7 -5
View File
@@ -1134,13 +1134,15 @@ class customModel extends model
$disabledFeatures = $this->setting->getItem('owner=system&module=common&section=&key=disabledFeatures');
$disabledFeatures = $disabledFeatures . ',' . $closedFeatures;
$hasWaterfall = strpos(",{$disabledFeatures},", ',waterfall,') === false;
$hasWaterfallPlus = strpos(",{$disabledFeatures},", ',waterfallplus,') === false;
$hasScrumMeasrecord = strpos(",{$disabledFeatures},", ',scrumMeasrecord,') === false;
$hasWaterfallMeasrecord = (strpos(",{$disabledFeatures},", ',waterfallMeasrecord,') === false and ($hasWaterfall or $hasWaterfallPlus));
$hasWaterfall = strpos(",{$disabledFeatures},", ',waterfall,') === false;
$hasWaterfallPlus = strpos(",{$disabledFeatures},", ',waterfallplus,') === false;
$hasScrumMeasrecord = strpos(",{$disabledFeatures},", ',scrumMeasrecord,') === false;
$hasAgilePlusMeasrecord = strpos(",{$disabledFeatures},", ',agileMeasrecord,') === false;
$hasWaterfallMeasrecord = (strpos(",{$disabledFeatures},", ',waterfallMeasrecord,') === false and $hasWaterfall);
$hasWaterfallPlusMeasrecord = (strpos(",{$disabledFeatures},", ',waterfallplusMeasrecord,') === false and $hasWaterfallPlus);
$cronStatus = 'normal';
if(!$hasScrumMeasrecord and !$hasWaterfallMeasrecord) $cronStatus = 'stop';
if(!$hasScrumMeasrecord and !$hasAgilePlusMeasrecord and !$hasWaterfallMeasrecord and $hasWaterfallPlusMeasrecord) $cronStatus = 'stop';
$this->loadModel('cron');
$cron = $this->dao->select('id,status')->from(TABLE_CRON)->where('command')->like('%methodName=initCrontabQueue')->fetch();
+2
View File
@@ -2,3 +2,5 @@
.c-team-name {width: 120px;}
.c-project, .c-user, .c-code, .c-desc, .c-days {width: 150px;}
.c-method {width: 45px;}
.c-type > .icon-help {vertical-align: text-top;}
.c-type > .popover .popover-content {font-weight: 400;}
+1
View File
@@ -1,3 +1,4 @@
.c-user {width: 150px !important;}
.c-date {width: 125px;}
.c-method {width: 60px;}
.c-type {width: 130px;}
+1
View File
@@ -39,3 +39,4 @@
.productsBox .required + .text-danger.help-text {position: relative; left: 10px;}
.productsBox > #productNameLabel {padding-top: 8px;}
.productsBox div[id^='branch'].chosen-disabled {pointer-events: none;}
.methodTip icon:before {margin-bottom: 5px;}
+5
View File
@@ -27,3 +27,8 @@ $('#executionForm').on('change input mousedown', '.has-error', function()
$(this).parent().find('.text-danger').remove();
$(this).removeClass('has-error');
})
$(function()
{
$('[data-toggle="popover"]').popover();
})
+2
View File
@@ -153,6 +153,8 @@ $(function()
{
$('.disabledBranch div[id^="branch"]').addClass('chosen-disabled');
}
$('[data-toggle="popover"]').popover();
});
function showLifeTimeTips()
+2
View File
@@ -112,6 +112,8 @@ $(function()
{
$('.disabledBranch div[id^="branch"]').addClass('chosen-disabled');
}
$('[data-toggle="popover"]').popover();
})
var lastProjectID = $("#project").val();
+2
View File
@@ -151,6 +151,8 @@ $lang->execution->left = 'Left';
$lang->execution->copyTeamTip = "copy Project/project team members";
$lang->execution->daysGreaterProject = 'Days cannot be greater than days of execution 『%s』';
$lang->execution->errorHours = 'Hours/Day cannot be greater than『24』';
$lang->execution->agileplusMethodTip = 'When creating executions in an Agile Plus project, both Iteration and Kanban management methods are supported.';
$lang->execution->typeTip = "The sub-stages of other types can be created under the parent stage of the 'mix' type, while the type of other parent-child levels is consistent.";
$lang->execution->start = 'Start';
$lang->execution->activate = 'Aktivieren';
+2
View File
@@ -151,6 +151,8 @@ $lang->execution->left = 'Left';
$lang->execution->copyTeamTip = "copy Project/project team members";
$lang->execution->daysGreaterProject = 'Days cannot be greater than days of execution 『%s』';
$lang->execution->errorHours = 'Hours/Day cannot be greater than『24』';
$lang->execution->agileplusMethodTip = 'When creating executions in an Agile Plus project, both Iteration and Kanban management methods are supported.';
$lang->execution->typeTip = "The sub-stages of other types can be created under the parent stage of the 'mix' type, while the type of other parent-child levels is consistent.";
$lang->execution->start = 'Start';
$lang->execution->activate = 'Activate';
+2
View File
@@ -151,6 +151,8 @@ $lang->execution->left = 'Left';
$lang->execution->copyTeamTip = "copy Project/project team members";
$lang->execution->daysGreaterProject = 'Days cannot be greater than days of execution 『%s』';
$lang->execution->errorHours = 'Hours/Day cannot be greater than『24』';
$lang->execution->agileplusMethodTip = 'When creating executions in an Agile Plus project, both Iteration and Kanban management methods are supported.';
$lang->execution->typeTip = "The sub-stages of other types can be created under the parent stage of the 'mix' type, while the type of other parent-child levels is consistent.";
$lang->execution->start = 'Démarrer';
$lang->execution->activate = 'Activer';
+2
View File
@@ -151,6 +151,8 @@ $lang->execution->left = '剩余';
$lang->execution->copyTeamTip = "可以选择复制项目或{$lang->execution->common}团队的成员";
$lang->execution->daysGreaterProject = '可用工日不能大于执行的可用工日『%s』';
$lang->execution->errorHours = '可用工时/天不能大于『24』';
$lang->execution->agileplusMethodTip = '融合敏捷项目创建执行时,支持迭代和看板两种管理方法。';
$lang->execution->typeTip = '“综合”类型的父阶段可以创建其它类型的子级,其它父子层级的类型均一致。';
$lang->execution->start = "开始";
$lang->execution->activate = "激活";
+4 -1
View File
@@ -62,7 +62,10 @@
<th class='c-user<?php echo zget($visibleFields, 'PO', ' hidden') . zget($requiredFields, 'PO', '', ' required');?>'><?php echo $lang->execution->PO;?></th>
<th class='c-user<?php echo zget($visibleFields, 'QD', ' hidden') . zget($requiredFields, 'QD', '', ' required');?>'><?php echo $lang->execution->QD;?></th>
<th class='c-user<?php echo zget($visibleFields, 'RD', ' hidden') . zget($requiredFields, 'RD', '', ' required');?>'><?php echo $lang->execution->RD;?></th>
<th class='c-type<?php echo zget($visibleFields, 'type', ' hidden') . zget($requiredFields, 'type', '', ' required');?>'><?php echo $lang->execution->$type;?></th>
<th class='c-type<?php echo zget($visibleFields, 'type', ' hidden') . zget($requiredFields, 'type', '', ' required');?>'>
<?php echo $lang->execution->$type;?>
<icon class='icon icon-help' data-toggle='popover' data-trigger='focus hover' data-placement='right' data-tip-class='text-muted popover-sm' data-content="<?php echo $lang->execution->typeTip;?>"></icon>
</th>
<th class='c-date required'><?php echo $lang->execution->begin;?></th>
<th class='c-date required'><?php echo $lang->execution->end;?></th>
<th class='c-desc <?php echo zget($visibleFields, 'desc', ' hidden') . zget($requiredFields, 'desc', '', ' required');?>'><?php echo $lang->execution->$desc;?></th>
+4 -1
View File
@@ -66,7 +66,10 @@
<tr>
<th><?php echo $lang->execution->method;?></th>
<td class="col-main"><?php echo html::select("type", $lang->execution->typeList, $type, "class='form-control chosen' required onchange='setType(this.value)'");?></td>
<td colspan='2'></td>
<td class='methodTip'>
<icon class='icon icon-help' data-toggle='popover' data-trigger='focus hover' data-placement='right' data-tip-class='text-muted popover-sm' data-content="<?php echo $lang->execution->agileplusMethodTip;?>"></icon>
</td>
<td></td>
</tr>
<?php endif;?>
<tr>
+3
View File
@@ -98,6 +98,9 @@
}
?>
</td>
<td>
<icon class='icon icon-help' data-toggle='popover' data-trigger='focus hover' data-placement='right' data-tip-class='text-muted popover-sm' data-content="<?php echo $lang->execution->typeTip;?>"></icon>
</td>
</tr>
<?php endif;?>
<tr>
+2 -2
View File
@@ -254,9 +254,9 @@ class group extends control
foreach($this->lang->resource as $module => $moduleActions)
{
$modules[$module] = $this->lang->$module->common;
foreach($moduleActions as $action)
foreach($moduleActions as $key => $action)
{
$actions[$module][$action] = $this->lang->$module->$action;
$actions[$module][$key] = $this->lang->$module->$action;
}
}
$this->view->groups = $this->group->getPairs();
+3
View File
@@ -198,6 +198,8 @@ class my extends control
$meetingCount = $pager->recTotal;
}
if($this->app->viewType != 'json')
{
echo <<<EOF
<script>
var taskCount = $taskCount;
@@ -227,6 +229,7 @@ if(isMax !== 0)
}
</script>
EOF;
}
}
/**
+1
View File
@@ -1 +1,2 @@
#planForm tr td {vertical-align: top;}
#mainContent .methodTitle, #mainContent .methodTip {display: inline-block; vertical-align: middle;}
+2
View File
@@ -5,6 +5,8 @@ $(function()
$(this).removeClass('has-error');
$(this).closest('td').find('.text-danger.help-text').remove();
});
$('[data-toggle="popover"]').popover();
});
/**
* Add item to create view of programplan.
+2
View File
@@ -57,4 +57,6 @@ $(function()
if(!result) return false;
}
})
$('[data-toggle="popover"]').popover();
})
+2
View File
@@ -20,6 +20,7 @@ $lang->programplan->delete = 'Delete Stage';
$lang->programplan->close = 'Close Stage';
$lang->programplan->activate = 'Activate Stage';
$lang->programplan->createSubPlan = 'Create Sub Plan';
$lang->programplan->subPlanManage = 'Sub-stages management';
$lang->programplan->parent = 'Parent Stage';
$lang->programplan->emptyParent = 'N/A';
@@ -72,6 +73,7 @@ $lang->programplan->emptyBegin = '『Begin』should not be blank';
$lang->programplan->emptyEnd = '『End』should not be blank';
$lang->programplan->checkBegin = '『Begin』should be valid date';
$lang->programplan->checkEnd = '『End』should be valid date';
$lang->programplan->methodTip = 'When creating sub-stages in a Waterfall Plus project stage, you can choose to create them as stages or as Iterations/Kanban. If the sub-stage is created as an Iteration/Kanban, it does not support creating sub-levels further down.';
$lang->programplan->milestoneList[1] = 'Yes';
$lang->programplan->milestoneList[0] = 'No';
+2
View File
@@ -20,6 +20,7 @@ $lang->programplan->delete = 'Delete Stage';
$lang->programplan->close = 'Close Stage';
$lang->programplan->activate = 'Activate Stage';
$lang->programplan->createSubPlan = 'Create Sub Stage';
$lang->programplan->subPlanManage = 'Sub-stages management';
$lang->programplan->parent = 'Parent Stage';
$lang->programplan->emptyParent = 'N/A';
@@ -72,6 +73,7 @@ $lang->programplan->emptyBegin = '『Begin』should not be blank';
$lang->programplan->emptyEnd = '『End』should not be blank';
$lang->programplan->checkBegin = '『Begin』should be valid date';
$lang->programplan->checkEnd = '『End』should be valid date';
$lang->programplan->methodTip = 'When creating sub-stages in a Waterfall Plus project stage, you can choose to create them as stages or as Iterations/Kanban. If the sub-stage is created as an Iteration/Kanban, it does not support creating sub-levels further down.';
$lang->programplan->milestoneList[1] = 'Yes';
$lang->programplan->milestoneList[0] = 'No';
+2
View File
@@ -20,6 +20,7 @@ $lang->programplan->delete = 'Delete Stage';
$lang->programplan->close = 'Close Stage';
$lang->programplan->activate = 'Activate Stage';
$lang->programplan->createSubPlan = 'Create Sub Plan';
$lang->programplan->subPlanManage = 'Sub-stages management';
$lang->programplan->parent = 'Parent Stage';
$lang->programplan->emptyParent = 'N/A';
@@ -72,6 +73,7 @@ $lang->programplan->emptyBegin = '『Begin』should not be blank';
$lang->programplan->emptyEnd = '『End』should not be blank';
$lang->programplan->checkBegin = '『Begin』should be valid date';
$lang->programplan->checkEnd = '『End』should be valid date';
$lang->programplan->methodTip = 'When creating sub-stages in a Waterfall Plus project stage, you can choose to create them as stages or as Iterations/Kanban. If the sub-stage is created as an Iteration/Kanban, it does not support creating sub-levels further down.';
$lang->programplan->milestoneList[1] = 'Yes';
$lang->programplan->milestoneList[0] = 'No';
+2
View File
@@ -20,6 +20,7 @@ $lang->programplan->delete = '删除阶段';
$lang->programplan->close = '关闭阶段';
$lang->programplan->activate = '激活阶段';
$lang->programplan->createSubPlan = '创建子阶段';
$lang->programplan->subPlanManage = '子阶段的管理方法';
$lang->programplan->parent = '父阶段';
$lang->programplan->emptyParent = '无';
@@ -72,6 +73,7 @@ $lang->programplan->emptyBegin = '『计划开始』日期不能为空';
$lang->programplan->emptyEnd = '『计划完成』日期不能为空';
$lang->programplan->checkBegin = '『计划开始』应当为合法的日期';
$lang->programplan->checkEnd = '『计划完成』应当为合法的日期';
$lang->programplan->methodTip = '融合瀑布项目阶段子阶段创建时,可以选择创建为阶段或创建为迭代/看板。子阶段为迭代/看板,不支持继续向下创建子级。';
$lang->programplan->milestoneList[1] = '是';
$lang->programplan->milestoneList[0] = '否';
+2
View File
@@ -45,6 +45,7 @@
<div class='main-header'>
<?php if(!empty($planID) and $project->model == 'waterfallplus'):?>
<div class="pull-left">
<div class='methodTitle'><strong><?php echo $lang->programplan->subPlanManage . ':'?></strong></div>
<div class='btn-group'>
<a href='javascript:;' class='btn btn-link btn-limit' data-toggle='dropdown'><span class='text' title='<?php echo zget($lang->programplan->typeList, $executionType);?>'><?php echo zget($lang->programplan->typeList, $executionType);?></span> <span class='caret'></span></a>
<ul class='dropdown-menu' style='max-height:240px; max-width: 300px; overflow-y:auto'>
@@ -57,6 +58,7 @@
?>
</ul>
</div>
<div class='methodTip'><icon class='icon icon-help' data-toggle='popover' data-trigger='focus hover' data-placement='right' data-tip-class='text-muted popover-sm' data-content="<?php echo $lang->programplan->methodTip;?>"></icon></div>
</div>
<?php endif;?>
<div class="btn-toolbar pull-right">
+3
View File
@@ -60,6 +60,9 @@
<td colspan='2'>
<?php echo $enableOptionalAttr ? html::select('attribute', $lang->stage->typeList, $plan->attribute, "class='form-control'") : zget($lang->stage->typeList, $plan->attribute);?>
</td>
<td>
<icon class='icon icon-help' data-toggle='popover' data-trigger='focus hover' data-placement='right' data-tip-class='text-muted popover-sm' data-content="<?php echo $lang->execution->typeTip;?>"></icon>
</td>
</tr>
<?php if($plan->setMilestone):?>
<tr>
+4
View File
@@ -48,7 +48,11 @@
<h2><?php echo $createTitle;?></h2>
<?php if(!commonModel::isTutorialMode()): ?>
<div class="pull-right btn-toolbar">
<?php if($config->edition != 'max' or $model == 'kanban'):?>
<button type='button' class='btn btn-link' data-toggle='modal' data-target='#copyProjectModal'><?php echo html::icon($lang->icons['copy'], 'muted') . ' ' . $lang->project->copy;?></button>
<?php else: ?>
<button type='button' class='btn btn-link open-btn' data-toggle='modal' data-target='#maxCopyProjectModal'><?php echo html::icon($lang->icons['copy'], 'muted') . ' ' . $lang->project->copy;?></button>
<?php endif; ?>
</div>
<?php endif; ?>
</div>
+1 -1
View File
@@ -599,7 +599,7 @@ class repo extends control
}
/* Refresh repo. */
if($refresh) $this->repo->updateCommit($repoID, $originBranchID);
if($refresh) $this->repo->updateCommit($repoID, $objectID, $originBranchID);
/* Get files info. */
$infos = $this->repo->getFileCommits($repo, $branchID, $path);
+1 -1
View File
@@ -2810,7 +2810,7 @@ class repoModel extends model
* @access public
* @return void
*/
public function updateCommit($repoID, $branchID = 0)
public function updateCommit($repoID, $objectID = 0, $branchID = 0)
{
$repo = $this->getRepoByID($repoID);
/* Update code commit history. */
+1 -1
View File
@@ -199,7 +199,7 @@ class stageModel extends model
$moduleName = $this->app->rawModule;
$methodName = $this->app->rawMethod;
if(!isset($this->lang->admin->menuList->model['subMenu']['waterfall']['exclude'])) $this->lang->admin->menuList->model['subMenu']['waterfall']['exclude'] = '';
if(!isset($this->lang->admin->menuList->model['subMenu']['waterfallplus']['exclude'])) $this->lang->admin->menuList->model['subMenu']['agileplus']['exclude'] = '';
if(!isset($this->lang->admin->menuList->model['subMenu']['waterfallplus']['exclude'])) $this->lang->admin->menuList->model['subMenu']['waterfallplus']['exclude'] = '';
if($type == 'waterfall')
{
$this->lang->admin->menuList->model['subMenu']['waterfallplus']['exclude'] .= ",{$moduleName}-{$methodName}";