debian-mirror-gitlab/app/assets/javascripts/saved_replies/components/form.vue
2023-05-27 22:25:52 +05:30

182 lines
5.1 KiB
Vue

<script>
import { GlButton, GlForm, GlFormGroup, GlFormInput, GlAlert } from '@gitlab/ui';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
import { helpPagePath } from '~/helpers/help_page_helper';
import { logError } from '~/lib/logger';
import { __ } from '~/locale';
import createSavedReplyMutation from '../queries/create_saved_reply.mutation.graphql';
import updateSavedReplyMutation from '../queries/update_saved_reply.mutation.graphql';
export default {
components: {
GlButton,
GlForm,
GlFormGroup,
GlFormInput,
GlAlert,
MarkdownField,
},
props: {
id: {
type: String,
required: false,
default: null,
},
name: {
type: String,
required: false,
default: '',
},
content: {
type: String,
required: false,
default: '',
},
},
data() {
return {
errors: [],
saving: false,
showValidation: false,
updateSavedReply: {
name: this.name,
content: this.content,
},
};
},
computed: {
isNameValid() {
if (this.showValidation) return Boolean(this.updateSavedReply.name);
return true;
},
isContentValid() {
if (this.showValidation) return Boolean(this.updateSavedReply.content);
return true;
},
isValid() {
return this.isNameValid && this.isContentValid;
},
},
methods: {
onSubmit() {
this.showValidation = true;
if (!this.isValid) return;
this.errors = [];
this.saving = true;
this.$apollo
.mutate({
mutation: this.id ? updateSavedReplyMutation : createSavedReplyMutation,
variables: {
id: this.id,
name: this.updateSavedReply.name,
content: this.updateSavedReply.content,
},
update: (store, { data: { savedReplyMutation } }) => {
if (savedReplyMutation.errors.length) {
this.errors = savedReplyMutation.errors.map((e) => e);
} else {
this.$emit('saved');
this.updateSavedReply = { name: '', content: '' };
this.showValidation = false;
}
},
})
.catch((error) => {
const errors = error.graphQLErrors;
if (errors?.length) {
this.errors = errors.map((e) => e.message);
} else {
// Let's be sure to log the original error so it isn't just swallowed.
// Also, we don't want to translate console messages.
// eslint-disable-next-line @gitlab/require-i18n-strings
logError('Unexpected error while saving reply', error);
this.errors = [__('An unexpected error occurred. Please try again.')];
}
})
.finally(() => {
this.saving = false;
});
},
},
restrictedToolbarItems: ['full-screen'],
markdownDocsPath: helpPagePath('user/markdown'),
};
</script>
<template>
<gl-form
class="new-note common-note-form"
data-testid="saved-reply-form"
@submit.prevent="onSubmit"
>
<gl-alert
v-for="error in errors"
:key="error"
variant="danger"
class="gl-mb-3"
:dismissible="false"
>
{{ error }}
</gl-alert>
<gl-form-group
:label="__('Name')"
:state="isNameValid"
:invalid-feedback="__('Please enter a name for the saved reply.')"
data-testid="saved-reply-name-form-group"
>
<gl-form-input
v-model="updateSavedReply.name"
:placeholder="__('Enter a name for your saved reply')"
data-testid="saved-reply-name-input"
/>
</gl-form-group>
<gl-form-group
:label="__('Content')"
:state="isContentValid"
:invalid-feedback="__('Please enter the saved reply content.')"
data-testid="saved-reply-content-form-group"
>
<markdown-field
:enable-preview="false"
:is-submitting="saving"
:add-spacing-classes="false"
:textarea-value="updateSavedReply.content"
:markdown-docs-path="$options.markdownDocsPath"
:restricted-tool-bar-items="$options.restrictedToolbarItems"
:force-autosize="false"
class="js-no-autosize gl-border-gray-400!"
>
<template #textarea>
<textarea
v-model="updateSavedReply.content"
dir="auto"
class="note-textarea js-gfm-input js-autosize markdown-area"
data-supports-quick-actions="false"
:aria-label="__('Content')"
:placeholder="__('Write saved reply content here…')"
data-testid="saved-reply-content-input"
@keydown.meta.enter="onSubmit"
@keydown.ctrl.enter="onSubmit"
></textarea>
</template>
</markdown-field>
</gl-form-group>
<gl-button
variant="confirm"
class="gl-mr-3 js-no-auto-disable"
type="submit"
:loading="saving"
data-testid="saved-reply-form-submit-btn"
>
{{ __('Save') }}
</gl-button>
<gl-button v-if="id" :to="{ path: '/' }">{{ __('Cancel') }}</gl-button>
</gl-form>
</template>