From aa470f960e11e3d7a7ca9d23b5b389a070bc03f5 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 7 Jun 2023 20:01:04 +0800 Subject: [PATCH] * Add affected block for change page. --- module/story/control.php | 2 - module/story/model.php | 35 +----- module/story/tao.php | 110 ++++++++++++++++++ module/story/ui/change.html.php | 199 ++++++++++++++++---------------- 4 files changed, 217 insertions(+), 129 deletions(-) diff --git a/module/story/control.php b/module/story/control.php index d3bb20a5a5..72f95d3f95 100755 --- a/module/story/control.php +++ b/module/story/control.php @@ -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); diff --git a/module/story/model.php b/module/story/model.php index a0c4bccf3e..a38a2c31e6 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -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; } diff --git a/module/story/tao.php b/module/story/tao.php index 8cf2154d6a..f27c341191 100644 --- a/module/story/tao.php +++ b/module/story/tao.php @@ -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; + } } diff --git a/module/story/ui/change.html.php b/module/story/ui/change.html.php index 844e7f1427..354d8b38d6 100644 --- a/module/story/ui/change.html.php +++ b/module/story/ui/change.html.php @@ -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();