view.html.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. <?php
  2. /**
  3. * The activate view file of task 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 Sun Guangming<sunguangming@easycorp.ltd>
  7. * @package task
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. $buildModule = $app->tab == 'project' ? 'projectbuild' : 'build';
  12. $decodeParam = helper::safe64Decode($param);
  13. $canBeChanged = common::canBeChanged($buildModule, $build);
  14. if($canBeChanged && $execution) $canBeChanged = common::canModify('execution', $execution);
  15. $buildItems = array();
  16. foreach($buildPairs as $id => $name)
  17. {
  18. $buildItem['text'] = $name;
  19. $buildItem['url'] = helper::createLink($buildModule, 'view', "buildID=$id");
  20. $buildItem['data-app'] = $app->tab;
  21. $buildItem['active'] = $id == $build->id;
  22. $buildItems[] = $buildItem;
  23. }
  24. $actions = $build->deleted || !$canBeChanged ? array() : $this->loadModel('common')->buildOperateMenu($build);
  25. foreach($actions as $actionType => $typeActions)
  26. {
  27. foreach($typeActions as $key => $action)
  28. {
  29. $actions[$actionType][$key]['url'] = str_replace('{id}', (string)$build->id, $action['url']);
  30. $actions[$actionType][$key]['className'] = isset($action['className']) ? $action['className'] . ' ghost' : 'ghost';
  31. $actions[$actionType][$key]['iconClass'] = isset($action['iconClass']) ? $action['iconClass'] . ' text-primary' : 'text-primary';
  32. if(isset($action['action']) && $action['icon'] == 'edit') $actions[$actionType][$key]['text'] = $lang->edit;
  33. if(isset($action['action']) && $action['icon'] == 'trash') $actions[$actionType][$key]['text'] = $lang->delete;
  34. }
  35. }
  36. detailHeader
  37. (
  38. to::prefix
  39. (
  40. backBtn
  41. (
  42. set::icon('back'),
  43. set::type('secondary'),
  44. $lang->goback
  45. ),
  46. dropdown(btn
  47. (
  48. setClass('ghost text-primary bg-gray-200 bg-opacity-50'),
  49. entityLabel(set::entityID($build->id), set::level(2), set::text($build->name), set::textClass('text-primary'), set::idClass('id-label')),
  50. $build->deleted ? span(setClass('label danger'), $lang->bug->deleted) : null
  51. ), set::items($buildItems))
  52. ),
  53. !empty($actions['mainActions']) || !empty($actions['suffixActions']) ? to::suffix
  54. (
  55. btnGroup(set::items($actions['mainActions'])),
  56. !empty($actions['mainActions']) && !empty($actions['suffixActions']) ? div(setClass('divider')): null,
  57. btnGroup(set::items($actions['suffixActions']))
  58. ) : null
  59. );
  60. jsVar('initLink', $link);
  61. jsVar('type', $type == 'story' ? 'linkStory' : $type);
  62. jsVar('linkParams', $decodeParam);
  63. jsVar('buildID', $build->id);
  64. jsVar('confirmDelete', $lang->build->confirmDelete);
  65. jsVar('currentAccount', $app->user->account);
  66. jsVar('buildProduct', $build->product);
  67. jsVar('buildModule', $buildModule);
  68. jsVar('grades', $grades);
  69. jsVar('showGrade', $showGrade);
  70. /* Story's batch btn. */
  71. $canBatchUnlinkStory = $canBeChanged && common::hasPriv($buildModule, 'batchUnlinkStory');
  72. $canBatchCloseStory = $canBeChanged && common::hasPriv('story', 'batchClose');
  73. $storyFootToolbar = array();
  74. if($canBatchUnlinkStory) $storyFootToolbar['items'][] = array('className' => 'btn size-sm batch-btn ajax-btn', 'text' => $lang->build->batchUnlink, 'btnType' => 'secondary', 'data-type' => 'story', 'data-url' => createLink($buildModule, 'batchUnlinkStory', "build={$build->id}"));
  75. if($canBatchCloseStory) $storyFootToolbar['items'][] = array('className' => 'btn size-sm batch-btn', 'text' => $lang->story->batchClose, 'btnType' => 'secondary', 'data-type' => 'story', 'data-url' => createLink('story', 'batchClose', "productID={$build->product}&executionID={$objectID}"));
  76. /* Bug's batch btn. */
  77. $canBatchUnlinkBug = $canBeChanged && common::hasPriv($buildModule, 'batchUnlinkBug');
  78. $canBatchCloseBug = $canBeChanged && common::hasPriv('bug', 'batchClose');
  79. $bugFootToolbar = array();
  80. if($canBatchUnlinkBug) $bugFootToolbar['items'][] = array('className' => 'btn size-sm batch-btn', 'text' => $lang->build->batchUnlink, 'btnType' => 'secondary', 'data-type' => 'bug', 'data-url' => createLink($buildModule, 'batchUnlinkBug', "build={$build->id}"));
  81. if($canBatchCloseBug) $bugFootToolbar['items'][] = array('className' => 'btn size-sm batch-btn', 'text' => $lang->bug->batchClose, 'btnType' => 'secondary', 'data-type' => 'bug', 'data-url' => createLink('bug', 'batchClose'));
  82. /* Integrated builds or single build. */
  83. if($build->execution)
  84. {
  85. $executionTitle = empty($multipleProject) ? $lang->build->project : ($execution->type ? $lang->build->executionAB : $lang->build->execution);
  86. $executionName = zget($executions, $build->execution, '');
  87. }
  88. else
  89. {
  90. $builds = '';
  91. foreach(explode(',', $build->builds) as $buildID)
  92. {
  93. if($buildID) $builds .= html::a($this->createLink($buildModule, 'view', "buildID=$buildID") . "#app={$app->tab}", zget($buildPairs, $buildID)) . $lang->comma;
  94. }
  95. }
  96. /* Init table data for dtable. */
  97. $config->build->bug->dtable->fieldList['actions']['list']['unlinkBug']['url'] = array('module' => $buildModule, 'method' => 'unlinkBug', 'params' => "buildID={$build->id}&bugID={id}");
  98. $config->build->story->dtable->fieldList['actions']['list']['unlinkStory']['url'] = array('module' => $buildModule, 'method' => 'unlinkStory', 'params' => "buildID={$build->id}&storyID={id}");
  99. if(!$canBeChanged)
  100. {
  101. unset($config->build->bug->dtable->fieldList['actions']['list']);
  102. unset($config->build->story->dtable->fieldList['actions']['list']);
  103. }
  104. $stories = initTableData($stories, $config->build->story->dtable->fieldList, $this->build);
  105. $bugs = initTableData($bugs, $config->build->bug->dtable->fieldList, $this->build);
  106. $onlyNoCheckCount = 0;
  107. if(!empty($build->builds))
  108. {
  109. $buildStories = explode(',', $build->stories);
  110. $buildStories = array_combine($buildStories, $buildStories);
  111. foreach($stories as $index => $story)
  112. {
  113. if(empty($story->actions)) break;
  114. if(!isset($buildStories[$story->id]))
  115. {
  116. $story->noCheckBox = true;
  117. $story->actions[0]['disabled'] = true;
  118. }
  119. }
  120. $buildBugs = explode(',', $build->bugs);
  121. $buildBugs = array_combine($buildBugs, $buildBugs);
  122. foreach($bugs as $index => $bug)
  123. {
  124. if(empty($bug->actions)) break;
  125. if(!isset($buildBugs[$bug->id]))
  126. {
  127. $bug->noCheckBox = true;
  128. $bug->actions[0]['disabled'] = true;
  129. $onlyNoCheckCount++;
  130. }
  131. }
  132. }
  133. detailBody
  134. (
  135. set::hasExtraMain(false),
  136. on::click('.batch-btn')->call('window.handleBatchBtnClick', jsRaw('target')),
  137. sectionList(
  138. tabs
  139. (
  140. set::className('w-full'),
  141. set::id('buildTabs'),
  142. /* Linked story table. */
  143. tabPane
  144. (
  145. to::prefix(icon('lightbulb')),
  146. set::key('linkStory'),
  147. set::title($lang->build->stories),
  148. set::active($type == 'story'),
  149. div
  150. (
  151. setClass('tab-actions'),
  152. $canBeChanged && common::hasPriv($buildModule, 'linkStory') ? btn
  153. (
  154. set::text($lang->build->linkStory),
  155. set::icon('link'),
  156. set::type('primary'),
  157. bind::click("window.showLink('linkStory')")
  158. ) : null
  159. ),
  160. dtable
  161. (
  162. setID('linkStoryDTable'),
  163. set::style(array('min-width' => '100%')),
  164. set::userMap($users),
  165. set::cols(array_values($config->build->story->dtable->fieldList)),
  166. set::data($stories),
  167. set::checkable($canBatchUnlinkStory || $canBatchCloseStory),
  168. set::canRowCheckable(jsRaw("function(rowID){return this.getRowInfo(rowID).data.noCheckBox ? 'disabled' : true;}")),
  169. set::sortLink(createLink($buildModule, 'view', "buildID={$build->id}&type=story&link={$link}&param={$param}&orderBy={name}_{sortType}")),
  170. set::orderBy($orderBy),
  171. set::onRenderCell(jsRaw('window.renderStoryCell')),
  172. set::extraHeight('+144'),
  173. set::footToolbar($storyFootToolbar),
  174. set::footPager(usePager('storyPager', '', array(
  175. 'recPerPage' => $storyPager->recPerPage,
  176. 'recTotal' => $storyPager->recTotal,
  177. 'linkCreator' => helper::createLink($buildModule, 'view', "buildID={$build->id}&type=story&link={$link}&param={$param}&orderBy={$orderBy}&recTotal={$storyPager->recTotal}&recPerPage={recPerPage}&page={page}")
  178. )))
  179. )
  180. ),
  181. /* Resolved bugs table. */
  182. tabPane
  183. (
  184. to::prefix(icon('bug')),
  185. set::key('bug'),
  186. set::title($lang->build->bugs),
  187. set::active($type == 'bug'),
  188. div
  189. (
  190. setClass('tab-actions'),
  191. $canBeChanged && common::hasPriv($buildModule, 'linkBug') ? btn
  192. (
  193. set::text($lang->build->linkBug),
  194. set::type('primary'),
  195. set::icon('link'),
  196. bind::click("window.showLink('bug')")
  197. ) : null
  198. ),
  199. dtable
  200. (
  201. setID('bugDTable'),
  202. set::style(array('min-width' => '100%')),
  203. set::userMap($users),
  204. set::cols(array_values($config->build->bug->dtable->fieldList)),
  205. set::data($bugs),
  206. set::checkable(($canBatchUnlinkBug || $canBatchCloseBug) && $onlyNoCheckCount != count($bugs)),
  207. set::canRowCheckable(jsRaw("function(rowID){return this.getRowInfo(rowID).data.noCheckBox ? 'disabled' : true;}")),
  208. set::sortLink(createLink($buildModule, 'view', "buildID={$build->id}&type=bug&link={$link}&param={$param}&orderBy={name}_{sortType}")),
  209. set::orderBy($orderBy),
  210. set::extraHeight('+144'),
  211. set::footToolbar($bugFootToolbar),
  212. set::footPager(usePager('bugPager', '', array(
  213. 'recPerPage' => $bugPager->recPerPage,
  214. 'recTotal' => $bugPager->recTotal,
  215. 'linkCreator' => helper::createLink($buildModule, 'view', "buildID={$build->id}&type=bug&link={$link}&param={$param}&orderBy={$orderBy}&recTotal={$bugPager->recTotal}&recPerPage={recPerPage}&page={page}")
  216. )))
  217. )
  218. ),
  219. /* Generated bugs table. */
  220. tabPane
  221. (
  222. to::prefix(icon('bug')),
  223. set::key('generatedBug'),
  224. set::title($lang->build->generatedBugs),
  225. set::active($type == 'generatedBug'),
  226. dtable
  227. (
  228. set::style(array('min-width' => '100%')),
  229. set::userMap($users),
  230. set::cols(array_values($config->build->generatedBug->dtable->fieldList)),
  231. set::data(array_values($generatedBugs)),
  232. set::sortLink(createLink($buildModule, 'view', "buildID={$build->id}&type=generatedBug&link={$link}&param={$param}&orderBy={name}_{sortType}")),
  233. set::orderBy($orderBy),
  234. set::footPager(usePager('generatedBugPager', '', array(
  235. 'recPerPage' => $generatedBugPager->recPerPage,
  236. 'recTotal' => $generatedBugPager->recTotal,
  237. 'linkCreator' => helper::createLink($buildModule, 'view', "buildID={$build->id}&type=generatedBug&link={$link}&param={$param}&orderBy={$orderBy}&recTotal={$generatedBugPager->recTotal}&recPerPage={recPerPage}&page={page}")
  238. )))
  239. )
  240. ),
  241. /* Basic info block. */
  242. tabPane
  243. (
  244. to::prefix(icon('flag')),
  245. set::key('buildInfo'),
  246. set::title($lang->build->basicInfo),
  247. div(
  248. section(
  249. set::title($lang->build->basicInfo),
  250. tableData
  251. (
  252. !$hidden ? item
  253. (
  254. set::name($lang->build->product),
  255. $build->productName
  256. ) : null,
  257. $build->productType != 'normal' ? item
  258. (
  259. set::name($lang->build->branch),
  260. $branchName
  261. ) : null,
  262. $build->system ? item
  263. (
  264. set::name($lang->build->system),
  265. zget($systemList, $build->system)
  266. ) : null,
  267. item
  268. (
  269. set::name($lang->build->name),
  270. $build->name
  271. ),
  272. $build->execution ? item
  273. (
  274. set::name($executionTitle),
  275. ltrim($executionName, '/')
  276. ) : item
  277. (
  278. set::name($lang->build->builds),
  279. html(rtrim($builds, $lang->comma))
  280. ),
  281. item
  282. (
  283. set::name($lang->build->builder),
  284. zget($users, $build->builder)
  285. ),
  286. item
  287. (
  288. set::name($lang->build->date),
  289. $build->date
  290. ),
  291. item
  292. (
  293. set::name($lang->build->scmPath),
  294. set::trClass('scmPath'),
  295. h::a
  296. (
  297. $build->scmPath,
  298. set('href', $build->scmPath),
  299. set('target', '_blank'),
  300. set('rel', 'nooperner noreferrer')
  301. )
  302. ),
  303. item
  304. (
  305. set::name($lang->build->filePath),
  306. set::trClass('filePath'),
  307. h::a
  308. (
  309. $build->filePath,
  310. set('href', $build->filePath),
  311. set('target', '_blank'),
  312. set('rel', 'nooperner noreferrer')
  313. )
  314. ),
  315. item
  316. (
  317. set::name($lang->build->desc),
  318. html($build->desc)
  319. )
  320. ),
  321. html($this->printExtendFields($build, 'html', 'position=all', false)),
  322. $build->files ? h::hr(set::className('mt-6')) : null,
  323. section
  324. (
  325. $build->files ? fileList(set::files($build->files), set::showEdit(true), set::showDelete(true)) : null
  326. ),
  327. h::hr(set::className('mt-6')),
  328. history(set::objectID($build->id), set::objectType('build'))
  329. )
  330. )
  331. )
  332. )
  333. )
  334. );
  335. render();