feat: Quickly create canned responses (#5563)

This commit is contained in:
Pranav Raj S 2022-10-05 22:00:15 -07:00 committed by GitHub
parent 0a9ea6e272
commit 788b766179
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 71 additions and 22 deletions

View file

@ -100,10 +100,11 @@
v-if="isBubble && !isMessageDeleted" v-if="isBubble && !isMessageDeleted"
:is-open="showContextMenu" :is-open="showContextMenu"
:show-copy="hasText" :show-copy="hasText"
:show-canned-response-option="isOutgoing"
:menu-position="contextMenuPosition" :menu-position="contextMenuPosition"
:message-content="data.content"
@toggle="handleContextMenuClick" @toggle="handleContextMenuClick"
@delete="handleDelete" @delete="handleDelete"
@copy="handleCopy"
/> />
</div> </div>
</li> </li>
@ -126,7 +127,6 @@ import alertMixin from 'shared/mixins/alertMixin';
import contentTypeMixin from 'shared/mixins/contentTypeMixin'; import contentTypeMixin from 'shared/mixins/contentTypeMixin';
import { MESSAGE_TYPE, MESSAGE_STATUS } from 'shared/constants/messages'; import { MESSAGE_TYPE, MESSAGE_STATUS } from 'shared/constants/messages';
import { generateBotMessageContent } from './helpers/botMessageContentHelper'; import { generateBotMessageContent } from './helpers/botMessageContentHelper';
import { copyTextToClipboard } from 'shared/helpers/clipboard';
export default { export default {
components: { components: {
@ -408,11 +408,6 @@ export default {
this.showAlert(this.$t('CONVERSATION.FAIL_DELETE_MESSSAGE')); this.showAlert(this.$t('CONVERSATION.FAIL_DELETE_MESSSAGE'));
} }
}, },
async handleCopy() {
await copyTextToClipboard(this.data.content);
this.showAlert(this.$t('CONTACT_PANEL.COPY_SUCCESSFUL'));
this.showContextMenu = false;
},
async retrySendMessage() { async retrySendMessage() {
await this.$store.dispatch('sendMessageWithData', this.data); await this.$store.dispatch('sendMessageWithData', this.data);
}, },

View file

@ -150,7 +150,8 @@
}, },
"CONTEXT_MENU": { "CONTEXT_MENU": {
"COPY": "Copy", "COPY": "Copy",
"DELETE": "Delete" "DELETE": "Delete",
"CREATE_A_CANNED_RESPONSE": "Add to canned responses"
} }
}, },
"EMAIL_TRANSCRIPT": { "EMAIL_TRANSCRIPT": {

View file

@ -1,5 +1,15 @@
<template> <template>
<div class="context-menu"> <div class="context-menu">
<woot-modal
v-if="isCannedResponseModalOpen && showCannedResponseOption"
:show.sync="isCannedResponseModalOpen"
:on-close="hideCannedResponseModal"
>
<add-canned-modal
:response-content="plainTextContent"
:on-close="hideCannedResponseModal"
/>
</woot-modal>
<woot-button <woot-button
icon="more-vertical" icon="more-vertical"
class="button--delete-message" class="button--delete-message"
@ -8,13 +18,24 @@
@click="handleContextMenuClick" @click="handleContextMenuClick"
/> />
<div <div
v-if="isOpen" v-if="isOpen && !isCannedResponseModalOpen"
v-on-clickaway="handleContextMenuClick" v-on-clickaway="handleContextMenuClick"
class="dropdown-pane dropdown-pane--open" class="dropdown-pane dropdown-pane--open"
:class="`dropdown-pane--${menuPosition}`" :class="`dropdown-pane--${menuPosition}`"
> >
<woot-dropdown-menu> <woot-dropdown-menu>
<woot-dropdown-item v-if="showCopy"> <woot-dropdown-item v-if="showCopy">
<woot-dropdown-item>
<woot-button
variant="clear"
color-scheme="alert"
size="small"
icon="delete"
@click="handleDelete"
>
{{ $t('CONVERSATION.CONTEXT_MENU.DELETE') }}
</woot-button>
</woot-dropdown-item>
<woot-button <woot-button
variant="clear" variant="clear"
size="small" size="small"
@ -24,15 +45,16 @@
{{ $t('CONVERSATION.CONTEXT_MENU.COPY') }} {{ $t('CONVERSATION.CONTEXT_MENU.COPY') }}
</woot-button> </woot-button>
</woot-dropdown-item> </woot-dropdown-item>
<woot-dropdown-item> <woot-dropdown-item>
<woot-button <woot-button
v-if="showCannedResponseOption"
variant="clear" variant="clear"
color-scheme="alert"
size="small" size="small"
icon="delete" icon="comment-add"
@click="handleDelete" @click="showCannedResponseModal"
> >
{{ $t('CONVERSATION.CONTEXT_MENU.DELETE') }} {{ $t('CONVERSATION.CONTEXT_MENU.CREATE_A_CANNED_RESPONSE') }}
</woot-button> </woot-button>
</woot-dropdown-item> </woot-dropdown-item>
</woot-dropdown-menu> </woot-dropdown-menu>
@ -40,18 +62,27 @@
</div> </div>
</template> </template>
<script> <script>
import alertMixin from 'shared/mixins/alertMixin';
import { mixin as clickaway } from 'vue-clickaway'; import { mixin as clickaway } from 'vue-clickaway';
import messageFormatterMixin from 'shared/mixins/messageFormatterMixin';
import AddCannedModal from 'dashboard/routes/dashboard/settings/canned/AddCanned';
import WootDropdownItem from 'shared/components/ui/dropdown/DropdownItem'; import WootDropdownItem from 'shared/components/ui/dropdown/DropdownItem';
import WootDropdownMenu from 'shared/components/ui/dropdown/DropdownMenu'; import WootDropdownMenu from 'shared/components/ui/dropdown/DropdownMenu';
import { copyTextToClipboard } from 'shared/helpers/clipboard';
export default { export default {
components: { components: {
AddCannedModal,
WootDropdownMenu, WootDropdownMenu,
WootDropdownItem, WootDropdownItem,
}, },
mixins: [clickaway], mixins: [alertMixin, clickaway, messageFormatterMixin],
props: { props: {
messageContent: {
type: String,
default: '',
},
isOpen: { isOpen: {
type: Boolean, type: Boolean,
default: false, default: false,
@ -64,22 +95,42 @@ export default {
type: String, type: String,
default: 'left', default: 'left',
}, },
showCannedResponseOption: {
type: Boolean,
default: true,
},
},
data() {
return { isCannedResponseModalOpen: false };
},
computed: {
plainTextContent() {
return this.getPlainText(this.messageContent);
},
}, },
methods: { methods: {
handleContextMenuClick() { handleContextMenuClick() {
this.$emit('toggle', !this.isOpen); this.$emit('toggle', !this.isOpen);
}, },
handleCopy() { async handleCopy() {
this.$emit('copy'); await copyTextToClipboard(this.plainTextContent);
this.showAlert(this.$t('CONTACT_PANEL.COPY_SUCCESSFUL'));
this.$emit('toggle', false);
}, },
handleDelete() { handleDelete() {
this.$emit('delete'); this.$emit('delete');
}, },
hideCannedResponseModal() {
this.isCannedResponseModalOpen = false;
this.$emit('toggle', false);
},
showCannedResponseModal() {
this.isCannedResponseModalOpen = true;
},
}, },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/* TDOD: Remove once MenuComponent supports postions */
.dropdown-pane { .dropdown-pane {
bottom: var(--space-medium); bottom: var(--space-medium);
} }

View file

@ -65,6 +65,10 @@ export default {
}, },
mixins: [alertMixin], mixins: [alertMixin],
props: { props: {
responseContent: {
type: String,
default: '',
},
onClose: { onClose: {
type: Function, type: Function,
default: () => {}, default: () => {},
@ -73,10 +77,7 @@ export default {
data() { data() {
return { return {
shortCode: '', shortCode: '',
content: '', content: this.responseContent || '',
vertical: 'bottom',
horizontal: 'center',
addCanned: { addCanned: {
showLoading: false, showLoading: false,
message: '', message: '',

View file

@ -157,5 +157,6 @@
], ],
"pane-close-outline": "M9.193 9.249a.75.75 0 0 1 1.059-.056l2.5 2.25a.75.75 0 0 1 0 1.114l-2.5 2.25a.75.75 0 0 1-1.004-1.115l1.048-.942H6.75a.75.75 0 1 1 0-1.5h3.546l-1.048-.942a.75.75 0 0 1-.055-1.06ZM22 17.25A2.75 2.75 0 0 1 19.25 20H4.75A2.75 2.75 0 0 1 2 17.25V6.75A2.75 2.75 0 0 1 4.75 4h14.5A2.75 2.75 0 0 1 22 6.75v10.5Zm-2.75 1.25c.69 0 1.25-.56 1.25-1.25V6.749c0-.69-.56-1.25-1.25-1.25h-3.254V18.5h3.254Zm-4.754 0V5.5H4.75c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h9.746Z", "pane-close-outline": "M9.193 9.249a.75.75 0 0 1 1.059-.056l2.5 2.25a.75.75 0 0 1 0 1.114l-2.5 2.25a.75.75 0 0 1-1.004-1.115l1.048-.942H6.75a.75.75 0 1 1 0-1.5h3.546l-1.048-.942a.75.75 0 0 1-.055-1.06ZM22 17.25A2.75 2.75 0 0 1 19.25 20H4.75A2.75 2.75 0 0 1 2 17.25V6.75A2.75 2.75 0 0 1 4.75 4h14.5A2.75 2.75 0 0 1 22 6.75v10.5Zm-2.75 1.25c.69 0 1.25-.56 1.25-1.25V6.749c0-.69-.56-1.25-1.25-1.25h-3.254V18.5h3.254Zm-4.754 0V5.5H4.75c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h9.746Z",
"chevron-left-solid": "M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z", "chevron-left-solid": "M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z",
"chevron-right-solid": "M8.293 4.293a1 1 0 0 0 0 1.414L14.586 12l-6.293 6.293a1 1 0 1 0 1.414 1.414l7-7a1 1 0 0 0 0-1.414l-7-7a1 1 0 0 0-1.414 0Z" "chevron-right-solid": "M8.293 4.293a1 1 0 0 0 0 1.414L14.586 12l-6.293 6.293a1 1 0 1 0 1.414 1.414l7-7a1 1 0 0 0 0-1.414l-7-7a1 1 0 0 0-1.414 0Z",
"comment-add-outline": "M12.022 3a6.473 6.473 0 0 0-.709 1.5H5.25A1.75 1.75 0 0 0 3.5 6.25v8.5c0 .966.784 1.75 1.75 1.75h2.249v3.75l5.015-3.75h6.236a1.75 1.75 0 0 0 1.75-1.75l.001-2.483a6.517 6.517 0 0 0 1.5-1.077L22 14.75A3.25 3.25 0 0 1 18.75 18h-5.738L8 21.75a1.25 1.25 0 0 1-1.999-1V18h-.75A3.25 3.25 0 0 1 2 14.75v-8.5A3.25 3.25 0 0 1 5.25 3h6.772ZM17.5 1a5.5 5.5 0 1 1 0 11 5.5 5.5 0 0 1 0-11Zm0 1.5-.09.008a.5.5 0 0 0-.402.402L17 3l-.001 3H14l-.09.008a.5.5 0 0 0-.402.402l-.008.09.008.09a.5.5 0 0 0 .402.402L14 7h2.999L17 10l.008.09a.5.5 0 0 0 .402.402l.09.008.09-.008a.5.5 0 0 0 .402-.402L18 10l-.001-3H21l.09-.008a.5.5 0 0 0 .402-.402l.008-.09-.008-.09a.5.5 0 0 0-.402-.402L21 6h-3.001L18 3l-.008-.09a.5.5 0 0 0-.402-.402L17.5 2.5Z"
} }