edit.html.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. <?php
  2. /**
  3. * The edit file of bug module of ZenTaoPMS.
  4. *
  5. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  6. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  7. * @author Yuting Wang<wangyuting@easycorp.ltd>
  8. * @package bug
  9. * @link https://www.zentao.net
  10. */
  11. namespace zin;
  12. include($this->app->getModuleRoot() . 'ai/ui/inputinject.html.php');
  13. jsVar('bug', $bug);
  14. jsVar('confirmChangeProduct', $lang->bug->notice->confirmChangeProduct);
  15. jsVar('moduleID', $bug->module);
  16. jsVar('methodName', $app->methodName);
  17. jsVar('tab', $this->app->tab);
  18. jsVar('released', $lang->build->released);
  19. jsVar('confirmUnlinkBuild', sprintf($lang->bug->notice->confirmUnlinkBuild, zget($resolvedBuildPairs, $bug->resolvedBuild)));
  20. jsVar('projectExecutionPairs', $projectExecutionPairs);
  21. jsVar('edition', $config->edition);
  22. jsVar('isShadowProduct', !empty($product->shadow));
  23. jsVar('duplicateBugID', !empty($bug->duplicateBug) ? $bug->duplicateBug : 0);
  24. $isEn = $app->getClientLang() == 'en';
  25. detailHeader(to::title
  26. (
  27. entityLabel
  28. (
  29. set::entityID($bug->id),
  30. set::level(1),
  31. set::text($lang->bug->edit),
  32. set::reverse(true),
  33. to::suffix($bug->title)
  34. )
  35. ));
  36. $editorUid = uniqid();
  37. detailBody
  38. (
  39. on::change('[name="product"]', 'changeProduct'),
  40. on::change('[name="branch"]', 'changeBranch'),
  41. on::change('[name="project"]', 'changeProject'),
  42. on::change('[name="execution"]', 'changeExecution'),
  43. on::change('[name="module"]', 'changeModule'),
  44. on::change('[name="resolvedBuild"]', 'changeResolvedBuild'),
  45. on::change('[name="resolution"]', 'changeResolution'),
  46. on::click('#linkBug', 'linkBug'),
  47. on::click('#refresh', 'clickRefresh'),
  48. on::click('#allBuilds', 'loadAllBuilds'),
  49. on::click('#allUsers', 'loadAllUsers'),
  50. set::isForm(true),
  51. sectionList
  52. (
  53. section
  54. (
  55. set::title($lang->bug->title),
  56. set::required(true),
  57. formHidden('id', $bug->id),
  58. formGroup
  59. (
  60. inputControl
  61. (
  62. input
  63. (
  64. set::name('title'),
  65. set::value($bug->title)
  66. ),
  67. set::suffixWidth('icon'),
  68. to::suffix
  69. (
  70. colorPicker
  71. (
  72. set::name('color'),
  73. set::value($bug->color),
  74. set::syncColor('#title')
  75. )
  76. )
  77. )
  78. )
  79. ),
  80. section
  81. (
  82. set::title($lang->bug->legendSteps),
  83. set::required(strpos(",{$config->bug->edit->requiredFields},", ',steps,') !== false),
  84. editor
  85. (
  86. set::name('steps'),
  87. set::uid($editorUid),
  88. html($bug->steps)
  89. )
  90. ),
  91. section
  92. (
  93. set::title($lang->files),
  94. fileSelector($bug->files ? set::defaultFiles(array_values($bug->files)) : null)
  95. ),
  96. section
  97. (
  98. set::title($lang->bug->legendComment),
  99. editor(set::uid($editorUid), set::name('comment'))
  100. )
  101. ),
  102. history(),
  103. detailSide
  104. (
  105. set::isForm(true),
  106. tableData
  107. (
  108. setClass('mt-5' . ($isEn ? ' en-table' : '')),
  109. set::title($lang->bug->legendBasicInfo),
  110. set::tdClass('w-64'),
  111. item
  112. (
  113. set::trClass($product->shadow ? 'hidden' : ''),
  114. set::name($lang->bug->product),
  115. inputGroup
  116. (
  117. picker
  118. (
  119. set::name('product'),
  120. set::items($products),
  121. set::required(true),
  122. set::value($product->id)
  123. ),
  124. $product->type != 'normal' ? picker
  125. (
  126. set::id('branchPicker'),
  127. set::width('100px'),
  128. set::name('branch'),
  129. set::items($branchTagOption),
  130. set::value($bug->branch)
  131. ) : null
  132. )
  133. ),
  134. item
  135. (
  136. set::name($lang->bug->module),
  137. set::required(strpos(",{$config->bug->edit->requiredFields},", ',module,') !== false),
  138. modulePicker
  139. (
  140. set::items($moduleOptionMenu),
  141. set::value($bug->module),
  142. set::manageLink(createLink('tree', 'browse', "rootID={$product->id}&view=bug&currentModuleID=0&branch={$bug->branch}"))
  143. )
  144. ),
  145. !$product->shadow ? item
  146. (
  147. set::trClass($product->shadow && isset($project) && empty($project->multiple) ? 'hidden' : ''),
  148. set::name($lang->bug->plan),
  149. set::required(strpos(",{$config->bug->edit->requiredFields},", ',plan,') !== false),
  150. formGroup
  151. (
  152. set('id', 'planBox'),
  153. picker
  154. (
  155. set::name('plan'),
  156. set::items($plans),
  157. set::value($bug->plan),
  158. setData('max_drop_width', '100%')
  159. )
  160. )
  161. ) : null,
  162. item
  163. (
  164. set::name($lang->bug->fromCase),
  165. formGroup
  166. (
  167. set('id', 'caseBox'),
  168. picker
  169. (
  170. set::name('case'),
  171. set::items($cases),
  172. set::value($bug->case),
  173. set::maxItemsCount($config->maxCount)
  174. )
  175. )
  176. ),
  177. item
  178. (
  179. set::name($lang->bug->type),
  180. set::required(strpos(",{$config->bug->edit->requiredFields},", ',type,') !== false),
  181. formGroup
  182. (
  183. picker
  184. (
  185. set::items($lang->bug->typeList),
  186. set::name('type'),
  187. set::value($bug->type)
  188. )
  189. )
  190. ),
  191. item
  192. (
  193. set::name($lang->bug->severity),
  194. set::required(strpos(",{$config->bug->edit->requiredFields},", ',severity,') !== false),
  195. severityPicker
  196. (
  197. set::items($lang->bug->severityList),
  198. set::name('severity'),
  199. set::value($bug->severity),
  200. set::required(true)
  201. )
  202. ),
  203. item
  204. (
  205. set::name($lang->bug->pri),
  206. set::required(strpos(",{$config->bug->edit->requiredFields},", ',pri,') !== false),
  207. priPicker
  208. (
  209. set::items($lang->bug->priList),
  210. set::name('pri'),
  211. set::value($bug->pri),
  212. set::required(true)
  213. )
  214. ),
  215. item
  216. (
  217. set::name($lang->bug->status),
  218. picker
  219. (
  220. set::disabled(true),
  221. set::items($lang->bug->statusList),
  222. set::value($bug->status)
  223. )
  224. ),
  225. item
  226. (
  227. set::name($lang->bug->confirmed),
  228. picker
  229. (
  230. set::disabled(true),
  231. set::items($lang->bug->confirmedList),
  232. set::value($bug->confirmed)
  233. )
  234. ),
  235. item
  236. (
  237. set::name($lang->bug->assignedTo),
  238. set::required(strpos(",{$config->bug->edit->requiredFields},", ',assignedTo,') !== false),
  239. formGroup
  240. (
  241. inputGroup
  242. (
  243. picker
  244. (
  245. set::disabled($bug->status == 'closed' ? true : false),
  246. set::name('assignedTo'),
  247. set::items($assignedToList),
  248. set::value($bug->assignedTo)
  249. ),
  250. span
  251. (
  252. set('class', 'input-group-addon'),
  253. a
  254. (
  255. set('id', 'allUsers'),
  256. set('href', 'javascript:;'),
  257. $lang->bug->loadAll
  258. )
  259. )
  260. )
  261. )
  262. ),
  263. item
  264. (
  265. set::name($lang->bug->deadline),
  266. set::required(strpos(",{$config->bug->edit->requiredFields},", ',deadline,') !== false),
  267. formGroup
  268. (
  269. datePicker
  270. (
  271. set::name('deadline'),
  272. set::value($bug->deadline)
  273. )
  274. )
  275. ),
  276. item
  277. (
  278. set::name($lang->bug->feedbackBy),
  279. set::required(strpos(",{$config->bug->edit->requiredFields},", ',feedbackBy,') !== false),
  280. input
  281. (
  282. set::name('feedbackBy'),
  283. set::value($bug->feedbackBy)
  284. )
  285. ),
  286. item
  287. (
  288. set::name($lang->bug->notifyEmail),
  289. input
  290. (
  291. set::name('notifyEmail'),
  292. set::value($bug->notifyEmail)
  293. )
  294. ),
  295. item
  296. (
  297. set::name($lang->bug->os),
  298. set::required(strpos(",{$config->bug->edit->requiredFields},", ',os,') !== false),
  299. formGroup
  300. (
  301. picker
  302. (
  303. set::items($lang->bug->osList),
  304. set::menu(array('checkbox' => true)),
  305. set::multiple(true),
  306. set::name('os[]'),
  307. set::value($bug->os)
  308. )
  309. )
  310. ),
  311. item
  312. (
  313. set::trClass('browserTR'),
  314. set::name($lang->bug->browser),
  315. set::required(strpos(",{$config->bug->edit->requiredFields},", ',browser,') !== false),
  316. formGroup
  317. (
  318. picker
  319. (
  320. set::items($lang->bug->browserList),
  321. set::name('browser'),
  322. set::multiple(true),
  323. set::menu(array('checkbox' => true)),
  324. set::value($bug->browser)
  325. )
  326. )
  327. ),
  328. item
  329. (
  330. set::name($lang->bug->keywords),
  331. set::required(strpos(",{$config->bug->edit->requiredFields},", ',keywords,') !== false),
  332. formGroup
  333. (
  334. input
  335. (
  336. set::name('keywords'),
  337. set::value($bug->keywords)
  338. )
  339. )
  340. ),
  341. item(set::name($lang->bug->mailto), mailto(set::items($users), set::value($bug->mailto)))
  342. ),
  343. tableData
  344. (
  345. $isEn ? setClass('en-table') : null,
  346. set::title(!empty($project->multiple) ? $lang->bug->legendPRJExecStoryTask : $lang->bug->legendExecStoryTask),
  347. set::tdClass('w-64'),
  348. item
  349. (
  350. set::name($lang->bug->project),
  351. set::required(strpos(",{$config->bug->edit->requiredFields},", ',project,') !== false),
  352. formGroup
  353. (
  354. set('id', 'projectBox'),
  355. picker
  356. (
  357. set::name('project'),
  358. set::items($projects),
  359. set::value($bug->project),
  360. set::required(!empty($product->shadow))
  361. )
  362. )
  363. ),
  364. item
  365. (
  366. set::trClass($execution && !$execution->multiple ? 'hidden' : ''),
  367. set::name($lang->bug->execution),
  368. set::required(strpos(",{$config->bug->edit->requiredFields},", ',execution,') !== false),
  369. formGroup
  370. (
  371. set('id', 'executionBox'),
  372. picker
  373. (
  374. set::name('execution'),
  375. set::items($executions),
  376. set::value($bug->execution)
  377. )
  378. )
  379. ),
  380. item
  381. (
  382. set::name($lang->bug->story),
  383. formGroup
  384. (
  385. set('id', 'storyBox'),
  386. picker
  387. (
  388. set::name('story'),
  389. set::items($stories),
  390. set::value($bug->story)
  391. )
  392. )
  393. ),
  394. item
  395. (
  396. set::name($lang->bug->task),
  397. formGroup
  398. (
  399. set('id', 'taskBox'),
  400. picker
  401. (
  402. set::name('task'),
  403. set::items($tasks),
  404. set::value($bug->task),
  405. setData('max_drop_width', '100%')
  406. )
  407. )
  408. )
  409. ),
  410. tableData
  411. (
  412. $isEn ? setClass('en-table') : null,
  413. set::title($lang->bug->legendLife),
  414. set::tdClass('w-64'),
  415. item
  416. (
  417. set::name($lang->bug->openedBy),
  418. picker
  419. (
  420. set::disabled(true),
  421. set::items($users),
  422. set::value($bug->openedBy)
  423. )
  424. ),
  425. item
  426. (
  427. set::name($lang->bug->openedBuild),
  428. set::required(strpos(",{$config->bug->edit->requiredFields},", ',openedBuild,') !== false),
  429. formGroup
  430. (
  431. inputGroup
  432. (
  433. set('id', 'openedBuildBox'),
  434. picker
  435. (
  436. set::name('openedBuild[]'),
  437. set::items($openedBuilds),
  438. set::value($bug->openedBuild),
  439. set::menu(array('checkbox' => true)),
  440. set::multiple(true)
  441. ),
  442. span
  443. (
  444. set('class', 'input-group-addon'),
  445. a
  446. (
  447. set('id', 'allBuilds'),
  448. set('href', 'javascript:;'),
  449. $lang->bug->loadAll
  450. )
  451. )
  452. )
  453. )
  454. ),
  455. item
  456. (
  457. set::name($lang->bug->resolvedBy),
  458. picker
  459. (
  460. set::items($users),
  461. set::name('resolvedBy'),
  462. set::value($bug->resolvedBy)
  463. )
  464. ),
  465. item
  466. (
  467. set::name($lang->bug->resolvedDate),
  468. datetimePicker
  469. (
  470. set::name('resolvedDate'),
  471. set::value($bug->resolvedDate)
  472. )
  473. ),
  474. item
  475. (
  476. set::name($lang->bug->resolvedBuild),
  477. formGroup
  478. (
  479. inputGroup
  480. (
  481. set('id', 'resolvedBuildBox'),
  482. picker
  483. (
  484. set::name('resolvedBuild'),
  485. set::items($resolvedBuilds),
  486. set::value($bug->resolvedBuild)
  487. ),
  488. span
  489. (
  490. set('class', 'input-group-addon'),
  491. a
  492. (
  493. set('id', 'allBuilds'),
  494. set('href', 'javascript:;'),
  495. $lang->bug->loadAll
  496. )
  497. )
  498. )
  499. )
  500. ),
  501. item
  502. (
  503. set::name($lang->bug->resolution),
  504. picker
  505. (
  506. set::items($lang->bug->resolutionList),
  507. set::name('resolution'),
  508. set::value($bug->resolution)
  509. )
  510. ),
  511. item
  512. (
  513. set::trClass($bug->resolution != 'duplicate' ? 'hidden' : ''),
  514. set::name($lang->bug->duplicateBug),
  515. picker
  516. (
  517. on::click('setDuplicateBug'),
  518. set::items($duplicateBugs),
  519. set::name('duplicateBug'),
  520. set::value($bug->duplicateBug)
  521. )
  522. ),
  523. item
  524. (
  525. set::name($lang->bug->closedBy),
  526. picker
  527. (
  528. set::items($users),
  529. set::name('closedBy'),
  530. set::value($bug->closedBy)
  531. )
  532. ),
  533. item
  534. (
  535. set::name($lang->bug->closedDate),
  536. datetimePicker
  537. (
  538. set::name('closedDate'),
  539. set::value($bug->closedDate)
  540. )
  541. )
  542. ),
  543. tableData
  544. (
  545. $isEn ? setClass('en-table') : null,
  546. set::title($lang->bug->legendMisc),
  547. set::tdClass('w-64'),
  548. item
  549. (
  550. set::name($lang->bug->relatedBug),
  551. inputGroup
  552. (
  553. set('id', 'linkBugsBox'),
  554. picker
  555. (
  556. set::multiple(true),
  557. set::name('relatedBug[]'),
  558. set::items(isset($bug->relatedBugTitles) ? $bug->relatedBugTitles : array()),
  559. set::value($bug->relatedBug)
  560. ),
  561. common::hasPriv('bug', 'linkBugs') && !isInModal() ? inputGroupAddon
  562. (
  563. setClass('p-0'),
  564. btn
  565. (
  566. setID('linkBug'),
  567. setClass('ghost text-primary'),
  568. $lang->bug->linkBugs
  569. )
  570. ) : null
  571. )
  572. ),
  573. item
  574. (
  575. set::name($lang->bug->testtask),
  576. inputGroup
  577. (
  578. set('id', 'testtaskBox'),
  579. picker
  580. (
  581. set::name('testtask'),
  582. set::items($testtasks),
  583. set::value($bug->testtask)
  584. )
  585. )
  586. )
  587. )
  588. )
  589. );
  590. render();