* Add affected block for change page.

This commit is contained in:
wangyidong
2023-06-08 09:15:41 +08:00
parent 534cd8cbe2
commit aa470f960e
4 changed files with 217 additions and 129 deletions
-2
View File
@@ -706,8 +706,6 @@ class story extends control
/* Assign. */
$this->view->title = $this->lang->story->change . "STORY" . $this->lang->colon . $story->title;
$this->view->twins = empty($story->twins) ? array() : $this->story->getByList($story->twins);
$this->view->branches = $this->loadModel('branch')->getPairs($story->product);
$this->view->users = $this->user->getPairs('pofirst|nodeleted|noclosed', $story->assignedTo);
$this->view->fields = $this->storyZen->getFormFieldsForChange($storyID);
$this->view->lastReviewer = $this->story->getLastReviewer($story->id);
+5 -30
View File
@@ -162,37 +162,12 @@ class storyModel extends model
*/
public function getAffectedScope($story)
{
/* Remove closed executions. */
if($story->executions)
{
foreach($story->executions as $executionID => $execution) if($execution->status == 'done') unset($story->executions[$executionID]);
}
$users = $this->loadModel('user')->getPairs('pofirst|nodeleted|noclosed', $story->assignedTo);
/* Get team members. */
if($story->executions)
{
$story->teams = $this->dao->select('account, root')
->from(TABLE_TEAM)
->where('root')->in(array_keys($story->executions))
->andWhere('type')->eq('project')
->fetchGroup('root');
}
/* Get affected bugs. */
$story->bugs = $this->dao->select('*')->from(TABLE_BUG)
->where('status')->ne('closed')
->beginIF($story->twins)->andWhere('story')->in(ltrim($story->twins, ',') . $story->id)
->beginIF(!$story->twins)->andWhere('story')->in($story->id)
->andWhere('status')->ne('closed')
->andWhere('deleted')->eq(0)
->orderBy('id desc')->fetchAll();
/* Get affected cases. */
$story->cases = $this->dao->select('*')->from(TABLE_CASE)
->where('deleted')->eq(0)
->beginIF($story->twins)->andWhere('story')->in(ltrim($story->twins, ',') . $story->id)
->beginIF(!$story->twins)->andWhere('story')->in($story->id)
->fetchAll();
$story = $this->storyTao->getAffectedProjects($story, $users);
$story = $this->storyTao->getAffectedBugs($story, $users);
$story = $this->storyTao->getAffectedCases($story, $users);
$story = $this->storyTao->getAffectedTwins($story, $users);
return $story;
}
+110
View File
@@ -1273,4 +1273,114 @@ class storyTao extends storyModel
return $stages;
}
protected function getAffectedProjects(object $story, array $users): object
{
$this->app->loadLang('task');
$this->config->story->affect = new stdclass();
$this->config->story->affect->projects = new stdclass();
$this->config->story->affect->projects->fields[] = array('name' => 'id', 'title' => $this->lang->task->id);
$this->config->story->affect->projects->fields[] = array('name' => 'name', 'title' => $this->lang->task->name, 'link' => helper::createLink('task', 'view', 'id={id}'));
$this->config->story->affect->projects->fields[] = array('name' => 'assignedTo', 'title' => $this->lang->task->assignedTo);
$this->config->story->affect->projects->fields[] = array('name' => 'consumed', 'title' => $this->lang->task->consumed);
$this->config->story->affect->projects->fields[] = array('name' => 'left', 'title' => $this->lang->task->left);
if(empty($story->executions)) return $story;
foreach($story->executions as $executionID => $execution) if($execution->status == 'done') unset($story->executions[$executionID]);
$story->teams = $this->dao->select('account, root')->from(TABLE_TEAM)->where('root')->in(array_keys($story->executions))->andWhere('type')->eq('project')->fetchGroup('root');
foreach($story->tasks as $executionTasks)
{
foreach($executionTasks as $task)
{
$task->status = $this->processStatus('task', $task);
$task->assignedTo = zget($users, $task->assignedTo);
}
}
return $story;
}
protected function getAffectedBugs(object $story, array $users): object
{
$this->app->loadLang('bug');
$this->config->story->affect->bugs = new stdclass();
$this->config->story->affect->bugs->fields[] = array('name' => 'id', 'title' => $this->lang->idAB);
$this->config->story->affect->bugs->fields[] = array('name' => 'title', 'title' => $this->lang->bug->title, 'link' => helper::createLink('bug', 'view', 'id={id}'));
$this->config->story->affect->bugs->fields[] = array('name' => 'status', 'title' => $this->lang->statusAB);
$this->config->story->affect->bugs->fields[] = array('name' => 'openedBy', 'title' => $this->lang->bug->openedBy);
$this->config->story->affect->bugs->fields[] = array('name' => 'resolvedBy', 'title' => $this->lang->bug->resolvedBy);
$this->config->story->affect->bugs->fields[] = array('name' => 'resolution', 'title' => $this->lang->bug->resolution);
$this->config->story->affect->bugs->fields[] = array('name' => 'lastEditedBy', 'title' => $this->lang->bug->lastEditedBy);
/* Get affected bugs. */
$story->bugs = $this->dao->select('*')->from(TABLE_BUG)->where('status')->ne('closed')
->beginIF($story->twins)->andWhere('story')->in(ltrim($story->twins, ',') . $story->id)
->beginIF(!$story->twins)->andWhere('story')->in($story->id)
->andWhere('status')->ne('closed')
->andWhere('deleted')->eq(0)
->orderBy('id desc')->fetchAll();
foreach($story->bugs as $bug)
{
$bug->status = $this->processStatus('bug', $bug);
$bug->openedBy = zget($users, $bug->openedBy);
$bug->resolvedBy = zget($users, $bug->resolvedBy);
$bug->lastEditedBy = zget($users, $bug->lastEditedBy);
$bug->resolution = zget($this->lang->bug->resolutionList, $bug->resolution);
}
return $story;
}
protected function getAffectedCases(object $story, array $users): object
{
$this->app->loadLang('testcase');
$this->config->story->affect->cases = new stdclass();
$this->config->story->affect->cases->fields[] = array('name' => 'id', 'title' => $this->lang->idAB);
$this->config->story->affect->cases->fields[] = array('name' => 'title', 'title' => $this->lang->testcase->title, 'link' => helper::createLink('testcase', 'view', 'id={id}'));
$this->config->story->affect->cases->fields[] = array('name' => 'status', 'title' => $this->lang->statusAB);
$this->config->story->affect->cases->fields[] = array('name' => 'openedBy', 'title' => $this->lang->testcase->openedBy);
$this->config->story->affect->cases->fields[] = array('name' => 'lastEditedBy', 'title' => $this->lang->testcase->lastEditedBy);
/* Get affected cases. */
$story->cases = $this->dao->select('*')->from(TABLE_CASE)->where('deleted')->eq(0)
->beginIF($story->twins)->andWhere('story')->in(ltrim($story->twins, ',') . $story->id)
->beginIF(!$story->twins)->andWhere('story')->in($story->id)
->fetchAll();
foreach($story->cases as $case)
{
$case->status = $this->processStatus('testcase', $case);
$case->openedBy = zget($users, $case->openedBy);
$case->lastEditedBy = zget($users, $case->lastEditedBy);
}
return $story;
}
protected function getAffectedTwins(object $story, array $users): object
{
if(empty($story->twins)) return $story;
$this->config->story->affect->twins = new stdclass();
$this->config->story->affect->twins->fields[] = array('name' => 'id', 'title' => $this->lang->idAB);
$this->config->story->affect->twins->fields[] = array('name' => 'branch', 'title' => $this->lang->story->branch);
$this->config->story->affect->twins->fields[] = array('name' => 'title', 'title' => $this->lang->story->title, 'link' => helper::createLink('story', 'view', 'id={id}'));
$this->config->story->affect->twins->fields[] = array('name' => 'status', 'title' => $this->lang->statusAB);
$this->config->story->affect->twins->fields[] = array('name' => 'stage', 'title' => $this->lang->story->stageAB);
$this->config->story->affect->twins->fields[] = array('name' => 'openedBy', 'title' => $this->lang->story->openedBy);
$this->config->story->affect->twins->fields[] = array('name' => 'lastEditedBy', 'title' => $this->lang->story->lastEditedBy);
$story->twins = $this->story->getByList($story->twins);
$branches = $this->loadModel('branch')->getPairs($story->product);
foreach($story->twins as $twin)
{
$twin->branch = zget($branches, $twin->branch, '');
$twin->status = $this->processStatus('story', $twin);
$twin->openedBy = zget($users, $twin->openedBy);
$twin->lastEditedBy = zget($users, $twin->lastEditedBy);
$twin->stage = zget($this->lang->story->stageList, $twin->stage);
}
return $story;
}
}
+102 -97
View File
@@ -10,6 +10,35 @@ declare(strict_types=1);
*/
namespace zin;
jsVar('lastReviewer', explode(',', $lastReviewer));
jsVar('storyID', $story->id);
jsVar('oldStoryTitle', $story->title);
jsVar('oldStorySpec', $story->spec);
jsVar('oldStoryVerify', $story->verify);
jsVar('changed', 0);
jsVar('storyType', $story->type);
jsVar('rawModule', $this->app->rawModule);
jsVar('page', $this->app->rawMethod);
$formTitle = div
(
span
(
setClass('form-label'),
$lang->story->changed
),
div
(
setClass('form-group title'),
$story->title,
span
(
setClass('label text-gray size-sm'),
$story->id
)
),
);
$formItems = array();
$formItems['reviewer'] = formGroup
(
@@ -22,7 +51,7 @@ $formItems['reviewer'] = formGroup
set::name('reviewer[]'),
set::multiple(true),
set::items($fields['reviewer']['options']),
set::default($fields['reviewer']['default']),
set::value($fields['reviewer']['default']),
),
$forceReview ? null : span
(
@@ -47,7 +76,7 @@ $formItems['title'] = formGroup
input
(
set::name('title'),
set::default($fields['title']['default']),
set::value($fields['title']['default']),
),
span
(
@@ -56,7 +85,7 @@ $formItems['title'] = formGroup
(
set::name('color'),
set::type('color'),
set::default($fields['color']['default']),
set::value($fields['color']['default']),
)
),
empty($story->twins) ? null : span
@@ -77,14 +106,14 @@ $formItems['status'] = formRow
set::hidden(true),
formGroup
(
input(set::name('status'), set::default($fields['status']['default']))
input(set::name('status'), set::value($fields['status']['default']))
)
);
$formItems['spec'] = formGroup
(
set::label($fields['spec']['title']),
set::control($fields['spec']['control']),
set::default($fields['spec']['default']),
set::value($fields['spec']['default']),
set::tip($lang->story->specTemplate)
);
unset($fields['reviewer'], $fields['title'], $fields['color'], $fields['status'], $fields['spec']);
@@ -116,113 +145,89 @@ $formItems['file'] = formGroup
set::name('files'),
)
);
$affectedProjects = array();
$affectedTaskCount = 0;
foreach($story->executions as $executionID => $execution)
{
$teams = '';
foreach($story->teams[$executionID] as $member) $teams .= zget($users, $member) . ' ';
$affectedTaskCount += count($story->tasks[$executionID]);
$affectedProjects[] = h6
(
$execution->name,
$teams ? small(icon('group'), $teams) : null
);
$affectedProjects[] = dtable
(
col($config->story->affect->projects->fields),
data(array_values($story->tasks[$executionID]))
);
}
$formItems['affected'] = formGroup
(
set::width('full'),
set::label($lang->attatch),
set::label($lang->story->checkAffection),
tabs
(
tabPane
(
set::key('legend-basic'),
set::title('基本信息'),
set::active(true),
tableData
tabPane
(
item
(
set::name('所属执行'),
'企业网站第一期'
),
item
(
set::name('指派给'),
'开发丙'
),
item
(
set::name('任务类型'),
'开发'
),
item
(
set::name('任务状态'),
'已完成'
),
item
(
set::name('进度'),
'100 %'
),
item
(
set::name('优先级'),
priLabel(1)
),
)
),
tabPane
(
set::key('legend-life'),
set::title('任务的一生'),
tableData
set::key('affectedProjects'),
set::title($lang->story->affectedProjects),
set::active(true),
$affectedProjects,
),
tabPane
(
item
set::key('affectedBugs'),
set::title($lang->story->affectedBugs),
empty($story->bugs) ? null : dtable
(
set::name('由谁创建'),
'admin 于 2021-04-28 13:16:15'
),
item
col($config->story->affect->bugs->fields),
data(array_values($story->bugs))
)
),
tabPane
(
set::key('affectedCases'),
set::title($lang->story->affectedCases),
empty($story->cases) ? null : dtable
(
set::name('由谁完成'),
'开发丙 于 2021-04-06 15:30:00'
),
item
col($config->story->affect->cases->fields),
data(array_values($story->cases))
)
),
empty($story->twins) ? null : tabPane
(
set::key('affectedTwins'),
set::title($lang->story->affectedTwins),
dtable
(
set::name('由谁取消'),
'暂无'
),
item
(
set::name('由谁关闭'),
'暂无'
),
item
(
set::name('关闭原因'),
'暂无'
),
item
(
set::name('最后编辑'),
'开发丙 于 2021-04-28 13:21:51'
),
)
col($config->story->affect->twins->fields),
data(array_values($story->twins))
)
),
)
)
);
$formItems['lastEditedDate'] = input(set::type('hidden'), set::name('lastEditedDate', set::id('lastEditedDate'), set::value($story->lastEditedDate)));
$formActions = formRow
(
setClass('form-actions form-group no-label'),
btn(setClass('primary'), set::id('saveButton'), $lang->save),
btn(setClass('secondary'), set::id('saveDraftButton'), $lang->story->doNotSubmit),
btn(set::url('javascript:history.go(-1)'), $lang->goback),
);
formPanel
(
set::title(''),
div
(
span
(
setClass('form-label'),
$lang->story->changed
),
div
(
setClass('form-group title'),
$story->title,
span
(
setClass('label text-gray size-sm'),
$story->id
)
),
),
$formItems
set::actions(false),
$formTitle,
$formItems,
$formActions,
h::hr(),
history()
);
render();