summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/diffs/components/inline_diff_view.vue
blob: 0ed3dc7f3ad550cc945f5b4032ef45494177be3e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<script>
import diffContentMixin from '../mixins/diff_content';
import {
  MATCH_LINE_TYPE,
  CONTEXT_LINE_TYPE,
  OLD_NO_NEW_LINE_TYPE,
  NEW_NO_NEW_LINE_TYPE,
  LINE_HOVER_CLASS_NAME,
  LINE_UNFOLD_CLASS_NAME,
} from '../constants';

export default {
  mixins: [diffContentMixin],
  methods: {
    handleMouse(lineCode, isOver) {
      this.hoveredLineCode = isOver ? lineCode : null;
    },
    getLineClass(line) {
      const isSameLine = this.hoveredLineCode && this.hoveredLineCode === line.lineCode;
      const isMatchLine = line.type === MATCH_LINE_TYPE;
      const isContextLine = line.type === CONTEXT_LINE_TYPE;
      const isMetaLine = line.type === OLD_NO_NEW_LINE_TYPE || line.type === NEW_NO_NEW_LINE_TYPE;

      return {
        [line.type]: line.type,
        [LINE_UNFOLD_CLASS_NAME]: isMatchLine,
        [LINE_HOVER_CLASS_NAME]:
          this.isLoggedIn && isSameLine && !isMatchLine && !isContextLine && !isMetaLine,
      };
    },
  },
};
</script>

<template>
  <table
    :class="userColorScheme"
    :data-commit-id="commitId"
    class="code diff-wrap-lines js-syntax-highlight text-file">
    <tbody>
      <template
        v-for="(line, index) in normalizedDiffLines"
      >
        <tr
          :id="line.lineCode || `${fileHash}_${line.oldLine}_${line.newLine}`"
          :key="line.lineCode"
          :class="getRowClass(line)"
          class="line_holder"
          @mouseover="handleMouse(line.lineCode, true)"
          @mouseout="handleMouse(line.lineCode, false)"
        >
          <td
            :class="getLineClass(line)"
            class="diff-line-num old_line"
          >
            <diff-line-gutter-content
              :file-hash="fileHash"
              :line-type="line.type"
              :line-code="line.lineCode"
              :line-number="line.oldLine"
              :meta-data="line.metaData"
              :show-comment-button="true"
              :context-lines-path="diffFile.contextLinesPath"
              :is-bottom="index + 1 === diffLinesLength"
              @showCommentForm="handleShowCommentForm"
            />
          </td>
          <td
            :class="getLineClass(line)"
            class="diff-line-num new_line"
          >
            <diff-line-gutter-content
              :file-hash="fileHash"
              :line-type="line.type"
              :line-code="line.lineCode"
              :line-number="line.newLine"
              :meta-data="line.metaData"
              :is-bottom="index + 1 === diffLinesLength"
              :context-lines-path="diffFile.contextLinesPath"
            />
          </td>
          <td
            :class="line.type"
            class="line_content"
            v-html="line.richText"
          >
          </td>
        </tr>
        <tr
          v-if="isDiscussionExpanded(line.lineCode) || diffLineCommentForms[line.lineCode]"
          :key="index"
          :class="discussionsByLineCode[line.lineCode] ? '' : 'js-temp-notes-holder'"
          class="notes_holder"
        >
          <td
            class="notes_line"
            colspan="2"
          ></td>
          <td class="notes_content">
            <div class="content">
              <diff-discussions
                :discussions="discussionsByLineCode[line.lineCode] || []"
              />
              <diff-line-note-form
                v-if="diffLineCommentForms[line.lineCode]"
                :diff-file="diffFile"
                :diff-lines="diffLines"
                :line="line"
                :note-target-line="diffLines[index]"
              />
            </div>
          </td>
        </tr>
      </template>
    </tbody>
  </table>
</template>