v1.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. namespace zin;
  3. require_once dirname(__DIR__) . DS . 'relatedlist' . DS . 'v1.php';
  4. class storyRelatedList extends relatedList
  5. {
  6. /**
  7. * @var mixed[]
  8. */
  9. protected static $defineProps = array
  10. (
  11. 'fromBug' => '?object', // 来源 BUG。
  12. 'bugs' => '?array', // 关联的 BUG 列表。
  13. 'builds' => '?array', // 关联的版本列表。
  14. 'releases' => '?array', // 关联的发布列表。
  15. 'storyProducts' => '?array', // 需求产品信息。
  16. 'linkedMRs' => '?array', // 需求 MR 信息。
  17. 'linkedPRs' => '?array', // 需求 PR 信息。
  18. 'linkedCommits' => '?linkedCommits', // 需求提交信息。
  19. 'story' => '?object' // 当前需求。
  20. );
  21. protected function created()
  22. {
  23. $data = $this->prop('data');
  24. if($data) return;
  25. $story = $this->prop('story');
  26. if(!$story) $story = data('story');
  27. if(!$story) return;
  28. global $app, $lang;
  29. $isStoryType = $story->type == 'story';
  30. $fromBug = $this->prop('fromBug', data('fromBug'));
  31. $bugs = $this->prop('bugs', data('bugs'));
  32. $cases = $this->prop('cases', data('cases'));
  33. $builds = $this->prop('builds', data('builds'));
  34. $releases = $this->prop('releases', data('releases'));
  35. $linkedMRs = $this->prop('linkedMRs', data('linkedMRs'));
  36. $linkedPRs = $this->prop('linkedPRs', data('linkedPRs'));
  37. $linkedCommits = $this->prop('linkedCommits', data('linkedCommits'));
  38. $data = array();
  39. if($isStoryType)
  40. {
  41. if(!empty($fromBug) && hasPriv('story', 'bugs'))
  42. {
  43. $data['fromBug'] = array
  44. (
  45. 'title' => $lang->story->legendFromBug,
  46. 'items' => array($fromBug),
  47. 'url' => hasPriv('bug', 'view') ? createLink('bug', 'view', 'bugID={id}') : false
  48. );
  49. }
  50. $data['bug'] = array
  51. (
  52. 'title' => $lang->story->legendBugs,
  53. 'items' => $bugs,
  54. 'statusList' => $lang->bug->statusList
  55. );
  56. if(hasPriv('story', 'cases'))
  57. {
  58. $data['testcase'] = array
  59. (
  60. 'title' => $lang->story->legendCases,
  61. 'items' => $cases,
  62. 'url' => hasPriv('testcase', 'view') ? createLink('testcase', 'view', 'caseID={id}') : false
  63. );
  64. }
  65. $tab = $app->tab == 'product' ? 'project' : $app->tab;
  66. if($app->tab == 'system') $tab = 'project';
  67. $data['build'] = array
  68. (
  69. 'title' => $lang->story->legendBuilds,
  70. 'items' => $builds,
  71. 'props' => array('data-app' => $tab)
  72. );
  73. $tab = $app->tab == 'execution' ? 'product' : $app->tab;
  74. $releaseModule = $app->tab == 'project' ? 'projectrelease' : 'release';
  75. if($app->tab == 'system') $tab = 'product';
  76. $data['release'] = array
  77. (
  78. 'title' => $lang->story->legendReleases,
  79. 'items' => $releases,
  80. 'url' => hasPriv($releaseModule, 'view') ? createLink($releaseModule, 'view', 'releaseID={id}') : false,
  81. 'props' => array('data-app' => $tab)
  82. );
  83. }
  84. if($isStoryType && helper::hasFeature('devops'))
  85. {
  86. $data['mr'] = array
  87. (
  88. 'title' => $lang->story->linkMR,
  89. 'items' => $linkedMRs,
  90. 'url' => hasPriv('mr', 'view') ? createLink('mr', 'view', 'MRID={id}') : false,
  91. 'props' => array('data-app' => 'devops'),
  92. 'onRender' => function($item, $mr) use($lang)
  93. {
  94. $item['titleClass'] = 'w-0 flex-1';
  95. $statusClass = $mr->status;
  96. if($mr->status == 'opened') $statusClass = 'draft';
  97. if($mr->status == 'merged') $statusClass = 'done';
  98. $item['content'] = array('html' => "<span class='status-{$statusClass}'>" . zget($lang->mr->statusList, $mr->status) . '</span>');
  99. return $item;
  100. }
  101. );
  102. if($linkedPRs)
  103. {
  104. $data['pr'] = array
  105. (
  106. 'title' => $lang->story->linkPR,
  107. 'items' => $linkedPRs,
  108. 'url' => hasPriv('pullreq', 'view') ? createLink('pullreq', 'view', 'MRID={id}') : false,
  109. 'props' => array('data-app' => 'devops'),
  110. 'onRender' => function($item, $mr) use($lang)
  111. {
  112. $item['titleClass'] = 'w-0 flex-1';
  113. $statusClass = $mr->status;
  114. if($mr->status == 'opened') $statusClass = 'draft';
  115. if($mr->status == 'merged') $statusClass = 'done';
  116. $item['content'] = array('html' => "<span class='status-{$statusClass}'>" . zget($lang->mr->statusList, $mr->status) . '</span>');
  117. return $item;
  118. }
  119. );
  120. }
  121. $data['commit'] = array
  122. (
  123. 'title' => $lang->story->linkCommit,
  124. 'items' => $linkedCommits,
  125. 'url' => false,
  126. 'onRender' => function($item, $commit)
  127. {
  128. $item['text'] = $commit->comment;
  129. if(hasPriv('repo', 'revision'))
  130. {
  131. $item['url'] = createLink('repo', 'revision', "repoID={$commit->repo}&objectID=0&revision={$commit->revision}");
  132. $item['data-app'] = 'devops';
  133. }
  134. return $item;
  135. }
  136. );
  137. }
  138. $this->setProp('data', $data);
  139. }
  140. }