From df059ce021c938a09b6e215b482cf1fb541a3045 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 21 Feb 2024 13:01:28 +0800 Subject: [PATCH] * Fix bug #45163, modify style of execution::tree. --- module/execution/css/tree.ui.css | 11 +++++ module/execution/model.php | 13 +++--- module/execution/tao.php | 54 +++++++++++++++-------- module/execution/test/execution.class.php | 2 +- module/execution/ui/treestory.html.php | 20 +++++---- module/execution/ui/treetask.html.php | 14 +++--- 6 files changed, 71 insertions(+), 43 deletions(-) diff --git a/module/execution/css/tree.ui.css b/module/execution/css/tree.ui.css index 68f3ed2d45..333fb9fae1 100644 --- a/module/execution/css/tree.ui.css +++ b/module/execution/css/tree.ui.css @@ -1,3 +1,14 @@ #actionButtons.btn-group > .btn.disabled {z-index: 0;} #taskTree .tree-item-content.active {background: var(--menu-active-bg); color: var(--menu-active-color);} #taskTree .tree-item-content.active .title {font-weight: 700;} + +#detailBlock .task-status, #detailBlock .story-status {--tw-ring-color: initial} +#detailBlock .task-status.status-wait, #detailBlock .story-status.status-active {background-color: #313c520d;} +#detailBlock .task-status.status-doing {background-color: #ff6f420d;} +#detailBlock .task-status.status-done {background-color: #0dbb7d0d;} +#detailBlock .task-status.status-pause {background-color: #b896640d;} +#detailBlock .task-status.status-cancel {background-color: #838a9d0d;} +#detailBlock .task-status.status-closed, #detailBlock .story.status-closed {background-color: #9ea3b00d;} +#detailBlock .story-status.status-draft {background-color: #8166ee0d;} +#detailBlock .story-status.status-reviewing {background-color: #18a6fd0d;} +#detailBlock .story-status.status-changing {background-color: #fb2b2b0d;} diff --git a/module/execution/model.php b/module/execution/model.php index 04ce04a61a..34a3035e95 100755 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -4440,8 +4440,7 @@ class executionModel extends model if(!isset($node->id)) $node->id = 0; if($node->type == 'story') { - static $users, $storyGroups; - if(empty($users)) $users = $this->loadModel('user')->getPairs('noletter'); + static $storyGroups; if(empty($storyGroups)) { if($this->config->vision == 'lite') $execution = $this->getById($executionID); @@ -4451,7 +4450,7 @@ class executionModel extends model foreach($stories as $story) $storyGroups[$story->product][$story->module][$story->id] = $story; } - $node = $this->executionTao->processStoryNode($node, $storyGroups, $taskGroups, $users, $executionID); + $node = $this->executionTao->processStoryNode($node, $storyGroups, $taskGroups, $executionID); } elseif($node->type == 'task') { @@ -4583,19 +4582,19 @@ class executionModel extends model $label = $tree->parent > 0 ? $this->lang->task->children : $this->lang->task->common; $treeData[$index]['url'] = helper::createLink('execution', 'treeTask', "taskID={$tree->id}"); $treeData[$index]['content'] = array( - 'html' => "', + 'html' => "', ); break; case 'product': $treeData[$index]['content'] = array( - 'html' => "{$tree->name}" + 'html' => "{$tree->name}" ); break; case 'story': $this->app->loadLang('story'); $treeData[$index]['url'] = helper::createLink('execution', 'treeStory', "taskID={$tree->storyId}"); $treeData[$index]['content'] = array( - 'html' => "", + 'html' => "', ); break; case 'branch': @@ -4605,7 +4604,7 @@ class executionModel extends model ); break; default: - $firstClass = $tree->id == 0 ? 'label rounded-full p-2' : ''; + $firstClass = $tree->id == 0 ? 'label rounded-full p-2 gray-outline' : ''; $treeData[$index]['content'] = array( 'html' => "" . $tree->name . '' ); diff --git a/module/execution/tao.php b/module/execution/tao.php index 21c1c80aee..f0784905d5 100644 --- a/module/execution/tao.php +++ b/module/execution/tao.php @@ -360,17 +360,25 @@ class executionTao extends executionModel * @param object $node * @param array $storyGroups * @param array $taskGroups - * @param array $users * @param int $executionID * @access protected * @return object */ - protected function processStoryNode(object $node, array $storyGroups, array $taskGroups, array $users, int $executionID): object + protected function processStoryNode(object $node, array $storyGroups, array $taskGroups, int $executionID): object { $node->type = 'module'; $stories = isset($storyGroups[$node->root][$node->id]) ? $storyGroups[$node->root][$node->id] : array(); + + static $users, $avatarPairs; + if(empty($users)) $users = $this->loadModel('user')->getPairs('noletter'); + if(empty($avatarPairs)) $avatarPairs = $this->loadModel('user')->getAvatarPairs(); + foreach($stories as $story) { + $avatarAccount = empty($story->assignedTo) ? zget($story, 'openedBy', '') : $story->assignedTo; + $userAvatar = zget($avatarPairs, $avatarAccount); + $userAvatar = $userAvatar && $avatarAccount != 'closed' ? "" : strtoupper(mb_substr($avatarAccount, 0, 1, 'utf-8')); + $storyItem = new stdclass(); $storyItem->type = 'story'; $storyItem->id = 'story' . $story->id; @@ -382,6 +390,8 @@ class executionTao extends executionModel $storyItem->assignedTo = zget($users, $story->assignedTo); $storyItem->url = helper::createLink('execution', 'storyView', "storyID=$story->id&execution=$executionID"); $storyItem->taskCreateUrl = helper::createLink('task', 'batchCreate', "executionID={$executionID}&story={$story->id}"); + $storyItem->avatarAccount = zget($users, $avatarAccount); + $storyItem->avatar = $userAvatar; $storyTasks = isset($taskGroups[$node->id][$story->id]) ? $taskGroups[$node->id][$story->id] : array(); if(!empty($storyTasks)) @@ -504,28 +514,34 @@ class executionTao extends executionModel */ protected function formatTasksForTree(array $tasks, object $story = null): array { - static $users; - if(empty($users)) $users = $this->loadModel('user')->getPairs('noletter'); + static $users, $avatarPairs; + if(empty($users)) $users = $this->loadModel('user')->getPairs('noletter'); + if(empty($avatarPairs)) $avatarPairs = $this->loadModel('user')->getAvatarPairs(); $taskItems = array(); foreach($tasks as $task) { - $taskItem = new stdclass(); - $taskItem->type = 'task'; - $taskItem->id = $task->id; - $taskItem->title = $task->name; - $taskItem->color = $task->color; - $taskItem->pri = (int)$task->pri; - $taskItem->status = $task->status; - $taskItem->parent = $task->parent; - $taskItem->estimate = $task->estimate; - $taskItem->consumed = $task->consumed; - $taskItem->left = $task->left; - $taskItem->openedBy = zget($users, $task->openedBy); - $taskItem->assignedTo = zget($users, $task->assignedTo); - $taskItem->url = helper::createLink('task', 'view', "task=$task->id"); - $taskItem->storyChanged = $story && $story->status == 'active' && $story->version > $story->taskVersion; + $avatarAccount = empty($task->assignedTo) ? zget($task, 'openedBy', '') : $task->assignedTo; + $userAvatar = zget($avatarPairs, $avatarAccount); + $userAvatar = $userAvatar && $avatarAccount != 'closed' ? "" : strtoupper(mb_substr($avatarAccount, 0, 1, 'utf-8')); + $taskItem = new stdclass(); + $taskItem->type = 'task'; + $taskItem->id = $task->id; + $taskItem->title = $task->name; + $taskItem->color = $task->color; + $taskItem->pri = (int)$task->pri; + $taskItem->status = $task->status; + $taskItem->parent = $task->parent; + $taskItem->estimate = $task->estimate; + $taskItem->consumed = $task->consumed; + $taskItem->left = $task->left; + $taskItem->openedBy = zget($users, $task->openedBy); + $taskItem->assignedTo = zget($users, $task->assignedTo); + $taskItem->url = helper::createLink('task', 'view', "task=$task->id"); + $taskItem->storyChanged = $story && $story->status == 'active' && $story->version > $story->taskVersion; + $taskItem->avatarAccount = zget($users, $avatarAccount); + $taskItem->avatar = $userAvatar; $taskItems[] = $taskItem; } diff --git a/module/execution/test/execution.class.php b/module/execution/test/execution.class.php index b258e07957..c85925801b 100644 --- a/module/execution/test/execution.class.php +++ b/module/execution/test/execution.class.php @@ -2876,7 +2876,7 @@ class executionTest $node = (object)$fullTrees[0]; if(!isset($node->id)) $node->id = 0; - return $this->executionModel->processStoryNode($node, $storyGroups, $taskGroups, array(), 0); + return $this->executionModel->processStoryNode($node, $storyGroups, $taskGroups, 0); } /** diff --git a/module/execution/ui/treestory.html.php b/module/execution/ui/treestory.html.php index 1c82d58fd0..06b18f4dec 100644 --- a/module/execution/ui/treestory.html.php +++ b/module/execution/ui/treestory.html.php @@ -95,24 +95,26 @@ div setClass('flex items-center flex-nowrap mb-4'), label ( - setClass('flex-none rounded-full dark-outline'), + setClass('flex-none rounded-full gray-outline'), $story->id ), - label - ( - setClass('mx-2 flex-none rounded-full status-' . $story->status), - $this->processStatus('story', $story) - ), span ( - setClass('text-md font-bold clip'), + setClass('mx-2 text-lg font-bold clip'), $story->title + ), + label + ( + setClass('flex-none rounded-full story-status status-' . $story->status), + $this->processStatus('story', $story) ) ), div ( + setClass('flex items-center flex-nowrap mb-4'), div ( + setClass('flex-1'), $lang->story->stage, span ( @@ -122,7 +124,7 @@ div ), div ( - setClass('mt-4'), + setClass('flex-1'), $lang->story->estimate, span ( @@ -262,7 +264,7 @@ div set::name($lang->story->status), span ( - setClass("status-story status-{$story->status}"), + setClass("status-{$story->status}"), $this->processStatus('story', $story) ) ), diff --git a/module/execution/ui/treetask.html.php b/module/execution/ui/treetask.html.php index c1440cdef3..6c2b25e92e 100644 --- a/module/execution/ui/treetask.html.php +++ b/module/execution/ui/treetask.html.php @@ -18,7 +18,7 @@ div setClass('flex items-center flex-nowrap mb-4'), label ( - setClass('flex-none rounded-full dark-outline'), + setClass('flex-none rounded-full gray-outline'), $task->id ), $task->parent > 0 ? label @@ -33,12 +33,12 @@ div ) : null, span ( - setClass('text-md font-bold mx-2 clip'), + setClass('text-lg font-bold mx-2 clip'), (isset($task->parentName) ? $task->parentName . '/' : '') . $task->name ), label ( - setClass('flex-none rounded-full status-' . $task->status), + setClass('flex-none rounded-full task-status status-' . $task->status), $this->processStatus('task', $task) ) ), @@ -116,7 +116,7 @@ div ) : null, ($task->status == 'wait' && hasPriv('task', 'start')) ? btn ( - setClass('text-primary ml-2'), + setClass('text-primary'), set::icon('play'), set::hint($lang->task->start), set::url(createLink('task', 'start', array('taskID' => $task->id))), @@ -152,7 +152,7 @@ div ) : null, hasPriv('task', 'recordWorkhour') ? btn ( - setClass('text-primary ml-2'), + setClass('text-primary'), set::icon('time'), set::hint($lang->task->recordWorkhour), set::url(createLink('task', 'recordWorkhour', array('taskID' => $task->id))), @@ -161,7 +161,7 @@ div ) : null, hasPriv('task', 'edit') ? btn ( - setClass('text-primary ml-2'), + setClass('text-primary'), set::icon('edit'), set::hint($lang->task->edit), set::url(createLink('task', 'edit', array('taskID' => $task->id))), @@ -170,7 +170,7 @@ div ) : null, ((empty($task->team) || empty($task->children)) && hasPriv('task', 'batchCreate') && $config->vision != 'lite') ? btn ( - setClass('text-primary ml-2'), + setClass('text-primary'), set::icon('split'), set::hint($lang->task->batchCreate), set::url(createLink('task', 'batchCreate', "execution={$task->execution}&storyID={$task->story}&moduleID={$task->module}&askID={$task->id}&ifame=0")),