debian-mirror-gitlab/app/assets/javascripts/diffs/components/diff_table_cell.vue

207 lines
5.2 KiB
Vue
Raw Normal View History

2018-11-08 19:23:39 +05:30
<script>
2019-02-15 15:39:39 +05:30
import { mapGetters, mapActions } from 'vuex';
2020-10-24 23:57:45 +05:30
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
2020-03-13 15:44:24 +05:30
import { getParameterByName, parseBoolean } from '~/lib/utils/common_utils';
import DiffGutterAvatars from './diff_gutter_avatars.vue';
2020-10-24 23:57:45 +05:30
import { __ } from '~/locale';
2018-11-08 19:23:39 +05:30
import {
CONTEXT_LINE_TYPE,
2020-03-13 15:44:24 +05:30
LINE_POSITION_RIGHT,
2018-11-08 19:23:39 +05:30
EMPTY_CELL_TYPE,
OLD_NO_NEW_LINE_TYPE,
2020-07-28 23:09:34 +05:30
OLD_LINE_TYPE,
2018-11-08 19:23:39 +05:30
NEW_NO_NEW_LINE_TYPE,
LINE_HOVER_CLASS_NAME,
} from '../constants';
export default {
components: {
2020-03-13 15:44:24 +05:30
DiffGutterAvatars,
GlIcon,
2018-11-08 19:23:39 +05:30
},
2020-10-24 23:57:45 +05:30
directives: {
GlTooltip: GlTooltipDirective,
},
2018-11-08 19:23:39 +05:30
props: {
line: {
type: Object,
required: true,
},
fileHash: {
type: String,
required: true,
},
2019-02-15 15:39:39 +05:30
isHighlighted: {
type: Boolean,
required: true,
2018-11-08 19:23:39 +05:30
},
showCommentButton: {
type: Boolean,
required: false,
default: false,
},
linePosition: {
type: String,
required: false,
default: '',
},
lineType: {
type: String,
required: false,
default: '',
},
isBottom: {
type: Boolean,
required: false,
default: false,
},
isHover: {
type: Boolean,
required: false,
default: false,
},
},
2020-07-28 23:09:34 +05:30
data() {
return {
isCommentButtonRendered: false,
};
},
2018-11-08 19:23:39 +05:30
computed: {
...mapGetters(['isLoggedIn']),
2020-03-13 15:44:24 +05:30
lineCode() {
return (
this.line.line_code ||
(this.line.left && this.line.left.line_code) ||
(this.line.right && this.line.right.line_code)
);
},
lineHref() {
return `#${this.line.line_code || ''}`;
},
shouldShowCommentButton() {
2020-07-28 23:09:34 +05:30
return this.isHover && !this.isContextLine && !this.isMetaLine && !this.hasDiscussions;
2020-03-13 15:44:24 +05:30
},
hasDiscussions() {
return this.line.discussions && this.line.discussions.length > 0;
},
shouldShowAvatarsOnGutter() {
if (!this.line.type && this.linePosition === LINE_POSITION_RIGHT) {
return false;
}
return this.showCommentButton && this.hasDiscussions;
},
shouldRenderCommentButton() {
2020-07-28 23:09:34 +05:30
if (!this.isCommentButtonRendered) {
return false;
}
2020-04-22 19:07:51 +05:30
if (this.isLoggedIn && this.showCommentButton) {
const isDiffHead = parseBoolean(getParameterByName('diff_head'));
return !isDiffHead || gon.features?.mergeRefHeadComments;
}
return false;
2020-03-13 15:44:24 +05:30
},
2018-11-08 19:23:39 +05:30
isContextLine() {
2018-11-20 20:47:30 +05:30
return this.line.type === CONTEXT_LINE_TYPE;
2018-11-08 19:23:39 +05:30
},
isMetaLine() {
2018-11-20 20:47:30 +05:30
const { type } = this.line;
2018-11-08 19:23:39 +05:30
return (
type === OLD_NO_NEW_LINE_TYPE || type === NEW_NO_NEW_LINE_TYPE || type === EMPTY_CELL_TYPE
);
},
classNameMap() {
2018-11-20 20:47:30 +05:30
const { type } = this.line;
2018-11-08 19:23:39 +05:30
2019-07-31 22:56:46 +05:30
return [
type,
{
hll: this.isHighlighted,
[LINE_HOVER_CLASS_NAME]:
2020-07-28 23:09:34 +05:30
this.isLoggedIn && this.isHover && !this.isContextLine && !this.isMetaLine,
2019-07-31 22:56:46 +05:30
},
];
2018-11-08 19:23:39 +05:30
},
lineNumber() {
2019-02-15 15:39:39 +05:30
return this.lineType === OLD_LINE_TYPE ? this.line.old_line : this.line.new_line;
2018-11-08 19:23:39 +05:30
},
2020-10-24 23:57:45 +05:30
addCommentTooltip() {
const brokenSymlinks = this.line.commentsDisabled;
let tooltip = __('Add a comment to this line');
if (brokenSymlinks) {
if (brokenSymlinks.wasSymbolic || brokenSymlinks.isSymbolic) {
tooltip = __(
'Commenting on symbolic links that replace or are replaced by files is currently not supported.',
);
} else if (brokenSymlinks.wasReal || brokenSymlinks.isReal) {
tooltip = __(
'Commenting on files that replace or are replaced by symbolic links is currently not supported.',
);
}
}
return tooltip;
},
2018-11-08 19:23:39 +05:30
},
2020-07-28 23:09:34 +05:30
mounted() {
this.unwatchShouldShowCommentButton = this.$watch('shouldShowCommentButton', newVal => {
if (newVal) {
this.isCommentButtonRendered = true;
this.unwatchShouldShowCommentButton();
}
});
},
beforeDestroy() {
this.unwatchShouldShowCommentButton();
},
2020-03-13 15:44:24 +05:30
methods: {
...mapActions('diffs', ['showCommentForm', 'setHighlightedRow', 'toggleLineDiscussions']),
handleCommentButton() {
this.showCommentForm({ lineCode: this.line.line_code, fileHash: this.fileHash });
},
},
2018-11-08 19:23:39 +05:30
};
</script>
<template>
2020-03-13 15:44:24 +05:30
<td ref="td" :class="classNameMap">
2020-10-24 23:57:45 +05:30
<span
ref="addNoteTooltip"
v-gl-tooltip
class="add-diff-note tooltip-wrapper"
:title="addCommentTooltip"
2020-07-28 23:09:34 +05:30
>
2020-10-24 23:57:45 +05:30
<button
v-if="shouldRenderCommentButton"
v-show="shouldShowCommentButton"
ref="addDiffNoteButton"
type="button"
class="add-diff-note note-button js-add-diff-note-button qa-diff-comment"
:disabled="line.commentsDisabled"
@click="handleCommentButton"
>
<gl-icon :size="12" name="comment" />
</button>
</span>
2020-07-28 23:09:34 +05:30
<a
v-if="lineNumber"
ref="lineNumberRef"
:data-linenumber="lineNumber"
:href="lineHref"
@click="setHighlightedRow(lineCode)"
>
</a>
<diff-gutter-avatars
v-if="shouldShowAvatarsOnGutter"
:discussions="line.discussions"
:discussions-expanded="line.discussionsExpanded"
@toggleLineDiscussions="
toggleLineDiscussions({ lineCode, fileHash, expanded: !line.discussionsExpanded })
"
/>
2018-11-08 19:23:39 +05:30
</td>
</template>