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' => "
{$label}{$tree->id}" . $tree->title . ' ' . (empty($tree->assignedTo) ? $tree->openedBy : $tree->assignedTo) . '
',
+ 'html' => "{$label}{$tree->id}" . $tree->title . ' ' . zget($tree, 'avatar') . '
' . zget($tree, 'avatarAccount') . ' ',
);
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' => "{$this->lang->story->common}{$tree->storyId}{$tree->title} " . (empty($tree->assignedTo) ? $tree->openedBy : $tree->assignedTo) . "
",
+ 'html' => "{$this->lang->story->common}{$tree->storyId}{$tree->title} ' . zget($tree, 'avatar') . '
' . zget($tree, 'avatarAccount') . ' ',
);
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")),