waterfallreportblock.html.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. <?php
  2. /**
  3. * The waterfall report block view file of block 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 block
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. $items[] = array
  12. (
  13. 'id' => $project->id,
  14. 'text' => $project->name,
  15. 'url' => createLink('project', 'index', "projectID={$project->id}"),
  16. 'activeUrl' => createLink('block', 'printBlock', "blockID={$block->id}&params=" . helper::safe64Encode(http_build_query($params)))
  17. );
  18. $remainingDays = !empty($project->remainingDays) ? $project->remainingDays : 0;
  19. $projectOverview = array();
  20. if($project)
  21. {
  22. $projectOverview[] = cell
  23. (
  24. setClass('text-left'),
  25. $project->status != 'closed' && $project->end != LONG_TIME ? span
  26. (
  27. setClass('text-gray'),
  28. $remainingDays >= 0 ? $lang->block->projectstatistic->leftDaysPre : $lang->block->projectstatistic->delayDaysPre,
  29. span
  30. (
  31. setClass('font-bold text-black px-1'),
  32. abs($remainingDays)
  33. ),
  34. $lang->block->projectstatistic->day
  35. ) : span
  36. (
  37. setClass('text-gray'),
  38. $project->status == 'closed' ? $lang->block->projectstatistic->projectClosed : $lang->block->projectstatistic->longTimeProject
  39. )
  40. );
  41. $projectOverview[] = $config->edition != 'open' && $config->edition != 'biz' ? div(setClass('divider mx-1 my-auto h-4')) : null;
  42. $projectOverview[] = $config->edition != 'open' && $config->edition != 'biz' ? cell
  43. (
  44. setClass('flex-0 text-left' . (!$longBlock ? ' w-full' : '')),
  45. span
  46. (
  47. setClass('text-gray mr-4'),
  48. $lang->block->projectstatistic->existRisks,
  49. span
  50. (
  51. setClass('font-bold ml-2 text-danger'),
  52. $project->risks
  53. )
  54. ),
  55. span
  56. (
  57. setClass('text-gray'),
  58. $lang->block->projectstatistic->existIssues,
  59. span
  60. (
  61. setClass('font-bold ml-2 text-danger'),
  62. $project->issues
  63. )
  64. )
  65. ) : '';
  66. $lastestExecution = !empty($project->executions) && $project->multiple ? cell
  67. (
  68. setClass('flex overflow-hidden whitespace-nowrap clip w-full' . (!$longBlock ? ' flex-0 text-left w-full' : ' flex-1')),
  69. span
  70. (
  71. setClass('text-gray'),
  72. $lang->block->projectstatistic->lastestExecution,
  73. hasPriv('execution', 'task') ? a
  74. (
  75. setClass('pl-2'),
  76. set::href(helper::createLink('execution', 'task', "executionID={$project->executions[0]->id}")),
  77. set('title', $project->executions[0]->name),
  78. $project->executions[0]->name
  79. ) : span
  80. (
  81. setClass('pl-2'),
  82. $project->executions[0]->name
  83. )
  84. )
  85. ) : null;
  86. $cells = array();
  87. if(in_array($project->model, array('scrum', 'kanban', 'agileplus')))
  88. {
  89. foreach($config->block->projectstatistic->items as $module => $moduleItems)
  90. {
  91. $cellItems = array();
  92. foreach($moduleItems as $item)
  93. {
  94. $field = $item['field'];
  95. $unit = $item['unit'];
  96. $cellItems[] = item
  97. (
  98. set::name
  99. (
  100. $lang->block->projectstatistic->{$field},
  101. !isset($lang->block->tooltips[$field]) ? ':' : null
  102. ),
  103. to::suffixName
  104. (
  105. isset($lang->block->tooltips[$field]) ? icon
  106. (
  107. setClass('text-light text-sm'),
  108. toggle::tooltip
  109. (
  110. array
  111. (
  112. 'title' => $lang->block->tooltips[$field],
  113. 'placement' => 'bottom',
  114. 'type' => 'white',
  115. 'className' => 'text-dark border border-light leading-5'
  116. )
  117. ),
  118. 'help',
  119. ':'
  120. ) : null
  121. ),
  122. span
  123. (
  124. setClass('font-bold text-black mr-0.5'),
  125. round(zget($project, $field, 0), 2)
  126. ),
  127. span
  128. (
  129. setClass('text-gray'),
  130. $field == 'storyPoints' ? $config->block->storyUnitList[$config->custom->hourPoint] : $lang->block->projectstatistic->{$unit}
  131. )
  132. );
  133. }
  134. $cells[] = cell
  135. (
  136. setClass('flex-1 overflow-hidden whitespace-nowrap project-statistic-table scrum' . (($module != 'cost' && $longBlock) || ($module != 'task' && $module != 'cost' && !$longBlock) ? ' border-l pl-4 ' : ' ml-4') . (!$longBlock && $module != 'cost' && $module != 'story'? ' border-t' : '')),
  137. set::width($longBlock ? ($module == 'cost' ? 'calc(25% - 1rem)' : '25%') : 'calc(50% - 1rem)'),
  138. div
  139. (
  140. setClass('pt-1'),
  141. span
  142. (
  143. setClass('font-bold'),
  144. $lang->block->projectstatistic->{$module}
  145. )
  146. ),
  147. tableData
  148. (
  149. set::width('100%'),
  150. $cellItems
  151. )
  152. );
  153. }
  154. }
  155. else
  156. {
  157. $cells[] = cell
  158. (
  159. setClass('flex flex-wrap items-center progress-circle pt-2 mb-2'),
  160. set::width($longBlock ? '36%' : '100%'),
  161. div
  162. (
  163. setClass('flex justify-center w-full'),
  164. progressCircle
  165. (
  166. set::percent($project->progress),
  167. set::size(112),
  168. set::text(false),
  169. set::circleWidth(0.06),
  170. div(span(setClass('text-2xl font-bold'), $project->progress), '%'),
  171. div
  172. (
  173. setClass('row text-sm text-gray items-center gap-1'),
  174. $lang->block->projectstatistic->totalProgress,
  175. icon
  176. (
  177. setClass('pl-0.5 text-light text-sm'),
  178. toggle::tooltip
  179. (
  180. array
  181. (
  182. 'content' => array('html' => $lang->block->projectstatistic->totalProgressTip),
  183. 'placement' => 'bottom-end',
  184. 'type' => 'white',
  185. 'className' => 'text-dark border border-light leading-5'
  186. )
  187. ),
  188. 'help'
  189. )
  190. )
  191. )
  192. )
  193. );
  194. $cells[] = cell
  195. (
  196. setClass('project-statistic-table waterfall bg-gray-50 border border-1 pt-2 px-1'),
  197. set::width($longBlock ? '32%' : 'calc(50% - 0.25rem)'),
  198. div
  199. (
  200. setClass('w-full'),
  201. span
  202. (
  203. setClass('font-bold ml-3'),
  204. $lang->project->progress
  205. )
  206. ),
  207. tableData
  208. (
  209. item
  210. (
  211. set::name($lang->block->projectstatistic->sv),
  212. to::suffixName(icon
  213. (
  214. setClass('text-light text-sm'),
  215. toggle::tooltip
  216. (
  217. array
  218. (
  219. 'title' => $lang->block->tooltips['sv'],
  220. 'placement' => 'bottom',
  221. 'type' => 'white',
  222. 'className' => 'text-dark border border-light leading-5'
  223. )
  224. ),
  225. 'help'
  226. )),
  227. span
  228. (
  229. setClass('font-bold text-black mr-1'),
  230. (!empty($project->sv) ? $project->sv : 0) . $lang->percent
  231. )
  232. ),
  233. item
  234. (
  235. set::name($lang->block->projectstatistic->pv),
  236. to::suffixName(icon
  237. (
  238. setClass('text-light text-sm'),
  239. toggle::tooltip
  240. (
  241. array
  242. (
  243. 'content' => array('html' => $lang->block->tooltips['pv']),
  244. 'placement' => 'bottom',
  245. 'type' => 'white',
  246. 'className' => 'text-dark border border-light leading-5'
  247. )
  248. ),
  249. 'help'
  250. )),
  251. span
  252. (
  253. setClass('font-bold text-black mr-1'),
  254. !empty($project->pv) ? $project->pv : 0
  255. )
  256. ),
  257. item
  258. (
  259. set::name($lang->block->projectstatistic->ev),
  260. to::suffixName(icon
  261. (
  262. setClass('text-light text-sm'),
  263. toggle::tooltip
  264. (
  265. array
  266. (
  267. 'content' => array('html' => $lang->block->tooltips['ev']),
  268. 'placement' => 'bottom',
  269. 'type' => 'white',
  270. 'className' => 'text-dark border border-light leading-5'
  271. )
  272. ),
  273. 'help'
  274. )),
  275. span
  276. (
  277. setClass('font-bold text-black mr-1'),
  278. !empty($project->ev) ? $project->ev : 0
  279. )
  280. )
  281. )
  282. );
  283. $cells[] = cell
  284. (
  285. setClass('project-statistic-table waterfall bg-gray-50 border border-1 pt-2 px-1'),
  286. set::width($longBlock ? '32%' : 'calc(50% - 0.25rem)'),
  287. div
  288. (
  289. setClass('w-full'),
  290. span
  291. (
  292. setClass('font-bold ml-3'),
  293. $lang->block->projectstatistic->currentCost
  294. )
  295. ),
  296. tableData
  297. (
  298. item(set::name($lang->block->projectstatistic->cv), to::suffixName(icon
  299. (
  300. setClass('text-light text-sm'),
  301. toggle::tooltip
  302. (
  303. array
  304. (
  305. 'title' => $lang->block->tooltips['cv'],
  306. 'placement' => 'bottom',
  307. 'type' => 'white',
  308. 'className' => 'text-dark border border-light leading-5'
  309. )
  310. ),
  311. 'help'
  312. )), span
  313. (
  314. setClass('font-bold text-black mr-1'),
  315. (!empty($project->cv) ? $project->cv : 0) . $lang->percent
  316. )),
  317. item
  318. (
  319. set::name($lang->block->projectstatistic->ev),
  320. to::suffixName(icon
  321. (
  322. setClass('text-light text-sm'),
  323. toggle::tooltip
  324. (
  325. array
  326. (
  327. 'content' => array('html' => $lang->block->tooltips['ev']),
  328. 'placement' => 'bottom',
  329. 'type' => 'white',
  330. 'className' => 'text-dark border border-light leading-5'
  331. )
  332. ),
  333. 'help'
  334. )),
  335. span
  336. (
  337. setClass('font-bold text-black mr-1'),
  338. !empty($project->ev) ? $project->ev : 0
  339. )
  340. ),
  341. item
  342. (
  343. set::name($lang->block->projectstatistic->ac),
  344. to::suffixName(icon
  345. (
  346. setClass('text-light text-sm'),
  347. toggle::tooltip
  348. (
  349. array
  350. (
  351. 'content' => array('html' => $lang->block->tooltips['ac']),
  352. 'placement' => 'bottom',
  353. 'type' => 'white',
  354. 'className' => 'text-dark border border-light leading-5'
  355. )
  356. ),
  357. 'help'
  358. )),
  359. span
  360. (
  361. setClass('font-bold text-black mr-1'),
  362. !empty($project->ac) ? $project->ac : 0
  363. )
  364. )
  365. )
  366. );
  367. }
  368. }
  369. statisticBlock
  370. (
  371. to::titleSuffix
  372. (
  373. icon
  374. (
  375. setClass('text-light text-sm cursor-pointer'),
  376. toggle::tooltip
  377. (
  378. array
  379. (
  380. 'title' => sprintf($lang->block->tooltips['metricTime'], $metricTime),
  381. 'placement' => $app->getClientLang() == 'en' ? 'bottom-end' : 'bottom',
  382. 'type' => 'white',
  383. 'className' => 'text-dark border border-light leading-5'
  384. )
  385. ),
  386. 'help'
  387. )
  388. ),
  389. set::block($block),
  390. set::active($project->id),
  391. set::items($items),
  392. set::className('waterfallreport-block'),
  393. $project ? div
  394. (
  395. div
  396. (
  397. setClass('flex bg-white leading-6 px-2 py-1 mt-1 mx-3 items-center gap-x-2 gap-y-1 justify-between' . ($longBlock ? ' h-10 my-3 flex-nowrap' : ' h-14 mb-1 flex-wrap')),
  398. !empty($lastestExecution) || !$longBlock ? $lastestExecution : div(),
  399. div(setClass('flex justify-end gap-x-2 nowrap'), $projectOverview)
  400. ),
  401. div
  402. (
  403. setClass('flex gap-2 p-3 pt-1' . (!$longBlock ? ' flex-wrap gap-y-3' : ' pt-0')),
  404. $cells
  405. )
  406. ) : null
  407. );