create.html.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. namespace zin;
  3. jsVar('model', $model);
  4. jsVar('longTime', $lang->project->longTime);
  5. jsVar('weekend', $config->execution->weekend);
  6. jsVar('beginLessThanParent', $lang->project->beginLessThanParent);
  7. jsVar('endGreatThanParent', $lang->project->endGreatThanParent);
  8. jsVar('ignore', $lang->project->ignore);
  9. jsVar('multiBranchProducts', $multiBranchProducts);
  10. jsVar('errorSameProducts', $lang->project->errorSameProducts);
  11. jsVar('copyProjectID', $copyProjectID);
  12. jsVar('nameTips', $lang->project->copyProject->nameTips);
  13. jsVar('codeTips', $lang->project->copyProject->codeTips);
  14. jsVar('endTips', $lang->project->copyProject->endTips);
  15. jsVar('daysTips', $lang->project->copyProject->daysTips);
  16. jsVar('programTip', $lang->program->tips);
  17. jsVar('LONG_TIME', LONG_TIME);
  18. $checkDeltaChecked = jsCallback()->do(<<<'JS'
  19. const beginDate = new Date($('[name=begin]').zui('datePicker').$.value);
  20. const endDate = new Date($('[name=end]').zui('datePicker').$.value);
  21. const days = parseInt((endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000)) + 1;
  22. if(parseInt($('input[name=delta]:checked').val()) != 999) $('[name=delta]').prop('checked', false);
  23. if($('#delta' + days).length > 0 && days != 999) $('#delta' + days).prop('checked', true);
  24. JS
  25. );
  26. $projectEnd = $copyProjectID ? $copyProject->end : '';
  27. $isLongTime = $projectEnd == LONG_TIME;
  28. $delta = 0;
  29. if($copyProjectID) $delta = $isLongTime ? 999 : (strtotime($copyProject->end) - strtotime($copyProject->begin)) / 3600 / 24 + 1;
  30. formPanel
  31. (
  32. to::heading(div
  33. (
  34. setClass('panel-title text-lg'),
  35. $title
  36. )),
  37. to::headingActions
  38. (
  39. btn
  40. (
  41. setClass('primary-pale'),
  42. set::icon('copy'),
  43. set::url('#copyProjectModal'),
  44. set('data-destroyOnHide', true),
  45. set('data-toggle', 'modal'),
  46. set('data-size', 'md'),
  47. $lang->project->copy
  48. )
  49. ),
  50. on::change('[name=delta]', 'computeEndDate'),
  51. formGroup
  52. (
  53. set::width('1/2'),
  54. set::name('name'),
  55. set::label($lang->project->name),
  56. set::value($copyProjectID ? $copyProject->name : '')
  57. ),
  58. isset($config->setCode) && $config->setCode == 1 ? formGroup
  59. (
  60. set::width('1/2'),
  61. set::name('code'),
  62. set::label($lang->project->code)
  63. ) : null,
  64. formGroup
  65. (
  66. set::width('1/4'),
  67. set::name('PM'),
  68. set::label($lang->project->PM),
  69. set::items($PMUsers)
  70. ),
  71. formRow
  72. (
  73. formGroup
  74. (
  75. set::width('1/2'),
  76. set::label($lang->project->planDate),
  77. set::required(true),
  78. inputGroup
  79. (
  80. on::change('[name=end], [name=begin]', $checkDeltaChecked),
  81. datepicker
  82. (
  83. set::name('begin'),
  84. set('id', 'begin'),
  85. set::value($copyProjectID ? $copyProject->begin : date('Y-m-d')),
  86. set::required(true)
  87. ),
  88. $lang->project->to,
  89. datepicker
  90. (
  91. set::name('end'),
  92. set('id', 'end'),
  93. set::placeholder($lang->project->end),
  94. set::value($projectEnd),
  95. set::required(true),
  96. set::disabled($isLongTime)
  97. )
  98. )
  99. ),
  100. formGroup
  101. (
  102. set::width('1/2'),
  103. setClass('items-center'),
  104. radioList
  105. (
  106. set::name('delta'),
  107. set::inline(true),
  108. set::items($lang->project->endList),
  109. set::value($delta)
  110. )
  111. )
  112. ),
  113. formGroup
  114. (
  115. set::name('desc'),
  116. set::label($lang->project->desc),
  117. set::control('editor')
  118. ),
  119. formRow
  120. (
  121. set::id('aclList'),
  122. formGroup
  123. (
  124. set::name('acl'),
  125. set::label($lang->project->acl),
  126. set::control('radioList'),
  127. $programID ? set::items($lang->project->subAclList) : set::items($lang->project->aclList),
  128. on::change()->toggleClass('.whitelistBox', 'hidden', "\$element.find('[name=acl]:checked').val() === 'open'"),
  129. set::value($copyProjectID ? $copyProject->acl : 'private')
  130. )
  131. ),
  132. formGroup
  133. (
  134. setClass('whitelistBox' . ($copyProjectID && $copyProject->acl == 'open' ? ' hidden' : '')),
  135. set::width('1/2'),
  136. set::label($lang->whitelist),
  137. picker
  138. (
  139. set::name('whitelist[]'),
  140. set::items($users),
  141. set::multiple(true),
  142. set::value($copyProjectID ? $copyProject->whitelist : '')
  143. )
  144. ),
  145. formHidden('LONG_TIME', LONG_TIME),
  146. formHidden('parent', 0),
  147. formHidden('model', $model),
  148. formHidden('vision', 'lite'),
  149. formHidden('hasProduct', 0)
  150. );
  151. $toggleActiveProject = jsCallback()->do(<<<'JS'
  152. if($this.hasClass('primary-outline'))
  153. {
  154. $this.removeClass('primary-outline');
  155. }
  156. else
  157. {
  158. $('#copyProjects button.project-block.primary-outline').removeClass('primary-outline');
  159. $this.addClass('primary-outline');
  160. }
  161. JS
  162. );
  163. $copySelectedProject = jsCallback()->const('model', $model)->do(<<<'JS'
  164. const copyProjectID = $('#copyProjects button.project-block.primary-outline').length == 1 ? $('#copyProjects button.project-block.primary-outline').data('id') : 0;
  165. loadPage($.createLink('project', 'create', 'model=' + model + '&programID=0' + '&copyProjectID=' + copyProjectID));
  166. zui.Modal.hide();
  167. JS
  168. );
  169. $copyProjectsBox = array();
  170. foreach($copyProjects as $id => $project)
  171. {
  172. $copyProjectsBox[] = btn(
  173. setClass('project-block justify-start'),
  174. setClass($copyProjectID == $id ? 'primary-outline' : ''),
  175. set('data-id', $id),
  176. set('data-pinyin', zget($copyPinyinList, $project->name, '')),
  177. icon
  178. (
  179. setClass('text-gray'),
  180. $lang->icons['project']
  181. ),
  182. on::click($toggleActiveProject),
  183. span($project->name, set::title($project->name), setClass('text-left'))
  184. );
  185. }
  186. modalTrigger
  187. (
  188. modal
  189. (
  190. set::id('copyProjectModal'),
  191. to::header
  192. (
  193. div
  194. (
  195. setClass('w-full'),
  196. span
  197. (
  198. h4
  199. (
  200. set::className('copy-title'),
  201. $lang->project->copyTitle
  202. )
  203. ),
  204. div
  205. (
  206. setClass('py-4 border-b border-b-1'),
  207. inputControl
  208. (
  209. to::suffix(icon('search')),
  210. set::suffixWidth('sm'),
  211. input
  212. (
  213. set::name('projectName'),
  214. set::placeholder($lang->project->searchByName)
  215. )
  216. )
  217. )
  218. )
  219. ),
  220. div
  221. (
  222. set::id('copyProjects'),
  223. setClass('flex items-center flex-wrap gap-4'),
  224. $copyProjectsBox
  225. ),
  226. to::footer
  227. (
  228. div
  229. (
  230. setClass('flex mt-4 w-full justify-center'),
  231. btn
  232. (
  233. setClass('px-6'),
  234. set::type('primary'),
  235. on::click($copySelectedProject),
  236. $lang->confirm
  237. )
  238. )
  239. )
  240. )
  241. );
  242. render();