CodeReview.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <template>
  2. <div class="container">
  3. <CodeReviewAddDrawer ref="addDrawer"/>
  4. <FileReviewAddDrawer ref="fileReviewAddDrawer"/>
  5. <el-row id="codeReviewButtonRow">
  6. <h2>代码评审列表</h2>
  7. <div class="button-plate">
  8. <el-button id="addBranchReview" type="success" size="medium" @click="addCodeReview">新建分支评审</el-button>
  9. <el-button type="primary" size="medium" @click="addFileReview">新建文件评审</el-button>
  10. </div>
  11. </el-row>
  12. <ElTabs class="tabs" v-model="activeTab">
  13. <ElTabPane :label="'Opened(' + codeReviewList.opened.length + ')'" name="Opened">
  14. <div class="code-review-line" v-for="item in codeReviewList.opened" :key="item.id">
  15. <div class="code-review-titleline" @click="directToDetail(item.id)">{{item.title}}</div>
  16. <div class="code-review-timeline">opened at {{item.createTime.split('T')[0]}}</div>
  17. </div>
  18. </ElTabPane>
  19. <ElTabPane :label="'Merged(' + codeReviewList.merged.length + ')'" name="Merged">
  20. <div class="code-review-line" v-for="item in codeReviewList.merged" :key="item.id">
  21. <div class="code-review-titleline" @click="directToDetail(item.id)">{{item.title}}</div>
  22. <div class="code-review-timeline">opened at {{item.createTime.split('T')[0]}}</div>
  23. </div>
  24. </ElTabPane>
  25. <ElTabPane :label="'Closed(' + codeReviewList.closed.length + ')'" name="Closed">
  26. <div class="code-review-line" v-for="item in codeReviewList.closed" :key="item.id">
  27. <div class="code-review-titleline" @click="directToDetail(item.id)">{{item.title}}</div>
  28. <div class="code-review-timeline">opened at {{item.createTime.split('T')[0]}}</div>
  29. </div>
  30. </ElTabPane>
  31. <ElTabPane :label="'FileReview(' + codeReviewList.fileReview.length + ')'" name="FileReview">
  32. <div class="code-review-line" v-for="item in codeReviewList.fileReview" :key="item.id">
  33. <el-row>
  34. <div class="code-review-titleline" @click="directToFileReviewDetail(item.id)">{{item.title}}</div>
  35. <el-tag size="mini" class="state-tag" :type="getFileReviewTagType(item.status)" effect="dark">{{item.status}}</el-tag>
  36. </el-row>
  37. <div class="code-review-timeline">opened at {{item.createTime.split('T')[0]}}</div>
  38. </div>
  39. </ElTabPane>
  40. </ElTabs>
  41. </div>
  42. </template>
  43. <script>
  44. import CodeReviewAddDrawer from '@/components/CodeReviewAddDrawer.vue';
  45. import FileReviewAddDrawer from '@/components/FileReviewAddDrawer.vue';
  46. import { CodeReviewAPI } from '../../api';
  47. export default {
  48. components: { CodeReviewAddDrawer, FileReviewAddDrawer },
  49. name: 'CodeReview.vue',
  50. data() {
  51. return {
  52. activeTab: 'Opened',
  53. codeReviewList: {
  54. opened: [{
  55. id: 1,
  56. projectId: -1,
  57. sourceBranch: '',
  58. targetBranch: '',
  59. creatorId: '',
  60. reviewerId: '',
  61. status: '',
  62. title: 'frontEndTest',
  63. description: '',
  64. createTime: '2022.1.26',
  65. }, {
  66. id: 1,
  67. projectId: -1,
  68. sourceBranch: '',
  69. targetBranch: '',
  70. creatorId: '',
  71. reviewerId: '',
  72. status: '',
  73. title: 'frontEndTest',
  74. description: '',
  75. createTime: '2022.1.26',
  76. }],
  77. closed: [],
  78. merged: [],
  79. fileReview: [],
  80. },
  81. };
  82. },
  83. computed: {
  84. currentProjectInfo() {
  85. return this.$store.getters.currentProjectInfo;
  86. },
  87. },
  88. methods: {
  89. // changeTab(index) {
  90. // if (this.tabActive[index]) return null;
  91. // this.tabActive = [false, false, false, false];
  92. // this.tabActive[index] = true;
  93. // return null;
  94. // },
  95. addCodeReview() {
  96. this.$refs.addDrawer.show();
  97. },
  98. addFileReview() {
  99. this.$refs.fileReviewAddDrawer.show();
  100. },
  101. async refreshCodeReviewList() {
  102. this.codeReviewList = await CodeReviewAPI.getCodeReviewList(this.currentProjectInfo.id);
  103. },
  104. directToDetail(id) {
  105. this.$router.push(`codereviewdetail?codeReviewId=${id}`);
  106. },
  107. directToFileReviewDetail(id) {
  108. this.$router.push(`filereviewdetail?fileReviewId=${id}`);
  109. },
  110. getFileReviewTagType(status) {
  111. if (status === 'Inspecting') return 'warning';
  112. if (status === 'Rework') return 'danger';
  113. if (status === 'Completed') return 'success';
  114. return '';
  115. },
  116. },
  117. async mounted() {
  118. this.codeReviewList = await CodeReviewAPI.getCodeReviewList(this.currentProjectInfo.id);
  119. },
  120. };
  121. </script>
  122. <style lang="scss" scoped>
  123. ::v-deep {
  124. .el-tabs__item{
  125. font-size: 1em;
  126. }
  127. }
  128. .container {
  129. margin: 50px 100px;
  130. & .tabs {
  131. width: 90%;
  132. margin: 10px 0px;
  133. }
  134. }
  135. .button-plate {
  136. position: absolute;
  137. top: 100%;
  138. right: 10%;
  139. margin-top: 10px;
  140. z-index: 10;
  141. }
  142. #addButton {
  143. position: absolute;
  144. top: 100%;
  145. right: 10%;
  146. margin-top: 10px;
  147. z-index: 10;
  148. }
  149. #addFileReviewButton {
  150. position: absolute;
  151. top: 100%;
  152. right: 30%;
  153. margin-top: 10px;
  154. z-index: 10;
  155. }
  156. .code-review-line {
  157. border-bottom: 1px solid gainsboro;
  158. padding: 5px 10px;
  159. }
  160. .code-review-titleline {
  161. cursor: pointer;
  162. }
  163. .code-review-titleline:hover {
  164. text-decoration: underline;
  165. }
  166. .code-review-timeline {
  167. color: #909090;
  168. font-size: 0.9em;
  169. margin-top: 5px;
  170. }
  171. .state-tag {
  172. position: absolute;
  173. right: 0%;
  174. }
  175. </style>