* Add affected block for change page.
This commit is contained in:
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user