create.max.html.hook.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <?php
  2. namespace zin;
  3. global $lang, $config, $app;
  4. $copyType = data('copyType');
  5. $programListSet = data('programListSet');
  6. $model = data('model');
  7. $copyProject = data('copyProject');
  8. $copyWorkflowGroup = data('copyWorkflowGroup');
  9. $hasCode = !empty($config->setCode);
  10. jsVar('rawMethod', $app->rawMethod);
  11. jsVar('programID', data('programID'));
  12. jsVar('programID', data('programID'));
  13. jsVar('pageType', data('pageType'));
  14. jsVar('copyType', $copyType);
  15. jsVar('nextStepText', $lang->project->nextStep);
  16. jsVar('LONG_TIME', LONG_TIME);
  17. jsVar('end', isset($copyProject->end) ? $copyProject->end : '');
  18. jsVar('budget', isset($copyProject->budget) ? $copyProject->budget : '');
  19. jsVar('days', isset($copyProject->days) ? $copyProject->days : '');
  20. jsVar('future', isset($copyProject->future) ? $copyProject->future : 'off');
  21. jsVar('multiple', isset($copyProject->multiple) ? $copyProject->multiple : 1);
  22. $allDataItems = array();
  23. $allList = $model == 'ipd' ? $lang->project->copyProject->ipdAllList : $lang->project->copyProject->allList;
  24. $allList = $model == 'kanban' ? $lang->project->copyProject->kanbanAllList : $allList;
  25. foreach($allList as $name)
  26. {
  27. $executionTitle = $model == 'scrum' || $model == 'agileplus' ? sprintf($name, $lang->project->copyProject->sprint) : sprintf($name, $lang->project->stage);
  28. $allDataItems[] = div
  29. (
  30. setClass('all-item clip'),
  31. set::title($executionTitle),
  32. icon('success', setClass('mx-2')),
  33. $executionTitle
  34. );
  35. }
  36. $noSprintItems = array();
  37. $noSprintList = $lang->project->copyProject->noSprintList;
  38. foreach($noSprintList as $name)
  39. {
  40. $noSprintItems[] = div
  41. (
  42. setClass('all-item clip'),
  43. set::title($name),
  44. icon('success', setClass('mr-2')),
  45. $name
  46. );
  47. }
  48. query('#copyProjectModal')->replaceWith
  49. (
  50. modal
  51. (
  52. set::id('copyProjectModal'),
  53. div
  54. (
  55. setClass('copy-container'),
  56. ul
  57. (
  58. setClass('nav nav-tabs'),
  59. li
  60. (
  61. setClass('active'),
  62. a(setClass('pointer-events-none'), setID('firstTab'), setData('target', 'tabContent1'), setData('toggle', 'tab'), icon(setClass('number'), 1), span($lang->project->copyProject->select)),
  63. div(setClass('line'))
  64. ),
  65. li
  66. (
  67. a(setClass('pointer-events-none'), setData('toggle', 'tab'), icon(setClass('number'), 2), span($lang->project->copyProject->confirmData)),
  68. div(setClass('line'))
  69. ),
  70. li
  71. (
  72. a(setClass('pointer-events-none'), setData('toggle', 'tab'), icon(setClass('number'), 3), span($lang->project->copyProject->improveData)),
  73. div(setClass('line'))
  74. ),
  75. li
  76. (
  77. a(setClass('pointer-events-none'), setData('toggle', 'tab'), icon(setClass('number'), 4), span($lang->project->copyProject->completeData)),
  78. div(setClass('line'))
  79. )
  80. ),
  81. div
  82. (
  83. setClass('tab-content'),
  84. div
  85. (
  86. setID('tabContent1'),
  87. setClass('tab-pane fade active in'),
  88. div
  89. (
  90. setClass('content'),
  91. div
  92. (
  93. setClass('copy-title'),
  94. $lang->project->copyProject->selectPlz
  95. ),
  96. div
  97. (
  98. setClass('select-box'),
  99. $config->systemMode == 'ALM' && $config->vision != 'lite' ? picker
  100. (
  101. setClass('mr-4'),
  102. set::width('150'),
  103. set::name('parent'),
  104. set::items($programListSet),
  105. set::placeholder($lang->project->copyProject->selectProgram)
  106. ) : null,
  107. picker
  108. (
  109. set::width('300'),
  110. set::name('selectCopyprojectID'),
  111. set::items(array()),
  112. set::placeholder($lang->project->copyProject->selectProjectPlz)
  113. )
  114. ),
  115. div(setID('replaceList'), setClass('flex items-center flex-wrap gap-4 mb-4'))
  116. ),
  117. div
  118. (
  119. setClass('footer-btns'),
  120. button
  121. (
  122. setClass('btn primary next-btn'),
  123. setData('target', '#tabContent2'),
  124. setData('toggle', 'tab'),
  125. $lang->project->nextStep
  126. ),
  127. button
  128. (
  129. setClass('btn cancel-btn'),
  130. setData('dismiss', 'modal'),
  131. $lang->project->copyProject->cancel
  132. )
  133. )
  134. ),
  135. div
  136. (
  137. setID('tabContent2'),
  138. setClass('tab-pane fade'),
  139. div
  140. (
  141. setClass('content'),
  142. div(setClass('copy-title'), $lang->project->copyProject->confirmCopyDataTip),
  143. div(setClass('copy-project-title clip mb-4')),
  144. div
  145. (
  146. setClass('all-content'),
  147. radio
  148. (
  149. set::rootClass('allData'),
  150. set::name('allCheckbox'),
  151. $lang->project->copyProject->all
  152. ),
  153. div
  154. (
  155. setClass('all-data normal-data'),
  156. $allDataItems
  157. ),
  158. div
  159. (
  160. setClass('all-data no-sprint-data hidden'),
  161. $noSprintItems
  162. )
  163. ),
  164. div
  165. (
  166. setClass('basic-content'),
  167. radio
  168. (
  169. set::rootClass('basicData'),
  170. set::name('basicCheckbox'),
  171. $lang->project->copyProject->basic
  172. ),
  173. div
  174. (
  175. setClass('all-data'),
  176. div
  177. (
  178. setClass('all-item clip'),
  179. icon('success', setClass('mr-2')),
  180. $lang->project->copyProject->basicInfo
  181. )
  182. )
  183. )
  184. ),
  185. div
  186. (
  187. setClass('footer-btns'),
  188. button
  189. (
  190. setClass('btn primary complete-btn'),
  191. $lang->project->copyProject->toComplete
  192. ),
  193. button
  194. (
  195. setClass('btn cancel-btn'),
  196. setData('dismiss', 'modal'),
  197. $lang->project->copyProject->cancel
  198. ),
  199. formHidden('choseCopyprojectID', '')
  200. )
  201. )
  202. )
  203. )
  204. )
  205. );
  206. $loadUrl = helper::createLink('project', 'create', 'model=' . data('model') . '&program={parent}&copyProjectID=' . data('copyProjectID') . '&extra=charter={charter}' . (!empty($copyType) ? ",copyType={$copyType}" : '') . ",copyFrom=project,workflowGroup={workflowGroup}" . '&pageType=' . $pageType);
  207. /* 追加交付物组件。 */
  208. query('formGridPanel')->each(function($node) use($loadUrl, $lang, $model, $app, $hasCode, $copyWorkflowGroup)
  209. {
  210. $fields = $node->prop('fields');
  211. $blocks = $node->prop('blocks');
  212. if(data('copyFrom') == 'template')
  213. {
  214. $fields->field('workflowGroup')->readonly();
  215. unset($node->blocks['titleSuffix']);
  216. unset($node->blocks['headingActions'][0]);
  217. unset($node->blocks['headingActions'][1]);
  218. }
  219. if($app->rawMethod == 'createtemplate')
  220. {
  221. $copyProject = data('copyProject');
  222. $loadUrl = helper::createLink('project', 'createTemplate', 'model=' . data('model') . '&program={parent}&copyProjectID={copyProjectID}&extra=charter={charter},copyType=all,workflowGroup={workflowGroup}&pageType=copy');
  223. $fields->field('parent')->hidden();
  224. $fields->field('charter')->hidden();
  225. $fields->field('productsBox')->hidden();
  226. $fields->field('begin')->hidden();
  227. if(data('model') == 'waterfall' || data('model') == 'waterfallplus') $fields->field('stageBy')->hidden();
  228. $fields->field('end')->value(isset($copyProject->end) ? $copyProject->end : date('Y-m-d', strtotime('+30 days')))->hidden();
  229. $fields->field('days')->value('30')->hidden();
  230. $fields->field('copyProjectID')->width('1/2')->control(array('control' => 'picker', 'required' => false))->required(true)->items(data('copyProjectList'))->value(data('copyProjectID'))->moveAfter('parent');
  231. $fields->field('model')->width('1/2')->control('picker')->items($lang->project->modelList)->value(!empty($copyProject) ? $copyProject->model : '')->disabled();
  232. $fields->field('workflowGroup')->width('1/2')->items(!empty($copyWorkflowGroup) ? array($copyWorkflowGroup->id => $copyWorkflowGroup->name) : array())->value(!empty($copyProject) ? $copyProject->workflowGroup : '')->disabled();
  233. $fields->field('name')->label($lang->project->templateName)->width($hasCode ? '1/4' : '1/2');
  234. $fields->field('isTpl')->value('1')->hidden();
  235. $fields->field('taskDateLimit')->value(!empty($copyProject) ? $copyProject->taskDateLimit : 'auto');
  236. $fields->autoLoad('copyProjectID');
  237. $fields->defaultOrders = array_merge($fields->defaultOrders, array('copyProjectID,model,workflowGroup,name,code'));
  238. $fields->ordersForFull = array_merge($fields->ordersForFull, array('copyProjectID,model,workflowGroup,name,code'));
  239. unset($node->blocks['titleSuffix']);
  240. unset($node->blocks['headingActions'][0]);
  241. unset($node->blocks['headingActions'][1]);
  242. $ajaxProp['submitDisabledValue'] = true;
  243. $node->setProp('ajax', $ajaxProp);
  244. }
  245. $fields->field('hasProduct')->hidden(true);
  246. if($model != 'kanban')
  247. {
  248. $fields->field('budget')->foldable(false);
  249. $fields->orders('model,workflowGroup,budget');
  250. }
  251. $node->setProp('fields', $fields);
  252. $node->setProp('loadUrl', $loadUrl);
  253. });