create.html.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. /**
  3. * The create view file of task 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 Tian Shujie<tianshujie@easycorp.ltd>
  8. * @package task
  9. * @link https://www.zentao.net
  10. */
  11. namespace zin;
  12. include($this->app->getModuleRoot() . 'ai/ui/inputinject.html.php');
  13. jsVar('window.executionID', $execution->id);
  14. jsVar('vision', $config->vision);
  15. jsVar('window.lifetime', $execution->lifetime);
  16. jsVar('window.attribute', $execution->attribute);
  17. jsVar('window.lifetimeList', $lifetimeList);
  18. jsVar('window.attributeList', $attributeList);
  19. jsVar('teamMemberError', $lang->task->error->teamMember);
  20. jsVar('requiredFields', $config->task->create->requiredFields);
  21. jsVar('estimateNotEmpty', sprintf($lang->error->gt, $lang->task->estimateAB, '0'));
  22. jsVar('taskID', $taskID ?? 0);
  23. jsVar('toTaskList', !empty($task->id));
  24. jsVar('showFields', $showFields);
  25. jsVar('canViewStory', common::hasPriv('execution', 'storyView'));
  26. jsVar('ignoreLang', $lang->project->ignore);
  27. jsVar('assignedToOptions', $assignedToOptions);
  28. jsVar('taskDateLimit', $project->taskDateLimit);
  29. if(!empty($task->team))
  30. {
  31. foreach($task->team as $member)
  32. {
  33. $member->team = $member->account;
  34. $member->teamEstimate = (float)$member->estimate;
  35. }
  36. }
  37. $isEn = $app->getClientLang() == 'en';
  38. $fields = useFields('task.create');
  39. $fields->autoLoad('execution', 'execution,type,name,assignedToBox,region,lane,module,storyBox,datePlan,pri,estimate,desc,files,mailto,keywords,after,testStoryBox');
  40. $fields->orders('type,testStoryBox', 'type,testStoryBox,parent,assignedToBox', 'desc,module,storyBox');
  41. $fields->fullModeOrders('type,module,storyBox,testStoryBox', 'desc,files,mailto,keywords');
  42. if($execution->type == 'kanban' || empty(data('execution.multiple')))
  43. {
  44. $fields->orders('desc,module,storyBox', 'type,parent,assignedToBox,testStoryBox,region,lane');
  45. $fields->fullModeOrders('name,assignedToBox', 'type,module,storyBox,testStoryBox', 'desc,files,mailto,keywords');
  46. if(empty($features['story'])) $fields->fullModeOrders('type,module,storyBox', 'name,assignedToBox', 'desc,files,mailto,keywords');
  47. }
  48. if(empty($features['story']) && $execution->type != 'kanban' && !empty(data('execution.multiple')))
  49. {
  50. $fields->fullModeOrders('type,module,storyBox,testStoryBox,parent,assignedToBox', 'desc,files,mailto,keywords');
  51. }
  52. if($execution->lifetime == 'ops') $fields->fullModeOrders('type,module,storyBox,testStoryBox,parent,name,assignedToBox', 'desc,files,mailto,keywords');
  53. formGridPanel
  54. (
  55. set::title($lang->task->create),
  56. set::fields($fields),
  57. set::loadUrl($loadUrl),
  58. on::change('[name=module]', 'loadExecutionStories'),
  59. on::change('[name=story]', 'setStoryRelated'),
  60. on::change('[name=type]', 'typeChange'),
  61. on::change('[name=region]', 'loadLanes'),
  62. on::change('[name=multiple]', 'toggleTeam'),
  63. on::change('[name=parent]', 'getParentEstStartedAndDeadline'),
  64. on::change('[name=selectTestStory]', 'toggleSelectTestStory'),
  65. on::change('.team-member [name^=team]', 'changeTeamMember'),
  66. on::change('[name=execution]', 'loadAll'),
  67. on::change('[name=estStarted]', 'checkEstStartedAndDeadline'),
  68. on::change('[name=deadline]', 'checkEstStartedAndDeadline'),
  69. on::click('[name=isShowAllModule]', 'showAllModule'),
  70. on::click('[name=copyButton]', 'copyStoryTitle'),
  71. on::click('.assignedToList .picker-multi-selection', 'removeTeamMember'),
  72. on::click('#teamTable .team-saveBtn', 'checkTeamMember'),
  73. on::keyup('[name=name]', 'saveTaskName'),
  74. on::keyup('[name=estimate]', 'saveTaskEstimate'),
  75. modal
  76. (
  77. setID('modalTeam'),
  78. set::title($lang->task->addMember),
  79. div
  80. (
  81. setClass('flex items-center w-96 mb-4'),
  82. span(setClass('mr-4 ' . ($isEn ? 'w-20' : 'w-16')), $lang->task->mode),
  83. picker
  84. (
  85. set::name("mode"),
  86. !empty($task->mode) ? set::value($task->mode) : set::value("linear"),
  87. set::items($lang->task->modeList),
  88. set::required(true)
  89. )
  90. ),
  91. formBatch
  92. (
  93. set::tagName('div'),
  94. setID('teamTable'),
  95. set::mode(!empty($task->team) ? 'edit' : 'add'),
  96. !empty($task->team) ? set::data(array_values($task->team)) : null,
  97. set::sortable(true),
  98. set::size('sm'),
  99. set::minRows(3),
  100. set::onRenderRow(jsRaw('renderRowData')),
  101. formBatchItem
  102. (
  103. set::name('id'),
  104. set::width('32px'),
  105. set::control('index')
  106. ),
  107. formBatchItem
  108. (
  109. set::name('team'),
  110. set::label($lang->task->teamMember),
  111. set::width('240px'),
  112. set::control(array('control' => 'taskAssignedTo', 'manageLink' => ($manageLink ? $manageLink : ''))),
  113. set::items($members)
  114. ),
  115. formBatchItem
  116. (
  117. set::name('estimateBox'),
  118. set::label($lang->task->estimateAB),
  119. set::width('135px'),
  120. set::control('inputGroup'),
  121. set::required(true),
  122. inputControl
  123. (
  124. input(set::name("teamEstimate")),
  125. to::suffix($lang->task->suffixHour),
  126. set::suffixWidth(20)
  127. )
  128. ),
  129. set::actions(array(array('text' => $lang->save, 'class' => 'primary team-saveBtn')))
  130. )
  131. )
  132. );