From 79daf56c311827b138a9f07e67a6269c52104486 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Fri, 22 Nov 2024 03:17:57 +0530 Subject: [PATCH 1/4] feat: Add contact note item component (#10479) --- .../components/ContactNoteItem.vue | 63 +++++++++++++++++ .../story/ContactNoteItem.story.vue | 39 +++++++++++ .../components/story/fixtures.js | 69 +++++++++++++++++++ .../dashboard/i18n/locale/en/contact.json | 9 +++ app/javascript/histoire.setup.ts | 3 + 5 files changed, 183 insertions(+) create mode 100644 app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/ContactNoteItem.vue create mode 100644 app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/story/ContactNoteItem.story.vue create mode 100644 app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/story/fixtures.js diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/ContactNoteItem.vue b/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/ContactNoteItem.vue new file mode 100644 index 000000000..81f7a147f --- /dev/null +++ b/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/ContactNoteItem.vue @@ -0,0 +1,63 @@ + + + + + + + + + + {{ writtenBy }} + {{ t('CONTACTS_LAYOUT.SIDEBAR.NOTES.WROTE') }} + {{ dynamicTime(note.createdAt) }} + + + + + + + + diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/story/ContactNoteItem.story.vue b/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/story/ContactNoteItem.story.vue new file mode 100644 index 000000000..0dbf8bf01 --- /dev/null +++ b/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/story/ContactNoteItem.story.vue @@ -0,0 +1,39 @@ + + + + + + + + + + + diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/story/fixtures.js b/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/story/fixtures.js new file mode 100644 index 000000000..440ad95df --- /dev/null +++ b/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/story/fixtures.js @@ -0,0 +1,69 @@ +export default [ + { + id: 12, + content: + 'This tutorial will show you how to use Chatwoot and, hence, ensure you practice effective customer communication. We will explain in detail the following:\n\n* Step-by-step setup of your account, with illustrative screenshots.\n\n* An in-depth explanation of all the core features of Chatwoot.\n\n* Get your account up and running by the end of this tutorial.\n\n* Basic concepts of customer communication.', + accountId: null, + contactId: null, + user: { + id: 30, + account_id: 2, + availability_status: 'offline', + auto_offline: true, + confirmed: true, + email: 'bruce@paperlayer.test', + available_name: 'Bruce', + name: 'Bruce', + role: 'administrator', + thumbnail: + 'https://sivin-tunnel.chatwoot.dev/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBJZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--515dbb35e9ba3c36d14f4c4b77220a675513c1fb/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCem9MWm05eWJXRjBTU0lJYW5CbkJqb0dSVlE2RTNKbGMybDZaVjkwYjE5bWFXeHNXd2RwQWZvdyIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--df796c2af3c0153e55236c2f3cf3a199ac2cb6f7/2.jpg', + custom_role_id: null, + }, + createdAt: 1730786556, + updatedAt: 1730786556, + }, + { + id: 10, + content: + 'We discussed a couple of things:\n\n* Product offering and how it can be useful to talk with people.\n\n* They’ll reach out to us after an internal review.', + accountId: null, + contactId: null, + user: { + id: 1, + account_id: 2, + availability_status: 'online', + auto_offline: false, + confirmed: true, + email: 'hillary@chatwoot.com', + available_name: 'Hillary', + name: 'Hillary', + role: 'administrator', + thumbnail: '', + custom_role_id: null, + }, + createdAt: 1730782566, + updatedAt: 1730782566, + }, + { + id: 9, + content: + 'We discussed a couple of things:\n\n* Product offering and how it can be useful to talk with people.\n\n* They’ll reach out to us after an internal review.', + accountId: null, + contactId: null, + user: { + id: 1, + account_id: 2, + availability_status: 'online', + auto_offline: false, + confirmed: true, + email: 'john@chatwoot.com', + available_name: 'John', + name: 'John', + role: 'administrator', + thumbnail: '', + custom_role_id: null, + }, + createdAt: 1730782564, + updatedAt: 1730782564, + }, +]; diff --git a/app/javascript/dashboard/i18n/locale/en/contact.json b/app/javascript/dashboard/i18n/locale/en/contact.json index e0483d224..5ac4fea21 100644 --- a/app/javascript/dashboard/i18n/locale/en/contact.json +++ b/app/javascript/dashboard/i18n/locale/en/contact.json @@ -440,6 +440,15 @@ } } } + }, + "SIDEBAR": { + "NOTES": { + "PLACEHOLDER": "Add a note", + "WROTE": "wrote", + "YOU": "You", + "SAVE": "Save note", + "EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above." + } } } } diff --git a/app/javascript/histoire.setup.ts b/app/javascript/histoire.setup.ts index 13a81608a..6b7358d59 100644 --- a/app/javascript/histoire.setup.ts +++ b/app/javascript/histoire.setup.ts @@ -4,6 +4,8 @@ import i18nMessages from 'dashboard/i18n'; import { createI18n } from 'vue-i18n'; import { vResizeObserver } from '@vueuse/components'; import store from 'dashboard/store'; +import VueDOMPurifyHTML from 'vue-dompurify-html'; +import { domPurifyConfig } from 'shared/helpers/HTMLSanitizer.js'; const i18n = createI18n({ legacy: false, // https://github.com/intlify/vue-i18n/issues/1902 @@ -15,4 +17,5 @@ export const setupVue3 = defineSetupVue3(({ app }) => { app.use(store); app.use(i18n); app.directive('resize', vResizeObserver); + app.use(VueDOMPurifyHTML, domPurifyConfig); }); From 497bc055a2bf24cf3e19762cbeac99fdb2b6db52 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 22 Nov 2024 03:18:25 +0530 Subject: [PATCH 2/4] feat: Attributify button component (#10473) This PR allows attributify for `variant`, `size` and `color` props. This allows using shorthands, instant of writing full props. We also added a small computed method to ensure these does not show up in the DOM and pollute it --------- Co-authored-by: Pranav --- .../components-next/button/Button.vue | 109 ++++++++++++------ .../components-next/button/constants.js | 15 +++ 2 files changed, 90 insertions(+), 34 deletions(-) create mode 100644 app/javascript/dashboard/components-next/button/constants.js diff --git a/app/javascript/dashboard/components-next/button/Button.vue b/app/javascript/dashboard/components-next/button/Button.vue index 02dcfad53..b174ca375 100644 --- a/app/javascript/dashboard/components-next/button/Button.vue +++ b/app/javascript/dashboard/components-next/button/Button.vue @@ -1,46 +1,85 @@ + + + + + + + {{ t('CONTACTS_LAYOUT.SIDEBAR.MERGE.PRIMARY') }} + + + {{ t('CONTACTS_LAYOUT.SIDEBAR.MERGE.PRIMARY_HELP_LABEL') }} + + + emit('update:primaryContactId', value)" + @search="query => emit('search', query)" + /> + + + + + + + + + + + {{ t('CONTACTS_LAYOUT.SIDEBAR.MERGE.PARENT') }} + + + {{ t('CONTACTS_LAYOUT.SIDEBAR.MERGE.PARENT_HELP_LABEL') }} + + + + + + + {{ selectedContact.name }} + + + {{ selectedContact.email }} + + + + + + diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsForm/story/ContactMergeForm.story.vue b/app/javascript/dashboard/components-next/Contacts/ContactsForm/story/ContactMergeForm.story.vue new file mode 100644 index 000000000..dbf22dadd --- /dev/null +++ b/app/javascript/dashboard/components-next/Contacts/ContactsForm/story/ContactMergeForm.story.vue @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsForm/story/ContactsForm.story.vue b/app/javascript/dashboard/components-next/Contacts/ContactsForm/story/ContactsForm.story.vue index 4be69380c..306df1df0 100644 --- a/app/javascript/dashboard/components-next/Contacts/ContactsForm/story/ContactsForm.story.vue +++ b/app/javascript/dashboard/components-next/Contacts/ContactsForm/story/ContactsForm.story.vue @@ -1,6 +1,6 @@ + + + + + + + {{ t('LABEL.TAG_BUTTON') }} + + + + + + + + + diff --git a/app/javascript/dashboard/components-next/Label/LabelItem.vue b/app/javascript/dashboard/components-next/Label/LabelItem.vue new file mode 100644 index 000000000..b96b9b368 --- /dev/null +++ b/app/javascript/dashboard/components-next/Label/LabelItem.vue @@ -0,0 +1,22 @@ + + + + + + + {{ label.title }} + + + diff --git a/app/javascript/dashboard/components-next/Label/story/AddLabel.story.vue b/app/javascript/dashboard/components-next/Label/story/AddLabel.story.vue new file mode 100644 index 000000000..ea6466feb --- /dev/null +++ b/app/javascript/dashboard/components-next/Label/story/AddLabel.story.vue @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/app/javascript/dashboard/components-next/Label/story/Label.story.vue b/app/javascript/dashboard/components-next/Label/story/Label.story.vue new file mode 100644 index 000000000..5319d56ae --- /dev/null +++ b/app/javascript/dashboard/components-next/Label/story/Label.story.vue @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/app/javascript/dashboard/components-next/Label/story/fixtures.js b/app/javascript/dashboard/components-next/Label/story/fixtures.js new file mode 100644 index 000000000..980ba8c0d --- /dev/null +++ b/app/javascript/dashboard/components-next/Label/story/fixtures.js @@ -0,0 +1,62 @@ +export const label = { + id: 1, + title: 'delivery', + color: '#A2FDD5', +}; + +export const labelMenuItems = [ + { + label: 'delivery', + value: 3, + thumbnail: { + color: '#A2FDD5', + }, + isSelected: true, + action: 'addLabel', + }, + { + label: 'lead', + value: 6, + thumbnail: { + color: '#F161C8', + }, + isSelected: false, + action: 'addLabel', + }, + { + label: 'ops-handover', + value: 4, + thumbnail: { + color: '#A53326', + }, + isSelected: false, + action: 'addLabel', + }, + { + label: 'billing', + value: 1, + thumbnail: { + color: '#28AD21', + }, + isSelected: false, + action: 'addLabel', + }, + { + label: 'premium-customer', + value: 5, + thumbnail: { + color: '#6FD4EF', + }, + isSelected: false, + action: 'addLabel', + }, + { + label: 'software', + value: 2, + thumbnail: { + color: '#8F6EF2', + }, + isSelected: false, + action: 'addLabel', + }, +]; diff --git a/app/javascript/dashboard/i18n/locale/en/components.json b/app/javascript/dashboard/i18n/locale/en/components.json index 7a0533cef..f5207fde9 100644 --- a/app/javascript/dashboard/i18n/locale/en/components.json +++ b/app/javascript/dashboard/i18n/locale/en/components.json @@ -30,5 +30,8 @@ }, "BREADCRUMB": { "ARIA_LABEL": "Breadcrumb" + }, + "LABEL": { + "TAG_BUTTON": "tag" } }