Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms into importExport
This commit is contained in:
@@ -217,7 +217,8 @@ CREATE TABLE `zt_approvalnode` (
|
||||
`extra` mediumtext NOT NULL,
|
||||
`reviewedBy` char(30) NOT NULL,
|
||||
`reviewedDate` datetime NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_reviewed_date` (`reviewedDate`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
CREATE TABLE `zt_approvalobject` (
|
||||
`id` int(8) NOT NULL AUTO_INCREMENT,
|
||||
|
||||
@@ -16,3 +16,6 @@ UPDATE `zt_approval` SET `createdDate` = '';
|
||||
ALTER TABLE `zt_approval` CHANGE `createdDate` `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
|
||||
ALTER TABLE `zt_reviewissue` ADD `approval` MEDIUMINT NOT NULL AFTER `review`;
|
||||
|
||||
ALTER TABLE `zt_approvalnode` ADD INDEX `idx_reviewed_date` (`reviewedDate`);
|
||||
|
||||
|
||||
+2
-1
@@ -187,7 +187,8 @@ CREATE TABLE `zt_approvalnode` (
|
||||
`extra` mediumtext NOT NULL,
|
||||
`reviewedBy` char(30) NOT NULL,
|
||||
`reviewedDate` datetime NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_reviewed_date` (`reviewedDate`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_approvalobject`;
|
||||
CREATE TABLE `zt_approvalobject` (
|
||||
|
||||
@@ -22,7 +22,7 @@ class project extends control
|
||||
}
|
||||
|
||||
$allExecution = $this->execution->getList($projectID, 'all', 'all');
|
||||
$this->view->allExecutionsNum = count($allExecution);
|
||||
$this->view->allExecutionsNum = empty($allExecution);
|
||||
|
||||
$this->view->title = $this->lang->project->kanban;
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->execution->noExecution;?></span>
|
||||
<?php if(common::hasPriv('execution', 'create') and empty($allExecutionsNum)):?>
|
||||
<?php if(common::hasPriv('execution', 'create') and $allExecutionsNum):?>
|
||||
<?php echo html::a($this->createLink('execution', 'create', "projectID=$projectID"), "<i class='icon icon-plus'></i> " . $lang->project->createKanban, '', "class='btn btn-info' data-app='project'");?>
|
||||
<?php endif;?>
|
||||
</p>
|
||||
|
||||
@@ -38,6 +38,7 @@ class html extends baseHTML
|
||||
if(empty($target)) $target = '_self';
|
||||
if($target != '_self') $misc .= " target='$target'";
|
||||
if($target == '_blank') $misc .= " rel='noopener noreferrer'";
|
||||
if(strpos($misc, 'disabled')) $href = '#';
|
||||
return parent::a($href, $title, $misc, $newline);
|
||||
}
|
||||
|
||||
|
||||
@@ -208,7 +208,7 @@ $lang->bug->summary = "Bugs on this page : <strong>%s</strong> Tot
|
||||
$lang->bug->confirmChangeProduct = "Change {$lang->productCommon} will cause linked {$lang->executionCommon},Story and Task change. Do you want to do this?";
|
||||
$lang->bug->confirmDelete = 'Do you want to delete this bug?';
|
||||
$lang->bug->remindTask = 'This Bug has been converted to Task. Do you want to update Status of Task(ID %s)?';
|
||||
$lang->bug->skipClose = 'Bug %s is not resolved. You cannot close it.';
|
||||
$lang->bug->skipClose = 'Bug %s is/are Not Resolved states and cannot be closed. They will be ignored automatically.';
|
||||
$lang->bug->executionAccessDenied = "You access to the {$lang->executionCommon} to which this bug belongs is denied!";
|
||||
$lang->bug->stepsNotEmpty = "The reproduction step cannot be empty.";
|
||||
$lang->bug->confirmUnlinkBuild = "Replacing the solution version will disassociate the bug from the old version. Are you sure you want to disassociate the bug from %s?";
|
||||
|
||||
@@ -208,7 +208,7 @@ $lang->bug->summary = "Total <strong>%s</strong> bugs on this page
|
||||
$lang->bug->confirmChangeProduct = "Any change to {$lang->productCommon} will cause linked {$lang->executionCommon}s, stories and tasks change. Do you want to do this?";
|
||||
$lang->bug->confirmDelete = 'Do you want to delete this bug?';
|
||||
$lang->bug->remindTask = 'This bug has been converted to a task. Do you want to update the status of Task(ID %s)?';
|
||||
$lang->bug->skipClose = 'Bug %s is active. You cannot close it.';
|
||||
$lang->bug->skipClose = 'Bug %s is/are Not Resolved states and cannot be closed. They will be ignored automatically.';
|
||||
$lang->bug->executionAccessDenied = "You access to the {$lang->executionCommon} to which this bug belongs is denied!";
|
||||
$lang->bug->stepsNotEmpty = "The reproduction step cannot be empty.";
|
||||
$lang->bug->confirmUnlinkBuild = "Replacing the solution version will disassociate the bug from the old version. Are you sure you want to disassociate the bug from %s?";
|
||||
|
||||
@@ -208,7 +208,7 @@ $lang->bug->summary = "Total de <strong>%s</strong> bugs sur cette
|
||||
$lang->bug->confirmChangeProduct = "Tout changement aux {$lang->productCommon} fera que les {$lang->executionCommon}s, stories et tâches associées vont changer. Voulez-vous faire cela ?";
|
||||
$lang->bug->confirmDelete = 'Voulez-vous supprimer ce bug ?';
|
||||
$lang->bug->remindTask = 'Ce bug a été converti en tâche. Voulez-vous mettre à jour le statut de la Tâche(ID %s) ?';
|
||||
$lang->bug->skipClose = 'Bug %s est actif. Vous ne pouvez pas le fermer.';
|
||||
$lang->bug->skipClose = 'Les bugs %s ne sont pas résolus et ne peuvent pas être fermés, ils seront donc ignorés automatiquement. ';
|
||||
$lang->bug->executionAccessDenied = "Votre accès à {$lang->executionCommon} auquel ce bug appartient est refusé !";
|
||||
$lang->bug->stepsNotEmpty = "The reproduction step cannot be empty.";
|
||||
$lang->bug->confirmUnlinkBuild = "Replacing the solution version will disassociate the bug from the old version. Are you sure you want to disassociate the bug from %s?";
|
||||
|
||||
@@ -208,7 +208,7 @@ $lang->bug->summary = "本页共 <strong>%s</strong> 个Bug,未
|
||||
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}会导致相应的{$lang->executionCommon}、{$lang->SRCommon}和任务发生变化,确定吗?";
|
||||
$lang->bug->confirmDelete = '您确认要删除该Bug吗?';
|
||||
$lang->bug->remindTask = '该Bug已经转化为任务,是否更新任务(编号:%s)状态 ?';
|
||||
$lang->bug->skipClose = 'Bug %s 不是已解决状态,不能关闭。';
|
||||
$lang->bug->skipClose = 'Bug %s 不是已解决状态,不能关闭,将自动忽略。';
|
||||
$lang->bug->executionAccessDenied = "您无权访问该Bug所属的{$lang->executionCommon}!";
|
||||
$lang->bug->stepsNotEmpty = "重现步骤不能为空。";
|
||||
$lang->bug->confirmUnlinkBuild = "更换解决版本将取消与旧版本的关联,您确定取消该bug与%s的关联吗?";
|
||||
|
||||
@@ -352,18 +352,12 @@ class caselib extends control
|
||||
/* Set lib menu. */
|
||||
$this->caselib->setLibMenu($libraries, $libID);
|
||||
|
||||
$currentModuleID = (int)$moduleID;
|
||||
|
||||
/* Set module option menu. */
|
||||
$moduleOptionMenu = $this->loadModel('tree')->getOptionMenu($libID, $viewType = 'caselib', $startModuleID = 0);
|
||||
$moduleOptionMenu['ditto'] = $this->lang->testcase->ditto;
|
||||
|
||||
$this->view->title = $libraries[$libID] . $this->lang->colon . $this->lang->testcase->batchCreate;
|
||||
$this->view->position[] = html::a($this->createLink('caselib', 'browse', "libID=$libID"), $libraries[$libID]);
|
||||
$this->view->position[] = $this->lang->testcase->batchCreate;
|
||||
$this->view->libID = $libID;
|
||||
$this->view->moduleOptionMenu = $moduleOptionMenu;
|
||||
$this->view->currentModuleID = $currentModuleID;
|
||||
$this->view->moduleOptionMenu = $this->loadModel('tree')->getOptionMenu($libID, $viewType = 'caselib', $startModuleID = 0);
|
||||
$this->view->currentModuleID = (int)$moduleID;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -38,7 +38,12 @@
|
||||
<?php unset($lang->testcase->typeList['']);?>
|
||||
<?php for($i = 0; $i < $config->testcase->batchCreate; $i++):?>
|
||||
<?php
|
||||
if($i != 0) $currentModuleID = 'ditto';
|
||||
if($i != 0)
|
||||
{
|
||||
$currentModuleID = 'ditto';
|
||||
$moduleOptionMenu['ditto'] = $this->lang->testcase->ditto;
|
||||
}
|
||||
|
||||
if($i != 0) $lang->testcase->typeList['ditto'] = $lang->testcase->ditto;
|
||||
if($i != 0) $lang->testcase->priList['ditto'] = $lang->testcase->ditto;
|
||||
$type = $i == 0 ? 'feature' : 'ditto';
|
||||
|
||||
@@ -153,7 +153,7 @@ js::set('flow', $config->global->flow);
|
||||
<?php echo html::a($viewLink, $case->title, null, "style='color: $case->color'");?>
|
||||
</td>
|
||||
<td><?php echo $lang->testcase->typeList[$case->type];?></td>
|
||||
<td><?php echo zget($users, $case->openedBy);?></td>
|
||||
<td title="<?php echo zget($users, $case->openedBy);?>"><?php echo zget($users, $case->openedBy);?></td>
|
||||
<td class='<?php if(isset($run)) echo $run->status;?> testcase-<?php echo $case->status?>'> <?php echo $this->processStatus('testcase', $case);?></td>
|
||||
<?php foreach($extendFields as $extendField) echo "<td>" . $this->loadModel('flow')->getFieldValue($extendField, $case) . "</td>";?>
|
||||
<td class='c-actions'>
|
||||
|
||||
@@ -633,7 +633,7 @@ class commonModel extends model
|
||||
}
|
||||
else if(!defined('TUTORIAL'))
|
||||
{
|
||||
$params = "programID=0©ProjectID=0&extra=from=global";
|
||||
$params = "programID=0&from=global";
|
||||
$createMethod = 'createGuide';
|
||||
$attr = 'data-toggle="modal"';
|
||||
}
|
||||
|
||||
@@ -44,10 +44,9 @@
|
||||
<?php endif;?>
|
||||
<td class='text-left SRBox'><?php echo $URSR['SRName'];?></td>
|
||||
<td class='c-actions'>
|
||||
<?php $disabled = $key == $config->custom->URSR ? "disabled=disabled" : '';?>
|
||||
<?php $deleteLink = empty($disabled) ? $this->createLink('custom', 'deleteStoryConcept', "id=$key") : '#';?>
|
||||
<?php $disabled = $key == $config->custom->URSR ? "disabled=disabled" : '';?>
|
||||
<?php if(common::hasPriv('custom', 'editStoryConcept')) echo html::a($this->createLink('custom', 'editStoryConcept', "id=$key", '', true), "<i class='icon icon-edit'></i>", '', "class='btn iframe' data-width=" . ($this->config->URAndSR ? "480px" : "330px") . " title={$lang->edit}");?>
|
||||
<?php if(common::hasPriv('custom', 'deleteStoryConcept')) echo html::a($deleteLink, "<i class='icon icon-trash'></i>", 'hiddenwin', "class='btn' $disabled title={$lang->delete} data-group='admin'");?>
|
||||
<?php if(common::hasPriv('custom', 'deleteStoryConcept')) echo html::a($this->createLink('custom', 'deleteStoryConcept', "id=$key"), "<i class='icon icon-trash'></i>", 'hiddenwin', "class='btn' $disabled title={$lang->delete} data-group='admin'");?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
|
||||
@@ -219,14 +219,9 @@ class execution extends control
|
||||
$showModule = !empty($this->config->datatable->executionTask->showModule) ? $this->config->datatable->executionTask->showModule : '';
|
||||
$this->view->modulePairs = $showModule ? $this->tree->getModulePairs($executionID, 'task', $showModule) : array();
|
||||
|
||||
$allTasksNum = $this->dao->select('COUNT(id) AS count')->from(TABLE_TASK)
|
||||
->where('execution')->eq($executionID)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->fetch();
|
||||
|
||||
/* Assign. */
|
||||
$this->view->tasks = $tasks;
|
||||
$this->view->allTasksNum = $allTasksNum;
|
||||
$this->view->allTasksNum = $this->task->getExecutionTasks($executionID);
|
||||
$this->view->summary = $this->execution->summary($tasks);
|
||||
$this->view->tabID = 'task';
|
||||
$this->view->pager = $pager;
|
||||
|
||||
@@ -7,7 +7,8 @@ $(function()
|
||||
var colors = ['#33B4DB', '#7ECF69', '#FFC73A', '#FF5A61', '#50C8D0', '#AF5AFF', '#4EA3FF', '#FF8C5A', '#6C73FF'];
|
||||
//var background = ['#E1F4FA', '#ECF8E9', '#FFF7E2', '#FFE7E8', '#E5F7F8', '#F3E7FF', '#E5F1FF', '#FFEEE7', '#E9EAFF'];
|
||||
|
||||
if(Object.keys(chartData).length)
|
||||
var chartDom = document.getElementById('cfdChart');
|
||||
if(Object.keys(chartData).length && chartDom)
|
||||
{
|
||||
$.each(chartData['line'], function(label, set)
|
||||
{
|
||||
@@ -35,8 +36,7 @@ $(function()
|
||||
i ++;
|
||||
})
|
||||
|
||||
var chartDom = document.getElementById('cfdChart');
|
||||
var CFD = echarts.init(chartDom);
|
||||
var CFD = echarts.init(chartDom);
|
||||
var option;
|
||||
|
||||
option = {
|
||||
@@ -137,6 +137,7 @@ $(function()
|
||||
location.href = createLink('execution', 'cfd', 'executionID=' + executionID + '&type=' + type + '&withWeekend=' + withWeekend + '&begin=' + begin + '&end=' + end);
|
||||
});
|
||||
|
||||
$("#end, #begin").datetimepicker('setEndDate', today)
|
||||
$("#end, #begin").datetimepicker('setEndDate', today);
|
||||
$("#end, #begin").datetimepicker('setStartDate', executionBegin);
|
||||
$('.datetimepicker-days table tfoot').append('<tr><th colspan="7">' + dateRangeTip + '</th></tr>');
|
||||
});
|
||||
|
||||
@@ -952,7 +952,7 @@ function createColumnCreateMenu(options)
|
||||
|
||||
if(col.laneType == 'story')
|
||||
{
|
||||
if(priv.canCreateStory) items.push({label: storyLang.create, url: $.createLink('story', 'create', 'productID=' + productID + '&branch=0&moduleID=0&storyID=0&objectID=' + executionID, '', true), className: 'iframe'});
|
||||
if(priv.canCreateStory) items.push({label: storyLang.create, url: $.createLink('story', 'create', 'productID=' + productID + '&branch=0&moduleID=0&storyID=0&objectID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '80%'}});
|
||||
if(priv.canBatchCreateStory) items.push({label: executionLang.batchCreateStory, url: $.createLink('story', 'batchcreate', 'productID=' + productID + '&branch=0&moduleID=0&storyID=0&executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '90%'}});
|
||||
if(priv.canLinkStory) items.push({label: executionLang.linkStory, url: $.createLink('execution', 'linkStory', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '90%'}});
|
||||
if(priv.canLinkStoryByPlan) items.push({label: executionLang.linkStoryByPlan, url: '#linkStoryByPlan', 'attrs' : {'data-toggle': 'modal'}});
|
||||
|
||||
@@ -4340,7 +4340,7 @@ class executionModel extends model
|
||||
$spanClass = $execution->type == 'stage' ? 'label-warning' : 'label-info';
|
||||
echo "<span class='project-type-label label label-outline $spanClass'>{$this->lang->execution->typeList[$execution->type]}</span> ";
|
||||
}
|
||||
echo html::a(helper::createLink('execution', 'view', "executionID=$execution->id"), $execution->name);
|
||||
echo empty($execution->children) ? html::a(helper::createLink('execution', 'view', "executionID=$execution->id"), $execution->name) : $execution->name;
|
||||
echo '<td>' . zget($users, $execution->PM) . '</td>';
|
||||
echo "<td class='status-{$execution->status}'>" . zget($this->lang->project->statusList, $execution->status) . '</td>';
|
||||
echo '<td>' . html::ring($execution->hours->progress) . '</td>';
|
||||
@@ -4363,8 +4363,14 @@ class executionModel extends model
|
||||
}
|
||||
else
|
||||
{
|
||||
$disabled = ($execution->grade == 2) ? ' disabled' : '';
|
||||
echo common::hasPriv('programplan', 'create') ? html::a('javascript:alert("' . $this->lang->programplan->error->createdTask . '");', '<i class="icon-programplan-create icon-split"></i>', '', 'class="btn ' . $disabled . '"') : '';
|
||||
if($execution->grade == 2)
|
||||
{
|
||||
echo "<button class='btn' disabled='disabled' style='margin-right: 4px;'><i class='icon-split disabled icon-search'></i></button>";
|
||||
}
|
||||
else
|
||||
{
|
||||
echo common::hasPriv('programplan', 'create') ? html::a('javascript:alert("' . $this->lang->programplan->error->createdTask . '");', '<i class="icon-programplan-create icon-split"></i>', '', 'class="btn"') : '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
<?php js::set('XUnit', $lang->execution->burnXUnit); ?>
|
||||
<?php js::set('dateRangeTip', $lang->execution->charts->cfd->dateRangeTip); ?>
|
||||
<?php js::set('today', date(DT_DATE1)); ?>
|
||||
<?php js::set('executionBegin', $execution->begin); ?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php
|
||||
@@ -32,7 +33,7 @@
|
||||
$weekend = $withWeekend == 'true' ? 'noweekend' : 'withweekend';
|
||||
echo html::a('#', $lang->execution->$weekend, '', "class='btn btn-link' id='weekend'");
|
||||
?>
|
||||
<div class='input-control w-100px'>
|
||||
<div class='input-control w-140px'>
|
||||
<?php echo html::select('type', $lang->execution->cfdTypeList, $type, "class='form-control chosen'");?>
|
||||
</div>
|
||||
<div id="cfdDateSelect">
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
<ul class="timeline timeline-tag-left <?php if($type == 'all') echo 'margin-l-50px';?>">
|
||||
<?php if($direction == 'next') $actions = array_reverse($actions);?>
|
||||
<?php foreach($actions as $i => $action):?>
|
||||
<?php if($action->action == 'adjusttasktowait') continue;?>
|
||||
<?php if(empty($firstAction)) $firstAction = $action;?>
|
||||
<li <?php if($action->major) echo "class='active'";?>>
|
||||
<div>
|
||||
|
||||
@@ -198,7 +198,7 @@ body {margin-bottom: 25px;}
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->task->noTask;?></span>
|
||||
<?php if($canBeChanged and common::hasPriv('task', 'create') and empty($allTasksNum->count)):?>
|
||||
<?php if($canBeChanged and common::hasPriv('task', 'create') and empty($allTasksNum)):?>
|
||||
<?php echo html::a($taskCreateLink, "<i class='icon icon-plus'></i> " . $lang->task->create, '', "class='btn btn-info'");?>
|
||||
<?php endif;?>
|
||||
</p>
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
<button class='btn btn-primary' type='button' data-toggle='dropdown'><i class='icon icon-plus'></i> <?php echo $this->lang->create;?> <span class='caret'></span></button>
|
||||
<ul class='dropdown-menu pull-right'>
|
||||
<?php if($execution->lifetime != 'ops'):?>
|
||||
<?php if($canCreateStory) echo '<li>' . html::a(helper::createLink('story', 'create', "productID=$productID&branch=0&moduleID=0&story=0&execution=$execution->id", '', true), $lang->execution->createStory, '', "class='iframe'") . '</li>';?>
|
||||
<?php if($canCreateStory) echo '<li>' . html::a(helper::createLink('story', 'create', "productID=$productID&branch=0&moduleID=0&story=0&execution=$execution->id", '', true), $lang->execution->createStory, '', "class='iframe' data-width='80%'") . '</li>';?>
|
||||
<?php if($canBatchCreateStory) echo '<li>' . html::a(helper::createLink('story', 'batchCreate', "productID=$productID&branch=0&moduleID=0&story=0&execution=$execution->id", '', true), $lang->execution->batchCreateStory, '', "class='iframe' data-width='90%'") . '</li>';?>
|
||||
<?php if($canLinkStory) echo '<li>' . html::a(helper::createLink('execution', 'linkStory', "execution=$execution->id", '', true), $lang->execution->linkStory, '', "class='iframe' data-width='90%'") . '</li>';?>
|
||||
<?php if($canLinkStoryByPlan) echo '<li>' . html::a('#linkStoryByPlan', $lang->execution->linkStoryByPlan, '', 'data-toggle="modal"') . '</li>';?>
|
||||
|
||||
@@ -228,19 +228,21 @@ class kanban extends control
|
||||
$copyKanban = $this->kanban->getByID($copyKanbanID);
|
||||
$enableImport = empty($copyKanban->object) ? 'off' : 'on';
|
||||
$importObjects = empty($copyKanban->object) ? array() : explode(',', $copyKanban->object);
|
||||
$spaceID = $copyKanban->space;
|
||||
}
|
||||
|
||||
unset($this->lang->kanbanspace->featureBar['involved']);
|
||||
|
||||
$space = $this->kanban->getSpaceById($spaceID);
|
||||
$spaceUsers = $spaceID == 0 ? ',' : trim($space->owner) . ',' . trim($space->team);
|
||||
$users = $this->loadModel('user')->getPairs('noclosed|nodeleted', '', 0, $spaceUsers);
|
||||
$spacePairs = array(0 => '') + $this->kanban->getSpacePairs($type);
|
||||
$users = isset($spacePairs[$spaceID]) ? $this->loadModel('user')->getPairs('noclosed|nodeleted', '', 0, $spaceUsers) : array();
|
||||
$whitelist = (isset($space->whitelist) and !empty($space->whitelist)) ? $space->whitelist : ',';
|
||||
|
||||
$this->view->users = $users;
|
||||
$this->view->whitelist = $this->user->getPairs('noclosed|nodeleted', '', 0, $whitelist);
|
||||
$this->view->whitelist = isset($spacePairs[$spaceID]) ? $this->user->getPairs('noclosed|nodeleted', '', 0, $whitelist) : array();
|
||||
$this->view->spaceID = $spaceID;
|
||||
$this->view->spacePairs = array(0 => '') + $this->kanban->getSpacePairs($type);
|
||||
$this->view->spacePairs = $spacePairs;
|
||||
$this->view->type = $type;
|
||||
$this->view->typeList = $this->lang->kanbanspace->featureBar;
|
||||
$this->view->kanbans = array('' => '') + $this->kanban->getPairs();
|
||||
|
||||
@@ -1586,6 +1586,7 @@ class kanbanModel extends model
|
||||
{
|
||||
$laneData = array();
|
||||
$columnData = array();
|
||||
$cardCount = 0;
|
||||
|
||||
$laneData['id'] = $groupBy . $laneID;
|
||||
$laneData['laneID'] = $groupBy . $laneID;
|
||||
@@ -1692,10 +1693,11 @@ class kanbanModel extends model
|
||||
$laneData['cards'][$column->columnType][] = $cardData;
|
||||
$cardOrder ++;
|
||||
}
|
||||
$cardCount += $cardOrder - 1;
|
||||
if($searchValue == '' and !isset($laneData['cards'][$column->columnType])) $laneData['cards'][$column->columnType] = array();
|
||||
}
|
||||
|
||||
if($searchValue != '' and empty($laneData['cards'])) continue;
|
||||
if(($searchValue != '' and empty($laneData['cards'])) or ($laneData['id'] == 'story0' and $cardCount == 0 and count($lanes) > 1)) continue;
|
||||
$kanbanGroup[$groupBy]['id'] = $groupBy . $laneID;
|
||||
$kanbanGroup[$groupBy]['columns'] = array_values($columnData);
|
||||
$kanbanGroup[$groupBy]['lanes'][] = $laneData;
|
||||
@@ -2825,7 +2827,7 @@ class kanbanModel extends model
|
||||
}
|
||||
}
|
||||
|
||||
if($story->stage == 'projected' and strpos($cardPairs['ready'], ",$storyID,") === false and strpos($cardPairs['backlog'], ",$storyID,") === false)
|
||||
if(strpos('wait,projected', $story->stage) !== false and strpos($cardPairs['ready'], ",$storyID,") === false and strpos($cardPairs['backlog'], ",$storyID,") === false)
|
||||
{
|
||||
$cardPairs['backlog'] = empty($cardPairs['backlog']) ? ",$storyID," : ",$storyID" . $cardPairs['backlog'];
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
<ul class="timeline timeline-tag-left <?php if($type == 'all') echo 'margin-l-50px';?>">
|
||||
<?php if($direction == 'next') $actions = array_reverse($actions);?>
|
||||
<?php foreach($actions as $i => $action):?>
|
||||
<?php if($action->action == 'adjusttasktowait') continue;?>
|
||||
<?php if(empty($firstAction)) $firstAction = $action;?>
|
||||
<li <?php if($action->major) echo "class='active'";?>>
|
||||
<div>
|
||||
|
||||
@@ -1445,6 +1445,7 @@ class product extends control
|
||||
unset($fields[$key]);
|
||||
}
|
||||
|
||||
$lastProgram = $lastLine = '';
|
||||
$lines = $this->product->getLinePairs();
|
||||
$productStats = $this->product->getStats('program_desc,line_desc,' . $orderBy, null, $status);
|
||||
foreach($productStats as $i => $product)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
$(function()
|
||||
{
|
||||
if(manageLinePriv && (hiddenLine || systemMode == 'classic')) $('#line_chosen').addClass('hidden');
|
||||
$('#lineName').css('border-left-color', '');
|
||||
$('[name=newLine]').change();
|
||||
})
|
||||
/**
|
||||
* Load product Lines.
|
||||
|
||||
@@ -35,11 +35,9 @@
|
||||
<?php if(common::hasPriv('product', 'manageLine') and ($config->systemMode == 'classic' or $programID)):?>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<?php $hiddenLine = count($lines) > 1 ? '' : 'hidden';?>
|
||||
<?php $hiddenLineName = $hiddenLine ? '' : 'hidden';?>
|
||||
<?php $checkedNewLine = $hiddenLine ? 'checked' : '';?>
|
||||
<?php echo html::select("line", $lines, '', "class='form-control line-exist chosen $hiddenLine'");?>
|
||||
<?php echo html::input("lineName", '', "class='form-control line-no-exist $hiddenLineName'");?>
|
||||
<?php $checkedNewLine = count($lines) > 1 ? '' : 'checked';?>
|
||||
<?php echo html::select("line", $lines, '', "class='form-control hidden line-exist chosen'");?>
|
||||
<?php echo html::input("lineName", '', "class='form-control line-no-exist'");?>
|
||||
<?php if(count($lines)):?>
|
||||
<span class='input-group-addon'>
|
||||
<div class="checkbox-primary">
|
||||
@@ -126,5 +124,4 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php js::set('hiddenLine', $hiddenLine);?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -351,17 +351,12 @@ class productplan extends control
|
||||
$this->view->kanbanData = $this->loadModel('kanban')->getPlanKanban($product, $branchID, $planGroup);
|
||||
}
|
||||
|
||||
$productPlansNum = $this->dao->select('COUNT(id) AS count')->from(TABLE_PRODUCTPLAN)
|
||||
->where('product')->eq($productID)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->fetch();
|
||||
$this->view->productPlansNum = $productPlansNum;
|
||||
|
||||
$this->view->title = $productName . $this->lang->colon . $this->lang->productplan->browse;
|
||||
$this->view->position[] = $this->lang->productplan->browse;
|
||||
$this->view->productID = $productID;
|
||||
$this->view->branch = $branch;
|
||||
$this->view->branchStatusList = $branchStatusList;
|
||||
$this->view->productPlansNum = $this->productplan->getList($productID, $branch, 'all');
|
||||
$this->view->browseType = $browseType;
|
||||
$this->view->viewType = $viewType;
|
||||
$this->view->orderBy = $orderBy;
|
||||
|
||||
@@ -638,6 +638,9 @@ class productplanModel extends model
|
||||
$parent = $this->getByID($parentID);
|
||||
$childStatus = $this->dao->select('status')->from(TABLE_PRODUCTPLAN)->where('parent')->eq($parentID)->andWhere('deleted')->eq(0)->fetchPairs();
|
||||
|
||||
/* If the subplan is empty, update the plan. */
|
||||
if(empty($childStatus)) $this->dao->update(TABLE_PRODUCTPLAN)->set('parent')->eq(0)->exec();
|
||||
|
||||
if(count($childStatus) == 1 and isset($childStatus['wait']))
|
||||
{
|
||||
return;
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->productplan->noPlan;?></span>
|
||||
<?php if(common::canModify('product', $product) and common::hasPriv('productplan', 'create') and empty($productPlansNum->count)):?>
|
||||
<?php if(common::canModify('product', $product) and common::hasPriv('productplan', 'create') and empty($productPlansNum)):?>
|
||||
<?php echo html::a($this->createLink('productplan', 'create', "productID=$product->id&branch=$branch"), "<i class='icon icon-plus'></i> " . $lang->productplan->create, '', "class='btn btn-info'");?>
|
||||
<?php endif;?>
|
||||
</p>
|
||||
|
||||
@@ -473,11 +473,7 @@ class program extends control
|
||||
$sortField = zget($this->config->program->sortFields, $order[0], 'id') . '_' . $order[1];
|
||||
$projectStats = $this->program->getProjectStats($programID, $browseType, 0, $sortField, $pager, $programTitle);
|
||||
|
||||
$allProjectsNum = $this->dao->select('COUNT(id) AS count')->from(TABLE_PROJECT)
|
||||
->where('parent')->eq($programID)
|
||||
->andWhere('type')->eq('project')
|
||||
->andWhere('deleted')->eq(0)
|
||||
->fetch();
|
||||
$allProjectsNum = $this->program->getProjectStats($programID, 'all');
|
||||
$this->view->allProjectsNum = $allProjectsNum;
|
||||
|
||||
$this->view->title = $this->lang->program->project;
|
||||
|
||||
@@ -35,7 +35,7 @@ js::set('browseType', $browseType);
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->project->empty;?></span>
|
||||
<?php if(empty($allProjectsNum->count)) common::printLink('project', 'createGuide', "programID=$programID", '<i class="icon icon-plus"></i> ' . $lang->project->create, '', 'class="btn btn-info btn-wide " data-toggle="modal"');?>
|
||||
<?php if(empty($allProjectsNum)) common::printLink('project', 'createGuide', "programID=$programID", '<i class="icon icon-plus"></i> ' . $lang->project->create, '', 'class="btn btn-info btn-wide " data-toggle="modal"');?>
|
||||
</p>
|
||||
</div>
|
||||
<?php else:?>
|
||||
|
||||
@@ -80,7 +80,7 @@ $lang->programplan->error = new stdclass();
|
||||
$lang->programplan->error->percentNumber = '"工作量比例"必须为数字';
|
||||
$lang->programplan->error->planFinishSmall = '"计划完成时间"必须大于"计划开始时间"';
|
||||
$lang->programplan->error->percentOver = '工作量占比累计不应当超过100%';
|
||||
$lang->programplan->error->createdTask = '已分解任务,不可添加子阶段';
|
||||
$lang->programplan->error->createdTask = '已分解任务,不可添加子阶段';
|
||||
$lang->programplan->error->parentWorkload = '子阶段的工作量之和不能大于父阶段的工作量:%s';
|
||||
$lang->programplan->error->parentDuration = '子阶段计划开始、计划完成不能超过父阶段';
|
||||
$lang->programplan->error->sameName = '阶段名称不能相同!';
|
||||
|
||||
@@ -309,10 +309,7 @@ class project extends control
|
||||
$programTitle = $this->loadModel('setting')->getItem('owner=' . $this->app->user->account . '&module=project&key=programTitle');
|
||||
$projectStats = $this->loadModel('program')->getProjectStats($programID, $browseType, $queryID, $orderBy, $pager, $programTitle);
|
||||
|
||||
$allProjectsNum = $this->dao->select('COUNT(id) AS count')->from(TABLE_PROJECT)
|
||||
->where('type')->eq('project')
|
||||
->andWhere('deleted')->eq(0)
|
||||
->fetch();
|
||||
$allProjectsNum = $this->loadModel('program')->getProjectStats($programID, 'all');
|
||||
$this->view->allProjectsNum = $allProjectsNum;
|
||||
|
||||
$this->view->title = $this->lang->project->browse;
|
||||
@@ -501,7 +498,7 @@ class project extends control
|
||||
}
|
||||
|
||||
if($this->app->tab == 'doc') unset($this->lang->doc->menu->project['subMenu']);
|
||||
if($this->app->tab == 'product' and isset($output['productID'])) $this->loadModel('product')->setMenu($output['productID']);
|
||||
if($this->app->tab == 'product' and !empty($output['productID'])) $this->loadModel('product')->setMenu($output['productID']);
|
||||
|
||||
$topProgramID = $this->program->getTopByID($programID);
|
||||
|
||||
@@ -982,7 +979,7 @@ class project extends control
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
$allExecution = $this->project->getStats($projectID, 'all');
|
||||
$this->view->allExecutionNum = count($allExecution);
|
||||
$this->view->allExecutionNum = empty($allExecution);
|
||||
|
||||
$this->view->title = $this->lang->execution->allExecutions;
|
||||
$this->view->position[] = $this->lang->execution->allExecutions;
|
||||
|
||||
@@ -180,14 +180,15 @@ function loadBranches(product)
|
||||
$inputgroup.find('select:last').each(disableSelectedBranch);
|
||||
disableSelectedProduct();
|
||||
}
|
||||
|
||||
var branchID = $('#branch' + index).val();
|
||||
loadPlans(product, branchID);
|
||||
});
|
||||
|
||||
if(!multiBranchProducts[$(product).val()]) disableSelectedProduct();
|
||||
|
||||
$("input[name='products[" + index + "]']").remove();
|
||||
$("input[name='branch[" + index + "]']").remove();
|
||||
|
||||
loadPlans(product);
|
||||
}
|
||||
|
||||
function loadPlans(product, branchID)
|
||||
|
||||
@@ -171,11 +171,10 @@ function setAclList(programID)
|
||||
* Load branches.
|
||||
*
|
||||
* @param int $product
|
||||
* @param int $branchID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function loadBranches(product, branchID)
|
||||
function loadBranches(product)
|
||||
{
|
||||
$("#productsBox select[name^='products']").each(function()
|
||||
{
|
||||
@@ -209,9 +208,8 @@ function loadBranches(product, branchID)
|
||||
if($inputgroup.find('select').size() >= 2) $inputgroup.removeClass('has-branch').find('select:last').remove();
|
||||
if($inputgroup.find('.chosen-container').size() >= 2) $inputgroup.find('.chosen-container:last').remove();
|
||||
|
||||
var oldBranchID = typeof(branchID) == 'undefined' ? 0 : branchID;
|
||||
var index = $inputgroup.find('select:first').attr('id').replace('products' , '');
|
||||
$.get(createLink('branch', 'ajaxGetBranches', "productID=" + $(product).val() + "&oldBranch=" + oldBranchID + "¶m=active"), function(data)
|
||||
$.get(createLink('branch', 'ajaxGetBranches', "productID=" + $(product).val() + "&oldBranch=0¶m=active"), function(data)
|
||||
{
|
||||
if(data)
|
||||
{
|
||||
@@ -221,11 +219,12 @@ function loadBranches(product, branchID)
|
||||
$inputgroup.find('select:last').each(disableSelectedBranch);
|
||||
disableSelectedProduct();
|
||||
}
|
||||
|
||||
var branchID = $('#branch' + index).val();
|
||||
loadPlans(product, branchID);
|
||||
});
|
||||
|
||||
if(!multiBranchProducts[$(product).val()]) disableSelectedProduct();
|
||||
|
||||
loadPlans(product, oldBranchID);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1588,7 +1588,7 @@ class projectModel extends model
|
||||
$errors = dao::getError();
|
||||
foreach($errors as $key => $error)
|
||||
{
|
||||
dao::$errors[$key][0] = 'project#' . $projectID . $error[0];
|
||||
dao::$errors[$key][0] = 'ID' . $projectID . $error[0];
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->project->empty;?></span>
|
||||
<?php if(empty($allProjectsNum->count)):?>
|
||||
<?php if(empty($allProjectsNum)):?>
|
||||
<?php if(!defined('TUTORIAL')):?>
|
||||
<?php if(common::hasPriv('project', 'create') and $browseType != 'bysearch') common::printLink('project', 'createGuide', "programID=$programID", '<i class="icon icon-plus"></i> ' . $lang->project->create, '', 'class="btn btn-info" data-toggle="modal"');?>
|
||||
<?php else:?>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-130px'><?php echo $lang->project->parent;?></th>
|
||||
<?php $disabled = $this->app->tab == 'product' ? 'disabled' : '';?>
|
||||
<?php $disabled = ($this->app->tab == 'product' and $productID) ? 'disabled' : '';?>
|
||||
<td><?php echo html::select('parent', $programList, $programID, "class='form-control chosen' onchange='setParentProgram(this.value)' $disabled");?></td>
|
||||
<?php if($disabled) echo html::hidden('parent', $programID);?>
|
||||
<td>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->execution->noExecution;?></span>
|
||||
<?php if(empty($allExecutionNum)):?>
|
||||
<?php if($allExecutionNum):?>
|
||||
<?php if(common::hasPriv('programplan', 'create') and $isStage):?>
|
||||
<?php echo html::a($this->createLink('programplan', 'create', "projectID=$projectID&productID=$productID"), "<i class='icon icon-plus'></i> " . $lang->programplan->create, '', "class='btn btn-info'");?>
|
||||
<?php else: ?>
|
||||
|
||||
@@ -57,7 +57,7 @@ $lang->reportList->product = new stdclass();
|
||||
$lang->reportList->test = new stdclass();
|
||||
$lang->reportList->staff = new stdclass();
|
||||
|
||||
$lang->reportList->project->lists[10] = "{$lang->execution->common} Abweichnung|reportprojectdeviation";
|
||||
$lang->reportList->project->lists[10] = "{$lang->execution->common} Abweichnung|report|projectdeviation";
|
||||
$lang->reportList->product->lists[10] = $lang->productCommon . ' Zusammenfassung|report|productsummary';
|
||||
$lang->reportList->test->lists[10] = 'Bugs gemeldet|report|bugcreate';
|
||||
$lang->reportList->test->lists[13] = 'Bugs zugeordnet|report|bugassign';
|
||||
@@ -109,8 +109,8 @@ $lang->report->mailTitle->todo = " Todo (%s),";
|
||||
$lang->report->mailTitle->testTask = " Test Aufgaben (%s),";
|
||||
|
||||
$lang->report->deviationDesc = 'According to the Closed Execution Deviation Rate = ((Total Cost - Total Estimate) / Total Estimate), the Deviation Rate is n/a when the Total Estimate is 0.';
|
||||
$lang->report->proVersion = '<a href="http://api.zentao.net/goto.php?item=proversion&from=reportpage" target="_blank">Testen Sie ZenTao Pro für mehr Informationen!</a>';
|
||||
$lang->report->proVersionEn = '<a href="http://api.zentao.pm/goto.php?item=proversion&from=reportpage" target="_blank">Testen Sie ZenTao Pro für mehr Informationen!</a>';
|
||||
$lang->report->proVersion = '<a href="https://www.zentao.net/page/enterprise.html" target="_blank">Testen Sie ZenTao Pro für mehr Informationen!</a>';
|
||||
$lang->report->proVersionEn = '<a href="https://www.zentao.pm/" etarget="_blank">Testen Sie ZenTao Pro für mehr Informationen!</a>';
|
||||
$lang->report->workloadDesc = 'Workload = the total left hours of all tasks of the user / selected days * hours per day.
|
||||
For example: the begin and end date is January 1st to January 7th, and the total work days is 5 days, 8 hours per day. The Work load is all unfinished tasks assigned to this user to be finished in 5 days, 8 hours per day.';
|
||||
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
.c-id {width: 50px;}
|
||||
.c-reason {width: 150px;}
|
||||
td[id^="duplicateStoryBox"].required:after {top: 6px; right: 2px;}
|
||||
|
||||
@@ -2,7 +2,7 @@ $(function()
|
||||
{
|
||||
$('#needNotReview').on('change', function()
|
||||
{
|
||||
$('#reviewer').attr('disabled', $(this).is(':checked') ? 'disabled' : null).trigger('chosen:updated');
|
||||
$('#reviewer').text('').attr('disabled', $(this).is(':checked') ? 'disabled' : null).trigger('chosen:updated');
|
||||
if($(this).is(':checked'))
|
||||
{
|
||||
$('#reviewerBox').removeClass('required');
|
||||
|
||||
@@ -1692,7 +1692,7 @@ class storyModel extends model
|
||||
}
|
||||
else
|
||||
{
|
||||
return print(js::error('story#' . $storyID . dao::getError(true)));
|
||||
helper::end(js::error('story#' . $storyID . dao::getError(true)));
|
||||
}
|
||||
if(!dao::isError()) $this->loadModel('score')->create('story', 'close', $storyID);
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<td class='pd-0'>
|
||||
<?php echo html::select("closedReasons[$storyID]", $reasonList, 'done', "class=form-control onchange=setDuplicateAndChild(this.value,$storyID) style='min-width: 80px'");?>
|
||||
</td>
|
||||
<td class='pd-0' id='<?php echo 'duplicateStoryBox' . $storyID;?>' <?php if($story->closedReason != 'duplicate') echo "style='display:none'";?>>
|
||||
<td class='pd-0 required' id='<?php echo 'duplicateStoryBox' . $storyID;?>' <?php if($story->closedReason != 'duplicate') echo "style='display:none'";?>>
|
||||
<?php echo html::input("duplicateStoryIDList[$storyID]", '', "class='form-control' placeholder='{$lang->idAB}'");?>
|
||||
</td>
|
||||
<td class='pd-0' id='<?php echo 'childStoryBox' . $storyID;?>' <?php if($story->closedReason != 'subdivided') echo "style='display:none'";?>>
|
||||
|
||||
+28
-19
@@ -342,6 +342,10 @@ class task extends control
|
||||
{
|
||||
$taskLink = $this->createLink('my', 'work', 'mode=task');
|
||||
}
|
||||
elseif($this->app->tab == 'project')
|
||||
{
|
||||
$taskLink = $this->createLink('project', 'execution', "browseType=all&projectID={$execution->project}");
|
||||
}
|
||||
else
|
||||
{
|
||||
$taskLink = $this->createLink('execution', 'browse', "executionID=$executionID");
|
||||
@@ -408,11 +412,11 @@ class task extends control
|
||||
if($story)
|
||||
{
|
||||
$moduleID = $story->module;
|
||||
$stories = $this->story->getExecutionStoryPairs($executionID, 0, 'all', $moduleID, 'short', 'unclosed');
|
||||
$stories = $this->story->getExecutionStoryPairs($executionID, 0, 'all', $moduleID, 'short', 'active');
|
||||
}
|
||||
else
|
||||
{
|
||||
$stories = $this->story->getExecutionStoryPairs($executionID, 0, 'all', 0, 'short', 'unclosed');
|
||||
$stories = $this->story->getExecutionStoryPairs($executionID, 0, 'all', 0, 'short', 'active');
|
||||
}
|
||||
|
||||
$members = $this->loadModel('user')->getTeamMemberPairs($executionID, 'execution', 'nodeleted');
|
||||
@@ -1213,7 +1217,6 @@ class task extends control
|
||||
if($task->consumed - $estimate->consumed == 0)
|
||||
{
|
||||
$actionID = $this->loadModel('action')->create('task', $estimate->task, 'Adjusttasktowait');
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
}
|
||||
if($task->consumed - $estimate->consumed == 0)
|
||||
{
|
||||
@@ -1911,31 +1914,37 @@ class task extends control
|
||||
$execution = $this->dao->findById($executionID)->from(TABLE_EXECUTION)->fetch();
|
||||
|
||||
$tasks = $this->dao->select('*')->from(TABLE_TASK)
|
||||
->where('deleted')->eq(0)
|
||||
->where('deleted')->eq('0')
|
||||
->andWhere('status')->notin('closed,cancel')
|
||||
->andWhere('parent')->le('0')
|
||||
->andWhere('execution')->eq($executionID)
|
||||
->andWhere('id')->gt($maxTaskID)
|
||||
->orderBy('id_asc')
|
||||
->limit(50)
|
||||
->fetchAll('id');
|
||||
|
||||
$users = $this->loadModel('user')->getPairs('noletter|nodeleted');
|
||||
foreach($tasks as $task)
|
||||
{
|
||||
if($task->parent > 0)
|
||||
{
|
||||
if(isset($tasks[$task->parent]))
|
||||
{
|
||||
$tasks[$task->parent]->children[$task->id] = $task;
|
||||
unset($tasks[$task->id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(empty($tasks)) die('');
|
||||
|
||||
$parentGroup = $this->dao->select('*')->from(TABLE_TASK)
|
||||
->where('parent')->in(array_keys($tasks))
|
||||
->andWhere('parent')->gt('0')
|
||||
->andWhere('deleted')->eq('0')
|
||||
->fetchGroup('parent', 'id');
|
||||
|
||||
$users = $this->loadModel('user')->getPairs('noletter|nodeleted');
|
||||
foreach($tasks as $taskID => $task)
|
||||
{
|
||||
if(isset($parentGroup[$taskID]))
|
||||
{
|
||||
$tasks[$taskID]->children = $parentGroup[$taskID];
|
||||
}
|
||||
else
|
||||
{
|
||||
$tasks[$taskID]->children = array();
|
||||
}
|
||||
}
|
||||
|
||||
$list = '';
|
||||
$tasks = array_chunk($tasks, 50, true);
|
||||
$tasks = $tasks[0];
|
||||
$count = count($tasks);
|
||||
foreach($tasks as $task)
|
||||
{
|
||||
|
||||
@@ -2842,7 +2842,7 @@ class taskModel extends model
|
||||
elseif($consumed == 0)
|
||||
{
|
||||
$data->status = 'wait';
|
||||
$data->left = $task->left + $estimate->consumed;
|
||||
$data->left = $task->estimate;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -365,6 +365,6 @@ $config->delete['17_2'][] = 'extension/lite/workflowrelation/ext/view/admin.flow
|
||||
$config->delete['17_2'][] = 'extension/lite/extension/lite/workflowrule/ext/view/browse.flow.html.hook.php';
|
||||
$config->delete['17_2'][] = 'extension/lite/extension/lite/workflowrule/ext/view/view.flow.html.hook.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', 'projectrelease', 'projectstory', 'qa', 'release', 'repo', 'report', 'risk', 'score', 'search', 'setting', 'sonarqube', 'sso', 'stage', 'stakeholder', 'story', 'subject', 'svn', 'task', 'testcase', 'testreport', 'testsuite', 'testtask', 'todo', 'tree', 'tutorial', 'upgrade', 'user', 'webhook', 'weekly', 'workestimation');
|
||||
$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', 'projectrelease', 'projectstory', 'qa', 'release', 'repo', 'report', 'risk', 'score', 'search', 'setting', 'sonarqube', 'sso', 'stage', 'stakeholder', 'story', 'subject', 'svn', 'task', 'testcase', 'testreport', 'testsuite', 'testtask', 'todo', 'tree', 'tutorial', 'upgrade', 'user', 'webhook', 'weekly', 'workestimation', 'gitea');
|
||||
|
||||
$config->upgrade->unsetModules = array('design', 'program', 'programplan', 'projectbuild', 'projectrelease', 'stage', 'stakeholder', 'product', 'branch', 'productplan', 'release', 'build', 'qa', 'bug', 'testcase', 'testtask', 'testreport', 'testsuite', 'caselib', 'automation', 'repo', 'ci', 'compile', 'jenkins', 'job', 'svn', 'gitlab', 'sonarqube', 'mr', 'git', 'report', 'sqlbuilder', 'feedback', 'faq', 'attend', 'holiday', 'leave', 'makeup', 'overtime', 'lieu', 'ops', 'host', 'serverroom', 'account', 'domain', 'service', 'deploy', 'conference', 'traincourse', 'pssp', 'baseline', 'classify', 'cm', 'cmcl', 'auditcl', 'reviewcl', 'process', 'activity', 'zoutput', 'auditplan', 'nc', 'subject', 'weekly', 'workestimation', 'issue', 'durationestimation', 'risk', 'opportunity', 'trainplan', 'gapanalysis', 'researchplan', 'researchreport', 'meeting', 'meetingroom', 'budget', 'reviewissue', 'reviewsetting', 'review', 'milestone', 'measurement', 'measrecord', 'assetlib', 'setting', 'im', 'client', 'ldap', 'dev', 'api');
|
||||
$config->upgrade->unsetModules = array('design', 'program', 'programplan', 'projectbuild', 'projectrelease', 'stage', 'stakeholder', 'product', 'branch', 'productplan', 'release', 'build', 'qa', 'bug', 'testcase', 'testtask', 'testreport', 'testsuite', 'caselib', 'automation', 'repo', 'ci', 'compile', 'jenkins', 'job', 'svn', 'gitlab', 'sonarqube', 'mr', 'git', 'report', 'sqlbuilder', 'feedback', 'faq', 'attend', 'holiday', 'leave', 'makeup', 'overtime', 'lieu', 'ops', 'host', 'serverroom', 'account', 'domain', 'service', 'deploy', 'conference', 'traincourse', 'pssp', 'baseline', 'classify', 'cm', 'cmcl', 'auditcl', 'reviewcl', 'process', 'activity', 'zoutput', 'auditplan', 'nc', 'subject', 'weekly', 'workestimation', 'issue', 'durationestimation', 'risk', 'opportunity', 'trainplan', 'gapanalysis', 'researchplan', 'researchreport', 'meeting', 'meetingroom', 'budget', 'reviewissue', 'reviewsetting', 'review', 'milestone', 'measurement', 'measrecord', 'assetlib', 'setting', 'im', 'client', 'ldap', 'dev', 'api', 'gitea');
|
||||
|
||||
Reference in New Issue
Block a user