From bc7c62e9b00dbfed9ae85862dcc447c36cdc4515 Mon Sep 17 00:00:00 2001 From: Wangyuting <851424971@qq.com> Date: Sat, 6 May 2023 14:35:56 +0800 Subject: [PATCH] * Finish task #92552. --- module/block/config/projectstatisticblock.php | 18 + module/block/css/projectstatisticblock.ui.css | 8 +- module/block/lang/zh-cn.php | 24 ++ .../block/ui/projectstatisticblock.html.php | 334 +++++++----------- 4 files changed, 169 insertions(+), 215 deletions(-) create mode 100644 module/block/config/projectstatisticblock.php diff --git a/module/block/config/projectstatisticblock.php b/module/block/config/projectstatisticblock.php new file mode 100644 index 0000000000..bca7a54222 --- /dev/null +++ b/module/block/config/projectstatisticblock.php @@ -0,0 +1,18 @@ +block->projectstatistic = new stdclass(); +$config->block->projectstatistic->dtable = array(); +$config->block->projectstatistic->dtable['story'][] = array('field' => 'storyPoints', 'unit' => 'SP'); +$config->block->projectstatistic->dtable['story'][] = array('field' => 'done' , 'unit' => 'unit'); +$config->block->projectstatistic->dtable['story'][] = array('field' => 'undone' , 'unit' => 'unit'); + +$config->block->projectstatistic->dtable['cost'][] = array('field' => 'personDay' , 'unit' => 'personDay'); +$config->block->projectstatistic->dtable['cost'][] = array('field' => 'consumed' , 'unit' => 'hour'); +$config->block->projectstatistic->dtable['cost'][] = array('field' => 'remainder' , 'unit' => 'hour'); + +$config->block->projectstatistic->dtable['task'][] = array('field' => 'number' , 'unit' => 'unit'); +$config->block->projectstatistic->dtable['task'][] = array('field' => 'wait' , 'unit' => 'unit'); +$config->block->projectstatistic->dtable['task'][] = array('field' => 'doing' , 'unit' => 'unit'); + +$config->block->projectstatistic->dtable['bug'][] = array('field' => 'number' , 'unit' => 'unit'); +$config->block->projectstatistic->dtable['bug'][] = array('field' => 'resolved' , 'unit' => 'unit'); +$config->block->projectstatistic->dtable['bug'][] = array('field' => 'activated' , 'unit' => 'unit'); diff --git a/module/block/css/projectstatisticblock.ui.css b/module/block/css/projectstatisticblock.ui.css index 7cc3a64d9c..adc751fc7d 100644 --- a/module/block/css/projectstatisticblock.ui.css +++ b/module/block/css/projectstatisticblock.ui.css @@ -1 +1,7 @@ -.projectstatistic-block .tab-content {width: 100%} +.projectstatistic-block {background: #FCFDFE;} +.projectstatistic-block .tab-content {width: 100%;} +.projectstatistic-block .bg-secondary-pale {background: #F3F6FA;} +.projectstatistic-block .nav-tabs .nav-item:hover {border-left: 2px solid #2E7FFF; background-color: #FCFDFE;} +.projectstatistic-block .nav-tabs .nav-item.active {border-left: 2px solid #2E7FFF; background-color: #FCFDFE;} +.projectstatistic-block .nav-tabs .nav-item:hover > a.link {display: flex!important;} +.projectstatistic-block .nav-tabs .nav-item > a:before {background: transparent;} diff --git a/module/block/lang/zh-cn.php b/module/block/lang/zh-cn.php index 6efc436e2a..7684de7b6d 100644 --- a/module/block/lang/zh-cn.php +++ b/module/block/lang/zh-cn.php @@ -702,3 +702,27 @@ $lang->block->customModeTip = new stdClass(); $lang->block->customModeTip->common = '禅道运行模式分为【轻量级管理模式】和【全生命周期管理模式】。'; $lang->block->customModeTip->ALM = '适用于中大型团队的管理模式,概念更加完整、严谨,功能更丰富。'; $lang->block->customModeTip->light = "适用于小型研发团队的管理模式,提供{$lang->projectCommon}管理的核心功能。"; + +$lang->block->projectstatistic = new stdclass(); +$lang->block->projectstatistic->story = '需求'; +$lang->block->projectstatistic->cost = '投入'; +$lang->block->projectstatistic->task = '任务'; +$lang->block->projectstatistic->bug = 'Bug'; + +$lang->block->projectstatistic->storyPoints = '总规模'; +$lang->block->projectstatistic->done = '已完成'; +$lang->block->projectstatistic->undone = '剩余'; +$lang->block->projectstatistic->personDay = '总投入'; +$lang->block->projectstatistic->consumed = '消耗工时'; +$lang->block->projectstatistic->remainder = '预计剩余'; +$lang->block->projectstatistic->number = '总数量'; +$lang->block->projectstatistic->wait = '未开始'; +$lang->block->projectstatistic->doing = '进行中'; +$lang->block->projectstatistic->resolved = '已解决'; +$lang->block->projectstatistic->activated = '激活'; + +$lang->block->projectstatistic->unit = '个'; +$lang->block->projectstatistic->SP = 'SP'; +$lang->block->projectstatistic->personDay = '人天'; +$lang->block->projectstatistic->day = '天'; +$lang->block->projectstatistic->hour = 'h'; diff --git a/module/block/ui/projectstatisticblock.html.php b/module/block/ui/projectstatisticblock.html.php index 292013c52c..0f69be4fc6 100644 --- a/module/block/ui/projectstatisticblock.html.php +++ b/module/block/ui/projectstatisticblock.html.php @@ -19,12 +19,24 @@ foreach($projects as $project) { $navTabs[] = li ( - set('class', 'nav-item ellipsis' . ($project->id == $selected ? ' active' : '')), + set('class', 'nav-item' . ($project->id == $selected ? ' active' : '')), a ( + set('class', 'ellipsis'), set('data-toggle', 'tab'), set('href', "#tab3{$blockNavID}Content{$project->id}"), $project->name + + ), + a + ( + set('class', 'link flex-1 text-right hidden'), + set('href', helper::createLink('project', 'index', "projectID=$project->id")), + icon + ( + set('class', 'rotate-90 text-primary'), + 'export' + ) ) ); } @@ -32,6 +44,49 @@ foreach($projects as $project) $tabItems = array(); foreach($projects as $project) { + $cells = array(); + foreach($config->block->projectstatistic->dtable as $module => $items) + { + $cellItems = array(); + foreach($items as $item) + { + $field = $item['field']; + $unit = $item['field']; + $cellItems[] = div + ( + set('class', 'flex py-4'), + cell + ( + set('class', 'flex-1 text-right text-gray'), + span($lang->block->projectstatistic->{$field}) + ), + cell + ( + set('class', 'flex-1 text-left ml-1'), + span + ( + set('class', 'font-bold text-black'), + zget($project, $field, 0) + ), + span($lang->block->projectstatistic->{$unit}) + ) + ); + } + $cells[] = cell + ( + set('class', 'flex-1 px-2 py-4'), + div + ( + set('class', 'px-2'), + span + ( + set('class', 'font-bold'), + $lang->block->projectstatistic->{$module} + ), + ), + $cellItems + ); + } $tabItems[] = div ( set('class', 'tab-pane' . ($project->id == $selected ? ' active' : '')), @@ -40,222 +95,67 @@ foreach($projects as $project) ( div ( - set('class', 'flex justify-around'), - div + set('class', 'flex bg-white h-10 leading-9 px-4 shadow-sm'), + cell ( - set('class', 'text-center'), - h4($lang->block->storyCount), - div + set('class', 'text-left mr-6'), + span ( - div - ( - set('class', 'statistic-title'), - $lang->block->allStories . ":", - ), - div - ( - set('class', 'statistic-data'), - $project->allStories, - ) - ), - div - ( - div - ( - set('class', 'statistic-title'), - $lang->block->finish . ":", - ), - div - ( - set('class', 'statistic-data'), - $project->doneStories, - ) - ), - div - ( - div - ( - set('class', 'statistic-title'), - $lang->project->surplus . ":", - ), - div - ( - set('class', 'statistic-data'), - $project->leftStories, - ) - ) - ), - div - ( - set('class', 'text-center'), - h4($lang->block->investment), - div - ( - div - ( - set('class', 'statistic-title'), - $lang->block->totalPeople . ":", - ), - div - ( - set('class', 'statistic-data'), - $project->teamCount, - ) - ), - div - ( - div - ( - set('class', 'statistic-title'), - $lang->block->estimate . ":", - ), - div - ( - set('class', 'statistic-data'), - $project->estimate . $lang->execution->workHourUnit, - ) - ), - div - ( - div - ( - set('class', 'statistic-title'), - $lang->block->consumedHours . ":", - ), - div - ( - set('class', 'statistic-data'), - $project->consumed . $lang->execution->workHourUnit, - ) - ) - ), - div - ( - set('class', 'text-center'), - h4($lang->block->taskCount), - div - ( - div - ( - set('class', 'statistic-title'), - $lang->block->wait . ":", - ), - div - ( - set('class', 'statistic-data'), - $project->waitTasks, - ) - ), - div - ( - div - ( - set('class', 'statistic-title'), - $lang->block->doing . ":", - ), - div - ( - set('class', 'statistic-data'), - $project->doingTasks, - ) - ), - div - ( - div - ( - set('class', 'statistic-title'), - $lang->block->done . ":", - ), - div - ( - set('class', 'statistic-data'), - $project->rndDoneTasks, - ) - ) - ), - div - ( - set('class', 'text-center'), - h4($lang->block->bugCount), - div - ( - div - ( - set('class', 'col col-title'), - $lang->block->totalBug . ":", - ), - div - ( - set('class', 'col col-data'), - $project->allBugs, - ) - ), - div - ( - div - ( - set('class', 'col col-title'), - $lang->bug->statusList['resolved'] . ":", - ), - div - ( - set('class', 'col col-data'), - $project->doneBugs, - ) - ), - div - ( - div - ( - set('class', 'col col-title'), - $lang->bug->unResolved . ":", - ), - div - ( - set('class', 'col col-data'), - $project->leftBugs, - ) - ) - ) - ), - (!empty($project->executions) and $project->multiple) ? div - ( - set('class', 'flex'), - div - ( - set('class', 'flex-1 text-right'), - h4($lang->block->last) - ), - div - ( - set('class', 'flex-1 text-center'), - a - ( - set('href', $this->createLink('execution', 'task', "executionID={$project->executions[0]->id}")), - set('title', $project->executions[0]->name), - $project->executions[0]->name, - ) - ), - div - ( - set('class', 'flex-1'), - div - ( - set('class', 'progress'), + set('class', 'text-gray'), + '距离项目结束还剩', span ( - set('class', 'mr-4'), - $project->executions[0]->hours->progress . '%' + set('class', 'font-bold text-black px-1'), + zget($project, 'remainingDays' , 0) ), - div + $lang->block->projectstatistic->day + ) + ), + cell + ( + set('class', 'flex-1 text-left'), + span + ( + set('class', 'text-gray mr-5'), + '存在风险 : ', + span ( - set('class', 'progress-bar'), - set('role', 'progressbar'), - setStyle(['width' => $project->executions[0]->hours->progress . '%']), + set('class', 'font-bold text-warning'), + '3' + ) + ), + span + ( + set('class', 'text-gray'), + '存在问题 : ', + span + ( + set('class', 'font-bold text-warning'), + '1' ) ) - ) - ) : null + ), + (!empty($project->executions) and $project->multiple) ? cell + ( + set('class', 'flex-1 text-right'), + span + ( + set('class', 'text-gray'), + '最近执行 ', + a + ( + set('href', $this->createLink('execution', 'task', "executionID={$project->executions[0]->id}")), + set('title', $project->executions[0]->name), + $project->executions[0]->name, + ) + ) + ) : null + ), + div + ( + set('class', 'flex'), + $cells + ) ) : div ( set('class', 'weekly-row'), @@ -368,20 +268,26 @@ foreach($projects as $project) ); } -panel +div ( set('class', 'projectstatistic-block'), div ( set('class', 'flex'), - ul + cell ( - set('class', 'nav nav-tabs nav-stacked'), - $navTabs + set('width', '25%'), + set('class', 'of-hidden bg-secondary-pale'), + ul + ( + set('class', 'nav nav-tabs nav-stacked'), + $navTabs, + ), ), - div + cell ( set('class', 'tab-content'), + set('width', '75%'), $tabItems ) )