diff --git a/Gemfile b/Gemfile index f690e6876..7d34ffda0 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.18.2', require: false gem 'sentry-ruby', require: false -gem 'sentry-sidekiq', '>= 5.18.1', require: false +gem 'sentry-sidekiq', '>= 5.18.2', require: false ##-- background job processing --## gem 'sidekiq', '>= 7.3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 42a4bbd85..be6a33af0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -710,14 +710,14 @@ GEM activesupport (>= 4) selectize-rails (0.12.6) semantic_range (3.0.0) - sentry-rails (5.18.1) + sentry-rails (5.18.2) railties (>= 5.0) - sentry-ruby (~> 5.18.1) - sentry-ruby (5.18.1) + sentry-ruby (~> 5.18.2) + sentry-ruby (5.18.2) bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) - sentry-sidekiq (5.18.1) - sentry-ruby (~> 5.18.1) + sentry-sidekiq (5.18.2) + sentry-ruby (~> 5.18.2) sidekiq (>= 3.0) sexp_processor (4.17.0) shoulda-matchers (5.3.0) @@ -939,9 +939,9 @@ DEPENDENCIES scout_apm scss_lint seed_dump - sentry-rails (>= 5.18.1) + sentry-rails (>= 5.18.2) sentry-ruby - sentry-sidekiq (>= 5.18.1) + sentry-sidekiq (>= 5.18.2) shoulda-matchers sidekiq (>= 7.3.0) sidekiq-cron (>= 1.12.0) 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/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/components/CustomBrandPolicyWrapper.vue b/app/javascript/dashboard/components/CustomBrandPolicyWrapper.vue new file mode 100644 index 000000000..b07b24657 --- /dev/null +++ b/app/javascript/dashboard/components/CustomBrandPolicyWrapper.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js b/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js index f7d63f6a1..390e8effa 100644 --- a/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js +++ b/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js @@ -163,17 +163,6 @@ const settings = accountId => ({ permissions: ['administrator'], }, toState: frontendURL(`accounts/${accountId}/settings/integrations`), - toStateName: 'settings_integrations', - featureFlag: FEATURE_FLAGS.INTEGRATIONS, - }, - { - icon: 'star-emphasis', - label: 'APPLICATIONS', - hasSubMenu: false, - meta: { - permissions: ['administrator'], - }, - toState: frontendURL(`accounts/${accountId}/settings/applications`), toStateName: 'settings_applications', featureFlag: FEATURE_FLAGS.INTEGRATIONS, }, diff --git a/app/javascript/dashboard/components/widgets/conversation/Message.vue b/app/javascript/dashboard/components/widgets/conversation/Message.vue index dca0c48fe..b7b578cee 100644 --- a/app/javascript/dashboard/components/widgets/conversation/Message.vue +++ b/app/javascript/dashboard/components/widgets/conversation/Message.vue @@ -501,7 +501,9 @@ export default { }, methods: { isAttachmentImageVideoAudio(fileType) { - return ['image', 'audio', 'video', 'story_mention'].includes(fileType); + return ['image', 'audio', 'video', 'story_mention', 'ig_reel'].includes( + fileType + ); }, hasMediaAttachment(type) { if (this.hasAttachments && this.data.attachments.length > 0) { diff --git a/app/javascript/dashboard/components/widgets/conversation/bubble/ImageAudioVideo.vue b/app/javascript/dashboard/components/widgets/conversation/bubble/ImageAudioVideo.vue index 41e207cbf..b98953341 100644 --- a/app/javascript/dashboard/components/widgets/conversation/bubble/ImageAudioVideo.vue +++ b/app/javascript/dashboard/components/widgets/conversation/bubble/ImageAudioVideo.vue @@ -40,6 +40,7 @@ const ALLOWED_FILE_TYPES = { IMAGE: 'image', VIDEO: 'video', AUDIO: 'audio', + IG_REEL: 'ig_reel', }; export default { @@ -66,7 +67,10 @@ export default { return this.attachment.file_type === ALLOWED_FILE_TYPES.IMAGE; }, isVideo() { - return this.attachment.file_type === ALLOWED_FILE_TYPES.VIDEO; + return ( + this.attachment.file_type === ALLOWED_FILE_TYPES.VIDEO || + this.attachment.file_type === ALLOWED_FILE_TYPES.IG_REEL + ); }, isAudio() { return this.attachment.file_type === ALLOWED_FILE_TYPES.AUDIO; diff --git a/app/javascript/dashboard/components/widgets/conversation/components/GalleryView.vue b/app/javascript/dashboard/components/widgets/conversation/components/GalleryView.vue index 8684134ca..abb31f8fc 100644 --- a/app/javascript/dashboard/components/widgets/conversation/components/GalleryView.vue +++ b/app/javascript/dashboard/components/widgets/conversation/components/GalleryView.vue @@ -189,6 +189,7 @@ import Thumbnail from 'dashboard/components/widgets/Thumbnail.vue'; const ALLOWED_FILE_TYPES = { IMAGE: 'image', VIDEO: 'video', + IG_REEL: 'ig_reel', AUDIO: 'audio', }; @@ -242,7 +243,10 @@ export default { return this.activeFileType === ALLOWED_FILE_TYPES.IMAGE; }, isVideo() { - return this.activeFileType === ALLOWED_FILE_TYPES.VIDEO; + return ( + this.activeFileType === ALLOWED_FILE_TYPES.VIDEO || + this.activeFileType === ALLOWED_FILE_TYPES.IG_REEL + ); }, isAudio() { return this.activeFileType === ALLOWED_FILE_TYPES.AUDIO; diff --git a/app/javascript/dashboard/i18n/locale/am/integrationApps.json b/app/javascript/dashboard/i18n/locale/am/integrationApps.json index a80ecb837..9e20c835b 100644 --- a/app/javascript/dashboard/i18n/locale/am/integrationApps.json +++ b/app/javascript/dashboard/i18n/locale/am/integrationApps.json @@ -1,8 +1,6 @@ { "INTEGRATION_APPS": { - "FETCHING": "Fetching Integrations", "NO_HOOK_CONFIGURED": "There are no %{integrationId} integrations configured in this account.", - "HEADER": "Applications", "STATUS": { "ENABLED": "Enabled", "DISABLED": "Disabled" diff --git a/app/javascript/dashboard/i18n/locale/am/integrations.json b/app/javascript/dashboard/i18n/locale/am/integrations.json index 5397fcb63..3772c0546 100644 --- a/app/javascript/dashboard/i18n/locale/am/integrations.json +++ b/app/javascript/dashboard/i18n/locale/am/integrations.json @@ -1,6 +1,7 @@ { "INTEGRATION_SETTINGS": { "HEADER": "Integrations", + "LOADING": "Fetching integrations", "WEBHOOK": { "SUBSCRIBED_EVENTS": "Subscribed Events", "FORM": { diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json index 6e052949c..3ad79379f 100644 --- a/app/javascript/dashboard/i18n/locale/en/integrations.json +++ b/app/javascript/dashboard/i18n/locale/en/integrations.json @@ -1,6 +1,9 @@ { "INTEGRATION_SETTINGS": { "HEADER": "Integrations", + "DESCRIPTION": "Chatwoot integrates with multiple tools and services to improve your team's efficiency. Explore the list below to configure your favorite apps.", + "LEARN_MORE": "Learn more about integrations", + "LOADING": "Fetching integrations", "WEBHOOK": { "SUBSCRIBED_EVENTS": "Subscribed Events", "FORM": { @@ -37,7 +40,10 @@ "LIST": { "404": "There are no webhooks configured for this account.", "TITLE": "Manage webhooks", - "TABLE_HEADER": ["Webhook endpoint", "Actions"] + "TABLE_HEADER": [ + "Webhook endpoint", + "Actions" + ] }, "EDIT": { "BUTTON_TEXT": "Edit", @@ -169,7 +175,10 @@ "LIST": { "404": "There are no dashboard apps configured on this account yet", "LOADING": "Fetching dashboard apps...", - "TABLE_HEADER": ["Name", "Endpoint"], + "TABLE_HEADER": [ + "Name", + "Endpoint" + ], "EDIT_TOOLTIP": "Edit app", "DELETE_TOOLTIP": "Delete app" }, diff --git a/app/javascript/dashboard/i18n/locale/en/sla.json b/app/javascript/dashboard/i18n/locale/en/sla.json index f32f24b61..0da7873be 100644 --- a/app/javascript/dashboard/i18n/locale/en/sla.json +++ b/app/javascript/dashboard/i18n/locale/en/sla.json @@ -1,6 +1,6 @@ { "SLA": { - "HEADER": "SLA", + "HEADER": "Service Level Agreements", "ADD_ACTION": "Add SLA", "ADD_ACTION_LONG": "Create a new SLA Policy", "DESCRIPTION": "Service Level Agreements (SLAs) are contracts that define clear expectations between your team and customers. They establish standards for response and resolution times, creating a framework for accountability and ensures a consistent, high-quality experience.", @@ -105,4 +105,4 @@ "HIDE": "Hide {count} rows" } } -} \ No newline at end of file +} diff --git a/app/javascript/dashboard/routes/dashboard/settings/SettingsWrapper.vue b/app/javascript/dashboard/routes/dashboard/settings/SettingsWrapper.vue index 3f5bf16f9..e2f838351 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/SettingsWrapper.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/SettingsWrapper.vue @@ -9,9 +9,9 @@ defineProps({