From b116ab5ad3fb11a8b594eae5ff9a5b4aa844ef86 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Fri, 6 Dec 2024 09:46:29 +0530 Subject: [PATCH] feat(v4): Compose new conversation without multiple clicks (#10545) --------- Co-authored-by: Pranav Co-authored-by: Pranav --- .../Contacts/ContactsDetailsLayout.vue | 22 +- .../Contacts/ContactsForm/ContactsForm.vue | 6 +- .../Contacts/ContactsHeader/ContactHeader.vue | 19 +- .../components/ContactMoreActions.vue | 2 +- .../components/ContactSortMenu.vue | 2 +- .../NewConversation/ComposeConversation.vue | 209 +++++++++++++++ .../components/ActionButtons.vue | 11 +- .../components/ComposeNewConversationForm.vue | 12 +- .../components/ContactSelector.vue | 36 +-- .../components/InboxSelector.vue | 2 +- .../helpers/composeConversationHelper.js | 68 +++++ .../specs/composeConversationHelper.spec.js | 240 +++++++++++++++++- .../dropdown-menu/DropdownMenu.vue | 4 +- .../components-next/sidebar/Sidebar.vue | 34 ++- .../sidebar/SidebarProfileMenu.vue | 2 +- .../components-next/taginput/TagInput.vue | 6 +- .../layout/config/sidebarItems/contacts.js | 10 +- .../layout/config/sidebarItems/primaryMenu.js | 2 +- .../composables/spec/useFileUpload.spec.js | 146 +++++++++++ .../dashboard/composables/useFileUpload.js | 91 +++++++ .../dashboard/i18n/locale/en/components.json | 3 +- .../dashboard/i18n/locale/en/contact.json | 7 +- .../dashboard/routes/dashboard/Dashboard.vue | 1 - .../contacts/pages/ContactManageView.vue | 6 +- .../conversation/contact/ConversationForm.vue | 6 +- .../store/modules/contacts/actions.js | 4 +- 26 files changed, 850 insertions(+), 101 deletions(-) create mode 100644 app/javascript/dashboard/components-next/NewConversation/ComposeConversation.vue create mode 100644 app/javascript/dashboard/composables/spec/useFileUpload.spec.js create mode 100644 app/javascript/dashboard/composables/useFileUpload.js diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsDetailsLayout.vue b/app/javascript/dashboard/components-next/Contacts/ContactsDetailsLayout.vue index 34c31aac1..764f46141 100644 --- a/app/javascript/dashboard/components-next/Contacts/ContactsDetailsLayout.vue +++ b/app/javascript/dashboard/components-next/Contacts/ContactsDetailsLayout.vue @@ -2,24 +2,22 @@ import { computed, useSlots } from 'vue'; import { useI18n } from 'vue-i18n'; -// import Button from 'dashboard/components-next/button/Button.vue'; +import Button from 'dashboard/components-next/button/Button.vue'; import Breadcrumb from 'dashboard/components-next/breadcrumb/Breadcrumb.vue'; +import ComposeConversation from 'dashboard/components-next/NewConversation/ComposeConversation.vue'; const props = defineProps({ - // buttonLabel: { - // type: String, - // default: '', - // }, + buttonLabel: { + type: String, + default: '', + }, selectedContact: { type: Object, default: () => ({}), }, }); -const emit = defineEmits([ - // 'message', - 'goToContactsList', -]); +const emit = defineEmits(['goToContactsList']); const { t } = useI18n(); const slots = useSlots(); @@ -62,7 +60,11 @@ const handleBreadcrumbClick = () => { :items="breadcrumbItems" @click="handleBreadcrumbClick" /> - + + + diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsForm/ContactsForm.vue b/app/javascript/dashboard/components-next/Contacts/ContactsForm/ContactsForm.vue index b6b24ce26..a49236cb1 100644 --- a/app/javascript/dashboard/components-next/Contacts/ContactsForm/ContactsForm.vue +++ b/app/javascript/dashboard/components-next/Contacts/ContactsForm/ContactsForm.vue @@ -41,11 +41,11 @@ const FORM_CONFIG = { }; const SOCIAL_CONFIG = { - FACEBOOK: 'i-ri-facebook-circle-fill', - GITHUB: 'i-ri-github-fill', - INSTAGRAM: 'i-ri-instagram-line', LINKEDIN: 'i-ri-linkedin-box-fill', + FACEBOOK: 'i-ri-facebook-circle-fill', + INSTAGRAM: 'i-ri-instagram-line', TWITTER: 'i-ri-twitter-x-fill', + GITHUB: 'i-ri-github-fill', }; const defaultState = { diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsHeader/ContactHeader.vue b/app/javascript/dashboard/components-next/Contacts/ContactsHeader/ContactHeader.vue index 7e67c5629..44350bba1 100644 --- a/app/javascript/dashboard/components-next/Contacts/ContactsHeader/ContactHeader.vue +++ b/app/javascript/dashboard/components-next/Contacts/ContactsHeader/ContactHeader.vue @@ -4,6 +4,7 @@ import Input from 'dashboard/components-next/input/Input.vue'; import Icon from 'dashboard/components-next/icon/Icon.vue'; import ContactSortMenu from './components/ContactSortMenu.vue'; import ContactMoreActions from './components/ContactMoreActions.vue'; +import ComposeConversation from 'dashboard/components-next/NewConversation/ComposeConversation.vue'; defineProps({ showSearch: { @@ -18,10 +19,10 @@ defineProps({ type: String, required: true, }, - // buttonLabel: { - // type: String, - // default: '', - // }, + buttonLabel: { + type: String, + default: '', + }, activeSort: { type: String, default: 'last_activity_at', @@ -48,7 +49,6 @@ const emit = defineEmits([ 'search', 'filter', 'update:sort', - // 'message', 'add', 'import', 'export', @@ -131,9 +131,12 @@ const emit = defineEmits([ @export="emit('export')" /> - - - +
+ + +
diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsHeader/components/ContactMoreActions.vue b/app/javascript/dashboard/components-next/Contacts/ContactsHeader/components/ContactMoreActions.vue index c37a7854c..d5932535c 100644 --- a/app/javascript/dashboard/components-next/Contacts/ContactsHeader/components/ContactMoreActions.vue +++ b/app/javascript/dashboard/components-next/Contacts/ContactsHeader/components/ContactMoreActions.vue @@ -55,7 +55,7 @@ const handleContactAction = ({ action }) => { diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsHeader/components/ContactSortMenu.vue b/app/javascript/dashboard/components-next/Contacts/ContactsHeader/components/ContactSortMenu.vue index edf4bd70f..b263b882d 100644 --- a/app/javascript/dashboard/components-next/Contacts/ContactsHeader/components/ContactSortMenu.vue +++ b/app/javascript/dashboard/components-next/Contacts/ContactsHeader/components/ContactSortMenu.vue @@ -109,7 +109,7 @@ const handleOrderChange = value => {
diff --git a/app/javascript/dashboard/components-next/NewConversation/ComposeConversation.vue b/app/javascript/dashboard/components-next/NewConversation/ComposeConversation.vue new file mode 100644 index 000000000..347325b16 --- /dev/null +++ b/app/javascript/dashboard/components-next/NewConversation/ComposeConversation.vue @@ -0,0 +1,209 @@ + + + diff --git a/app/javascript/dashboard/components-next/NewConversation/components/ActionButtons.vue b/app/javascript/dashboard/components-next/NewConversation/components/ActionButtons.vue index e0b8817d8..89784037d 100644 --- a/app/javascript/dashboard/components-next/NewConversation/components/ActionButtons.vue +++ b/app/javascript/dashboard/components-next/NewConversation/components/ActionButtons.vue @@ -3,7 +3,7 @@ import { defineAsyncComponent, ref, computed } from 'vue'; import { useMapGetter } from 'dashboard/composables/store'; import { useI18n } from 'vue-i18n'; import { useUISettings } from 'dashboard/composables/useUISettings'; -// import { useFileUpload } from 'dashboard/composables/useFileUpload'; +import { useFileUpload } from 'dashboard/composables/useFileUpload'; import { vOnClickOutside } from '@vueuse/components'; import { ALLOWED_FILE_TYPES } from 'shared/constants/messages'; import { useKeyboardEvents } from 'dashboard/composables/useKeyboardEvents'; @@ -110,19 +110,10 @@ const onClickInsertEmoji = emoji => { emit('insertEmoji', emoji); }; -const useFileUpload = () => { - // Empty function for testing purposes - // TODO: Will use useFileUpload composable later - return { - onFileUpload: () => {}, - }; -}; - const { onFileUpload } = useFileUpload({ isATwilioSMSChannel: props.isTwilioSmsInbox, attachFile: ({ blob, file }) => { if (!file) return; - const reader = new FileReader(); reader.readAsDataURL(file.file); reader.onloadend = () => { diff --git a/app/javascript/dashboard/components-next/NewConversation/components/ComposeNewConversationForm.vue b/app/javascript/dashboard/components-next/NewConversation/components/ComposeNewConversationForm.vue index 7e72c7038..b1596ac04 100644 --- a/app/javascript/dashboard/components-next/NewConversation/components/ComposeNewConversationForm.vue +++ b/app/javascript/dashboard/components-next/NewConversation/components/ComposeNewConversationForm.vue @@ -141,7 +141,11 @@ const isAnyDropdownActive = computed(() => { }); const handleContactSearch = value => { - emit('searchContacts', value); + showContactsDropdown.value = true; + emit('searchContacts', { + keys: ['email', 'phone_number', 'name'], + query: value, + }); }; const handleDropdownUpdate = (type, value) => { @@ -156,12 +160,12 @@ const handleDropdownUpdate = (type, value) => { const searchCcEmails = value => { showCcEmailsDropdown.value = true; - emit('searchContacts', value); + emit('searchContacts', { keys: ['email'], query: value }); }; const searchBccEmails = value => { showBccEmailsDropdown.value = true; - emit('searchContacts', value); + emit('searchContacts', { keys: ['email'], query: value }); }; const setSelectedContact = async ({ value, action, ...rest }) => { @@ -250,7 +254,7 @@ const handleSendWhatsappMessage = async ({ message, templateParams }) => { - +