diff --git a/.env.example b/.env.example index befcde46388d0..b7ba0920d0dda 100644 --- a/.env.example +++ b/.env.example @@ -257,3 +257,4 @@ AZURE_APP_SECRET= # Set to true if you want to remove stale contact inboxes # contact_inboxes with no conversation older than 90 days will be removed # REMOVE_STALE_CONTACT_INBOX_JOB_STATUS=false + diff --git a/.eslintrc.js b/.eslintrc.js index 18162ee762a06..f3d050ab31223 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -27,6 +27,160 @@ module.exports = { 'import/no-unresolved': 'off', 'vue/html-indent': 'off', 'vue/multi-word-component-names': 'off', + 'vue/next-tick-style': ['error', 'callback'], + 'vue/block-order': [ + 'error', + { + order: ['script', 'template', 'style'], + }, + ], + 'vue/component-name-in-template-casing': [ + 'error', + 'PascalCase', + { + registeredComponentsOnly: true, + }, + ], + 'vue/component-options-name-casing': ['error', 'PascalCase'], + 'vue/custom-event-name-casing': ['error', 'camelCase'], + 'vue/define-emits-declaration': ['error'], + 'vue/define-macros-order': [ + 'error', + { + order: ['defineProps', 'defineEmits'], + defineExposeLast: false, + }, + ], + 'vue/define-props-declaration': ['error', 'runtime'], + 'vue/match-component-import-name': ['error'], + 'vue/no-bare-strings-in-template': [ + 'error', + { + allowlist: [ + '(', + ')', + ',', + '.', + '&', + '+', + '-', + '=', + '*', + '/', + '#', + '%', + '!', + '?', + ':', + '[', + ']', + '{', + '}', + '<', + '>', + '⌘', + '📄', + '🎉', + '💬', + '👥', + '📥', + '🔖', + '❌', + '✅', + '\u00b7', + '\u2022', + '\u2010', + '\u2013', + '\u2014', + '\u2212', + '|', + ], + attributes: { + '/.+/': [ + 'title', + 'aria-label', + 'aria-placeholder', + 'aria-roledescription', + 'aria-valuetext', + ], + input: ['placeholder'], + }, + directives: ['v-text'], + }, + ], + 'vue/no-empty-component-block': 'error', + 'vue/no-multiple-objects-in-class': 'error', + 'vue/no-root-v-if': 'warn', + 'vue/no-static-inline-styles': [ + 'error', + { + allowBinding: false, + }, + ], + 'vue/no-template-target-blank': [ + 'error', + { + allowReferrer: false, + enforceDynamicLinks: 'always', + }, + ], + 'vue/no-required-prop-with-default': [ + 'error', + { + autofix: false, + }, + ], + 'vue/no-this-in-before-route-enter': 'error', + 'vue/no-undef-components': [ + 'error', + { + ignorePatterns: [ + '^woot-', + '^fluent-', + '^multiselect', + '^router-link', + '^router-view', + '^ninja-keys', + '^FormulateForm', + '^FormulateInput', + '^highlightjs', + ], + }, + ], + 'vue/no-unused-emit-declarations': 'error', + 'vue/no-unused-refs': 'error', + 'vue/no-use-v-else-with-v-for': 'error', + 'vue/prefer-true-attribute-shorthand': 'error', + 'vue/no-useless-v-bind': [ + 'error', + { + ignoreIncludesComment: false, + ignoreStringEscape: false, + }, + ], + 'vue/no-v-text': 'error', + 'vue/padding-line-between-blocks': ['error', 'always'], + 'vue/prefer-separate-static-class': 'error', + 'vue/require-explicit-slots': 'error', + 'vue/require-macro-variable-name': [ + 'error', + { + defineProps: 'props', + defineEmits: 'emit', + defineSlots: 'slots', + useSlots: 'slots', + useAttrs: 'attrs', + }, + ], + 'vue/no-unused-properties': [ + 'error', + { + groups: ['props'], + deepData: false, + ignorePublicMembers: false, + unreferencedOptions: [], + }, + ], 'vue/max-attributes-per-line': [ 'error', { diff --git a/.storybook/preview.js b/.storybook/preview.js index 3f98c2cd87d36..7c046d51a3881 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -2,7 +2,6 @@ import { addDecorator } from '@storybook/vue'; import Vue from 'vue'; import Vuex from 'vuex'; import VueI18n from 'vue-i18n'; -import Vuelidate from 'vuelidate'; import Multiselect from 'vue-multiselect'; import VueDOMPurifyHTML from 'vue-dompurify-html'; import FluentIcon from 'shared/components/FluentIcon/DashboardIcon'; @@ -14,7 +13,6 @@ import { domPurifyConfig } from 'shared/helpers/HTMLSanitizer'; import '../app/javascript/dashboard/assets/scss/storybook.scss'; Vue.use(VueI18n); -Vue.use(Vuelidate); Vue.use(WootUiKit); Vue.use(Vuex); Vue.use(VueDOMPurifyHTML, domPurifyConfig); @@ -32,7 +30,7 @@ addDecorator(() => ({ template: '', i18n: i18nConfig, store, - beforeCreate: function() { + beforeCreate: function () { this.$root._i18n = this.$i18n; }, })); diff --git a/Gemfile b/Gemfile index f690e6876d61f..e377866f7f5a3 100644 --- a/Gemfile +++ b/Gemfile @@ -111,9 +111,9 @@ gem 'elastic-apm', require: false gem 'newrelic_rpm', require: false gem 'newrelic-sidekiq-metrics', '>= 1.6.2', require: false gem 'scout_apm', require: false -gem 'sentry-rails', '>= 5.18.1', require: false +gem 'sentry-rails', '>= 5.19.0', require: false gem 'sentry-ruby', require: false -gem 'sentry-sidekiq', '>= 5.18.1', require: false +gem 'sentry-sidekiq', '>= 5.19.0', require: false ##-- background job processing --## gem 'sidekiq', '>= 7.3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 91d3b3d8b6ad3..19f6e76c3e35a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -103,8 +103,8 @@ GEM tzinfo (~> 2.0) acts-as-taggable-on (9.0.1) activerecord (>= 6.0, < 7.1) - addressable (2.8.4) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) administrate (0.20.1) actionpack (>= 6.0, < 8.0) actionview (>= 6.0, < 8.0) @@ -171,7 +171,8 @@ GEM commonmarker (0.23.10) concurrent-ruby (1.3.3) connection_pool (2.4.1) - crack (0.4.5) + crack (1.0.0) + bigdecimal rexml crass (1.0.6) csv (3.3.0) @@ -358,7 +359,7 @@ GEM ruby2ruby (~> 2.4) ruby_parser (~> 3.10) hana (1.3.7) - hashdiff (1.0.1) + hashdiff (1.1.0) hashie (5.0.0) http (5.1.1) addressable (~> 2.8) @@ -550,7 +551,7 @@ GEM method_source (~> 1.0) pry-rails (0.3.9) pry (>= 0.10.4) - public_suffix (5.0.1) + public_suffix (6.0.0) puma (6.4.2) nio4r (~> 2.0) pundit (2.3.0) @@ -633,8 +634,8 @@ GEM retriable (3.1.2) reverse_markdown (2.1.1) nokogiri - rexml (3.2.8) - strscan (>= 3.0.9) + rexml (3.3.4) + strscan rspec-core (3.13.0) rspec-support (~> 3.13.0) rspec-expectations (3.13.1) @@ -709,14 +710,14 @@ GEM activesupport (>= 4) selectize-rails (0.12.6) semantic_range (3.0.0) - sentry-rails (5.18.1) + sentry-rails (5.19.0) railties (>= 5.0) - sentry-ruby (~> 5.18.1) - sentry-ruby (5.18.1) + sentry-ruby (~> 5.19.0) + sentry-ruby (5.19.0) bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) - sentry-sidekiq (5.18.1) - sentry-ruby (~> 5.18.1) + sentry-sidekiq (5.19.0) + sentry-ruby (~> 5.19.0) sidekiq (>= 3.0) sexp_processor (4.17.0) shoulda-matchers (5.3.0) @@ -809,7 +810,7 @@ GEM web-push (3.0.1) jwt (~> 2.0) openssl (~> 3.0) - webmock (3.18.1) + webmock (3.23.1) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -938,9 +939,9 @@ DEPENDENCIES scout_apm scss_lint seed_dump - sentry-rails (>= 5.18.1) + sentry-rails (>= 5.19.0) sentry-ruby - sentry-sidekiq (>= 5.18.1) + sentry-sidekiq (>= 5.19.0) shoulda-matchers sidekiq (>= 7.3.0) sidekiq-cron (>= 1.12.0) @@ -970,4 +971,4 @@ RUBY VERSION ruby 3.3.3p89 BUNDLED WITH - 2.5.14 + 2.5.16 diff --git a/app/builders/messages/messenger/message_builder.rb b/app/builders/messages/messenger/message_builder.rb index 0739829aa3588..f01a236c91505 100644 --- a/app/builders/messages/messenger/message_builder.rb +++ b/app/builders/messages/messenger/message_builder.rb @@ -27,7 +27,7 @@ def attachment_params(attachment) file_type = attachment['type'].to_sym params = { file_type: file_type, account_id: @message.account_id } - if [:image, :file, :audio, :video, :share, :story_mention].include? file_type + if [:image, :file, :audio, :video, :share, :story_mention, :ig_reel].include? file_type params.merge!(file_type_params(attachment)) elsif file_type == :location params.merge!(location_params(attachment)) diff --git a/app/controllers/api/v1/accounts/integrations/apps_controller.rb b/app/controllers/api/v1/accounts/integrations/apps_controller.rb index 358a15d87d381..c2284bc2edcd4 100644 --- a/app/controllers/api/v1/accounts/integrations/apps_controller.rb +++ b/app/controllers/api/v1/accounts/integrations/apps_controller.rb @@ -10,7 +10,7 @@ def show; end private def fetch_apps - @apps = Integrations::App.all.select(&:active?) + @apps = Integrations::App.all.select { |app| app.active?(Current.account) } end def fetch_app diff --git a/app/controllers/api/v1/accounts/integrations/captain_controller.rb b/app/controllers/api/v1/accounts/integrations/captain_controller.rb new file mode 100644 index 0000000000000..7df0e61df9194 --- /dev/null +++ b/app/controllers/api/v1/accounts/integrations/captain_controller.rb @@ -0,0 +1,22 @@ +class Api::V1::Accounts::Integrations::CaptainController < Api::V1::Accounts::BaseController + before_action :check_admin_authorization? + before_action :fetch_hook + + def sso_url + params_string = + "token=#{URI.encode_www_form_component(@hook['settings']['access_token'])}" \ + "&email=#{URI.encode_www_form_component(@hook['settings']['account_email'])}" \ + "&account_id=#{URI.encode_www_form_component(@hook['settings']['account_id'])}" + + installation_config = InstallationConfig.find_by(name: 'CAPTAIN_APP_URL') + + sso_url = "#{installation_config.value}/sso?#{params_string}" + render json: { sso_url: sso_url }, status: :ok + end + + private + + def fetch_hook + @hook = Current.account.hooks.find_by!(app_id: 'captain') + end +end diff --git a/app/javascript/dashboard/App.vue b/app/javascript/dashboard/App.vue index c343fbe4f69fc..da169d61f2ae3 100644 --- a/app/javascript/dashboard/App.vue +++ b/app/javascript/dashboard/App.vue @@ -1,30 +1,3 @@ - - + + diff --git a/app/javascript/dashboard/api/integrations.js b/app/javascript/dashboard/api/integrations.js index 2b816e6037b85..975857ce10f53 100644 --- a/app/javascript/dashboard/api/integrations.js +++ b/app/javascript/dashboard/api/integrations.js @@ -32,6 +32,10 @@ class IntegrationsAPI extends ApiClient { deleteHook(hookId) { return axios.delete(`${this.baseUrl()}/integrations/hooks/${hookId}`); } + + fetchCaptainURL() { + return axios.get(`${this.baseUrl()}/integrations/captain/sso_url`); + } } export default new IntegrationsAPI(); diff --git a/app/javascript/dashboard/assets/scss/_woot.scss b/app/javascript/dashboard/assets/scss/_woot.scss index 4b33d5b10c240..1db97a306911b 100644 --- a/app/javascript/dashboard/assets/scss/_woot.scss +++ b/app/javascript/dashboard/assets/scss/_woot.scss @@ -3,6 +3,9 @@ @import 'tailwindcss/utilities'; @import 'shared/assets/fonts/plus-jakarta'; +@import 'shared/assets/fonts/InterDisplay/inter-display'; +@import 'shared/assets/fonts/inter'; + @import 'shared/assets/stylesheets/animations'; @import 'shared/assets/stylesheets/colors'; @import 'shared/assets/stylesheets/spacing'; @@ -42,6 +45,7 @@ } @layer base { + // scss-lint:disable PropertySortOrder :root { --color-amber-25: 254 253 251; @@ -213,6 +217,7 @@ --color-orange-800: 204 78 0; --color-orange-900: 88 45 29; } + // scss-lint:disable QualifyingElement body.dark { --color-amber-25: 31 19 0; diff --git a/app/javascript/dashboard/assets/scss/widgets/_woot-tables.scss b/app/javascript/dashboard/assets/scss/widgets/_woot-tables.scss index 97535bf0d3c50..b5182bf8753d4 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_woot-tables.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_woot-tables.scss @@ -1,6 +1,10 @@ table { @apply border-spacing-0 text-sm w-full; + +} + +.woot-table { thead { th { @apply font-semibold tracking-[1px] text-left px-2.5 uppercase text-slate-900 dark:text-slate-200; @@ -16,9 +20,7 @@ table { @apply p-2.5 text-slate-700 dark:text-slate-100; } } -} -.woot-table { tr { .show-if-hover { transition: opacity 0.2s $swift-ease-out-function; diff --git a/app/javascript/dashboard/components/Accordion/AccordionItem.vue b/app/javascript/dashboard/components/Accordion/AccordionItem.vue index 87370185d2a94..6fc0ee0d904ce 100644 --- a/app/javascript/dashboard/components/Accordion/AccordionItem.vue +++ b/app/javascript/dashboard/components/Accordion/AccordionItem.vue @@ -1,35 +1,3 @@ - - + + diff --git a/app/javascript/dashboard/components/ChannelSelector.vue b/app/javascript/dashboard/components/ChannelSelector.vue index 6cff70bd3f4b2..2322edbfbac1e 100644 --- a/app/javascript/dashboard/components/ChannelSelector.vue +++ b/app/javascript/dashboard/components/ChannelSelector.vue @@ -1,17 +1,3 @@ - - + + diff --git a/app/javascript/dashboard/components/ChatListHeader.vue b/app/javascript/dashboard/components/ChatListHeader.vue index d2df2bea34fbb..cd7cf0ff16806 100644 --- a/app/javascript/dashboard/components/ChatListHeader.vue +++ b/app/javascript/dashboard/components/ChatListHeader.vue @@ -21,16 +21,16 @@ const props = defineProps({ }, }); -const emits = defineEmits([ - 'add-folders', - 'delete-folders', - 'reset-filters', - 'basic-filter-change', - 'filters-modal', +const emit = defineEmits([ + 'addFolders', + 'deleteFolders', + 'resetFilters', + 'basicFilterChange', + 'filtersModal', ]); const onBasicFilterChange = (value, type) => { - emits('basic-filter-change', value, type); + emit('basicFilterChange', value, type); }; const hasAppliedFiltersOrActiveFolders = computed(() => { @@ -68,7 +68,7 @@ const hasAppliedFiltersOrActiveFolders = computed(() => { variant="smooth" color-scheme="secondary" icon="save" - @click="emits('add-folders')" + @click="emit('addFolders')" /> { variant="smooth" color-scheme="alert" icon="dismiss-circle" - @click="emits('reset-filters')" + @click="emit('resetFilters')" />
@@ -86,7 +86,7 @@ const hasAppliedFiltersOrActiveFolders = computed(() => { variant="smooth" color-scheme="secondary" icon="edit" - @click="emits('filters-modal')" + @click="emit('filtersModal')" /> { variant="smooth" color-scheme="alert" icon="delete" - @click="emits('delete-folders')" + @click="emit('deleteFolders')" />
{ color-scheme="secondary" icon="filter" size="tiny" - @click="emits('filters-modal')" + @click="emit('filtersModal')" /> - diff --git a/app/javascript/dashboard/components/Code.vue b/app/javascript/dashboard/components/Code.vue index d8f609e29cb14..d8656da75c801 100644 --- a/app/javascript/dashboard/components/Code.vue +++ b/app/javascript/dashboard/components/Code.vue @@ -1,34 +1,9 @@ - - + + diff --git a/app/javascript/dashboard/components/widgets/ColorPicker.vue b/app/javascript/dashboard/components/widgets/ColorPicker.vue index 12b9124cfb74a..732de3ced4db7 100644 --- a/app/javascript/dashboard/components/widgets/ColorPicker.vue +++ b/app/javascript/dashboard/components/widgets/ColorPicker.vue @@ -1,21 +1,3 @@ - - + + diff --git a/app/javascript/dashboard/components/widgets/LoadingState.vue b/app/javascript/dashboard/components/widgets/LoadingState.vue index 76aaef3eb6bdc..dfba6b43e6344 100644 --- a/app/javascript/dashboard/components/widgets/LoadingState.vue +++ b/app/javascript/dashboard/components/widgets/LoadingState.vue @@ -1,3 +1,11 @@ + + - diff --git a/app/javascript/dashboard/components/widgets/SettingIntroBanner.vue b/app/javascript/dashboard/components/widgets/SettingIntroBanner.vue index 9f99d5ba28424..c2e6c48c32b02 100644 --- a/app/javascript/dashboard/components/widgets/SettingIntroBanner.vue +++ b/app/javascript/dashboard/components/widgets/SettingIntroBanner.vue @@ -1,3 +1,18 @@ + + - - diff --git a/app/javascript/dashboard/components/widgets/ShowMore.vue b/app/javascript/dashboard/components/widgets/ShowMore.vue index 9808891226c0a..c17c32e2a9bd6 100644 --- a/app/javascript/dashboard/components/widgets/ShowMore.vue +++ b/app/javascript/dashboard/components/widgets/ShowMore.vue @@ -1,15 +1,3 @@ - + + + diff --git a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue index df61e9de14075..44c58ac9d8950 100644 --- a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue +++ b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue @@ -1,106 +1,9 @@ - - + + diff --git a/app/javascript/dashboard/components/widgets/conversation/PriorityMark.vue b/app/javascript/dashboard/components/widgets/conversation/PriorityMark.vue index 3a0e2b63aa937..398dc013a09be 100644 --- a/app/javascript/dashboard/components/widgets/conversation/PriorityMark.vue +++ b/app/javascript/dashboard/components/widgets/conversation/PriorityMark.vue @@ -1,27 +1,3 @@ - - + + diff --git a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue index 2726cea921b6c..1a901d4493c1c 100644 --- a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue +++ b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue @@ -1,159 +1,7 @@ - - + + +}); + +const onHover = index => { + selectedIndex.value = index; +}; + +const onAgentSelect = index => { + selectedIndex.value = index; + onSelect(); +}; + + + diff --git a/app/javascript/dashboard/components/widgets/conversation/VariableList.vue b/app/javascript/dashboard/components/widgets/conversation/VariableList.vue index 48b1dcea33421..66ad8965dc948 100644 --- a/app/javascript/dashboard/components/widgets/conversation/VariableList.vue +++ b/app/javascript/dashboard/components/widgets/conversation/VariableList.vue @@ -1,19 +1,3 @@ - - + + + + + + diff --git a/app/javascript/dashboard/modules/contact/components/AddCustomAttribute.vue b/app/javascript/dashboard/modules/contact/components/AddCustomAttribute.vue index 7fe4a3321ff1f..21ed33b3db8d8 100644 --- a/app/javascript/dashboard/modules/contact/components/AddCustomAttribute.vue +++ b/app/javascript/dashboard/modules/contact/components/AddCustomAttribute.vue @@ -1,51 +1,12 @@ - - - + + + diff --git a/app/javascript/dashboard/modules/contact/components/ContactAttribute.vue b/app/javascript/dashboard/modules/contact/components/ContactAttribute.vue index 5dcfd568a49dd..52eb6eaa5635f 100644 --- a/app/javascript/dashboard/modules/contact/components/ContactAttribute.vue +++ b/app/javascript/dashboard/modules/contact/components/ContactAttribute.vue @@ -1,9 +1,47 @@ + + - - diff --git a/app/javascript/dashboard/modules/contact/components/MergeContactSummary.vue b/app/javascript/dashboard/modules/contact/components/MergeContactSummary.vue index 83c588da7d063..722d7680a7d89 100644 --- a/app/javascript/dashboard/modules/contact/components/MergeContactSummary.vue +++ b/app/javascript/dashboard/modules/contact/components/MergeContactSummary.vue @@ -1,3 +1,18 @@ + + - - diff --git a/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue b/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue index 4e45508eea28a..298b439da3c8d 100644 --- a/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue +++ b/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue @@ -1,110 +1,5 @@ - + + + + diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsAdvancedFilters.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsAdvancedFilters.vue index 6f5e92017d5bf..41c986d03f862 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsAdvancedFilters.vue +++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsAdvancedFilters.vue @@ -1,96 +1,5 @@ - - + + + + + {{ $t('EXPORT_CONTACTS.BUTTON_LABEL') }} + + + + + + + diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ImportContacts.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ImportContacts.vue index def668aca6dc5..6e536b555990d 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/components/ImportContacts.vue +++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ImportContacts.vue @@ -1,57 +1,13 @@ - - + + diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ReminderItem.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ReminderItem.vue index 531e9141e5570..8909a03766678 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/components/ReminderItem.vue +++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ReminderItem.vue @@ -1,3 +1,42 @@ + + - - diff --git a/app/javascript/dashboard/routes/dashboard/conversation/ConversationParticipant.vue b/app/javascript/dashboard/routes/dashboard/conversation/ConversationParticipant.vue index 820295b57ca5a..f59f69b87fe52 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/ConversationParticipant.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/ConversationParticipant.vue @@ -1,85 +1,6 @@ - - + + + + diff --git a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue b/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue index 20bef48f629fb..3c127b857cc90 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue @@ -1,6 +1,188 @@ + + + - - - - diff --git a/app/javascript/dashboard/routes/dashboard/conversation/labels/LabelBox.vue b/app/javascript/dashboard/routes/dashboard/conversation/labels/LabelBox.vue index df0d6d7ec9186..942ba115cc4a6 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/labels/LabelBox.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/labels/LabelBox.vue @@ -1,5 +1,87 @@ + + - - + diff --git a/app/javascript/dashboard/routes/dashboard/inbox/components/InboxNameAndId.vue b/app/javascript/dashboard/routes/dashboard/inbox/components/InboxNameAndId.vue index 0b0ef03ff71a9..3e4a9d8a9bbac 100644 --- a/app/javascript/dashboard/routes/dashboard/inbox/components/InboxNameAndId.vue +++ b/app/javascript/dashboard/routes/dashboard/inbox/components/InboxNameAndId.vue @@ -21,6 +21,7 @@ export default { }, }; + - + + diff --git a/app/javascript/dashboard/routes/dashboard/inbox/components/MenuItem.vue b/app/javascript/dashboard/routes/dashboard/inbox/components/MenuItem.vue index cddad0d587a53..5019d451de004 100644 --- a/app/javascript/dashboard/routes/dashboard/inbox/components/MenuItem.vue +++ b/app/javascript/dashboard/routes/dashboard/inbox/components/MenuItem.vue @@ -6,16 +6,17 @@ defineProps({ }, }); -const emits = defineEmits(['click']); +const emit = defineEmits(['click']); const onMenuItemClick = () => { - emits('click'); + emit('click'); }; +