assigntomeblock.html.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <?php
  2. /**
  3. * The assigntome view file of block 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 Yuting Wang <wangyuting@easycorp.ltd>
  7. * @package block
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. jsVar('moreLabel', $lang->more);
  12. jsVar('todayLabel', $lang->today);
  13. jsVar('yesterdayLabel', $lang->yesterday);
  14. jsVar('delayWarning', $lang->task->delayWarning);
  15. $blockNavCode = 'nav-' . uniqid();
  16. $menus = array();
  17. $moreMenus = array();
  18. foreach($hasViewPriv as $type => $bool)
  19. {
  20. $data = $type == 'story' ? $stories : ${"{$type}s"};
  21. if($type != 'todo' && empty($data)) unset($hasViewPriv[$type]);
  22. }
  23. $index = 1;
  24. $count = count($hasViewPriv);
  25. foreach($hasViewPriv as $type => $bool)
  26. {
  27. $selected = key($hasViewPriv);
  28. if(($longBlock && $count > 5 && $index > 5) || (!$longBlock && $count > 1 && $index > 1))
  29. {
  30. $moreMenus[] = array('text' => $type == 'review' ? $lang->my->audit : zget($lang->block->availableBlocks, $type), 'data-toggle' => 'tab', 'href' => "#assigntome{$type}Tab{$blockNavCode}", 'data-on' => 'click', 'data-call' => 'clickItems', 'data-params' => 'event');
  31. }
  32. else
  33. {
  34. $menus[] = li
  35. (
  36. setClass('nav-item nav-switch'),
  37. a
  38. (
  39. setClass($type == $selected ? 'active' : ''),
  40. setData(array('toggle' => 'tab')),
  41. set('href', "#assigntome{$type}Tab{$blockNavCode}"),
  42. set('data-on', 'click'),
  43. set('data-call', 'clickItems'),
  44. set('data-params', 'event'),
  45. $type == 'review' ? $lang->my->audit : zget($lang->block->availableBlocks, $type)
  46. )
  47. );
  48. }
  49. $index ++;
  50. }
  51. if(($longBlock && $count > 5) || (!$longBlock && $count > 1))
  52. {
  53. $menus[] = li
  54. (
  55. setClass('nav-item nav-switch'),
  56. a
  57. (
  58. setData(array('toggle' => 'dropdown')),
  59. set('href', "#assigntomeMenuMore{$blockNavCode}"),
  60. span($lang->more),
  61. icon('caret-down')
  62. ),
  63. menu
  64. (
  65. setID("assigntomeMenuMore{$blockNavCode}"),
  66. setClass('dropdown-menu'),
  67. set::items($moreMenus)
  68. )
  69. );
  70. }
  71. $processProjectField = function($review, $projects) use($lang)
  72. {
  73. if($review->project && strpos((string)$review->project, ',') !== false)
  74. {
  75. $projectIdList = explode(',', $review->project);
  76. $review->project = '';
  77. foreach($projectIdList as $projectID)
  78. {
  79. if(empty($projectID)) continue;
  80. $review->project .= zget($projects, $projectID, '') . $lang->comma;
  81. }
  82. $review->project = trim($review->project, $lang->comma);
  83. }
  84. else
  85. {
  86. $review->project = zget($projects, $review->project, '');
  87. }
  88. };
  89. $contents = array();
  90. foreach($hasViewPriv as $type => $bool)
  91. {
  92. $configType = $type;
  93. if($type == 'testcase') $configType = 'case';
  94. if($type == 'requirement') $configType = 'story';
  95. $data = $type == 'story' ? $stories : ${"{$type}s"};
  96. if(empty($config->block->{$configType}->dtable->fieldList)) continue;
  97. if(!$longBlock && !empty($config->block->{$configType}->dtable->short->fieldList)) $config->block->{$configType}->dtable->fieldList = $config->block->{$configType}->dtable->short->fieldList;
  98. if($type == 'review')
  99. {
  100. $statusList = array();
  101. foreach($data as $review)
  102. {
  103. $reviewType = $review->type;
  104. if($reviewType == 'projectreview') $reviewType = 'review';
  105. $review->module = $reviewType;
  106. $typeName = '';
  107. if(isset($lang->{$review->type}->common)) $typeName = $lang->{$review->type}->common;
  108. if($reviewType == 'story')
  109. {
  110. if($review->storyType == 'story') $typeName = $lang->SRCommon;
  111. if($review->storyType == 'requirement') $typeName = $lang->URCommon;
  112. if($review->storyType == 'epic') $typeName = $lang->ERCommon;
  113. }
  114. if($review->type == 'projectreview') $typeName = $lang->project->common;
  115. if(isset($lang->$reviewType->statusList)) $statusList = array_merge($statusList, $lang->$reviewType->statusList);
  116. if($reviewType == 'attend') $statusList = array_merge($statusList, $lang->attend->reviewStatusList);
  117. if($reviewType == 'charter')
  118. {
  119. $this->app->loadLang('charter');
  120. $statusList = array_merge($statusList, $lang->charter->reviewStatusList);
  121. }
  122. if(!in_array($reviewType, array('story', 'testcase', 'feedback', 'review', 'mr', 'pullreq')) and strpos(",{$config->my->oaObjectType},", ",$reviewType,") === false) $statusList = array_merge($statusList, $lang->approval->nodeList);
  123. if(in_array($reviewType, array('mr', 'pullreq')))
  124. {
  125. $typeName = $lang->devops->mr;
  126. if(empty($review->status)) $review->status = 'notReviewed';
  127. $this->app->loadLang('mr');
  128. $statusList = array_merge($statusList, $lang->mr->approvalStatusList);
  129. }
  130. $review->type = $typeName;
  131. if(isset($review->project) && empty($review->project)) $review->project = '';
  132. if(isset($review->product) && empty($review->product)) $review->product = '';
  133. $processProjectField($review, $projects);
  134. }
  135. $config->block->review->dtable->fieldList['status']['statusMap'] = $statusList;
  136. }
  137. if($type == 'requirement') $config->block->story->dtable->fieldList['title']['title'] = str_replace($lang->story->story, $lang->story->requirement, $lang->story->title);
  138. if($type == 'epic') $config->block->story->dtable->fieldList['title']['title'] = str_replace($lang->story->story, $lang->story->epic, $lang->story->title);
  139. if(in_array($type, array('story', 'epic', 'requirement'))) $config->block->story->dtable->fieldList['title']['link']['module'] = $type;
  140. if($type == 'ticket') $config->block->ticket->dtable->fieldList['product']['map'] = $products;
  141. if($type == 'feedback') $config->block->feedback->dtable->fieldList['product']['map'] = $products;
  142. if($type == 'meeting') $config->block->meeting->dtable->fieldList['dept']['map'] = $depts;
  143. $config->block->review->dtable->fieldList['product']['map'] = $products;
  144. $selected = key($hasViewPriv);
  145. $contents[] = div
  146. (
  147. setClass("assigntome-{$type} tab-pane " . ($type == $selected ? 'active' : '')),
  148. setID("assigntome{$type}Tab{$blockNavCode}"),
  149. dtable
  150. (
  151. set::id($type),
  152. set::height(318),
  153. set::bordered(false),
  154. $type == 'todo' || $type == 'task' ? set::fixedLeftWidth('0.44') : '',
  155. set::horzScrollbarPos('inside'),
  156. set::onRenderCell(jsRaw('window.renderCell')),
  157. set::cols(array_values($config->block->{$configType}->dtable->fieldList)),
  158. set::data(array_values($data)),
  159. $type == 'bug' ? set::priList($lang->{$type}->priList) : null,
  160. $type == 'bug' ? set::severityList($lang->{$type}->severityList) : null,
  161. set::userMap($users)
  162. )
  163. );
  164. }
  165. blockPanel
  166. (
  167. setClass('assigntome-block list-block'),
  168. to::heading
  169. (
  170. ul
  171. (
  172. setClass('nav'),
  173. $menus,
  174. on::show()->call('handleAssignToMeTabShow')
  175. )
  176. ),
  177. div($contents),
  178. h::css
  179. (
  180. '.block-assigntome .panel-heading .panel-title {overflow: hidden; text-overflow: clip; white-space: nowrap;}',
  181. '.block-assigntome .nav > .nav-item > a {padding: 0 16px; border-radius: 4px; height: 28px; color: var(--color-gray-700); overflow: hidden; text-overflow: clip; white-space: nowrap;}',
  182. '.block-assigntome .nav > .nav-item > a.active {font-weight: bold; color: var(--color-gray-900); background: var(--color-primary-50)}'
  183. )
  184. );
  185. render();