diff --git a/app/controllers/api/v1/accounts/conversations_controller.rb b/app/controllers/api/v1/accounts/conversations_controller.rb index 8753918fc..041ff8af2 100644 --- a/app/controllers/api/v1/accounts/conversations_controller.rb +++ b/app/controllers/api/v1/accounts/conversations_controller.rb @@ -124,6 +124,11 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro @conversation.save! end + def destroy + ::DeleteObjectJob.perform_later(@conversation, Current.user, request.ip) + head :ok + end + private def permitted_update_params diff --git a/app/javascript/dashboard/api/inbox/conversation.js b/app/javascript/dashboard/api/inbox/conversation.js index 1a87e6d96..0f539bfa9 100644 --- a/app/javascript/dashboard/api/inbox/conversation.js +++ b/app/javascript/dashboard/api/inbox/conversation.js @@ -137,6 +137,10 @@ class ConversationApi extends ApiClient { getInboxAssistant(conversationId) { return axios.get(`${this.url}/${conversationId}/inbox_assistant`); } + + delete(conversationId) { + return axios.delete(`${this.url}/${conversationId}`); + } } export default new ConversationApi(); diff --git a/app/javascript/dashboard/components/ChatList.vue b/app/javascript/dashboard/components/ChatList.vue index 089d9e74f..9d6340e4c 100644 --- a/app/javascript/dashboard/components/ChatList.vue +++ b/app/javascript/dashboard/components/ChatList.vue @@ -703,6 +703,15 @@ async function markAsRead(conversationId) { // Ignore error } } + +async function deleteConversation(conversationId) { + try { + await store.dispatch('deleteConversation', conversationId); + useAlert(t('CONVERSATION.SUCCESS_DELETE_CONVERSATION')); + } catch (error) { + useAlert(t('CONVERSATION.FAIL_DELETE_CONVERSATION')); + } +} async function onAssignTeam(team, conversationId = null) { try { await store.dispatch('assignTeam', { @@ -775,6 +784,7 @@ provide('markAsUnread', markAsUnread); provide('markAsRead', markAsRead); provide('assignPriority', assignPriority); provide('isConversationSelected', isConversationSelected); +provide('deleteConversation', deleteConversation); watch(activeTeam, () => resetAndFetchData()); diff --git a/app/javascript/dashboard/components/ConversationItem.vue b/app/javascript/dashboard/components/ConversationItem.vue index dcdf46e7e..a705dd067 100644 --- a/app/javascript/dashboard/components/ConversationItem.vue +++ b/app/javascript/dashboard/components/ConversationItem.vue @@ -16,6 +16,7 @@ export default { 'markAsRead', 'assignPriority', 'isConversationSelected', + 'deleteConversation', ], props: { source: { @@ -67,5 +68,6 @@ export default { @mark-as-unread="markAsUnread" @mark-as-read="markAsRead" @assign-priority="assignPriority" + @delete-conversation="deleteConversation" /> diff --git a/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue b/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue index 698690dad..4840b459f 100644 --- a/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue +++ b/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue @@ -78,6 +78,7 @@ export default { 'markAsRead', 'assignPriority', 'updateConversationStatus', + 'deleteConversation', ], data() { return { @@ -237,6 +238,10 @@ export default { this.$emit('assignPriority', priority, this.chat.id); this.closeContextMenu(); }, + async deleteConversation() { + this.$emit('deleteConversation', this.chat.id); + this.closeContextMenu(); + }, }, }; @@ -363,6 +368,7 @@ export default { @mark-as-unread="markAsUnread" @mark-as-read="markAsRead" @assign-priority="assignPriority" + @delete-conversation="deleteConversation" /> diff --git a/app/javascript/dashboard/components/widgets/conversation/contextMenu/Index.vue b/app/javascript/dashboard/components/widgets/conversation/contextMenu/Index.vue index fccff3457..cce6609aa 100644 --- a/app/javascript/dashboard/components/widgets/conversation/contextMenu/Index.vue +++ b/app/javascript/dashboard/components/widgets/conversation/contextMenu/Index.vue @@ -45,6 +45,7 @@ export default { 'assignAgent', 'assignTeam', 'assignLabel', + 'deleteConversation', ], data() { return { @@ -121,6 +122,11 @@ export default { icon: 'people-team-add', label: this.$t('CONVERSATION.CARD_CONTEXT_MENU.ASSIGN_TEAM'), }, + deleteOption: { + key: 'delete', + icon: 'delete', + label: this.$t('CONVERSATION.CARD_CONTEXT_MENU.DELETE'), + }, }; }, computed: { @@ -178,6 +184,9 @@ export default { assignPriority(priority) { this.$emit('assignPriority', priority); }, + deleteConversation() { + this.$emit('deleteConversation'); + }, show(key) { // If the conversation status is same as the action, then don't display the option // i.e.: Don't show an option to resolve if the conversation is already resolved. @@ -277,5 +286,11 @@ export default { @click.stop="$emit('assignTeam', team)" /> +