diff --git a/.env.example b/.env.example index befcde463..b7ba0920d 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 18162ee76..f3d050ab3 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/.github/workflows/lock.yml b/.github/workflows/lock.yml index c42909856..5420e829b 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -25,13 +25,5 @@ jobs: with: issue-inactive-days: '30' issue-lock-reason: 'resolved' - issue-comment: > - This issue has been automatically locked since there - has not been any recent activity after it was closed. - Please open a new issue for related bugs. pr-inactive-days: '30' pr-lock-reason: 'resolved' - pr-comment: > - This pull request has been automatically locked since there - has not been any recent activity after it was closed. - Please open a new issue for related bugs. diff --git a/.storybook/preview.js b/.storybook/preview.js index 3f98c2cd8..7c046d51a 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 f690e6876..a0624fee4 100644 --- a/Gemfile +++ b/Gemfile @@ -111,12 +111,12 @@ 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' +gem 'sidekiq', '>= 7.3.1' # We want cron jobs gem 'sidekiq-cron', '>= 1.12.0' @@ -228,7 +228,7 @@ group :development, :test do gem 'mock_redis' gem 'pry-rails' gem 'rspec_junit_formatter' - gem 'rspec-rails', '>= 6.1.3' + gem 'rspec-rails', '>= 6.1.4' gem 'rubocop', require: false gem 'rubocop-performance', require: false gem 'rubocop-rails', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 32f54c64d..06f479659 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -169,7 +169,7 @@ GEM climate_control (1.2.0) coderay (1.1.3) commonmarker (0.23.10) - concurrent-ruby (1.3.3) + concurrent-ruby (1.3.4) connection_pool (2.4.1) crack (1.0.0) bigdecimal @@ -230,7 +230,7 @@ GEM ruby2_keywords email_reply_trimmer (0.1.13) erubi (1.13.0) - et-orbi (1.2.7) + et-orbi (1.2.11) tzinfo execjs (2.8.1) facebook-messenger (2.0.1) @@ -268,8 +268,8 @@ GEM rake flag_shih_tzu (0.3.23) foreman (0.87.2) - fugit (1.9.0) - et-orbi (~> 1, >= 1.2.7) + fugit (1.11.1) + et-orbi (~> 1, >= 1.2.11) raabro (~> 1.4) gapic-common (0.18.0) faraday (>= 1.9, < 3.a) @@ -467,7 +467,7 @@ GEM mini_magick (4.12.0) mini_mime (1.1.5) mini_portile2 (2.8.7) - minitest (5.24.1) + minitest (5.25.1) mock_redis (0.36.0) ruby2_keywords msgpack (1.7.0) @@ -480,7 +480,7 @@ GEM uri net-http-persistent (4.0.2) connection_pool (~> 2.2) - net-imap (0.4.12) + net-imap (0.4.14) date net-protocol net-pop (0.1.2) @@ -634,7 +634,7 @@ GEM retriable (3.1.2) reverse_markdown (2.1.1) nokogiri - rexml (3.3.2) + rexml (3.3.6) strscan rspec-core (3.13.0) rspec-support (~> 3.13.0) @@ -644,7 +644,7 @@ GEM rspec-mocks (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (6.1.3) + rspec-rails (6.1.4) actionpack (>= 6.1) activesupport (>= 6.1) railties (>= 6.1) @@ -710,19 +710,19 @@ 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) activesupport (>= 5.2.0) - sidekiq (7.3.0) + sidekiq (7.3.1) concurrent-ruby (< 2) connection_pool (>= 2.3.0) logger @@ -796,7 +796,7 @@ GEM uniform_notifier (1.16.0) uri (0.13.0) uri_template (0.7.0) - valid_email2 (4.0.6) + valid_email2 (5.2.6) activemodel (>= 3.2) mail (~> 2.5) version_gem (1.1.4) @@ -930,7 +930,7 @@ DEPENDENCIES responders (>= 3.1.1) rest-client reverse_markdown - rspec-rails (>= 6.1.3) + rspec-rails (>= 6.1.4) rspec_junit_formatter rubocop rubocop-performance @@ -939,11 +939,11 @@ 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 (>= 7.3.1) sidekiq-cron (>= 1.12.0) simplecov (= 0.17.1) slack-ruby-client (~> 2.2.0) @@ -971,4 +971,4 @@ RUBY VERSION ruby 3.3.3p89 BUNDLED WITH - 2.5.14 + 2.5.16 diff --git a/app/builders/account_builder.rb b/app/builders/account_builder.rb index f179c6405..ff67eefc5 100644 --- a/app/builders/account_builder.rb +++ b/app/builders/account_builder.rb @@ -32,11 +32,13 @@ class AccountBuilder end def validate_email + raise InvalidEmail.new({ domain_blocked: domain_blocked }) if domain_blocked? + address = ValidEmail2::Address.new(@email) - if address.valid? # && !address.disposable? + if address.valid? && !address.disposable? true else - raise InvalidEmail.new(valid: address.valid?) + raise InvalidEmail.new({ valid: address.valid?, disposable: address.disposable? }) end end @@ -79,4 +81,21 @@ class AccountBuilder @user.confirm if @confirmed @user.save! end + + def domain_blocked? + domain = @email.split('@').last + + blocked_domains.each do |blocked_domain| + return true if domain.match?(blocked_domain) + end + + false + end + + def blocked_domains + domains = GlobalConfigService.load('BLOCKED_EMAIL_DOMAINS', '') + domains.split("\n").map(&:strip) if domains.present? + + [] + end end diff --git a/app/builders/messages/messenger/message_builder.rb b/app/builders/messages/messenger/message_builder.rb index 0739829aa..f01a236c9 100644 --- a/app/builders/messages/messenger/message_builder.rb +++ b/app/builders/messages/messenger/message_builder.rb @@ -27,7 +27,7 @@ class Messages::Messenger::MessageBuilder 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/agents_controller.rb b/app/controllers/api/v1/accounts/agents_controller.rb index 4eff10127..01aa42620 100644 --- a/app/controllers/api/v1/accounts/agents_controller.rb +++ b/app/controllers/api/v1/accounts/agents_controller.rb @@ -24,7 +24,7 @@ class Api::V1::Accounts::AgentsController < Api::V1::Accounts::BaseController def update @agent.update!(agent_params.slice(:name).compact) - @agent.current_account_user.update!(agent_params.slice(:role, :availability, :auto_offline).compact) + @agent.current_account_user.update!(agent_params.slice(*account_user_attributes).compact) end def destroy @@ -67,8 +67,16 @@ class Api::V1::Accounts::AgentsController < Api::V1::Accounts::BaseController @agent = agents.find(params[:id]) end + def account_user_attributes + [:role, :availability, :auto_offline] + end + + def allowed_agent_params + [:name, :email, :name, :role, :availability, :auto_offline] + end + def agent_params - params.require(:agent).permit(:name, :email, :name, :role, :availability, :auto_offline) + params.require(:agent).permit(allowed_agent_params) end def new_agent_params @@ -101,3 +109,5 @@ class Api::V1::Accounts::AgentsController < Api::V1::Accounts::BaseController DeleteObjectJob.perform_later(agent) if agent.reload.account_users.blank? end end + +Api::V1::Accounts::AgentsController.prepend_mod_with('Api::V1::Accounts::AgentsController') diff --git a/app/controllers/api/v1/accounts/integrations/apps_controller.rb b/app/controllers/api/v1/accounts/integrations/apps_controller.rb index 358a15d87..c2284bc2e 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 @@ class Api::V1::Accounts::Integrations::AppsController < Api::V1::Accounts::BaseC 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 000000000..7df0e61df --- /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/controllers/api/v1/accounts/integrations/hooks_controller.rb b/app/controllers/api/v1/accounts/integrations/hooks_controller.rb index d09ea2f00..087a9b78d 100644 --- a/app/controllers/api/v1/accounts/integrations/hooks_controller.rb +++ b/app/controllers/api/v1/accounts/integrations/hooks_controller.rb @@ -11,7 +11,17 @@ class Api::V1::Accounts::Integrations::HooksController < Api::V1::Accounts::Base end def process_event - render json: { message: @hook.process_event(params[:event]) } + response = @hook.process_event(params[:event]) + + # for cases like an invalid event, or when conversation does not have enough messages + # for a label suggestion, the response is nil + if response.nil? + render json: { message: nil } + elsif response[:error] + render json: { error: response[:error] }, status: :unprocessable_entity + else + render json: { message: response[:message] } + end end def destroy diff --git a/app/javascript/dashboard/App.vue b/app/javascript/dashboard/App.vue index c343fbe4f..da169d61f 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 2b816e603..975857ce1 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 4b33d5b10..1db97a306 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 97535bf0d..b5182bf87 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 87370185d..6fc0ee0d9 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 6cff70bd3..2322edbfb 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 d2df2bea3..cd7cf0ff1 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 d8f609e29..d8656da75 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 12b9124cf..732de3ced 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 76aaef3eb..dfba6b43e 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 9f99d5ba2..c2e6c48c3 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 980889122..c17c32e2a 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 df61e9de1..c5d1facee 100644 --- a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue +++ b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue @@ -1,106 +1,10 @@ - - + + diff --git a/app/javascript/dashboard/components/widgets/conversation/PriorityMark.vue b/app/javascript/dashboard/components/widgets/conversation/PriorityMark.vue index 3a0e2b63a..398dc013a 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 2726cea92..25268679a 100644 --- a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue +++ b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue @@ -1,159 +1,7 @@ - - + + + diff --git a/app/javascript/dashboard/components/widgets/conversation/VariableList.vue b/app/javascript/dashboard/components/widgets/conversation/VariableList.vue index 48b1dcea3..66ad8965d 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 7fe4a3321..21ed33b3d 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 5dcfd568a..52eb6eaa5 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 83c588da7..722d7680a 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 4e45508ee..e915aef44 100644 --- a/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue +++ b/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue @@ -1,112 +1,7 @@ - + + + + diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsAdvancedFilters.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsAdvancedFilters.vue index 6f5e92017..41c986d03 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('IMPORT_CONTACTS.BUTTON_LABEL') }} + + + + {{ $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 def668aca..6e536b555 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 531e9141e..8909a0376 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 820295b57..265baa485 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/ConversationParticipant.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/ConversationParticipant.vue @@ -1,87 +1,9 @@ - - + + + + diff --git a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue b/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue index 20bef48f6..3c127b857 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 df0d6d7ec..a5b2a7468 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/labels/LabelBox.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/labels/LabelBox.vue @@ -1,3 +1,83 @@ + + - - + diff --git a/app/javascript/dashboard/routes/dashboard/inbox/components/InboxNameAndId.vue b/app/javascript/dashboard/routes/dashboard/inbox/components/InboxNameAndId.vue index 0b0ef03ff..3e4a9d8a9 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 cddad0d58..5019d451d 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'); }; +