Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms into sprint/244_wzm_70007

This commit is contained in:
wangzemei
2022-10-09 15:19:48 +08:00
27 changed files with 235 additions and 92 deletions
+10 -8
View File
@@ -172,6 +172,7 @@ $filter->tree->browse = new stdclass();
$filter->productplan->browse = new stdclass();
$filter->kanban->space = new stdclass();
$filter->execution->kanban = new stdclass();
$filter->execution->all = new stdclass();
$filter->index->index->get['open'] = 'reg::base64';
@@ -300,14 +301,15 @@ $filter->productplan->browse->cookie['viewType'] = 'code';
$filter->task->create->cookie['lastTaskModule'] = 'int';
$filter->task->export->cookie['checkedItem'] = 'reg::checked';
$filter->execution->default->cookie['kanbanview'] = 'code';
$filter->execution->story->cookie['storyPreExecutionID'] = 'int';
$filter->execution->story->cookie['storyModuleParam'] = 'int';
$filter->execution->story->cookie['storyProductParam'] = 'int';
$filter->execution->story->cookie['storyBranchParam'] = 'int';
$filter->execution->story->cookie['executionStoryOrder'] = 'code';
$filter->execution->export->cookie['checkedItem'] = 'reg::checked';
$filter->execution->kanban->cookie['taskToOpen'] = 'int';
$filter->execution->default->cookie['kanbanview'] = 'code';
$filter->execution->story->cookie['storyPreExecutionID'] = 'int';
$filter->execution->story->cookie['storyModuleParam'] = 'int';
$filter->execution->story->cookie['storyProductParam'] = 'int';
$filter->execution->story->cookie['storyBranchParam'] = 'int';
$filter->execution->story->cookie['executionStoryOrder'] = 'code';
$filter->execution->export->cookie['checkedItem'] = 'reg::checked';
$filter->execution->kanban->cookie['taskToOpen'] = 'int';
$filter->execution->all->cookie['showExecutionBatchEdit'] = 'int';
$filter->testcase->browse->cookie['caseModule'] = 'int';
$filter->testcase->browse->cookie['caseSuite'] = 'int';
+1 -1
View File
@@ -1004,6 +1004,7 @@ class baseRouter
array($ztSessionHandler, "destroy"),
array($ztSessionHandler, "gc")
);
register_shutdown_function('session_write_close');
}
}
@@ -3167,7 +3168,6 @@ class ztSessionHandler
{
$this->tagID = $tagID;
ini_set('session.save_handler', 'files');
register_shutdown_function('session_write_close');
}
/**
+11 -7
View File
@@ -8,7 +8,7 @@ $config->execution->ownerFields = array('PO', 'PM', 'QD', 'RD');
$config->execution->defaultBurnPeriod = 30;
$config->execution->list = new stdclass();
$config->execution->list->exportFields = 'id,name,projectName,code,PM,begin,end,status,totalEstimate,totalConsumed,totalLeft,progress';
$config->execution->list->exportFields = 'id,name,projectName,PM,begin,end,status,totalEstimate,totalConsumed,totalLeft,progress';
$config->execution->modelList['scrum'] = 'sprint';
$config->execution->modelList['waterfall'] = 'stage';
@@ -135,6 +135,7 @@ $config->execution->all->search['fields']['realEnd'] = $lang->execution->
$config->execution->all->search['fields']['closedBy'] = $lang->execution->closedBy;
$config->execution->all->search['fields']['lastEditedDate'] = $lang->execution->lastEditedDate;
$config->execution->all->search['fields']['closedDate'] = $lang->execution->closedDate;
$config->execution->all->search['fields']['teamCount'] = $lang->execution->teamCount;
$config->execution->all->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
$config->execution->all->search['params']['id'] = array('operator' => '=', 'control' => 'input', 'values' => '');
@@ -150,6 +151,7 @@ $config->execution->all->search['params']['realEnd'] = array('operator' =
$config->execution->all->search['params']['closedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
$config->execution->all->search['params']['lastEditedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
$config->execution->all->search['params']['closedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
$config->execution->all->search['params']['teamCount'] = array('operator' => '=', 'control' => 'input', 'values' => '');
$config->printKanban = new stdClass();
$config->printKanban->col['story'] = 1;
@@ -173,11 +175,7 @@ $config->execution->gantt->linkType['end']['end'] = 2;
$config->execution->gantt->linkType['begin']['end'] = 3;
$config->execution->datatable = new stdclass();
if((!isset($config->setCode) or $config->setCode == 1) and $config->systemMode == 'new')
{
$config->execution->datatable->defaultField = array('id', 'name', 'code', 'project', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn');
}
elseif($config->systemMode == 'new')
if($config->systemMode == 'new')
{
$config->execution->datatable->defaultField = array('id', 'name', 'project', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn');
}
@@ -208,7 +206,7 @@ if($config->systemMode == 'new')
{
$config->execution->datatable->fieldList['project']['title'] = 'project';
$config->execution->datatable->fieldList['project']['fixed'] = 'no';
$config->execution->datatable->fieldList['project']['width'] = '100';
$config->execution->datatable->fieldList['project']['width'] = '128';
$config->execution->datatable->fieldList['project']['required'] = 'no';
}
@@ -255,6 +253,12 @@ $config->execution->datatable->fieldList['realEnd']['width'] = '90';
$config->execution->datatable->fieldList['realEnd']['required'] = 'no';
$config->execution->datatable->fieldList['realEnd']['sort'] = 'no';
$config->execution->datatable->fieldList['teamCount']['title'] = 'teamCount';
$config->execution->datatable->fieldList['teamCount']['fixed'] = 'no';
$config->execution->datatable->fieldList['teamCount']['width'] = '80';
$config->execution->datatable->fieldList['teamCount']['required'] = 'no';
$config->execution->datatable->fieldList['teamCount']['sort'] = 'no';
$config->execution->datatable->fieldList['estimate']['title'] = 'estimate';
$config->execution->datatable->fieldList['estimate']['fixed'] = 'no';
$config->execution->datatable->fieldList['estimate']['width'] = '70';
+1
View File
@@ -3760,6 +3760,7 @@ class execution extends control
$this->view->from = $from;
$this->view->param = $param;
$this->view->isStage = (isset($project->model) and $project->model == 'waterfall') ? true : false;
$this->view->showBatchEdit = $this->cookie->showExecutionBatchEdit;
$this->display();
}
+1 -1
View File
@@ -27,7 +27,7 @@ td.flex span.project-type-label {min-width: 40px;}
.c-name > a, .table-children .text-left > a {padding-left: 5px;}
.has-child > span {margin-right: 5px;}
.c-name > .text-ellipsis {text-overflow: clip;}
.c-code, .c-project {overflow: hidden; white-space: nowrap;}
.c-code, .c-project {overflow: hidden; white-space: nowrap; padding: 0 8px;}
th.c-status, .c-begin, .c-end, .c-realBegan, .c-realEnd {text-align: center;}
.c-project{text-overflow: unset !important;}
+3 -3
View File
@@ -4,6 +4,6 @@
#productsBox .product.checked:hover {background: #E5FFE6; border: 1px solid #229F24;}
#productsBox .product .checkbox-primary {padding: 9px; cursor: pointer;}
#productsBox .product.has-branch {padding-right: 40%;}
#productsBox .product.has-branch > .chosen-container {position: absolute; width: 40% !important; right: 3px; top: 3px;}
#productsBox .product.has-branch > .chosen-container > .chosen-single {background: rgba(0,0,0,.05);}
#productsBox .product.has-branch > .chosen-container > .chosen-single:hover {background: #fff;}
#productsBox .product.has-branch > .picker {position: absolute; width: 40% !important; right: 3px; top: 3px; background-color: unset;}
#productsBox .product.has-branch > .picker > .picker-selections {background: rgba(0,0,0,.05);}
#productsBox .product.has-branch > .picker > .picker-selections:hover {background: #fff;}
+62 -3
View File
@@ -1,5 +1,17 @@
$(function()
{
$("#" + status + "Tab").addClass('btn-active-text');
$(document).on('click', '.plan-toggle', function(e)
{
var id = $(this).data('id');
var $toggle = $(this);
var isCollapsed = $toggle.toggleClass('collapsed').hasClass('collapsed');
$toggle.closest('#executionsForm').find('tr.parent-' + id).toggle(!isCollapsed);
e.stopPropagation();
e.preventDefault();
});
$('#executionTableList').on('sort.sortable', function(e, data)
{
var list = '';
@@ -60,6 +72,7 @@ $(function()
}
});
/* Update table summary text. */
$('#executionsForm').table(
{
statisticCreator: function(table)
@@ -67,21 +80,67 @@ $(function()
var $table = table.getTable();
var $checkedRows = $table.find(table.isDataTable ? '.datatable-row-left.checked' : 'tbody>tr.checked');
var $originTable = table.isDataTable ? table.$.find('.datatable-origin') : null;
var $rows = $table.find(table.isDataTable ? '.datatable-rows .datatable-row-left' : 'tbody>tr');
var checkedTotal = $checkedRows.length;
var $rows = checkedTotal ? $checkedRows : $table.find(table.isDataTable ? '.datatable-rows .datatable-row-left' : 'tbody>tr');
var taskIdList = [];
var checkedWait = 0;
var checkedDoing = 0;
var executionIDList = [];
$rows.each(function()
{
var $row = $(this);
if($originTable) $row = $originTable.find('tbody>tr[data-id="' + $row.data('id') + '"]');
var data = $row.data();
taskIdList.push(data.id);
executionIDList.push(data.id);
if(data.status === 'wait') checkedWait++;
if(data.status === 'doing') checkedDoing++;
});
if(status != 'all') return (checkedTotal ? checkedExecutions : executionSummary).replace('%s', $rows.length);
return (checkedTotal ? checkedSummary : pageSummary).replace('%total%', $rows.length).replace('%wait%', checkedWait).replace('%doing%', checkedDoing);
}
})
$('input[name^="showEdit"]').click(function()
{
$.cookie('showExecutionBatchEdit', $(this).is(':checked') ? 1 : 0, {expires: config.cookieLife, path: config.webRoot});
setCheckbox();
});
setCheckbox();
$('#executionTableList tr').on('click', function(e)
{
if($.cookie('showExecutionBatchEdit') != 1) e.stopPropagation();
});
});
/**
* Location to product list.
*
* @param int productID
* @param int projectID
* @param string status
* @access public
* @return void
*/
function byProduct(productID, projectID, status)
{
location.href = createLink('project', 'all', "status=" + status + "&project=" + projectID + "&orderBy=" + orderBy + '&productID=' + productID);
}
/**
* Set batch edit checkbox.
*
* @access public
* @return void
*/
function setCheckbox()
{
$('#executionsForm .checkbox-primary').hide();
$('.check-all, .sortable tr').removeClass('checked');
$(":checkbox[name^='executionIDList']").prop('checked', false);
$('#executionsForm').removeClass('has-row-checked');
if($.cookie('showExecutionBatchEdit') == 1) $('#executionsForm .checkbox-primary').show();
}
+5 -1
View File
@@ -54,6 +54,7 @@ $lang->execution->end = 'Ende';
$lang->execution->dateRange = 'Dauer';
$lang->execution->realBeganAB = 'Actual Begin';
$lang->execution->realEndAB = 'Actual End';
$lang->execution->teamCount = 'Anzahl der Personen';
$lang->execution->realBegan = 'Tatsächlicher Start';
$lang->execution->realEnd = 'Tatsächliches Ende';
$lang->execution->to = 'An';
@@ -341,6 +342,9 @@ $lang->execution->stats = '<strong>%s</strong> Verfügbar, <stron
$lang->execution->taskSummary = "Aufgaben auf dieser Seite: <strong>%s</strong> Total, <strong>%s</strong> Wartend, <strong>%s</strong> In Arbeit; &nbsp;&nbsp;&nbsp; Stunden : <strong>%s</strong> geplant., <strong>%s</strong> genutzt, <strong>%s</strong> Rest.";
$lang->execution->pageSummary = "Aufgaben auf dieser Seite: <strong>%total%</strong>, <strong>%wait%</strong> Wartend, <strong>%doing%</strong> In Arbeit; Stunden: <strong>%estimate%</strong> geplant, <strong>%consumed%</strong> genutzt, <strong>%left%</strong> Rest.";
$lang->execution->checkedSummary = " <strong>%total%</strong> Geprüft, <strong>%wait%</strong> Wartend, <strong>%doing%</strong> In Arbeit; Stunden: <strong>%estimate%</strong> geplant, <strong>%consumed%</strong> genutzt, <strong>%left%</strong> Rest.";
$lang->execution->executionSummary = "Total executions: <strong>%s</strong>.";
$lang->execution->pageExecSummary = "Total executions: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
$lang->execution->checkedExecSummary = "Selected: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
$lang->execution->memberHoursAB = "%s hat <strong>%s</strong> Stunden";
$lang->execution->memberHours = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">%s Arbeitsstunden</div><div class="segment-value">%s</div></div></div></div>';
$lang->execution->countSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">Aufgaben</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">In Arbeit</div><div class="segment-value"><span class="label label-dot label-primary"></span> %s</div></div><div class="segment"><div class="segment-title">Wait</div><div class="segment-value"><span class="label label-dot label-primary muted"></span> %s</div></div></div></div>';
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is not ac
$lang->execution->countTip = ' (%s member)';
$lang->execution->pleaseInput = "Enter";
$lang->execution->week = 'week';
$lang->execution->checkedExecutions = 'Seleted %s items';
$lang->execution->checkedExecutions = 'Seleted %s executions.';
/* Statistics. */
$lang->execution->charts = new stdclass();
+5 -1
View File
@@ -54,6 +54,7 @@ $lang->execution->end = 'Planned End';
$lang->execution->dateRange = 'Plan Duration';
$lang->execution->realBeganAB = 'Actual Begin';
$lang->execution->realEndAB = 'Actual End';
$lang->execution->teamCount = 'number of people';
$lang->execution->realBegan = 'Actual Begin';
$lang->execution->realEnd = 'Actual End';
$lang->execution->to = 'To';
@@ -341,6 +342,9 @@ $lang->execution->stats = 'Available: <strong>%s</strong>(h). Est
$lang->execution->taskSummary = "Total tasks on this page:<strong>%s</strong>. Waiting: <strong>%s</strong>. Doing: <strong>%s</strong>. &nbsp;&nbsp;&nbsp; Estimates: <strong>%s</strong>(h). Cost: <strong>%s</strong>(h). Left: <strong>%s</strong>(h).";
$lang->execution->pageSummary = "Total tasks: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>. Estimates: <strong>%estimate%</strong>(h). Cost: <strong>%consumed%</strong>(h). Left: <strong>%left%</strong>(h).";
$lang->execution->checkedSummary = "Selected: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>. Estimates: <strong>%estimate%</strong>(h). Cost: <strong>%consumed%</strong>(h). Left: <strong>%left%</strong>(h).";
$lang->execution->executionSummary = "Total executions: <strong>%s</strong>.";
$lang->execution->pageExecSummary = "Total executions: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
$lang->execution->checkedExecSummary = "Selected: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
$lang->execution->memberHoursAB = "%s has <strong>%s</ strong> hours.";
$lang->execution->memberHours = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">%s Available Hours</div><div class="segment-value">%s</div></div></div></div>';
$lang->execution->countSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">Tasks</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">Doing</div><div class="segment-value"><span class="label label-dot label-primary"></span> %s</div></div><div class="segment"><div class="segment-title">Waiting</div><div class="segment-value"><span class="label label-dot label-primary muted"></span> %s</div></div></div></div>';
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is not ac
$lang->execution->countTip = ' (%s member)';
$lang->execution->pleaseInput = "Enter";
$lang->execution->week = 'week';
$lang->execution->checkedExecutions = 'Seleted %s items';
$lang->execution->checkedExecutions = 'Seleted %s executions.';
/* Statistics. */
$lang->execution->charts = new stdclass();
+5 -1
View File
@@ -54,6 +54,7 @@ $lang->execution->end = 'Fin';
$lang->execution->dateRange = 'Durée';
$lang->execution->realBeganAB = 'Actual Begin';
$lang->execution->realEndAB = 'Actual End';
$lang->execution->teamCount = 'nombre de personnes';
$lang->execution->realBegan = 'Début effectif';
$lang->execution->realEnd = 'Clôture effective';
$lang->execution->to = 'à';
@@ -341,6 +342,9 @@ $lang->execution->stats = 'Disponible: <strong>%s</strong>(h). Es
$lang->execution->taskSummary = "Total des tâches de cette page :<strong>%s</strong>. A Faire: <strong>%s</strong>. En cours: <strong>%s</strong>. &nbsp;&nbsp;&nbsp; Estimé: <strong>%s</strong>(h). Coût: <strong>%s</strong>(h). Reste: <strong>%s</strong>(h).";
$lang->execution->pageSummary = "Total des tâches de cette page: <strong>%total%</strong>. A Faire: <strong>%wait%</strong>. En cours: <strong>%doing%</strong>. &nbsp;&nbsp;&nbsp; Estimé: <strong>%estimate%</strong>(h). Coût: <strong>%consumed%</strong>(h). Reste: <strong>%left%</strong>(h).";
$lang->execution->checkedSummary = "Sélectionné: <strong>%total%</strong>. A Faire: <strong>%wait%</strong>. En cours: <strong>%doing%</strong>. &nbsp;&nbsp;&nbsp; Estimé: <strong>%estimate%</strong>(h). Coût: <strong>%consumed%</strong>(h). Reste: <strong>%left%</strong>(h).";
$lang->execution->executionSummary = "Total executions: <strong>%s</strong>.";
$lang->execution->pageExecSummary = "Total executions: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
$lang->execution->checkedExecSummary = "Selected: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
$lang->execution->memberHoursAB = "%s a <strong>%s</ strong> heures.";
$lang->execution->memberHours = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">%s Heures Disponibles</div><div class="segment-value">%s</div></div></div></div>';
$lang->execution->countSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">Tâches</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">En Cours</div><div class="segment-value"><span class="label label-dot label-primary"></span> %s</div></div><div class="segment"><div class="segment-title">A Faire</div><div class="segment-value"><span class="label label-dot label-primary muted"></span> %s</div></div></div></div>';
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is not ac
$lang->execution->countTip = ' (%s member)';
$lang->execution->pleaseInput = "Enter";
$lang->execution->week = 'week';
$lang->execution->checkedExecutions = "Pour s électionner l'élément%s";
$lang->execution->checkedExecutions = "Pour s électionner l'élément%s.";
/* Statistics. */
$lang->execution->charts = new stdclass();
+1
View File
@@ -54,6 +54,7 @@ $lang->execution->RD = 'Quản lý phát hành';
$lang->execution->release = 'Phát hành';
$lang->execution->acl = 'Quyền truy cập';
$lang->execution->teamname = 'Tên đội nhóm';
$lang->execution->teamCount = 'số người';
$lang->execution->order = "Đánh giá {$lang->executionCommon}";
$lang->execution->orderAB = "Đánh giá";
$lang->execution->products = "Liên kết {$lang->productCommon}";
+5 -1
View File
@@ -54,6 +54,7 @@ $lang->execution->end = '计划完成';
$lang->execution->dateRange = '计划起止日期';
$lang->execution->realBeganAB = '实际开始';
$lang->execution->realEndAB = '实际完成';
$lang->execution->teamCount = '人数';
$lang->execution->realBegan = '实际开始日期';
$lang->execution->realEnd = '实际完成日期';
$lang->execution->to = '至';
@@ -341,6 +342,9 @@ $lang->execution->stats = '可用工时 <strong>%s</strong> 工
$lang->execution->taskSummary = "本页共 <strong>%s</strong> 个任务,未开始 <strong>%s</strong>,进行中 <strong>%s</strong>,总预计 <strong>%s</strong> 工时,已消耗 <strong>%s</strong> 工时,剩余 <strong>%s</strong> 工时。";
$lang->execution->pageSummary = "本页共 <strong>%total%</strong> 个任务,未开始 <strong>%wait%</strong>,进行中 <strong>%doing%</strong>,总预计 <strong>%estimate%</strong> 工时,已消耗 <strong>%consumed%</strong> 工时,剩余 <strong>%left%</strong> 工时。";
$lang->execution->checkedSummary = "选中 <strong>%total%</strong> 个任务,未开始 <strong>%wait%</strong>,进行中 <strong>%doing%</strong>,总预计 <strong>%estimate%</strong> 工时,已消耗 <strong>%consumed%</strong> 工时,剩余 <strong>%left%</strong> 工时。";
$lang->execution->executionSummary = "本页共 <strong>%s</strong> 个{$lang->executionCommon}。";
$lang->execution->pageExecSummary = "本页共 <strong>%total%</strong> 个{$lang->executionCommon},未开始 <strong>%wait%</strong>,进行中 <strong>%doing%</strong>。";
$lang->execution->checkedExecSummary = "选中 <strong>%total%</strong> 个{$lang->executionCommon},未开始 <strong>%wait%</strong>,进行中 <strong>%doing%</strong>。";
$lang->execution->memberHoursAB = "<div>%s有 <strong>%s</strong> 工时</div>";
$lang->execution->memberHours = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">%s可用工时</div><div class="segment-value">%s</div></div></div></div>';
$lang->execution->countSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">总任务</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">进行中</div><div class="segment-value"><span class="label label-dot label-primary"></span> %s</div></div><div class="segment"><div class="segment-title">未开始</div><div class="segment-value"><span class="label label-dot label-primary muted"></span> %s</div></div></div></div>';
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "该{$lang->SRCommon}不是激
$lang->execution->countTip = '(%s人)';
$lang->execution->pleaseInput = "请输入";
$lang->execution->week = '周';
$lang->execution->checkedExecutions = '已选择%s项';
$lang->execution->checkedExecutions = "共选中%s个{$lang->execution->common}。";
/* 统计。*/
$lang->execution->charts = new stdclass();
+1
View File
@@ -54,6 +54,7 @@ $lang->execution->execPM = "{$lang->execution->common}負責人";
$lang->execution->QD = '測試負責人';
$lang->execution->RD = '發佈負責人';
$lang->execution->release = '發佈';
$lang->execution->teamCount = '人數';
$lang->execution->acl = '訪問控制';
$lang->execution->teamname = '團隊名稱';
$lang->execution->updateOrder = '排序';
+21 -2
View File
@@ -1531,6 +1531,15 @@ class executionModel extends model
$hours = $this->loadModel('project')->computerProgress($executions);
$burns = $this->getBurnData($executions);
/* Get the number of execution teams. */
$teams = $this->dao->select('t1.root,count(t1.id) as teams')->from(TABLE_TEAM)->alias('t1')
->leftJoin(TABLE_USER)->alias('t2')->on('t1.account=t2.account')
->where('t1.root')->in(array_keys($executions))
->andWhere('t1.type')->ne('project')
->andWhere('t2.deleted')->eq(0)
->groupBy('t1.root')
->fetchAll('root');
if($withTasks) $executionTasks = $this->getTaskGroupByExecution(array_keys($executions));
/* Process executions. */
@@ -1557,6 +1566,7 @@ class executionModel extends model
/* Process the hours. */
$execution->hours = isset($hours[$execution->id]) ? $hours[$execution->id] : (object)$emptyHour;
$execution->teamCount = isset($teams[$execution->id]) ? $teams[$execution->id]->teams : 0;
if(isset($executionTasks) and isset($executionTasks[$execution->id]))
{
@@ -4582,12 +4592,12 @@ class executionModel extends model
if(!$isChild)
{
$trClass = 'is-top-level table-nest-child-hide';
$trAttrs = "data-id='$execution->id' data-order='$execution->order' data-nested='true'";
$trAttrs = "data-id='$execution->id' data-order='$execution->order' data-nested='true' data-status={$execution->status}";
}
else
{
$trClass = 'table-nest-hide';
$trAttrs = "data-id={$execution->id} data-parent={$execution->parent}";
$trAttrs = "data-id={$execution->id} data-parent={$execution->parent} data-status={$execution->status}";
$trAttrs .= " data-nest-parent='$execution->parent' data-order='$execution->order' data-nest-path=',$execution->parent,$execution->id,'";
}
@@ -4841,6 +4851,12 @@ class executionModel extends model
if(!empty($execution->children)) $class .= ' has-child';
}
if($id == 'teamCount')
{
$title = " title='{$execution->teamCount}'";
$class .= ' text-right';
}
if($id == 'project') $title = " title='{$execution->projectName}'";
if($id == 'code') $title = " title='{$execution->code}'";
@@ -4909,6 +4925,9 @@ class executionModel extends model
case 'begin':
echo helper::isZeroDate($execution->begin) ? '' : $execution->begin;
break;
case 'teamCount':
echo $execution->teamCount;
break;
case 'end':
echo helper::isZeroDate($execution->end) ? '' : $execution->end;
break;
+10 -18
View File
@@ -19,14 +19,19 @@ $useDatatable = (isset($config->datatable->$datatableId->mode) and $config->data
<?php js::set('unfoldExecutions', array());?>
<?php js::set('useDatatable', $useDatatable);?>
<?php js::set('from', $from);?>
<?php js::set('checkedSummary', $lang->execution->checkedExecSummary);?>
<?php js::set('pageSummary', $lang->execution->pageExecSummary);?>
<?php js::set('executionSummary', $lang->execution->executionSummary);?>
<?php js::set('checkedExecutions', $lang->execution->checkedExecutions);?>
<?php
/* Set unfold parent executionID. */
js::set('unfoldAll', $lang->execution->treeLevel['all']);
js::set('foldAll', $lang->execution->treeLevel['root']);
js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
?>
<?php $canBatchEdit = common::hasPriv('execution', 'batchEdit');?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<div class='btn-toolBar pull-left'>
<?php if($from == 'project'):?>
<div class='btn-group'>
<?php $viewName = $productID != 0 ? zget($productList,$productID) : $lang->product->allProduct;?>
@@ -51,6 +56,7 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
<?php if($status == $key) $label .= " <span class='label label-light label-badge'>{$pager->recTotal}</span>";?>
<?php echo html::a($this->createLink($this->app->rawModule, $this->app->rawMethod, "status=$key&orderBy=$orderBy&productID=$productID"), $label, '', "class='btn btn-link' id='{$key}Tab' data-app='$from'");?>
<?php endforeach;?>
<?php if($canBatchEdit) echo html::checkbox('showEdit', array('1' => $lang->execution->editAction), $showBatchEdit);?>
<a class="btn btn-link querybox-toggle" id='bysearchTab'><i class="icon icon-search muted"></i> <?php echo $lang->execution->byQuery;?></a>
</div>
<div class='btn-toolbar pull-right'>
@@ -72,8 +78,7 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
</p>
</div>
<?php else:?>
<?php $canBatchEdit = common::hasPriv('execution', 'batchEdit'); ?>
<form class='main-table' id='executionsForm' method='post' action='<?php echo inLink('batchEdit');?>' <?php if(!$useDatatable) echo "data-ride='table'";?>>
<form class='main-table' id='executionsForm' method='post' action='<?php echo inLink('batchEdit');?>'>
<div class="table-header fixed-right">
<nav class="btn-toolbar pull-right setting"></nav>
</div>
@@ -106,7 +111,7 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
</thead>
<tbody class='sortable' id='executionTableList'>
<?php foreach($executionStats as $execution):?>
<tr data-id='<?php echo $execution->id ?>' data-order='<?php echo $execution->order ?>'>
<tr data-id='<?php echo $execution->id ?>' data-order='<?php echo $execution->order ?>' data-status='<?php echo $execution->status?>'>
<?php foreach($setting as $key => $value) $this->execution->printCell($value, $execution, $users, $useDatatable ? 'datatable' : 'table', $isStage, $productID);?>
</tr>
<?php if(!empty($execution->children)):?>
@@ -130,28 +135,15 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
<div class="checkbox-primary check-all"><label><?php echo $lang->selectAll?></label></div>
<div class="table-actions btn-toolbar">
<?php echo html::submitButton($lang->execution->batchEdit, '', 'btn');?>
<div class="table-statistic"></div>
</div>
<?php endif;?>
<div class="table-statistic"></div>
<?php $pager->show('right', 'pagerjs');?>
</div>
<?php endif;?>
</form>
<?php endif;?>
</div>
<script>
$("#<?php echo $status;?>Tab").addClass('btn-active-text');
$(document).on('click', '.plan-toggle', function(e)
{
var $toggle = $(this);
var id = $(this).data('id');
var isCollapsed = $toggle.toggleClass('collapsed').hasClass('collapsed');
$toggle.closest('[data-ride="table"]').find('tr.parent-' + id).toggle(!isCollapsed);
e.stopPropagation();
e.preventDefault();
});
</script>
<?php js::set('orderBy', $orderBy)?>
<?php js::set('status', $status)?>
<?php include '../../common/view/footer.html.php';?>
@@ -39,7 +39,7 @@
<?php echo "<input type='checkbox' name='products[$i]' value='$productID' $checked $attr id='products{$productID}'>";?>
<label class='text-ellipsis checkbox-inline' for='<?php echo 'products' . $productID;?>' title='<?php echo $productName;?>'><?php echo $productName;?></label>
</div>
<?php if(isset($allBranches[$productID][$branchID])) echo html::select("branch[$i]", $allBranches[$productID], $branchID, "class='form-control chosen' disabled='disabled'");?>
<?php if(isset($allBranches[$productID][$branchID])) echo html::select("branch[$i]", $allBranches[$productID], $branchID, "class='form-control picker-select' disabled='disabled'");?>
</div>
</div>
<?php if(!empty($attr)) echo html::hidden("products[$i]", $productID);?>
@@ -64,7 +64,7 @@
<?php echo "<input type='checkbox' name='products[$i]' value='$productID' id='products{$productID}'>";?>
<label class='text-ellipsis checkbox-inline' for='<?php echo 'products' . $productID;?>'><?php echo $productName;?></label>
</div>
<?php if(isset($branchGroups[$productID])) echo html::select("branch[$i]", $branchGroups[$productID], '', "class='form-control chosen'");?>
<?php if(isset($branchGroups[$productID])) echo html::select("branch[$i]", $branchGroups[$productID], '', "class='form-control picker-select'");?>
</div>
</div>
<?php $i++;?>
@@ -88,7 +88,7 @@
<?php echo "<input type='checkbox' name='products[$i]' value='$productID' id='products{$productID}'>";?>
<label class='text-ellipsis checkbox-inline' for='<?php echo 'products' . $productID;?>'><?php echo $productName;?></label>
</div>
<?php if(isset($branchGroups[$productID])) echo html::select("branch[$i]", $branchGroups[$productID], '', "class='form-control chosen'");?>
<?php if(isset($branchGroups[$productID])) echo html::select("branch[$i]", $branchGroups[$productID], '', "class='form-control picker-select'");?>
</div>
</div>
<?php $i++;?>
+2 -2
View File
@@ -403,7 +403,7 @@ body {margin-bottom: 25px;}
<script>
$(function()
{
// Update table summary text
/* Update table summary text. */
var checkedSummary = '<?php echo $lang->execution->checkedSummary?>';
var pageSummary = '<?php echo $lang->execution->pageSummary?>';
$('#executionTaskForm').table(
@@ -425,7 +425,7 @@ $(function()
$rows.each(function()
{
var $row = $(this);
if ($originTable)
if($originTable)
{
$row = $originTable.find('tbody>tr[data-id="' + $row.data('id') + '"]');
}
+1 -1
View File
@@ -61,7 +61,7 @@ $lang->my->projects = '所属项目';
$lang->my->executions = "所属{$lang->executionCommon}";
$lang->my->executionMenu = new stdclass();
$lang->my->executionMenu->undone = '未结束';
$lang->my->executionMenu->undone = '未完成';
$lang->my->executionMenu->done = '已完成';
$lang->my->taskMenu = new stdclass();
+2 -2
View File
@@ -43,7 +43,7 @@
<th class='c-user' title='<?php echo $lang->team->roleAB;?>'><?php echo $lang->team->roleAB;?></th>
<th class='c-date'><?php echo $lang->team->join;?></th>
<th class='c-hours'><?php echo $lang->my->hours;?></th>
<th class='c-user'><?php echo $lang->execution->myTask;?></th>
<th class='c-user text-center'><?php echo $lang->execution->myTask;?></th>
<th class='c-progress'><?php echo $lang->execution->progress;?></th>
</tr>
</thead>
@@ -80,7 +80,7 @@
<td><?php echo $execution->role;?></td>
<td class='c-date'><?php echo $execution->join;?></td>
<td><?php echo $execution->hours;?></td>
<td><?php echo $execution->assignedToMeTasks;?></td>
<td class="text-center"><?php echo $execution->assignedToMeTasks;?></td>
<td>
<div class='progress-pie' data-doughnut-size='90' data-color='#3CB371' data-value='<?php echo $execution->progress;?>' data-width='24' data-height='24' data-back-color='#e8edf3'>
<div class='progress-info'><?php echo $execution->progress;?></div>
+2 -2
View File
@@ -5,7 +5,7 @@ $.get(createLink('port', 'ajaxGetTbody','model=<?php echo $model;?>&lastID=0&pag
$('#showData > tbody').append(data);
if($('#showData tbody').find('tr').hasClass('showmore') === false) $('#showData tfoot').removeClass('hidden');
$('#showData tbody').find('.picker-select').picker({chosenMode: true});
$('.form-date').datetimepicker('update');
$('.form-date').datetimepicker({minView: 2, format: "yyyy-mm-dd"});
$('.form-datetime').datetimepicker('update');
$('#showData > tbody').removeClass('load-indicator loading');
})
@@ -37,7 +37,7 @@ function loadData($showmore)
$showmore.after(data);
if($('#showData tbody').find('tr').hasClass('showmore') === false) $('#showData tfoot').removeClass('hidden');
$('#showData tbody').find('.picker-select').picker({chosenMode: true}).removeClass('nopicker');
$('.form-date').datetimepicker('update');
$('.form-date').datetimepicker({minView: 2, format: "yyyy-mm-dd"});
$('.form-datetime').datetimepicker('update');
})
}
+3 -1
View File
@@ -10,4 +10,6 @@ th.table-nest-title .check-all {position: absolute; left: 15px; top: 7px;}
.c-date {text-align: center;}
#executionTableList > tr.has-nest-child .table-nest-toggle {vertical-align: middle;}
#executionTableList > tr:not(.has-nest-child) .table-nest-toggle {display: none;}
#executionTableList > tr:not(.has-nest-child) .project-type-label {margin-left: 22px;}
#executionTableList > tr:not(.has-nest-child) .project-type-label {margin-left: 22px;}
.table-statistic {padding-left: 10px;}
#executionTableList .table-nest-icon {top: 6px;}
+33 -8
View File
@@ -1,5 +1,7 @@
$(function()
{
$("#" + status + "Tab").addClass('btn-active-text');
$('input[name^="showTask"]').click(function()
{
var show = $(this).is(':checked') ? 1 : 0;
@@ -38,14 +40,10 @@ $(function()
}
if(notCheckedLength > 0) $('#executionForm .checkAll').prop('checked', false);
var summary = checkedExecutions.replace('%s', checkedLength);
if(cilentLang == "en" && checkedLength < 2) summary = summary.replace('items', 'item');
var statistic = "<div id='executionsSummary' class='table-statistic'>" + summary + "</div>";
if(checkedLength > 0)
{
$('#executionSummary').addClass('hidden');
$('#executionsSummary').remove();
$('.editCheckbox').after(statistic);
}
else
{
@@ -63,12 +61,8 @@ $(function()
$("#executionForm .checkAll").prop('checked', true);
$('#executionForm').addClass('has-row-checked');
var checkedLength = $(":checkbox[name^='executionIDList']:checked").length;
var summary = checkedExecutions.replace('%s', checkedLength);
if(cilentLang == "en" && checkedLength < 2) summary = summary.replace('items', 'item');
var statistic = "<div id='executionsSummary' class='table-statistic'>" + summary + "</div>";
$('#executionSummary').addClass('hidden');
$('#executionsSummary').remove();
$('.editCheckbox').after(statistic);
$(this).next('label').addClass('hover');
}
else
@@ -91,6 +85,37 @@ $(function()
});
$('#executionsForm .checkAll').prop('checked', false);
}, 10);
/* Update table summary text. */
$('#executionForm').table(
{
statisticCreator: function(table)
{
var $table = table.getTable();
var $checkedRows = $table.find(table.isDataTable ? '.datatable-row-left.checked' : 'tbody>tr.checked');
var $originTable = table.isDataTable ? table.$.find('.datatable-origin') : null;
var checkedTotal = $checkedRows.length;
var $rows = checkedTotal ? $checkedRows : $table.find(table.isDataTable ? '.datatable-rows .datatable-row-left' : 'tbody>tr');
var checkedWait = 0;
var checkedDoing = 0;
var executionIDList = [];
$rows.each(function()
{
var $row = $(this);
if($originTable) $row = $originTable.find('tbody>tr[data-id="' + $row.data('id') + '"]');
var data = $row.data();
executionIDList.push(data.id);
if(data.status === 'wait') checkedWait++;
if(data.status === 'doing') checkedDoing++;
});
if(status != 'all') return (checkedTotal ? checkedExecutions : executionSummary).replace('%s', $rows.length);
return (checkedTotal ? checkedSummary : pageSummary).replace('%total%', $rows.length).replace('%wait%', checkedWait).replace('%doing%', checkedDoing);
}
})
})
window.addEventListener('scroll', this.handleScroll)
+7 -5
View File
@@ -8,6 +8,10 @@
<?php js::set('disabledTaskTip', sprintf($lang->project->disabledInputTip, $lang->edit . $lang->executionCommon));?>
<?php js::set('defaultExecutionTip', $lang->edit . $lang->executionCommon);?>
<?php js::set('disabledExecutionTip', sprintf($lang->project->disabledInputTip, $lang->programplan->stageCustom->task));?>
<?php js::set('checkedSummary', $lang->execution->checkedExecSummary);?>
<?php js::set('pageSummary', $lang->execution->pageExecSummary);?>
<?php js::set('executionSummary', $lang->execution->executionSummary);?>
<?php js::set('checkedExecutions', $lang->execution->checkedExecutions);?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<div class='btn-group'>
@@ -62,7 +66,7 @@
</div>
<?php else:?>
<?php $canBatchEdit = common::hasPriv('execution', 'batchEdit'); ?>
<form class='main-table' id='executionForm' method='post' data-ride='table' data-nested='true' data-expand-nest-child='false' data-checkable='false' data-enable-empty-nested-row='true' data-replace-id='executionTableList' data-preserve-nested='true'>
<form class='main-table' id='executionForm' method='post' data-nested='true' data-expand-nest-child='false' data-enable-empty-nested-row='true' data-replace-id='executionTableList' data-preserve-nested='true'>
<table class="table table-from table-fixed table-nested" id="executionList">
<?php $vars = "status=$status&orderBy=%s";?>
<thead>
@@ -92,14 +96,12 @@
</tbody>
</table>
<div class='table-footer'>
<?php $pager->show('right', 'pagerjs');?>
<div class="table-statistic"></div>
<?php $pager->show('right', 'pagerjs');?>
</div>
</form>
<?php endif;?>
</div>
<?php js::set('status', $status)?>
<?php js::set('orderBy', $orderBy)?>
<script>
$("#<?php echo $status;?>Tab").addClass('btn-active-text');
</script>
<?php include '../../common/view/footer.html.php';?>
+8
View File
@@ -245,6 +245,14 @@ class release extends control
$this->view->storyPager = $storyPager;
$this->view->bugPager = $bugPager;
$this->view->leftBugPager = $leftBugPager;
if($this->app->getViewType() == 'json')
{
unset($this->view->storyPager);
unset($this->view->bugPager);
unset($this->view->leftBugPager);
}
$this->display();
}
+8 -5
View File
@@ -80,10 +80,13 @@ $(function()
modalTrigger.show();
});
$('#duplicateStory').picker(
if($('#duplicateStory').length > 0)
{
disableEmptySearch : true,
dropWidth : 'auto',
maxAutoDropWidth : document.body.scrollWidth + document.getElementById('duplicateStory').offsetWidth - document.getElementById('duplicateStoryBox').getBoundingClientRect().right
});
$('#duplicateStory').picker(
{
disableEmptySearch : true,
dropWidth : 'auto',
maxAutoDropWidth : document.body.scrollWidth + document.getElementById('duplicateStory').offsetWidth - document.getElementById('duplicateStoryBox').getBoundingClientRect().right
});
}
})
+1 -1
View File
@@ -323,7 +323,7 @@ class testsuite extends control
/* Build the search form. */
$this->loadModel('testcase');
$this->config->testcase->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($productID, $viewType = 'case');
$this->config->testcase->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($productID, $viewType = 'case', 0, 'all');
$this->config->testcase->search['module'] = 'testsuite';
$this->config->testcase->search['actionURL'] = inlink('linkCase', "suiteID=$suiteID&param=myQueryID");
unset($this->config->testcase->search['fields']['product']);
+23 -15
View File
@@ -131,21 +131,18 @@ function initGroup(data)
})
}
$(document).on('change', "select[id^='visions']", function()
/**
* Get group data by selected vision.
*
* @param int $i
* @access public
* @return html
*/
function getGroupSelect(i)
{
var i = parseInt($(this).attr('id').replace(/[^0-9]/ig, ''));
if(i < 1) return '';
var visions = $('select[id="visions' + i + '"]').val();
var groups = $('#group' + i).val();
if($.inArray('ditto', groups) >= 0) groups = '';
$.post(createLink('user', 'ajaxGetGroup', "visions=" + visions + '&i=' + i + '&selected=' + groups), function(data)
{
$('#group' + i).replaceWith(data);
$('#group' + i + '_chosen').remove();
$('#group' + i).chosen();
})
visions = visions ? visions.join() : '';
switch(visions)
{
@@ -158,14 +155,25 @@ $(document).on('change', "select[id^='visions']", function()
case 'rnd,lite':
var data = allGroupSelect;
break;
case 'ditto':
var data = getGroupSelect(i - 1);
break;
default:
var data = emptyGroupSelect;
break;
}
for(n = i + 1; n <= batchCreateCount; n++)
return data;
}
$(document).on('change', "select[id^='visions']", function()
{
var i = parseInt($(this).attr('id').replace(/[^0-9]/ig, ''));
var data = getGroupSelect(i);
for(n = i; n <= batchCreateCount; n++)
{
if(n == i) continue;
if($.inArray('ditto', $('select[id="visions' + n + '"]').val()) < 0) break;
if(n != i && $.inArray('ditto', $('select[id="visions' + n + '"]').val()) < 0) break;
((function(n)
{