Merge branch 'master' into 'sprint/247_tianshujie_table'

# Conflicts:
#   module/my/view/task.html.php
#   www/theme/default/style.css
This commit is contained in:
田淑杰
2022-10-10 08:43:18 +00:00
60 changed files with 556 additions and 373 deletions
+72 -72
View File
@@ -24,7 +24,7 @@ $config->bug->list->allFields = 'id, module, execution, story, task,
lastEditedBy,
lastEditedDate';
$config->bug->list->defaultFields = 'id,severity,pri,title,openedBy,assignedTo,resolvedBy,resolution';
$config->bug->list->defaultFields = 'id,title,severity,pri,openedBy,assignedTo,resolvedBy,resolution';
$config->bug->exportFields = 'id, product, branch, module, project, execution, story, task,
title, keywords, severity, pri, type, os, browser,
@@ -159,7 +159,7 @@ $config->bug->search['params']['deadline'] = array('operator' => '=',
$config->bug->search['params']['activatedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
$config->bug->datatable = new stdclass();
$config->bug->datatable->defaultField = array('id', 'severity', 'pri', 'confirmed', 'title', 'status', 'openedBy', 'openedDate', 'assignedTo', 'resolution', 'actions');
$config->bug->datatable->defaultField = array('id', 'title', 'severity', 'pri', 'status', 'openedBy', 'openedDate', 'confirmed', 'assignedTo', 'resolution', 'actions');
$config->bug->datatable->fieldList['id']['title'] = 'idAB';
$config->bug->datatable->fieldList['id']['fixed'] = 'left';
@@ -174,6 +174,12 @@ $config->bug->datatable->fieldList['module']['control'] = 'select';
$config->bug->datatable->fieldList['module']['title'] = 'module';
$config->bug->datatable->fieldList['module']['dataSource'] = array('module' => 'tree', 'method' => 'getOptionMenu', 'params' => '$productID&bug');
$config->bug->datatable->fieldList['title']['title'] = 'title';
$config->bug->datatable->fieldList['title']['fixed'] = 'left';
$config->bug->datatable->fieldList['title']['width'] = 'auto';
$config->bug->datatable->fieldList['title']['required'] = 'yes';
$config->bug->datatable->fieldList['title']['minWidth'] = '200';
$config->bug->datatable->fieldList['severity']['title'] = 'severityAB';
$config->bug->datatable->fieldList['severity']['fixed'] = 'left';
$config->bug->datatable->fieldList['severity']['width'] = '50';
@@ -186,16 +192,10 @@ $config->bug->datatable->fieldList['pri']['width'] = '50';
$config->bug->datatable->fieldList['pri']['required'] = 'no';
$config->bug->datatable->fieldList['pri']['name'] = $lang->bug->pri;
$config->bug->datatable->fieldList['confirmed']['title'] = 'confirmedAB';
$config->bug->datatable->fieldList['confirmed']['fixed'] = 'left';
$config->bug->datatable->fieldList['confirmed']['width'] = '100';
$config->bug->datatable->fieldList['confirmed']['required'] = 'no';
$config->bug->datatable->fieldList['title']['title'] = 'title';
$config->bug->datatable->fieldList['title']['fixed'] = 'left';
$config->bug->datatable->fieldList['title']['width'] = 'auto';
$config->bug->datatable->fieldList['title']['required'] = 'yes';
$config->bug->datatable->fieldList['title']['minWidth'] = '200';
$config->bug->datatable->fieldList['status']['title'] = 'statusAB';
$config->bug->datatable->fieldList['status']['fixed'] = 'left';
$config->bug->datatable->fieldList['status']['width'] = '80';
$config->bug->datatable->fieldList['status']['required'] = 'no';
$config->bug->datatable->fieldList['branch']['title'] = 'branch';
$config->bug->datatable->fieldList['branch']['fixed'] = 'left';
@@ -230,10 +230,66 @@ $config->bug->datatable->fieldList['plan']['fixed'] = 'no';
$config->bug->datatable->fieldList['plan']['width'] = '120';
$config->bug->datatable->fieldList['plan']['required'] = 'no';
$config->bug->datatable->fieldList['status']['title'] = 'statusAB';
$config->bug->datatable->fieldList['status']['fixed'] = 'no';
$config->bug->datatable->fieldList['status']['width'] = '80';
$config->bug->datatable->fieldList['status']['required'] = 'no';
$config->bug->datatable->fieldList['openedBy']['title'] = 'openedByAB';
$config->bug->datatable->fieldList['openedBy']['fixed'] = 'no';
$config->bug->datatable->fieldList['openedBy']['width'] = '80';
$config->bug->datatable->fieldList['openedBy']['required'] = 'no';
$config->bug->datatable->fieldList['openedDate']['title'] = 'openedDateAB';
$config->bug->datatable->fieldList['openedDate']['fixed'] = 'no';
$config->bug->datatable->fieldList['openedDate']['width'] = '90';
$config->bug->datatable->fieldList['openedDate']['required'] = 'no';
$config->bug->datatable->fieldList['openedBuild']['title'] = 'openedBuild';
$config->bug->datatable->fieldList['openedBuild']['fixed'] = 'no';
$config->bug->datatable->fieldList['openedBuild']['width'] = '120';
$config->bug->datatable->fieldList['openedBuild']['required'] = 'no';
$config->bug->datatable->fieldList['openedBuild']['control'] = 'multiple';
$config->bug->datatable->fieldList['openedBuild']['dataSource'] = array('module' => 'build', 'method' =>'getBuildPairs', 'params' => '$productID&$branch&noempty,noterminate,nodone,withbranch');
$config->bug->datatable->fieldList['confirmed']['title'] = 'confirmedAB';
$config->bug->datatable->fieldList['confirmed']['fixed'] = 'no';
$config->bug->datatable->fieldList['confirmed']['width'] = '100';
$config->bug->datatable->fieldList['confirmed']['required'] = 'no';
$config->bug->datatable->fieldList['assignedTo']['title'] = 'assignedToAB';
$config->bug->datatable->fieldList['assignedTo']['fixed'] = 'no';
$config->bug->datatable->fieldList['assignedTo']['width'] = '120';
$config->bug->datatable->fieldList['assignedTo']['required'] = 'no';
$config->bug->datatable->fieldList['assignedTo']['dataSource'] = array('module' => 'user', 'method' =>'getPairs', 'params' => 'noclosed|noletter');
$config->bug->datatable->fieldList['assignedDate']['title'] = 'assignedDate';
$config->bug->datatable->fieldList['assignedDate']['fixed'] = 'no';
$config->bug->datatable->fieldList['assignedDate']['width'] = '90';
$config->bug->datatable->fieldList['assignedDate']['required'] = 'no';
$config->bug->datatable->fieldList['deadline']['title'] = 'deadline';
$config->bug->datatable->fieldList['deadline']['fixed'] = 'no';
$config->bug->datatable->fieldList['deadline']['width'] = '90';
$config->bug->datatable->fieldList['deadline']['required'] = 'no';
$config->bug->datatable->fieldList['deadline']['control'] = 'date';
$config->bug->datatable->fieldList['resolvedBy']['title'] = 'resolvedBy';
$config->bug->datatable->fieldList['resolvedBy']['fixed'] = 'no';
$config->bug->datatable->fieldList['resolvedBy']['width'] = '100';
$config->bug->datatable->fieldList['resolvedBy']['required'] = 'no';
$config->bug->datatable->fieldList['resolution']['title'] = 'resolutionAB';
$config->bug->datatable->fieldList['resolution']['fixed'] = 'no';
$config->bug->datatable->fieldList['resolution']['width'] = '110';
$config->bug->datatable->fieldList['resolution']['required'] = 'no';
$config->bug->datatable->fieldList['resolvedDate']['title'] = 'resolvedDateAB';
$config->bug->datatable->fieldList['resolvedDate']['fixed'] = 'no';
$config->bug->datatable->fieldList['resolvedDate']['width'] = '120';
$config->bug->datatable->fieldList['resolvedDate']['required'] = 'no';
$config->bug->datatable->fieldList['resolvedBuild']['title'] = 'resolvedBuild';
$config->bug->datatable->fieldList['resolvedBuild']['fixed'] = 'no';
$config->bug->datatable->fieldList['resolvedBuild']['width'] = '120';
$config->bug->datatable->fieldList['resolvedBuild']['required'] = 'no';
$config->bug->datatable->fieldList['resolvedBuild']['control'] = 'select';
$config->bug->datatable->fieldList['resolvedBuild']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'resolvedBuild&id,name');
$config->bug->datatable->fieldList['activatedCount']['title'] = 'activatedCountAB';
$config->bug->datatable->fieldList['activatedCount']['fixed'] = 'no';
@@ -283,62 +339,6 @@ $config->bug->datatable->fieldList['mailto']['fixed'] = 'no';
$config->bug->datatable->fieldList['mailto']['width'] = '100';
$config->bug->datatable->fieldList['mailto']['required'] = 'no';
$config->bug->datatable->fieldList['openedBy']['title'] = 'openedByAB';
$config->bug->datatable->fieldList['openedBy']['fixed'] = 'no';
$config->bug->datatable->fieldList['openedBy']['width'] = '80';
$config->bug->datatable->fieldList['openedBy']['required'] = 'no';
$config->bug->datatable->fieldList['openedDate']['title'] = 'openedDateAB';
$config->bug->datatable->fieldList['openedDate']['fixed'] = 'no';
$config->bug->datatable->fieldList['openedDate']['width'] = '90';
$config->bug->datatable->fieldList['openedDate']['required'] = 'no';
$config->bug->datatable->fieldList['openedBuild']['title'] = 'openedBuild';
$config->bug->datatable->fieldList['openedBuild']['fixed'] = 'no';
$config->bug->datatable->fieldList['openedBuild']['width'] = '120';
$config->bug->datatable->fieldList['openedBuild']['required'] = 'no';
$config->bug->datatable->fieldList['openedBuild']['control'] = 'multiple';
$config->bug->datatable->fieldList['openedBuild']['dataSource'] = array('module' => 'build', 'method' =>'getBuildPairs', 'params' => '$productID&$branch&noempty,noterminate,nodone,withbranch');
$config->bug->datatable->fieldList['assignedTo']['title'] = 'assignedToAB';
$config->bug->datatable->fieldList['assignedTo']['fixed'] = 'no';
$config->bug->datatable->fieldList['assignedTo']['width'] = '120';
$config->bug->datatable->fieldList['assignedTo']['required'] = 'no';
$config->bug->datatable->fieldList['assignedTo']['dataSource'] = array('module' => 'user', 'method' =>'getPairs', 'params' => 'noclosed|noletter');
$config->bug->datatable->fieldList['assignedDate']['title'] = 'assignedDate';
$config->bug->datatable->fieldList['assignedDate']['fixed'] = 'no';
$config->bug->datatable->fieldList['assignedDate']['width'] = '90';
$config->bug->datatable->fieldList['assignedDate']['required'] = 'no';
$config->bug->datatable->fieldList['deadline']['title'] = 'deadline';
$config->bug->datatable->fieldList['deadline']['fixed'] = 'no';
$config->bug->datatable->fieldList['deadline']['width'] = '90';
$config->bug->datatable->fieldList['deadline']['required'] = 'no';
$config->bug->datatable->fieldList['deadline']['control'] = 'date';
$config->bug->datatable->fieldList['resolvedBy']['title'] = 'resolvedByAB';
$config->bug->datatable->fieldList['resolvedBy']['fixed'] = 'no';
$config->bug->datatable->fieldList['resolvedBy']['width'] = '100';
$config->bug->datatable->fieldList['resolvedBy']['required'] = 'no';
$config->bug->datatable->fieldList['resolution']['title'] = 'resolutionAB';
$config->bug->datatable->fieldList['resolution']['fixed'] = 'no';
$config->bug->datatable->fieldList['resolution']['width'] = '110';
$config->bug->datatable->fieldList['resolution']['required'] = 'no';
$config->bug->datatable->fieldList['resolvedDate']['title'] = 'resolvedDateAB';
$config->bug->datatable->fieldList['resolvedDate']['fixed'] = 'no';
$config->bug->datatable->fieldList['resolvedDate']['width'] = '120';
$config->bug->datatable->fieldList['resolvedDate']['required'] = 'no';
$config->bug->datatable->fieldList['resolvedBuild']['title'] = 'resolvedBuild';
$config->bug->datatable->fieldList['resolvedBuild']['fixed'] = 'no';
$config->bug->datatable->fieldList['resolvedBuild']['width'] = '120';
$config->bug->datatable->fieldList['resolvedBuild']['required'] = 'no';
$config->bug->datatable->fieldList['resolvedBuild']['control'] = 'select';
$config->bug->datatable->fieldList['resolvedBuild']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'resolvedBuild&id,name');
$config->bug->datatable->fieldList['closedBy']['title'] = 'closedBy';
$config->bug->datatable->fieldList['closedBy']['fixed'] = 'no';
$config->bug->datatable->fieldList['closedBy']['width'] = '80';
+1 -1
View File
@@ -146,7 +146,7 @@ $lang->workingHour = '工时';
$lang->idAB = 'ID';
$lang->priAB = 'P';
$lang->statusAB = '状态';
$lang->openedByAB = '创建';
$lang->openedByAB = '创建者';
$lang->assignedToAB = '指派';
$lang->typeAB = '类型';
$lang->nameAB = '名称';
+1 -1
View File
@@ -136,7 +136,7 @@ $lang->workingHour = '工時';
$lang->idAB = 'ID';
$lang->priAB = 'P';
$lang->statusAB = '狀態';
$lang->openedByAB = '創建';
$lang->openedByAB = '創建者';
$lang->assignedToAB = '指派';
$lang->typeAB = '類型';
$lang->nameAB = '名稱';
+2 -2
View File
@@ -177,11 +177,11 @@ $config->execution->gantt->linkType['begin']['end'] = 3;
$config->execution->datatable = new stdclass();
if($config->systemMode == 'new')
{
$config->execution->datatable->defaultField = array('id', 'name', 'project', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn');
$config->execution->datatable->defaultField = array('id', 'name', 'project', 'status', 'PM', 'begin', 'end', 'estimate', 'consumed', 'left', 'progress', 'burn');
}
else
{
$config->execution->datatable->defaultField = array('id', 'name', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn');
$config->execution->datatable->defaultField = array('id', 'name', 'status', 'PM', 'begin', 'end', 'estimate', 'consumed', 'left', 'progress', 'burn');
}
$config->execution->datatable->fieldList['id']['title'] = 'idAB';
+4
View File
@@ -38,3 +38,7 @@ canvas {height: 28px;}
#datatable-executionList .table-child-bottom.table-child-top > .c-name.flex {border-bottom: 2px solid #cbd0db !important;}
#datatable-executionList .parent.has-child.c-name.flex {border-bottom: 1px solid #cbd0db !important;}
#datatable-executionList tr:last-child .c-name.flex {margin-top: 1px !important;}
.table thead .c-estimate.text-right,
.table thead .c-consumed.text-right,
.table thead .c-left.text-right {padding-right: 8px;}
+1 -1
View File
@@ -13,7 +13,7 @@ $(function()
adjustTableFooter();
$('body').on('click', '#toggleFold', adjustTableFooter);
$('body').on('click', '.icon.icon-angle-double-right', adjustTableFooter);
$('body').on('click', '.icon.icon-angle-right', adjustTableFooter);
/* The display of the adjusting sidebarHeader is synchronized with the sidebar. */
$(".sidebar-toggle").click(function()
+1 -1
View File
@@ -419,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 executions.';
$lang->execution->checkedExecutions = "Seleted %s {$lang->executionCommon}.";
/* Statistics. */
$lang->execution->charts = new stdclass();
+3 -3
View File
@@ -342,8 +342,8 @@ $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->executionSummary = "Total {$lang->executionCommon}: <strong>%s</strong>.";
$lang->execution->pageExecSummary = "Total {$lang->executionCommon}: <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>';
@@ -419,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 executions.';
$lang->execution->checkedExecutions = "Seleted %s {$lang->executionCommon}.";
/* Statistics. */
$lang->execution->charts = new stdclass();
+1 -1
View File
@@ -419,7 +419,7 @@ $lang->execution->storyDragError = "该{$lang->SRCommon}不是激
$lang->execution->countTip = '(%s人)';
$lang->execution->pleaseInput = "请输入";
$lang->execution->week = '周';
$lang->execution->checkedExecutions = "共选中%s个{$lang->execution->common}。";
$lang->execution->checkedExecutions = "共选中%s个{$lang->executionCommon}。";
/* 统计。*/
$lang->execution->charts = new stdclass();
+5 -5
View File
@@ -4603,7 +4603,7 @@ class executionModel extends model
$burns = join(',', $execution->burns);
echo "<tr $trAttrs class='$trClass'>";
echo "<td><span id=$execution->id class='table-nest-icon icon table-nest-toggle'></span>";
echo "<td class='c-name text-left flex sort-handler'><span id=$execution->id class='table-nest-icon icon table-nest-toggle'></span>";
if($this->config->systemMode == 'new')
{
$spanClass = $execution->type == 'stage' ? 'label-warning' : 'label-info';
@@ -4636,9 +4636,9 @@ class executionModel extends model
echo '<td>' . html::ring($execution->hours->progress) . '</td>';
echo helper::isZeroDate($execution->begin) ? '<td class="c-date"></td>' : '<td class="c-date">' . $execution->begin . '</td>';
echo helper::isZeroDate($execution->end) ? '<td class="c-date"></td>' : '<td class="c-date">' . $execution->end . '</td>';
echo "<td class='hours' title='{$execution->hours->totalEstimate}{$this->lang->execution->workHour}'>" . $execution->hours->totalEstimate . $this->lang->execution->workHourUnit . '</td>';
echo "<td class='hours' title='{$execution->hours->totalConsumed}{$this->lang->execution->workHour}'>" . $execution->hours->totalConsumed . $this->lang->execution->workHourUnit . '</td>';
echo "<td class='hours' title='{$execution->hours->totalLeft}{$this->lang->execution->workHour}'>" . $execution->hours->totalLeft . $this->lang->execution->workHourUnit . '</td>';
echo "<td class='hours text-right' title='{$execution->hours->totalEstimate}{$this->lang->execution->workHour}'>" . $execution->hours->totalEstimate . $this->lang->execution->workHourUnit . '</td>';
echo "<td class='hours text-right' title='{$execution->hours->totalConsumed}{$this->lang->execution->workHour}'>" . $execution->hours->totalConsumed . $this->lang->execution->workHourUnit . '</td>';
echo "<td class='hours text-right' title='{$execution->hours->totalLeft}{$this->lang->execution->workHour}'>" . $execution->hours->totalLeft . $this->lang->execution->workHourUnit . '</td>';
echo "<td id='spark-{$execution->id}' class='sparkline text-left no-padding' values='$burns'></td>";
echo '<td class="c-actions">';
common::printIcon('execution', 'start', "executionID={$execution->id}", $execution, 'list', '', '', 'iframe', true);
@@ -4898,7 +4898,7 @@ class executionModel extends model
if(isset($execution->delay)) echo "<span class='label label-danger label-badge'>{$this->lang->execution->delayed}</span> ";
if(!empty($execution->children))
{
echo "<a class='plan-toggle' data-id='$execution->id'><i class='icon icon-angle-double-right'></i></a>";
echo "<a class='plan-toggle' data-id='$execution->id'><i class='icon icon-angle-right'></i></a>";
}
break;
case 'code':
+11 -7
View File
@@ -16,13 +16,17 @@
$datatableId = $this->moduleName . ucfirst($this->methodName);
$useDatatable = (isset($config->datatable->$datatableId->mode) and $config->datatable->$datatableId->mode == 'datatable');
?>
<?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
js::set('unfoldExecutions', array());
js::set('useDatatable', $useDatatable);
js::set('from', $from);
/* Replace Iteration to Execution. */
js::set('checkedSummary', str_replace($lang->executionCommon, $lang->execution->common, $lang->execution->checkedExecSummary));
js::set('pageSummary', str_replace($lang->executionCommon, $lang->execution->common, $lang->execution->pageExecSummary));
js::set('executionSummary', str_replace($lang->executionCommon, $lang->execution->common, $lang->execution->executionSummary));
js::set('checkedExecutions', str_replace($lang->executionCommon, $lang->execution->common, $lang->execution->checkedExecutions));
?>
<?php
/* Set unfold parent executionID. */
js::set('unfoldAll', $lang->execution->treeLevel['all']);
+5
View File
@@ -256,6 +256,11 @@ class misc extends control
$condition = "owner={$account}&module={$objectType}&section=task&key=unfoldTasks";
$settingPath = $account . ".{$objectType}.task.unfoldTasks";
}
elseif($objectType == 'productplan')
{
$condition = "owner={$account}&module={$objectType}&section=browse&key=unfoldPlans";
$settingPath = $account . ".{$objectType}.browse.unfoldPlans";
}
else
{
$condition = "owner={$account}&module=product&section=browse&key=unfoldStories";
+1
View File
@@ -1,2 +1,3 @@
.c-hours, .c-progress {width: 80px !important;}
.c-status, .c-date {padding-right: 8px !important; text-align: center;}
.align-right {text-align: right; padding-right: 8px !important;}
+1 -1
View File
@@ -6,7 +6,7 @@
.table td.has-child > .task-toggle:hover {color: #006af1; cursor: pointer;}
.table td.has-child > .task-toggle > .icon {font-size: 16px; display: inline-block; transition: transform .2s; -ms-transform: rotate(-90deg); -moz-transform: rotate(-90deg); -o-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); transform: rotate(-90deg);}
.table td.has-child > .task-toggle > .icon:before {text-align: left;}
.table td.has-child > .task-toggle.collapsed {top: 2px;}
.table td.has-child > .task-toggle.collapsed {top: 0;}
.table td.has-child > .task-toggle.collapsed > .icon {-ms-transform: rotate(90deg); -moz-transform: rotate(90deg); -o-transform: rotate(90deg); -webkit-transform: rotate(90deg); transform: rotate(90deg);}
.table td.c-hours {padding-right: 12px;}
.main-table tbody > tr.table-children > td:first-child::before {width: 3px;}
+1 -1
View File
@@ -10,7 +10,7 @@ $(function()
e.stopPropagation();
e.preventDefault();
});
toggleFold('#myTaskForm', [], 0, 'my');
$('#taskTable td.has-child .task-toggle').each(function()
{
var $td = $(this).closest('td');
+8 -16
View File
@@ -34,16 +34,13 @@
<tr class='text-left'>
<th class='c-id'><?php echo $lang->idAB;?></th>
<th class='c-name text-left'><?php echo $lang->my->name;?></th>
<?php if($config->systemMode == 'new'):?>
<th class='c-name text-left'><?php echo $lang->my->projects;?></th>
<?php endif;?>
<th class='c-date'><?php echo $lang->execution->begin;?></th>
<th class='c-date'><?php echo $lang->execution->end;?></th>
<th class='c-status'><?php echo $lang->statusAB;?></th>
<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 text-center'><?php echo $lang->execution->myTask;?></th>
<th class='c-date'><?php echo $lang->execution->begin;?></th>
<th class='c-date'><?php echo $lang->execution->end;?></th>
<th class='c-date'><?php echo $lang->team->join;?></th>
<th class='c-hours align-right'><?php echo $lang->my->hours;?></th>
<th class='c-progress'><?php echo $lang->execution->progress;?></th>
</tr>
</thead>
@@ -62,13 +59,6 @@
<?php endif;?>
<?php echo html::a($link, $execution->name, '', "title='$execution->name'");?>
</td>
<?php if($config->systemMode == 'new'):?>
<td class='c-name text-left'>
<?php echo isset($execution->projectName) ? html::a($this->createLink('project', 'index', "id=$execution->project", '', '', $execution->project), $execution->projectName, '', "title='$execution->projectName'") : '';?>
</td>
<?php endif;?>
<td class='c-date'><?php echo $execution->begin;?></td>
<td class='c-date'><?php echo $execution->end;?></td>
<td class="c-status">
<?php if(isset($execution->delay)):?>
<span class="status-project status-delayed" title='<?php echo $lang->execution->delayed;?>'><?php echo $lang->execution->delayed;?></span>
@@ -78,9 +68,11 @@
<?php endif;?>
</td>
<td><?php echo $execution->role;?></td>
<td class='c-date'><?php echo $execution->join;?></td>
<td><?php echo $execution->hours;?></td>
<td class="text-center"><?php echo $execution->assignedToMeTasks;?></td>
<td class='c-date'><?php echo $execution->begin;?></td>
<td class='c-date'><?php echo $execution->end;?></td>
<td class='c-date'><?php echo $execution->join;?></td>
<td class="text-right"><?php echo $execution->hours;?></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>
+1 -1
View File
@@ -96,7 +96,7 @@
</td>
<td class='c-name nobr <?php if(!empty($story->children)) echo "has-child" ?>' title='<?php echo $story->title;?>'>
<?php echo common::hasPriv('story', 'view') ? html::a($storyLink, $story->title, null, "style='color: $story->color' data-group='product'") : $story->title;?>
<?php if(!empty($story->children)) echo '<a class="story-toggle" data-id="' . $story->id . '"><i class="icon icon-angle-double-right"></i></a>';;?>
<?php if(!empty($story->children)) echo '<a class="story-toggle" data-id="' . $story->id . '"><i class="icon icon-angle-right"></i></a>';;?>
</td>
<td class='c-pri'><span class='label-pri <?php echo 'label-pri-' . $story->pri;?>' title='<?php echo zget($lang->story->priList, $story->pri, $story->pri);?>'><?php echo zget($lang->story->priList, $story->pri, $story->pri);?></span></td>
<td class='c-status'><span class='status-story status-<?php echo $story->status;?>'><?php echo $this->processStatus('story', $story);?></span></td>
+6 -1
View File
@@ -119,7 +119,12 @@
echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', $onlybody, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'");
}
?>
<?php if(!empty($task->children)) echo '<a class="task-toggle" data-id="' . $task->id . '"><i class="icon icon-angle-double-right"></i></a>';?>
<?php if(!empty($task->children)) echo '<a class="task-toggle" data-id="' . $task->id . '"><i class="icon icon-angle-right"></i></a>';?>
</td>
<td class="c-pri"><span class='label-pri <?php echo 'label-pri-' . $task->pri;?>' title='<?php echo zget($lang->task->priList, $task->pri);?>'><?php echo zget($lang->task->priList, $task->pri);?></span></td>
<td class='c-status'>
<?php $storyChanged = (!empty($task->storyStatus) and $task->storyStatus == 'active' and $task->latestStoryVersion > $task->storyVersion and !in_array($task->status, array('cancel', 'closed')));?>
<?php $storyChanged ? print("<span class='status-story status-changed'>{$this->lang->my->storyChanged}</span>") : print("<span class='status-task status-{$task->status}'> " . $this->processStatus('task', $task) . "</span>");?>
</td>
<td class="c-pri"><span class='label-pri <?php echo 'label-pri-' . $task->pri;?>' title='<?php echo zget($lang->task->priList, $task->pri);?>'><?php echo zget($lang->task->priList, $task->pri);?></span></td>
<td class='c-status'>
+4 -4
View File
@@ -35,11 +35,11 @@
<tr>
<th class='c-id'> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
<th> <?php common::printOrderLink('name', $orderBy, $vars, $lang->testtask->name);?></th>
<th class='c-execution'><?php common::printOrderLink('execution', $orderBy, $vars, $lang->testtask->execution);?></th>
<th class='c-build'> <?php common::printOrderLink('build', $orderBy, $vars, $lang->testtask->build);?></th>
<th class='c-execution'><?php common::printOrderLink('execution', $orderBy, $vars, $lang->testtask->execution);?></th>
<th class='c-status'> <?php common::printOrderLink('status', $orderBy, $vars, $lang->statusAB);?></th>
<th class='c-date'> <?php common::printOrderLink('begin', $orderBy, $vars, $lang->testtask->begin);?></th>
<th class='c-date'> <?php common::printOrderLink('end', $orderBy, $vars, $lang->testtask->end);?></th>
<th class='c-status'> <?php common::printOrderLink('status', $orderBy, $vars, $lang->statusAB);?></th>
<th class='c-actions-6 text-center'><?php echo $lang->actions;?></th>
</tr>
</thead>
@@ -48,11 +48,11 @@
<tr>
<td class="c-id"><?php printf('%03d', $task->id);?></td>
<td class='text-left nobr' title='<?php echo $task->name;?>'><?php echo html::a($this->createLink('testtask', 'view', "taskID=$task->id"), $task->name);?></td>
<td class='nobr' title='<?php echo $task->executionName;?>'><?php echo $task->executionName;?></td>
<td class='nobr' title='<?php echo $task->build == 'trunk' ? $lang->trunk : $task->buildName;?>'><?php $task->build == 'trunk' ? print($lang->trunk) : print(html::a($this->createLink('build', 'view', "buildID=$task->build"), $task->buildName));?></td>
<td class='nobr' title='<?php echo $task->executionName;?>'><?php echo $task->executionName;?></td>
<td title='<?php echo $this->processStatus('testtask', $task);?>'><span class="status-task status-<?php echo $task->status?>"><?php echo $this->processStatus('testtask', $task);?></span></td>
<td><?php echo $task->begin?></td>
<td><?php echo $task->end?></td>
<td title='<?php echo $this->processStatus('testtask', $task);?>'><span class="status-task status-<?php echo $task->status?>"><?php echo $this->processStatus('testtask', $task);?></span></td>
<td class='c-actions'>
<?php
common::printIcon('testtask', 'cases', "taskID=$task->id", $task, 'list', 'sitemap', '', '', '', "data-app='qa'");
+4 -4
View File
@@ -37,10 +37,10 @@ js::set('deptID', $deptID);
<thead>
<tr>
<th class="c-id"><?php echo $lang->idAB;?></th>
<th class="c-department"><?php echo $lang->personnel->department;?></th>
<th class="c-user"><?php echo $lang->personnel->realName;?></th>
<th class="c-user"><?php echo $lang->personnel->userName;?></th>
<th class="c-department"><?php echo $lang->personnel->department;?></th>
<th class="c-job"><?php echo $lang->personnel->job;?></th>
<th class="c-user"><?php echo $lang->personnel->userName;?></th>
<th class="c-genders"><?php echo $lang->personnel->genders;?></th>
</tr>
</thead>
@@ -48,10 +48,10 @@ js::set('deptID', $deptID);
<?php foreach($personnelList as $personnel):?>
<tr>
<td class="c-id"><?php echo $personnel->id;?></td>
<td class="c-name"><?php echo zget($deptList, $personnel->dept);?></td>
<td class="c-name"><?php echo $personnel->realname;?></td>
<td class="c-name"><?php echo $personnel->account;?></td>
<td class="c-name"><?php echo zget($deptList, $personnel->dept);?></td>
<td><?php echo zget($lang->user->roleList, $personnel->role, '');?></td>
<td class="c-name"><?php echo $personnel->account;?></td>
<td><?php echo zget($lang->user->genderList, $personnel->gender, '');?></td>
</tr>
<?php endforeach;?>
+16 -12
View File
@@ -35,7 +35,7 @@
#programTree ul > li.has-list:after {width: 14px;}
#programTree ul > li.item-meas a.selected {color: #0c64eb;}
.side-col {padding-right: 20px; width: 18%;}
#sidebar>.cell {width: 100%;}
#sidebar > .cell {width: 100%;}
th.c-name {width: 400px;}
th.c-PO {width: 100px;}
@@ -44,15 +44,18 @@ th.c-bug {width: 150px;}
th.c-plan {width: 45px;}
th.c-release {width: 50px;}
th.c-actions {width: 50px;}
.c-name {border-left: none !important;}
.icon-cards-view {color: #888fa1;}
[lang='en'] .en-wrap-text {white-space: normal; height: 24px; line-height: 1; font-size: 12px;}
#productListForm thead>tr>th,
#productListForm tbody>tr>td {text-align: center; text-overflow: unset!important}
#productListForm thead>tr>th {padding: 0; line-height: 24px;}
#productListForm thead>tr:first-child>th {border-left: 1px solid #ddd;}
#productListForm thead>tr>th.c-checkbox {border-left: none; padding-left: 15px; width: 45px;}
#productListForm tbody>tr>td {padding: 2px 4px;}
#productListForm tbody>tr>td:first-child {text-align: left; padding-left: 15px;}
#productListForm thead > tr > th,
#productListForm tbody > tr > td {text-align: center; text-overflow: unset!important}
#productListForm thead > tr > th {padding: 0; line-height: 24px;}
#productListForm thead > tr:first-child > th {border-left: 1px solid #ddd;}
#productListForm thead > tr > th.c-checkbox {border-left: none; padding-left: 15px; width: 30px;}
#productListForm tbody > tr > td {padding: 2px 4px;}
#productListForm tbody > tr > td:first-child {text-align: left; padding-left: 15px;}
#productListForm tbody > tr > td.table-nest-title {padding-left: 16px;}
#productListForm th.table-nest-title .nest-has-checkbox {margin-top: 7px; margin-left: 35px;}
#productListForm th.table-nest-title .nest-none-checkbox {margin-top: 8px; margin-left: 5px;}
#productListForm th.table-nest-title .header {margin-left: 5px;}
@@ -61,11 +64,12 @@ th.c-actions {width: 50px;}
#productListForm th.table-nest-title .table-nest-toggle {top: 14px; left: auto; right: 10px; opacity: .6;}
#productListForm th.table-nest-title .table-nest-toggle::before {position: absolute; top: 0 !important; right: 0; bottom: 0; left: 0;}
#productListForm th.table-nest-title .table-nest-toggle:hover {opacity: 1;}
#productListForm .table.has-sort-head thead>tr>th>a:after,
#productListForm .table.has-sort-head thead>tr>th>a:before {top: -3px;}
#productListForm .table.has-sort-head thead > tr > th > a:after,
#productListForm .table.has-sort-head thead > tr > th > a:before {top: -3px;}
#productListForm .icon-product:before {content: '\e98f'; width: 22px; height: 22px; background: none; color: rgb(166, 170, 184); top: 0; line-height: 22px; margin-right: 2px; font-size: 14px;}
#productTableList td.table-nest-title > span.icon.table-nest-toggle {vertical-align: middle;}
#productList > thead th.table-nest-title.c-name {position: relative; padding-left: 4px !important;}
#productTableList > tr[data-nest-parent] {background: #f8f8f8;}
#productList > thead th.table-nest-title.c-name {position: relative; padding-left: 16px !important;}
@media screen and (max-width: 1460px)
{
@@ -81,7 +85,7 @@ th.c-actions {width: 50px;}
@media screen and (max-width: 1250px)
{
#productListForm thead>tr>th {font-size: 12px;}
#productListForm thead > tr > th {font-size: 12px;}
th.c-requirement {width: 265px;}
th.c-story {width: 265px;}
[lang^='zh-'] th.c-requirement {width: 220px;}
+1
View File
@@ -104,6 +104,7 @@
<?php endif;?>
<td class='text-left table-nest-title' title="<?php echo $program['programName']?>">
<span class="table-nest-icon icon table-nest-toggle"></span>
&nbsp;<span class="icon icon-cards-view"></span>
<span><?php echo $program['programName']?></span>
</td>
<td class='c-manager'>
+1
View File
@@ -19,6 +19,7 @@ $config->productplan->future = '2030-01-01';
global $app, $lang;
$app->loadLang('productplan');
$config->productplan->search['module'] = 'productplan';
$config->productplan->browse = new stdclass();
$config->productplan->search['fields']['id'] = $lang->productplan->id;
$config->productplan->search['fields']['title'] = $lang->productplan->title;
+2 -1
View File
@@ -10,7 +10,7 @@ td.c-branch {overflow: hidden; text-align: left !important; text-overflow: ellip
.table td.has-child > .plan-name > .task-toggle:hover {color: #006af1; cursor: pointer;}
.table td.has-child > .plan-name > .task-toggle > .icon {font-size: 16px; display: inline-block; transition: transform .2s; -ms-transform: rotate(-90deg); -moz-transform: rotate(-90deg); -o-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); transform: rotate(-90deg);}
.table td.has-child > .plan-name > .task-toggle > .icon:before {text-align: left;}
.table td.has-child > .plan-name > .task-toggle.collapsed {top: 2px;}
.table td.has-child > .plan-name > .task-toggle.collapsed {top: 0;}
.table td.has-child > .plan-name > .task-toggle.collapsed > .icon {-ms-transform: rotate(90deg); -moz-transform: rotate(90deg); -o-transform: rotate(90deg); -webkit-transform: rotate(90deg); transform: rotate(90deg);}
.main-table tbody > tr.table-children > td:first-child::before {width: 3px;}
@-moz-document url-prefix() {.main-table tbody > tr.table-children > td:first-child::before {width: 4px;};}
@@ -35,6 +35,7 @@ td.c-branch {overflow: hidden; text-align: left !important; text-overflow: ellip
.panel-actions {position: relative; padding: 0 0; padding-top: 1px;}
.icon-list {padding-left: 7px;}
.icon-kanban {padding-left: 7px; font-size: 16px;}
#productplanList thead th.c-title {width: 100%;}
#productplanList .c-actions {width: 265px;}
#productplanList .c-actions .btn+.btn {margin-left: -1px;}
#productplanList .c-actions .btn {display: block; float: left;}
+1
View File
@@ -11,6 +11,7 @@ $(document).on('click', '.task-toggle', function(e)
$(function()
{
toggleFold('#productplanForm', unfoldPlans, productID, 'productplan');
$('#productplanList tbody tr').each(function()
{
var $content = $(this).find('td.content');
+10 -2
View File
@@ -9,6 +9,14 @@
* @link https://www.zentao.net
*/
?>
<?php $unfoldPlans = isset($config->productplan->browse->unfoldPlans) ? json_decode($config->productplan->browse->unfoldPlans, true) : array();?>
<?php $unfoldPlans = zget($unfoldPlans, $productID, array());?>
<?php js::set('unfoldPlans', $unfoldPlans);?>
<style>
.c-actions {width: 250px;}
#productplanList .c-actions .btn+.btn {margin-left: -1px;}
#productplanList .c-actions .btn {display: block; float: left;}
</style>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left">
<?php common::sortFeatureMenu();?>
@@ -108,7 +116,7 @@
$i++;
}
?>
<tr class='<?php echo $class;?>' data-parent="<?php echo $plan->parent;?>">
<tr class='<?php echo $class;?>' data-id="<?php echo $plan->id;?>" data-parent="<?php echo $plan->parent;?>">
<td class='cell-id'>
<?php if(common::hasPriv('productplan', 'batchEdit') or common::hasPriv('productplan', 'batchChangeStatus')):?>
<?php echo html::checkbox('planIDList', array($plan->id => ''), '', $attribute) . html::a(helper::createLink('productplan', 'view', "planID=$plan->id"), sprintf('%03d', $plan->id));?>
@@ -130,7 +138,7 @@
if($plan->parent > 0) echo "<span class='label label-badge label-light' title='{$this->lang->productplan->children}'>{$this->lang->productplan->childrenAB}</span>";
echo html::a(inlink('view', "id=$plan->id"), $plan->title);
if(!empty($expired)) echo $expired;
if(isset($plan->children)) echo '<a class="task-toggle" data-id="' . $plan->id . '"><i class="icon icon-angle-double-right"></i></a>';
if(isset($plan->children)) echo '<a class="task-toggle" data-id="' . $plan->id . '"><i class="icon icon-angle-right"></i></a>';
echo '</div>';
?>
</td>
+10 -10
View File
@@ -1532,11 +1532,11 @@ class programModel extends model
if(common::hasPriv('program', 'suspend') || (common::hasPriv('program', 'close') && $program->status != 'doing') || (common::hasPriv('program', 'activate') && $program->status != 'closed'))
{
$menu .= "<div class='btn-group'>";
$menu .= "<button type='button' class='btn icon-caret-down dropdown-toggle' data-toggle='dropdown' title='{$this->lang->more}' style='width: 16px; padding-left: 0px;'></button>";
$menu .= "<ul class='dropdown-menu pull-right text-center' role='menu' style='min-width:auto; padding: 5px 10px;'>";
$menu .= $this->buildMenu('program', 'suspend', $params, $program, $type, 'pause', '', 'iframe', true, '', $this->lang->program->suspend);
if($program->status != 'doing') $menu .= $this->buildMenu('program', 'close', $params, $program, $type, 'off', '', 'iframe', true);
if($program->status != 'closed') $menu .= $this->buildMenu('program', 'activate', $params, $program, $type, 'magic', '', 'iframe', true);
$menu .= "<button type='button' class='btn icon-caret-down dropdown-toggle' data-toggle='context-dropdown' title='{$this->lang->more}' style='width: 16px; padding-left: 0px;'></button>";
$menu .= "<ul class='dropdown-menu pull-right text-center' role='menu'>";
$menu .= $this->buildMenu('program', 'suspend', $params, $program, $type, 'pause', '', 'iframe btn-action btn', true, '', $this->lang->program->suspend);
if($program->status != 'doing') $menu .= $this->buildMenu('program', 'close', $params, $program, $type, 'off', '', 'iframe btn-action btn', true);
if($program->status != 'closed') $menu .= $this->buildMenu('program', 'activate', $params, $program, $type, 'magic', '', 'iframe btn-action btn', true);
$menu .= "</ul>";
$menu .= "</div>";
}
@@ -1560,11 +1560,11 @@ class programModel extends model
if(common::hasPriv('project', 'suspend') || (common::hasPriv('project', 'close') && $program->status != 'doing') || (common::hasPriv('project', 'activate') && $program->status != 'closed'))
{
$menu .= "<div class='btn-group'>";
$menu .= "<button type='button' class='btn icon-caret-down dropdown-toggle' data-toggle='dropdown' title='{$this->lang->more}' style='width: 16px; padding-left: 0px;'></button>";
$menu .= "<ul class='dropdown-menu pull-right text-center' role='menu' style='min-width:auto; padding: 5px 10px;'>";
$menu .= $this->buildMenu('project', 'suspend', $params, $program, $type, 'pause', '', 'iframe', true);
if($program->status != 'doing') $menu .= $this->buildMenu('project', 'close', $params, $program, $type, 'off', '', 'iframe', true);
if($program->status != 'closed') $menu .= $this->buildMenu('project', 'activate', $params, $program, $type, 'magic', '', 'iframe', true);
$menu .= "<button type='button' class='btn icon-caret-down dropdown-toggle' data-toggle='context-dropdown' title='{$this->lang->more}' style='width: 16px; padding-left: 0px;'></button>";
$menu .= "<ul class='dropdown-menu pull-right text-center' role='menu'>";
$menu .= $this->buildMenu('project', 'suspend', $params, $program, $type, 'pause', '', 'iframe btn-action btn', true);
if($program->status != 'doing') $menu .= $this->buildMenu('project', 'close', $params, $program, $type, 'off', '', 'iframe btn-action btn', true);
if($program->status != 'closed') $menu .= $this->buildMenu('project', 'activate', $params, $program, $type, 'magic', '', 'iframe btn-action btn', true);
$menu .= "</ul>";
$menu .= "</div>";
}
+2 -2
View File
@@ -1,4 +1,4 @@
#executionList > thead > tr > th .table-nest-toggle-global {top: 6px}
#executionList > thead > tr > th .table-nest-toggle-global {top: 4px;}
#executionList > thead > tr > th .table-nest-toggle-global:before {color: #a6aab8;}
#executionsSummary {padding-left: 10px;}
#mainMenu .pull-left .checkbox-primary {margin-top: 5px;}
@@ -8,7 +8,7 @@ th.table-nest-title-edit {padding-left: 50px !important;}
th.table-nest-title-edit .table-nest-toggle {left: 28px;}
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;}
.table-statistic {padding-left: 10px;}
#executionTableList .table-nest-icon {top: 6px;}
+3 -3
View File
@@ -82,9 +82,9 @@
<th class='c-hours'><?php echo $lang->project->progress;?></th>
<th class='c-date'><?php echo $lang->programplan->begin;?></th>
<th class='c-date'><?php echo $lang->programplan->end;?></th>
<th class='c-hours'><?php echo $lang->task->estimateAB;?></th>
<th class='c-hours'><?php echo $lang->task->consumedAB;?></th>
<th class='c-hours'><?php echo $lang->task->leftAB;?> </th>
<th class='c-hours text-right'><?php echo $lang->task->estimateAB;?></th>
<th class='c-hours text-right'><?php echo $lang->task->consumedAB;?></th>
<th class='c-hours text-right'><?php echo $lang->task->leftAB;?> </th>
<th class='c-progress'><?php echo $lang->execution->burn;?> </th>
<th class='text-center c-actions-6'><?php echo $lang->actions;?></th>
</tr>
+26
View File
@@ -0,0 +1,26 @@
$(function()
{
/* Update table summary text. */
var $rows = $('#releaseList').find('tbody>tr');
var normal = 0;
var terminate = 0;
$rows.each(function()
{
var $row = $(this);
var data = $row.data();
if(data.type === 'normal') normal++;
if(data.type === 'terminate') terminate++;
});
var summary = '';
if(type != 'all')
{
summary = pageSummary.replace('%s', $rows.length);
}
else
{
summary = pageAllSummary.replace('%total%', $rows.length).replace('%normal%', normal).replace('%terminate%', terminate);
}
$('.table-statistic').html(summary);
});
+12 -6
View File
@@ -13,6 +13,9 @@
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/tablesorter.html.php';?>
<?php js::set('confirmDelete', $lang->release->confirmDelete)?>
<?php js::set('pageAllSummary', $lang->release->pageAllSummary)?>
<?php js::set('pageSummary', $lang->release->pageSummary)?>
<?php js::set('type', $type)?>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left">
<?php
@@ -46,11 +49,11 @@
<tr>
<th class='c-id'><?php echo $lang->release->id;?></th>
<th><?php echo $lang->release->name;?></th>
<th class='c-build'><?php echo $lang->release->build;?></th>
<th class='c-product'><?php echo $lang->release->product;?></th>
<th class='c-execution'><?php echo $lang->executionCommon;?></th>
<th class='c-build'><?php echo $lang->release->build;?></th>
<th class='c-date text-center'><?php echo $lang->release->date;?></th>
<th class='c-status text-center'><?php echo $lang->release->status;?></th>
<th class='c-date text-center'><?php echo $lang->release->date;?></th>
<?php
$extendFields = $this->projectrelease->getFlowExtendFields();
foreach($extendFields as $extendField) echo "<th>{$extendField->name}</th>";
@@ -60,7 +63,7 @@
</thead>
<tbody>
<?php foreach($releases as $release):?>
<tr>
<tr data-type='<?php echo $release->status;?>'>
<td><?php echo html::a(inlink('view', "releaseID=$release->id"), sprintf('%03d', $release->id));?></td>
<td>
<?php
@@ -68,21 +71,24 @@
echo html::a(inlink('view', "release=$release->id"), $release->name, '', "data-app='$from'") . $flagIcon;
?>
</td>
<td title='<?php echo $release->buildName?>'><?php echo empty($release->execution) ? $release->buildName : html::a($this->createLink('build', 'view', "buildID=$release->buildID"), $release->buildName);?></td>
<td title='<?php echo $release->productName?>'><?php echo $release->productName?></td>
<td title='<?php echo $release->executionName?>'><?php echo $release->executionName?></td>
<td title='<?php echo $release->buildName?>'><?php echo empty($release->execution) ? $release->buildName : html::a($this->createLink('build', 'view', "buildID=$release->buildID"), $release->buildName);?></td>
<td class='text-center'><?php echo $release->date;?></td>
<?php $status = $this->processStatus('release', $release);?>
<td class='c-status text-center' title='<?php echo $status;?>'>
<span class="status-release status-<?php echo $release->status?>"><?php echo $status;?></span>
</td>
<td class='text-center'><?php echo $release->date;?></td>
<?php foreach($extendFields as $extendField) echo "<td>" . $this->loadModel('flow')->getFieldValue($extendField, $release) . "</td>";?>
<td class='c-actions'><?php echo $this->projectrelease->buildOperateMenu($release, 'browse');?></td>
</tr>
<?php endforeach;?>
</tbody>
</table>
<div class='table-footer'><?php echo $pager->show('left', 'pagerjs');?></div>
<div class='table-footer'>
<div class="table-statistic"></div>
<?php echo $pager->show('left', 'pagerjs');?>
</div>
<?php endif;?>
</div>
<?php include '../../common/view/footer.html.php';?>
+26
View File
@@ -0,0 +1,26 @@
$(function()
{
/* Update table summary text. */
var $rows = $('#releaseList').find('tbody>tr');
var normal = 0;
var terminate = 0;
$rows.each(function()
{
var $row = $(this);
var data = $row.data();
if(data.type === 'normal') normal++;
if(data.type === 'terminate') terminate++;
});
var summary = '';
if(type != 'all')
{
summary = pageSummary.replace('%s', $rows.length);
}
else
{
summary = pageAllSummary.replace('%total%', $rows.length).replace('%normal%', normal).replace('%terminate%', terminate);
}
$('.table-statistic').html(summary);
});
+33 -31
View File
@@ -33,37 +33,39 @@ $lang->release->errorDate = 'The release date should not be greater tha
$lang->release->basicInfo = 'Basis Info';
$lang->release->id = 'ID';
$lang->release->product = $lang->productCommon;
$lang->release->branch = 'Platform/Branch';
$lang->release->project = 'Project';
$lang->release->build = 'Build';
$lang->release->name = 'Name';
$lang->release->marker = 'Meilensteine';
$lang->release->date = 'Datum';
$lang->release->desc = 'Beschreibung';
$lang->release->files = 'Gehäuse';
$lang->release->status = 'Status';
$lang->release->subStatus = 'Sub Status';
$lang->release->last = 'Letztes Release';
$lang->release->unlinkStory = 'Story entfernen';
$lang->release->unlinkBug = 'Bug entfernen';
$lang->release->stories = 'Abgeschlossene Story';
$lang->release->bugs = 'Gelöste Bugs';
$lang->release->leftBugs = 'Verbleibende Bugs';
$lang->release->generatedBugs = 'Gemeldete Bugs';
$lang->release->finishStories = 'Abgeschlossene %s Storys';
$lang->release->resolvedBugs = 'Gelöste %s Bugs';
$lang->release->createdBugs = 'Erstellte %s Bugs';
$lang->release->export = 'Export as HTML';
$lang->release->yesterday = 'Gestern veröffentlicht';
$lang->release->all = 'All';
$lang->release->notify = 'Notify';
$lang->release->notifyUsers = 'Notify Users';
$lang->release->mailto = 'Mailto';
$lang->release->mailContent = '<p>Dear users,</p><p style="margin-left: 30px;">The following requirements and bugs you feedback have been released in the %s. Please contact your account manager to check the latest version.</p>';
$lang->release->storyList = '<p style="margin-left: 30px;">Story List:%s。</p>';
$lang->release->bugList = '<p style="margin-left: 30px;">Bug List:%s。</p>';
$lang->release->id = 'ID';
$lang->release->product = $lang->productCommon;
$lang->release->branch = 'Platform/Branch';
$lang->release->project = 'Project';
$lang->release->build = 'Build';
$lang->release->name = 'Name';
$lang->release->marker = 'Meilensteine';
$lang->release->date = 'Datum';
$lang->release->desc = 'Beschreibung';
$lang->release->files = 'Gehäuse';
$lang->release->status = 'Status';
$lang->release->subStatus = 'Sub Status';
$lang->release->last = 'Letztes Release';
$lang->release->unlinkStory = 'Story entfernen';
$lang->release->unlinkBug = 'Bug entfernen';
$lang->release->stories = 'Abgeschlossene Story';
$lang->release->bugs = 'Gelöste Bugs';
$lang->release->leftBugs = 'Verbleibende Bugs';
$lang->release->generatedBugs = 'Gemeldete Bugs';
$lang->release->finishStories = 'Abgeschlossene %s Storys';
$lang->release->resolvedBugs = 'Gelöste %s Bugs';
$lang->release->createdBugs = 'Erstellte %s Bugs';
$lang->release->export = 'Export as HTML';
$lang->release->yesterday = 'Gestern veröffentlicht';
$lang->release->all = 'All';
$lang->release->notify = 'Notify';
$lang->release->notifyUsers = 'Notify Users';
$lang->release->mailto = 'Mailto';
$lang->release->mailContent = '<p>Dear users,</p><p style="margin-left: 30px;">The following requirements and bugs you feedback have been released in the %s. Please contact your account manager to check the latest version.</p>';
$lang->release->storyList = '<p style="margin-left: 30px;">Story List:%s。</p>';
$lang->release->bugList = '<p style="margin-left: 30px;">Bug List:%s。</p>';
$lang->release->pageAllSummary = 'Total releases: <strong>%total%</strong>, Normal: <strong>%normal%</strong>, Terminate: <strong>%terminate%</strong>。';
$lang->release->pageSummary = "Total releases: <strong>%s</strong>.";
$lang->release->storyTitle = 'Story Name';
$lang->release->bugTitle = 'Bug Name';
+33 -31
View File
@@ -33,37 +33,39 @@ $lang->release->errorDate = 'The release date should not be greater tha
$lang->release->basicInfo = 'Basic Info';
$lang->release->id = 'ID';
$lang->release->product = $lang->productCommon;
$lang->release->branch = 'Platform/Branch';
$lang->release->project = 'Project';
$lang->release->build = 'Build';
$lang->release->name = 'Name';
$lang->release->marker = 'Milestone';
$lang->release->date = 'Release Date';
$lang->release->desc = 'Description';
$lang->release->files = 'Files';
$lang->release->status = 'Status';
$lang->release->subStatus = 'Sub Status';
$lang->release->last = 'Last Release';
$lang->release->unlinkStory = 'Unlink Story';
$lang->release->unlinkBug = 'Unlink Bug';
$lang->release->stories = 'Finished Story';
$lang->release->bugs = 'Resolved Bug';
$lang->release->leftBugs = 'Active Bug';
$lang->release->generatedBugs = 'Active Bug';
$lang->release->finishStories = 'Finished %s Stories';
$lang->release->resolvedBugs = 'Resolved %s Bugs';
$lang->release->createdBugs = 'Unresolved %s Bug';
$lang->release->export = 'Export as HTML';
$lang->release->yesterday = 'Released Yesterday';
$lang->release->all = 'All';
$lang->release->notify = 'Notify';
$lang->release->notifyUsers = 'Notify Users';
$lang->release->mailto = 'Mailto';
$lang->release->mailContent = '<p>Dear users,</p><p style="margin-left: 30px;">The following requirements and bugs you feedback have been released in the %s. Please contact your account manager to check the latest version.</p>';
$lang->release->storyList = '<p style="margin-left: 30px;">Story List:%s。</p>';
$lang->release->bugList = '<p style="margin-left: 30px;">Bug List:%s。</p>';
$lang->release->id = 'ID';
$lang->release->product = $lang->productCommon;
$lang->release->branch = 'Platform/Branch';
$lang->release->project = 'Project';
$lang->release->build = 'Build';
$lang->release->name = 'Name';
$lang->release->marker = 'Milestone';
$lang->release->date = 'Release Date';
$lang->release->desc = 'Description';
$lang->release->files = 'Files';
$lang->release->status = 'Status';
$lang->release->subStatus = 'Sub Status';
$lang->release->last = 'Last Release';
$lang->release->unlinkStory = 'Unlink Story';
$lang->release->unlinkBug = 'Unlink Bug';
$lang->release->stories = 'Finished Story';
$lang->release->bugs = 'Resolved Bug';
$lang->release->leftBugs = 'Active Bug';
$lang->release->generatedBugs = 'Active Bug';
$lang->release->finishStories = 'Finished %s Stories';
$lang->release->resolvedBugs = 'Resolved %s Bugs';
$lang->release->createdBugs = 'Unresolved %s Bug';
$lang->release->export = 'Export as HTML';
$lang->release->yesterday = 'Released Yesterday';
$lang->release->all = 'All';
$lang->release->notify = 'Notify';
$lang->release->notifyUsers = 'Notify Users';
$lang->release->mailto = 'Mailto';
$lang->release->mailContent = '<p>Dear users,</p><p style = "margin-left: 30px;">The following requirements and bugs you feedback have been released in the %s. Please contact your account manager to check the latest version.</p>';
$lang->release->storyList = '<p style = "margin-left: 30px;">Story List:%s。</p>';
$lang->release->bugList = '<p style = "margin-left: 30px;">Bug List:%s。</p>';
$lang->release->pageAllSummary = 'Total releases: <strong>%total%</strong>, Normal: <strong>%normal%</strong>, Terminate: <strong>%terminate%</strong>。';
$lang->release->pageSummary = "Total releases: <strong>%s</strong>.";
$lang->release->storyTitle = 'Story Name';
$lang->release->bugTitle = 'Bug Name';
+33 -31
View File
@@ -33,37 +33,39 @@ $lang->release->errorDate = "La date de release ne doit pas être supé
$lang->release->basicInfo = 'Infos de Base';
$lang->release->id = 'ID';
$lang->release->product = $lang->productCommon;
$lang->release->branch = 'Plateforme/Branche';
$lang->release->project = 'Project';
$lang->release->build = 'Build';
$lang->release->name = 'Nom';
$lang->release->marker = 'Etape Importante';
$lang->release->date = 'Date Release';
$lang->release->desc = 'Description';
$lang->release->files = 'Files';
$lang->release->status = 'Statut';
$lang->release->subStatus = 'Sous-statut';
$lang->release->last = 'Dernière Release';
$lang->release->unlinkStory = 'Retirer Story';
$lang->release->unlinkBug = 'Retirer Bug';
$lang->release->stories = 'Stories Terminées';
$lang->release->bugs = 'Bugs Résolus';
$lang->release->leftBugs = 'Bugs Actifs';
$lang->release->generatedBugs = 'Bugs Actifs';
$lang->release->finishStories = '%s Stories Terminées';
$lang->release->resolvedBugs = '%s Bugs Résolus';
$lang->release->createdBugs = '%s Bugs non résolus';
$lang->release->export = 'Export HTML';
$lang->release->yesterday = 'Versionné Hier';
$lang->release->all = 'Tout';
$lang->release->notify = 'Notify';
$lang->release->notifyUsers = 'Notify Users';
$lang->release->mailto = 'Mailto';
$lang->release->mailContent = '<p>Dear users,</p><p style="margin-left: 30px;">The following requirements and bugs you feedback have been released in the %s. Please contact your account manager to check the latest version.</p>';
$lang->release->storyList = '<p style="margin-left: 30px;">Story List:%s。</p>';
$lang->release->bugList = '<p style="margin-left: 30px;">Bug List:%s。</p>';
$lang->release->id = 'ID';
$lang->release->product = $lang->productCommon;
$lang->release->branch = 'Plateforme/Branche';
$lang->release->project = 'Project';
$lang->release->build = 'Build';
$lang->release->name = 'Nom';
$lang->release->marker = 'Etape Importante';
$lang->release->date = 'Date Release';
$lang->release->desc = 'Description';
$lang->release->files = 'Files';
$lang->release->status = 'Statut';
$lang->release->subStatus = 'Sous-statut';
$lang->release->last = 'Dernière Release';
$lang->release->unlinkStory = 'Retirer Story';
$lang->release->unlinkBug = 'Retirer Bug';
$lang->release->stories = 'Stories Terminées';
$lang->release->bugs = 'Bugs Résolus';
$lang->release->leftBugs = 'Bugs Actifs';
$lang->release->generatedBugs = 'Bugs Actifs';
$lang->release->finishStories = '%s Stories Terminées';
$lang->release->resolvedBugs = '%s Bugs Résolus';
$lang->release->createdBugs = '%s Bugs non résolus';
$lang->release->export = 'Export HTML';
$lang->release->yesterday = 'Versionné Hier';
$lang->release->all = 'Tout';
$lang->release->notify = 'Notify';
$lang->release->notifyUsers = 'Notify Users';
$lang->release->mailto = 'Mailto';
$lang->release->mailContent = '<p>Dear users,</p><p style = "margin-left: 30px;">The following requirements and bugs you feedback have been released in the %s. Please contact your account manager to check the latest version.</p>';
$lang->release->storyList = '<p style = "margin-left: 30px;">Story List:%s。</p>';
$lang->release->bugList = '<p style = "margin-left: 30px;">Bug List:%s。</p>';
$lang->release->pageAllSummary = 'Total releases: <strong>%total%</strong>, Normal: <strong>%normal%</strong>, Terminate: <strong>%terminate%</strong>。';
$lang->release->pageSummary = "Total releases: <strong>%s</strong>.";
$lang->release->storyTitle = 'Story Name';
$lang->release->bugTitle = 'Bug Name';
+33 -31
View File
@@ -33,37 +33,39 @@ $lang->release->errorDate = '发布日期不能大于今天。';
$lang->release->basicInfo = '基本信息';
$lang->release->id = 'ID';
$lang->release->product = $lang->productCommon;
$lang->release->branch = '平台/分支';
$lang->release->project = '所属项目';
$lang->release->build = '版本';
$lang->release->name = '发布名称';
$lang->release->marker = '里程碑';
$lang->release->date = '发布日期';
$lang->release->desc = '描述';
$lang->release->files = '附件';
$lang->release->status = '状态';
$lang->release->subStatus = '子状态';
$lang->release->last = '上次发布';
$lang->release->unlinkStory = "移除{$lang->SRCommon}";
$lang->release->unlinkBug = '移除Bug';
$lang->release->stories = "完成的{$lang->SRCommon}";
$lang->release->bugs = '解决的Bug';
$lang->release->leftBugs = '遗留的Bug';
$lang->release->generatedBugs = '遗留的Bug';
$lang->release->finishStories = "本次共完成 %s 个{$lang->SRCommon}";
$lang->release->resolvedBugs = '本次共解决 %s 个Bug';
$lang->release->createdBugs = '本次共遗留 %s 个Bug';
$lang->release->export = '导出HTML';
$lang->release->yesterday = '昨日发布';
$lang->release->all = '所有';
$lang->release->notify = '发送通知';
$lang->release->notifyUsers = '通知人员';
$lang->release->mailto = '抄送给';
$lang->release->mailContent = '<p>尊敬的用户,您好!</p><p style="margin-left: 30px;">您反馈的如下需求和Bug已经在 %s版本中发布,请联系客户经理查看最新版本。</p>';
$lang->release->storyList = '<p style="margin-left: 30px;">需求列表:%s。</p>';
$lang->release->bugList = '<p style="margin-left: 30px;">Bug列表:%s。</p>';
$lang->release->id = 'ID';
$lang->release->product = $lang->productCommon;
$lang->release->branch = '平台/分支';
$lang->release->project = '所属项目';
$lang->release->build = '版本';
$lang->release->name = '发布名称';
$lang->release->marker = '里程碑';
$lang->release->date = '发布日期';
$lang->release->desc = '描述';
$lang->release->files = '附件';
$lang->release->status = '状态';
$lang->release->subStatus = '子状态';
$lang->release->last = '上次发布';
$lang->release->unlinkStory = "移除{$lang->SRCommon}";
$lang->release->unlinkBug = '移除Bug';
$lang->release->stories = "完成的{$lang->SRCommon}";
$lang->release->bugs = '解决的Bug';
$lang->release->leftBugs = '遗留的Bug';
$lang->release->generatedBugs = '遗留的Bug';
$lang->release->finishStories = "本次共完成 %s 个{$lang->SRCommon}";
$lang->release->resolvedBugs = '本次共解决 %s 个Bug';
$lang->release->createdBugs = '本次共遗留 %s 个Bug';
$lang->release->export = '导出HTML';
$lang->release->yesterday = '昨日发布';
$lang->release->all = '所有';
$lang->release->notify = '发送通知';
$lang->release->notifyUsers = '通知人员';
$lang->release->mailto = '抄送给';
$lang->release->mailContent = '<p>尊敬的用户,您好!</p><p style="margin-left: 30px;">您反馈的如下需求和Bug已经在 %s版本中发布,请联系客户经理查看最新版本。</p>';
$lang->release->storyList = '<p style="margin-left: 30px;">需求列表:%s。</p>';
$lang->release->bugList = '<p style="margin-left: 30px;">Bug列表:%s。</p>';
$lang->release->pageAllSummary = '本页共 <strong>%total%</strong> 个发布,正常 <strong>%normal%</strong>,停止维护 <strong>%terminate%</strong>。';
$lang->release->pageSummary = "本页共 <strong>%s</strong> 个发布。";
$lang->release->storyTitle = '需求名称';
$lang->release->bugTitle = 'Bug名称';
+9 -5
View File
@@ -13,6 +13,9 @@
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/tablesorter.html.php';?>
<?php js::set('confirmDelete', $lang->release->confirmDelete)?>
<?php js::set('pageAllSummary', $lang->release->pageAllSummary)?>
<?php js::set('pageSummary', $lang->release->pageSummary)?>
<?php js::set('type', $type)?>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left">
<?php
@@ -48,13 +51,13 @@
<tr>
<th class='c-id'><?php echo $lang->release->id;?></th>
<th class="c-name"><?php echo $lang->release->name;?></th>
<th class="c-project"><?php echo $lang->release->project;?></th>
<th class="c-build"><?php echo $lang->release->build;?></th>
<?php if($product->type != 'normal'):?>
<th class='text-center c-branch'><?php echo $lang->product->branch;?></th>
<?php endif;?>
<th class='c-date text-center'><?php echo $lang->release->date;?></th>
<th class="c-project"><?php echo $lang->release->project;?></th>
<th class='text-center c-status'><?php echo $lang->release->status;?></th>
<th class='c-date text-center'><?php echo $lang->release->date;?></th>
<?php
$extendFields = $this->release->getFlowExtendFields();
foreach($extendFields as $extendField) echo "<th>{$extendField->name}</th>";
@@ -65,7 +68,7 @@
<tbody>
<?php foreach($releases as $release):?>
<?php $canBeChanged = common::canBeChanged('release', $release);?>
<tr>
<tr data-type='<?php echo $release->status;?>'>
<td><?php echo html::a(inlink('view', "releaseID=$release->id"), sprintf('%03d', $release->id));?></td>
<td>
<?php
@@ -73,16 +76,16 @@
echo html::a(inlink('view', "release=$release->id"), $release->name, '', "title='$release->name'") . $flagIcon;
?>
</td>
<td title='<?php echo $release->projectName?>'><?php echo $release->projectName;?></td>
<td title='<?php echo $release->buildName?>'><?php echo empty($release->execution) ? $release->buildName : html::a($this->createLink('build', 'view', "buildID=$release->buildID"), $release->buildName);?></td>
<?php if($product->type != 'normal'):?>
<td class='text-center' title='<?php echo zget($branches, $release->branch, '');?>'><?php echo $branches[$release->branch];?></td>
<?php endif;?>
<td class='text-center'><?php echo $release->date;?></td>
<td title='<?php echo $release->projectName?>'><?php echo $release->projectName;?></td>
<?php $status = $this->processStatus('release', $release);?>
<td class='c-status text-center' title='<?php echo $status;?>'>
<span class="status-release status-<?php echo $release->status?>"><?php echo $status;?></span>
</td>
<td class='text-center'><?php echo $release->date;?></td>
<?php foreach($extendFields as $extendField) echo "<td>" . $this->loadModel('flow')->getFieldValue($extendField, $release) . "</td>";?>
<td class='c-actions'>
<?php echo $this->release->buildOperateMenu($release, 'browse');?>
@@ -92,6 +95,7 @@
</tbody>
</table>
<div class='table-footer'>
<div class="table-statistic"></div>
<?php $pager->show('right', 'pagerjs');?>
</div>
<?php endif;?>
+17 -6
View File
@@ -72,9 +72,9 @@ class stageModel extends model
->batchCheck($this->config->stage->create->requiredFields, 'notempty')
->checkIF($stage->percent != '', 'percent', 'float')
->exec();
if(dao::isError()) return false;
if(dao::isError()) return false;
$stageID = $this->dao->lastInsertID();
$this->action->create('stage', $stageID, 'Opened');
}
@@ -117,13 +117,24 @@ class stageModel extends model
* Get stages.
*
* @param string $orderBy
* @param int $projectID
* @access public
* @return array
*/
public function getStages($orderBy = 'id_desc')
public function getStages($orderBy = 'id_desc', $projectID = 0)
{
return $this->dao->select('*')->from(TABLE_STAGE)->where('deleted')->eq(0)->orderBy($orderBy)->fetchAll('id');
}
$stages = $this->dao->select('t1.id,name,type,percent,openedBy as createdBy,begin as createdDate,lastEditedBy as editedBy,end as editedDate,deleted')
->from(TABLE_EXECUTION)->alias('t1')
->where('t1.type')->in('sprint,stage,kanban')
->andWhere('t1.deleted')->eq('0')
->andWhere('t1.vision')->eq($this->config->vision)
->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->sprints)->fi()
->beginIF($projectID)->andWhere('t1.project')->eq($projectID)->fi()
->orderBy($orderBy)
->fetchAll('id');
$stages = !empty($stages) ? $stages : $this->dao->select('*')->from(TABLE_STAGE)->where('deleted')->eq(0)->orderBy($orderBy)->fetchAll('id');
return $stages;
}
/**
* Get pairs of stage.
-18
View File
@@ -2466,24 +2466,6 @@ class story extends control
echo json_encode($storyInfo);
}
/**
* AJAX: get the user requirements of the product.
*
* @param int $productID
* @param string $labelName
* @param bool $isMultiple
* @param int $defaultID
* @access public
* @return string
*/
public function ajaxGetProductURS($productID, $labelName = '', $isMultiple = false, $defaultID = '')
{
$requirements = array('0' => '') + $this->story->getRequirements($productID);
$labelName = $isMultiple ? $labelName . '[]' : $labelName;
$misc = $isMultiple ? 'class="form-control" multiple' : 'class="form-control"';
return print(html::select($labelName, $requirements, $defaultID, $misc));
}
/**
* AJAX: get the parent story.
*
+24
View File
@@ -62,3 +62,27 @@ function getStatus(method, params)
$('form #status').val(status).change();
});
}
/**
* Load URS.
*
* @access public
* @return void
*/
function loadURS()
{
var productID = $('#product').val();
var branchID = $('#branch').val();
var moduleID = $('#module').val();
var requirementList = $('#URS').val();
requirementList = requirementList ? requirementList.join(',') : '';
var link = createLink('story', 'ajaxGetURS', 'productID=' + productID + '&branchID=' + branchID + '&moduleID=' + moduleID + '&requirementList=' + requirementList);
$.post(link, function(data)
{
$('#URS').replaceWith(data);
$('#URS_chosen').remove();
$('#URS').chosen();
});
}
-24
View File
@@ -80,30 +80,6 @@ function loadAssignedTo()
});
}
/**
* Load URS.
*
* @access public
* @return void
*/
function loadURS()
{
var productID = $('#product').val();
var branchID = $('#branch').val();
var moduleID = $('#module').val();
var requirementList = $('#URS').val();
requirementList = requirementList ? requirementList.join(',') : '';
var link = createLink('story', 'ajaxGetURS', 'productID=' + productID + '&branchID=' + branchID + '&moduleID=' + moduleID + '&requirementList=' + requirementList);
$.post(link, function(data)
{
$('#URS').replaceWith(data);
$('#URS_chosen').remove();
$('#URS').chosen();
});
}
function refreshPlan()
{
loadProductPlans($('#product').val(), $('#branch').val());
+1 -1
View File
@@ -4805,7 +4805,7 @@ class storyModel extends model
if($story->module and isset($modulePairs[$story->module])) echo "<span class='label label-gray label-badge'>{$modulePairs[$story->module]}</span> ";
if($story->parent > 0) echo '<span class="label label-badge label-light" title="' . $this->lang->story->children . '">' . $this->lang->story->childrenAB . '</span> ';
echo $canView ? html::a($storyLink, $story->title, '', "title='$story->title' style='color: $story->color' data-app='$tab'") : "<span style='color: $story->color'>{$story->title}</span>";
if(!empty($story->children)) echo '<a class="story-toggle" data-id="' . $story->id . '"><i class="icon icon-angle-double-right"></i></a>';
if(!empty($story->children)) echo '<a class="story-toggle" data-id="' . $story->id . '"><i class="icon icon-angle-right"></i></a>';
break;
case 'plan':
echo isset($story->planTitle) ? $story->planTitle : '';
-13
View File
@@ -40,15 +40,6 @@ function loadProduct(productID)
if(typeof(storyType) == 'string' && storyType == 'story')
{
var requirementLink = createLink('story', 'ajaxGetProductURS', 'productID=' + productID + '&labelName=URS' + '&isMultiple=1');
$.get(requirementLink, function(data)
{
$('#URS').replaceWith(data);
$('#URS' + "_chosen").remove();
$('#URS').next('.picker').remove();
$('#URS').chosen();
});
var storyLink = createLink('story', 'ajaxGetParentStory', 'productID=' + productID + '&labelName=parent');
$.get(storyLink, function(data)
{
@@ -75,7 +66,6 @@ function loadBranch()
loadProductModules(productID, branch);
loadProductPlans(productID, branch);
loadURS();
}
/**
@@ -105,7 +95,6 @@ function loadProductBranches(productID)
loadProductModules(productID, $('#branch').val());
loadProductPlans(productID, $('#branch').val());
loadURS();
})
}
@@ -136,8 +125,6 @@ function loadProductModules(productID, branch)
if(typeof(storyModule) == 'string' && config.currentMethod != 'edit') $moduleIDBox.prepend("<span class='input-group-addon'>" + storyModule + "</span>");
$moduleIDBox.fixInputGroup();
});
loadURS();
}
/**
+16 -1
View File
@@ -291,7 +291,22 @@ class task extends control
/* Set Custom*/
foreach(explode(',', $this->config->task->customCreateFields) as $field) $customFields[$field] = $this->lang->task->$field;
$executions = $this->config->systemMode == 'classic' ? $executions : $this->execution->getByProject($projectID, 'noclosed', 0, true);
$executionAll = array();
if(!empty($projectID))
{
$executionList = $this->execution->getByProject($projectID, 'noclosed', 0, true);
$project = $this->loadModel('project')->getByID($projectID);
$replace = substr(current($executionList), 0, strpos(current($executionList), '/'));
if(isset($project->model) and $project->model == 'waterfall')
{
foreach($executionList as $key => $val)
{
$values = str_replace($replace, $project->name, $val);
$executionAll[$key] = $values;
}
}
}
$executions = $this->config->systemMode == 'classic' ? $executions : $executionAll;
$testStoryIdList = $this->loadModel('story')->getTestStories(array_keys($stories), $execution->id);
/* Stories that can be used to create test tasks. */
+12
View File
@@ -81,6 +81,17 @@ class testsuite extends control
$pager = pager::init(0, $recPerPage, 1);
$suites = $this->testsuite->getSuites($productID, $sort, $pager, $type);
}
$privateNum = 0;
foreach($suites as $suiteItem)
{
if($suiteItem->type == 'private')
{
$privateNum++;
}
}
$suitesNum = !empty(count($suites, 0)) ? count($suites, 0) : 0;
$publicNum = $suitesNum - $privateNum;
$summary = str_replace(array('%total%', '%public%', '%private%'), array($suitesNum, $publicNum, $privateNum), $this->lang->testsuite->summary);
$this->view->title = $productName . $this->lang->testsuite->common;
$this->view->position[] = html::a($this->createLink('testsuite', 'browse', "productID=$productID"), $productName);
@@ -94,6 +105,7 @@ class testsuite extends control
$this->view->users = $this->loadModel('user')->getPairs('noclosed|noletter');
$this->view->pager = $pager;
$this->view->product = $this->product->getByID($productID);
$this->view->summary = $summary;
$this->display();
}
+2 -1
View File
@@ -48,6 +48,7 @@ $lang->testsuite->confirmUnlinkCase = 'Möchten Sie diese Verknüpfung aufheben?
$lang->testsuite->noticeNone = 'Sie haben noch keine Suite erstellt.';
$lang->testsuite->noModule = '<div>Sie haben keine Module</div><div>Jetzt verwalten</div>';
$lang->testsuite->noTestsuite = 'Keine Suite. ';
$lang->testsuite->summary = "Total suites: <strong>%total%</strong>, public: <strong>%public%</strong>, private: <strong>%private%</strong>.";
$lang->testsuite->lblCases = 'Fälle';
$lang->testsuite->lblUnlinkCase = 'Unverknüpfte Fälle';
@@ -55,4 +56,4 @@ $lang->testsuite->lblUnlinkCase = 'Unverknüpfte Fälle';
$lang->testsuite->authorList['private'] = 'Privat';
$lang->testsuite->authorList['public'] = 'Öffentlich';
$lang->testsuite->featureBar['browse']['all'] = 'Suite List';
$lang->testsuite->featureBar['browse']['all'] = 'Suite List';
+2 -1
View File
@@ -48,6 +48,7 @@ $lang->testsuite->confirmUnlinkCase = 'Do you want to unlink this Case?';
$lang->testsuite->noticeNone = 'You have not created any suite yet.';
$lang->testsuite->noModule = '<div>You have no modules.</div><div>Manage it now.</div>';
$lang->testsuite->noTestsuite = 'No suites yet.';
$lang->testsuite->summary = "Total suites: <strong>%total%</strong>, public: <strong>%public%</strong>, private: <strong>%private%</strong>.";
$lang->testsuite->lblCases = 'Cases';
$lang->testsuite->lblUnlinkCase = 'Unlink Case';
@@ -55,4 +56,4 @@ $lang->testsuite->lblUnlinkCase = 'Unlink Case';
$lang->testsuite->authorList['private'] = 'Private';
$lang->testsuite->authorList['public'] = 'Public';
$lang->testsuite->featureBar['browse']['all'] = 'Suite List';
$lang->testsuite->featureBar['browse']['all'] = 'Suite List';
+2 -1
View File
@@ -48,6 +48,7 @@ $lang->testsuite->confirmUnlinkCase = 'Voulez-vous retirer ce CasTest ?';
$lang->testsuite->noticeNone = "Vous n'avez pas encore créé de Cahier de Recette pour l'instant.";
$lang->testsuite->noModule = '<div>Vous avez aucun Module.</div><div>Gérer les Modules maintenant.</div>';
$lang->testsuite->noTestsuite = 'Aucun Cahier de Recette.';
$lang->testsuite->summary = "Total suites: <strong>%total%</strong>, public: <strong>%public%</strong>, private: <strong>%private%</strong>.";
$lang->testsuite->lblCases = 'CasTests';
$lang->testsuite->lblUnlinkCase = 'Retirer CasTest';
@@ -55,4 +56,4 @@ $lang->testsuite->lblUnlinkCase = 'Retirer CasTest';
$lang->testsuite->authorList['private'] = 'Privé';
$lang->testsuite->authorList['public'] = 'Public';
$lang->testsuite->featureBar['browse']['all'] = 'Suite List';
$lang->testsuite->featureBar['browse']['all'] = 'Suite List';
+2 -1
View File
@@ -45,6 +45,7 @@ $lang->testsuite->confirmUnlinkCase = 'Bạn có muốn hủy liên kết tình
$lang->testsuite->noticeNone = 'Bạn chưa tạo suite nào';
$lang->testsuite->noModule = '<div>Chưa có Module.</div><div>Quản lý ngay.</div>';
$lang->testsuite->noTestsuite = 'Không có suites nào';
$lang->testsuite->summary = "Tổng <strong>%total%</strong> suites nào, Công khai: <strong>%public%</strong>, Riêng tư: <strong>%private%</strong>.";
$lang->testsuite->lblCases = 'Tình huống';
$lang->testsuite->lblUnlinkCase = 'Hủy liên kết tình huống';
@@ -52,4 +53,4 @@ $lang->testsuite->lblUnlinkCase = 'Hủy liên kết tình huống';
$lang->testsuite->authorList['private'] = 'Riêng tư';
$lang->testsuite->authorList['public'] = 'Công khai';
$lang->testsuite->featureBar['browse']['all'] = 'Suite List';
$lang->testsuite->featureBar['browse']['all'] = 'Suite List';
+2 -1
View File
@@ -48,6 +48,7 @@ $lang->testsuite->confirmUnlinkCase = '您确认要移除该用例吗?';
$lang->testsuite->noticeNone = '您还没有创建套件';
$lang->testsuite->noModule = '<div>您现在还没有模块信息</div><div>请维护用例库模块</div>';
$lang->testsuite->noTestsuite = '暂时没有套件。';
$lang->testsuite->summary = "本页共 <strong>%total%</strong> 个套件,公开 <strong>%public%</strong> 个,私有 <strong>%private%</strong> 个。";
$lang->testsuite->lblCases = '用例列表';
$lang->testsuite->lblUnlinkCase = '移除用例';
@@ -55,4 +56,4 @@ $lang->testsuite->lblUnlinkCase = '移除用例';
$lang->testsuite->authorList['private'] = '私有';
$lang->testsuite->authorList['public'] = '公开';
$lang->testsuite->featureBar['browse']['all'] = '套件列表';
$lang->testsuite->featureBar['browse']['all'] = '套件列表';
+1
View File
@@ -47,6 +47,7 @@ $lang->testsuite->confirmUnlinkCase = '您確認要移除該用例嗎?';
$lang->testsuite->noticeNone = '您還沒有創建套件';
$lang->testsuite->noModule = '<div>您現在還沒有模組信息</div><div>請維護用例庫模組</div>';
$lang->testsuite->noTestsuite = '暫時沒有套件。';
$lang->testsuite->summary = "本頁共 <strong>%total%</strong> 個套件,公開 <strong>%public%</strong> 個,私有 <strong>%private%</strong> 個。";
$lang->testsuite->lblCases = '用例列表';
$lang->testsuite->lblUnlinkCase = '移除用例';
+4 -1
View File
@@ -82,7 +82,10 @@
<?php endforeach;?>
</tbody>
</table>
<div class='table-footer'><?php $pager->show('right', 'pagerjs');?></div>
<div class='table-footer'>
<div class='table-statistic'><?php echo $summary;?></div>
<?php $pager->show('right', 'pagerjs');?>
</div>
<?php endif;?>
</div>
<?php include '../../common/view/footer.html.php';?>
+7 -6
View File
@@ -60,13 +60,13 @@ $status = $this->session->testTaskVersionStatus;
<tr>
<th class='c-id text-left'> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
<th class='c-name text-left'> <?php common::printOrderLink('name', $orderBy, $vars, $lang->testtask->name);?></th>
<th class='text-left'> <?php common::printOrderLink('build', $orderBy, $vars, $lang->testtask->build);?></th>
<th class='text-left'> <?php common::printOrderLink('product', $orderBy, $vars, $lang->testtask->product);?></th>
<th class='text-left'> <?php common::printOrderLink('execution', $orderBy, $vars, $lang->testtask->execution);?></th>
<th class='text-left'> <?php common::printOrderLink('build', $orderBy, $vars, $lang->testtask->build);?></th>
<th class='c-status text-left'><?php common::printOrderLink('status', $orderBy, $vars, $lang->statusAB);?></th>
<th class='c-user text-left'> <?php common::printOrderLink('owner', $orderBy, $vars, $lang->testtask->owner);?></th>
<th class='c-date text-left'> <?php common::printOrderLink('begin', $orderBy, $vars, $lang->testtask->begin);?></th>
<th class='c-date text-left'> <?php common::printOrderLink('end', $orderBy, $vars, $lang->testtask->end);?></th>
<th class='c-status text-left'><?php common::printOrderLink('status', $orderBy, $vars, $lang->statusAB);?></th>
<?php
$extendFields = $this->testtask->getFlowExtendFields();
foreach($extendFields as $extendField) echo "<th>{$extendField->name}</th>";
@@ -79,18 +79,19 @@ $status = $this->session->testTaskVersionStatus;
<tr class='text-left'>
<td><?php echo html::a(inlink('cases', "taskID=$task->id"), sprintf('%03d', $task->id));?></td>
<td class='c-name' title="<?php echo $task->name?>"><?php echo html::a(inlink('cases', "taskID=$task->id"), $task->name);?></td>
<td class='c-name' title="<?php echo $task->buildName?>"><?php echo ($task->build == 'trunk' || empty($task->buildName)) ? $lang->trunk : html::a($this->createLink('build', 'view', "buildID=$task->build"), $task->buildName, '', "data-group=execution");?></td>
<td class='c-name' title="<?php echo $task->productName?>"><?php echo $task->productName?></td>
<td class='c-name' title="<?php echo $task->executionName?>"><?php echo $task->executionName?></td>
<td class='c-name' title="<?php echo $task->buildName?>"><?php echo ($task->build == 'trunk' || empty($task->buildName)) ? $lang->trunk : html::a($this->createLink('build', 'view', "buildID=$task->build"), $task->buildName, '', "data-group=execution");?></td>
<td title="<?php echo zget($users, $task->owner);?>"><?php echo zget($users, $task->owner);?></td>
<td><?php echo $task->begin?></td>
<td><?php echo $task->end?></td>
<?php $status = $this->processStatus('testtask', $task);?>
<td title='<?php echo $status;?>'>
<span class='status-task status-<?php echo $task->status?>'>
<?php echo $status;?>
</span>
</td>
<td title="<?php echo zget($users, $task->owner);?>"><?php echo zget($users, $task->owner);?></td>
<td><?php echo $task->begin?></td>
<td><?php echo $task->end?></td>
<?php foreach($extendFields as $extendField) echo "<td>" . $this->loadModel('flow')->getFieldValue($extendField, $task) . "</td>";?>
<td class='c-actions'>
<?php echo $this->testtask->buildOperateMenu($task, 'browse');?>
+3 -3
View File
@@ -39,10 +39,10 @@
<thead>
<tr class='text-center'>
<th class='c-id'> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
<th class='text-left'> <?php common::printOrderLink('title', $orderBy, $vars, $lang->bug->title);?></th>
<th class='c-severity' title=<?php echo $lang->bug->severity;?>><?php common::printOrderLink('severity', $orderBy, $vars, $lang->bug->severityAB);?></th>
<th class='c-pri' title='<?php echo $lang->pri;?>'><?php common::printOrderLink('pri', $orderBy, $vars, $lang->priAB);?></th>
<th class='c-type'> <?php common::printOrderLink('type', $orderBy, $vars, $lang->typeAB);?></th>
<th class='text-left'> <?php common::printOrderLink('title', $orderBy, $vars, $lang->bug->title);?></th>
<th class='c-user'> <?php common::printOrderLink('openedBy', $orderBy, $vars, $lang->openedByAB);?></th>
<th class='c-user'> <?php common::printOrderLink('resolvedBy', $orderBy, $vars, $lang->bug->resolvedBy);?></th>
<th class='c-resolution'><?php common::printOrderLink('resolution', $orderBy, $vars, $lang->bug->resolutionAB);?></th>
@@ -52,10 +52,10 @@
<?php foreach($bugs as $bug):?>
<tr class='text-center'>
<td><?php echo html::a($this->createLink('bug', 'view', "bugID=$bug->id"), $bug->id, '_blank');?></td>
<td class='text-left nobr'><?php echo html::a($this->createLink('bug', 'view', "bugID=$bug->id"), $bug->title);?></td>
<td><span class='<?php echo 'severity' . zget($lang->bug->severityList, $bug->severity, $bug->severity)?>'><?php echo zget($lang->bug->severityList, $bug->severity, $bug->severity)?></span></td>
<td><span class='<?php echo 'pri' . zget($lang->bug->priList, $bug->pri, $bug->pri)?>'><?php echo zget($lang->bug->priList, $bug->pri, $bug->pri)?></span></td>
<td><?php echo $lang->bug->typeList[$bug->type]?></td>
<td class='text-left nobr'><?php echo html::a($this->createLink('bug', 'view', "bugID=$bug->id"), $bug->title);?></td>
<td><?php echo zget($lang->bug->typeList, $bug->type, '');?></td>
<td><?php echo zget($users, $bug->openedBy);?></td>
<td><?php echo zget($users, $bug->resolvedBy);?></td>
<td><?php echo zget($lang->bug->resolutionList, $bug->resolution);?></td>
+13 -1
View File
@@ -32,6 +32,13 @@ class repoTest
return $objects;
}
/**
* Get switcher test.
*
* @param int $repoID
* @access public
* @return object
*/
public function getSwitcherTest($repoID)
{
$objects = $this->objectModel->getSwitcher($repoID);
@@ -59,8 +66,13 @@ class repoTest
return $objects;
}
public function createTest()
public function createTest($list)
{
$init = array('SCM' => '', 'serviceHost' => '', 'serviceProject' => '', 'name' => '', 'path' => '', 'encoding' => '', 'client' => '', 'account' => '', 'password' => '', 'encrypt' => '', 'desc' => '', 'uid' => '');
foreach($init as $filed => $defaultvalue) $_POST[$filed] = $defaultvalue;
foreach($list as $key => $value) $_POST[$key] = $value;
$objects = $this->objectModel->create();
if(dao::isError()) return dao::getError();
Regular → Executable
+3 -1
View File
@@ -10,6 +10,8 @@ title=测试 repoModel->checkPriv();
cid=1
pid=1
检查用户权限,返回布尔值 >> 0
*/
$checkPriv = new repoTest();
@@ -20,4 +22,4 @@ $repo->acl->user = 'admin';
$result = $checkPriv->checkPrivTest($repo);
r($result) && p($result) && e('0');
r($result) && p($result) && e('0'); //检查用户权限,返回布尔值
Regular → Executable
+44 -1
View File
@@ -10,8 +10,51 @@ title=测试 repoModel->create();
cid=1
pid=1
正常创建gitlab版本库 >> 1
当已有版本库时提示已有记录 >> 『名称』已经有『jktest』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。
当数据类型为Gitea时提示写版本号 >> 因为安全原因,需要检测客户端版本,请将版本号写入文件
*/
$repo = new repoTest();
r($repo->createTest()) && p() && e();
$list = array(
'product' => '1',
'SCM' => 'Gitlab',
'serviceHost' => '2',
'serviceProject' => '971',
'name' => 'zzxx',
'path' => '',
'encoding' => 'utf-8',
'client' => '/usr/bin/git',
'account' => '',
'password' => '',
'encrypt' => 'base64',
'desc' => '',
'uid' => '6321819c78be5'
);
$listOne = array(
'SCM' => 'Gitea',
'serviceHost' => 2,
'serviceProject' => 'root/Demo',
'name' => 'Demo',
'path' => '',
'encoding' => 'utf-8',
'client' => '/usr/bin/git',
'account' => '',
'password' => '',
'encrypt' => 'base64',
'desc' => '',
'uid' => '6322b184f3a72'
);
$resultOne = $repo->createTest($list);
$resultTwo = $repo->createTest($list);
$resultThree = $repo->createTest($listOne);
r($resultOne) && p($resultOne) && e('1'); //正常创建gitlab版本库
r($resultTwo) && p('name:0') && e('『名称』已经有『jktest』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。'); //当已有版本库时提示已有记录
r($resultThree) && p($resultThree) && e('因为安全原因,需要检测客户端版本,请将版本号写入文件'); //当数据类型为Gitea时提示写版本号
$db->restoreDB();
+3
View File
@@ -202,6 +202,9 @@ switch($argv[1])
case 'webhook':
ztfRun('model/webhook');
break;
case 'repo':
ztfRun('model/repo');
break;
default:
ztfExtract($argv[1]);
+5 -5
View File
@@ -835,8 +835,8 @@ function toggleFold(form, unfoldIdList, objectID, objectType)
if($parentTd.length == 0) return false;
var toggleClass = objectType == 'product' ? 'story-toggle' : 'task-toggle';
var nameClass = objectType == 'product' ? 'c-title' : 'c-name';
$form.find('th.' + nameClass).append("<button type='button' id='toggleFold' class='btn btn-mini collapsed'>" + unfoldAll + "</button>");
var nameClass = ['product', 'productplan'].indexOf(objectType) !== -1 ? 'c-title' : 'c-name';
$form.find('th.' + nameClass).addClass('flex-between').append("<span id='toggleFold' class='collapsed'><i class='icon icon-angle-double-right'></i></span>");
var allUnfold = true;
$parentTd.each(function()
@@ -849,7 +849,7 @@ function toggleFold(form, unfoldIdList, objectID, objectType)
$(this).find('a.' + toggleClass).addClass('collapsed')
})
$form.find('th.' + nameClass + ' #toggleFold').html(allUnfold ? foldAll : unfoldAll).toggleClass('collapsed', !allUnfold);
$form.find('th.' + nameClass + ' #toggleFold').toggleClass('collapsed', !allUnfold);
$(document).on('click', '#toggleFold', function()
{
@@ -864,7 +864,7 @@ function toggleFold(form, unfoldIdList, objectID, objectType)
newUnfoldID.push(dataID);
})
$(this).html(collapsed ? foldAll : unfoldAll).toggleClass('collapsed', !collapsed);
$(this).toggleClass('collapsed', !collapsed);
url = createLink('misc', 'ajaxSetUnfoldID', 'objectID=' + objectID + '&objectType=' + objectType + '&action=' + (collapsed ? 'add' : 'delete'));
$.post(url, {'newUnfoldID': JSON.stringify(newUnfoldID)});
});
@@ -884,7 +884,7 @@ function toggleFold(form, unfoldIdList, objectID, objectType)
setTimeout(function()
{
hasCollapsed = $table.find('td.has-child a.' + toggleClass + '.collapsed').length != 0;
$('#toggleFold').html(hasCollapsed ? unfoldAll : foldAll).toggleClass('collapsed', hasCollapsed);
$('#toggleFold').toggleClass('collapsed', hasCollapsed);
}, 100);
$.post(url, {'newUnfoldID': JSON.stringify(newUnfoldID)});
+9
View File
@@ -134,9 +134,18 @@ body.xxc-embed.m-productplan-view,body.xxc-embed.m-bug-browse,body.xxc-embed.m-p
#projectForm .c-name .label-danger,
#executionTableList .c-name .label-danger,
.flex-between {display: flex !important;align-items: center;justify-content: space-between;}
#toggleFold > .icon {display: inline-block; color: #838a9d; font-size: 16px; transition: transform .2s; transform: rotate(-90deg);}
#toggleFold.collapsed > .icon {transform: rotate(90deg);}
#executionTableList .c-name .label-danger {position: absolute; top: 8px; right: 0px;}
#programTableList .c-name .label-danger {position: absolute; right: 4px; padding: 2px 4px;}
#projectForm .c-name,
#executionTableList .c-name,
#programTableList .c-name {padding-right: 64px;}
td.delayed > span {display: inline-block; height: 20px; line-height: 18px; background: #FFEBEB; color: #FB2B2B; border-radius: 20px; padding: 2px 8px;}
.table .table-children,
.table .is-nest-child {background: #F8F8F8;}
.table tbody td.has-child .icon-angle-right {color: #838a9d;}