Welcome to mirror list, hosted at ThFree Co, Russian Federation.

commit_message_field.vue « shared « components « ide « javascripts « assets « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 428cf7f55ac75e44bc2adff9c1295ac1539d0102 (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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<script>
import { GlIcon, GlPopover } from '@gitlab/ui';
import { __, sprintf } from '~/locale';
import { MAX_TITLE_LENGTH, MAX_BODY_LENGTH } from '../../constants';

export default {
  components: {
    GlIcon,
    GlPopover,
  },
  props: {
    text: {
      type: String,
      required: true,
    },
    placeholder: {
      type: String,
      required: true,
    },
  },
  data() {
    return {
      scrollTop: 0,
      isFocused: false,
    };
  },
  computed: {
    allLines() {
      return this.text.split('\n').map((line, i) => ({
        text: line.substr(0, this.getLineLength(i)) || ' ',
        highlightedText: line.substr(this.getLineLength(i)),
      }));
    },
  },
  methods: {
    handleScroll() {
      if (this.$refs.textarea) {
        this.$nextTick(() => {
          this.scrollTop = this.$refs.textarea.scrollTop;
        });
      }
    },
    getLineLength(i) {
      return i === 0 ? MAX_TITLE_LENGTH : MAX_BODY_LENGTH;
    },
    onInput(e) {
      this.$emit('input', e.target.value);
    },
    onCtrlEnter() {
      if (!this.isFocused) return;
      this.$emit('submit');
    },
    updateIsFocused(isFocused) {
      this.isFocused = isFocused;
    },
  },
  popoverOptions: {
    triggers: 'hover',
    placement: 'top',
    content: sprintf(
      __(`
        The character highlighter helps you keep the subject line to %{titleLength} characters
        and wrap the body at %{bodyLength} so they are readable in git.
      `),
      { titleLength: MAX_TITLE_LENGTH, bodyLength: MAX_BODY_LENGTH },
    ),
  },
};
</script>

<template>
  <fieldset
    class="gl-rounded-base gl-inset-border-1-gray-400 gl-py-4 gl-px-5"
    :class="{
      'gl-outline-none! gl-focus-ring-border-1-gray-900!': isFocused,
    }"
  >
    <div
      v-once
      class="gl-display-flex gl-align-items-center gl-border-b-solid gl-border-b-1 gl-border-b-gray-100 gl-pb-3 gl-mb-3"
    >
      <div>{{ __('Commit Message') }}</div>
      <div id="commit-message-popover-container">
        <span id="commit-message-question" class="gl-gray-700 gl-ml-3">
          <gl-icon name="question-o" />
        </span>
        <gl-popover
          target="commit-message-question"
          container="commit-message-popover-container"
          v-bind="$options.popoverOptions"
        />
      </div>
    </div>
    <div class="gl-relative gl-w-full gl-h-13 gl-overflow-hidden">
      <div class="gl-absolute gl-z-index-1 gl-font-monospace gl-text-transparent">
        <div
          data-testid="highlights"
          :style="{
            transform: `translate3d(0, ${-scrollTop}px, 0)`,
          }"
        >
          <div v-for="(line, index) in allLines" :key="index">
            <span
              data-testid="highlights-text"
              class="gl-white-space-pre-wrap gl-word-break-word"
              v-text="line.text"
            >
            </span
            ><mark
              v-show="line.highlightedText"
              data-testid="highlights-mark"
              class="gl-px-1 gl-py-0 gl-bg-orange-100 gl-text-transparent gl-white-space-pre-wrap gl-word-break-word"
              v-text="line.highlightedText"
            >
            </mark>
          </div>
        </div>
      </div>
      <textarea
        ref="textarea"
        :placeholder="placeholder"
        :value="text"
        class="gl-absolute gl-w-full gl-h-full gl-z-index-2 gl-font-monospace p-0 gl-outline-0 gl-bg-transparent gl-border-0"
        data-qa-selector="ide_commit_message_field"
        dir="auto"
        name="commit-message"
        @scroll="handleScroll"
        @input="onInput"
        @focus="updateIsFocused(true)"
        @blur="updateIsFocused(false)"
        @keydown.ctrl.enter="onCtrlEnter"
        @keydown.meta.enter="onCtrlEnter"
      >
      </textarea>
    </div>
  </fieldset>
</template>