create.html.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. /**
  3. * The create view file of project 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 Mengyi Liu <liumengyi@easycorp.ltd>
  7. * @package project
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. $fields = useFields('project.create');
  12. $fields->autoLoad('parent', 'acl,productsBox,hasProduct');
  13. $loadUrl = $this->createLink('project', 'create', "model={$model}&program={parent}");
  14. jsVar('model', $model);
  15. jsVar('ignore', $lang->project->ignore);
  16. jsVar('budgetOverrun', $lang->project->budgetOverrun);
  17. jsVar('currencySymbol', $lang->project->currencySymbol);
  18. jsVar('parentBudget', $lang->project->parentBudget);
  19. jsVar('budgetUnitLabel', $lang->project->tenThousandYuan);
  20. jsVar('+projectID', 0);
  21. jsVar('LONG_TIME', LONG_TIME);
  22. jsVar('weekend', $config->execution->weekend);
  23. jsVar('beginLessThanParent', $lang->project->beginLessThanParent);
  24. jsVar('endGreatThanParent', $lang->project->endGreatThanParent);
  25. unset($lang->project->endList['999']);
  26. jsVar('endList', $lang->project->endList);
  27. $modelMenuItems = array();
  28. foreach($lang->project->modelList as $key => $text)
  29. {
  30. if(empty($key)) continue;
  31. $modelMenuItems[] = array('text' => $text, 'selected' => $key == $model, 'url' => createLink('project', 'create', "model=$key"));
  32. }
  33. $modeDropdown = common::isTutorialMode() ? null : dropdown
  34. (
  35. btn
  36. (
  37. zget($lang->project->modelList, $model),
  38. setClass('gray-300-outline size-sm rounded-full ml-2')
  39. ),
  40. set::arrow(true),
  41. set::placement('bottom'),
  42. set::items($modelMenuItems)
  43. );
  44. $handleLongTimeChange = jsCallback()->do(<<<'JS'
  45. const endPicker = $element.find('[name=end]').closest('[data-zui-datepicker]').zui('datePicker');
  46. const isLongTime = $element.find('[name=longTime]').prop('checked');
  47. endPicker.render({disabled: isLongTime});
  48. if(isLongTime) endPicker.$.setValue('');
  49. $element.find('[name=days]').attr('disabled', isLongTime ? 'disabled' : null);
  50. checkProjectInfo();
  51. JS
  52. );
  53. $toggleLongTime = jsCallback()->do(<<<'JS'
  54. const isMultiple = $('#form-project-create [name=multiple]').prop('checked');
  55. if(!isMultiple) $('#form-project-create [name=longTime]').prop('checked', false);
  56. $('#form-project-create [name=longTime]').closest('.checkbox-primary').toggleClass('hidden', !isMultiple);
  57. const $endPicker = $('#form-project-create [name=end]').closest('[data-zui-datepicker]').zui('datePicker');
  58. $endPicker.render({disabled: false});
  59. $('#form-project-create [name=days]').removeAttr('disabled');
  60. JS
  61. );
  62. formGridPanel
  63. (
  64. to::titleSuffix($modeDropdown),
  65. set::ajax(array('submitDisabledValue' => false)),
  66. common::isTutorialMode() ? null : to::headingActions
  67. (
  68. btn
  69. (
  70. set::icon('copy'),
  71. setClass('primary-ghost size-md copy-project-btn'),
  72. toggle::modal(array('target' => '#copyProjectModal', 'destroyOnHide' => true)),
  73. $lang->project->copy
  74. ),
  75. divider(setClass('h-4 mr-4 ml-2 self-center'))
  76. ),
  77. formHidden('storyType[]', 'story'),
  78. on::click('[name=name], [name=code], [data-name=begin] .pick *, [name=days], [data-name="parent"] .pick *, [name=longTime]', 'removeTips'),
  79. on::click('[type=submit]', 'removeAllTips'),
  80. on::click('[name=multiple]', $toggleLongTime),
  81. on::change('[name=hasProduct]', 'changeType'),
  82. on::change('[name=longTime]', $handleLongTimeChange),
  83. on::change('[name=future]', 'toggleBudget'),
  84. on::change('[name=begin], [name=end]', 'computeWorkDays'),
  85. on::change('[name^=products]', 'toggleStageBy'),
  86. on::change('[name=parent], [name=budget]', 'checkBudget'),
  87. on::change('[name^=storyType]', 'toggleStoryType'),
  88. on::init()->do('setTimeout(() => $element.find("[name=longTime]").trigger("change"), 500)'),
  89. set::title($lang->project->create),
  90. set::fullModeOrders(array('begin,days,PM,budget', !empty($config->setCode) ? 'parent,hasProduct,name,code,begin' : 'parent,name,hasProduct,begin')),
  91. set::fields($fields),
  92. set::loadUrl($loadUrl)
  93. );
  94. $toggleActiveProject = jsCallback()->do(<<<'JS'
  95. if($this.hasClass('primary-outline'))
  96. {
  97. $this.removeClass('primary-outline');
  98. }
  99. else
  100. {
  101. $('#copyProjects button.project-block.primary-outline').removeClass('primary-outline');
  102. $this.addClass('primary-outline');
  103. }
  104. JS
  105. );
  106. $copySelectedProject = jsCallback()->const('model', $model)->do(<<<'JS'
  107. const copyProjectID = $('#copyProjects button.project-block.primary-outline').length == 1 ? $('#copyProjects button.project-block.primary-outline').data('id') : 0;
  108. const programID = $('[name=parent]').val();
  109. loadPage($.createLink('project', 'create', 'model=' + model + '&programID=' + programID + '&copyProjectID=' + copyProjectID));
  110. zui.Modal.hide();
  111. JS
  112. );
  113. $copyProjectsBox = array();
  114. if(!empty($copyProjects))
  115. {
  116. foreach($copyProjects as $id => $project)
  117. {
  118. $projectName = is_object($project) ? $project->name : $project;
  119. $copyProjectsBox[] = btn
  120. (
  121. setClass('project-block justify-start'),
  122. setClass($copyProjectID == $id ? 'primary-outline' : ''),
  123. set('data-id', $id),
  124. set('data-pinyin', zget($copyPinyinList, $projectName)),
  125. icon(setClass('text-gray'), !empty($project->model) ? ($project->model == 'scrum' ? 'sprint' : $project->model) : $lang->icons['project']),
  126. on::click($toggleActiveProject),
  127. span($projectName, set::title($projectName), setClass('text-left'))
  128. );
  129. }
  130. }
  131. else
  132. {
  133. $copyProjectsBox[] = div
  134. (
  135. setClass('inline-flex items-center w-full bg-gray-100 h-12 mt-2 mb-8'),
  136. icon('exclamation-sign icon-2x pl-2 text-warning'),
  137. span
  138. (
  139. set::className('font-bold ml-2'),
  140. $lang->project->copyNoProject
  141. )
  142. );
  143. }
  144. modal
  145. (
  146. set::id('copyProjectModal'),
  147. to::header
  148. (
  149. div
  150. (
  151. setClass('w-full'),
  152. span
  153. (
  154. h4
  155. (
  156. set::className('copy-title'),
  157. $lang->project->copyTitle
  158. )
  159. ),
  160. div
  161. (
  162. setClass('py-4 border-b border-b-1'),
  163. inputControl
  164. (
  165. to::suffix(icon('search')),
  166. set::suffixWidth('sm'),
  167. input
  168. (
  169. set::name('projectName'),
  170. set::placeholder($lang->project->searchByName)
  171. )
  172. )
  173. )
  174. )
  175. ),
  176. to::footer
  177. (
  178. div
  179. (
  180. setClass('flex mt-4 w-full justify-center'),
  181. btn
  182. (
  183. setClass('px-6'),
  184. set::type('primary'),
  185. on::click($copySelectedProject),
  186. $lang->confirm
  187. )
  188. )
  189. ),
  190. div
  191. (
  192. set::id('copyProjects'),
  193. setClass('flex items-center flex-wrap gap-4'),
  194. $copyProjectsBox
  195. )
  196. );
  197. render();