set.html.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. <?php
  2. /**
  3. * The set view file of custom 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 Yanyi Cao <caoyanyi@easycorp.ltd>
  7. * @package custom
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. data('activeMenuItem', $module);
  12. if(!in_array($module, array('block', 'baseline'))) include 'sidebar.html.php';
  13. $formItems = array();
  14. $formActions = array('submit');
  15. $headingTips = null;
  16. $actionWidth = 'w-1/2';
  17. $isEn = $app->getClientLang() == 'en';
  18. if($module == 'project' && $field == 'unitList')
  19. {
  20. $checkedUnitList = array();
  21. foreach($lang->project->unitList as $unit => $unitName)
  22. {
  23. if(in_array($unit, $unitList)) $checkedUnitList[$unit] = $unitName;
  24. }
  25. $formItems[] = formGroup
  26. (
  27. set::label($lang->custom->project->currencySetting),
  28. checkList
  29. (
  30. setClass('flex flex-wrap unit-box'),
  31. set::name('unitList[]'),
  32. set::value($unitList),
  33. set::inline(true),
  34. set::items($lang->project->unitList),
  35. on::change('changeUnit')
  36. )
  37. );
  38. $formItems[] = formGroup
  39. (
  40. set::width('1/3'),
  41. set::label($lang->custom->project->defaultCurrency),
  42. set::name('defaultCurrency'),
  43. set::items($checkedUnitList),
  44. set::value($defaultCurrency),
  45. set::required(true)
  46. );
  47. $actionWidth = 'w-full';
  48. }
  49. elseif(in_array($module, array('story', 'requirement', 'epic', 'demand')) && $field == 'reviewRules')
  50. {
  51. $formItems[] = formGroup
  52. (
  53. set::width('1/2'),
  54. set::label($lang->custom->reviewRule),
  55. set::name('reviewRules'),
  56. set::value($reviewRule),
  57. set::control('radioListInline'),
  58. set::items($lang->custom->reviewRules)
  59. );
  60. $formItems[] = formGroup
  61. (
  62. set::width('1/2'),
  63. set::label($lang->custom->superReviewers),
  64. set::name('superReviewers'),
  65. set::value($superReviewers),
  66. set::control(array('control' => 'picker', 'multiple' => true)),
  67. set::items($users)
  68. );
  69. }
  70. elseif(in_array($module, array('story', 'requirement', 'epic')) && $field == 'gradeRule')
  71. {
  72. $formItems[] = formGroup
  73. (
  74. set::width('1/2'),
  75. set::label($lang->custom->gradeRule),
  76. set::name('gradeRule'),
  77. set::value($gradeRule),
  78. set::control('radioListInline'),
  79. set::items($lang->custom->gradeRuleList)
  80. );
  81. $formItems[] = div
  82. (
  83. setClass('gradeRuleNotice'),
  84. div($lang->custom->notice->gradeRule)
  85. );
  86. }
  87. elseif(in_array($module, array('epic', 'story', 'requirement', 'demand', 'testcase')) && $field == 'review')
  88. {
  89. $formItems[] = formGroup
  90. (
  91. set::width('1/2'),
  92. set::label($lang->custom->storyReview),
  93. set::name('needReview'),
  94. set::value($needReview),
  95. set::control('radioListInline'),
  96. set::items($lang->custom->reviewList),
  97. on::change('changeReview')
  98. );
  99. if(in_array($module, array('story', 'requirement', 'epic', 'demand')))
  100. {
  101. $formItems[] = formRow
  102. (
  103. setClass($needReview ? 'hidden' : ''),
  104. setClass('open-review'),
  105. formGroup
  106. (
  107. set::label(''),
  108. set::name(''),
  109. set::value(sprintf($lang->custom->notice->forceReview, $lang->$module->common) . $lang->custom->notice->storyReviewTip),
  110. set::control('static')
  111. )
  112. );
  113. $formItems[] = formRow
  114. (
  115. setClass($needReview ? '' : 'hidden'),
  116. setClass('close-review'),
  117. formGroup
  118. (
  119. set::label(''),
  120. set::name(''),
  121. set::value(sprintf($lang->custom->notice->forceNotReview, $lang->$module->common) . $lang->custom->notice->storyReviewTip),
  122. set::control('static')
  123. )
  124. );
  125. $app->loadLang('user');
  126. $space = ($app->getClientLang() != 'zh-cn' and $app->getClientLang() != 'zh-tw') ? ' ' : '';
  127. $formItems[] = div
  128. (
  129. setClass($needReview ? 'hidden' : ''),
  130. setClass('open-review'),
  131. formGroup
  132. (
  133. set::width('1/2'),
  134. set::label($lang->custom->forceReview . $space . $lang->custom->account),
  135. set::name('forceReview'),
  136. set::value($forceReview),
  137. set::items($users),
  138. set::control(array('control' => 'picker', 'multiple' => true))
  139. ),
  140. formRow
  141. (
  142. setClass('my-2'),
  143. formGroup
  144. (
  145. set::width('1/2'),
  146. set::label($lang->custom->forceReview . $space . $lang->custom->role),
  147. set::name('forceReviewRoles'),
  148. set::value($forceReviewRoles),
  149. set::items($lang->user->roleList),
  150. set::control(array('control' => 'picker', 'multiple' => true))
  151. )
  152. ),
  153. formGroup
  154. (
  155. set::width('1/2'),
  156. set::label($lang->custom->forceReview . $space . $lang->custom->dept),
  157. set::name('forceReviewDepts'),
  158. set::value($forceReviewDepts),
  159. set::items($depts),
  160. set::control(array('control' => 'picker', 'multiple' => true))
  161. )
  162. );
  163. $formItems[] = div
  164. (
  165. setClass($needReview ? '' : 'hidden'),
  166. setClass('close-review'),
  167. formGroup
  168. (
  169. set::width('1/2'),
  170. set::label($lang->custom->forceNotReview . $space . $lang->custom->account),
  171. set::name('forceNotReview'),
  172. set::value($forceNotReview),
  173. set::items($users),
  174. set::control(array('control' => 'picker', 'multiple' => true))
  175. ),
  176. formRow
  177. (
  178. setClass('my-2'),
  179. formGroup
  180. (
  181. set::width('1/2'),
  182. set::label($lang->custom->forceNotReview . $space . $lang->custom->role),
  183. set::name('forceNotReviewRoles'),
  184. set::value($forceNotReviewRoles),
  185. set::items($lang->user->roleList),
  186. set::control(array('control' => 'picker', 'multiple' => true))
  187. )
  188. ),
  189. formGroup
  190. (
  191. set::width('1/2'),
  192. set::label($lang->custom->forceNotReview . $space . $lang->custom->dept),
  193. set::name('forceNotReviewDepts'),
  194. set::value($forceNotReviewDepts),
  195. set::items($depts),
  196. set::control(array('control' => 'picker', 'multiple' => true))
  197. )
  198. );
  199. }
  200. elseif($module == 'testcase')
  201. {
  202. jsVar('+stopSubmit', true);
  203. jsVar('oldNeedReview', $needReview);
  204. jsVar('confirmReviewCase', $lang->custom->notice->confirmReviewCase);
  205. $formItems[] = div
  206. (
  207. setClass($needReview ? '' : 'hidden'),
  208. setClass('close-review'),
  209. formRow
  210. (
  211. formGroup
  212. (
  213. set::width('2/3'),
  214. set::label($lang->custom->forceNotReview),
  215. set::name('forceNotReview'),
  216. set::value($forceNotReview),
  217. set::items($users),
  218. set::control(array('control' => 'picker', 'multiple' => true))
  219. ),
  220. icon
  221. (
  222. 'help',
  223. setClass('pl-4 pt-2'),
  224. setData
  225. (
  226. array
  227. (
  228. 'toggle' => 'tooltip',
  229. 'title' => sprintf($lang->custom->notice->forceNotReview, $lang->$module->common)
  230. )
  231. )
  232. )
  233. )
  234. );
  235. $formItems[] = div
  236. (
  237. setClass($needReview ? 'hidden' : ''),
  238. setClass('open-review'),
  239. formRow
  240. (
  241. formGroup
  242. (
  243. set::width('2/3'),
  244. set::label($lang->custom->forceReview),
  245. set::name('forceReview'),
  246. set::value($forceReview),
  247. set::items($users),
  248. set::control(array('control' => 'picker', 'multiple' => true))
  249. ),
  250. icon
  251. (
  252. 'help',
  253. setClass('pl-4 pt-2'),
  254. setData
  255. (
  256. array
  257. (
  258. 'toggle' => 'tooltip',
  259. 'title' => sprintf($lang->custom->notice->forceReview, $lang->$module->common)
  260. )
  261. )
  262. )
  263. )
  264. );
  265. $actionWidth = 'w-2/3';
  266. }
  267. }
  268. elseif($module == 'bug' && $field == 'longlife')
  269. {
  270. $formItems[] = formGroup
  271. (
  272. set::label($lang->custom->bug->fields['longlife']),
  273. set::name('longlife'),
  274. set::value($longlife),
  275. set::width('1/3'),
  276. set::control(array(
  277. 'type' => 'inputControl',
  278. 'suffix' => $lang->day
  279. ))
  280. );
  281. $headingTips = div
  282. (
  283. setClass('flex flex-auto items-center pt-1'),
  284. icon('info text-warning mr-1'),
  285. $lang->custom->notice->longlife
  286. );
  287. $actionWidth = 'w-1/3';
  288. }
  289. elseif($module == 'block' && $field == 'closed')
  290. {
  291. if(empty($blockPairs))
  292. {
  293. $formItems[] = formGroup
  294. (
  295. set::width('1/2'),
  296. set::label($lang->custom->block->fields['closed']),
  297. set::name('closed'),
  298. set::value($lang->custom->notice->noClosedBlock),
  299. set::control('static')
  300. );
  301. $formActions = array();
  302. }
  303. else
  304. {
  305. $formItems[] = formGroup
  306. (
  307. set::width('1/2'),
  308. set::label($lang->custom->block->fields['closed']),
  309. set::name('closed'),
  310. set::value($closedBlock),
  311. set::control(array(
  312. 'type' => 'picker',
  313. 'multiple' => true
  314. )),
  315. set::items($blockPairs)
  316. );
  317. }
  318. }
  319. elseif($module == 'user' && $field == 'contactField')
  320. {
  321. $this->app->loadConfig('user');
  322. $this->app->loadLang('user');
  323. $formItems[] = formGroup
  324. (
  325. set::width('1/2'),
  326. set::label($lang->custom->user->fields['contactField']),
  327. picker
  328. (
  329. set::name('contactField'),
  330. set::value($config->user->contactField),
  331. set::multiple(true),
  332. set::items($lang->user->contactFieldList)
  333. )
  334. );
  335. if(common::hasPriv('custom', 'restore'))
  336. {
  337. $formActions[] = array(
  338. 'url' => inlink('restore', "module=user&field=contactField"),
  339. 'text' => $lang->custom->restore,
  340. 'class' => 'btn-wide ajax-submit',
  341. 'data-confirm' => $lang->custom->confirmRestore
  342. );
  343. }
  344. }
  345. elseif($module == 'user' && $field == 'deleted')
  346. {
  347. $formItems[] = formGroup
  348. (
  349. set::width('1/2'),
  350. $isEn ? null : set::labelWidth('100px'),
  351. set::label($lang->custom->user->fields['deleted']),
  352. set::name('showDeleted'),
  353. set::value($showDeleted),
  354. set::control('radioListInline'),
  355. set::items($lang->custom->deletedList)
  356. );
  357. }
  358. elseif($module == 'feedback' && $field == 'review')
  359. {
  360. $labelWidth = $isEn ? '140px' : '100px';
  361. $formItems[] = formGroup
  362. (
  363. set::width('1/2'),
  364. set::labelWidth($labelWidth),
  365. set::label($lang->custom->feedback->fields['review']),
  366. set::name('needReview'),
  367. set::value($needReview),
  368. set::control('radioListInline'),
  369. set::items($lang->custom->reviewList),
  370. on::change('changeNeedReview')
  371. );
  372. $formItems[] = formGroup(set::width('1/2'), set::labelWidth($labelWidth), set::hidden($needReview), set::label($lang->custom->forceReview), set::name('forceReview[]'), set::value($forceReview), set::control('picker'), set::items($users), set::multiple(true), set::tip(sprintf($lang->custom->notice->forceReview, $lang->feedback->common)));
  373. $formItems[] = formGroup(set::width('1/2'), set::labelWidth($labelWidth), set::hidden(!$needReview), set::label($lang->custom->forceNotReview), set::name('forceNotReview[]'), set::value($forceNotReview), set::control('picker'), set::items($users), set::multiple(true), set::tip(sprintf($lang->custom->notice->forceNotReview, $lang->feedback->common)));
  374. $users = arrayUnion(array(' ' => $lang->feedback->deptManager), $users);
  375. $formItems[] = formGroup
  376. (
  377. set::width('1/2'),
  378. set::labelWidth($labelWidth),
  379. set::label($lang->feedback->reviewedByAB),
  380. set::name('reviewer'),
  381. set::value(empty($reviewer) ? ' ' : $reviewer),
  382. set::control('picker'),
  383. set::items($users)
  384. );
  385. }
  386. else
  387. {
  388. if(!empty($fieldList) && is_array($fieldList))
  389. {
  390. $formItems[] = formGroup
  391. (
  392. set::width('1/2'),
  393. set::label($lang->custom->key),
  394. set::name(''),
  395. set::value($lang->custom->value),
  396. set::control('static')
  397. );
  398. div
  399. (
  400. setClass('hidden'),
  401. setID('customFieldRow'),
  402. formRow
  403. (
  404. input
  405. (
  406. set::type('hidden'),
  407. set::name('systems[]'),
  408. set::value('0')
  409. ),
  410. formGroup
  411. (
  412. set::width('1/2'),
  413. set::label('addRow'),
  414. set::name('values[]')
  415. ),
  416. span
  417. (
  418. btn
  419. (
  420. setClass('add-item btn ghost'),
  421. on::click('addRow'),
  422. icon('plus')
  423. ),
  424. btn
  425. (
  426. setClass('del-item btn ghost'),
  427. on::click('removeRow'),
  428. icon('trash')
  429. )
  430. )
  431. )
  432. );
  433. foreach($fieldList as $key => $value)
  434. {
  435. $system = isset($dbFields[$key]) ? $dbFields[$key]->system : 1;
  436. $keyLabel = $key === '' ? 'NULL' : $key;
  437. if($key === 0) $keyLabel = '0';
  438. if($app->getClientLang() == 'en' && $key == 'requirement') $keyLabel = $lang->custom->feature;
  439. $formItems[] = formRow
  440. (
  441. input
  442. (
  443. set::type('hidden'),
  444. set::name('keys[]'),
  445. set::value($key)
  446. ),
  447. input
  448. (
  449. set::type('hidden'),
  450. set::name('systems[]'),
  451. set::value($system)
  452. ),
  453. formGroup
  454. (
  455. set::width('1/2'),
  456. set::label($keyLabel),
  457. set::name('values[]'),
  458. set::value(isset($dbFields[$key]) ? $dbFields[$key]->value : $value),
  459. set::readonly(empty($key))
  460. ),
  461. $canAdd ? span(
  462. btn
  463. (
  464. setClass('add-item btn ghost'),
  465. on::click('addRow'),
  466. icon('plus')
  467. ),
  468. btn
  469. (
  470. setClass('del-item btn ghost'),
  471. on::click('removeRow'),
  472. icon ('trash')
  473. )
  474. ) : null
  475. );
  476. }
  477. $appliedTo = array($currentLang => $lang->custom->currentLang, 'all' => $lang->custom->allLang);
  478. $formItems[] = formRow
  479. (
  480. setClass('lang-row'),
  481. formGroup
  482. (
  483. set::width('1/2'),
  484. set::label(''),
  485. set::name('lang'),
  486. set::items($appliedTo),
  487. set::value($lang2Set),
  488. set::control('radioListInline')
  489. )
  490. );
  491. if(common::hasPriv('custom', 'restore'))
  492. {
  493. $formActions[] = array(
  494. 'url' => inlink('restore', "module={$module}&field={$field}"),
  495. 'text' => $lang->custom->restore,
  496. 'class' => 'btn-wide ajax-submit',
  497. 'data-confirm' => $lang->custom->confirmRestore
  498. );
  499. }
  500. if(!$canAdd)
  501. {
  502. $headingTips = div
  503. (
  504. setClass('flex flex-auto items-center pt-1'),
  505. icon('info text-warning mr-1'),
  506. $lang->custom->notice->canNotAdd
  507. );
  508. }
  509. }
  510. }
  511. div
  512. (
  513. setClass('row has-sidebar-left'),
  514. isset($sidebarMenu) ? $sidebarMenu : null,
  515. formPanel
  516. (
  517. set::formID('settingForm'),
  518. set::headingClass('justify-start'),
  519. setClass('flex-auto'),
  520. setClass(!empty($sidebarMenu) ? 'ml-0.5' : null),
  521. set::actionsClass($actionWidth),
  522. set::actions($formActions),
  523. div
  524. (
  525. setClass('flex items-center'),
  526. span
  527. (
  528. setClass('text-md font-bold'),
  529. $lang->custom->$module->fields[$field]
  530. ),
  531. span
  532. (
  533. setClass('ml-2'),
  534. $headingTips
  535. )
  536. ),
  537. $formItems
  538. )
  539. );
  540. render();