2019-07-31 22:56:46 +05:30
|
|
|
<script>
|
2019-09-30 21:07:59 +05:30
|
|
|
import { mapGetters, mapActions } from 'vuex';
|
2019-07-31 22:56:46 +05:30
|
|
|
import { SYSTEM_NOTE } from '../constants';
|
|
|
|
import { __ } from '~/locale';
|
2019-09-30 21:07:59 +05:30
|
|
|
import PlaceholderNote from '~/vue_shared/components/notes/placeholder_note.vue';
|
|
|
|
import PlaceholderSystemNote from '~/vue_shared/components/notes/placeholder_system_note.vue';
|
2019-07-31 22:56:46 +05:30
|
|
|
import SystemNote from '~/vue_shared/components/notes/system_note.vue';
|
2019-09-30 21:07:59 +05:30
|
|
|
import NoteableNote from './noteable_note.vue';
|
2019-07-31 22:56:46 +05:30
|
|
|
import ToggleRepliesWidget from './toggle_replies_widget.vue';
|
|
|
|
import NoteEditedText from './note_edited_text.vue';
|
2019-09-30 21:07:59 +05:30
|
|
|
import DiscussionNotesRepliesWrapper from './discussion_notes_replies_wrapper.vue';
|
2019-07-31 22:56:46 +05:30
|
|
|
|
|
|
|
export default {
|
|
|
|
name: 'DiscussionNotes',
|
|
|
|
components: {
|
|
|
|
ToggleRepliesWidget,
|
|
|
|
NoteEditedText,
|
2019-09-30 21:07:59 +05:30
|
|
|
DiscussionNotesRepliesWrapper,
|
2019-07-31 22:56:46 +05:30
|
|
|
},
|
|
|
|
props: {
|
|
|
|
discussion: {
|
|
|
|
type: Object,
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
isExpanded: {
|
|
|
|
type: Boolean,
|
|
|
|
required: false,
|
|
|
|
default: false,
|
|
|
|
},
|
|
|
|
diffLine: {
|
|
|
|
type: Object,
|
|
|
|
required: false,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
line: {
|
|
|
|
type: Object,
|
|
|
|
required: false,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
shouldGroupReplies: {
|
|
|
|
type: Boolean,
|
|
|
|
required: false,
|
|
|
|
default: false,
|
|
|
|
},
|
|
|
|
helpPagePath: {
|
|
|
|
type: String,
|
|
|
|
required: false,
|
|
|
|
default: '',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
computed: {
|
|
|
|
...mapGetters(['userCanReply']),
|
|
|
|
hasReplies() {
|
2019-09-04 21:01:54 +05:30
|
|
|
return Boolean(this.replies.length);
|
2019-07-31 22:56:46 +05:30
|
|
|
},
|
|
|
|
replies() {
|
|
|
|
return this.discussion.notes.slice(1);
|
|
|
|
},
|
|
|
|
firstNote() {
|
|
|
|
return this.discussion.notes.slice(0, 1)[0];
|
|
|
|
},
|
|
|
|
resolvedText() {
|
|
|
|
return this.discussion.resolved_by_push ? __('Automatically resolved') : __('Resolved');
|
|
|
|
},
|
|
|
|
commit() {
|
|
|
|
if (!this.discussion.for_commit) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
id: this.discussion.commit_id,
|
|
|
|
url: this.discussion.discussion_path,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
},
|
|
|
|
methods: {
|
2019-09-30 21:07:59 +05:30
|
|
|
...mapActions(['toggleDiscussion']),
|
2019-07-31 22:56:46 +05:30
|
|
|
componentName(note) {
|
|
|
|
if (note.isPlaceholderNote) {
|
|
|
|
if (note.placeholderType === SYSTEM_NOTE) {
|
|
|
|
return PlaceholderSystemNote;
|
|
|
|
}
|
|
|
|
|
|
|
|
return PlaceholderNote;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (note.system) {
|
|
|
|
return SystemNote;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NoteableNote;
|
|
|
|
},
|
|
|
|
componentData(note) {
|
|
|
|
return note.isPlaceholderNote ? note.notes[0] : note;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<div class="discussion-notes">
|
|
|
|
<ul class="notes">
|
|
|
|
<template v-if="shouldGroupReplies">
|
|
|
|
<component
|
|
|
|
:is="componentName(firstNote)"
|
|
|
|
:note="componentData(firstNote)"
|
2019-09-30 21:07:59 +05:30
|
|
|
:line="line || diffLine"
|
2019-07-31 22:56:46 +05:30
|
|
|
:commit="commit"
|
|
|
|
:help-page-path="helpPagePath"
|
|
|
|
:show-reply-button="userCanReply"
|
2019-09-30 21:07:59 +05:30
|
|
|
@handleDeleteNote="$emit('deleteNote')"
|
|
|
|
@startReplying="$emit('startReplying')"
|
2019-07-31 22:56:46 +05:30
|
|
|
>
|
|
|
|
<note-edited-text
|
|
|
|
v-if="discussion.resolved"
|
|
|
|
slot="discussion-resolved-text"
|
|
|
|
:edited-at="discussion.resolved_at"
|
|
|
|
:edited-by="discussion.resolved_by"
|
|
|
|
:action-text="resolvedText"
|
|
|
|
class-name="discussion-headline-light js-discussion-headline discussion-resolved-text"
|
|
|
|
/>
|
|
|
|
<slot slot="avatar-badge" name="avatar-badge"></slot>
|
|
|
|
</component>
|
2019-09-30 21:07:59 +05:30
|
|
|
<discussion-notes-replies-wrapper :is-diff-discussion="discussion.diff_discussion">
|
|
|
|
<toggle-replies-widget
|
|
|
|
v-if="hasReplies"
|
|
|
|
:collapsed="!isExpanded"
|
|
|
|
:replies="replies"
|
|
|
|
:class="{ 'discussion-toggle-replies': discussion.diff_discussion }"
|
|
|
|
@toggle="toggleDiscussion({ discussionId: discussion.id })"
|
2019-07-31 22:56:46 +05:30
|
|
|
/>
|
2019-09-30 21:07:59 +05:30
|
|
|
<template v-if="isExpanded">
|
|
|
|
<component
|
|
|
|
:is="componentName(note)"
|
|
|
|
v-for="note in replies"
|
|
|
|
:key="note.id"
|
|
|
|
:note="componentData(note)"
|
|
|
|
:help-page-path="helpPagePath"
|
|
|
|
:line="line"
|
|
|
|
@handleDeleteNote="$emit('deleteNote')"
|
|
|
|
/>
|
|
|
|
</template>
|
|
|
|
<slot :show-replies="isExpanded || !hasReplies" name="footer"></slot>
|
|
|
|
</discussion-notes-replies-wrapper>
|
2019-07-31 22:56:46 +05:30
|
|
|
</template>
|
|
|
|
<template v-else>
|
|
|
|
<component
|
|
|
|
:is="componentName(note)"
|
|
|
|
v-for="(note, index) in discussion.notes"
|
|
|
|
:key="note.id"
|
|
|
|
:note="componentData(note)"
|
|
|
|
:help-page-path="helpPagePath"
|
|
|
|
:line="diffLine"
|
2019-09-30 21:07:59 +05:30
|
|
|
@handleDeleteNote="$emit('deleteNote')"
|
2019-07-31 22:56:46 +05:30
|
|
|
>
|
|
|
|
<slot v-if="index === 0" slot="avatar-badge" name="avatar-badge"></slot>
|
|
|
|
</component>
|
2019-09-30 21:07:59 +05:30
|
|
|
<slot :show-replies="isExpanded || !hasReplies" name="footer"></slot>
|
2019-07-31 22:56:46 +05:30
|
|
|
</template>
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
</template>
|