debian-mirror-gitlab/app/assets/javascripts/notes/components/note_form.vue

200 lines
5.6 KiB
Vue
Raw Normal View History

2018-03-17 18:26:18 +05:30
<script>
2018-03-27 19:54:05 +05:30
import { mapGetters, mapActions } from 'vuex';
2018-03-17 18:26:18 +05:30
import eventHub from '../event_hub';
import issueWarning from '../../vue_shared/components/issue/issue_warning.vue';
import markdownField from '../../vue_shared/components/markdown/field.vue';
import issuableStateMixin from '../mixins/issuable_state';
2018-03-27 19:54:05 +05:30
import resolvable from '../mixins/resolvable';
2018-03-17 18:26:18 +05:30
export default {
name: 'IssueNoteForm',
components: {
issueWarning,
markdownField,
},
mixins: [
issuableStateMixin,
2018-03-27 19:54:05 +05:30
resolvable,
2018-03-17 18:26:18 +05:30
],
props: {
noteBody: {
type: String,
required: false,
default: '',
},
noteId: {
type: Number,
required: false,
default: 0,
},
saveButtonTitle: {
type: String,
required: false,
default: 'Save comment',
},
2018-03-27 19:54:05 +05:30
note: {
2018-03-17 18:26:18 +05:30
type: Object,
required: false,
default: () => ({}),
},
isEditing: {
type: Boolean,
required: true,
},
},
data() {
return {
2018-03-27 19:54:05 +05:30
updatedNoteBody: this.noteBody,
2018-03-17 18:26:18 +05:30
conflictWhileEditing: false,
isSubmitting: false,
2018-03-27 19:54:05 +05:30
isResolving: false,
resolveAsThread: true,
2018-03-17 18:26:18 +05:30
};
},
computed: {
...mapGetters([
'getDiscussionLastNote',
'getNoteableData',
'getNoteableDataByProp',
'getNotesDataByProp',
'getUserDataByProp',
]),
noteHash() {
return `#note_${this.noteId}`;
},
markdownPreviewPath() {
return this.getNoteableDataByProp('preview_note_path');
},
markdownDocsPath() {
return this.getNotesDataByProp('markdownDocsPath');
},
quickActionsDocsPath() {
return !this.isEditing ? this.getNotesDataByProp('quickActionsDocsPath') : undefined;
},
currentUserId() {
return this.getUserDataByProp('id');
},
isDisabled() {
2018-03-27 19:54:05 +05:30
return !this.updatedNoteBody.length || this.isSubmitting;
2018-03-17 18:26:18 +05:30
},
},
watch: {
noteBody() {
2018-03-27 19:54:05 +05:30
if (this.updatedNoteBody === this.noteBody) {
this.updatedNoteBody = this.noteBody;
2018-03-17 18:26:18 +05:30
} else {
this.conflictWhileEditing = true;
}
},
},
mounted() {
this.$refs.textarea.focus();
},
methods: {
2018-03-27 19:54:05 +05:30
...mapActions([
'toggleResolveNote',
]),
handleUpdate(shouldResolve) {
const beforeSubmitDiscussionState = this.discussionResolved;
2018-03-17 18:26:18 +05:30
this.isSubmitting = true;
2018-03-27 19:54:05 +05:30
this.$emit('handleFormUpdate', this.updatedNoteBody, this.$refs.editNoteForm, () => {
2018-03-17 18:26:18 +05:30
this.isSubmitting = false;
2018-03-27 19:54:05 +05:30
if (shouldResolve) {
this.resolveHandler(beforeSubmitDiscussionState);
}
2018-03-17 18:26:18 +05:30
});
},
editMyLastNote() {
2018-03-27 19:54:05 +05:30
if (this.updatedNoteBody === '') {
const lastNoteInDiscussion = this.getDiscussionLastNote(this.updatedNoteBody);
2018-03-17 18:26:18 +05:30
if (lastNoteInDiscussion) {
eventHub.$emit('enterEditMode', {
noteId: lastNoteInDiscussion.id,
});
}
}
},
cancelHandler(shouldConfirm = false) {
// Sends information about confirm message and if the textarea has changed
2018-03-27 19:54:05 +05:30
this.$emit('cancelFormEdition', shouldConfirm, this.noteBody !== this.updatedNoteBody);
2018-03-17 18:26:18 +05:30
},
},
};
</script>
<template>
<div
ref="editNoteForm"
class="note-edit-form current-note-edit-form">
<div
v-if="conflictWhileEditing"
class="js-conflict-edit-warning alert alert-danger">
This comment has changed since you started editing, please review the
<a
:href="noteHash"
target="_blank"
rel="noopener noreferrer">
updated comment
</a>
to ensure information is not lost.
</div>
<div class="flash-container timeline-content"></div>
<form class="edit-note common-note-form js-quick-submit gfm-form">
<issue-warning
v-if="hasWarning(getNoteableData)"
:is-locked="isLocked(getNoteableData)"
:is-confidential="isConfidential(getNoteableData)"
/>
<markdown-field
:markdown-preview-path="markdownPreviewPath"
:markdown-docs-path="markdownDocsPath"
:quick-actions-docs-path="quickActionsDocsPath"
:add-spacing-classes="false">
<textarea
id="note_note"
name="note[note]"
class="note-textarea js-gfm-input
js-autosize markdown-area js-vue-issue-note-form js-vue-textarea"
:data-supports-quick-actions="!isEditing"
aria-label="Description"
2018-03-27 19:54:05 +05:30
v-model="updatedNoteBody"
2018-03-17 18:26:18 +05:30
ref="textarea"
slot="textarea"
placeholder="Write a comment or drag your files here..."
@keydown.meta.enter="handleUpdate()"
@keydown.ctrl.enter="handleUpdate()"
@keydown.up="editMyLastNote()"
@keydown.esc="cancelHandler(true)">
</textarea>
</markdown-field>
<div class="note-form-actions clearfix">
<button
type="button"
@click="handleUpdate()"
:disabled="isDisabled"
class="js-vue-issue-save btn btn-save">
{{ saveButtonTitle }}
</button>
2018-03-27 19:54:05 +05:30
<button
v-if="note.resolvable"
@click.prevent="handleUpdate(true)"
class="btn btn-nr btn-default append-right-10 js-comment-resolve-button"
>
{{ resolveButtonTitle }}
</button>
2018-03-17 18:26:18 +05:30
<button
@click="cancelHandler()"
class="btn btn-cancel note-edit-cancel"
type="button">
Cancel
</button>
</div>
</form>
</div>
</template>