CodeReviewDetail.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <template>
  2. <div class="container">
  3. <h2>{{codeReviewDetail.title}}</h2>
  4. <el-divider/>
  5. <div class="title-line">
  6. <el-tag type="success" effect="dark" v-if="codeReviewDetail.status === 'Opened'">Open</el-tag>
  7. <el-tag type="danger" effect="dark" v-if="codeReviewDetail.status === 'Closed'">Closed</el-tag>
  8. <el-tag type="info" effect="dark" v-if="codeReviewDetail.status === 'Merged'">Merged</el-tag>
  9. <div>opened on {{codeReviewDetail.createTime.split('T')[0]}} by {{getCreatorName(codeReviewDetail.creatorId)}}</div>
  10. <el-button type="warning" plain size="medium" v-if="codeReviewDetail.status === 'Opened'">Close merge request</el-button>
  11. </div>
  12. <el-divider/>
  13. <div>Request to merge <span class="branch-name">{{codeReviewDetail.sourceBranch}}</span> into <span class="branch-name">{{codeReviewDetail.targetBranch}}</span></div>
  14. <div class="operation-line">
  15. <el-button type="success" size="medium" plain :disabled="!codeReviewDetail.status === 'Opened'">Merge</el-button>
  16. <el-switch v-model="codeReviewDetail.deleteSourceBranch" active-text="合并后删除源分支"></el-switch>
  17. </div>
  18. <el-divider/>
  19. <ElTabs v-model="activeTab">
  20. <ElTabPane :label="'评审意见'" name="comments">
  21. <div v-for="comment in commentList" :key="comment.id" class="comment-line">
  22. <div>
  23. <i class="el-icon-plus"/>{{comment.creatorName}}
  24. <span class="vice-comment"> @ {{comment.creatorName}} {{comment.commentType}}ed at {{comment.time}}</span>
  25. </div>
  26. <div class="comment-content">{{comment.content}}</div>
  27. </div>
  28. <div class="text-container">
  29. <div>创建新的评审意见</div>
  30. <el-input type="textarea" :rows="5" v-model="newComment.content"/>
  31. <el-button type="success" size="medium" plain :disabled="newComment.length === 0" @click="submitComment">创建</el-button>
  32. </div>
  33. </ElTabPane>
  34. <ElTabPane :label="'代码差异'" name="codeDiff">
  35. <CodeDifferencePlate :data="codeDiffMsg.res"/>
  36. </ElTabPane>
  37. </ElTabs>
  38. </div>
  39. </template>
  40. <script>
  41. import CodeDifferencePlate from '../../components/CodeDifferencePlate.vue';
  42. import { CodeReviewAPI } from '../../api';
  43. export default {
  44. name: 'CodeResviewDetail.vue',
  45. components: { CodeDifferencePlate },
  46. data() {
  47. return {
  48. activeTab: 'comments',
  49. codeReviewId: 0,
  50. codeReviewDetail: {
  51. creatorId: 0,
  52. createTime: '',
  53. },
  54. commentList: [
  55. {
  56. id: 0,
  57. codeReviewId: 1,
  58. creatorId: 1479,
  59. creatorName: 'Shanshan',
  60. content: '4893310c - feat: commit message',
  61. time: '2022-02-25',
  62. commentType: 'Commit',
  63. },
  64. {
  65. id: 1,
  66. codeReviewId: 1,
  67. creatorId: 1479,
  68. creatorName: 'Shanshan',
  69. content: 'Commene Content, Point out some flaws',
  70. time: '2022-02-26',
  71. commentType: 'Comment',
  72. },
  73. {
  74. id: 2,
  75. codeReviewId: 1,
  76. creatorId: 1479,
  77. creatorName: 'Shanshan',
  78. content: 'bd308312 - feat: fix some flaws',
  79. time: '2022-02-27',
  80. commentType: 'Commit',
  81. },
  82. ],
  83. codeDiffMsg: {},
  84. newComment: {
  85. codeReviewId: 0,
  86. creatorId: 0,
  87. creatorName: '',
  88. content: '',
  89. commentType: 'Comment',
  90. replyId: 0,
  91. },
  92. };
  93. },
  94. methods: {
  95. getCreatorName(creatorId) {
  96. const members = this.projectMemberList;
  97. let creatorName = 'Unknown User';
  98. Object.keys(members).forEach((key) => {
  99. if (members[key].value === creatorId) creatorName = members[key].label;
  100. return true;
  101. });
  102. return creatorName;
  103. },
  104. submitComment() {
  105. CodeReviewAPI.createComment(this.newComment).then(
  106. (res) => {
  107. this.commentList.push(JSON.parse(JSON.stringify(this.newComment)));
  108. this.newComment.content = '';
  109. },
  110. );
  111. },
  112. },
  113. computed: {
  114. projectMemberList() {
  115. return this.$store.getters.userOptions;
  116. },
  117. currentUser() {
  118. return this.$store.state.user;
  119. },
  120. },
  121. async mounted() {
  122. this.codeReviewId = this.$route.query.codeReviewId;
  123. this.newComment.codeReviewId = this.codeReviewId;
  124. this.newComment.creatorId = this.currentUser.id;
  125. this.newComment.creatorName = this.currentUser.username;
  126. this.codeReviewDetail = await CodeReviewAPI.getCodeReviewDetail(this.codeReviewId);
  127. this.commentList = await CodeReviewAPI.getComment(this.codeReviewId);
  128. this.codeDiffMsg = await CodeReviewAPI.compareBranch(this.codeReviewDetail.projectId, this.codeReviewDetail.targetBranch, this.codeReviewDetail.sourceBranch);
  129. },
  130. };
  131. </script>
  132. <style lang="scss" scoped>
  133. ::v-deep {
  134. .el-tabs__item{
  135. font-size: 16px;
  136. }
  137. }
  138. .container {
  139. margin: 20px 50px;
  140. .el-divider {
  141. width: 90%;
  142. margin-top: 12px;
  143. margin-bottom: 12px;
  144. }
  145. .el-tabs {
  146. width: 90%;
  147. font-size: 2em;
  148. }
  149. }
  150. .title-line {
  151. .el-tag {
  152. display: inline-block;
  153. font-size: 0.95em;
  154. }
  155. div {
  156. display: inline-block;
  157. margin-left: 10px;
  158. }
  159. .el-button {
  160. position: absolute;
  161. right: 10%;
  162. }
  163. }
  164. .operation-line {
  165. margin-top: 8px;
  166. .el-switch {
  167. margin-left: 10px;
  168. }
  169. }
  170. .branch-name {
  171. color: #1b69b6;
  172. font-weight: 600;
  173. }
  174. .comment-line {
  175. border-bottom: gainsboro solid 1px;
  176. font-size: 16px;
  177. padding: 7px 10px;
  178. }
  179. .vice-comment {
  180. color: #707070;
  181. }
  182. .comment-content {
  183. margin-top: 7px;
  184. margin-left: 50px;
  185. }
  186. .text-container {
  187. font-size: 16px;
  188. border: solid gainsboro 1px;
  189. border-radius: 5px;
  190. margin-top: 20px;
  191. padding: 12px 20px;
  192. div {
  193. margin-bottom: 8px;;
  194. }
  195. .el-input {
  196. font-size: 13px;
  197. }
  198. }
  199. </style>