Merge branch '15.2' into 15.3

This commit is contained in:
王怡栋
2021-08-17 19:35:15 +08:00
25 changed files with 134 additions and 18 deletions
+1
View File
@@ -21,6 +21,7 @@ $config->block->moduleIndex['project'] = 'execution';
$config->block->longBlock = array();
$config->block->longBlock['']['flowchart'] = 'flowchart';
$config->block->longBlock['']['welcome'] = 'welcome';
$config->block->longBlock['']['assigntome'] = 'assigntome';
$config->block->longBlock['product']['statistic'] = 'statistic';
$config->block->longBlock['execution']['statistic'] = 'statistic';
$config->block->longBlock['qa']['statistic'] = 'statistic';
+2
View File
@@ -1832,6 +1832,8 @@ class block extends control
/* Get projects. */
$this->app->loadLang('task');
$this->app->loadLang('program');
$this->app->loadLang('execution');
$this->view->projects = $this->loadModel('project')->getOverviewList('byStatus', $status, $orderBy, $count);
}
+22 -1
View File
@@ -235,11 +235,31 @@ $(function()
});
// Init dashboard
var sortMessager = new $.zui.Messager({close: false});
$('#dashboard').sortable(
{
selector: '.panel',
trigger: '.panel-heading:not(.not-move-handler),.panel-move-handler',
containerSelector: '.col-main,.col-side',
canMoveHere: function($ele, $target)
{
var fixedCol = $ele.data('fixed');
if(fixedCol)
{
var $targetCol = $target.closest('.col-main,.col-side');
var targetCol = $targetCol.hasClass('col-main') ? 'main' : 'side';
if(targetCol !== fixedCol)
{
!sortMessager.isShow && sortMessager.show(fixedCol === 'main' ? config.cannotPlaceInRight : config.cannotPlaceInRight);
return false;
}
else
{
sortMessager.isShow && sortMessager.hide();
}
return true;
}
},
start: function()
{
$('body').css('overflow', 'hidden');
@@ -259,7 +279,8 @@ $(function()
});
e.element.toggleClass('block-sm', isSideCol);
}
},
always: function(){sortMessager.isShow && sortMessager.hide();}
}).on('click', '.refresh-panel', function()
{
refreshBlock($(this).closest('.panel'));
+2
View File
@@ -93,6 +93,8 @@ $lang->block->refresh = 'Aktualisieren';
$lang->block->nbsp = '';
$lang->block->hidden = 'Verstecken';
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s'>%s</a></span>";
$lang->block->cannotPlaceInLeft = 'Kann den Block nicht auf der linken Seite platzieren.';
$lang->block->cannotPlaceInRight = 'Kann den Block nicht auf der rechten Seite platzieren.';
$lang->block->productName = $lang->productCommon . ' Name';
$lang->block->totalStory = 'The Total ' . $lang->SRCommon;
+2
View File
@@ -93,6 +93,8 @@ $lang->block->refresh = 'Refresh';
$lang->block->nbsp = ' ';
$lang->block->hidden = 'Hide';
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s' title='%s'>%s</a></span>";
$lang->block->cannotPlaceInLeft = 'Cannot place the block at left side.';
$lang->block->cannotPlaceInRight = 'Cannot place the block at right side.';
$lang->block->productName = $lang->productCommon . ' Name';
$lang->block->totalStory = 'The Total ' . $lang->SRCommon;
+2
View File
@@ -93,6 +93,8 @@ $lang->block->refresh = 'Rafraichir';
$lang->block->nbsp = ' ';
$lang->block->hidden = 'Masquer';
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s' title='%s'>%s</a></span>";
$lang->block->cannotPlaceInLeft = 'Impossible de placer le bloc à gauche.';
$lang->block->cannotPlaceInRight = 'Impossible de placer le bloc à droite.';
$lang->block->productName = $lang->productCommon . ' Name';
$lang->block->totalStory = 'The Total ' . $lang->SRCommon;
+2
View File
@@ -93,6 +93,8 @@ $lang->block->refresh = 'Refresh';
$lang->block->nbsp = ' ';
$lang->block->hidden = 'Ẩn';
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s' title='%s'>%s</a></span>";
$lang->block->cannotPlaceInLeft = 'Khối này không thể được đặt ở bên trái.';
$lang->block->cannotPlaceInRight = 'Khối này không thể được đặt ở bên phải.';
$lang->block->productName = $lang->productCommon . ' Name';
$lang->block->totalStory = 'The Total ' . $lang->SRCommon;
+2
View File
@@ -93,6 +93,8 @@ $lang->block->refresh = '刷新';
$lang->block->nbsp = '';
$lang->block->hidden = '隐藏';
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s' title='%s'>%s</a></span>";
$lang->block->cannotPlaceInLeft = '此区块无法放置在左侧。';
$lang->block->cannotPlaceInRight = '此区块无法放置在右侧。';
$lang->block->productName = $lang->productCommon . '名称';
$lang->block->totalStory = '总' . $lang->SRCommon;
+2
View File
@@ -93,6 +93,8 @@ $lang->block->refresh = '刷新';
$lang->block->nbsp = '';
$lang->block->hidden = '隱藏';
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s' title='%s'>%s</a></span>";
$lang->block->cannotPlaceInLeft = '此區塊無法放置在左側。';
$lang->block->cannotPlaceInRight = '此區塊無法放置在右側。';
$lang->block->productName = $lang->productCommon . '名稱';
$lang->block->totalStory = '總' . $lang->SRCommon;
+4 -1
View File
@@ -101,8 +101,11 @@ $useGuest = $this->app->user->account == 'guest';
</div>
</div>
<script>
config.ordersSaved = '<?php echo $lang->block->ordersSaved; ?>';
config.ordersSaved = '<?php echo $lang->block->ordersSaved; ?>';
config.confirmRemoveBlock = '<?php echo $lang->block->confirmRemoveBlock; ?>';
config.cannotPlaceInLeft = '<?php echo $lang->block->cannotPlaceInLeft; ?>';
config.cannotPlaceInRight = '<?php echo $lang->block->cannotPlaceInRight; ?>';
var module = '<?php echo $module?>';
var useGuest = <?php echo $useGuest ? 'true' : 'false';?>;
@@ -46,4 +46,5 @@ function changeLabel(type)
$('.label-assignto').addClass('hidden');
$('.' + type + '-count').removeClass('hidden');
}
$('#assigntomeBlock').closest('.panel').attr('data-fixed', 'main');
</script>
+1 -1
View File
@@ -53,7 +53,7 @@ $config->custom->fieldList['task']['edit'] = 'pri,estimate,estStarted,
$config->custom->fieldList['task']['finish'] = 'comment';
$config->custom->fieldList['task']['activate'] = 'assignedTo,comment';
$config->custom->fieldList['build'] = 'scmPath,filePath,desc';
$config->custom->fieldList['bug']['create'] = 'module,project,deadline,type,os,browser,severity,pri,steps,keywords';
$config->custom->fieldList['bug']['create'] = 'module,deadline,type,os,browser,severity,pri,steps,keywords';
$config->custom->fieldList['bug']['edit'] = 'plan,assignedTo,deadline,type,os,browser,severity,pri,steps,keywords';
$config->custom->fieldList['bug']['resolve'] = 'resolvedBuild,resolvedDate,assignedTo,comment';
$config->custom->fieldList['testcase']['create'] = 'stage,story,pri,precondition,keywords';
+6
View File
@@ -19,4 +19,10 @@ $(function()
$(this).siblings('div').find('span').attr('title', tip);
}
});
oldProject = $("#project").val();
$('#project').change(function()
{
if(!confirm('修改所属项目后,执行关联的原项目需求如果要更改所属项目,需手动修改到新项目,是否继续修改?')) $("#project").val(oldProject).trigger("chosen:updated");
});
})
+17
View File
@@ -1261,6 +1261,22 @@ class product extends control
$product->closedBugs = (int)$product->closedBugs;
$product->bugFixedRate = (($product->unResolved + $product->fixedBugs) == 0 ? 0 : round($product->fixedBugs / ($product->unResolved + $product->fixedBugs), 3) * 100) . '%';
$product->program = $product->programName;
/* get rowspan data */
if($lastProgram == '' or $product->program != $lastProgram)
{
$rowspan[$i]['rows']['program'] = 1;
$programI = $i;
}
else $rowspan[$programI]['rows']['program']++;
if($lastLine == '' or $product->line != $lastLine)
{
$rowspan[$i]['rows']['line'] = 1;
$lineI = $i;
}
else $rowspan[$lineI]['rows']['line']++;
$lastProgram = $product->program;
$lastLine = $product->line;
if($this->post->exportType == 'selected')
{
@@ -1270,6 +1286,7 @@ class product extends control
}
if(isset($this->config->bizVersion)) list($fields, $productStats) = $this->loadModel('workflowfield')->appendDataFromFlow($fields, $productStats);
if(isset($rowspan)) $this->post->set('rowspan', $rowspan);
$this->post->set('fields', $fields);
$this->post->set('rows', $productStats);
$this->post->set('kind', 'product');
+2 -2
View File
@@ -37,7 +37,7 @@ $lang->report->assign['assign'] = 'Zugeordnet';
$lang->report->singleColor[] = 'F6BD0F';
$lang->report->projectDeviation = 'Projektabweichungsbericht';
$lang->report->projectDeviation = "{$lang->execution->common}abweichungsbericht";
$lang->report->productSummary = $lang->productCommon . ' Zusammenfassung';
$lang->report->bugCreate = 'Bug gemeldet';
$lang->report->bugAssign = 'Bug zugeordnet';
@@ -56,7 +56,7 @@ $lang->reportList->product = new stdclass();
$lang->reportList->test = new stdclass();
$lang->reportList->staff = new stdclass();
$lang->reportList->project->lists[10] = 'Durchgeführt Abweichnung|reportprojectdeviation';
$lang->reportList->project->lists[10] = "{$lang->execution->common} Abweichnung|reportprojectdeviation";
$lang->reportList->product->lists[10] = $lang->productCommon . ' Zusammenfassung|report|productsummary';
$lang->reportList->test->lists[10] = 'Bugs gemeldet|report|bugcreate';
$lang->reportList->test->lists[13] = 'Bugs zugeordnet|report|bugassign';
+2 -2
View File
@@ -37,7 +37,7 @@ $lang->report->assign['assign'] = 'Assigned';
$lang->report->singleColor[] = 'F6BD0F';
$lang->report->projectDeviation = 'Project Deviation';
$lang->report->projectDeviation = "{$lang->execution->common} Deviation";
$lang->report->productSummary = $lang->productCommon . ' Summary';
$lang->report->bugCreate = 'Bug Reported Summary';
$lang->report->bugAssign = 'Bug Assigned Summary';
@@ -56,7 +56,7 @@ $lang->reportList->product = new stdclass();
$lang->reportList->test = new stdclass();
$lang->reportList->staff = new stdclass();
$lang->reportList->project->lists[10] = 'Execution Deviation|report|projectdeviation';
$lang->reportList->project->lists[10] = "{$lang->execution->common} Deviation|report|projectdeviation";
$lang->reportList->product->lists[10] = $lang->productCommon . ' Summary|report|productsummary';
$lang->reportList->test->lists[10] = 'Bug Reported Summary|report|bugcreate';
$lang->reportList->test->lists[13] = 'Bug Assigned Summary|report|bugassign';
+2 -2
View File
@@ -37,7 +37,7 @@ $lang->report->assign['assign'] = 'Affecté';
$lang->report->singleColor[] = 'F6BD0F';
$lang->report->projectDeviation = 'Rapport de déviation du projet';
$lang->report->projectDeviation = "Rapport de déviation du{$lang->execution->common}";
$lang->report->productSummary = 'Résumé ' . $lang->productCommon;
$lang->report->bugCreate = 'Résumé remontée Bugs';
$lang->report->bugAssign = 'Résumé affectation Bugs';
@@ -56,7 +56,7 @@ $lang->reportList->product = new stdclass();
$lang->reportList->test = new stdclass();
$lang->reportList->staff = new stdclass();
$lang->reportList->project->lists[10] = 'Dériv Effectué|report|projectdeviation';
$lang->reportList->project->lists[10] = "Dérv {$lang->execution->common}|report|projectdeviation";
$lang->reportList->product->lists[10] = 'Résumé ' . $lang->productCommon . '|report|productsummary';
$lang->reportList->test->lists[10] = 'Résumé remontée Bugs|report|bugcreate';
$lang->reportList->test->lists[13] = 'Résumé affectation Bugs|report|bugassign';
+2 -2
View File
@@ -37,7 +37,7 @@ $lang->report->assign['assign'] = '已指派';
$lang->report->singleColor[] = 'F6BD0F';
$lang->report->projectDeviation = '项目偏差报表';
$lang->report->projectDeviation = "{$lang->execution->common}偏差报表";
$lang->report->productSummary = $lang->productCommon . '汇总表';
$lang->report->bugCreate = 'Bug创建表';
$lang->report->bugAssign = 'Bug指派表';
@@ -56,7 +56,7 @@ $lang->reportList->product = new stdclass();
$lang->reportList->test = new stdclass();
$lang->reportList->staff = new stdclass();
$lang->reportList->project->lists[10] = '项目偏差报表|report|projectdeviation';
$lang->reportList->project->lists[10] = "{$lang->execution->common}偏差报表|report|projectdeviation";
$lang->reportList->product->lists[10] = $lang->productCommon . '汇总表|report|productsummary';
$lang->reportList->test->lists[10] = 'Bug创建表|report|bugcreate';
$lang->reportList->test->lists[13] = 'Bug指派表|report|bugassign';
+16
View File
@@ -4005,9 +4005,25 @@ class storyModel extends model
if(count($tracks) < $pager->recPerPage)
{
/* Show of child story */
$storiesCopy = array();
foreach($stories as $id => $story)
{
$storiesCopy[$id] = $story;
if(isset($story->children) and count($story->children) > 0)
{
foreach($story->children as $childID => $children)
{
$storiesCopy[$childID] = $children;
}
}
}
$stories = $storiesCopy;
foreach($stories as $id => $story)
{
$stories[$id] = new stdclass();
$stories[$id]->parent = $story->parent;
$stories[$id]->title = $story->title;
$stories[$id]->cases = $this->loadModel('testcase')->getStoryCases($id);
$stories[$id]->bugs = $this->loadModel('bug')->getStoryBugs($id);
+4 -1
View File
@@ -69,7 +69,10 @@
<?php $i = 1;?>
<?php foreach($track as $storyID => $story):?>
<?php if($i != 1) echo '<tr>';?>
<td style='padding-left: 10px;'><?php echo html::a($this->createLink($module, 'view', "storyID=$storyID"), $story->title, '',"title='$story->title' data-app='$openApp'");?></td>
<td style='padding-left: 10px;'>
<?php if($story->parent > 0):?><span class="label label-badge label-light" title="<?php echo $this->lang->story->children;?>"><?php echo $this->lang->story->childrenAB;?></span><?php endif;?>
<?php echo html::a($this->createLink($module, 'view', "storyID=$storyID"), $story->title, '',"title='$story->title' data-app='$openApp'");?>
</td>
<td>
<?php foreach($story->tasks as $taskID => $task):?>
<?php echo html::a($this->createLink('task', 'view', "taskID=$taskID"), $task->name, '', "title='$task->name'") . '<br/>';?>
+4 -4
View File
@@ -169,11 +169,11 @@ class taskModel extends model
$childTaskID = $this->dao->lastInsertID();
$this->action->create('task', $childTaskID, 'Opened');
}
}
$this->computeWorkingHours($taskID);
$this->computeBeginAndEnd($taskID);
$this->dao->update(TABLE_TASK)->set('parent')->eq(-1)->where('id')->eq($taskID)->exec();
$this->computeWorkingHours($taskID);
$this->computeBeginAndEnd($taskID);
$this->dao->update(TABLE_TASK)->set('parent')->eq(-1)->where('id')->eq($taskID)->exec();
}
}
$this->file->updateObjectID($this->post->uid, $taskID, 'task');
if(!empty($taskFiles))
+1 -1
View File
@@ -65,7 +65,7 @@
?>
<td class='c-id-sm'><?php echo sprintf('%03d', $run->case);?></td>
<td><span class='label-pri <?php echo 'label-pri-' . $run->pri;?>' title='<?php echo zget($lang->testcase->priList, $run->pri, $run->pri);?>'><?php echo zget($lang->testcase->priList, $run->pri, $run->pri);?></span></td>
<td class='text-left case-title' title='<?php echo $run->title?>'><?php if(!common::printLink('testcase', 'view', "case=$run->case", $run->title)) echo $run->title;?></td>
<td class='text-left case-title' title='<?php echo $run->title?>'><?php if(!common::printLink('testcase', 'view', "caseID=$run->case&version=$run->version&from=testtask&taskID=$run->task", $run->title)) echo $run->title;?></td>
<td><?php echo zget($lang->testcase->typeList, $run->type, '');?></td>
<td><?php echo zget($users, $run->assignedTo);?></td>
<td><?php echo zget($users, $run->lastRunner);?></td>
+2
View File
@@ -582,6 +582,8 @@ class upgrade extends control
$products = $this->dao->select('id, name')->from(TABLE_PRODUCT)->where('deleted')->eq(0)->fetchPairs();
if(empty($repos) or empty($products))
{
$this->dao->delete()->from(TABLE_BLOCK)->exec();
$this->dao->delete()->from(TABLE_CONFIG)->where('`key`')->eq('blockInited')->exec();
$this->loadModel('setting')->deleteItems('owner=system&module=common&section=global&key=upgradeStep');
die(js::locate($this->createLink('upgrade', 'afterExec', "fromVersion=&processed=no")));
}
+25
View File
@@ -696,6 +696,11 @@ class upgradeModel extends model
$this->processProductDoc();
$this->adjustPriv15_3();
$this->appendExec('15_2');
case '15_3':
$this->saveLogs('Execute 15_3');
$this->execSQL($this->getUpgradeFile('15.3'));
$this->adjustBugRequired();
$this->appendExec('15_3');
}
$this->deletePatch();
@@ -5199,4 +5204,24 @@ class upgradeModel extends model
}
return true;
}
/**
* Required to adjust the bug.
*
* @access public
* @return void
*/
public function adjustBugRequired()
{
$data = $this->dao->select('*')->from(TABLE_CONFIG)
->where('owner')->eq('system')
->andWhere('module')->eq('bug')
->andWhere('section')->eq('create')
->andWhere('`key`')->eq('requiredFields')
->fetch();
$data->value = ',' . $data->value . ',';
$data->value = str_replace(',project,', ',', $data->value);
$this->dao->update(TABLE_CONFIG)->set('value')->eq(trim($data->value, ','))->where('id')->eq($data->id)->exec();
}
}
+8 -1
View File
@@ -1614,6 +1614,10 @@ class userModel extends model
while($stakeholder = $stmt->fetch()) $stakeholders[$stakeholder->objectID][$stakeholder->user] = $stakeholder->user;
}
/* Compute parent stakeholders. */
$programStakeholderGroup = $this->loadModel('stakeholder')->getParentStakeholderGroup(array_keys($allPrograms));
$projectStakeholderGroup = $this->loadModel('stakeholder')->getParentStakeholderGroup(array_keys($allProjects));
list($productTeams, $productStakeholders) = $this->getProductMembers($allProducts);
/* Init user view. */
@@ -1637,7 +1641,9 @@ class userModel extends model
$programs = array();
foreach($allPrograms as $id => $program)
{
if($this->checkProgramPriv($program, $account, zget($stakeholders, $id, array()), zget($whiteList, $id, array()))) $programs[$id] = $id;
$programStakeholders = zget($stakeholders, $id, array());
if($program->acl == 'program') $programStakeholders += zget($programStakeholderGroup, $id, array());
if($this->checkProgramPriv($program, $account, $programStakeholders, zget($whiteList, $id, array()))) $programs[$id] = $id;
}
$userView->programs = join(',', $programs);
@@ -1655,6 +1661,7 @@ class userModel extends model
{
$projectTeams = zget($teams, $id, array());
$projectStakeholders = zget($stakeholders, $id, array());
if($project->acl == 'program') $projectStakeholders += zget($projectStakeholderGroup, $id, array());
if($this->checkProjectPriv($project, $account, $projectStakeholders, $projectTeams, zget($whiteList, $id, array()))) $projects[$id] = $id;
}
$userView->projects = join(',', $projects);