294 lines
10 KiB
PHP
294 lines
10 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
/**
|
|
* The bugstatistic block view file of block module of ZenTaoPMS.
|
|
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
|
|
* @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
|
* @author Yuting Wang <wangyuting@easycorp.ltd>
|
|
* @package block
|
|
* @link https://www.zentao.net
|
|
*/
|
|
|
|
namespace zin;
|
|
|
|
$uniqid = uniqid();
|
|
$blockNavCode = 'nav-' . $uniqid;
|
|
$navTabs = array();
|
|
$selected = key($products);
|
|
$statisticCells = array();
|
|
$preproductID = 0;
|
|
$nextproductID = 0;
|
|
$productIdList = array_keys($products);
|
|
$tabItems = array();
|
|
foreach($products as $productID => $product)
|
|
{
|
|
$productInfo = div
|
|
(
|
|
setClass('flex' . ($longBlock ? ' flex-nowrap' : ' flex-wrap')),
|
|
cell
|
|
(
|
|
setClass('flex flex-wrap items-center content-center progress-circle'),
|
|
set::width($longBlock ? '30%' : '100%'),
|
|
div
|
|
(
|
|
setClass('flex justify-center w-full'),
|
|
zui::progressCircle
|
|
(
|
|
set('percent', zget($resolvedRate, $productID, 0)),
|
|
set('size', 112),
|
|
set('circleWidth', 6),
|
|
set('text', zget($resolvedRate, $productID, 0) . '%'),
|
|
set('textY', 50),
|
|
set('textStyle', 'font-size: 30px;'),
|
|
),
|
|
),
|
|
div
|
|
(
|
|
setClass('flex justify-center w-full h-0'),
|
|
span
|
|
(
|
|
setClass('text-gray text-sm progress-text'),
|
|
$lang->block->qastatistic->fixBugRate,
|
|
icon
|
|
(
|
|
setClass('pl-0.5'),
|
|
toggle::tooltip(array('title' => '提示文本')),
|
|
'help'
|
|
),
|
|
),
|
|
),
|
|
cell
|
|
(
|
|
setClass('flex justify-center w-full mt-3 gap-x-4'),
|
|
col
|
|
(
|
|
span
|
|
(
|
|
setClass('flex justify-center'),
|
|
zget($totalBugs, $productID, 0),
|
|
),
|
|
span
|
|
(
|
|
setClass('text-sm text-gray'),
|
|
$lang->block->bugstatistic->effective
|
|
),
|
|
),
|
|
col
|
|
(
|
|
span
|
|
(
|
|
setClass('flex justify-center'),
|
|
zget($closedBugs, $productID, 0),
|
|
),
|
|
span
|
|
(
|
|
setClass('text-sm text-gray'),
|
|
$lang->block->bugstatistic->fixed
|
|
),
|
|
),
|
|
col
|
|
(
|
|
span
|
|
(
|
|
setClass('flex justify-center'),
|
|
zget($unresovledBugs, $productID, 0),
|
|
),
|
|
span
|
|
(
|
|
setClass('text-sm text-gray'),
|
|
$lang->block->bugstatistic->activated
|
|
),
|
|
),
|
|
),
|
|
),
|
|
cell
|
|
(
|
|
setClass('chart bar-chart p-4' . ($longBlock ? ' mt-3' : ' pb-0')),
|
|
set::width($longBlock ? '70%' : '100%'),
|
|
echarts
|
|
(
|
|
set::title(array('text' => $lang->block->qastatistic->bugStatusStat, 'textStyle' => array('fontSize' => '12'))),
|
|
set::color(array('#66a2ff', '#7adfba', '#9ea3b0')),
|
|
set::tooltip(array('trigger' => 'axis')),
|
|
set::grid(array('left' => '10px', 'top' => '50px', 'right' => '0', 'bottom' => '0', 'containLabel' => true)),
|
|
set::legend(array('show' => true, 'right' => '0', 'top' => '25px', 'textStyle' => array('fontSize' => '11'))),
|
|
set::xAxis(array('type' => 'category', 'data' => $months, 'splitLine' => array('show' => false), 'axisTick' => array('alignWithLabel' => true, 'interval' => 0), 'axisLabel' => array('fontSize' => $longBlock ? '8' : '10'))),
|
|
set::yAxis(array('type' => 'value', 'splitLine' => array('show' => false), 'axisLine' => array('show' => true, 'color' => '#DDD'), 'axisLabel' => array('showMaxLabel' => true, 'interval' => 'auto'))),
|
|
set::tooptop(array('show' => true, 'formatter' => '{b}: {c}')),
|
|
set::series
|
|
(
|
|
array
|
|
(
|
|
array
|
|
(
|
|
'type' => 'bar',
|
|
'barWidth' => '8',
|
|
'stack' => 'Ad',
|
|
'name' => $lang->bug->activate,
|
|
'data' => array_values($activateBugs[$productID]),
|
|
),
|
|
array
|
|
(
|
|
'type' => 'bar',
|
|
'name' => $lang->bug->resolve,
|
|
'stack' => 'Ad',
|
|
'data' => array_values($resolveBugs[$productID]),
|
|
),
|
|
array
|
|
(
|
|
'type' => 'bar',
|
|
'name' => $lang->bug->close,
|
|
'stack' => 'Ad',
|
|
'data' => array_values($closeBugs[$productID]),
|
|
),
|
|
),
|
|
),
|
|
)->size('100%', 200),
|
|
),
|
|
);
|
|
|
|
if($longBlock)
|
|
{
|
|
$navTabs[] = li
|
|
(
|
|
setClass('nav-item'),
|
|
a
|
|
(
|
|
setClass('ellipsis title ' . ($product->id == $selected ? ' active' : '')),
|
|
set('data-toggle', 'tab'),
|
|
set::href("#tab{$blockNavCode}Content{$product->id}"),
|
|
$product->name
|
|
|
|
),
|
|
a
|
|
(
|
|
setClass('link flex-1 text-right hidden'),
|
|
set::href(helper::createLink('product', 'browse', "productID={$product->id}")),
|
|
icon
|
|
(
|
|
setClass('rotate-90 text-primary'),
|
|
'export'
|
|
)
|
|
)
|
|
);
|
|
|
|
$tabItems[] = div
|
|
(
|
|
setClass('tab-pane' . ($product->id == $selected ? ' active' : '')),
|
|
set('id', "tab{$blockNavCode}Content{$product->id}"),
|
|
$productInfo,
|
|
);
|
|
}
|
|
else
|
|
{
|
|
$index = array_search($product->id, $productIdList);
|
|
$nextProductID = $index !== false && !empty($productIdList[$index + 1]) ? $productIdList[$index + 1] : 0;
|
|
|
|
$tabItems = array();
|
|
$tabItems[] = cell
|
|
(
|
|
ul
|
|
(
|
|
setClass('nav nav-tabs h-10 px-1 justify-between items-center'),
|
|
set::width('100%'),
|
|
li
|
|
(
|
|
setClass('nav-item'),
|
|
btn
|
|
(
|
|
setClass('size-sm shadow-lg circle pre-button'),
|
|
set::square(true),
|
|
set::disabled(empty($preProductID)),
|
|
set::href("#tab{$blockNavCode}Content{$preProductID}"),
|
|
set('data-toggle', 'tab'),
|
|
set::iconClass('text-xl text-primary'),
|
|
set::icon('angle-left'),
|
|
),
|
|
),
|
|
li
|
|
(
|
|
setClass('nav-item px-4'),
|
|
hasPriv('product', 'browse') ? btn
|
|
(
|
|
setClass('ghost'),
|
|
set::url(createLink('product', 'browse', "productID={$product->id}")),
|
|
span
|
|
(
|
|
setClass('text-primary'),
|
|
$product->name
|
|
),
|
|
icon
|
|
(
|
|
setClass('text-primary ml-4 rotate-90'),
|
|
'export'
|
|
),
|
|
) : $product->name,
|
|
),
|
|
li
|
|
(
|
|
setClass('nav-item'),
|
|
btn
|
|
(
|
|
setClass('size-sm shadow-lg circle next-button'),
|
|
set::square(true),
|
|
set::disabled(empty($nextProductID)),
|
|
set::href("#tab{$blockNavCode}Content{$nextProductID}"),
|
|
set('data-toggle', 'tab'),
|
|
set::iconClass('text-xl text-primary'),
|
|
set::icon('angle-right'),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
$tabItems[] = cell
|
|
(
|
|
setClass('tab-content pt-1'),
|
|
set::width('100%'),
|
|
div
|
|
(
|
|
$productInfo,
|
|
),
|
|
);
|
|
$statisticCells[] = cell
|
|
(
|
|
setClass('tab-pane pt-1 w-full' . ($product->id == $selected ? ' active' : '')),
|
|
set('id', "tab{$blockNavCode}Content{$product->id}"),
|
|
$tabItems,
|
|
);
|
|
$preProductID = $product->id;
|
|
}
|
|
}
|
|
if($longBlock)
|
|
{
|
|
$statisticCells[] = cell
|
|
(
|
|
set::width('22%'),
|
|
setClass('bg-secondary-pale overflow-y-auto overflow-x-hidden'),
|
|
ul
|
|
(
|
|
setClass('nav nav-tabs nav-stacked'),
|
|
$navTabs,
|
|
),
|
|
);
|
|
$statisticCells[] = cell
|
|
(
|
|
setClass('tab-content'),
|
|
set::width('78%'),
|
|
$tabItems,
|
|
);
|
|
}
|
|
|
|
panel
|
|
(
|
|
setClass('bugstatistic-block ' . ($longBlock ? 'block-long' : 'block-sm')),
|
|
set::bodyClass('no-shadow border-t p-0'),
|
|
set::title($block->title),
|
|
div
|
|
(
|
|
setClass('flex h-full' . (!$longBlock ? ' flex-wrap' : '')),
|
|
$statisticCells,
|
|
)
|
|
);
|
|
|
|
render();
|