edit.html.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. <?php
  2. /**
  3. * The edit view file of testreport module of ZenTaoPMS.
  4. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  5. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  6. * @author Yuting Wang <wangyuting@easycorp.ltd>
  7. * @package testreport
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. jsVar('reportID', $report->id);
  12. $caseCharts = array();
  13. foreach($charts as $chartType => $chartOption)
  14. {
  15. $chartData = $datas[$chartType];
  16. $chartOption = array();
  17. $tableTR = array();
  18. $colorList = array('#5470C6', '#91CC75', '#FAC858', '#EE6666', '#73C0DE', '#3BA272', '#FC8452', '#9A60B4', '#EA7CCC');
  19. foreach($chartData as $key => $data)
  20. {
  21. $color = current($colorList);
  22. $chartOption[] = array('name' => $data->name, 'value' => $data->value);
  23. $tableTR[] = h::tr
  24. (
  25. h::td(label(set::className('label-dot mr-2'), set::style(array('background-color' => $color, '--tw-ring-color' => $color))), $data->name),
  26. h::td($data->value),
  27. h::td(($data->percent * 100) . '%')
  28. );
  29. if(!next($colorList)) reset($colorList);
  30. }
  31. $caseCharts[] = div
  32. (
  33. set::className('mt-6'),
  34. div
  35. (
  36. set::className('flex border'),
  37. cell
  38. (
  39. set::width('50%'),
  40. set::className('border-r'),
  41. div(set::className('center text-base font-bold py-2'), $lang->testtask->report->charts[$chartType]),
  42. echarts
  43. (
  44. set::color($colorList),
  45. set::width('100%'),
  46. set::height('300px'),
  47. set::series
  48. (
  49. array
  50. (
  51. array
  52. (
  53. 'data' => $chartOption,
  54. 'type' => 'pie'
  55. )
  56. )
  57. ),
  58. set::tooltip(array('show' => true, 'formatter' => "{b} : {d}%"))
  59. )
  60. ),
  61. cell
  62. (
  63. set::width('50%'),
  64. h::table
  65. (
  66. set::className('table'),
  67. h::tr
  68. (
  69. h::th($lang->report->item),
  70. h::th(set::width('100px'), $lang->report->value),
  71. h::th(set::width('120px'), $lang->report->percent)
  72. ),
  73. $tableTR
  74. )
  75. )
  76. )
  77. );
  78. }
  79. $tableTR = array();
  80. $colorList = array('#D5D9DF', '#D50000', '#FF9800', '#2098EE', '#009688');
  81. $chartOption = array();
  82. foreach($lang->bug->priList as $key => $value)
  83. {
  84. $color = current($colorList);
  85. $label = $key == 0 ? $lang->null : $value;
  86. $generated = !empty($bugInfo['bugStageGroups'][$key]['generated']) ? $bugInfo['bugStageGroups'][$key]['generated'] : 0;
  87. $legacy = !empty($bugInfo['bugStageGroups'][$key]['legacy']) ? $bugInfo['bugStageGroups'][$key]['legacy'] : 0;
  88. $resolved = !empty($bugInfo['bugStageGroups'][$key]['resolved']) ? $bugInfo['bugStageGroups'][$key]['resolved'] : 0;
  89. $chartOption[] = array('name' => $label, 'type' => 'bar', 'data' => array($generated, $legacy, $resolved));
  90. $tableTR[] = h::tr
  91. (
  92. h::td(label(set::className('label-dot mr-2'), set::style(array('background-color' => $color, '--tw-ring-color' => $color))), $label),
  93. h::td($generated),
  94. h::td($legacy),
  95. h::td($resolved)
  96. );
  97. if(!next($colorList)) reset($colorList);
  98. }
  99. $bugStageChart = div
  100. (
  101. set::className('mt-6'),
  102. div
  103. (
  104. set::className('flex border'),
  105. cell
  106. (
  107. set::width('50%'),
  108. set::className('border-r'),
  109. div(set::className('center text-base font-bold py-2'), $lang->testreport->bugStageGroups),
  110. echarts
  111. (
  112. set::color($colorList),
  113. set::width('100%'),
  114. set::height('300px'),
  115. set::xAxis
  116. (
  117. array
  118. (
  119. 'type' => 'category',
  120. 'data' => array($lang->testreport->bugStageList['generated'], $lang->testreport->bugStageList['legacy'], $lang->testreport->bugStageList['resolved'])
  121. )
  122. ),
  123. set::yAxis(array('type' => 'value')),
  124. set::series($chartOption),
  125. set::tooltip(array('trigger' => 'axis', 'axisPointer' => array('type' => 'shadow')))
  126. )
  127. ),
  128. cell
  129. (
  130. set::width('50%'),
  131. h::table
  132. (
  133. set::className('table'),
  134. h::tr
  135. (
  136. h::th($lang->bug->pri),
  137. h::th($lang->testreport->bugStageList['generated']),
  138. h::th($lang->testreport->bugStageList['legacy']),
  139. h::th($lang->testreport->bugStageList['resolved'])
  140. ),
  141. $tableTR
  142. )
  143. )
  144. )
  145. );
  146. $tableTR = array();
  147. $chartOption = array();
  148. $xAxisData = array();
  149. $beginTime = isset($report->begin) ? strtotime($report->begin) : strtotime($begin);
  150. $endTime = isset($report->end) ? strtotime($report->end) : strtotime($end);
  151. foreach(array('generated', 'legacy', 'resolved') as $field)
  152. {
  153. $chartOption[$field] = array('name' => $lang->testreport->bugStageList[$field], 'type' => 'line', 'data' => array());
  154. }
  155. for($time = $beginTime; $time <= $endTime; $time += 86400)
  156. {
  157. $date = date('m-d', $time);
  158. $generated = !empty($bugInfo['bugHandleGroups']['generated'][$date]) ? $bugInfo['bugHandleGroups']['generated'][$date] : 0;
  159. $legacy = !empty($bugInfo['bugHandleGroups']['legacy'][$date]) ? $bugInfo['bugHandleGroups']['legacy'][$date] : 0;
  160. $resolved = !empty($bugInfo['bugHandleGroups']['resolved'][$date]) ? $bugInfo['bugHandleGroups']['resolved'][$date] : 0;
  161. $chartOption['generated']['data'][] = $generated;
  162. $chartOption['legacy']['data'][] = $legacy;
  163. $chartOption['resolved']['data'][] = $resolved;
  164. $xAxisData[] = $date;
  165. $tableTR[] = h::tr
  166. (
  167. h::td(setClass('text-center'), $date),
  168. h::td($generated),
  169. h::td($legacy),
  170. h::td($resolved)
  171. );
  172. }
  173. $chartOption = array_values($chartOption);
  174. $bugHandleChart = div
  175. (
  176. set::className('mt-6'),
  177. div
  178. (
  179. set::className('flex border'),
  180. cell
  181. (
  182. set::width('50%'),
  183. set::className('border-r'),
  184. div(set::className('center text-base font-bold py-2'), $lang->testreport->bugHandleGroups),
  185. echarts
  186. (
  187. set::color(array('#FF9800', '#2098EE', '#009688')),
  188. set::width('100%'),
  189. set::height('300px'),
  190. set::xAxis
  191. (
  192. array
  193. (
  194. 'type' => 'category',
  195. 'data' => $xAxisData
  196. )
  197. ),
  198. set::yAxis(array('type' => 'value')),
  199. set::series($chartOption),
  200. set::tooltip(array('trigger' => 'axis', 'axisPointer' => array('type' => 'shadow')))
  201. )
  202. ),
  203. cell
  204. (
  205. set::width('50%'),
  206. h::table
  207. (
  208. set::className('table'),
  209. h::tr
  210. (
  211. h::th($lang->testreport->date),
  212. h::th(label(set::className('label-dot mr-2'), set::style(array('background-color' => '#FF9800', '--tw-ring-color' => '#FF9800'))), $lang->testreport->bugStageList['generated']),
  213. h::th(label(set::className('label-dot mr-2'), set::style(array('background-color' => '#2098EE', '--tw-ring-color' => '#2098EE'))), $lang->testreport->bugStageList['legacy']),
  214. h::th(label(set::className('label-dot mr-2'), set::style(array('background-color' => '#009688', '--tw-ring-color' => '#009688'))), $lang->testreport->bugStageList['resolved'])
  215. ),
  216. $tableTR
  217. )
  218. )
  219. )
  220. );
  221. $bugCharts = array();
  222. foreach($bugInfo as $infoKey => $infoValue)
  223. {
  224. if($infoKey == 'bugStageGroups' || $infoKey == 'bugHandleGroups') continue;
  225. $list = $infoValue;
  226. if($infoKey == 'bugSeverityGroups') $list = $lang->bug->severityList;
  227. if($infoKey == 'bugStatusGroups') $list = $lang->bug->statusList;
  228. if($infoKey == 'bugResolutionGroups') $list = $lang->bug->resolutionList;
  229. $chartOption = array();
  230. $tableTR = array();
  231. $colorList = array('#5470C6', '#91CC75', '#FAC858', '#EE6666', '#73C0DE', '#3BA272', '#FC8452', '#9A60B4', '#EA7CCC');
  232. $sum = 0;
  233. foreach($infoValue as $value) $sum += $value->value;
  234. foreach($list as $listKey => $listValue)
  235. {
  236. $color = current($colorList);
  237. $name = $listValue;
  238. $value = 0;
  239. if(isset($infoValue[$listKey]))
  240. {
  241. $name = $infoValue[$listKey]->name;
  242. $value = $infoValue[$listKey]->value;
  243. }
  244. if(empty($name) && empty($value)) continue;
  245. $chartOption[] = array('name' => $name, 'value' => $value);
  246. $tableTR[] = h::tr
  247. (
  248. h::td(label(set::className('label-dot mr-2'), set::style(array('background-color' => $color, '--tw-ring-color' => $color))), $name),
  249. h::td($value),
  250. h::td(($sum ? round(($value / $sum * 100), 2) : '0') . '%')
  251. );
  252. if(!next($colorList)) reset($colorList);
  253. }
  254. $bugCharts[] = div
  255. (
  256. set::className('mt-6'),
  257. div
  258. (
  259. set::className('flex border'),
  260. cell
  261. (
  262. set::width('50%'),
  263. set::className('border-r'),
  264. div(set::className('center text-base font-bold py-2'), $lang->testreport->{$infoKey}),
  265. echarts
  266. (
  267. set::color($colorList),
  268. set::width('100%'),
  269. set::height('300px'),
  270. set::series
  271. (
  272. array
  273. (
  274. array
  275. (
  276. 'data' => $chartOption,
  277. 'type' => 'pie'
  278. )
  279. )
  280. ),
  281. set::tooltip(array('show' => true, 'formatter' => "{b} : {d}%"))
  282. )
  283. ),
  284. cell
  285. (
  286. set::width('50%'),
  287. h::table
  288. (
  289. set::className('table'),
  290. h::tr
  291. (
  292. h::th($lang->report->item),
  293. h::th(set::width('100px'), $lang->report->value),
  294. h::th(set::width('120px'), $lang->report->percent)
  295. ),
  296. $tableTR
  297. )
  298. )
  299. )
  300. );
  301. }
  302. panel
  303. (
  304. formPanel
  305. (
  306. set::title($lang->testreport->edit),
  307. formRow
  308. (
  309. formGroup
  310. (
  311. set::width('1/2'),
  312. set::label($lang->testreport->startEnd),
  313. set::required(strpos(",{$this->config->testreport->edit->requiredFields},", ",begin,") !== false || strpos(",{$this->config->testreport->edit->requiredFields},", ",end,") !== false),
  314. inputGroup
  315. (
  316. datePicker
  317. (
  318. set::name('begin'),
  319. set::value($begin),
  320. setData(array('on' => 'change', 'call' => 'refreshPage'))
  321. ),
  322. $lang->testtask->to,
  323. datePicker
  324. (
  325. set::name('end'),
  326. set::value($end),
  327. setData(array('on' => 'change', 'call' => 'refreshPage'))
  328. )
  329. ),
  330. input
  331. (
  332. set::className('hidden'),
  333. set::name('product'),
  334. set::value($productIdList)
  335. ),
  336. input
  337. (
  338. set::className('hidden'),
  339. set::name('execution'),
  340. set::value($execution->id)
  341. ),
  342. input
  343. (
  344. set::className('hidden'),
  345. set::name('tasks'),
  346. set::value($report->tasks)
  347. ),
  348. input
  349. (
  350. set::className('hidden'),
  351. set::name('bugs'),
  352. set::value(implode(',', array_keys($bugs)))
  353. ),
  354. input
  355. (
  356. set::className('hidden'),
  357. set::name('builds'),
  358. set::value(implode(',', array_keys($builds)))
  359. ),
  360. input
  361. (
  362. set::className('hidden'),
  363. set::name('cases'),
  364. set::value(implode(',', array_keys($caseList)))
  365. ),
  366. input
  367. (
  368. set::className('hidden'),
  369. set::name('stories'),
  370. set::value(implode(',', array_keys($stories)))
  371. )
  372. ),
  373. formGroup
  374. (
  375. set::width('1/2'),
  376. set::label($lang->testreport->owner),
  377. set::control('picker'),
  378. set::name('owner'),
  379. set::items($users),
  380. set::value($report->owner)
  381. )
  382. ),
  383. formRow
  384. (
  385. formGroup
  386. (
  387. set::label($lang->testreport->members),
  388. set::required(strpos(",{$this->config->testreport->edit->requiredFields},", ",members,") !== false),
  389. picker
  390. (
  391. set::multiple(true),
  392. set::name('members[]'),
  393. set::items($users),
  394. set::value($report->members)
  395. )
  396. )
  397. ),
  398. ($maxRunDate && $maxRunDate > $end) ? formGroup
  399. (
  400. setClass('items-center runDate-tips'),
  401. set::label(''),
  402. div(
  403. setClass('text-warning'),
  404. span(sprintf($lang->testreport->runDateTips, $maxRunDate) . ' '),
  405. span(
  406. setClass('underline cursor-pointer'),
  407. on::click('ignoreRunDate'),
  408. $lang->testreport->ignore
  409. )
  410. )
  411. ) : null,
  412. formRow
  413. (
  414. formGroup
  415. (
  416. set::label($lang->testreport->title),
  417. set::name('title'),
  418. set::value($report->title)
  419. )
  420. ),
  421. !empty($execution->desc) ? formRow
  422. (
  423. formGroup
  424. (
  425. set::className('items-center'),
  426. set::label($lang->testreport->goal),
  427. span
  428. (
  429. icon
  430. (
  431. 'help',
  432. setClass('text-light mr-0.5'),
  433. setData(array('toggle' => 'tooltip', 'title' => $lang->testreport->goalTip))
  434. ),
  435. strip_tags($execution->desc)
  436. )
  437. )
  438. ) : null,
  439. formRow
  440. (
  441. formGroup
  442. (
  443. set::className('items-center'),
  444. set::label($lang->testreport->profile),
  445. div
  446. (
  447. div(html($storySummary)),
  448. div(html(sprintf($lang->testreport->buildSummary, empty($builds) ? 1 : count($builds)) . $caseSummary)),
  449. div(html(sprintf($lang->testreport->bugSummary, $bugSummary['foundBugs'], count($legacyBugs), $bugSummary['activatedBugs'], $bugSummary['countBugByTask'], $bugSummary['bugConfirmedRate'] . '%', $bugSummary['bugCreateByCaseRate'] . '%')))
  450. )
  451. )
  452. ),
  453. formRow
  454. (
  455. formGroup
  456. (
  457. set::label($lang->testreport->report),
  458. set::required(strpos(",{$this->config->testreport->edit->requiredFields},", ",report,") !== false),
  459. editor
  460. (
  461. set::name('report'),
  462. html($report->report)
  463. )
  464. )
  465. ),
  466. formRow
  467. (
  468. formGroup
  469. (
  470. set::label($lang->files),
  471. fileSelector($report->files ? set::defaultFiles(array_values($report->files)) : null)
  472. )
  473. )
  474. ),
  475. formPanel
  476. (
  477. set::title($lang->testreport->legendStoryAndBug),
  478. set::actions(array()),
  479. dtable
  480. (
  481. set::cols($config->testreport->story->dtable->fieldList),
  482. set::data(array_values($stories)),
  483. set::emptyTip($lang->story->noStory),
  484. set::userMap($users)
  485. ),
  486. div(set::className('my-6')),
  487. dtable
  488. (
  489. set::cols($config->testreport->bug->dtable->fieldList),
  490. set::data(array_values($bugs)),
  491. set::emptyTip($lang->bug->notice->noBug),
  492. set::userMap($users)
  493. )
  494. ),
  495. formPanel
  496. (
  497. set::className('mt-6'),
  498. set::title($lang->testreport->legendBuild),
  499. set::actions(array()),
  500. dtable
  501. (
  502. set::cols($config->testreport->build->dtable->fieldList),
  503. set::data(array_values($builds)),
  504. set::userMap($users)
  505. )
  506. ),
  507. formPanel
  508. (
  509. set::className('mt-6'),
  510. set::title($lang->testreport->legendCase),
  511. set::actions(array()),
  512. dtable
  513. (
  514. set::cols($config->testreport->testcase->dtable->fieldList),
  515. set::data(array_values($caseList)),
  516. set::userMap($users)
  517. )
  518. ),
  519. formPanel
  520. (
  521. set::className('mt-6'),
  522. set::title($lang->testreport->legendLegacyBugs),
  523. set::actions(array()),
  524. dtable
  525. (
  526. set::cols($config->testreport->bug->dtable->fieldList),
  527. set::data(array_values($legacyBugs)),
  528. set::userMap($users)
  529. )
  530. ),
  531. formPanel
  532. (
  533. setID('tabReport'),
  534. set::className('mt-6'),
  535. set::title($lang->testreport->legendReport),
  536. set::actions(array()),
  537. $caseCharts,
  538. $bugStageChart,
  539. $bugHandleChart,
  540. $bugCharts
  541. )
  542. );
  543. render();