From 9ed1f5d96b558564bfcd5e3d1c6cc2b47790e33f Mon Sep 17 00:00:00 2001 From: Tejaswini Chile Date: Tue, 10 May 2022 19:20:55 +0530 Subject: [PATCH 01/39] Fix: Make version changeable from the environment vars (#4654) --- app/controllers/dashboard_controller.rb | 7 +++++-- app/javascript/dashboard/helper/scriptGenerator.js | 2 +- .../routes/dashboard/settings/inbox/channels/Facebook.vue | 2 +- .../dashboard/settings/inbox/facebook/Reauthorize.vue | 2 +- app/views/layouts/vueapp.html.erb | 1 + 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 2bb8e9847..107aec56e 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -38,9 +38,12 @@ class DashboardController < ActionController::Base end def app_config - { APP_VERSION: Chatwoot.config[:version], + { + APP_VERSION: Chatwoot.config[:version], VAPID_PUBLIC_KEY: VapidService.public_key, ENABLE_ACCOUNT_SIGNUP: GlobalConfigService.load('ENABLE_ACCOUNT_SIGNUP', 'false'), - FB_APP_ID: GlobalConfigService.load('FB_APP_ID', '') } + FB_APP_ID: GlobalConfigService.load('FB_APP_ID', ''), + FACEBOOK_API_VERSION: 'v13.0' + } end end diff --git a/app/javascript/dashboard/helper/scriptGenerator.js b/app/javascript/dashboard/helper/scriptGenerator.js index 5a278d30a..bb6f2a72f 100644 --- a/app/javascript/dashboard/helper/scriptGenerator.js +++ b/app/javascript/dashboard/helper/scriptGenerator.js @@ -4,7 +4,7 @@ export const createMessengerScript = pageId => ` FB.init({ appId: "${window.chatwootConfig.fbAppId}", xfbml: true, - version: "v4.0" + version: "${window.chatwootConfig.fbApiVersion}" }); }; (function(d, s, id){ diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Facebook.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Facebook.vue index 820b4631b..31eff872e 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Facebook.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Facebook.vue @@ -163,7 +163,7 @@ export default { FB.init({ appId: window.chatwootConfig.fbAppId, xfbml: true, - version: 'v12.0', + version: window.chatwootConfig.fbApiVersion, status: true, }); window.fbSDKLoaded = true; diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/facebook/Reauthorize.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/facebook/Reauthorize.vue index 736642f29..d86ebaaff 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/facebook/Reauthorize.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/facebook/Reauthorize.vue @@ -40,7 +40,7 @@ export default { FB.init({ appId: window.chatwootConfig.fbAppId, xfbml: true, - version: 'v12.0', + version: window.chatwootConfig.fbApiVersion, status: true, }); window.fbSDKLoaded = true; diff --git a/app/views/layouts/vueapp.html.erb b/app/views/layouts/vueapp.html.erb index f7d7155d1..3f91ac042 100644 --- a/app/views/layouts/vueapp.html.erb +++ b/app/views/layouts/vueapp.html.erb @@ -34,6 +34,7 @@ window.chatwootConfig = { hostURL: '<%= ENV.fetch('FRONTEND_URL', '') %>', fbAppId: '<%= ENV.fetch('FB_APP_ID', nil) %>', + fbApiVersion: '<%= @global_config['FACEBOOK_API_VERSION'] %>', signupEnabled: '<%= @global_config['ENABLE_ACCOUNT_SIGNUP'] %>', <% if @global_config['VAPID_PUBLIC_KEY'] %> vapidPublicKey: new Uint8Array(<%= Base64.urlsafe_decode64(@global_config['VAPID_PUBLIC_KEY']).bytes %>), From 9cec0917165a21651b335f8beac10f259da1ba56 Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Wed, 11 May 2022 12:05:42 +0530 Subject: [PATCH 02/39] chore: Remove unused method scriptGenerator (#4671) --- .../dashboard/helper/scriptGenerator.js | 25 ------------------- .../dashboard/settings/inbox/Settings.vue | 4 --- 2 files changed, 29 deletions(-) delete mode 100644 app/javascript/dashboard/helper/scriptGenerator.js diff --git a/app/javascript/dashboard/helper/scriptGenerator.js b/app/javascript/dashboard/helper/scriptGenerator.js deleted file mode 100644 index bb6f2a72f..000000000 --- a/app/javascript/dashboard/helper/scriptGenerator.js +++ /dev/null @@ -1,25 +0,0 @@ -export const createMessengerScript = pageId => ` - -
-
-`; diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue index 16b6b0f74..38a1c5e98 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/Settings.vue @@ -436,7 +436,6 @@ diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/settingsPage/CollaboratorsPage.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/settingsPage/CollaboratorsPage.vue new file mode 100644 index 000000000..2b3fa413f --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/settingsPage/CollaboratorsPage.vue @@ -0,0 +1,148 @@ + + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/settingsPage/ConfigurationPage.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/settingsPage/ConfigurationPage.vue new file mode 100644 index 000000000..cc8746fed --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/settingsPage/ConfigurationPage.vue @@ -0,0 +1,130 @@ + + + diff --git a/lib/seeders/account_seeder.rb b/lib/seeders/account_seeder.rb index 65fe5a4e1..162bc4cd9 100644 --- a/lib/seeders/account_seeder.rb +++ b/lib/seeders/account_seeder.rb @@ -17,6 +17,7 @@ class Seeders::AccountSeeder def seed! seed_canned_responses + seed_inboxes end def seed_canned_responses(count: 50) @@ -24,4 +25,65 @@ class Seeders::AccountSeeder account.canned_responses.create(content: Faker::Quote.fortune_cookie, short_code: Faker::Alphanumeric.alpha(number: 10)) end end + + def seed_inboxes + seed_website_inbox + seed_facebook_inbox + seed_twitter_inbox + seed_whatsapp_inbox + seed_sms_inbox + seed_email_inbox + seed_api_inbox + seed_telegram_inbox + seed_line_inbox + end + + def seed_website_inbox + channel = Channel::WebWidget.create!(account: account, website_url: 'https://acme.inc') + Inbox.create!(channel: channel, account: account, name: 'Acme Website') + end + + def seed_facebook_inbox + channel = Channel::FacebookPage.create!(account: account, user_access_token: 'test', page_access_token: 'test', page_id: 'test') + Inbox.create!(channel: channel, account: account, name: 'Acme Facebook') + end + + def seed_twitter_inbox + channel = Channel::TwitterProfile.create!(account: account, twitter_access_token: 'test', twitter_access_token_secret: 'test', profile_id: '123') + Inbox.create!(channel: channel, account: account, name: 'Acme Twitter') + end + + def seed_whatsapp_inbox + channel = Channel::Whatsapp.create!(account: account, phone_number: '+123456789') + Inbox.create!(channel: channel, account: account, name: 'Acme Whatsapp') + end + + def seed_sms_inbox + channel = Channel::Sms.create!(account: account, phone_number: '+123456789') + Inbox.create!(channel: channel, account: account, name: 'Acme SMS') + end + + def seed_email_inbox + channel = Channel::Email.create!(account: account, email: 'test@acme.inc', forward_to_email: 'test_fwd@acme.inc') + Inbox.create!(channel: channel, account: account, name: 'Acme Email') + end + + def seed_api_inbox + channel = Channel::Api.create!(account: account) + Inbox.create!(channel: channel, account: account, name: 'Acme API') + end + + def seed_telegram_inbox + # rubocop:disable Rails/SkipsModelValidations + Channel::Telegram.insert({ account_id: account.id, bot_name: 'Acme', bot_token: 'test', created_at: Time.now.utc, updated_at: Time.now.utc }, + returning: %w[id]) + channel = Channel::Telegram.find_by(bot_token: 'test') + Inbox.create!(channel: channel, account: account, name: 'Acme Telegram') + # rubocop:enable Rails/SkipsModelValidations + end + + def seed_line_inbox + channel = Channel::Line.create!(account: account, line_channel_id: 'test', line_channel_secret: 'test', line_channel_token: 'test') + Inbox.create!(channel: channel, account: account, name: 'Acme Line') + end end From 329d305e9272ae62113a3cfd6564500e5c5d1cca Mon Sep 17 00:00:00 2001 From: Tejaswini Chile Date: Wed, 11 May 2022 14:29:38 +0530 Subject: [PATCH 04/39] Fix: Creating contacts for already outgoing/echo messages (#4668) Check if the Instagram contact is already present in the system before throwing the exception. Fixes: #4666 --- app/services/instagram/message_text.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/services/instagram/message_text.rb b/app/services/instagram/message_text.rb index 75c77b540..619ef4c90 100644 --- a/app/services/instagram/message_text.rb +++ b/app/services/instagram/message_text.rb @@ -22,7 +22,7 @@ class Instagram::MessageText < Instagram::WebhooksBaseService return unsend_message if message_is_deleted? - ensure_contact(contact_id) + ensure_contact(contact_id) if contacts_first_message?(contact_id) create_message end @@ -36,7 +36,7 @@ class Instagram::MessageText < Instagram::WebhooksBaseService rescue Koala::Facebook::AuthenticationError @inbox.channel.authorization_error! raise - rescue StandardError => e + rescue StandardError, Koala::Facebook::ClientError => e result = {} ChatwootExceptionTracker.new(e, account: @inbox.account).capture_exception end @@ -52,6 +52,10 @@ class Instagram::MessageText < Instagram::WebhooksBaseService @messaging[:message][:is_deleted].present? end + def contacts_first_message?(ig_scope_id) + @inbox.contact_inboxes.where(source_id: ig_scope_id).empty? && @inbox.channel.instagram_id.present? + end + def unsend_message message_to_delete = @inbox.messages.find_by( source_id: @messaging[:message][:mid] From 41b89014324772d8351b15936d25623f852980cb Mon Sep 17 00:00:00 2001 From: "Aswin Dev P.S" Date: Wed, 11 May 2022 14:31:57 +0530 Subject: [PATCH 05/39] Fix: Agent Reports counts when they have access to multiple accounts (#4663) This change restricts the agent report API to fetch agent metrics from the current account. Fixes: #4660 --- app/helpers/report_helper.rb | 16 ++++----- .../api/v2/accounts/report_controller_spec.rb | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/app/helpers/report_helper.rb b/app/helpers/report_helper.rb index 9f37295cb..5fdb34170 100644 --- a/app/helpers/report_helper.rb +++ b/app/helpers/report_helper.rb @@ -17,30 +17,30 @@ module ReportHelper end def conversations_count - (get_grouped_values scope.conversations).count + (get_grouped_values scope.conversations.where(account_id: account.id)).count end def incoming_messages_count - (get_grouped_values scope.messages.incoming.unscope(:order)).count + (get_grouped_values scope.messages.where(account_id: account.id).incoming.unscope(:order)).count end def outgoing_messages_count - (get_grouped_values scope.messages.outgoing.unscope(:order)).count + (get_grouped_values scope.messages.where(account_id: account.id).outgoing.unscope(:order)).count end def resolutions_count - (get_grouped_values scope.conversations.resolved).count + (get_grouped_values scope.conversations.where(account_id: account.id).resolved).count end def avg_first_response_time - grouped_reporting_events = (get_grouped_values scope.reporting_events.where(name: 'first_response')) + grouped_reporting_events = (get_grouped_values scope.reporting_events.where(name: 'first_response', account_id: account.id)) return grouped_reporting_events.average(:value_in_business_hours) if params[:business_hours] grouped_reporting_events.average(:value) end def avg_resolution_time - grouped_reporting_events = (get_grouped_values scope.reporting_events.where(name: 'conversation_resolved')) + grouped_reporting_events = (get_grouped_values scope.reporting_events.where(name: 'conversation_resolved', account_id: account.id)) return grouped_reporting_events.average(:value_in_business_hours) if params[:business_hours] grouped_reporting_events.average(:value) @@ -48,7 +48,7 @@ module ReportHelper def avg_resolution_time_summary reporting_events = scope.reporting_events - .where(name: 'conversation_resolved', created_at: range) + .where(name: 'conversation_resolved', account_id: account.id, created_at: range) avg_rt = params[:business_hours] ? reporting_events.average(:value_in_business_hours) : reporting_events.average(:value) return 0 if avg_rt.blank? @@ -58,7 +58,7 @@ module ReportHelper def avg_first_response_time_summary reporting_events = scope.reporting_events - .where(name: 'first_response', created_at: range) + .where(name: 'first_response', account_id: account.id, created_at: range) avg_frt = params[:business_hours] ? reporting_events.average(:value_in_business_hours) : reporting_events.average(:value) return 0 if avg_frt.blank? diff --git a/spec/controllers/api/v2/accounts/report_controller_spec.rb b/spec/controllers/api/v2/accounts/report_controller_spec.rb index c14b570d2..134a61220 100644 --- a/spec/controllers/api/v2/accounts/report_controller_spec.rb +++ b/spec/controllers/api/v2/accounts/report_controller_spec.rb @@ -223,6 +223,40 @@ RSpec.describe 'Reports API', type: :request do expect(response).to have_http_status(:success) end end + + context 'when an agent has access to multiple accounts' do + let(:account1) { create(:account) } + let(:account2) { create(:account) } + + let(:params) do + super().merge( + type: :agent, + since: 30.days.ago.to_i.to_s, + until: date_timestamp.to_s + ) + end + + it 'returns agent metrics from the current account' do + admin1 = create(:user, account: account1, role: :administrator) + inbox1 = create(:inbox, account: account1) + inbox2 = create(:inbox, account: account2) + + create(:account_user, user: admin1, account: account2) + create(:conversation, account: account1, inbox: inbox1, + assignee: admin1, created_at: Time.zone.today - 2.days) + create(:conversation, account: account2, inbox: inbox2, + assignee: admin1, created_at: Time.zone.today - 2.days) + + get "/api/v2/accounts/#{account1.id}/reports/summary", + params: params.merge({ id: admin1.id }), + headers: admin1.create_new_auth_token + + expect(response).to have_http_status(:success) + + json_response = JSON.parse(response.body) + expect(json_response['conversations_count']).to eq(1) + end + end end describe 'GET /api/v2/accounts/:account_id/reports/inboxes' do From ab3ee74a8672f4ac07c6107448c2d9ba6f012653 Mon Sep 17 00:00:00 2001 From: Hricha Shandily <103104754+Hricha-Shandily@users.noreply.github.com> Date: Fri, 13 May 2022 11:34:09 +0530 Subject: [PATCH 06/39] chore: Update the note of Personal message signature (#4679) --- app/javascript/dashboard/i18n/locale/bg/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/dashboard/i18n/locale/bg/settings.json b/app/javascript/dashboard/i18n/locale/bg/settings.json index 2c5909d8b..0eb08ee74 100644 --- a/app/javascript/dashboard/i18n/locale/bg/settings.json +++ b/app/javascript/dashboard/i18n/locale/bg/settings.json @@ -21,7 +21,7 @@ }, "MESSAGE_SIGNATURE_SECTION": { "TITLE": "Personal message signature", - "NOTE": "Create a personal message signature that would be added to all the messages you send from the platform. Use the rich content editor to create a highly personalised signature.", + "NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.", "BTN_TEXT": "Save message signature", "API_ERROR": "Couldn't save signature! Try again", "API_SUCCESS": "Signature saved successfully" From 8fbe470bdd9b65ceeb36a3f25b25f9fefd89ece6 Mon Sep 17 00:00:00 2001 From: Vishnu Narayanan Date: Fri, 13 May 2022 11:34:43 +0530 Subject: [PATCH 07/39] feat: Control sidekiq log level via rails LOG_LEVEL env variable (#4675) --- config/initializers/sidekiq.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 3a183f0a9..66262ea43 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -8,6 +8,7 @@ end Sidekiq.configure_server do |config| config.redis = Redis::Config.app + config.logger.level = Logger.const_get(ENV.fetch('LOG_LEVEL', 'info').upcase.to_s) end # https://github.com/ondrejbartas/sidekiq-cron From 6535624cd6bb0aca76421e452b64645f8c1b015e Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Fri, 13 May 2022 11:38:49 +0530 Subject: [PATCH 08/39] chore: Update translations from Crowdin (#4665) --- .../dashboard/i18n/locale/ar/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/bg/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/ca/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/cs/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/da/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/de/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/el/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/es/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/fa/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/fi/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/fr/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/he/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/hi/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/hu/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/id/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/it/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/it/settings.json | 2 +- .../dashboard/i18n/locale/ja/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/ko/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/lv/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/ml/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/ne/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/nl/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/no/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/pl/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/pt/inboxMgmt.json | 6 +- .../i18n/locale/pt_BR/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/ro/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/ru/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/sk/campaign.json | 4 +- .../dashboard/i18n/locale/sk/inboxMgmt.json | 14 +- .../i18n/locale/sk/integrationApps.json | 4 +- .../dashboard/i18n/locale/sr/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/sv/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/ta/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/th/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/tr/inboxMgmt.json | 6 +- .../dashboard/i18n/locale/uk/inboxMgmt.json | 6 +- .../i18n/locale/ur/advancedFilters.json | 10 +- .../dashboard/i18n/locale/ur/agentMgmt.json | 120 ++-- .../i18n/locale/ur/attributesMgmt.json | 12 +- .../dashboard/i18n/locale/ur/automation.json | 26 +- .../dashboard/i18n/locale/ur/campaign.json | 20 +- .../dashboard/i18n/locale/ur/cannedMgmt.json | 82 +-- .../dashboard/i18n/locale/ur/chatlist.json | 66 +-- .../dashboard/i18n/locale/ur/contact.json | 348 +++++------ .../i18n/locale/ur/contactFilters.json | 12 +- .../i18n/locale/ur/conversation.json | 92 +-- .../i18n/locale/ur/generalSettings.json | 4 +- .../dashboard/i18n/locale/ur/inboxMgmt.json | 20 +- .../i18n/locale/ur/integrationApps.json | 12 +- .../i18n/locale/ur/integrations.json | 24 +- .../dashboard/i18n/locale/ur/labelsMgmt.json | 20 +- .../dashboard/i18n/locale/ur/login.json | 2 +- .../dashboard/i18n/locale/ur/report.json | 22 +- .../i18n/locale/ur/resetPassword.json | 6 +- .../i18n/locale/ur/setNewPassword.json | 4 +- .../dashboard/i18n/locale/ur/settings.json | 24 +- .../dashboard/i18n/locale/ur/signup.json | 4 +- .../i18n/locale/ur/teamsSettings.json | 6 +- .../i18n/locale/ur_IN/advancedFilters.json | 93 +++ .../i18n/locale/ur_IN/agentMgmt.json | 113 ++++ .../i18n/locale/ur_IN/attributesMgmt.json | 99 ++++ .../i18n/locale/ur_IN/automation.json | 116 ++++ .../dashboard/i18n/locale/ur_IN/campaign.json | 126 ++++ .../i18n/locale/ur_IN/cannedMgmt.json | 76 +++ .../dashboard/i18n/locale/ur_IN/chatlist.json | 87 +++ .../dashboard/i18n/locale/ur_IN/contact.json | 338 +++++++++++ .../i18n/locale/ur_IN/contactFilters.json | 49 ++ .../i18n/locale/ur_IN/conversation.json | 204 +++++++ .../dashboard/i18n/locale/ur_IN/csatMgmt.json | 6 + .../i18n/locale/ur_IN/generalSettings.json | 140 +++++ .../i18n/locale/ur_IN/inboxMgmt.json | 543 ++++++++++++++++++ .../i18n/locale/ur_IN/integrationApps.json | 62 ++ .../i18n/locale/ur_IN/integrations.json | 89 +++ .../i18n/locale/ur_IN/labelsMgmt.json | 70 +++ .../dashboard/i18n/locale/ur_IN/login.json | 21 + .../dashboard/i18n/locale/ur_IN/report.json | 445 ++++++++++++++ .../i18n/locale/ur_IN/resetPassword.json | 15 + .../i18n/locale/ur_IN/setNewPassword.json | 23 + .../dashboard/i18n/locale/ur_IN/settings.json | 236 ++++++++ .../dashboard/i18n/locale/ur_IN/signup.json | 39 ++ .../i18n/locale/ur_IN/teamsSettings.json | 125 ++++ .../dashboard/i18n/locale/ur_IN/webhooks.json | 5 + .../dashboard/i18n/locale/vi/inboxMgmt.json | 6 +- .../i18n/locale/zh_CN/inboxMgmt.json | 6 +- .../i18n/locale/zh_TW/inboxMgmt.json | 6 +- app/javascript/survey/i18n/locale/ur.json | 2 +- app/javascript/survey/i18n/locale/ur_IN.json | 19 + app/javascript/widget/i18n/locale/ur.json | 6 +- app/javascript/widget/i18n/locale/ur_IN.json | 86 +++ config/locales/devise.ur_IN.yml | 61 ++ config/locales/ur_IN.yml | 108 ++++ 93 files changed, 3950 insertions(+), 634 deletions(-) create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/advancedFilters.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/agentMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/attributesMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/automation.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/campaign.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/cannedMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/chatlist.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/contact.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/contactFilters.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/conversation.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/generalSettings.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/inboxMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/integrationApps.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/integrations.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/labelsMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/login.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/report.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/resetPassword.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/setNewPassword.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/settings.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/signup.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/teamsSettings.json create mode 100644 app/javascript/dashboard/i18n/locale/ur_IN/webhooks.json create mode 100644 app/javascript/survey/i18n/locale/ur_IN.json create mode 100644 app/javascript/widget/i18n/locale/ur_IN.json create mode 100644 config/locales/devise.ur_IN.yml create mode 100644 config/locales/ur_IN.yml diff --git a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json index 42f2a45fb..da5e213e9 100644 --- a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "تم تحديث إعدادات الإسناد التلقائي بنجاح", "ERROR_MESSAGE": "تعذر تحديث لون صندوق الدردشة. الرجاء المحاولة مرة أخرى لاحقاً." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "مفعل", - "DISABLED": "معطّل" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "مفعل", "DISABLED": "معطّل" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "ضع هذا الكود داخل وسم الـ body في موقعك", "INBOX_AGENTS": "موظف الدعم", "INBOX_AGENTS_SUB_TEXT": "إضافة أو إزالة موظفين من قناة التواصل هذه", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "تحديث", "ENABLE_EMAIL_COLLECT_BOX": "تفعيل صندوق جمع البريد الإلكتروني", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "تمكين أو تعطيل مربع جمع البريد الإلكتروني في محادثة جديدة", diff --git a/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json index 94110fae8..7e4842bd7 100644 --- a/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/bg/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", "ERROR_MESSAGE": "Could not update widget color. Please try again later." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Enabled", - "DISABLED": "Disabled" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", "DISABLED": "Disabled" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Place this button inside your body tag", "INBOX_AGENTS": "Агенти", "INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Update", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json index 06f934430..19fa864b0 100644 --- a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Assignació automàtica actualitzada correctament", "ERROR_MESSAGE": "No s'ha pogut actualitzar el color del widget. Torneu-ho a provar més endavant." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Habilita", - "DISABLED": "Inhabilita" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Habilita", "DISABLED": "Inhabilita" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Col·loca aquest botó dins de l'etiqueta body", "INBOX_AGENTS": "Agents", "INBOX_AGENTS_SUB_TEXT": "Afegir o eliminar agents d'aquesta safata d'entrada", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Actualitza", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json index 3e1142191..c0771d5de 100644 --- a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatické přiřazení bylo úspěšně aktualizováno", "ERROR_MESSAGE": "Nelze aktualizovat barvu widgetu. Opakujte akci později." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Povoleno", - "DISABLED": "Zakázáno" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Povoleno", "DISABLED": "Zakázáno" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Umístěte toto tlačítko dovnitř vašeho tělesného štítku", "INBOX_AGENTS": "Agenti", "INBOX_AGENTS_SUB_TEXT": "Přidat nebo odebrat agenty z této složky doručené pošty", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Aktualizovat", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json index 1a199e343..6c5201ef9 100644 --- a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatisk tildeling opdateret", "ERROR_MESSAGE": "Kunne ikke opdatere widget farve. Prøv igen senere." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Aktiveret", - "DISABLED": "Deaktiveret" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Aktiveret", "DISABLED": "Deaktiveret" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Placer denne knap inde i din body tag", "INBOX_AGENTS": "Agenter", "INBOX_AGENTS_SUB_TEXT": "Tilføj eller fjern agenter fra denne indbakke", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Opdater", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json index ea61c99c1..5d8d2aaa4 100644 --- a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatische Zuordnung erfolgreich aktualisiert", "ERROR_MESSAGE": "Widget-Farbe konnte nicht aktualisiert werden. Bitte versuchen Sie es später noch einmal." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Aktiviert", - "DISABLED": "Deaktiviert" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Aktiviert", "DISABLED": "Deaktiviert" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Platzieren Sie diese Schaltfläche in Ihrem Body-Tag", "INBOX_AGENTS": "Agenten", "INBOX_AGENTS_SUB_TEXT": "Hinzufügen oder Entfernen von Agenten zu diesem Posteingang", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Aktualisieren", "ENABLE_EMAIL_COLLECT_BOX": "E-Mail-Sammelbox aktivieren", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "E-Mail-Sammelbox für neue Konversation aktivieren oder deaktivieren", diff --git a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json index ac7d25e5a..e0f284e48 100644 --- a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Η αυτόματη αντιστοίχιση ενημερώθηκε επιτυχώς", "ERROR_MESSAGE": "Δεν μπορεί να ενημερωθεί το χρώμα του widget. Παρακαλώ προσπαθήστε αργότερα." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Ενεργό", - "DISABLED": "Ανενεργό" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Ενεργό", "DISABLED": "Ανενεργό" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Τοποθετήσετε αυτόν τον κώδικα μέσα στο body tag της ιστοσελίδας σας", "INBOX_AGENTS": "Πράκτορες", "INBOX_AGENTS_SUB_TEXT": "Προσθέστε ή αφαιρέστε πράκτορες σε αυτό το κιβώτιο", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Ενημέρωση", "ENABLE_EMAIL_COLLECT_BOX": "Ενεργοποιήσετε το πλαίσιο συλλογής email", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Ενεργοποίηση ή απενεργοποίηση του πλαισίου συλλογής μηνυμάτων ηλεκτρονικού ταχυδρομείου στη νέα συνομιλία", diff --git a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json index 8f25d620a..bb46e4faf 100644 --- a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto-asignación actualizada correctamente", "ERROR_MESSAGE": "No se pudo actualizar el color del widget. Inténtalo de nuevo más tarde." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Activado", - "DISABLED": "Deshabilitado" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Activado", "DISABLED": "Deshabilitado" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Coloca este botón dentro de tu etiqueta cuerpo", "INBOX_AGENTS": "Agentes", "INBOX_AGENTS_SUB_TEXT": "Añadir o quitar agentes de esta bandeja de entrada", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Actualizar", "ENABLE_EMAIL_COLLECT_BOX": "Activar caja de recolección de correo electrónico", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Activar o desactivar la caja de recolección de correo electrónico", diff --git a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json index 1734395c9..d0ff5b89b 100644 --- a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "واگذاری خودکار گفتگو به ایجنت ها تنظیم شد", "ERROR_MESSAGE": "در حال حاضر امکان تغییر رنگ ویجت امکان‌پذیر نیست. لطفا بعدا امتحان کنید." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "فعال", - "DISABLED": "غیرفعال" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "فعال", "DISABLED": "غیرفعال" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "این دکمه را در تگ body قرار دهید", "INBOX_AGENTS": "ایجنت ها", "INBOX_AGENTS_SUB_TEXT": "اضافه کردن یا حذف کردن دسترسی ایجنت به صندوق ورودی", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "اعمال شود", "ENABLE_EMAIL_COLLECT_BOX": "فعال سازی فرم دریافت ایمیل از کاربر", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "فعال یا غیرفعال کردن فرم دریافت ایمیل از کاربر", diff --git a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json index a985f2811..9d8a4dc70 100644 --- a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automaattinen delegointi päivitetty onnistuneesti", "ERROR_MESSAGE": "Widgetin väriä ei voitu päivittää. Yritä myöhemmin uudelleen." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Käytössä", - "DISABLED": "Pois käytöstä" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Käytössä", "DISABLED": "Pois käytöstä" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Aseta tämä painike body-tagiisi", "INBOX_AGENTS": "Edustajat", "INBOX_AGENTS_SUB_TEXT": "Lisää tai poista edustajia tästä saapuneet-kansiosta", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Päivitä", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json index 2b8423999..48d1ecb78 100644 --- a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Affectation automatique mise à jour avec succès", "ERROR_MESSAGE": "Impossible de mettre à jour la couleur du widget. Veuillez réessayer plus tard." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Activé", - "DISABLED": "Désactivé" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Activé", "DISABLED": "Désactivé" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Placez ce code avant la fermeture de votre balise body", "INBOX_AGENTS": "Agents", "INBOX_AGENTS_SUB_TEXT": "Ajouter ou supprimer des agents de cette boîte de réception", + "AGENT_ASSIGNMENT": "Konversationsauftrag", + "AGENT_ASSIGNMENT_SUB_TEXT": "Aktualisieren Sie die Konversationszuweisungseinstellungen", "UPDATE": "Mettre à jour", "ENABLE_EMAIL_COLLECT_BOX": "Activer la boîte de collecte des courriels", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Activer ou désactiver la boîte de collecte des courriels pour les nouvelles conversations", diff --git a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json index ebda8ee17..fa71fca8e 100644 --- a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "ההקצאה האוטומטית עודכנה בהצלחה", "ERROR_MESSAGE": "לא ניתן היה לעדכן את צבע הווידג'ט. בבקשה נסה שוב מאוחר יותר." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "מופעל", - "DISABLED": "כבוי" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "מופעל", "DISABLED": "כבוי" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "מקם את הכפתור הזה בתוך תג הגוף שלך", "INBOX_AGENTS": "סוכנים", "INBOX_AGENTS_SUB_TEXT": "הוסף או הסר נציגים מתיבת הדואר הנכנס הזו", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "עדכן", "ENABLE_EMAIL_COLLECT_BOX": "אפשר תיבת איסוף דוא\"ל", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "הפעל או השבת את תיבת איסוף הדוא\"ל בשיחה חדשה", diff --git a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json index bda8ea1ef..e9ee9c5b8 100644 --- a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", "ERROR_MESSAGE": "Could not update widget color. Please try again later." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Enabled", - "DISABLED": "Disabled" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", "DISABLED": "Disabled" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Place this button inside your body tag", "INBOX_AGENTS": "Agents", "INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Update", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json index 27d2446ac..d03a98b66 100644 --- a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatikus hozzárendelés sikeresen frissítve", "ERROR_MESSAGE": "Nem sikerült a widget szín változtatása. Kérjük próbáld később." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Engedélyezve", - "DISABLED": "Letiltva" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Engedélyezve", "DISABLED": "Letiltva" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Ezt a gombot a body tag-en belül helyezd el", "INBOX_AGENTS": "Ügynökök", "INBOX_AGENTS_SUB_TEXT": "Ügynökök hosszáadása vagy eltávolítása az inboxból", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Frissítés", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json index b5ad68017..705db8869 100644 --- a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Penugasan otomatis berhasil diperbarui", "ERROR_MESSAGE": "Tidak dapat memperbarui warna widget. Silakan coba lagi nanti." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Diaktifkan", - "DISABLED": "Nonaktif" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Diaktifkan", "DISABLED": "Nonaktif" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Tempatkan tombol ini di dalam tag Anda", "INBOX_AGENTS": "Agen", "INBOX_AGENTS_SUB_TEXT": "Tambahkan atau hapus agen dari kotak masuk ini", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Perbarui", "ENABLE_EMAIL_COLLECT_BOX": "Aktifkan kotak pengumpulan email", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Aktifkan atau nonaktifkan kotak pengumpulan email pada percakpaan baru", diff --git a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json index 2bd15869d..9aa37e0e0 100644 --- a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Assegnazione automatica aggiornata correttamente", "ERROR_MESSAGE": "Impossibile aggiornare il colore del widget. Riprova più tardi." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Abilitato", - "DISABLED": "Disabilitato" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Abilitato", "DISABLED": "Disabilitato" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Posiziona questo pulsante all'interno del tuo tag body", "INBOX_AGENTS": "Agenti", "INBOX_AGENTS_SUB_TEXT": "Aggiungi o rimuovi agenti da questa casella", + "AGENT_ASSIGNMENT": "Assegnazione conversazione", + "AGENT_ASSIGNMENT_SUB_TEXT": "Aggiorna le impostazioni di assegnazione della conversazione", "UPDATE": "Aggiorna", "ENABLE_EMAIL_COLLECT_BOX": "Abilita casella di raccolta email", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Abilita o disabilita la casella di raccolta email nella nuova conversazione", diff --git a/app/javascript/dashboard/i18n/locale/it/settings.json b/app/javascript/dashboard/i18n/locale/it/settings.json index c62452a6d..6b4712625 100644 --- a/app/javascript/dashboard/i18n/locale/it/settings.json +++ b/app/javascript/dashboard/i18n/locale/it/settings.json @@ -151,7 +151,7 @@ }, "SIDEBAR": { "CURRENTLY_VIEWING_ACCOUNT": "Visualizzazione attuale:", - "SWITCH": "Switch", + "SWITCH": "Scambia", "CONVERSATIONS": "Conversazioni", "ALL_CONVERSATIONS": "Tutte le conversazioni", "MENTIONED_CONVERSATIONS": "Menzioni", diff --git a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json index 55d1537b9..1aa3f28a2 100644 --- a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "自動割り当ての更新に成功しました", "ERROR_MESSAGE": "ウィジェットの色を更新できませんでした。後でもう一度お試しください" }, - "AUTO_ASSIGNMENT": { - "ENABLED": "有効です", - "DISABLED": "無効です" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "有効です", "DISABLED": "無効です" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "このボタンをbodyタグの中に配置してください。", "INBOX_AGENTS": "担当者", "INBOX_AGENTS_SUB_TEXT": "この受信トレイから担当者を追加または削除する", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "更新", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json index 76f0dee06..7b974a3e1 100644 --- a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "자동 할당 업데이트 완료", "ERROR_MESSAGE": "위젯 색상을 업데이트할 수 없음. 나중에 다시 시도해 주십시오." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "사용함", - "DISABLED": "사용 안 함" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "사용함", "DISABLED": "사용 안 함" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "이 버튼을 당신의 body 태그 안에 넣으세요.", "INBOX_AGENTS": "에이전트", "INBOX_AGENTS_SUB_TEXT": "받은 메시지함에서 에이전트 추가 또는 제거", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "업데이트", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json index bda8ea1ef..e9ee9c5b8 100644 --- a/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/lv/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", "ERROR_MESSAGE": "Could not update widget color. Please try again later." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Enabled", - "DISABLED": "Disabled" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", "DISABLED": "Disabled" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Place this button inside your body tag", "INBOX_AGENTS": "Agents", "INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Update", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json index 2b2348830..76c9e0db5 100644 --- a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "ഓട്ടോമാറ്റിക് അസൈൻമെന്റ് വിജയകരമായി അപ്‌ഡേറ്റുചെയ്‌തു", "ERROR_MESSAGE": "വിജറ്റ് നിറം അപ്‌ഡേറ്റ് ചെയ്യാൻ കഴിഞ്ഞില്ല. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "പ്രവർത്തനക്ഷമമാക്കി", - "DISABLED": "പ്രവർത്തനരഹിതമാക്കി" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "പ്രവർത്തനക്ഷമമാക്കി", "DISABLED": "പ്രവർത്തനരഹിതമാക്കി" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "ഈ ബട്ടൺ നിങ്ങളുടെ ബോഡി ടാഗിനുള്ളിൽ സ്ഥാപിക്കുക", "INBOX_AGENTS": "ഏജന്റുമാർ", "INBOX_AGENTS_SUB_TEXT": "ഈ ഇൻ‌ബോക്സിൽ നിന്ന് ഏജന്റുമാരെ ചേർക്കുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "അപ്‌ഡേറ്റ്", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json index bda8ea1ef..e9ee9c5b8 100644 --- a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Auto assignment updated successfully", "ERROR_MESSAGE": "Could not update widget color. Please try again later." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Enabled", - "DISABLED": "Disabled" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", "DISABLED": "Disabled" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Place this button inside your body tag", "INBOX_AGENTS": "Agents", "INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Update", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json index a17291a0d..52ee1e374 100644 --- a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatische toewijzing succesvol bijgewerkt", "ERROR_MESSAGE": "Kan de kleur van de widget niet bijwerken. Probeer het later opnieuw." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Ingeschakeld", - "DISABLED": "Uitgeschakeld" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Ingeschakeld", "DISABLED": "Uitgeschakeld" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Plaats deze knop in je lichaam tag", "INBOX_AGENTS": "Agenten", "INBOX_AGENTS_SUB_TEXT": "Voeg agenten toe of verwijder ze uit deze inbox", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Vernieuwen", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json index acde2c58e..16c744474 100644 --- a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Autotildeling ble oppdatert", "ERROR_MESSAGE": "Kunne ikke oppdatere widget-fargen. Prøv igjen senere." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Aktivert", - "DISABLED": "Deaktivert" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Aktivert", "DISABLED": "Deaktivert" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Plasser denne knappen innenfor body-taggen", "INBOX_AGENTS": "Agenter", "INBOX_AGENTS_SUB_TEXT": "Legg til eller fjern agenter fra denne innboksen", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Oppdater", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", diff --git a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json index 8b629edad..e544a552f 100644 --- a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatyczne przypisanie zaktualizowane pomyślnie", "ERROR_MESSAGE": "Nie można zaktualizować koloru widżetu. Spróbuj ponownie później." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Włączone", - "DISABLED": "Wyłączone" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Włączone", "DISABLED": "Wyłączone" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Umieść ten przycisk wewnątrz znacznika ciała", "INBOX_AGENTS": "Agenci", "INBOX_AGENTS_SUB_TEXT": "Dodaj lub usuń agentów z tej skrzynki odbiorczej", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Aktualizuj", "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Włącz lub wyłącz skrzynkę zbierania wiadomości e-mail w nowej konwersacji", diff --git a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json index 01c8a433f..036b9a5ef 100644 --- a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Atribuição automática atualizada com sucesso", "ERROR_MESSAGE": "Não foi possível atualizar a cor do widget. Por favor, tente novamente mais tarde." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Ativado", - "DISABLED": "Desabilitado" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Ativado", "DISABLED": "Desabilitado" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Coloque esse botão dentro da sua tag corporal", "INBOX_AGENTS": "agentes", "INBOX_AGENTS_SUB_TEXT": "Adicionar ou remover agentes dessa caixa de entrada", + "AGENT_ASSIGNMENT": "Conversation Assignment", + "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", "UPDATE": "Atualização", "ENABLE_EMAIL_COLLECT_BOX": "Ativar caixa de receção de email", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Ativar ou desativar caixa de receção de emails para as novas conversas", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json index 1e2fa9cec..f3ff32c77 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json @@ -341,10 +341,6 @@ "AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Agente atualizado com sucesso", "ERROR_MESSAGE": "Não foi possível atualizar a cor do widget. Por favor, tente novamente mais tarde." }, - "AUTO_ASSIGNMENT": { - "ENABLED": "Ativado", - "DISABLED": "Desativado" - }, "EMAIL_COLLECT_BOX": { "ENABLED": "Ativado", "DISABLED": "Desativado" @@ -402,6 +398,8 @@ "MESSENGER_SUB_HEAD": "Favor, insira essse código diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/FilterSelector.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/FilterSelector.vue index cadf4078e..848555a4d 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/FilterSelector.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/FilterSelector.vue @@ -61,7 +61,10 @@ @input="handleAgentsFilterSelection" /> -
+
{{ $t('REPORT.BUSINESS_HOURS') }} @@ -105,6 +108,10 @@ export default { type: Boolean, default: false, }, + showBusinessHoursSwitch: { + type: Boolean, + default: true, + }, }, data() { return { diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/WootReports.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/WootReports.vue index 6d8b49c62..34188a12a 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/WootReports.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/WootReports.vue @@ -61,6 +61,7 @@ import format from 'date-fns/format'; import { GROUP_BY_FILTER, METRIC_CHART } from '../constants'; import reportMixin from '../../../../../mixins/reportMixin'; import { formatTime } from '@chatwoot/utils'; +import { generateFileName } from '../../../../../helper/downloadHelper'; const REPORTS_KEYS = { CONVERSATIONS: 'conversations_count', @@ -250,26 +251,17 @@ export default { }); }, downloadReports() { - const { from, to } = this; - const fileName = `${this.type}-report-${format( - fromUnixTime(to), - 'dd-MM-yyyy' - )}.csv`; - switch (this.type) { - case 'agent': - this.$store.dispatch('downloadAgentReports', { from, to, fileName }); - break; - case 'label': - this.$store.dispatch('downloadLabelReports', { from, to, fileName }); - break; - case 'inbox': - this.$store.dispatch('downloadInboxReports', { from, to, fileName }); - break; - case 'team': - this.$store.dispatch('downloadTeamReports', { from, to, fileName }); - break; - default: - break; + const { from, to, type } = this; + const dispatchMethods = { + agent: 'downloadAgentReports', + label: 'downloadLabelReports', + inbox: 'downloadInboxReports', + team: 'downloadTeamReports', + }; + if (dispatchMethods[type]) { + const fileName = generateFileName({ type, to }); + const params = { from, to, fileName }; + this.$store.dispatch(dispatchMethods[type], params); } }, changeSelection(index) { diff --git a/app/javascript/dashboard/store/modules/csat.js b/app/javascript/dashboard/store/modules/csat.js index 7bc1dad6d..2557e2698 100644 --- a/app/javascript/dashboard/store/modules/csat.js +++ b/app/javascript/dashboard/store/modules/csat.js @@ -1,6 +1,7 @@ import * as MutationHelpers from 'shared/helpers/vuex/mutationHelpers'; import types from '../mutation-types'; import CSATReports from '../../api/csatReports'; +import { downloadCsvFile } from '../../helper/downloadHelper'; const computeDistribution = (value, total) => ((value * 100) / total).toFixed(2); @@ -107,6 +108,11 @@ export const actions = { commit(types.SET_CSAT_RESPONSE_UI_FLAG, { isFetchingMetrics: false }); } }, + downloadCSATReports(_, params) { + return CSATReports.download(params).then(response => { + downloadCsvFile(params.fileName, response.data); + }); + }, }; export const mutations = { diff --git a/app/javascript/dashboard/store/modules/reports.js b/app/javascript/dashboard/store/modules/reports.js index dc9a6c33b..9ae571803 100644 --- a/app/javascript/dashboard/store/modules/reports.js +++ b/app/javascript/dashboard/store/modules/reports.js @@ -5,7 +5,7 @@ import * as types from '../mutation-types'; import Report from '../../api/reports'; import Vue from 'vue'; -import { downloadCsvFile } from '../../helper/downloadCsvFile'; +import { downloadCsvFile } from '../../helper/downloadHelper'; const state = { fetchingStatus: false, diff --git a/app/policies/csat_survey_response_policy.rb b/app/policies/csat_survey_response_policy.rb index c0ce8821b..afcce00e9 100644 --- a/app/policies/csat_survey_response_policy.rb +++ b/app/policies/csat_survey_response_policy.rb @@ -6,4 +6,8 @@ class CsatSurveyResponsePolicy < ApplicationPolicy def metrics? @account_user.administrator? end + + def download? + @account_user.administrator? + end end diff --git a/app/views/api/v1/accounts/csat_survey_responses/download.csv.erb b/app/views/api/v1/accounts/csat_survey_responses/download.csv.erb new file mode 100644 index 000000000..8b694ed35 --- /dev/null +++ b/app/views/api/v1/accounts/csat_survey_responses/download.csv.erb @@ -0,0 +1,38 @@ +<%= + CSV.generate_line([ + I18n.t('reports.csat.headers.agent_name'), + I18n.t('reports.csat.headers.rating'), + I18n.t('reports.csat.headers.feedback'), + I18n.t('reports.csat.headers.contact_name'), + I18n.t('reports.csat.headers.contact_email_address'), + I18n.t('reports.csat.headers.contact_phone_number'), + I18n.t('reports.csat.headers.link_to_the_conversation'), + I18n.t('reports.csat.headers.recorded_at') + ]) +-%> +<% @csat_survey_responses.each do |csat_response| %> +<% assigned_agent = csat_response.assigned_agent %> +<% contact = csat_response.contact %> +<% conversation = csat_response.conversation %> +<%= + CSV.generate_line([ + assigned_agent ? "#{assigned_agent.name} (#{assigned_agent.email})" : nil, + csat_response.rating, + csat_response.feedback_message.present? ? csat_response.feedback_message : nil, + contact&.name.present? ? contact&.name: nil, + contact&.email.present? ? contact&.email: nil, + contact&.phone_number.present? ? contact&.phone_number: nil, + conversation ? app_account_conversation_url(account_id: Current.account.id, id: conversation.display_id): nil, + csat_response.created_at, + ]) +-%> +<% end %> +<%= + CSV.generate_line([ + I18n.t( + 'reports.period', + since: Date.strptime(params[:since], '%s'), + until: Date.strptime(params[:until], '%s') + ) + ]) +-%> diff --git a/config/locales/en.yml b/config/locales/en.yml index 0c92c32eb..bd7829b53 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -60,6 +60,16 @@ en: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Agent Name + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: diff --git a/config/routes.rb b/config/routes.rb index aa23be1e7..a80f6ca39 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -106,6 +106,7 @@ Rails.application.routes.draw do resources :csat_survey_responses, only: [:index] do collection do get :metrics + get :download end end resources :custom_attribute_definitions, only: [:index, :show, :create, :update, :destroy] diff --git a/spec/controllers/api/v1/accounts/csat_survey_responses_controller_spec.rb b/spec/controllers/api/v1/accounts/csat_survey_responses_controller_spec.rb index abb4231d9..f431f0ed5 100644 --- a/spec/controllers/api/v1/accounts/csat_survey_responses_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/csat_survey_responses_controller_spec.rb @@ -148,4 +148,38 @@ RSpec.describe 'CSAT Survey Responses API', type: :request do end end end + + describe 'GET /api/v1/accounts/{account.id}/csat_survey_responses/download' do + context 'when it is an unauthenticated user' do + it 'returns unauthorized' do + get "/api/v1/accounts/#{account.id}/csat_survey_responses/download" + expect(response).to have_http_status(:unauthorized) + end + end + + context 'when it is an authenticated user' do + let(:params) { { since: 5.days.ago.to_time.to_i.to_s, until: Time.zone.tomorrow.to_time.to_i.to_s } } + + it 'returns unauthorized for agents' do + get "/api/v1/accounts/#{account.id}/csat_survey_responses/download", + params: params, + headers: agent.create_new_auth_token + + expect(response).to have_http_status(:unauthorized) + end + + it 'returns summary' do + get "/api/v1/accounts/#{account.id}/csat_survey_responses/download", + params: params, + headers: administrator.create_new_auth_token + + expect(response).to have_http_status(:success) + + content = CSV.parse(response.body) + # Check rating from CSAT Row + expect(content[1][1]).to eq '1' + expect(content.length).to eq 3 + end + end + end end From 20565d09c0771a3d229edc795affa2aef66268b4 Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Wed, 18 May 2022 12:15:30 +0530 Subject: [PATCH 15/39] fix: Update report method to fix issues with special characters (#4697) --- .../dashboard/helper/downloadHelper.js | 11 ++- .../helper/specs/downloadHelper.spec.js | 22 +----- .../modules/specs/reports/actions.spec.js | 77 ++++++++----------- .../csat_survey_responses/download.csv.erb | 2 +- .../api/v2/accounts/reports/agents.csv.erb | 4 +- .../api/v2/accounts/reports/inboxes.csv.erb | 6 +- .../api/v2/accounts/reports/labels.csv.erb | 4 +- .../api/v2/accounts/reports/teams.csv.erb | 4 +- 8 files changed, 51 insertions(+), 79 deletions(-) diff --git a/app/javascript/dashboard/helper/downloadHelper.js b/app/javascript/dashboard/helper/downloadHelper.js index 150ac1fd8..68c3b5cee 100644 --- a/app/javascript/dashboard/helper/downloadHelper.js +++ b/app/javascript/dashboard/helper/downloadHelper.js @@ -1,11 +1,16 @@ import fromUnixTime from 'date-fns/fromUnixTime'; import format from 'date-fns/format'; -export const downloadCsvFile = (fileName, fileContent) => { +export const downloadCsvFile = (fileName, content) => { + const contentType = 'data:text/csv;charset=utf-8;'; + const blob = new Blob([content], { type: contentType }); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); - link.download = fileName; - link.href = `data:text/csv;charset=utf-8,` + encodeURI(fileContent); + link.setAttribute('download', fileName); + link.setAttribute('href', url); link.click(); + return link; }; export const generateFileName = ({ type, to }) => diff --git a/app/javascript/dashboard/helper/specs/downloadHelper.spec.js b/app/javascript/dashboard/helper/specs/downloadHelper.spec.js index b294dfe16..6cdec4160 100644 --- a/app/javascript/dashboard/helper/specs/downloadHelper.spec.js +++ b/app/javascript/dashboard/helper/specs/downloadHelper.spec.js @@ -1,24 +1,4 @@ -import { downloadCsvFile, generateFileName } from '../downloadHelper'; - -const fileName = 'test.csv'; -const fileData = `Agent name,Conversations count,Avg first response time (Minutes),Avg resolution time (Minutes) -Pranav,36,114,28411`; - -describe('#downloadCsvFile', () => { - it('should download the csv file', () => { - const link = { - click: jest.fn(), - }; - jest.spyOn(document, 'createElement').mockImplementation(() => link); - - downloadCsvFile(fileName, fileData); - expect(link.download).toEqual(fileName); - expect(link.href).toEqual( - `data:text/csv;charset=utf-8,${encodeURI(fileData)}` - ); - expect(link.click).toHaveBeenCalledTimes(1); - }); -}); +import { generateFileName } from '../downloadHelper'; describe('#generateFileName', () => { it('should generate the correct file name', () => { diff --git a/app/javascript/dashboard/store/modules/specs/reports/actions.spec.js b/app/javascript/dashboard/store/modules/specs/reports/actions.spec.js index 0ba89ff81..a6e87e1a1 100644 --- a/app/javascript/dashboard/store/modules/specs/reports/actions.spec.js +++ b/app/javascript/dashboard/store/modules/specs/reports/actions.spec.js @@ -1,102 +1,89 @@ import axios from 'axios'; import { actions } from '../../reports'; - +import DownloadHelper from 'dashboard/helper/downloadHelper'; global.open = jest.fn(); global.axios = axios; jest.mock('axios'); -const createElementSpy = () => { - const element = document.createElement('a'); - jest.spyOn(document, 'createElement').mockImplementation(() => element); - return element; -}; +jest.mock('dashboard/helper/downloadHelper', () => ({ + downloadCsvFile: jest.fn(), +})); describe('#actions', () => { - afterEach(() => { - jest.restoreAllMocks(); - }); - describe('#downloadAgentReports', () => { it('open CSV download prompt if API is success', async () => { - axios.get.mockResolvedValue({ - data: `Agent name,Conversations count,Avg first response time (Minutes),Avg resolution time (Minutes) - Pranav,36,114,28411`, - }); + const data = `Agent name,Conversations count,Avg first response time (Minutes),Avg resolution time (Minutes) + Pranav,36,114,28411`; + axios.get.mockResolvedValue({ data }); + const param = { from: 1630504922510, to: 1630504922510, fileName: 'agent-report-01-09-2021.csv', }; - const mockAgentDownloadElement = createElementSpy(); await actions.downloadAgentReports(1, param); - expect(mockAgentDownloadElement.href).toEqual( - 'data:text/csv;charset=utf-8,Agent%20name,Conversations%20count,Avg%20first%20response%20time%20(Minutes),Avg%20resolution%20time%20(Minutes)%0A%20%20%20%20%20%20%20%20Pranav,36,114,28411' + expect(DownloadHelper.downloadCsvFile).toBeCalledWith( + param.fileName, + data ); - expect(mockAgentDownloadElement.download).toEqual(param.fileName); }); }); describe('#downloadLabelReports', () => { it('open CSV download prompt if API is success', async () => { - axios.get.mockResolvedValue({ - data: `Label Title,Conversations count,Avg first response time (Minutes),Avg resolution time (Minutes) - website,0,0,0`, - }); + const data = `Label Title,Conversations count,Avg first response time (Minutes),Avg resolution time (Minutes) + website,0,0,0`; + axios.get.mockResolvedValue({ data }); const param = { from: 1632335400, to: 1632853800, type: 'label', fileName: 'label-report-01-09-2021.csv', }; - const mockLabelDownloadElement = createElementSpy(); await actions.downloadLabelReports(1, param); - expect(mockLabelDownloadElement.href).toEqual( - 'data:text/csv;charset=utf-8,Label%20Title,Conversations%20count,Avg%20first%20response%20time%20(Minutes),Avg%20resolution%20time%20(Minutes)%0A%20%20%20%20%20%20%20%20website,0,0,0' + expect(DownloadHelper.downloadCsvFile).toBeCalledWith( + param.fileName, + data ); - expect(mockLabelDownloadElement.download).toEqual(param.fileName); }); }); describe('#downloadInboxReports', () => { it('open CSV download prompt if API is success', async () => { - axios.get.mockResolvedValue({ - data: `Inbox name,Conversations count,Avg first response time (Minutes),Avg resolution time (Minutes) - Fayaz,2,127,0 - EMa,0,0,0 - Twillio WA,0,0,0`, - }); + const data = `Inbox name,Conversations count,Avg first response time (Minutes),Avg resolution time (Minutes) + Fayaz,2,127,0 + EMa,0,0,0 + Twillio WA,0,0,0`; + axios.get.mockResolvedValue({ data }); const param = { from: 1631039400, to: 1635013800, fileName: 'inbox-report-24-10-2021.csv', }; - const mockInboxDownloadElement = createElementSpy(); await actions.downloadInboxReports(1, param); - expect(mockInboxDownloadElement.href).toEqual( - 'data:text/csv;charset=utf-8,Inbox%20name,Conversations%20count,Avg%20first%20response%20time%20(Minutes),Avg%20resolution%20time%20(Minutes)%0A%20%20%20%20%20%20%20%20Fayaz,2,127,0%0A%20%20%20%20%20%20%20%20EMa,0,0,0%0A%20%20%20%20%20%20%20%20Twillio%20WA,0,0,0' + expect(DownloadHelper.downloadCsvFile).toBeCalledWith( + param.fileName, + data ); - expect(mockInboxDownloadElement.download).toEqual(param.fileName); }); }); describe('#downloadTeamReports', () => { it('open CSV download prompt if API is success', async () => { - axios.get.mockResolvedValue({ - data: `Team name,Conversations count,Avg first response time (Minutes),Avg resolution time (Minutes) - sales team,0,0,0 - Reporting period 2021-09-23 to 2021-09-29`, - }); + const data = `Team name,Conversations count,Avg first response time (Minutes),Avg resolution time (Minutes) + sales team,0,0,0 + Reporting period 2021-09-23 to 2021-09-29`; + axios.get.mockResolvedValue({ data }); const param = { from: 1631039400, to: 1635013800, fileName: 'inbox-report-24-10-2021.csv', }; - const mockInboxDownloadElement = createElementSpy(); await actions.downloadInboxReports(1, param); - expect(mockInboxDownloadElement.href).toEqual( - 'data:text/csv;charset=utf-8,Team%20name,Conversations%20count,Avg%20first%20response%20time%20(Minutes),Avg%20resolution%20time%20(Minutes)%0A%20%20%20%20%20%20%20%20sales%20team,0,0,0%0A%20%20%20%20%20%20%20%20Reporting%20period%202021-09-23%20to%202021-09-29' + expect(DownloadHelper.downloadCsvFile).toBeCalledWith( + param.fileName, + data ); - expect(mockInboxDownloadElement.download).toEqual(param.fileName); }); }); }); diff --git a/app/views/api/v1/accounts/csat_survey_responses/download.csv.erb b/app/views/api/v1/accounts/csat_survey_responses/download.csv.erb index 8b694ed35..5c0524480 100644 --- a/app/views/api/v1/accounts/csat_survey_responses/download.csv.erb +++ b/app/views/api/v1/accounts/csat_survey_responses/download.csv.erb @@ -24,7 +24,7 @@ contact&.phone_number.present? ? contact&.phone_number: nil, conversation ? app_account_conversation_url(account_id: Current.account.id, id: conversation.display_id): nil, csat_response.created_at, - ]) +]).html_safe -%> <% end %> <%= diff --git a/app/views/api/v2/accounts/reports/agents.csv.erb b/app/views/api/v2/accounts/reports/agents.csv.erb index 6738fe51b..9c8f1f814 100644 --- a/app/views/api/v2/accounts/reports/agents.csv.erb +++ b/app/views/api/v2/accounts/reports/agents.csv.erb @@ -5,7 +5,7 @@ I18n.t('reports.agent_csv.avg_resolution_time') ] %> -<%= CSV.generate_line headers %> +<%= CSV.generate_line headers -%> <% Current.account.users.each do |agent| %> <% agent_report = V2::ReportBuilder.new(Current.account, { type: :agent, @@ -14,6 +14,6 @@ until: params[:until] }).summary %> <% row = [ agent.name, agent_report[:conversations_count], (agent_report[:avg_first_response_time]/60).to_i, (agent_report[:avg_resolution_time]/60).to_i ] %> - <%= CSV.generate_line row %> +<%= CSV.generate_line row -%> <% end %> <%= CSV.generate_line [I18n.t('reports.period', since: Date.strptime(params[:since], '%s'), until: Date.strptime(params[:until], '%s'))] %> diff --git a/app/views/api/v2/accounts/reports/inboxes.csv.erb b/app/views/api/v2/accounts/reports/inboxes.csv.erb index 24548449a..c82be2df4 100644 --- a/app/views/api/v2/accounts/reports/inboxes.csv.erb +++ b/app/views/api/v2/accounts/reports/inboxes.csv.erb @@ -1,5 +1,5 @@ <% headers = ['Inbox name', 'Conversations count', 'Avg first response time (Minutes)', 'Avg resolution time (Minutes)'] %> -<%= CSV.generate_line headers %> +<%= CSV.generate_line headers -%> <% Current.account.inboxes.each do |inbox| %> <% inbox_report = V2::ReportBuilder.new(Current.account, { type: :inbox, @@ -8,5 +8,5 @@ until: params[:until] }).summary %> <% row = [ inbox.name, inbox_report[:conversations_count], (inbox_report[:avg_first_response_time]/60).to_i, (inbox_report[:avg_resolution_time]/60).to_i ] %> -<%= CSV.generate_line row %> -<% end %> \ No newline at end of file +<%= CSV.generate_line row -%> +<% end %> diff --git a/app/views/api/v2/accounts/reports/labels.csv.erb b/app/views/api/v2/accounts/reports/labels.csv.erb index 70ebbdf35..dcbc2b974 100644 --- a/app/views/api/v2/accounts/reports/labels.csv.erb +++ b/app/views/api/v2/accounts/reports/labels.csv.erb @@ -1,5 +1,5 @@ <% headers = ['Label Title', 'Conversations count', 'Avg first response time (Minutes)', 'Avg resolution time (Minutes)'] %> -<%= CSV.generate_line headers %> +<%= CSV.generate_line headers -%> <% Current.account.labels.each do |label| %> <% label_report = V2::ReportBuilder.new(Current.account, { type: :label, @@ -8,5 +8,5 @@ until: params[:until] }).summary %> <% row = [ label.title, label_report[:conversations_count], (label_report[:avg_first_response_time]/60).to_i, (label_report[:avg_resolution_time]/60).to_i ] %> -<%= CSV.generate_line row %> +<%= CSV.generate_line row -%> <% end %> diff --git a/app/views/api/v2/accounts/reports/teams.csv.erb b/app/views/api/v2/accounts/reports/teams.csv.erb index 55c679273..f7b82cb1d 100644 --- a/app/views/api/v2/accounts/reports/teams.csv.erb +++ b/app/views/api/v2/accounts/reports/teams.csv.erb @@ -5,7 +5,7 @@ I18n.t('reports.team_csv.avg_resolution_time') ] %> -<%= CSV.generate_line headers %> +<%= CSV.generate_line headers -%> <% Current.account.teams.each do |team| %> <% team_report = V2::ReportBuilder.new(Current.account, { type: :team, @@ -14,6 +14,6 @@ until: params[:until] }).summary %> <% row = [ team.name, team_report[:conversations_count], (team_report[:avg_first_response_time]/60).to_i, (team_report[:avg_resolution_time]/60).to_i ] %> - <%= CSV.generate_line row %> +<%= CSV.generate_line row -%> <% end %> <%= CSV.generate_line [I18n.t('reports.period', since: Date.strptime(params[:since], '%s'), until: Date.strptime(params[:until], '%s'))] %> From 8538660bbd69e43109d1c3292ad2b47261f02c30 Mon Sep 17 00:00:00 2001 From: "Aswin Dev P.S" Date: Thu, 19 May 2022 09:46:33 +0530 Subject: [PATCH 16/39] Add first_reply_created event in conversation (#4576) --- ...conversations_first_reply_scheduler_job.rb | 17 +++++++ app/listeners/reporting_event_listener.rb | 3 ++ app/models/conversation.rb | 44 +++++++++-------- ...first_reply_activity_at_to_conversation.rb | 23 +++++++++ db/schema.rb | 4 +- ...rsations_first_reply_scheduler_job_spec.rb | 48 +++++++++++++++++++ 6 files changed, 117 insertions(+), 22 deletions(-) create mode 100644 app/jobs/migration/conversations_first_reply_scheduler_job.rb create mode 100644 db/migrate/20220513145010_add_first_reply_activity_at_to_conversation.rb create mode 100644 spec/jobs/migration/conversations_first_reply_scheduler_job_spec.rb diff --git a/app/jobs/migration/conversations_first_reply_scheduler_job.rb b/app/jobs/migration/conversations_first_reply_scheduler_job.rb new file mode 100644 index 000000000..509357c1e --- /dev/null +++ b/app/jobs/migration/conversations_first_reply_scheduler_job.rb @@ -0,0 +1,17 @@ +# Delete migration and spec after 2 consecutive releases. +class Migration::ConversationsFirstReplySchedulerJob < ApplicationJob + queue_as :scheduled_jobs + + def perform(account) + account.conversations.each do |conversation| + # rubocop:disable Rails/SkipsModelValidations + if conversation.messages.outgoing.where("(additional_attributes->'campaign_id') is null").count.positive? + conversation.update_columns(first_reply_created_at: conversation.messages.outgoing.where("(additional_attributes->'campaign_id') is null") + .first.created_at) + else + conversation.update_columns(first_reply_created_at: nil) + end + # rubocop:enable Rails/SkipsModelValidations + end + end +end diff --git a/app/listeners/reporting_event_listener.rb b/app/listeners/reporting_event_listener.rb index d87b6574b..abd28ad32 100644 --- a/app/listeners/reporting_event_listener.rb +++ b/app/listeners/reporting_event_listener.rb @@ -36,6 +36,9 @@ class ReportingEventListener < BaseListener event_start_time: conversation.created_at, event_end_time: message.created_at ) + # rubocop:disable Rails/SkipsModelValidations + conversation.update_columns(first_reply_created_at: message.created_at) + # rubocop:enable Rails/SkipsModelValidations reporting_event.save end end diff --git a/app/models/conversation.rb b/app/models/conversation.rb index ac02260a5..643f8fa56 100644 --- a/app/models/conversation.rb +++ b/app/models/conversation.rb @@ -2,27 +2,28 @@ # # Table name: conversations # -# id :integer not null, primary key -# additional_attributes :jsonb -# agent_last_seen_at :datetime -# assignee_last_seen_at :datetime -# contact_last_seen_at :datetime -# custom_attributes :jsonb -# identifier :string -# last_activity_at :datetime not null -# snoozed_until :datetime -# status :integer default("open"), not null -# uuid :uuid not null -# created_at :datetime not null -# updated_at :datetime not null -# account_id :integer not null -# assignee_id :integer -# campaign_id :bigint -# contact_id :bigint -# contact_inbox_id :bigint -# display_id :integer not null -# inbox_id :integer not null -# team_id :bigint +# id :integer not null, primary key +# additional_attributes :jsonb +# agent_last_seen_at :datetime +# assignee_last_seen_at :datetime +# contact_last_seen_at :datetime +# custom_attributes :jsonb +# first_reply_created_at :datetime +# identifier :string +# last_activity_at :datetime not null +# snoozed_until :datetime +# status :integer default("open"), not null +# uuid :uuid not null +# created_at :datetime not null +# updated_at :datetime not null +# account_id :integer not null +# assignee_id :integer +# campaign_id :bigint +# contact_id :bigint +# contact_inbox_id :bigint +# display_id :integer not null +# inbox_id :integer not null +# team_id :bigint # # Indexes # @@ -31,6 +32,7 @@ # index_conversations_on_assignee_id_and_account_id (assignee_id,account_id) # index_conversations_on_campaign_id (campaign_id) # index_conversations_on_contact_inbox_id (contact_inbox_id) +# index_conversations_on_first_reply_created_at (first_reply_created_at) # index_conversations_on_last_activity_at (last_activity_at) # index_conversations_on_status_and_account_id (status,account_id) # index_conversations_on_team_id (team_id) diff --git a/db/migrate/20220513145010_add_first_reply_activity_at_to_conversation.rb b/db/migrate/20220513145010_add_first_reply_activity_at_to_conversation.rb new file mode 100644 index 000000000..9afb58feb --- /dev/null +++ b/db/migrate/20220513145010_add_first_reply_activity_at_to_conversation.rb @@ -0,0 +1,23 @@ +class AddFirstReplyActivityAtToConversation < ActiveRecord::Migration[6.1] + def change + add_column :conversations, :first_reply_created_at, :datetime + add_index :conversations, :first_reply_created_at + + # rubocop:disable Rails/SkipsModelValidations + ::Conversation.update_all(first_reply_created_at: Time.now.utc) + # rubocop:enable Rails/SkipsModelValidations + + backfill_first_reply_activity_at_to_conversations + end + + private + + def backfill_first_reply_activity_at_to_conversations + ::Account.find_in_batches do |account_batch| + Rails.logger.info "Migrated till #{account_batch.first.id}\n" + account_batch.each do |account| + Migration::ConversationsFirstReplySchedulerJob.perform_later(account) + end + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 32f7dbefb..e7382572e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_05_11_072655) do +ActiveRecord::Schema.define(version: 2022_05_13_145010) do # These are extensions that must be enabled in order to support this database enable_extension "pg_stat_statements" @@ -385,11 +385,13 @@ ActiveRecord::Schema.define(version: 2022_05_11_072655) do t.datetime "snoozed_until" t.jsonb "custom_attributes", default: {} t.datetime "assignee_last_seen_at" + t.datetime "first_reply_created_at" t.index ["account_id", "display_id"], name: "index_conversations_on_account_id_and_display_id", unique: true t.index ["account_id"], name: "index_conversations_on_account_id" t.index ["assignee_id", "account_id"], name: "index_conversations_on_assignee_id_and_account_id" t.index ["campaign_id"], name: "index_conversations_on_campaign_id" t.index ["contact_inbox_id"], name: "index_conversations_on_contact_inbox_id" + t.index ["first_reply_created_at"], name: "index_conversations_on_first_reply_created_at" t.index ["last_activity_at"], name: "index_conversations_on_last_activity_at" t.index ["status", "account_id"], name: "index_conversations_on_status_and_account_id" t.index ["team_id"], name: "index_conversations_on_team_id" diff --git a/spec/jobs/migration/conversations_first_reply_scheduler_job_spec.rb b/spec/jobs/migration/conversations_first_reply_scheduler_job_spec.rb new file mode 100644 index 000000000..f16b51a3a --- /dev/null +++ b/spec/jobs/migration/conversations_first_reply_scheduler_job_spec.rb @@ -0,0 +1,48 @@ +require 'rails_helper' + +RSpec.describe Migration::ConversationsFirstReplySchedulerJob, type: :job do + subject(:job) { described_class.perform_later } + + let!(:account) { create(:account) } + let!(:inbox) { create(:inbox, account: account) } + let!(:user) { create(:user, account: account) } + + it 'enqueues the job' do + expect { job }.to have_enqueued_job(described_class) + .on_queue('scheduled_jobs') + end + + context 'when there is an outgoing message in conversation' do + let!(:conversation) { create(:conversation, account: account, inbox: inbox, assignee: user) } + let!(:message) do + create(:message, content: 'Hi', message_type: 'outgoing', account: account, inbox: inbox, + conversation: conversation) + end + + it 'updates the conversation first reply with the first outgoing message created time' do + create(:message, content: 'Hello', message_type: 'outgoing', account: account, inbox: inbox, + conversation: conversation) + + described_class.perform_now(account) + conversation.reload + + expect(conversation.messages.count).to eq 2 + expect(conversation.first_reply_created_at.to_i).to eq message.created_at.to_i + end + end + + context 'when there is no outgoing message in conversation' do + let!(:conversation) { create(:conversation, account: account, inbox: inbox, assignee: user) } + + it 'updates the conversation first reply with nil' do + create(:message, content: 'Hello', message_type: 'incoming', account: account, inbox: inbox, + conversation: conversation) + + described_class.perform_now(account) + conversation.reload + + expect(conversation.messages.count).to eq 1 + expect(conversation.first_reply_created_at).to be_nil + end + end +end From 11ea8a3032a7199c71308fbcc5d52056d73412a9 Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Thu, 19 May 2022 21:43:23 +0530 Subject: [PATCH 17/39] chore: Update the documentation for configuring webhooks in the account (#4703) --- swagger/definitions/index.yml | 8 +- .../webhooks/create_update_payload.yml | 18 ++ swagger/definitions/resource/webhook.yml | 24 +++ swagger/index.yml | 17 +- swagger/parameters/index.yml | 3 + swagger/parameters/webhook_id.yml | 5 + swagger/paths/application/webhooks/create.yml | 19 ++ swagger/paths/application/webhooks/delete.yml | 12 ++ swagger/paths/application/webhooks/index.yml | 15 ++ swagger/paths/application/webhooks/update.yml | 19 ++ swagger/paths/index.yml | 17 ++ swagger/swagger.json | 201 +++++++++++++++++- 12 files changed, 340 insertions(+), 18 deletions(-) create mode 100644 swagger/definitions/request/webhooks/create_update_payload.yml create mode 100644 swagger/definitions/resource/webhook.yml create mode 100644 swagger/parameters/webhook_id.yml create mode 100644 swagger/paths/application/webhooks/create.yml create mode 100644 swagger/paths/application/webhooks/delete.yml create mode 100644 swagger/paths/application/webhooks/index.yml create mode 100644 swagger/paths/application/webhooks/update.yml diff --git a/swagger/definitions/index.yml b/swagger/definitions/index.yml index c06dd1471..5e22a7099 100644 --- a/swagger/definitions/index.yml +++ b/swagger/definitions/index.yml @@ -36,6 +36,8 @@ contactable_inboxes: $ref: ./resource/contactable_inboxes.yml custom_filter: $ref: ./resource/custom_filter.yml +webhook: + $ref: ./resource/webhook.yml account: $ref: ./resource/account.yml platform_account: @@ -91,6 +93,9 @@ team_create_update_payload: custom_filter_create_update_payload: $ref: ./request/custom_filter/create_update_payload.yml +webhook_create_update_payload: + $ref: ./request/webhooks/create_update_payload.yml + integrations_hook_create_payload: $ref: ./request/integrations/hook_create_payload.yml @@ -158,6 +163,3 @@ account_summary: $ref: './resource/reports/summary.yml' agent_conversation_metrics: $ref: './resource/reports/conversation/agent.yml' - - - diff --git a/swagger/definitions/request/webhooks/create_update_payload.yml b/swagger/definitions/request/webhooks/create_update_payload.yml new file mode 100644 index 000000000..417843fe6 --- /dev/null +++ b/swagger/definitions/request/webhooks/create_update_payload.yml @@ -0,0 +1,18 @@ +type: object +properties: + url: + type: string + description: The url where the events should be sent + subscriptions: + type: array + items: + type: string + enum: [ + "conversation_created", + "conversation_status_changed", + "conversation_updated", + "message_created", + "message_updated", + "webwidget_triggered" + ] + description: The events you want to subscribe to. diff --git a/swagger/definitions/resource/webhook.yml b/swagger/definitions/resource/webhook.yml new file mode 100644 index 000000000..1e4c58904 --- /dev/null +++ b/swagger/definitions/resource/webhook.yml @@ -0,0 +1,24 @@ +type: object +properties: + id: + type: number + description: The ID of the webhook + url: + type: string + description: The url to which the events will be send + subscriptions: + type: array + items: + type: string + enum: [ + "conversation_created", + "conversation_status_changed", + "conversation_updated", + "message_created", + "message_updated", + "webwidget_triggered" + ] + description: The list of subscribed events + account_id: + type: number + description: The id of the account which the webhook object belongs to diff --git a/swagger/index.yml b/swagger/index.yml index b2dd91e46..f64a090e7 100644 --- a/swagger/index.yml +++ b/swagger/index.yml @@ -56,17 +56,18 @@ x-tagGroups: - Agents - Canned Responses - Contacts - - Conversations - Conversation Assignment - Conversation Labels - - Inboxes - - Messages - - Integrations - - Profile - - Teams - - Custom Filters - - Reports + - Conversations - Custom Attributes + - Custom Filters + - Inboxes + - Integrations + - Messages + - Profile + - Reports + - Teams + - Webhooks - name: Client tags: - Contacts API diff --git a/swagger/parameters/index.yml b/swagger/parameters/index.yml index d69640369..2c61a6a01 100644 --- a/swagger/parameters/index.yml +++ b/swagger/parameters/index.yml @@ -25,6 +25,9 @@ conversation_id: custom_filter_id: $ref: ./custom_filter_id.yml +webhook_id: + $ref: ./webhook_id.yml + message_id: $ref: ./message_id.yml diff --git a/swagger/parameters/webhook_id.yml b/swagger/parameters/webhook_id.yml new file mode 100644 index 000000000..4400a082c --- /dev/null +++ b/swagger/parameters/webhook_id.yml @@ -0,0 +1,5 @@ +in: path +name: webhook_id +type: integer +required: true +description: The numeric ID of the webhook diff --git a/swagger/paths/application/webhooks/create.yml b/swagger/paths/application/webhooks/create.yml new file mode 100644 index 000000000..e4d3053ee --- /dev/null +++ b/swagger/paths/application/webhooks/create.yml @@ -0,0 +1,19 @@ +tags: + - Webhooks +operationId: create-a-webhook +summary: Add a webhook +description: Add a webhook subscription to the account +parameters: + - $ref: '#/parameters/account_id' + - name: data + in: body + required: true + schema: + $ref: '#/definitions/webhook_create_update_payload' +responses: + 200: + description: Success + schema: + $ref: '#/definitions/webhook' + 401: + description: Unauthorized diff --git a/swagger/paths/application/webhooks/delete.yml b/swagger/paths/application/webhooks/delete.yml new file mode 100644 index 000000000..525c22dfc --- /dev/null +++ b/swagger/paths/application/webhooks/delete.yml @@ -0,0 +1,12 @@ +tags: + - Webhooks +operationId: delete-a-webhook +summary: Delete a webhook +description: Delete a webhook from the account +responses: + 200: + description: Success + 401: + description: Unauthorized + 404: + description: The webhook does not exist in the account diff --git a/swagger/paths/application/webhooks/index.yml b/swagger/paths/application/webhooks/index.yml new file mode 100644 index 000000000..f96fa00de --- /dev/null +++ b/swagger/paths/application/webhooks/index.yml @@ -0,0 +1,15 @@ +tags: + - Webhooks +operationId: list-all-webhooks +summary: List all webhooks +description: List all webhooks in the account +responses: + 200: + description: Success + schema: + type: array + description: 'Array of webhook objects' + items: + $ref: '#/definitions/webhook' + 401: + description: Unauthorized diff --git a/swagger/paths/application/webhooks/update.yml b/swagger/paths/application/webhooks/update.yml new file mode 100644 index 000000000..b395e7362 --- /dev/null +++ b/swagger/paths/application/webhooks/update.yml @@ -0,0 +1,19 @@ +tags: + - Webhooks +operationId: update-a-webhook +summary: Update a webhook object +description: Update a webhook object in the account +parameters: + - $ref: '#/parameters/account_id' + - name: data + in: body + required: true + schema: + $ref: '#/definitions/webhook_create_update_payload' +responses: + 200: + description: Success + schema: + $ref: '#/definitions/webhook' + 401: + description: Unauthorized diff --git a/swagger/paths/index.yml b/swagger/paths/index.yml index 2175a3154..084065a9a 100644 --- a/swagger/paths/index.yml +++ b/swagger/paths/index.yml @@ -385,6 +385,23 @@ delete: $ref: ./application/custom_filters/delete.yml +# webhooks +/api/v1/accounts/{account_id}/webhooks: + parameters: + - $ref: '#/parameters/account_id' + get: + $ref: ./application/webhooks/index.yml + post: + $ref: ./application/webhooks/create.yml +/api/v1/accounts/{account_id}/webhooks/{webhook_id}: + parameters: + - $ref: '#/parameters/account_id' + - $ref: '#/parameters/webhook_id' + patch: + $ref: ./application/webhooks/update.yml + delete: + $ref: ./application/webhooks/delete.yml + ### Reports # List diff --git a/swagger/swagger.json b/swagger/swagger.json index ec1bf8a25..9103fe13e 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -4081,6 +4081,129 @@ } } }, + "/api/v1/accounts/{account_id}/webhooks": { + "parameters": [ + { + "$ref": "#/parameters/account_id" + } + ], + "get": { + "tags": [ + "Webhooks" + ], + "operationId": "list-all-webhooks", + "summary": "List all webhooks", + "description": "List all webhooks in the account", + "responses": { + "200": { + "description": "Success", + "schema": { + "type": "array", + "description": "Array of webhook objects", + "items": { + "$ref": "#/definitions/webhook" + } + } + }, + "401": { + "description": "Unauthorized" + } + } + }, + "post": { + "tags": [ + "Webhooks" + ], + "operationId": "create-a-webhook", + "summary": "Add a webhook", + "description": "Add a webhook subscription to the account", + "parameters": [ + { + "$ref": "#/parameters/account_id" + }, + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/webhook_create_update_payload" + } + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/webhook" + } + }, + "401": { + "description": "Unauthorized" + } + } + } + }, + "/api/v1/accounts/{account_id}/webhooks/{webhook_id}": { + "parameters": [ + { + "$ref": "#/parameters/account_id" + }, + { + "$ref": "#/parameters/webhook_id" + } + ], + "patch": { + "tags": [ + "Webhooks" + ], + "operationId": "update-a-webhook", + "summary": "Update a webhook object", + "description": "Update a webhook object in the account", + "parameters": [ + { + "$ref": "#/parameters/account_id" + }, + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/webhook_create_update_payload" + } + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/webhook" + } + }, + "401": { + "description": "Unauthorized" + } + } + }, + "delete": { + "tags": [ + "Webhooks" + ], + "operationId": "delete-a-webhook", + "summary": "Delete a webhook", + "description": "Delete a webhook from the account", + "responses": { + "200": { + "description": "Success" + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "The webhook does not exist in the account" + } + } + } + }, "/api/v2/accounts/{account_id}/reports": { "parameters": [ { @@ -4772,6 +4895,38 @@ } } }, + "webhook": { + "type": "object", + "properties": { + "id": { + "type": "number", + "description": "The ID of the webhook" + }, + "url": { + "type": "string", + "description": "The url to which the events will be send" + }, + "subscriptions": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "conversation_created", + "conversation_status_changed", + "conversation_updated", + "message_created", + "message_updated", + "webwidget_triggered" + ] + }, + "description": "The list of subscribed events" + }, + "account_id": { + "type": "number", + "description": "The id of the account which the webhook object belongs to" + } + } + }, "account": { "type": "object", "properties": { @@ -5223,6 +5378,30 @@ } } }, + "webhook_create_update_payload": { + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "The url where the events should be sent" + }, + "subscriptions": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "conversation_created", + "conversation_status_changed", + "conversation_updated", + "message_created", + "message_updated", + "webwidget_triggered" + ] + }, + "description": "The events you want to subscribe to." + } + } + }, "integrations_hook_create_payload": { "type": "object", "properties": { @@ -5736,6 +5915,13 @@ "required": true, "description": "The numeric ID of the custom filter" }, + "webhook_id": { + "in": "path", + "name": "webhook_id", + "type": "integer", + "required": true, + "description": "The numeric ID of the webhook" + }, "message_id": { "in": "path", "name": "message_id", @@ -5819,17 +6005,18 @@ "Agents", "Canned Responses", "Contacts", - "Conversations", "Conversation Assignment", "Conversation Labels", - "Inboxes", - "Messages", - "Integrations", - "Profile", - "Teams", + "Conversations", + "Custom Attributes", "Custom Filters", + "Inboxes", + "Integrations", + "Messages", + "Profile", "Reports", - "Custom Attributes" + "Teams", + "Webhooks" ] }, { From 59969cc5536f63e926ad999e79f136bfb1e1ed03 Mon Sep 17 00:00:00 2001 From: "Aswin Dev P.S" Date: Sun, 22 May 2022 13:08:41 +0530 Subject: [PATCH 18/39] chore: Update conversations API to include unattended conversations. (#4708) * Update conversations API to include unattended conversations. --- app/finders/conversation_finder.rb | 5 +++++ .../accounts/conversations_controller_spec.rb | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/app/finders/conversation_finder.rb b/app/finders/conversation_finder.rb index 58013f128..ecbccfb88 100644 --- a/app/finders/conversation_finder.rb +++ b/app/finders/conversation_finder.rb @@ -51,6 +51,7 @@ class ConversationFinder filter_by_team if @team filter_by_labels if params[:labels] filter_by_query if params[:q] + filter_by_reply_status end def set_inboxes @@ -90,6 +91,10 @@ class ConversationFinder @conversations end + def filter_by_reply_status + @conversations = @conversations.where(first_reply_created_at: nil) if params[:reply_status] == 'unattended' + end + def filter_by_query allowed_message_types = [Message.message_types[:incoming], Message.message_types[:outgoing]] @conversations = conversations.joins(:messages).where('messages.content ILIKE :search', search: "%#{params[:q]}%") diff --git a/spec/controllers/api/v1/accounts/conversations_controller_spec.rb b/spec/controllers/api/v1/accounts/conversations_controller_spec.rb index 8a874fc56..102e12477 100644 --- a/spec/controllers/api/v1/accounts/conversations_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/conversations_controller_spec.rb @@ -15,6 +15,8 @@ RSpec.describe 'Conversations API', type: :request do context 'when it is an authenticated user' do let(:agent) { create(:user, account: account, role: :agent) } let(:conversation) { create(:conversation, account: account) } + let(:attended_conversation) { create(:conversation, account: account, first_reply_created_at: Time.now.utc) } + let(:unattended_conversation) { create(:conversation, account: account, first_reply_created_at: nil) } before do create(:inbox_member, user: agent, inbox: conversation.inbox) @@ -43,6 +45,22 @@ RSpec.describe 'Conversations API', type: :request do expect(body[:data][:meta][:all_count]).to eq(1) expect(body[:data][:payload].first[:messages]).to eq([]) end + + it 'returns unattended conversations' do + agent_1 = create(:user, account: account, role: :agent) + create(:inbox_member, user: agent_1, inbox: attended_conversation.inbox) + create(:inbox_member, user: agent_1, inbox: unattended_conversation.inbox) + + get "/api/v1/accounts/#{account.id}/conversations", + headers: agent_1.create_new_auth_token, + params: { reply_status: 'unattended' }, + as: :json + + expect(response).to have_http_status(:success) + body = JSON.parse(response.body, symbolize_names: true) + expect(body[:data][:meta][:all_count]).to eq(1) + expect(body[:data][:payload].count).to eq(1) + end end end From f74a1f7d5ac2dc58a168eaab2728e3fe0de34be3 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Mon, 23 May 2022 11:33:54 +0530 Subject: [PATCH 19/39] chore: Update translations (#4691) --- .../dashboard/i18n/locale/ar/report.json | 1 + .../dashboard/i18n/locale/bg/report.json | 1 + .../dashboard/i18n/locale/bg/settings.json | 2 +- .../dashboard/i18n/locale/ca/report.json | 1 + .../dashboard/i18n/locale/cs/chatlist.json | 6 +- .../i18n/locale/cs/conversation.json | 64 +++++++++---------- .../dashboard/i18n/locale/cs/report.json | 41 ++++++------ .../dashboard/i18n/locale/cs/settings.json | 2 +- .../dashboard/i18n/locale/da/report.json | 1 + .../dashboard/i18n/locale/de/report.json | 1 + .../dashboard/i18n/locale/el/inboxMgmt.json | 4 +- .../dashboard/i18n/locale/el/report.json | 1 + .../dashboard/i18n/locale/es/report.json | 1 + .../dashboard/i18n/locale/fa/inboxMgmt.json | 4 +- .../dashboard/i18n/locale/fa/report.json | 1 + .../dashboard/i18n/locale/fi/report.json | 1 + .../dashboard/i18n/locale/fr/report.json | 1 + .../dashboard/i18n/locale/he/report.json | 1 + .../dashboard/i18n/locale/hi/report.json | 1 + .../dashboard/i18n/locale/hu/report.json | 1 + .../dashboard/i18n/locale/id/report.json | 1 + .../dashboard/i18n/locale/it/report.json | 1 + .../i18n/locale/ja/advancedFilters.json | 52 +++++++-------- .../dashboard/i18n/locale/ja/contact.json | 2 +- .../i18n/locale/ja/contactFilters.json | 26 ++++---- .../dashboard/i18n/locale/ja/report.json | 1 + .../i18n/locale/ja/teamsSettings.json | 10 +-- .../dashboard/i18n/locale/ko/report.json | 1 + .../dashboard/i18n/locale/lv/report.json | 1 + .../dashboard/i18n/locale/ml/report.json | 1 + .../dashboard/i18n/locale/ne/report.json | 1 + .../dashboard/i18n/locale/nl/report.json | 1 + .../dashboard/i18n/locale/no/report.json | 1 + .../dashboard/i18n/locale/pl/report.json | 1 + .../dashboard/i18n/locale/pt/report.json | 1 + .../dashboard/i18n/locale/pt_BR/report.json | 1 + .../dashboard/i18n/locale/ro/report.json | 1 + .../dashboard/i18n/locale/ru/report.json | 1 + .../dashboard/i18n/locale/sk/report.json | 1 + .../dashboard/i18n/locale/sr/report.json | 1 + .../dashboard/i18n/locale/sv/report.json | 1 + .../dashboard/i18n/locale/ta/report.json | 1 + .../dashboard/i18n/locale/th/report.json | 1 + .../dashboard/i18n/locale/tr/report.json | 1 + .../dashboard/i18n/locale/uk/report.json | 1 + .../dashboard/i18n/locale/ur/report.json | 1 + .../dashboard/i18n/locale/ur_IN/report.json | 1 + .../dashboard/i18n/locale/vi/report.json | 1 + .../dashboard/i18n/locale/zh_CN/report.json | 1 + .../dashboard/i18n/locale/zh_TW/report.json | 1 + app/javascript/survey/i18n/locale/cs.json | 10 +-- app/javascript/widget/i18n/locale/cs.json | 20 +++--- app/javascript/widget/i18n/locale/fr.json | 14 ++-- config/locales/ar.yml | 10 +++ config/locales/bg.yml | 10 +++ config/locales/ca.yml | 10 +++ config/locales/cs.yml | 10 +++ config/locales/da.yml | 10 +++ config/locales/de.yml | 10 +++ config/locales/el.yml | 10 +++ config/locales/es.yml | 10 +++ config/locales/fa.yml | 10 +++ config/locales/fi.yml | 10 +++ config/locales/fr.yml | 10 +++ config/locales/he.yml | 10 +++ config/locales/hi.yml | 10 +++ config/locales/hu.yml | 10 +++ config/locales/id.yml | 10 +++ config/locales/it.yml | 10 +++ config/locales/ja.yml | 10 +++ config/locales/ko.yml | 10 +++ config/locales/lv.yml | 10 +++ config/locales/ml.yml | 10 +++ config/locales/ne.yml | 10 +++ config/locales/nl.yml | 10 +++ config/locales/no.yml | 10 +++ config/locales/pl.yml | 10 +++ config/locales/pt.yml | 10 +++ config/locales/pt_BR.yml | 10 +++ config/locales/ro.yml | 10 +++ config/locales/ru.yml | 10 +++ config/locales/sk.yml | 10 +++ config/locales/sr.yml | 10 +++ config/locales/sv.yml | 10 +++ config/locales/ta.yml | 10 +++ config/locales/th.yml | 10 +++ config/locales/tr.yml | 10 +++ config/locales/uk.yml | 10 +++ config/locales/ur.yml | 10 +++ config/locales/ur_IN.yml | 10 +++ config/locales/vi.yml | 10 +++ config/locales/zh_CN.yml | 10 +++ config/locales/zh_TW.yml | 10 +++ 93 files changed, 568 insertions(+), 128 deletions(-) diff --git a/app/javascript/dashboard/i18n/locale/ar/report.json b/app/javascript/dashboard/i18n/locale/ar/report.json index b690b7036..19180a51a 100644 --- a/app/javascript/dashboard/i18n/locale/ar/report.json +++ b/app/javascript/dashboard/i18n/locale/ar/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "تقارير CSAT", "NO_RECORDS": "لا توجد ردود متوفرة على الدراسة الاستقصائية CSAT.", + "DOWNLOAD": "تحميل تقرير رضاء خدمة العملاء", "FILTERS": { "AGENTS": { "PLACEHOLDER": "اختر الوكلاء" diff --git a/app/javascript/dashboard/i18n/locale/bg/report.json b/app/javascript/dashboard/i18n/locale/bg/report.json index 1d4f82066..939c9a51b 100644 --- a/app/javascript/dashboard/i18n/locale/bg/report.json +++ b/app/javascript/dashboard/i18n/locale/bg/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/bg/settings.json b/app/javascript/dashboard/i18n/locale/bg/settings.json index 0eb08ee74..2c5909d8b 100644 --- a/app/javascript/dashboard/i18n/locale/bg/settings.json +++ b/app/javascript/dashboard/i18n/locale/bg/settings.json @@ -21,7 +21,7 @@ }, "MESSAGE_SIGNATURE_SECTION": { "TITLE": "Personal message signature", - "NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.", + "NOTE": "Create a personal message signature that would be added to all the messages you send from the platform. Use the rich content editor to create a highly personalised signature.", "BTN_TEXT": "Save message signature", "API_ERROR": "Couldn't save signature! Try again", "API_SUCCESS": "Signature saved successfully" diff --git a/app/javascript/dashboard/i18n/locale/ca/report.json b/app/javascript/dashboard/i18n/locale/ca/report.json index 32d8c2625..6ffcf856f 100644 --- a/app/javascript/dashboard/i18n/locale/ca/report.json +++ b/app/javascript/dashboard/i18n/locale/ca/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/cs/chatlist.json b/app/javascript/dashboard/i18n/locale/cs/chatlist.json index 1e5dc3228..42aec5950 100644 --- a/app/javascript/dashboard/i18n/locale/cs/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/cs/chatlist.json @@ -7,7 +7,7 @@ "404": "V této skupině nejsou žádné aktivní konverzace." }, "TAB_HEADING": "Konverzace", - "MENTION_HEADING": "Mentions", + "MENTION_HEADING": "Zmínka", "SEARCH": { "INPUT": "Hledat lidi, chaty, Uložené odpovědi .." }, @@ -76,12 +76,12 @@ "RECEIVED_VIA_EMAIL": "Obdrženo e-mailem", "VIEW_TWEET_IN_TWITTER": "Zobrazit tweet na Twitteru", "REPLY_TO_TWEET": "Odpovědět na tento tweet", - "LINK_TO_STORY": "Go to instagram story", + "LINK_TO_STORY": "Přejít na instagram příběh", "SENT": "Sent successfully", "NO_MESSAGES": "Žádné zprávy", "NO_CONTENT": "Žádný obsah k dispozici", "HIDE_QUOTED_TEXT": "Hide Quoted Text", "SHOW_QUOTED_TEXT": "Show Quoted Text", - "MESSAGE_READ": "Read" + "MESSAGE_READ": "Přečteno" } } diff --git a/app/javascript/dashboard/i18n/locale/cs/conversation.json b/app/javascript/dashboard/i18n/locale/cs/conversation.json index 34b519dd1..ee68d3fc0 100644 --- a/app/javascript/dashboard/i18n/locale/cs/conversation.json +++ b/app/javascript/dashboard/i18n/locale/cs/conversation.json @@ -1,7 +1,7 @@ { "CONVERSATION": { "404": "Vyberte prosím konverzaci z levého panelu", - "UNVERIFIED_SESSION": "The identity of this user is not verified", + "UNVERIFIED_SESSION": "Identita tohoto uživatele není ověřena", "NO_MESSAGE_1": "Ale ne! Vypadá to, že ve vaší schránce nejsou žádné zprávy od zákazníků.", "NO_MESSAGE_2": " pro odeslání zprávy na vaši stránku!", "NO_INBOX_1": "Hola! Zdá se, že jste ještě nepřidali žádné schránky.", @@ -22,7 +22,7 @@ "LOADING_CONVERSATIONS": "Načítání konverzací", "CANNOT_REPLY": "Nemůžete odpovědět z důvodu", "24_HOURS_WINDOW": "24 hodinové omezení okna", - "NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?", + "NOT_ASSIGNED_TO_YOU": "Tato konverzace vám není přiřazena. Chcete si přiřadit tuto konverzaci?", "ASSIGN_TO_ME": "Přiřadit mi", "TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to", "TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 hodinové omezení okna", @@ -32,7 +32,7 @@ "DOWNLOAD": "Stáhnout", "UPLOADING_ATTACHMENTS": "Nahrávání příloh...", "SUCCESS_DELETE_MESSAGE": "Zpráva byla úspěšně smazána", - "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", + "FAIL_DELETE_MESSSAGE": "Zpráva se nepodařilo odstranit! Zkuste to znovu", "NO_RESPONSE": "Bez odpovědi", "RATING_TITLE": "Hodnocení", "FEEDBACK_TITLE": "Zpětná vazba", @@ -43,12 +43,12 @@ "OPEN": "Více", "CLOSE": "Zavřít", "DETAILS": "Podrobnosti", - "SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow", - "SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week", - "SNOOZED_UNTIL_NEXT_REPLY": "Snoozed until next reply" + "SNOOZED_UNTIL_TOMORROW": "Odloženo do zítřka", + "SNOOZED_UNTIL_NEXT_WEEK": "Odloženo do příštího týdne", + "SNOOZED_UNTIL_NEXT_REPLY": "Odloženo do další odpovědi" }, "RESOLVE_DROPDOWN": { - "MARK_PENDING": "Mark as pending", + "MARK_PENDING": "Označit jako nevyřízené", "SNOOZE": { "TITLE": "Odložit do", "NEXT_REPLY": "Další odpověď", @@ -57,13 +57,13 @@ } }, "FOOTER": { - "MESSAGE_SIGN_TOOLTIP": "Message signature", - "ENABLE_SIGN_TOOLTIP": "Enable signature", - "DISABLE_SIGN_TOOLTIP": "Disable signature", + "MESSAGE_SIGN_TOOLTIP": "Podpis zprávy", + "ENABLE_SIGN_TOOLTIP": "Povolit podpis", + "DISABLE_SIGN_TOOLTIP": "Zakázat podpis", "MSG_INPUT": "Shift + zadejte pro nový řádek. Začněte '/' pro výběr zrušené odpovědi.", "PRIVATE_MSG_INPUT": "Shift + zadejte pro nový řádek. Toto bude viditelné pouze pro agenty", "MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.", - "CLICK_HERE": "Click here to update" + "CLICK_HERE": "Klikněte zde pro aktualizaci" }, "REPLYBOX": { "REPLY": "Odpověď", @@ -77,7 +77,7 @@ "TIP_AUDIORECORDER_ICON": "Record audio", "TIP_AUDIORECORDER_PERMISSION": "Allow access to audio", "TIP_AUDIORECORDER_ERROR": "Could not open the audio", - "ENTER_TO_SEND": "Enter to send", + "ENTER_TO_SEND": "Enterem odeslat", "DRAG_DROP": "Drag and drop here to attach", "START_AUDIO_RECORDING": "Start audio recording", "STOP_AUDIO_RECORDING": "Stop audio recording", @@ -101,11 +101,11 @@ "CHANGE_AGENT": "Konverzace pověřená osoba změněna", "CHANGE_TEAM": "Tým konverzace se změnil", "FILE_SIZE_LIMIT": "Soubor překračuje limit {MAXIMUM_FILE_UPLOAD_SIZE} přílohy", - "MESSAGE_ERROR": "Unable to send this message, please try again later", + "MESSAGE_ERROR": "Nepodařilo se odeslat tuto zprávu, zkuste to prosím později", "SENT_BY": "Odeslal:", "BOT": "Bot", - "SEND_FAILED": "Couldn't send message! Try again", - "TRY_AGAIN": "retry", + "SEND_FAILED": "Odeslání zprávy se nezdařilo! Zkuste to znovu", + "TRY_AGAIN": "opakovat", "ASSIGNMENT": { "SELECT_AGENT": "Vybrat agenta", "REMOVE": "Odebrat", @@ -165,37 +165,37 @@ "PLACEHOLDER": "Nic" }, "ACCORDION": { - "CONTACT_DETAILS": "Contact Details", - "CONVERSATION_ACTIONS": "Conversation Actions", - "CONVERSATION_LABELS": "Conversation Labels", - "CONVERSATION_INFO": "Conversation Information", - "CONTACT_ATTRIBUTES": "Contact Attributes", + "CONTACT_DETAILS": "Podrobnosti kontaktu", + "CONVERSATION_ACTIONS": "Akce konverzace", + "CONVERSATION_LABELS": "Štítky konverzace", + "CONVERSATION_INFO": "Informace o konverzaci", + "CONTACT_ATTRIBUTES": "Atributy kontaktu", "PREVIOUS_CONVERSATION": "Předchozí konverzace" } }, "CONVERSATION_CUSTOM_ATTRIBUTES": { - "ADD_BUTTON_TEXT": "Create attribute", + "ADD_BUTTON_TEXT": "Vytvořit atribut", "UPDATE": { - "SUCCESS": "Attribute updated successfully", - "ERROR": "Unable to update attribute. Please try again later" + "SUCCESS": "Atribut byl úspěšně aktualizován", + "ERROR": "Atribut nelze aktualizovat. Zkuste to prosím později" }, "ADD": { - "TITLE": "Add", - "SUCCESS": "Attribute added successfully", - "ERROR": "Unable to add attribute. Please try again later" + "TITLE": "Přidat", + "SUCCESS": "Atribut byl úspěšně přidán", + "ERROR": "Nelze přidat atribut. Zkuste to prosím později" }, "DELETE": { - "SUCCESS": "Attribute deleted successfully", - "ERROR": "Unable to delete attribute. Please try again later" + "SUCCESS": "Atribut byl úspěšně odstraněn", + "ERROR": "Atribut nelze odstranit. Zkuste to prosím později" }, "ATTRIBUTE_SELECT": { - "TITLE": "Add attributes", - "PLACEHOLDER": "Search attributes", - "NO_RESULT": "No attributes found" + "TITLE": "Přidat atributy", + "PLACEHOLDER": "Hledat atributy", + "NO_RESULT": "Nebyly nalezeny žádné atributy" } }, "EMAIL_HEADER": { - "FROM": "From", + "FROM": "Od", "TO": "Komu", "BCC": "Bcc", "CC": "Cc", diff --git a/app/javascript/dashboard/i18n/locale/cs/report.json b/app/javascript/dashboard/i18n/locale/cs/report.json index 204327bf9..38f86c702 100644 --- a/app/javascript/dashboard/i18n/locale/cs/report.json +++ b/app/javascript/dashboard/i18n/locale/cs/report.json @@ -53,7 +53,7 @@ }, { "id": 4, - "name": "Last year" + "name": "Poslední rok" }, { "id": 5, @@ -61,56 +61,56 @@ } ], "CUSTOM_DATE_RANGE": { - "CONFIRM": "Apply", + "CONFIRM": "Použít", "PLACEHOLDER": "Select date range" }, "GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By", "GROUP_BY_DAY_OPTIONS": [ { "id": 1, - "groupBy": "Day" + "groupBy": "Den" } ], "GROUP_BY_WEEK_OPTIONS": [ { "id": 1, - "groupBy": "Day" + "groupBy": "Den" }, { "id": 2, - "groupBy": "Week" + "groupBy": "Týden" } ], "GROUP_BY_MONTH_OPTIONS": [ { "id": 1, - "groupBy": "Day" + "groupBy": "Den" }, { "id": 2, - "groupBy": "Week" + "groupBy": "Týden" }, { "id": 3, - "groupBy": "Month" + "groupBy": "Měsíc" } ], "GROUP_BY_YEAR_OPTIONS": [ { "id": 1, - "groupBy": "Day" + "groupBy": "Den" }, { "id": 2, - "groupBy": "Week" + "groupBy": "Týden" }, { "id": 3, - "groupBy": "Month" + "groupBy": "Měsíc" }, { "id": 4, - "groupBy": "Year" + "groupBy": "Rok" } ], "BUSINESS_HOURS": "Pracovní doba" @@ -170,7 +170,7 @@ }, { "id": 4, - "name": "Last year" + "name": "Poslední rok" }, { "id": 5, @@ -178,7 +178,7 @@ } ], "CUSTOM_DATE_RANGE": { - "CONFIRM": "Apply", + "CONFIRM": "Použít", "PLACEHOLDER": "Select date range" } }, @@ -237,7 +237,7 @@ }, { "id": 4, - "name": "Last year" + "name": "Poslední rok" }, { "id": 5, @@ -245,7 +245,7 @@ } ], "CUSTOM_DATE_RANGE": { - "CONFIRM": "Apply", + "CONFIRM": "Použít", "PLACEHOLDER": "Select date range" } }, @@ -304,7 +304,7 @@ }, { "id": 4, - "name": "Last year" + "name": "Poslední rok" }, { "id": 5, @@ -312,7 +312,7 @@ } ], "CUSTOM_DATE_RANGE": { - "CONFIRM": "Apply", + "CONFIRM": "Použít", "PLACEHOLDER": "Select date range" } }, @@ -371,7 +371,7 @@ }, { "id": 4, - "name": "Last year" + "name": "Poslední rok" }, { "id": 5, @@ -379,13 +379,14 @@ } ], "CUSTOM_DATE_RANGE": { - "CONFIRM": "Apply", + "CONFIRM": "Použít", "PLACEHOLDER": "Select date range" } }, "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/cs/settings.json b/app/javascript/dashboard/i18n/locale/cs/settings.json index ee18bc901..a08059631 100644 --- a/app/javascript/dashboard/i18n/locale/cs/settings.json +++ b/app/javascript/dashboard/i18n/locale/cs/settings.json @@ -154,7 +154,7 @@ "SWITCH": "Switch", "CONVERSATIONS": "Konverzace", "ALL_CONVERSATIONS": "All Conversations", - "MENTIONED_CONVERSATIONS": "Mentions", + "MENTIONED_CONVERSATIONS": "Zmínka", "REPORTS": "Zprávy", "SETTINGS": "Nastavení", "CONTACTS": "Kontakty", diff --git a/app/javascript/dashboard/i18n/locale/da/report.json b/app/javascript/dashboard/i18n/locale/da/report.json index 2f46ee1ef..2122b1077 100644 --- a/app/javascript/dashboard/i18n/locale/da/report.json +++ b/app/javascript/dashboard/i18n/locale/da/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/de/report.json b/app/javascript/dashboard/i18n/locale/de/report.json index d289fd131..f62143d75 100644 --- a/app/javascript/dashboard/i18n/locale/de/report.json +++ b/app/javascript/dashboard/i18n/locale/de/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT-Berichte", "NO_RECORDS": "Es sind keine Antworten zu CSAT Umfragen verfügbar.", + "DOWNLOAD": "CSAT-Berichte herunterladen", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Agenten wählen" diff --git a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json index e0f284e48..b23400d4e 100644 --- a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json @@ -398,8 +398,8 @@ "MESSENGER_SUB_HEAD": "Τοποθετήσετε αυτόν τον κώδικα μέσα στο body tag της ιστοσελίδας σας", "INBOX_AGENTS": "Πράκτορες", "INBOX_AGENTS_SUB_TEXT": "Προσθέστε ή αφαιρέστε πράκτορες σε αυτό το κιβώτιο", - "AGENT_ASSIGNMENT": "Conversation Assignment", - "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", + "AGENT_ASSIGNMENT": "Ανάθεση Συνομιλίας", + "AGENT_ASSIGNMENT_SUB_TEXT": "Ενημέρωση ρυθμίσεων ανάθεσης συνομιλίας", "UPDATE": "Ενημέρωση", "ENABLE_EMAIL_COLLECT_BOX": "Ενεργοποιήσετε το πλαίσιο συλλογής email", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Ενεργοποίηση ή απενεργοποίηση του πλαισίου συλλογής μηνυμάτων ηλεκτρονικού ταχυδρομείου στη νέα συνομιλία", diff --git a/app/javascript/dashboard/i18n/locale/el/report.json b/app/javascript/dashboard/i18n/locale/el/report.json index 26fbcef0c..f0ad7ad88 100644 --- a/app/javascript/dashboard/i18n/locale/el/report.json +++ b/app/javascript/dashboard/i18n/locale/el/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Αναφορές CSAT", "NO_RECORDS": "Δεν υπάρχουν διαθέσιμες απαντήσεις ερευνών CSAT.", + "DOWNLOAD": "Λήψη αναφορών CSAT", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Επιλέξτε Πράκτορες" diff --git a/app/javascript/dashboard/i18n/locale/es/report.json b/app/javascript/dashboard/i18n/locale/es/report.json index 943da01c4..2ba73dda2 100644 --- a/app/javascript/dashboard/i18n/locale/es/report.json +++ b/app/javascript/dashboard/i18n/locale/es/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Reporte de encuestas de satisfacción", "NO_RECORDS": "No hay respuestas de encuestas de satisfacción disponibles.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Elegir agentes" diff --git a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json index d0ff5b89b..8cf0f8971 100644 --- a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json @@ -398,8 +398,8 @@ "MESSENGER_SUB_HEAD": "این دکمه را در تگ body قرار دهید", "INBOX_AGENTS": "ایجنت ها", "INBOX_AGENTS_SUB_TEXT": "اضافه کردن یا حذف کردن دسترسی ایجنت به صندوق ورودی", - "AGENT_ASSIGNMENT": "Conversation Assignment", - "AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings", + "AGENT_ASSIGNMENT": "واگذاری مکالمه", + "AGENT_ASSIGNMENT_SUB_TEXT": "تنظیمات واگذاری مکالمه را به روز کنید", "UPDATE": "اعمال شود", "ENABLE_EMAIL_COLLECT_BOX": "فعال سازی فرم دریافت ایمیل از کاربر", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "فعال یا غیرفعال کردن فرم دریافت ایمیل از کاربر", diff --git a/app/javascript/dashboard/i18n/locale/fa/report.json b/app/javascript/dashboard/i18n/locale/fa/report.json index 92a85236d..5ef58f275 100644 --- a/app/javascript/dashboard/i18n/locale/fa/report.json +++ b/app/javascript/dashboard/i18n/locale/fa/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "گزارشات رضایت مشتری", "NO_RECORDS": "هیچ پاسخ برای نظرسنجی رضایت مشتری در دسترس نیست.", + "DOWNLOAD": "دانلود گزارش CSAT", "FILTERS": { "AGENTS": { "PLACEHOLDER": "ایجنت را انتخاب کنید" diff --git a/app/javascript/dashboard/i18n/locale/fi/report.json b/app/javascript/dashboard/i18n/locale/fi/report.json index ee09078f3..9fc8a5b90 100644 --- a/app/javascript/dashboard/i18n/locale/fi/report.json +++ b/app/javascript/dashboard/i18n/locale/fi/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/fr/report.json b/app/javascript/dashboard/i18n/locale/fr/report.json index 9fc345726..d325abcc4 100644 --- a/app/javascript/dashboard/i18n/locale/fr/report.json +++ b/app/javascript/dashboard/i18n/locale/fr/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Rapports CSAT", "NO_RECORDS": "Il n'y a aucune réponse à l'enquête CSAT disponible.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choisissez des agents" diff --git a/app/javascript/dashboard/i18n/locale/he/report.json b/app/javascript/dashboard/i18n/locale/he/report.json index 38f201c14..3bb7fc7b2 100644 --- a/app/javascript/dashboard/i18n/locale/he/report.json +++ b/app/javascript/dashboard/i18n/locale/he/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/hi/report.json b/app/javascript/dashboard/i18n/locale/hi/report.json index 566099afe..2388e913a 100644 --- a/app/javascript/dashboard/i18n/locale/hi/report.json +++ b/app/javascript/dashboard/i18n/locale/hi/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/hu/report.json b/app/javascript/dashboard/i18n/locale/hu/report.json index c8862daf2..915cf5e4b 100644 --- a/app/javascript/dashboard/i18n/locale/hu/report.json +++ b/app/javascript/dashboard/i18n/locale/hu/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/id/report.json b/app/javascript/dashboard/i18n/locale/id/report.json index fb1c86bd4..44619155b 100644 --- a/app/javascript/dashboard/i18n/locale/id/report.json +++ b/app/javascript/dashboard/i18n/locale/id/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Laporan CSAT", "NO_RECORDS": "Tidak ada respons survey CSAT yang tersedia.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/it/report.json b/app/javascript/dashboard/i18n/locale/it/report.json index 10700fed8..c4948c98c 100644 --- a/app/javascript/dashboard/i18n/locale/it/report.json +++ b/app/javascript/dashboard/i18n/locale/it/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Rapporti CSAT", "NO_RECORDS": "Non ci sono risposte al sondaggio CSAT disponibili.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Scegli agenti" diff --git a/app/javascript/dashboard/i18n/locale/ja/advancedFilters.json b/app/javascript/dashboard/i18n/locale/ja/advancedFilters.json index 8c8e6cdf1..47f3b7e87 100644 --- a/app/javascript/dashboard/i18n/locale/ja/advancedFilters.json +++ b/app/javascript/dashboard/i18n/locale/ja/advancedFilters.json @@ -1,28 +1,28 @@ { "FILTER": { "TITLE": "Filter Conversations", - "SUBTITLE": "Add filters below and hit 'Apply filters' to filter conversations.", - "ADD_NEW_FILTER": "Add Filter", - "FILTER_DELETE_ERROR": "You should have atleast one filter to save", - "SUBMIT_BUTTON_LABEL": "Apply filters", + "SUBTITLE": "会話のフィルターを行うには、適用したいフィルターを選択して「フィルターを適用」を押してください。", + "ADD_NEW_FILTER": "フィルターを追加", + "FILTER_DELETE_ERROR": "保存するには少なくとも一つのフィルター選択が必要です。", + "SUBMIT_BUTTON_LABEL": "フィルターを適用", "CANCEL_BUTTON_LABEL": "キャンセル", - "CLEAR_BUTTON_LABEL": "Clear Filters", - "EMPTY_VALUE_ERROR": "Value is required", - "TOOLTIP_LABEL": "Filter conversations", + "CLEAR_BUTTON_LABEL": "フィルターをクリア", + "EMPTY_VALUE_ERROR": "値は必須です", + "TOOLTIP_LABEL": "会話をフィルターする", "QUERY_DROPDOWN_LABELS": { "AND": "AND", "OR": "OR" }, "OPERATOR_LABELS": { - "equal_to": "Equal to", - "not_equal_to": "Not equal to", - "contains": "Contains", - "does_not_contain": "Does not contain", - "is_present": "Is present", - "is_not_present": "Is not present", - "is_greater_than": "Is greater than", - "is_less_than": "Is lesser than", - "days_before": "Is x days before" + "equal_to": "等しい", + "not_equal_to": "等しくない", + "contains": "含む", + "does_not_contain": "含まない", + "is_present": "存在する", + "is_not_present": "存在しない", + "is_greater_than": "より大きい", + "is_less_than": "より小さい", + "days_before": "x日前" }, "ATTRIBUTE_LABELS": { "TRUE": "True", @@ -30,16 +30,16 @@ }, "ATTRIBUTES": { "STATUS": "状況", - "ASSIGNEE_NAME": "Assignee Name", + "ASSIGNEE_NAME": "担当者名", "INBOX_NAME": "受信トレイ名", - "TEAM_NAME": "Team Name", + "TEAM_NAME": "チーム名", "CONVERSATION_IDENTIFIER": "Conversation Identifier", - "CAMPAIGN_NAME": "Campaign Name", + "CAMPAIGN_NAME": "キャンペーンの名前", "LABELS": "ラベル", - "BROWSER_LANGUAGE": "Browser Language", - "COUNTRY_NAME": "Country Name", - "REFERER_LINK": "Referer link", - "CUSTOM_ATTRIBUTE_LIST": "List", + "BROWSER_LANGUAGE": "ブラウザの言語", + "COUNTRY_NAME": "国名", + "REFERER_LINK": "参照者のリンク", + "CUSTOM_ATTRIBUTE_LIST": "リスト", "CUSTOM_ATTRIBUTE_TEXT": "Text", "CUSTOM_ATTRIBUTE_NUMBER": "Number", "CUSTOM_ATTRIBUTE_LINK": "Link", @@ -58,11 +58,11 @@ "LABEL": "Name this filter", "PLACEHOLDER": "Enter a name for this filter", "ERROR_MESSAGE": "Name is required", - "SAVE_BUTTON": "Save filter", + "SAVE_BUTTON": "フィルターの保存", "CANCEL_BUTTON": "キャンセル", "API_FOLDERS": { - "SUCCESS_MESSAGE": "Folder created successfully", - "ERROR_MESSAGE": "Error while creating folder" + "SUCCESS_MESSAGE": "フォルダが正常に作成されました", + "ERROR_MESSAGE": "フォルダの作成中にエラーが発生しました" }, "API_SEGMENTS": { "SUCCESS_MESSAGE": "Segment created successfully", diff --git a/app/javascript/dashboard/i18n/locale/ja/contact.json b/app/javascript/dashboard/i18n/locale/ja/contact.json index f2579e780..0f9c139ae 100644 --- a/app/javascript/dashboard/i18n/locale/ja/contact.json +++ b/app/javascript/dashboard/i18n/locale/ja/contact.json @@ -186,7 +186,7 @@ "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "FILTER_CONTACTS": "Filter", - "FILTER_CONTACTS_SAVE": "Save filter", + "FILTER_CONTACTS_SAVE": "フィルターの保存", "FILTER_CONTACTS_DELETE": "Delete filter", "LIST": { "LOADING_MESSAGE": "Loading contacts...", diff --git a/app/javascript/dashboard/i18n/locale/ja/contactFilters.json b/app/javascript/dashboard/i18n/locale/ja/contactFilters.json index 16a4b5c75..f298bb3a8 100644 --- a/app/javascript/dashboard/i18n/locale/ja/contactFilters.json +++ b/app/javascript/dashboard/i18n/locale/ja/contactFilters.json @@ -2,28 +2,28 @@ "CONTACTS_FILTER": { "TITLE": "Filter Contacts", "SUBTITLE": "Add filters below and hit 'Submit' to filter contacts.", - "ADD_NEW_FILTER": "Add Filter", + "ADD_NEW_FILTER": "フィルターを追加", "CLEAR_ALL_FILTERS": "Clear All Filters", - "FILTER_DELETE_ERROR": "You should have atleast one filter to save", + "FILTER_DELETE_ERROR": "保存するには少なくとも一つのフィルター選択が必要です。", "SUBMIT_BUTTON_LABEL": "送信", "CANCEL_BUTTON_LABEL": "キャンセル", - "CLEAR_BUTTON_LABEL": "Clear Filters", - "EMPTY_VALUE_ERROR": "Value is required", + "CLEAR_BUTTON_LABEL": "フィルターをクリア", + "EMPTY_VALUE_ERROR": "値は必須です", "TOOLTIP_LABEL": "Filter contacts", "QUERY_DROPDOWN_LABELS": { "AND": "AND", "OR": "OR" }, "OPERATOR_LABELS": { - "equal_to": "Equal to", - "not_equal_to": "Not equal to", - "contains": "Contains", - "does_not_contain": "Does not contain", - "is_present": "Is present", - "is_not_present": "Is not present", - "is_greater_than": "Is greater than", + "equal_to": "等しい", + "not_equal_to": "等しくない", + "contains": "含む", + "does_not_contain": "含まない", + "is_present": "存在する", + "is_not_present": "存在しない", + "is_greater_than": "より大きい", "is_lesser_than": "Is lesser than", - "days_before": "Is x days before" + "days_before": "x日前" }, "ATTRIBUTES": { "NAME": "名前", @@ -32,7 +32,7 @@ "IDENTIFIER": "Identifier", "CITY": "City", "COUNTRY": "Country", - "CUSTOM_ATTRIBUTE_LIST": "List", + "CUSTOM_ATTRIBUTE_LIST": "リスト", "CUSTOM_ATTRIBUTE_TEXT": "Text", "CUSTOM_ATTRIBUTE_NUMBER": "Number", "CUSTOM_ATTRIBUTE_LINK": "Link", diff --git a/app/javascript/dashboard/i18n/locale/ja/report.json b/app/javascript/dashboard/i18n/locale/ja/report.json index b681e94d1..14475a5b5 100644 --- a/app/javascript/dashboard/i18n/locale/ja/report.json +++ b/app/javascript/dashboard/i18n/locale/ja/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/ja/teamsSettings.json b/app/javascript/dashboard/i18n/locale/ja/teamsSettings.json index f89e38cdf..387f222e5 100644 --- a/app/javascript/dashboard/i18n/locale/ja/teamsSettings.json +++ b/app/javascript/dashboard/i18n/locale/ja/teamsSettings.json @@ -1,15 +1,15 @@ { "TEAMS_SETTINGS": { - "NEW_TEAM": "Create new team", - "HEADER": "Teams", + "NEW_TEAM": "チームを新規作成", + "HEADER": "チーム一覧", "SIDEBAR_TXT": "

Teams

Teams let you organize your agents into groups based on their responsibilities.
An agent can be part of multiple teams. You can assign conversations to a team when you are working collaboratively.

", "LIST": { - "404": "There are no teams created on this account.", - "EDIT_TEAM": "Edit team" + "404": "このアカウントにはまだ作成したチームはありません。", + "EDIT_TEAM": "チームを編集" }, "CREATE_FLOW": { "CREATE": { - "TITLE": "Create a new team", + "TITLE": "チームを新規作成", "DESC": "Add a title and description to your new team." }, "AGENTS": { diff --git a/app/javascript/dashboard/i18n/locale/ko/report.json b/app/javascript/dashboard/i18n/locale/ko/report.json index d0f3e1679..24c3a2734 100644 --- a/app/javascript/dashboard/i18n/locale/ko/report.json +++ b/app/javascript/dashboard/i18n/locale/ko/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/lv/report.json b/app/javascript/dashboard/i18n/locale/lv/report.json index 566099afe..2388e913a 100644 --- a/app/javascript/dashboard/i18n/locale/lv/report.json +++ b/app/javascript/dashboard/i18n/locale/lv/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/ml/report.json b/app/javascript/dashboard/i18n/locale/ml/report.json index b5fd901e0..4afb8d383 100644 --- a/app/javascript/dashboard/i18n/locale/ml/report.json +++ b/app/javascript/dashboard/i18n/locale/ml/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT റിപ്പോർട്ടുകൾ", "NO_RECORDS": "CSAT സർവേ പ്രതികരണങ്ങളൊന്നും ലഭ്യമല്ല.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/ne/report.json b/app/javascript/dashboard/i18n/locale/ne/report.json index 566099afe..2388e913a 100644 --- a/app/javascript/dashboard/i18n/locale/ne/report.json +++ b/app/javascript/dashboard/i18n/locale/ne/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/nl/report.json b/app/javascript/dashboard/i18n/locale/nl/report.json index 06f50b9ab..ebb230146 100644 --- a/app/javascript/dashboard/i18n/locale/nl/report.json +++ b/app/javascript/dashboard/i18n/locale/nl/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/no/report.json b/app/javascript/dashboard/i18n/locale/no/report.json index 009368714..4ddd7089b 100644 --- a/app/javascript/dashboard/i18n/locale/no/report.json +++ b/app/javascript/dashboard/i18n/locale/no/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/pl/report.json b/app/javascript/dashboard/i18n/locale/pl/report.json index c45624ad6..c88a46795 100644 --- a/app/javascript/dashboard/i18n/locale/pl/report.json +++ b/app/javascript/dashboard/i18n/locale/pl/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Raporty CSAT", "NO_RECORDS": "Brak dostępnych odpowiedzi na ankietę CSAT.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/pt/report.json b/app/javascript/dashboard/i18n/locale/pt/report.json index 0d8fc3e46..0021dbd82 100644 --- a/app/javascript/dashboard/i18n/locale/pt/report.json +++ b/app/javascript/dashboard/i18n/locale/pt/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Relatórios CSAT", "NO_RECORDS": "Sem dados CSAT disponíveis para reposta.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Escolher Agentes" diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/report.json b/app/javascript/dashboard/i18n/locale/pt_BR/report.json index fb3c83861..ac7200c0c 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/report.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Relatórios CSAT", "NO_RECORDS": "Não há respostas de pesquisa em CSAT disponíveis.", + "DOWNLOAD": "Baixar relatórios de CSAT", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Escolher agentes" diff --git a/app/javascript/dashboard/i18n/locale/ro/report.json b/app/javascript/dashboard/i18n/locale/ro/report.json index e20f8888d..869db122c 100644 --- a/app/javascript/dashboard/i18n/locale/ro/report.json +++ b/app/javascript/dashboard/i18n/locale/ro/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Rapoarte CSAT", "NO_RECORDS": "Nu există răspunsuri predefinite disponibile în acest cont.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Alege agenți" diff --git a/app/javascript/dashboard/i18n/locale/ru/report.json b/app/javascript/dashboard/i18n/locale/ru/report.json index 483646a14..8dc221b4e 100644 --- a/app/javascript/dashboard/i18n/locale/ru/report.json +++ b/app/javascript/dashboard/i18n/locale/ru/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Отчёты CSAT", "NO_RECORDS": "Нет ответов на опрос CSAT.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Выберите Операторов" diff --git a/app/javascript/dashboard/i18n/locale/sk/report.json b/app/javascript/dashboard/i18n/locale/sk/report.json index 1bf58d067..5ba7826a3 100644 --- a/app/javascript/dashboard/i18n/locale/sk/report.json +++ b/app/javascript/dashboard/i18n/locale/sk/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/sr/report.json b/app/javascript/dashboard/i18n/locale/sr/report.json index f67447fe5..f9fabfe4b 100644 --- a/app/javascript/dashboard/i18n/locale/sr/report.json +++ b/app/javascript/dashboard/i18n/locale/sr/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/sv/report.json b/app/javascript/dashboard/i18n/locale/sv/report.json index ebe38abe0..ae03214a4 100644 --- a/app/javascript/dashboard/i18n/locale/sv/report.json +++ b/app/javascript/dashboard/i18n/locale/sv/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/ta/report.json b/app/javascript/dashboard/i18n/locale/ta/report.json index a9af84a42..ad9fd7104 100644 --- a/app/javascript/dashboard/i18n/locale/ta/report.json +++ b/app/javascript/dashboard/i18n/locale/ta/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/th/report.json b/app/javascript/dashboard/i18n/locale/th/report.json index c059a92bd..b0b2a56d3 100644 --- a/app/javascript/dashboard/i18n/locale/th/report.json +++ b/app/javascript/dashboard/i18n/locale/th/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "รายงาน CSAT", "NO_RECORDS": "ไม่มีรายงาน CSAT ที่แสดงผลได้", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "เลือกพนักงาน" diff --git a/app/javascript/dashboard/i18n/locale/tr/report.json b/app/javascript/dashboard/i18n/locale/tr/report.json index d57d444e4..5b535f729 100644 --- a/app/javascript/dashboard/i18n/locale/tr/report.json +++ b/app/javascript/dashboard/i18n/locale/tr/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Temsilcileri Seç" diff --git a/app/javascript/dashboard/i18n/locale/uk/report.json b/app/javascript/dashboard/i18n/locale/uk/report.json index e95f0b228..cda566237 100644 --- a/app/javascript/dashboard/i18n/locale/uk/report.json +++ b/app/javascript/dashboard/i18n/locale/uk/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Звіти CSAT", "NO_RECORDS": "Немає доступних відповідей для опитувань CSAT.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Виберіть Агентів" diff --git a/app/javascript/dashboard/i18n/locale/ur/report.json b/app/javascript/dashboard/i18n/locale/ur/report.json index 33175eec0..524e1f812 100644 --- a/app/javascript/dashboard/i18n/locale/ur/report.json +++ b/app/javascript/dashboard/i18n/locale/ur/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/report.json b/app/javascript/dashboard/i18n/locale/ur_IN/report.json index 566099afe..2388e913a 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/report.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/vi/report.json b/app/javascript/dashboard/i18n/locale/vi/report.json index a33e0c94a..8ff6b2014 100644 --- a/app/javascript/dashboard/i18n/locale/vi/report.json +++ b/app/javascript/dashboard/i18n/locale/vi/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Báo cáo CSAT", "NO_RECORDS": "Không có phản hồi báo cáo CSAT có sẵn.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/report.json b/app/javascript/dashboard/i18n/locale/zh_CN/report.json index faf200994..d41223fa0 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/report.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/report.json b/app/javascript/dashboard/i18n/locale/zh_TW/report.json index b31bdebda..ceb0f230e 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/report.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/report.json @@ -386,6 +386,7 @@ "CSAT_REPORTS": { "HEADER": "CSAT Reports", "NO_RECORDS": "There are no CSAT survey responses available.", + "DOWNLOAD": "Download CSAT Reports", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Choose Agents" diff --git a/app/javascript/survey/i18n/locale/cs.json b/app/javascript/survey/i18n/locale/cs.json index 5e80c2694..7809d99e8 100644 --- a/app/javascript/survey/i18n/locale/cs.json +++ b/app/javascript/survey/i18n/locale/cs.json @@ -1,17 +1,17 @@ { "SURVEY": { - "DESCRIPTION": "Dear customer 👋, please take a few moments to share feedback about the conversation you had with %{inboxName}.", + "DESCRIPTION": "Vážený zákazníku 👋, věnujte prosím několik okamžiků zpětné vazbě na konverzaci, kterou jste vedli s %{inboxName}.", "RATING": { "LABEL": "Ohodnoťte svou konverzaci", "SUCCESS_MESSAGE": "Děkujeme Vám za odeslání hodnocení" }, "FEEDBACK": { - "LABEL": "Do you have any thoughts you'd like to share?", - "PLACEHOLDER": "Your feedback (optional)", - "BUTTON_TEXT": "Submit feedback" + "LABEL": "Máte nějaké připomínky, o které byste se rád podělil?", + "PLACEHOLDER": "Váš názor (volitelné)", + "BUTTON_TEXT": "Odeslat zpětnou vazbu" }, "API": { - "SUCCESS_MESSAGE": "Survey updated successfully", + "SUCCESS_MESSAGE": "Průzkum byl úspěšně aktualizován", "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" } }, diff --git a/app/javascript/widget/i18n/locale/cs.json b/app/javascript/widget/i18n/locale/cs.json index 5df52e2ee..f0e721113 100644 --- a/app/javascript/widget/i18n/locale/cs.json +++ b/app/javascript/widget/i18n/locale/cs.json @@ -8,8 +8,8 @@ "SUBMIT": "Odeslat" }, "MESSAGE_BUBBLE": { - "RETRY": "Send message again", - "ERROR_MESSAGE": "Couldn't send, try again" + "RETRY": "Odeslat zprávu znovu", + "ERROR_MESSAGE": "Odeslání se nezdařilo, zkuste to znovu" } }, "TEAM_AVAILABILITY": { @@ -22,8 +22,8 @@ "IN_A_DAY": "Obvykle odpoví za den" }, "START_CONVERSATION": "Zahájit konverzaci", - "END_CONVERSATION": "End Conversation", - "CONTINUE_CONVERSATION": "Continue conversation", + "END_CONVERSATION": "Ukončit konverzaci", + "CONTINUE_CONVERSATION": "Pokračovat v konverzaci", "START_NEW_CONVERSATION": "Zahájit novou konverzaci", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Zobrazit nové zprávy", @@ -49,14 +49,14 @@ "EMAIL_ADDRESS": { "LABEL": "E-mailová adresa", "PLACEHOLDER": "Zadejte prosím Váš e-mail", - "REQUIRED_ERROR": "Email Address is required", + "REQUIRED_ERROR": "E-mailová adresa je vyžadována", "VALID_ERROR": "Zadejte prosím platnou e-mailovou adresu" }, "PHONE_NUMBER": { "LABEL": "Telefonní číslo", - "PLACEHOLDER": "Please enter your phone number", - "REQUIRED_ERROR": "Phone Number is required", - "VALID_ERROR": "Phone number should be of E.164 format eg: +1415555555" + "PLACEHOLDER": "Zadejte prosím Vaše telefonní číslo", + "REQUIRED_ERROR": "Telefonní číslo je vyžadováno", + "VALID_ERROR": "Telefonní číslo by mělo být ve formátu E.164, např.: +141555555555" }, "MESSAGE": { "LABEL": "Zpráva", @@ -64,8 +64,8 @@ "ERROR": "Zpráva je příliš krátká" } }, - "CAMPAIGN_HEADER": "Please provide your name and email before starting the conversation", - "IS_REQUIRED": "is required" + "CAMPAIGN_HEADER": "Zadejte své jméno a e-mail před zahájením konverzace", + "IS_REQUIRED": "je vyžadováno" }, "FILE_SIZE_LIMIT": "Soubor překračuje limit {MAXIMUM_FILE_UPLOAD_SIZE} přílohy", "CHAT_FORM": { diff --git a/app/javascript/widget/i18n/locale/fr.json b/app/javascript/widget/i18n/locale/fr.json index 728125ec7..df6afc085 100644 --- a/app/javascript/widget/i18n/locale/fr.json +++ b/app/javascript/widget/i18n/locale/fr.json @@ -8,7 +8,7 @@ "SUBMIT": "Envoyer" }, "MESSAGE_BUBBLE": { - "RETRY": "Envoyer à nouveau le message", + "RETRY": "Envoyer le message à nouveau", "ERROR_MESSAGE": "Impossible d'envoyer, réessayez" } }, @@ -49,14 +49,14 @@ "EMAIL_ADDRESS": { "LABEL": "Adresse de courriel", "PLACEHOLDER": "Veuillez saisir votre adresse de courriel", - "REQUIRED_ERROR": "Email Address is required", + "REQUIRED_ERROR": "L'adresse courriel est requise", "VALID_ERROR": "Veuillez saisir une adresse de courriel valide" }, "PHONE_NUMBER": { "LABEL": "Numéro de téléphone", - "PLACEHOLDER": "Please enter your phone number", - "REQUIRED_ERROR": "Phone Number is required", - "VALID_ERROR": "Phone number should be of E.164 format eg: +1415555555" + "PLACEHOLDER": "Veuillez entrer votre numéro de téléphone", + "REQUIRED_ERROR": "Le numéro de téléphone est requis", + "VALID_ERROR": "Le numéro de téléphone doit être au format E.164. Ex : +1415555555" }, "MESSAGE": { "LABEL": "Message", @@ -64,8 +64,8 @@ "ERROR": "Message trop court" } }, - "CAMPAIGN_HEADER": "Veuillez fournir votre nom et votre email avant de commencer la conversation", - "IS_REQUIRED": "is required" + "CAMPAIGN_HEADER": "Veuillez fournir votre nom et votre courriel avant de commencer la conversation", + "IS_REQUIRED": "est requis" }, "FILE_SIZE_LIMIT": "Le fichier dépasse la limite de {MAXIMUM_FILE_UPLOAD_SIZE} pour les pièces jointes", "CHAT_FORM": { diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 35ed2e1b6..c5afdb402 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -45,6 +45,16 @@ ar: avg_first_response_time: متوسط وقت الرد الأول (الدقائق) avg_resolution_time: متوسط وقت المحادثة (الدقائق) default_group_by: اليوم + csat: + headers: + contact_name: اسم جهة الاتصال + contact_email_address: عنوان البريد الإلكتروني الخاص بجهة الاتصال + contact_phone_number: رقم هاتف جهة الاتصال + link_to_the_conversation: رابط إلى المحادثة + agent_name: اسم الموظف + rating: التقييم + feedback: التعليق على الملاحظات + recorded_at: تاريخ التسجيل notifications: notification_title: conversation_creation: "[محادثة جديدة] - #%{display_id} تم إنشاؤها في %{inbox_name}" diff --git a/config/locales/bg.yml b/config/locales/bg.yml index e52248b3e..6469857f4 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -45,6 +45,16 @@ bg: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Име на агента + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/ca.yml b/config/locales/ca.yml index e4b47f68b..269b98285 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -45,6 +45,16 @@ ca: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Nom de l'Agent + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Nova conversació] - #%{display_id} ha estat creada a %{inbox_name}" diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 3a72b05d1..5cb16ce18 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -45,6 +45,16 @@ cs: avg_first_response_time: Prům. doba první odpovědi (minuty) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Název agenta + rating: Hodnocení + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/da.yml b/config/locales/da.yml index c2cc19c2a..34e42b394 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -45,6 +45,16 @@ da: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Agentens Navn + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/de.yml b/config/locales/de.yml index d39914a80..82354838b 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -45,6 +45,16 @@ de: avg_first_response_time: Durchschnittliche Reaktionszeit (Minuten) avg_resolution_time: Durchschnittliche Auflösungszeit (Minuten) default_group_by: Tag + csat: + headers: + contact_name: Kontaktname + contact_email_address: Kontakt-E-Mail-Adresse + contact_phone_number: Kontakt Telefonnummer + link_to_the_conversation: Link zur Konversation + agent_name: Agentenname + rating: Bewertung + feedback: Feedback-Kommentar + recorded_at: Aufnahmedatum notifications: notification_title: conversation_creation: "[Neues Gespräch] - #%{display_id} wurde in %{inbox_name} erstellt" diff --git a/config/locales/el.yml b/config/locales/el.yml index df71a715d..e7f9d219b 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -45,6 +45,16 @@ el: avg_first_response_time: Μέσος χρόνος πρώτης ανταπόκρισης (λεπτά) avg_resolution_time: Μέσος χρόνος επίλυσης (λεπτά) default_group_by: ημέρα + csat: + headers: + contact_name: Όνομα Επαφής + contact_email_address: Διεύθυνση Email Επαφής + contact_phone_number: Αριθμός Τηλεφώνου Επαφής + link_to_the_conversation: Σύνδεσμος για την συνομιλία + agent_name: Όνομα Πράκτορα + rating: Αξιολόγηση + feedback: Σχόλιο ανατροφοδότησης + recorded_at: Ημερομηνία καταγραφής notifications: notification_title: conversation_creation: "[Νέα συνομιλία] - #%{display_id} δημιουργήθηκε στο %{inbox_name}" diff --git a/config/locales/es.yml b/config/locales/es.yml index 4b8e36eb7..9ae7f5ab0 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -45,6 +45,16 @@ es: avg_first_response_time: Promedio de tiempo de la primera respuesta (Minutos) avg_resolution_time: Promedio de tiempo de resolución (Minutos) default_group_by: día + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Nombre del agente + rating: Calificación + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Nueva conversación] - #%{display_id} ha sido creado en %{inbox_name}" diff --git a/config/locales/fa.yml b/config/locales/fa.yml index ad250ec62..94d15d78a 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -45,6 +45,16 @@ fa: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: روز + csat: + headers: + contact_name: نام تماس + contact_email_address: آدرس ایمیل تماس + contact_phone_number: شماره تلفن تماس + link_to_the_conversation: پیوند به گفتگو + agent_name: اسم ایجنت + rating: رتبه + feedback: بازخورد نظر + recorded_at: تاریخ ثبت شده notifications: notification_title: conversation_creation: "[گفتگو جدید] - #%{display_id} در %{inbox_name} ایجاد شده است" diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 552fc7eb7..abc42d30c 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -45,6 +45,16 @@ fi: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Edustajan nimi + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 129940293..f24823871 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -45,6 +45,16 @@ fr: avg_first_response_time: Temps de réponse moyen (Minutes) avg_resolution_time: Temps moyen de résolution (Minutes) default_group_by: jour + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Nom de l'agent + rating: Note + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Nouvelle conversation] - #%{display_id} a été créé dans %{inbox_name}" diff --git a/config/locales/he.yml b/config/locales/he.yml index d605b98b0..7013aeec9 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -45,6 +45,16 @@ he: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: שם סוכן + rating: דירוג + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/hi.yml b/config/locales/hi.yml index 0e045faad..fe9e0e127 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -45,6 +45,16 @@ hi: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Agent Name + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 70b38bc1b..03949320d 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -45,6 +45,16 @@ hu: avg_first_response_time: Átlagos első reakcióidő (perc) avg_resolution_time: Átlagos megoldási idő (perc) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Ügynök neve + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Új beszélgetés] - #%{display_id} létrejött itt:%{inbox_name}" diff --git a/config/locales/id.yml b/config/locales/id.yml index a462a8fcb..598a2952f 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -45,6 +45,16 @@ id: avg_first_response_time: Rata-rata waktu respons pertama (Menit) avg_resolution_time: Rata-rata waktu resolusi (Menit) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Nama Agen + rating: Peringkat + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Percakapan baru] - #%{display_id} telah dibuat di %{inbox_name}" diff --git a/config/locales/it.yml b/config/locales/it.yml index a3864d218..fabe6efdd 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -45,6 +45,16 @@ it: avg_first_response_time: Tempo medio di prima risposta (minuti) avg_resolution_time: Tempo medio di risoluzione (minuti) default_group_by: giorno + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Nome dell'agente + rating: Valutazione + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Nuova conversazione] - #%{display_id} è stato creato in %{inbox_name}" diff --git a/config/locales/ja.yml b/config/locales/ja.yml index e55f52c5d..50f1afb0e 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -45,6 +45,16 @@ ja: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: 担当者名 + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/ko.yml b/config/locales/ko.yml index e0e4ba8ff..a9032f824 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -45,6 +45,16 @@ ko: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: 에이전트 이름 + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/lv.yml b/config/locales/lv.yml index c284b2a61..6ed29e8f7 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -45,6 +45,16 @@ lv: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Agent Name + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/ml.yml b/config/locales/ml.yml index 2fdee2596..7c80c69f4 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -45,6 +45,16 @@ ml: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: ദിവസം + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: ഏജന്റിന്റെ പേര് + rating: റേറ്റിംഗ് + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/ne.yml b/config/locales/ne.yml index b5c5e27c7..15f26703f 100644 --- a/config/locales/ne.yml +++ b/config/locales/ne.yml @@ -45,6 +45,16 @@ ne: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Agent Name + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index aac903a2d..ed10eba6c 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -45,6 +45,16 @@ nl: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Naam medewerker + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/no.yml b/config/locales/no.yml index 35f78f939..f134f24af 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -45,6 +45,16 @@ avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Agent navn + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 5af376b28..cf3676f1e 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -45,6 +45,16 @@ pl: avg_first_response_time: Średni czas pierwszej odpowiedzi (minuty) avg_resolution_time: Średni czas do rozwiązania problemu (minuty) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Nazwa agenta + rating: Ocena + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Nowa rozmowa] - #%{display_id} został utworzony w %{inbox_name}" diff --git a/config/locales/pt.yml b/config/locales/pt.yml index ed033cea8..c8a310aff 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -45,6 +45,16 @@ pt: avg_first_response_time: Média do tempo de resposta (minutos) avg_resolution_time: Média do tempo de resolução (minutos) default_group_by: dia + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Nome do Representante + rating: Avaliar + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Nova conversa] - #%{display_id} foi criada em %{inbox_name}" diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml index 2f7a8aeec..c8fb9090b 100644 --- a/config/locales/pt_BR.yml +++ b/config/locales/pt_BR.yml @@ -45,6 +45,16 @@ pt_BR: avg_first_response_time: Tempo médio de primeira resposta (minutos) avg_resolution_time: Tempo médio de resolução (minutos) default_group_by: dia + csat: + headers: + contact_name: Nome do contato + contact_email_address: E-mail de contato + contact_phone_number: Telefone de contato + link_to_the_conversation: Link para a conversa + agent_name: Nome do Agente + rating: Classificação + feedback: Comentário de Feedback + recorded_at: Data de gravação notifications: notification_title: conversation_creation: "[Nova conversa] - #%{display_id} foi criado em %{inbox_name}" diff --git a/config/locales/ro.yml b/config/locales/ro.yml index aaf9c81f0..adcad7a68 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -45,6 +45,16 @@ ro: avg_first_response_time: Avg primul timp de răspuns (minute) avg_resolution_time: Timp de rezoluție AVG (proces-verbal) default_group_by: zi + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Nume Agent + rating: Evaluare + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Conversație nouă] - #%{display_id} a fost creat în %{inbox_name}" diff --git a/config/locales/ru.yml b/config/locales/ru.yml index f15779328..ce5ae1d54 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -45,6 +45,16 @@ ru: avg_first_response_time: Среднее время первого ответа (в минутах) avg_resolution_time: Среднее время решения (в минутах) default_group_by: день + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Имя оператора + rating: Оценка + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Новая беседа] - #%{display_id} была создана в %{inbox_name}" diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 6a410382a..02406b0b3 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -45,6 +45,16 @@ sk: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Meno agenta + rating: Hodnotenia + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/sr.yml b/config/locales/sr.yml index b67c836e6..04ab3bf57 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -45,6 +45,16 @@ sr-Latn: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Ime agenta + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 232d8953f..ef685a384 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -45,6 +45,16 @@ sv: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Agentens namn + rating: Betyg + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Ny konversation] - #%{display_id} har skapats i %{inbox_name}" diff --git a/config/locales/ta.yml b/config/locales/ta.yml index 3639960e8..e8c2d09c5 100644 --- a/config/locales/ta.yml +++ b/config/locales/ta.yml @@ -45,6 +45,16 @@ ta: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: ஏஜென்ட் பெயர் + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/th.yml b/config/locales/th.yml index 2932759a2..4290ff009 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -45,6 +45,16 @@ th: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: ชื่อพนักงาน + rating: การประเมิน + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/tr.yml b/config/locales/tr.yml index f74ddec45..3a79c0791 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -45,6 +45,16 @@ tr: avg_first_response_time: Ortalama cevap süresi(dakika) avg_resolution_time: Ortalama çözüm üretme süresi(dakika) default_group_by: gün + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Görüşmenin bağlantısı + agent_name: Kullanıcı Adı + rating: Değerlendirme + feedback: Değerlendirme Yorumu + recorded_at: Kaydedilen tarih notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 679312262..956eb0a9b 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -45,6 +45,16 @@ uk: avg_first_response_time: Середній час першої відповіді (Хвилин) avg_resolution_time: Середній час вирішення (Хвилин) default_group_by: день + csat: + headers: + contact_name: Ім'я контакту + contact_email_address: Email + contact_phone_number: Контактний телефон + link_to_the_conversation: Посилання на бесіду + agent_name: Ім'я агента + rating: Оцінка + feedback: Відгук + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Новий діалог] - #%{display_id} було створено в %{inbox_name}" diff --git a/config/locales/ur.yml b/config/locales/ur.yml index 65c47be7d..633be0001 100644 --- a/config/locales/ur.yml +++ b/config/locales/ur.yml @@ -45,6 +45,16 @@ ur: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: ایجنٹ کا نام + rating: درجہ بندی + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/ur_IN.yml b/config/locales/ur_IN.yml index 65c47be7d..6887bb4b9 100644 --- a/config/locales/ur_IN.yml +++ b/config/locales/ur_IN.yml @@ -45,6 +45,16 @@ ur: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Agent Name + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/vi.yml b/config/locales/vi.yml index fb74fa259..e82342c64 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -45,6 +45,16 @@ vi: avg_first_response_time: Thời gian trung bình của phản hồi đầu tiên (phút) avg_resolution_time: Thời gian giải quyết trung bình (phút) default_group_by: ngày + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: Tên nhà cung cấp + rating: Đánh giá + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[Cuộc trò chuyện mới] - #%{display_id} đã được tạo trong %{inbox_name}" diff --git a/config/locales/zh_CN.yml b/config/locales/zh_CN.yml index 40b2d77ed..0c9f79573 100644 --- a/config/locales/zh_CN.yml +++ b/config/locales/zh_CN.yml @@ -45,6 +45,16 @@ zh_CN: avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: 客服名称 + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}" diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml index 3463aa64e..e8cde15fd 100644 --- a/config/locales/zh_TW.yml +++ b/config/locales/zh_TW.yml @@ -45,6 +45,16 @@ zh_TW: avg_first_response_time: 平均第一次回覆時間(分鐘) avg_resolution_time: 平均解決時間(分鐘) default_group_by: day + csat: + headers: + contact_name: Contact Name + contact_email_address: Contact Email Address + contact_phone_number: Contact Phone Number + link_to_the_conversation: Link to the conversation + agent_name: 客服姓名 + rating: Rating + feedback: Feedback Comment + recorded_at: Recorded date notifications: notification_title: conversation_creation: "[新對話] - #%{display_id} 已經在 %{inbox_name} 中被建立" From 79280ae372a7e1522756babb6300b1c68f3aa07f Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Mon, 23 May 2022 12:46:17 +0530 Subject: [PATCH 20/39] chore: Enable Ukrainian language (uk) (#4720) --- config/initializers/languages.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/initializers/languages.rb b/config/initializers/languages.rb index 239c0a2eb..f177b8cbb 100644 --- a/config/initializers/languages.rb +++ b/config/initializers/languages.rb @@ -34,7 +34,8 @@ LANGUAGES_CONFIG = { 29 => { name: 'norsk (no)', iso_639_3_code: 'nor', iso_639_1_code: 'no', enabled: true }, 30 => { name: '中文 (zh-CN)', iso_639_3_code: 'zho', iso_639_1_code: 'zh_CN', enabled: true }, 31 => { name: 'język polski (pl)', iso_639_3_code: 'pol', iso_639_1_code: 'pl', enabled: true }, - 32 => { name: 'slovenčina (sk)', iso_639_3_code: 'slk', iso_639_1_code: 'sk', enabled: true } + 32 => { name: 'slovenčina (sk)', iso_639_3_code: 'slk', iso_639_1_code: 'sk', enabled: true }, + 33 => { name: 'украї́нська мо́ва (uk)', iso_639_3_code: 'ukr', iso_639_1_code: 'uk', enabled: true } }.filter { |_key, val| val[:enabled] }.freeze Rails.configuration.i18n.available_locales = LANGUAGES_CONFIG.map { |_index, lang| lang[:iso_639_1_code].to_sym } From 56cd9bc0b873a5416cd1e210bfee1701e35f04e4 Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Mon, 23 May 2022 19:24:07 +0530 Subject: [PATCH 21/39] chore: Add Assignable Agents API (#4722) --- .../accounts/assignable_agents_controller.rb | 24 +++++++ .../api/v1/accounts/inboxes_controller.rb | 1 + .../dashboard/api/assignableAgents.js | 16 +++++ app/javascript/dashboard/api/inboxes.js | 4 -- .../api/specs/assignableAgents.spec.js | 18 +++++ .../dashboard/api/specs/inboxes.spec.js | 8 --- .../store/modules/inboxAssignableAgents.js | 4 +- .../assignable_agents/index.json.jbuilder | 5 ++ config/routes.rb | 2 +- .../assignable_agents_controller_spec.rb | 67 +++++++++++++++++++ 10 files changed, 134 insertions(+), 15 deletions(-) create mode 100644 app/controllers/api/v1/accounts/assignable_agents_controller.rb create mode 100644 app/javascript/dashboard/api/assignableAgents.js create mode 100644 app/javascript/dashboard/api/specs/assignableAgents.spec.js create mode 100644 app/views/api/v1/accounts/assignable_agents/index.json.jbuilder create mode 100644 spec/controllers/api/v1/accounts/assignable_agents_controller_spec.rb diff --git a/app/controllers/api/v1/accounts/assignable_agents_controller.rb b/app/controllers/api/v1/accounts/assignable_agents_controller.rb new file mode 100644 index 000000000..a712342dd --- /dev/null +++ b/app/controllers/api/v1/accounts/assignable_agents_controller.rb @@ -0,0 +1,24 @@ +class Api::V1::Accounts::AssignableAgentsController < Api::V1::Accounts::BaseController + before_action :fetch_inboxes + + def index + agent_ids = @inboxes.map do |inbox| + authorize inbox, :show? + member_ids = inbox.members.pluck(:user_id) + member_ids + end + agent_ids = agent_ids.inject(:&) + agents = Current.account.users.where(id: agent_ids) + @assignable_agents = (agents + Current.account.administrators).uniq + end + + private + + def fetch_inboxes + @inboxes = Current.account.inboxes.find(permitted_params[:inbox_ids]) + end + + def permitted_params + params.permit(inbox_ids: []) + end +end diff --git a/app/controllers/api/v1/accounts/inboxes_controller.rb b/app/controllers/api/v1/accounts/inboxes_controller.rb index 66a71985d..4bc85546a 100644 --- a/app/controllers/api/v1/accounts/inboxes_controller.rb +++ b/app/controllers/api/v1/accounts/inboxes_controller.rb @@ -12,6 +12,7 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController def show; end + # Deprecated: This API will be removed in 2.7.0 def assignable_agents @assignable_agents = (Current.account.users.where(id: @inbox.members.select(:user_id)) + Current.account.administrators).uniq end diff --git a/app/javascript/dashboard/api/assignableAgents.js b/app/javascript/dashboard/api/assignableAgents.js new file mode 100644 index 000000000..5b999facf --- /dev/null +++ b/app/javascript/dashboard/api/assignableAgents.js @@ -0,0 +1,16 @@ +/* global axios */ +import ApiClient from './ApiClient'; + +class AssignableAgents extends ApiClient { + constructor() { + super('assignable_agents', { accountScoped: true }); + } + + get(inboxIds) { + return axios.get(this.url, { + params: { inbox_ids: inboxIds }, + }); + } +} + +export default new AssignableAgents(); diff --git a/app/javascript/dashboard/api/inboxes.js b/app/javascript/dashboard/api/inboxes.js index 1cf6ba113..a76ef1414 100644 --- a/app/javascript/dashboard/api/inboxes.js +++ b/app/javascript/dashboard/api/inboxes.js @@ -6,10 +6,6 @@ class Inboxes extends ApiClient { super('inboxes', { accountScoped: true }); } - getAssignableAgents(inboxId) { - return axios.get(`${this.url}/${inboxId}/assignable_agents`); - } - getCampaigns(inboxId) { return axios.get(`${this.url}/${inboxId}/campaigns`); } diff --git a/app/javascript/dashboard/api/specs/assignableAgents.spec.js b/app/javascript/dashboard/api/specs/assignableAgents.spec.js new file mode 100644 index 000000000..6c9c5ec9a --- /dev/null +++ b/app/javascript/dashboard/api/specs/assignableAgents.spec.js @@ -0,0 +1,18 @@ +import assignableAgentsAPI from '../assignableAgents'; +import describeWithAPIMock from './apiSpecHelper'; + +describe('#AssignableAgentsAPI', () => { + describeWithAPIMock('API calls', context => { + it('#getAssignableAgents', () => { + assignableAgentsAPI.get([1]); + expect(context.axiosMock.get).toHaveBeenCalledWith( + '/api/v1/assignable_agents', + { + params: { + inbox_ids: [1], + }, + } + ); + }); + }); +}); diff --git a/app/javascript/dashboard/api/specs/inboxes.spec.js b/app/javascript/dashboard/api/specs/inboxes.spec.js index b261bb930..0d755d44a 100644 --- a/app/javascript/dashboard/api/specs/inboxes.spec.js +++ b/app/javascript/dashboard/api/specs/inboxes.spec.js @@ -10,17 +10,9 @@ describe('#InboxesAPI', () => { expect(inboxesAPI).toHaveProperty('create'); expect(inboxesAPI).toHaveProperty('update'); expect(inboxesAPI).toHaveProperty('delete'); - expect(inboxesAPI).toHaveProperty('getAssignableAgents'); expect(inboxesAPI).toHaveProperty('getCampaigns'); }); describeWithAPIMock('API calls', context => { - it('#getAssignableAgents', () => { - inboxesAPI.getAssignableAgents(1); - expect(context.axiosMock.get).toHaveBeenCalledWith( - '/api/v1/inboxes/1/assignable_agents' - ); - }); - it('#getCampaigns', () => { inboxesAPI.getCampaigns(2); expect(context.axiosMock.get).toHaveBeenCalledWith( diff --git a/app/javascript/dashboard/store/modules/inboxAssignableAgents.js b/app/javascript/dashboard/store/modules/inboxAssignableAgents.js index 31a2d98d0..1acb6897a 100644 --- a/app/javascript/dashboard/store/modules/inboxAssignableAgents.js +++ b/app/javascript/dashboard/store/modules/inboxAssignableAgents.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import InboxesAPI from 'dashboard/api/inboxes.js'; +import AssignableAgentsAPI from '../../api/assignableAgents'; const state = { records: {}, @@ -31,7 +31,7 @@ export const actions = { try { const { data: { payload }, - } = await InboxesAPI.getAssignableAgents(inboxId); + } = await AssignableAgentsAPI.get([inboxId]); commit(types.SET_INBOX_ASSIGNABLE_AGENTS, { inboxId, members: payload }); } catch (error) { throw new Error(error); diff --git a/app/views/api/v1/accounts/assignable_agents/index.json.jbuilder b/app/views/api/v1/accounts/assignable_agents/index.json.jbuilder new file mode 100644 index 000000000..af71dea1e --- /dev/null +++ b/app/views/api/v1/accounts/assignable_agents/index.json.jbuilder @@ -0,0 +1,5 @@ +json.payload do + json.array! @assignable_agents do |agent| + json.partial! 'api/v1/models/agent.json.jbuilder', resource: agent + end +end diff --git a/config/routes.rb b/config/routes.rb index a80f6ca39..b2029a739 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -43,7 +43,7 @@ Rails.application.routes.draw do resource :bulk_actions, only: [:create] resources :agents, only: [:index, :create, :update, :destroy] resources :agent_bots, only: [:index, :create, :show, :update, :destroy] - + resources :assignable_agents, only: [:index] resources :callbacks, only: [] do collection do post :register_facebook_page diff --git a/spec/controllers/api/v1/accounts/assignable_agents_controller_spec.rb b/spec/controllers/api/v1/accounts/assignable_agents_controller_spec.rb new file mode 100644 index 000000000..6f1a068ee --- /dev/null +++ b/spec/controllers/api/v1/accounts/assignable_agents_controller_spec.rb @@ -0,0 +1,67 @@ +require 'rails_helper' + +RSpec.describe 'Assignable Agents API', type: :request do + let(:account) { create(:account) } + let(:agent1) { create(:user, account: account, role: :agent) } + let!(:agent2) { create(:user, account: account, role: :agent) } + let!(:admin) { create(:user, account: account, role: :administrator) } + + describe 'GET /api/v1/accounts/{account.id}/assignable_agents' do + let(:inbox1) { create(:inbox, account: account) } + let(:inbox2) { create(:inbox, account: account) } + + before do + create(:inbox_member, user: agent1, inbox: inbox1) + create(:inbox_member, user: agent1, inbox: inbox2) + end + + context 'when it is an unauthenticated user' do + it 'returns unauthorized' do + get "/api/v1/accounts/#{account.id}/assignable_agents" + + expect(response).to have_http_status(:unauthorized) + end + end + + context 'when the user is not part of an inbox' do + context 'when the user is an admininstrator' do + it 'returns all assignable inbox members along with administrators' do + get "/api/v1/accounts/#{account.id}/assignable_agents", + params: { inbox_ids: [inbox1.id, inbox2.id] }, + headers: admin.create_new_auth_token, + as: :json + + expect(response).to have_http_status(:success) + response_data = JSON.parse(response.body, symbolize_names: true)[:payload] + expect(response_data.size).to eq(2) + expect(response_data.pluck(:role)).to include('agent', 'administrator') + end + end + + context 'when the user is an agent' do + it 'returns unauthorized' do + get "/api/v1/accounts/#{account.id}/assignable_agents", + params: { inbox_ids: [inbox1.id, inbox2.id] }, + headers: agent2.create_new_auth_token, + as: :json + + expect(response).to have_http_status(:unauthorized) + end + end + end + + context 'when the user is part of the inbox' do + it 'returns all assignable inbox members along with administrators' do + get "/api/v1/accounts/#{account.id}/assignable_agents", + params: { inbox_ids: [inbox1.id, inbox2.id] }, + headers: agent1.create_new_auth_token, + as: :json + + expect(response).to have_http_status(:success) + response_data = JSON.parse(response.body, symbolize_names: true)[:payload] + expect(response_data.size).to eq(2) + expect(response_data.pluck(:role)).to include('agent', 'administrator') + end + end + end +end From d20eafbda4719693a9c0084c84f5311eab00250e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 May 2022 11:12:19 +0530 Subject: [PATCH 22/39] chore(deps): bump nokogiri from 1.13.5 to 1.13.6 (#4734) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.13.5 to 1.13.6. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.13.5...v1.13.6) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 253c35da6..880390f16 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -378,14 +378,14 @@ GEM netrc (0.11.0) newrelic_rpm (8.7.0) nio4r (2.5.8) - nokogiri (1.13.5) + nokogiri (1.13.6) mini_portile2 (~> 2.8.0) racc (~> 1.4) - nokogiri (1.13.5-arm64-darwin) + nokogiri (1.13.6-arm64-darwin) racc (~> 1.4) - nokogiri (1.13.5-x86_64-darwin) + nokogiri (1.13.6-x86_64-darwin) racc (~> 1.4) - nokogiri (1.13.5-x86_64-linux) + nokogiri (1.13.6-x86_64-linux) racc (~> 1.4) oauth (0.5.8) orm_adapter (0.5.0) From baa3efaf0ef0d59555d2c3df6ce04303a31b45a2 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Tue, 24 May 2022 22:15:57 +0530 Subject: [PATCH 23/39] chore: Update cache name in Circle CI builds (#4738) Co-authored-by: Pranav Raj S --- .circleci/config.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 974b981ab..076903576 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -40,14 +40,13 @@ jobs: - restore_cache: keys: - - chatwoot-bundle-{{ .Environment.CACHE_VERSION }}-{{ checksum "Gemfile.lock" }} - - chatwoot-bundle + - chatwoot-bundle-{{ .Environment.CACHE_VERSION }}-v20220524-{{ checksum "Gemfile.lock" }} - run: bundle install --frozen --path ~/.bundle - save_cache: paths: - ~/.bundle - key: chatwoot-bundle-{{ .Environment.CACHE_VERSION }}-{{ checksum "Gemfile.lock" }} + key: chatwoot-bundle-{{ .Environment.CACHE_VERSION }}-v20220524-{{ checksum "Gemfile.lock" }} # Only necessary if app uses webpacker or yarn in some other way From 22d22cf4c3c5166b653653dfafac9b557975cbb7 Mon Sep 17 00:00:00 2001 From: Vishnu Narayanan Date: Wed, 25 May 2022 12:30:00 +0530 Subject: [PATCH 24/39] feat: Improve Linux installation experience (#4713) * feat: improve linux install script * feat: setup logging and reduce verboseness - redirect output/error to logfile - reduce verboseness in main script exection - trap non-zero exit * chore: remove debug logging * feat: fix exit handler * improve legibility * Apply suggestions from code review Co-authored-by: Pranav Raj S * chore: improve formatting Co-authored-by: Pranav Raj S --- deployment/setup_20.04.sh | 405 +++++++++++++++++++++++++------------- 1 file changed, 263 insertions(+), 142 deletions(-) diff --git a/deployment/setup_20.04.sh b/deployment/setup_20.04.sh index 14a0b74f6..13c26f513 100644 --- a/deployment/setup_20.04.sh +++ b/deployment/setup_20.04.sh @@ -1,164 +1,285 @@ #!/usr/bin/env bash # Description: Chatwoot installation script -# OS: Ubuntu 20.04 LTS / Ubuntu 20.10 -# Script Version: 0.8 +# OS: Ubuntu 20.04 LTS +# Script Version: 1.0 # Run this script as root -read -p 'Would you like to configure a domain and SSL for Chatwoot?(yes or no): ' configure_webserver +set -eu -o pipefail +trap exit_handler EXIT -if [ $configure_webserver == "yes" ] -then -read -p 'Enter your sub-domain to be used for Chatwoot (chatwoot.domain.com for example) : ' domain_name -echo -e "\nThis script will try to generate SSL certificates via LetsEncrypt and serve chatwoot at -"https://$domain_name". Proceed further once you have pointed your DNS to the IP of the instance.\n" -read -p 'Enter the email LetsEncrypt can use to send reminders when your SSL certificate is up for renewal: ' le_email -read -p 'Do you wish to proceed? (yes or no): ' exit_true -if [ $exit_true == "no" ] -then -exit 1 -fi +function exit_handler() { + if [ "$?" -ne 0 ]; then + echo -en "\nSome error has occured. Check '/var/log/chatwoot-setup.log' for details.\n" + exit 1 + fi +} + +if [ "$(id -u)" -ne 0 ]; then + echo 'This script should be run as root.' >&2 + exit 1 fi -read -p 'Would you like to install postgres and redis?(Answer no if you plan to use external services): ' install_pg_redis - -if [ $install_pg_redis == "no" ] -then -echo "***** Skipping pg and redis installation. ****" -fi - -apt update && apt upgrade -y -apt install -y curl -curl -sL https://deb.nodesource.com/setup_12.x | bash - -curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - -echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list -apt update - -apt install -y \ - git software-properties-common imagemagick libpq-dev \ - libxml2-dev libxslt1-dev file g++ gcc autoconf build-essential \ - libssl-dev libyaml-dev libreadline-dev gnupg2 \ - postgresql-client redis-tools \ - nodejs yarn patch ruby-dev zlib1g-dev liblzma-dev \ - libgmp-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev sudo - -if [ $install_pg_redis != "no" ] -then -apt install -y postgresql postgresql-contrib redis-server -fi - -if [ $configure_webserver == "yes" ] -then -apt install -y nginx nginx-full certbot python3-certbot-nginx -fi - -adduser --disabled-login --gecos "" chatwoot - -gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB -gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB -curl -sSL https://get.rvm.io | bash -s stable -adduser chatwoot rvm - -if [ $install_pg_redis != "no" ] -then -pg_pass=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 15 ; echo '') -sudo -i -u postgres psql << EOF -\set pass `echo $pg_pass` -CREATE USER chatwoot CREATEDB; -ALTER USER chatwoot PASSWORD :'pass'; -ALTER ROLE chatwoot SUPERUSER; -UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1'; -DROP DATABASE template1; -CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE'; -UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1'; -\c template1 -VACUUM FREEZE; -EOF - -systemctl enable redis-server.service -systemctl enable postgresql -fi - -secret=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 63 ; echo '') -RAILS_ENV=production - -sudo -i -u chatwoot << EOF -rvm --version -rvm autolibs disable -rvm install "ruby-3.0.2" -rvm use 3.0.2 --default - -git clone https://github.com/chatwoot/chatwoot.git -cd chatwoot if [[ -z "$1" ]]; then -git checkout master; + BRANCH="master" else -git checkout $1; + BRANCH="$1" fi -bundle -yarn -cp .env.example .env -sed -i -e "/SECRET_KEY_BASE/ s/=.*/=$secret/" .env -sed -i -e '/REDIS_URL/ s/=.*/=redis:\/\/localhost:6379/' .env -sed -i -e '/POSTGRES_HOST/ s/=.*/=localhost/' .env -sed -i -e '/POSTGRES_USERNAME/ s/=.*/=chatwoot/' .env -sed -i -e "/POSTGRES_PASSWORD/ s/=.*/=$pg_pass/" .env -sed -i -e '/RAILS_ENV/ s/=.*/=$RAILS_ENV/' .env -echo -en "\nINSTALLATION_ENV=linux_script" >> ".env" +function get_domain_info() { + read -rp 'Enter the domain/subdomain for Chatwoot (e.g., chatwoot.domain.com) :' domain_name + read -rp 'Enter an email address for LetsEncrypt to send reminders when your SSL certificate is up for renewal :' le_email + cat << EOF -rake assets:precompile RAILS_ENV=production +This script will generate SSL certificates via LetsEncrypt and serve Chatwoot at +https://$domain_name. Proceed further once you have pointed your DNS to the IP of the instance. + +EOF + read -rp 'Do you wish to proceed? (yes or no): ' exit_true + if [ "$exit_true" == "no" ] + then + exit 1 + fi +} + +function install_dependencies() { + apt update && apt upgrade -y + apt install -y curl + curl -sL https://deb.nodesource.com/setup_12.x | bash - + curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - + echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list + apt update + + apt install -y \ + git software-properties-common imagemagick libpq-dev \ + libxml2-dev libxslt1-dev file g++ gcc autoconf build-essential \ + libssl-dev libyaml-dev libreadline-dev gnupg2 \ + postgresql-client redis-tools \ + nodejs yarn patch ruby-dev zlib1g-dev liblzma-dev \ + libgmp-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev sudo +} + +function install_databases() { + apt install -y postgresql postgresql-contrib redis-server +} + +function install_webserver() { + apt install -y nginx nginx-full certbot python3-certbot-nginx +} + +function configure_rvm() { + adduser --disabled-login --gecos "" chatwoot + + gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB + gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB + curl -sSL https://get.rvm.io | bash -s stable + adduser chatwoot rvm +} + +function configure_db() { + pg_pass=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 15 ; echo '') + sudo -i -u postgres psql << EOF + \set pass `echo $pg_pass` + CREATE USER chatwoot CREATEDB; + ALTER USER chatwoot PASSWORD :'pass'; + ALTER ROLE chatwoot SUPERUSER; + UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1'; + DROP DATABASE template1; + CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE'; + UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1'; + \c template1 + VACUUM FREEZE; EOF -if [ $install_pg_redis != "no" ] -then -sudo -i -u chatwoot << EOF -cd chatwoot -RAILS_ENV=production bundle exec rake db:create -RAILS_ENV=production bundle exec rake db:reset + systemctl enable redis-server.service + systemctl enable postgresql + +} + +function setup_chatwoot() { + secret=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 63 ; echo '') + RAILS_ENV=production + + sudo -i -u chatwoot << EOF + rvm --version + rvm autolibs disable + rvm install "ruby-3.0.2" + rvm use 3.0.2 --default + + git clone https://github.com/chatwoot/chatwoot.git + cd chatwoot + git checkout "$BRANCH" + bundle + yarn + + cp .env.example .env + sed -i -e "/SECRET_KEY_BASE/ s/=.*/=$secret/" .env + sed -i -e '/REDIS_URL/ s/=.*/=redis:\/\/localhost:6379/' .env + sed -i -e '/POSTGRES_HOST/ s/=.*/=localhost/' .env + sed -i -e '/POSTGRES_USERNAME/ s/=.*/=chatwoot/' .env + sed -i -e "/POSTGRES_PASSWORD/ s/=.*/=$pg_pass/" .env + sed -i -e '/RAILS_ENV/ s/=.*/=$RAILS_ENV/' .env + echo -en "\nINSTALLATION_ENV=linux_script" >> ".env" + + rake assets:precompile RAILS_ENV=production EOF -fi -cp /home/chatwoot/chatwoot/deployment/chatwoot-web.1.service /etc/systemd/system/chatwoot-web.1.service -cp /home/chatwoot/chatwoot/deployment/chatwoot-worker.1.service /etc/systemd/system/chatwoot-worker.1.service -cp /home/chatwoot/chatwoot/deployment/chatwoot.target /etc/systemd/system/chatwoot.target +} -systemctl enable chatwoot.target -systemctl start chatwoot.target -public_ip=$(curl http://checkip.amazonaws.com -s) - -if [ $configure_webserver != "yes" ] -then -echo -en "\n\n***************************************************************************\n" -echo "Woot! Woot!! Chatwoot server installation is complete" -echo "The server will be accessible at http://$public_ip:3000" -echo "To configure a domain and SSL certificate, follow the guide at https://www.chatwoot.com/docs/deployment/deploy-chatwoot-in-linux-vm" -echo "***************************************************************************" -else -curl https://ssl-config.mozilla.org/ffdhe4096.txt >> /etc/ssl/dhparam -wget https://raw.githubusercontent.com/chatwoot/chatwoot/develop/deployment/nginx_chatwoot.conf -cp nginx_chatwoot.conf /etc/nginx/sites-available/nginx_chatwoot.conf -certbot certonly --non-interactive --agree-tos --nginx -m $le_email -d $domain_name -sed -i "s/chatwoot.domain.com/$domain_name/g" /etc/nginx/sites-available/nginx_chatwoot.conf -ln -s /etc/nginx/sites-available/nginx_chatwoot.conf /etc/nginx/sites-enabled/nginx_chatwoot.conf -systemctl restart nginx -sudo -i -u chatwoot << EOF -cd chatwoot -sed -i "s/http:\/\/0.0.0.0:3000/https:\/\/$domain_name/g" .env +function run_db_migrations(){ + sudo -i -u chatwoot << EOF + cd chatwoot + RAILS_ENV=production bundle exec rake db:create + RAILS_ENV=production bundle exec rake db:reset EOF -systemctl restart chatwoot.target -echo -en "\n\n***************************************************************************\n" -echo "Woot! Woot!! Chatwoot server installation is complete" -echo "The server will be accessible at https://$domain_name" -echo "***************************************************************************" -fi + +} -if [ $install_pg_redis == "no" ] -then -echo -en "\n\n***************************************************************************\n" -echo "DB migrations are not run as pg and redis is not installed." -echo "After modifying .env with your external db creds, run db migrations !!!" -echo "***************************************************************************" -fi +function configure_systemd_services() { + cp /home/chatwoot/chatwoot/deployment/chatwoot-web.1.service /etc/systemd/system/chatwoot-web.1.service + cp /home/chatwoot/chatwoot/deployment/chatwoot-worker.1.service /etc/systemd/system/chatwoot-worker.1.service + cp /home/chatwoot/chatwoot/deployment/chatwoot.target /etc/systemd/system/chatwoot.target + + systemctl enable chatwoot.target + systemctl start chatwoot.target +} + + +function setup_ssl() { + echo "debug: setting up ssl" + echo "debug: domain: $domain_name" + echo "debug: letsencrypt email: $le_email" + curl https://ssl-config.mozilla.org/ffdhe4096.txt >> /etc/ssl/dhparam + wget https://raw.githubusercontent.com/chatwoot/chatwoot/develop/deployment/nginx_chatwoot.conf + cp nginx_chatwoot.conf /etc/nginx/sites-available/nginx_chatwoot.conf + certbot certonly --non-interactive --agree-tos --nginx -m "$le_email" -d "$domain_name" + sed -i "s/chatwoot.domain.com/$domain_name/g" /etc/nginx/sites-available/nginx_chatwoot.conf + ln -s /etc/nginx/sites-available/nginx_chatwoot.conf /etc/nginx/sites-enabled/nginx_chatwoot.conf + systemctl restart nginx + sudo -i -u chatwoot << EOF + cd chatwoot + sed -i "s/http:\/\/0.0.0.0:3000/https:\/\/$domain_name/g" .env +EOF + systemctl restart chatwoot.target +} + +function setup_logging() { + touch /var/log/chatwoot-setup.log + LOG_FILE="/var/log/chatwoot-setup.log" +} + +function main() { + + setup_logging + cat << EOF + +*************************************************************************** + Chatwoot Installation (latest) +*************************************************************************** + +For more verbose logs, open up a second terminal and follow along using, `tail -f /var/log/chatwoot`. + +EOF + + sleep 3 + read -rp 'Would you like to configure a domain and SSL for Chatwoot?(yes or no): ' configure_webserver + + if [ "$configure_webserver" == "yes" ] + then + get_domain_info + fi + + echo -en "\n" + read -rp 'Would you like to install Postgres and Redis? (Answer no if you plan to use external services): ' install_pg_redis + + if [ "$install_pg_redis" == "no" ] + then + echo "***** Skipping Postgres and Redis installation. ****" + fi + + echo -en "\n➥ 1/9 Installing dependencies. This takes a while." + install_dependencies &>> "${LOG_FILE}" + + if [ "$install_pg_redis" != "no" ] + then + echo "➥ 2/9 Installing databases" + install_databases &>> "${LOG_FILE}" + fi + + if [ "$configure_webserver" == "yes" ] + then + echo "➥ 3/9 Installing webserver" + install_webserver &>> "${LOG_FILE}" + fi + + echo "➥ 4/9 Setting up Ruby" + configure_rvm &>> "${LOG_FILE}" + + if [ "$install_pg_redis" != "no" ] + then + echo "➥ 5/9 Setting up the database" + configure_db &>> "${LOG_FILE}" + fi + + echo "➥ 6/9 Installing Chatwoot. This takes a while." + setup_chatwoot &>> "${LOG_FILE}" + + if [ "$install_pg_redis" != "no" ] + then + echo "➥ 7/9 Running migrations" + run_db_migrations &>> "${LOG_FILE}" + fi + + echo "➥ 8/9 Setting up systemd services" + configure_systemd_services &>> "${LOG_FILE}" + + public_ip=$(curl http://checkip.amazonaws.com -s) + + if [ "$configure_webserver" != "yes" ] + then + cat << EOF + +*************************************************************************** +Woot! Woot!! Chatwoot server installation is complete. +The server will be accessible at http://$public_ip:3000 + +To configure a domain and SSL certificate, follow the guide at +https://www.chatwoot.com/docs/deployment/deploy-chatwoot-in-linux-vm + +Join the community at https://chatwoot.com/community +*************************************************************************** +EOF + else + echo "➥ 9/9 Setting up SSL/TLS" + setup_ssl &>> "${LOG_FILE}" + cat << EOF + +*************************************************************************** +Woot! Woot!! Chatwoot server installation is complete. +The server will be accessible at https://$domain_name + +Join the community at https://chatwoot.com/community +*************************************************************************** +EOF + fi + + if [ "$install_pg_redis" == "no" ] + then +cat < Date: Wed, 25 May 2022 12:38:23 +0530 Subject: [PATCH 25/39] fix: Revert changes to fix name updation from pre-chat form (#4741) --- .../api/v1/widget/base_controller.rb | 6 ++++ .../api/v1/widget/conversations_controller.rb | 1 - .../widget/conversations_controller_spec.rb | 30 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/widget/base_controller.rb b/app/controllers/api/v1/widget/base_controller.rb index 646d70acf..fc4d33fc3 100644 --- a/app/controllers/api/v1/widget/base_controller.rb +++ b/app/controllers/api/v1/widget/base_controller.rb @@ -54,6 +54,7 @@ class Api::V1::Widget::BaseController < ApplicationController ).perform else @contact.update!(email: email) + update_contact_name end end @@ -67,9 +68,14 @@ class Api::V1::Widget::BaseController < ApplicationController ).perform else @contact.update!(phone_number: phone_number) + update_contact_name end end + def update_contact_name + @contact.update!(name: contact_name) if contact_name.present? + end + def contact_email permitted_params.dig(:contact, :email)&.downcase end diff --git a/app/controllers/api/v1/widget/conversations_controller.rb b/app/controllers/api/v1/widget/conversations_controller.rb index cfe107ac6..8d054229c 100644 --- a/app/controllers/api/v1/widget/conversations_controller.rb +++ b/app/controllers/api/v1/widget/conversations_controller.rb @@ -16,7 +16,6 @@ class Api::V1::Widget::ConversationsController < Api::V1::Widget::BaseController def process_update_contact update_contact(contact_email) if @contact.email.blank? && contact_email.present? update_contact_phone_number(contact_phone_number) if @contact.phone_number.blank? && contact_phone_number.present? - @contact.update!(name: contact_name) if contact_name.present? end def update_last_seen diff --git a/spec/controllers/api/v1/widget/conversations_controller_spec.rb b/spec/controllers/api/v1/widget/conversations_controller_spec.rb index 88f41dea0..307862374 100644 --- a/spec/controllers/api/v1/widget/conversations_controller_spec.rb +++ b/spec/controllers/api/v1/widget/conversations_controller_spec.rb @@ -69,6 +69,36 @@ RSpec.describe '/api/v1/widget/conversations/toggle_typing', type: :request do expect(json_response['id']).not_to eq nil expect(json_response['contact']['email']).to eq 'contact-email@chatwoot.com' expect(json_response['contact']['phone_number']).to eq '+919745313456' + expect(json_response['contact']['name']).to eq 'contact-name' + expect(json_response['custom_attributes']['order_id']).to eq '12345' + expect(json_response['messages'][0]['content']).to eq 'This is a test message' + end + + it 'does not update the name if the contact already exist' do + existing_contact = create(:contact, account: account) + + post '/api/v1/widget/conversations', + headers: { 'X-Auth-Token' => token }, + params: { + website_token: web_widget.website_token, + contact: { + name: 'contact-name', + email: existing_contact.email, + phone_number: '+919745313456' + }, + message: { + content: 'This is a test message' + }, + custom_attributes: { order_id: '12345' } + }, + as: :json + + expect(response).to have_http_status(:success) + json_response = JSON.parse(response.body) + expect(json_response['id']).not_to eq nil + expect(json_response['contact']['email']).to eq existing_contact.email + expect(json_response['contact']['name']).not_to eq 'contact-name' + expect(json_response['contact']['phone_number']).to eq '+919745313456' expect(json_response['custom_attributes']['order_id']).to eq '12345' expect(json_response['messages'][0]['content']).to eq 'This is a test message' end From 1215f37ddae1a69a203ddb0622fc21e1bc8f1a59 Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Wed, 25 May 2022 17:06:31 +0530 Subject: [PATCH 26/39] fix: Remove translated keys from locale files (#4748) --- .../dashboard/components/ChatList.vue | 13 +++++--- .../dashboard/i18n/locale/ar/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/bg/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/ca/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/cs/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/da/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/de/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/el/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/en/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/es/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/fa/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/fi/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/fr/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/he/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/hi/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/hu/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/id/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/it/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/ja/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/ko/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/lv/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/ml/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/ne/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/nl/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/no/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/pl/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/pt/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/pt_BR/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/ro/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/ru/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/sk/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/sr/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/sv/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/ta/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/th/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/tr/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/uk/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/ur/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/ur_IN/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/vi/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/zh/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/zh_CN/chatlist.json | 32 +++---------------- .../dashboard/i18n/locale/zh_TW/chatlist.json | 32 +++---------------- 43 files changed, 219 insertions(+), 1138 deletions(-) diff --git a/app/javascript/dashboard/components/ChatList.vue b/app/javascript/dashboard/components/ChatList.vue index deb0276bf..2887e4a08 100644 --- a/app/javascript/dashboard/components/ChatList.vue +++ b/app/javascript/dashboard/components/ChatList.vue @@ -235,11 +235,16 @@ export default { return {}; }, assigneeTabItems() { - return this.$t('CHAT_LIST.ASSIGNEE_TYPE_TABS').map(item => { - const count = this.conversationStats[item.COUNT_KEY] || 0; + const ASSIGNEE_TYPE_TAB_KEYS = { + me: 'mineCount', + unassigned: 'unAssignedCount', + all: 'allCount', + }; + return Object.keys(ASSIGNEE_TYPE_TAB_KEYS).map(key => { + const count = this.conversationStats[ASSIGNEE_TYPE_TAB_KEYS[key]] || 0; return { - key: item.KEY, - name: item.NAME, + key, + name: this.$t(`CHAT_LIST.ASSIGNEE_TYPE_TABS.${key}`), count, }; }); diff --git a/app/javascript/dashboard/i18n/locale/ar/chatlist.json b/app/javascript/dashboard/i18n/locale/ar/chatlist.json index 59acf4738..9af631c7e 100644 --- a/app/javascript/dashboard/i18n/locale/ar/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ar/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "البحث عن جهات الاتصال، المحادثات، قوالب الردود الجاهزة .." }, "FILTER_ALL": "الكل", - "STATUS_TABS": [ - { - "NAME": "فتح", - "KEY": "openCount" - }, - { - "NAME": "مغلقة", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "محادثاتي", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "غير مسند", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "الكل", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "محادثاتي", + "unassigned": "غير مسند", + "all": "الكل" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "فتح" diff --git a/app/javascript/dashboard/i18n/locale/bg/chatlist.json b/app/javascript/dashboard/i18n/locale/bg/chatlist.json index f6b3b480f..54b5ae2f0 100644 --- a/app/javascript/dashboard/i18n/locale/bg/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/bg/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Търсене на хора, чатове, запазени отговори .." }, "FILTER_ALL": "Всички", - "STATUS_TABS": [ - { - "NAME": "Отворен", - "KEY": "openCount" - }, - { - "NAME": "Разрешен", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Мой", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Неназначен", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Всички", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Мой", + "unassigned": "Неназначен", + "all": "Всички" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Отворен" diff --git a/app/javascript/dashboard/i18n/locale/ca/chatlist.json b/app/javascript/dashboard/i18n/locale/ca/chatlist.json index fcba4a38e..9bbe16544 100644 --- a/app/javascript/dashboard/i18n/locale/ca/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ca/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Cerca persones, xats, respostes desades .." }, "FILTER_ALL": "Totes", - "STATUS_TABS": [ - { - "NAME": "Obrir", - "KEY": "openCount" - }, - { - "NAME": "Resoltes", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Meves", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Sense assignar", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Totes", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Meves", + "unassigned": "Sense assignar", + "all": "Totes" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Obrir" diff --git a/app/javascript/dashboard/i18n/locale/cs/chatlist.json b/app/javascript/dashboard/i18n/locale/cs/chatlist.json index 42aec5950..020affe76 100644 --- a/app/javascript/dashboard/i18n/locale/cs/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/cs/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Hledat lidi, chaty, Uložené odpovědi .." }, "FILTER_ALL": "Vše", - "STATUS_TABS": [ - { - "NAME": "Otevřít", - "KEY": "openCount" - }, - { - "NAME": "Vyřešeno", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Důl", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Nepřiřazeno", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Vše", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Důl", + "unassigned": "Nepřiřazeno", + "all": "Vše" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Otevřít" diff --git a/app/javascript/dashboard/i18n/locale/da/chatlist.json b/app/javascript/dashboard/i18n/locale/da/chatlist.json index 2be5e379e..9b6da159b 100644 --- a/app/javascript/dashboard/i18n/locale/da/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/da/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Søg efter Mennesker, Chats, Gemte svar .." }, "FILTER_ALL": "Alle", - "STATUS_TABS": [ - { - "NAME": "Åbn", - "KEY": "openCount" - }, - { - "NAME": "Løst", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Mine", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Ikke Tildelt", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Alle", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Mine", + "unassigned": "Ikke Tildelt", + "all": "Alle" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Åbn" diff --git a/app/javascript/dashboard/i18n/locale/de/chatlist.json b/app/javascript/dashboard/i18n/locale/de/chatlist.json index 1570a1c19..eed586fae 100644 --- a/app/javascript/dashboard/i18n/locale/de/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/de/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Suche nach Personen, Chats, gespeicherten Antworten .." }, "FILTER_ALL": "Alle", - "STATUS_TABS": [ - { - "NAME": "Offen", - "KEY": "openCount" - }, - { - "NAME": "Gelöst", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Meine", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Nicht zugewiesen", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Alle", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Meine", + "unassigned": "Nicht zugewiesen", + "all": "Alle" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Öffnen" diff --git a/app/javascript/dashboard/i18n/locale/el/chatlist.json b/app/javascript/dashboard/i18n/locale/el/chatlist.json index de7179517..779349e0b 100644 --- a/app/javascript/dashboard/i18n/locale/el/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/el/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Αναζήτηση Ανθρώπων, συνομιλιών, αποθηκευμένων απαντήσεων .." }, "FILTER_ALL": "Όλες", - "STATUS_TABS": [ - { - "NAME": "Ανοιχτές", - "KEY": "openCount" - }, - { - "NAME": "Επιλύθηκαν", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Δικές μου", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Χωρίς Αντιστοίχιση", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Όλες", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Δικές μου", + "unassigned": "Χωρίς Αντιστοίχιση", + "all": "Όλες" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Ανοιχτές" diff --git a/app/javascript/dashboard/i18n/locale/en/chatlist.json b/app/javascript/dashboard/i18n/locale/en/chatlist.json index e3d637b71..93bba4aab 100644 --- a/app/javascript/dashboard/i18n/locale/en/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/en/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Search for People, Chats, Saved Replies .." }, "FILTER_ALL": "All", - "STATUS_TABS": [ - { - "NAME": "Open", - "KEY": "openCount" - }, - { - "NAME": "Resolved", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Mine", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Unassigned", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "All", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Mine", + "unassigned": "Unassigned", + "all": "All" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Open" diff --git a/app/javascript/dashboard/i18n/locale/es/chatlist.json b/app/javascript/dashboard/i18n/locale/es/chatlist.json index 8b73f6ff2..959598771 100644 --- a/app/javascript/dashboard/i18n/locale/es/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/es/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Búsqueda de Personas, Chats, Respuestas Salvadas .." }, "FILTER_ALL": "Todos", - "STATUS_TABS": [ - { - "NAME": "Abrir", - "KEY": "openCount" - }, - { - "NAME": "Resuelto", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Mías", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Unassigned", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Todos", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Mías", + "unassigned": "Unassigned", + "all": "Todos" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Abrir" diff --git a/app/javascript/dashboard/i18n/locale/fa/chatlist.json b/app/javascript/dashboard/i18n/locale/fa/chatlist.json index 2bdaba90c..c9851c0d2 100644 --- a/app/javascript/dashboard/i18n/locale/fa/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/fa/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "پیدا کردن افراد، گفتگوها و پاسخ‌های از پیش نوشته شده..." }, "FILTER_ALL": "همه", - "STATUS_TABS": [ - { - "NAME": "باز", - "KEY": "openCount" - }, - { - "NAME": "حل شده", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "من", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "تخصیص داده نشده", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "همه", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "من", + "unassigned": "تخصیص داده نشده", + "all": "همه" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "باز" diff --git a/app/javascript/dashboard/i18n/locale/fi/chatlist.json b/app/javascript/dashboard/i18n/locale/fi/chatlist.json index 6b5842902..8dce11d82 100644 --- a/app/javascript/dashboard/i18n/locale/fi/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/fi/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Etsi ihmisiä, keskusteluita, tallennettuja vastauksia..." }, "FILTER_ALL": "Kaikki", - "STATUS_TABS": [ - { - "NAME": "Avaa", - "KEY": "openCount" - }, - { - "NAME": "Ratkaistu", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Minun", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Osoittamaton", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Kaikki", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Minun", + "unassigned": "Osoittamaton", + "all": "Kaikki" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Avaa" diff --git a/app/javascript/dashboard/i18n/locale/fr/chatlist.json b/app/javascript/dashboard/i18n/locale/fr/chatlist.json index 4a37f71e7..91895fdf0 100644 --- a/app/javascript/dashboard/i18n/locale/fr/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/fr/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Rechercher des personnes, des conversations, des réponses standardisées ..." }, "FILTER_ALL": "Tous", - "STATUS_TABS": [ - { - "NAME": "Ouvert", - "KEY": "openCount" - }, - { - "NAME": "Résolu", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Les miens", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Non assigné", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Tous", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Les miens", + "unassigned": "Non assigné", + "all": "Tous" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Ouvert" diff --git a/app/javascript/dashboard/i18n/locale/he/chatlist.json b/app/javascript/dashboard/i18n/locale/he/chatlist.json index 22e54ad1d..e669054ac 100644 --- a/app/javascript/dashboard/i18n/locale/he/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/he/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "חפש אנשים, צ'אטים, תגובות שמורות .." }, "FILTER_ALL": "הכל", - "STATUS_TABS": [ - { - "NAME": "פתח", - "KEY": "openCount" - }, - { - "NAME": "נפתרה", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "שלי", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "לא הוקצתה", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "הכל", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "שלי", + "unassigned": "לא הוקצתה", + "all": "הכל" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "פתח" diff --git a/app/javascript/dashboard/i18n/locale/hi/chatlist.json b/app/javascript/dashboard/i18n/locale/hi/chatlist.json index e3d637b71..93bba4aab 100644 --- a/app/javascript/dashboard/i18n/locale/hi/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/hi/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Search for People, Chats, Saved Replies .." }, "FILTER_ALL": "All", - "STATUS_TABS": [ - { - "NAME": "Open", - "KEY": "openCount" - }, - { - "NAME": "Resolved", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Mine", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Unassigned", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "All", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Mine", + "unassigned": "Unassigned", + "all": "All" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Open" diff --git a/app/javascript/dashboard/i18n/locale/hu/chatlist.json b/app/javascript/dashboard/i18n/locale/hu/chatlist.json index 90796f7f6..68365725a 100644 --- a/app/javascript/dashboard/i18n/locale/hu/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/hu/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Keresés: emberek, beszélgetése, mentett válaszok .." }, "FILTER_ALL": "Mind", - "STATUS_TABS": [ - { - "NAME": "Megnyitás", - "KEY": "openCount" - }, - { - "NAME": "Megoldva", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Enyém", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Gazdátlan", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Mind", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Enyém", + "unassigned": "Gazdátlan", + "all": "Mind" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Megnyitás" diff --git a/app/javascript/dashboard/i18n/locale/id/chatlist.json b/app/javascript/dashboard/i18n/locale/id/chatlist.json index e8532ec72..6319c7165 100644 --- a/app/javascript/dashboard/i18n/locale/id/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/id/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Telusuri Orang, Obrolan, Balasan Tersimpan.." }, "FILTER_ALL": "Semua", - "STATUS_TABS": [ - { - "NAME": "Terbuka", - "KEY": "openCount" - }, - { - "NAME": "Terselesaikan", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Milikku", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Belum ditugaskan", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Semua", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Milikku", + "unassigned": "Belum ditugaskan", + "all": "Semua" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Terbuka" diff --git a/app/javascript/dashboard/i18n/locale/it/chatlist.json b/app/javascript/dashboard/i18n/locale/it/chatlist.json index a2481f110..7c90eab17 100644 --- a/app/javascript/dashboard/i18n/locale/it/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/it/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Cerca persone, Chat, risposte salvate .." }, "FILTER_ALL": "Tutti", - "STATUS_TABS": [ - { - "NAME": "Aperte", - "KEY": "contaaperture" - }, - { - "NAME": "Risolti", - "KEY": "Conteggio" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Mie", - "KEY": "Io", - "COUNT_KEY": "contaMinore" - }, - { - "NAME": "Non assegnato", - "KEY": "non assegnato", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Tutti", - "KEY": "Tutti", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Mie", + "unassigned": "Non assegnato", + "all": "Tutti" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Aperte" diff --git a/app/javascript/dashboard/i18n/locale/ja/chatlist.json b/app/javascript/dashboard/i18n/locale/ja/chatlist.json index 064d52376..3e8a18a74 100644 --- a/app/javascript/dashboard/i18n/locale/ja/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ja/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "人物、チャット、保存された返信を検索する" }, "FILTER_ALL": "すべて", - "STATUS_TABS": [ - { - "NAME": "開く", - "KEY": "openCount" - }, - { - "NAME": "解決済み", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "自分", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "未割当", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "すべて", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "自分", + "unassigned": "未割当", + "all": "すべて" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "開く" diff --git a/app/javascript/dashboard/i18n/locale/ko/chatlist.json b/app/javascript/dashboard/i18n/locale/ko/chatlist.json index cec1fc991..13045ef2f 100644 --- a/app/javascript/dashboard/i18n/locale/ko/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ko/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "사람 검색, 채팅, 저장된 응답..." }, "FILTER_ALL": "모두", - "STATUS_TABS": [ - { - "NAME": "열기", - "KEY": "openCount" - }, - { - "NAME": "해결됨", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "나에게 할당", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "지정되지 않음", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "모두", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "나에게 할당", + "unassigned": "지정되지 않음", + "all": "모두" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "열기" diff --git a/app/javascript/dashboard/i18n/locale/lv/chatlist.json b/app/javascript/dashboard/i18n/locale/lv/chatlist.json index e3d637b71..93bba4aab 100644 --- a/app/javascript/dashboard/i18n/locale/lv/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/lv/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Search for People, Chats, Saved Replies .." }, "FILTER_ALL": "All", - "STATUS_TABS": [ - { - "NAME": "Open", - "KEY": "openCount" - }, - { - "NAME": "Resolved", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Mine", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Unassigned", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "All", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Mine", + "unassigned": "Unassigned", + "all": "All" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Open" diff --git a/app/javascript/dashboard/i18n/locale/ml/chatlist.json b/app/javascript/dashboard/i18n/locale/ml/chatlist.json index 538f108a2..54df183b7 100644 --- a/app/javascript/dashboard/i18n/locale/ml/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ml/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "ആളുകൾ, ചാറ്റുകൾ, ക്യാൻഡ് മറുപടികൾ എന്നിവയ്ക്കായി തിരയുക .." }, "FILTER_ALL": "എല്ലാം", - "STATUS_TABS": [ - { - "NAME": "സജീവം", - "KEY": "openCount" - }, - { - "NAME": "പരിഹരിച്ചത്", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "എന്റേത്", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "നിയുക്തമാക്കാത്തത്", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "എല്ലാം", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "എന്റേത്", + "unassigned": "നിയുക്തമാക്കാത്തത്", + "all": "എല്ലാം" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "സജീവം" diff --git a/app/javascript/dashboard/i18n/locale/ne/chatlist.json b/app/javascript/dashboard/i18n/locale/ne/chatlist.json index e3d637b71..93bba4aab 100644 --- a/app/javascript/dashboard/i18n/locale/ne/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ne/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Search for People, Chats, Saved Replies .." }, "FILTER_ALL": "All", - "STATUS_TABS": [ - { - "NAME": "Open", - "KEY": "openCount" - }, - { - "NAME": "Resolved", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Mine", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Unassigned", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "All", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Mine", + "unassigned": "Unassigned", + "all": "All" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Open" diff --git a/app/javascript/dashboard/i18n/locale/nl/chatlist.json b/app/javascript/dashboard/i18n/locale/nl/chatlist.json index 887b84a90..fa9c30b24 100644 --- a/app/javascript/dashboard/i18n/locale/nl/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/nl/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Zoek naar mensen, gesprekken, opgeslagen antwoorden .." }, "FILTER_ALL": "Allemaal", - "STATUS_TABS": [ - { - "NAME": "Open", - "KEY": "openCount" - }, - { - "NAME": "Opgelost", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Mijn", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Niet toegewezen", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Allemaal", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Mijn", + "unassigned": "Niet toegewezen", + "all": "Allemaal" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Open" diff --git a/app/javascript/dashboard/i18n/locale/no/chatlist.json b/app/javascript/dashboard/i18n/locale/no/chatlist.json index 2d6fff92c..729bf1521 100644 --- a/app/javascript/dashboard/i18n/locale/no/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/no/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Søk etter personer, samtaler, lagrede svar .." }, "FILTER_ALL": "Alle", - "STATUS_TABS": [ - { - "NAME": "Åpne", - "KEY": "openCount" - }, - { - "NAME": "Løst", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Mine", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Ikke tildelt", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Alle", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Mine", + "unassigned": "Ikke tildelt", + "all": "Alle" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Åpne" diff --git a/app/javascript/dashboard/i18n/locale/pl/chatlist.json b/app/javascript/dashboard/i18n/locale/pl/chatlist.json index 51d1d83d3..4435da117 100644 --- a/app/javascript/dashboard/i18n/locale/pl/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/pl/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Szukaj ludzi, czatów, zapisanych odpowiedzi .." }, "FILTER_ALL": "Wszystkie", - "STATUS_TABS": [ - { - "NAME": "Otwórz", - "KEY": "openCount" - }, - { - "NAME": "Rozwiązano", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Kopalnia", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Nieprzypisane", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Wszystkie", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Kopalnia", + "unassigned": "Nieprzypisane", + "all": "Wszystkie" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Otwarte" diff --git a/app/javascript/dashboard/i18n/locale/pt/chatlist.json b/app/javascript/dashboard/i18n/locale/pt/chatlist.json index aefe5b0c4..d344a1076 100644 --- a/app/javascript/dashboard/i18n/locale/pt/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/pt/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Pesquisar pessoas, conversas, respostas salvas .." }, "FILTER_ALL": "TODOS", - "STATUS_TABS": [ - { - "NAME": "Abertas", - "KEY": "openCount" - }, - { - "NAME": "Resolvido", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Minerar", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Não atribuído", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "TODOS", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Minerar", + "unassigned": "Não atribuído", + "all": "Todos" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Abertas" diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json b/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json index 0278274e5..7aa17802b 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Pesquisar pessoas, conversas, respostas salvas .." }, "FILTER_ALL": "Todos", - "STATUS_TABS": [ - { - "NAME": "Abertas", - "KEY": "openCount" - }, - { - "NAME": "Resolvida", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Minha", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Não atribuída", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Todos", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Minha", + "unassigned": "Não atribuída", + "all": "Todos" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Abertas" diff --git a/app/javascript/dashboard/i18n/locale/ro/chatlist.json b/app/javascript/dashboard/i18n/locale/ro/chatlist.json index 6525c0bd1..f97c89570 100644 --- a/app/javascript/dashboard/i18n/locale/ro/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ro/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Caută persoane, conversații, răspunsuri salvate .." }, "FILTER_ALL": "Toate", - "STATUS_TABS": [ - { - "NAME": "Deschide", - "KEY": "openCount" - }, - { - "NAME": "Rezolvat", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Ale mele", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Neatribuit", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Toate", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Ale mele", + "unassigned": "Neatribuit", + "all": "Toate" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Deschide" diff --git a/app/javascript/dashboard/i18n/locale/ru/chatlist.json b/app/javascript/dashboard/i18n/locale/ru/chatlist.json index 7eaa00dfb..95ae5d47b 100644 --- a/app/javascript/dashboard/i18n/locale/ru/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ru/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Искать людей, чаты, сохраненные ответы .." }, "FILTER_ALL": "Все", - "STATUS_TABS": [ - { - "NAME": "Открыть", - "KEY": "openCount" - }, - { - "NAME": "Закрыт", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Мои", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Неназначен", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Все", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Мои", + "unassigned": "Неназначен", + "all": "Все" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Открыть" diff --git a/app/javascript/dashboard/i18n/locale/sk/chatlist.json b/app/javascript/dashboard/i18n/locale/sk/chatlist.json index f60a4456b..e7ce0eead 100644 --- a/app/javascript/dashboard/i18n/locale/sk/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/sk/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Vyhľadávanie ľudí, konverzácií, uložených odpovedí.." }, "FILTER_ALL": "Všetko", - "STATUS_TABS": [ - { - "NAME": "Otvorené", - "KEY": "openCount" - }, - { - "NAME": "Vyriešené", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Moje", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Nepriradené", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Všetko", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Moje", + "unassigned": "Nepriradené", + "all": "Všetko" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Otvorené" diff --git a/app/javascript/dashboard/i18n/locale/sr/chatlist.json b/app/javascript/dashboard/i18n/locale/sr/chatlist.json index 44d87f299..efef0429d 100644 --- a/app/javascript/dashboard/i18n/locale/sr/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/sr/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Tražite osobe, razgovore, gotove odgovore .." }, "FILTER_ALL": "Sve", - "STATUS_TABS": [ - { - "NAME": "Otvoreni", - "KEY": "openCount" - }, - { - "NAME": "Rešeni", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Moji", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Nedodeljen", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Svi", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Moji", + "unassigned": "Nedodeljen", + "all": "Svi" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Otvoreni" diff --git a/app/javascript/dashboard/i18n/locale/sv/chatlist.json b/app/javascript/dashboard/i18n/locale/sv/chatlist.json index 6bf34759c..1a49f49fa 100644 --- a/app/javascript/dashboard/i18n/locale/sv/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/sv/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Sök efter personer, chattar, sparade svar .." }, "FILTER_ALL": "Alla", - "STATUS_TABS": [ - { - "NAME": "Öppna", - "KEY": "openCount" - }, - { - "NAME": "Löst", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Mina", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Otilldelade", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Alla", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Mina", + "unassigned": "Otilldelade", + "all": "Alla" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Öppna" diff --git a/app/javascript/dashboard/i18n/locale/ta/chatlist.json b/app/javascript/dashboard/i18n/locale/ta/chatlist.json index dd518b8d4..b7e5a6bcd 100644 --- a/app/javascript/dashboard/i18n/locale/ta/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ta/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "நபர்கள், அரட்டைகள், சேமித்த பதில்களை தேட .." }, "FILTER_ALL": "எல்லாம்", - "STATUS_TABS": [ - { - "NAME": "திற", - "KEY": "openCount" - }, - { - "NAME": "தீர்க்கப்பட்டது", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "என்னுடைய", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "ஒதுக்கப்படாதது", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "எல்லாம்", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "என்னுடைய", + "unassigned": "ஒதுக்கப்படாதது", + "all": "எல்லாம்" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "திற" diff --git a/app/javascript/dashboard/i18n/locale/th/chatlist.json b/app/javascript/dashboard/i18n/locale/th/chatlist.json index 94293972e..580a48f09 100644 --- a/app/javascript/dashboard/i18n/locale/th/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/th/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "ค้นหาผู้คน, เเชท, หรือการตอบกลับ" }, "FILTER_ALL": "ทั้งหมด", - "STATUS_TABS": [ - { - "NAME": "เปิด", - "KEY": "openCount" - }, - { - "NAME": "เสร็จสิ้น", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "ของฉัน", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "ไม่ได้รับมอบหมาย", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "ทั้งหมด", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "ของฉัน", + "unassigned": "ไม่ได้รับมอบหมาย", + "all": "ทั้งหมด" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "เปิด" diff --git a/app/javascript/dashboard/i18n/locale/tr/chatlist.json b/app/javascript/dashboard/i18n/locale/tr/chatlist.json index 16e380225..387981fd1 100644 --- a/app/javascript/dashboard/i18n/locale/tr/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/tr/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Kişileri, Sohbetleri, Kaydedilen Yanıtları Ara .." }, "FILTER_ALL": "Hepsi", - "STATUS_TABS": [ - { - "NAME": "Açık", - "KEY": "openCount" - }, - { - "NAME": "Çözüldü", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Benim", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Atanmamış", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Hepsi", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Benim", + "unassigned": "Atanmamış", + "all": "Hepsi" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Açık" diff --git a/app/javascript/dashboard/i18n/locale/uk/chatlist.json b/app/javascript/dashboard/i18n/locale/uk/chatlist.json index 5cda7a47e..2302f64f2 100644 --- a/app/javascript/dashboard/i18n/locale/uk/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/uk/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Пошук людей, чатів та збережених відповідей.." }, "FILTER_ALL": "Всі", - "STATUS_TABS": [ - { - "NAME": "Відкриті", - "KEY": "openCount" - }, - { - "NAME": "Вирішені", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Мої", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Непризначені", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Всі", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Мої", + "unassigned": "Непризначені", + "all": "Всі" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Відкриті" diff --git a/app/javascript/dashboard/i18n/locale/ur/chatlist.json b/app/javascript/dashboard/i18n/locale/ur/chatlist.json index b209790e2..edf29540f 100644 --- a/app/javascript/dashboard/i18n/locale/ur/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ur/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "لوگوں ، چیٹس یا محفوظ کردہ جوابات میں تلاش کریں.." }, "FILTER_ALL": "تمام", - "STATUS_TABS": [ - { - "NAME": "کھولیں۔", - "KEY": "openCount" - }, - { - "NAME": "حل ہو گیا۔", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "میرا", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "نا مقرر کیا ہوا", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "تمام", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "میرا", + "unassigned": "نا مقرر کیا ہوا", + "all": "تمام" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "کھولیں۔" diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/chatlist.json b/app/javascript/dashboard/i18n/locale/ur_IN/chatlist.json index e3d637b71..93bba4aab 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Search for People, Chats, Saved Replies .." }, "FILTER_ALL": "All", - "STATUS_TABS": [ - { - "NAME": "Open", - "KEY": "openCount" - }, - { - "NAME": "Resolved", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Mine", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Unassigned", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "All", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Mine", + "unassigned": "Unassigned", + "all": "All" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Open" diff --git a/app/javascript/dashboard/i18n/locale/vi/chatlist.json b/app/javascript/dashboard/i18n/locale/vi/chatlist.json index 376ad5608..72ef062ee 100644 --- a/app/javascript/dashboard/i18n/locale/vi/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/vi/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "Tìm kiếm cho người, đoạn chat, lưu trữ trả lời .." }, "FILTER_ALL": "Tất cả", - "STATUS_TABS": [ - { - "NAME": "Mở", - "KEY": "openCount" - }, - { - "NAME": "Đã được giải quyết", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "Của tôi", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "Chưa được phân công", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "Tất cả", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "Của tôi", + "unassigned": "Chưa được phân công", + "all": "Tất cả" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "Mở" diff --git a/app/javascript/dashboard/i18n/locale/zh/chatlist.json b/app/javascript/dashboard/i18n/locale/zh/chatlist.json index 1de627a15..b7d574d46 100644 --- a/app/javascript/dashboard/i18n/locale/zh/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/zh/chatlist.json @@ -10,33 +10,11 @@ "SEARCH": { "INPUT": "搜索人、聊天室、保存回复" }, - "STATUS_TABS": [ - { - "NAME": "打开", - "KEY": "openCount" - }, - { - "NAME": "已解决", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "我的", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "未分配的", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "所有的", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "我的", + "unassigned": "未分配的", + "all": "所有的" + }, "CHAT_STATUS_ITEMS": [ { "TEXT": "正在进行的\n", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json b/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json index 76beb060a..734d8ebd3 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "搜索人、聊天室、保存回复" }, "FILTER_ALL": "所有的", - "STATUS_TABS": [ - { - "NAME": "打开", - "KEY": "openCount" - }, - { - "NAME": "已解决", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "我的", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "未分配的", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "所有的", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "我的", + "unassigned": "未分配的", + "all": "所有的" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "打开" diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json b/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json index 0d91b98cd..c526710c2 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json @@ -12,33 +12,11 @@ "INPUT": "搜尋人、聊天室、保存回覆" }, "FILTER_ALL": "所有的", - "STATUS_TABS": [ - { - "NAME": "打開", - "KEY": "openCount" - }, - { - "NAME": "已解決", - "KEY": "allConvCount" - } - ], - "ASSIGNEE_TYPE_TABS": [ - { - "NAME": "我的", - "KEY": "me", - "COUNT_KEY": "mineCount" - }, - { - "NAME": "未指派的", - "KEY": "unassigned", - "COUNT_KEY": "unAssignedCount" - }, - { - "NAME": "所有的", - "KEY": "all", - "COUNT_KEY": "allCount" - } - ], + "ASSIGNEE_TYPE_TABS": { + "me": "我的", + "unassigned": "未指派的", + "all": "所有的" + }, "CHAT_STATUS_FILTER_ITEMS": { "open": { "TEXT": "打開" From 47a6d9681a4303eb54705246eec01d117a20c18b Mon Sep 17 00:00:00 2001 From: Tejaswini Chile Date: Thu, 26 May 2022 19:05:30 +0530 Subject: [PATCH 27/39] feat: send instagram message after 24 hours (#4698) Added MESSAGE_TAG: HUMAN_AGENT for Instagram messages if the user wants to send it after the standard message window. Fixes #4689 --- app/models/conversation.rb | 14 +++- .../instagram/send_on_instagram_service.rb | 18 ++++- config/installation_config.yml | 3 + spec/models/conversation_spec.rb | 32 +++++++++ .../send_on_instagram_service_spec.rb | 69 ++++++++++++++++--- 5 files changed, 122 insertions(+), 14 deletions(-) diff --git a/app/models/conversation.rb b/app/models/conversation.rb index 643f8fa56..cd45adf7b 100644 --- a/app/models/conversation.rb +++ b/app/models/conversation.rb @@ -93,7 +93,7 @@ class Conversation < ApplicationRecord delegate :auto_resolve_duration, to: :account def can_reply? - return last_message_less_than_24_hrs? if additional_attributes['type'] == 'instagram_direct_message' + return can_reply_on_instagram? if additional_attributes['type'] == 'instagram_direct_message' return true unless inbox&.channel&.has_24_hour_messaging_window? @@ -112,6 +112,18 @@ class Conversation < ApplicationRecord Time.current < last_incoming_message.created_at + 24.hours end + def can_reply_on_instagram? + global_config = GlobalConfig.get('ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT') + + return false if last_incoming_message.nil? + + if global_config['ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT'] + Time.current < last_incoming_message.created_at + 7.days + else + last_message_less_than_24_hrs? + end + end + def update_assignee(agent = nil) update!(assignee: agent) end diff --git a/app/services/instagram/send_on_instagram_service.rb b/app/services/instagram/send_on_instagram_service.rb index 2ad7c9042..fbd3c44bf 100644 --- a/app/services/instagram/send_on_instagram_service.rb +++ b/app/services/instagram/send_on_instagram_service.rb @@ -23,17 +23,19 @@ class Instagram::SendOnInstagramService < Base::SendOnChannelService end def message_params - { + params = { recipient: { id: contact.get_source_id(inbox.id) }, message: { text: message.content } } + + merge_human_agent_tag(params) end def attachament_message_params attachment = message.attachments.first - { + params = { recipient: { id: contact.get_source_id(inbox.id) }, message: { attachment: { @@ -44,6 +46,8 @@ class Instagram::SendOnInstagramService < Base::SendOnChannelService } } } + + merge_human_agent_tag(params) end # Deliver a message with the given payload. @@ -96,4 +100,14 @@ class Instagram::SendOnInstagramService < Base::SendOnChannelService def config Facebook::Messenger.config end + + def merge_human_agent_tag(params) + global_config = GlobalConfig.get('ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT') + + return params unless global_config['ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT'] + + params[:messaging_type] = 'MESSAGE_TAG' + params[:tag] = 'HUMAN_AGENT' + params + end end diff --git a/config/installation_config.yml b/config/installation_config.yml index a80776715..e95c6da2c 100644 --- a/config/installation_config.yml +++ b/config/installation_config.yml @@ -59,3 +59,6 @@ - name: DISABLE_USER_PROFILE_UPDATE value: false locked: false +- name: ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT + value: false + locked: false diff --git a/spec/models/conversation_spec.rb b/spec/models/conversation_spec.rb index 8c278a81b..e83ee5195 100644 --- a/spec/models/conversation_spec.rb +++ b/spec/models/conversation_spec.rb @@ -512,6 +512,38 @@ RSpec.describe Conversation, type: :model do ) expect(conversation.can_reply?).to eq true end + + context 'when instagram channel' do + it 'return true with HUMAN_AGENT if it is outside of 24 hour window' do + InstallationConfig.where(name: 'ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT').first_or_create(value: true) + + conversation.update(additional_attributes: { type: 'instagram_direct_message' }) + create( + :message, + account: conversation.account, + inbox: facebook_inbox, + conversation: conversation, + created_at: Time.now - 48.hours + ) + + expect(conversation.can_reply?).to eq true + end + + it 'return false without HUMAN_AGENT if it is outside of 24 hour window' do + InstallationConfig.where(name: 'ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT').first_or_create(value: false) + + conversation.update(additional_attributes: { type: 'instagram_direct_message' }) + create( + :message, + account: conversation.account, + inbox: facebook_inbox, + conversation: conversation, + created_at: Time.now - 48.hours + ) + + expect(conversation.can_reply?).to eq false + end + end end end diff --git a/spec/services/instagram/send_on_instagram_service_spec.rb b/spec/services/instagram/send_on_instagram_service_spec.rb index 1606f27d1..f42efa1df 100644 --- a/spec/services/instagram/send_on_instagram_service_spec.rb +++ b/spec/services/instagram/send_on_instagram_service_spec.rb @@ -27,21 +27,68 @@ describe Instagram::SendOnInstagramService do ) end - it 'if message is sent from chatwoot and is outgoing' do - message = create(:message, message_type: 'outgoing', inbox: instagram_inbox, account: account, conversation: conversation) - response = ::Instagram::SendOnInstagramService.new(message: message).perform + context 'without message_tag HUMAN_AGENT' do + before do + InstallationConfig.where(name: 'ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT').first_or_create(value: false) + end - expect(response).to eq({ message_id: 'anyrandommessageid1234567890' }) + it 'if message is sent from chatwoot and is outgoing' do + message = create(:message, message_type: 'outgoing', inbox: instagram_inbox, account: account, conversation: conversation) + + allow(HTTParty).to receive(:post).with( + { + recipient: { id: contact.get_source_id(instagram_inbox.id) }, + message: { + text: message.content + } + } + ).and_return( + { + 'message_id': 'anyrandommessageid1234567890' + } + ) + + response = ::Instagram::SendOnInstagramService.new(message: message).perform + + expect(response).to eq({ message_id: 'anyrandommessageid1234567890' }) + end + + it 'if message with attachment is sent from chatwoot and is outgoing' do + message = build(:message, message_type: 'outgoing', inbox: instagram_inbox, account: account, conversation: conversation) + attachment = message.attachments.new(account_id: message.account_id, file_type: :image) + attachment.file.attach(io: File.open(Rails.root.join('spec/assets/avatar.png')), filename: 'avatar.png', content_type: 'image/png') + message.save! + response = ::Instagram::SendOnInstagramService.new(message: message).perform + + expect(response).to eq({ message_id: 'anyrandommessageid1234567890' }) + end end - it 'if message with attachment is sent from chatwoot and is outgoing' do - message = build(:message, message_type: 'outgoing', inbox: instagram_inbox, account: account, conversation: conversation) - attachment = message.attachments.new(account_id: message.account_id, file_type: :image) - attachment.file.attach(io: File.open(Rails.root.join('spec/assets/avatar.png')), filename: 'avatar.png', content_type: 'image/png') - message.save! - response = ::Instagram::SendOnInstagramService.new(message: message).perform + context 'with message_tag HUMAN_AGENT' do + before do + InstallationConfig.where(name: 'ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT').first_or_create(value: true) + end - expect(response).to eq({ message_id: 'anyrandommessageid1234567890' }) + it 'if message is sent from chatwoot and is outgoing' do + message = create(:message, message_type: 'outgoing', inbox: instagram_inbox, account: account, conversation: conversation) + + allow(HTTParty).to receive(:post).with( + { + recipient: { id: contact.get_source_id(instagram_inbox.id) }, + message: { + text: message.content + }, + messaging_type: 'MESSAGE_TAG', + tag: 'HUMAN_AGENT' + } + ).and_return( + { + 'message_id': 'anyrandommessageid1234567890' + } + ) + + ::Instagram::SendOnInstagramService.new(message: message).perform + end end end end From ab05dd9b9b2f65a74b9f36c0dab6b5a08d5a7af3 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Thu, 26 May 2022 20:23:00 +0530 Subject: [PATCH 28/39] chore: Improve the reauthorization requirement for Email Channel (#4753) --- app/jobs/inboxes/fetch_imap_emails_job.rb | 2 ++ app/models/channel/email.rb | 2 ++ app/models/concerns/reauthorizable.rb | 4 ++- spec/models/channel/email_spec.rb | 27 +++++++++++++++++++ spec/models/concerns/reauthorizable_shared.rb | 12 ++++++++- 5 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 spec/models/channel/email_spec.rb diff --git a/app/jobs/inboxes/fetch_imap_emails_job.rb b/app/jobs/inboxes/fetch_imap_emails_job.rb index ef24ef4c2..eab5e4701 100644 --- a/app/jobs/inboxes/fetch_imap_emails_job.rb +++ b/app/jobs/inboxes/fetch_imap_emails_job.rb @@ -7,6 +7,8 @@ class Inboxes::FetchImapEmailsJob < ApplicationJob return unless should_fetch_email?(channel) process_mail_for_channel(channel) + # clearing old failures like timeouts since the mail is now successfully processed + channel.reauthorized! rescue Errno::ECONNREFUSED, Net::OpenTimeout, Net::IMAP::NoResponseError channel.authorization_error! rescue StandardError => e diff --git a/app/models/channel/email.rb b/app/models/channel/email.rb index 5b1cc0c91..c5a67c676 100644 --- a/app/models/channel/email.rb +++ b/app/models/channel/email.rb @@ -36,6 +36,8 @@ class Channel::Email < ApplicationRecord include Channelable include Reauthorizable + AUTHORIZATION_ERROR_THRESHOLD = 10 + self.table_name = 'channel_email' EDITABLE_ATTRS = [:email, :imap_enabled, :imap_login, :imap_password, :imap_address, :imap_port, :imap_enable_ssl, :imap_inbox_synced_at, :smtp_enabled, :smtp_login, :smtp_password, :smtp_address, :smtp_port, :smtp_domain, :smtp_enable_starttls_auto, diff --git a/app/models/concerns/reauthorizable.rb b/app/models/concerns/reauthorizable.rb index dc55d9b2e..cc78b56a0 100644 --- a/app/models/concerns/reauthorizable.rb +++ b/app/models/concerns/reauthorizable.rb @@ -29,7 +29,9 @@ module Reauthorizable # Implement in your exception handling logic for authorization errors def authorization_error! ::Redis::Alfred.incr(authorization_error_count_key) - prompt_reauthorization! if authorization_error_count >= AUTHORIZATION_ERROR_THRESHOLD + # we are giving precendence to the authorization error threshhold defined in the class + # so that channels can override the default value + prompt_reauthorization! if authorization_error_count >= self.class::AUTHORIZATION_ERROR_THRESHOLD end # Performed automatically if error threshold is breached diff --git a/spec/models/channel/email_spec.rb b/spec/models/channel/email_spec.rb new file mode 100644 index 000000000..af3a978f4 --- /dev/null +++ b/spec/models/channel/email_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'rails_helper' +require Rails.root.join 'spec/models/concerns/reauthorizable_shared.rb' + +RSpec.describe Channel::Email do + let(:channel) { create(:channel_email) } + + describe 'concerns' do + it_behaves_like 'reauthorizable' + + context 'when prompt_reauthorization!' do + it 'calls channel notifier mail for email' do + admin_mailer = double + mailer_double = double + expect(AdministratorNotifications::ChannelNotificationsMailer).to receive(:with).and_return(admin_mailer) + expect(admin_mailer).to receive(:email_disconnect).with(channel.inbox).and_return(mailer_double) + expect(mailer_double).to receive(:deliver_later) + channel.prompt_reauthorization! + end + end + end + + it 'has a valid name' do + expect(channel.name).to eq('Email') + end +end diff --git a/spec/models/concerns/reauthorizable_shared.rb b/spec/models/concerns/reauthorizable_shared.rb index 62b251367..212afd4af 100644 --- a/spec/models/concerns/reauthorizable_shared.rb +++ b/spec/models/concerns/reauthorizable_shared.rb @@ -12,12 +12,22 @@ shared_examples_for 'reauthorizable' do expect(obj.authorization_error_count).to eq 1 end + it 'prompts reauthorization when error threshold is passed' do + obj = FactoryBot.create(model.to_s.underscore.tr('/', '_').to_sym) + expect(obj.reauthorization_required?).to eq false + + obj.class::AUTHORIZATION_ERROR_THRESHOLD.times do + obj.authorization_error! + end + + expect(obj.reauthorization_required?).to eq true + end + it 'prompt_reauthorization!' do obj = FactoryBot.create(model.to_s.underscore.tr('/', '_').to_sym) expect(obj.reauthorization_required?).to eq false obj.prompt_reauthorization! - expect(obj.reauthorization_required?).to eq true end From dceeb57a1d514d32ed17db61763b5ba23899fad4 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Thu, 26 May 2022 20:23:36 +0530 Subject: [PATCH 29/39] chore: Update translations from Crowdin (#4751) --- .../dashboard/i18n/locale/cs/chatlist.json | 2 +- .../dashboard/i18n/locale/de/report.json | 2 +- .../dashboard/i18n/locale/es/chatlist.json | 2 +- .../dashboard/i18n/locale/it/report.json | 4 +- .../dashboard/i18n/locale/pl/chatlist.json | 2 +- .../dashboard/i18n/locale/sk/report.json | 2 +- .../dashboard/i18n/locale/sr/chatlist.json | 2 +- .../i18n/locale/zh_CN/advancedFilters.json | 102 +++++++++--------- .../i18n/locale/zh_CN/attributesMgmt.json | 48 ++++----- .../i18n/locale/zh_CN/automation.json | 2 +- .../dashboard/i18n/locale/zh_CN/contact.json | 4 +- .../i18n/locale/zh_CN/contactFilters.json | 44 ++++---- .../i18n/locale/zh_CN/generalSettings.json | 2 +- config/locales/it.yml | 12 +-- 14 files changed, 115 insertions(+), 115 deletions(-) diff --git a/app/javascript/dashboard/i18n/locale/cs/chatlist.json b/app/javascript/dashboard/i18n/locale/cs/chatlist.json index 020affe76..0d46c6047 100644 --- a/app/javascript/dashboard/i18n/locale/cs/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/cs/chatlist.json @@ -13,7 +13,7 @@ }, "FILTER_ALL": "Vše", "ASSIGNEE_TYPE_TABS": { - "me": "Důl", + "me": "Mine", "unassigned": "Nepřiřazeno", "all": "Vše" }, diff --git a/app/javascript/dashboard/i18n/locale/de/report.json b/app/javascript/dashboard/i18n/locale/de/report.json index f62143d75..78328b540 100644 --- a/app/javascript/dashboard/i18n/locale/de/report.json +++ b/app/javascript/dashboard/i18n/locale/de/report.json @@ -421,7 +421,7 @@ "ACCOUNT_CONVERSATIONS": { "HEADER": "Offene Konversationen", "LOADING_MESSAGE": "Konversationsdaten werden geladen...", - "OPEN": "Offen", + "OPEN": "Öffnen", "UNATTENDED": "Unbeaufsichtigt", "UNASSIGNED": "Nicht zugewiesen" }, diff --git a/app/javascript/dashboard/i18n/locale/es/chatlist.json b/app/javascript/dashboard/i18n/locale/es/chatlist.json index 959598771..a8d0062ee 100644 --- a/app/javascript/dashboard/i18n/locale/es/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/es/chatlist.json @@ -14,7 +14,7 @@ "FILTER_ALL": "Todos", "ASSIGNEE_TYPE_TABS": { "me": "Mías", - "unassigned": "Unassigned", + "unassigned": "Sin asignar", "all": "Todos" }, "CHAT_STATUS_FILTER_ITEMS": { diff --git a/app/javascript/dashboard/i18n/locale/it/report.json b/app/javascript/dashboard/i18n/locale/it/report.json index c4948c98c..081c5cc4f 100644 --- a/app/javascript/dashboard/i18n/locale/it/report.json +++ b/app/javascript/dashboard/i18n/locale/it/report.json @@ -386,7 +386,7 @@ "CSAT_REPORTS": { "HEADER": "Rapporti CSAT", "NO_RECORDS": "Non ci sono risposte al sondaggio CSAT disponibili.", - "DOWNLOAD": "Download CSAT Reports", + "DOWNLOAD": "Scarica report CSAT", "FILTERS": { "AGENTS": { "PLACEHOLDER": "Scegli agenti" @@ -421,7 +421,7 @@ "ACCOUNT_CONVERSATIONS": { "HEADER": "Conversazioni aperte", "LOADING_MESSAGE": "Caricamento metriche conversazioni...", - "OPEN": "Aperte", + "OPEN": "Apri", "UNATTENDED": "Non partecipate", "UNASSIGNED": "Non assegnato" }, diff --git a/app/javascript/dashboard/i18n/locale/pl/chatlist.json b/app/javascript/dashboard/i18n/locale/pl/chatlist.json index 4435da117..84e1f198b 100644 --- a/app/javascript/dashboard/i18n/locale/pl/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/pl/chatlist.json @@ -13,7 +13,7 @@ }, "FILTER_ALL": "Wszystkie", "ASSIGNEE_TYPE_TABS": { - "me": "Kopalnia", + "me": "Mine", "unassigned": "Nieprzypisane", "all": "Wszystkie" }, diff --git a/app/javascript/dashboard/i18n/locale/sk/report.json b/app/javascript/dashboard/i18n/locale/sk/report.json index 5ba7826a3..27cb2b1b5 100644 --- a/app/javascript/dashboard/i18n/locale/sk/report.json +++ b/app/javascript/dashboard/i18n/locale/sk/report.json @@ -421,7 +421,7 @@ "ACCOUNT_CONVERSATIONS": { "HEADER": "Open Conversations", "LOADING_MESSAGE": "Loading conversation metrics...", - "OPEN": "Otvorené", + "OPEN": "Otvoriť", "UNATTENDED": "Unattended", "UNASSIGNED": "Nepriradené" }, diff --git a/app/javascript/dashboard/i18n/locale/sr/chatlist.json b/app/javascript/dashboard/i18n/locale/sr/chatlist.json index efef0429d..155270e33 100644 --- a/app/javascript/dashboard/i18n/locale/sr/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/sr/chatlist.json @@ -15,7 +15,7 @@ "ASSIGNEE_TYPE_TABS": { "me": "Moji", "unassigned": "Nedodeljen", - "all": "Svi" + "all": "Sve" }, "CHAT_STATUS_FILTER_ITEMS": { "open": { diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/advancedFilters.json b/app/javascript/dashboard/i18n/locale/zh_CN/advancedFilters.json index 39c814191..b0ca59fde 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/advancedFilters.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/advancedFilters.json @@ -1,91 +1,91 @@ { "FILTER": { - "TITLE": "Filter Conversations", - "SUBTITLE": "Add filters below and hit 'Apply filters' to filter conversations.", - "ADD_NEW_FILTER": "Add Filter", - "FILTER_DELETE_ERROR": "You should have atleast one filter to save", - "SUBMIT_BUTTON_LABEL": "Apply filters", + "TITLE": "过滤会话", + "SUBTITLE": "在下方添加过滤器并点击“应用过滤器”到过滤对话。", + "ADD_NEW_FILTER": "添加过滤器", + "FILTER_DELETE_ERROR": "您至少需要一个过滤器来保存", + "SUBMIT_BUTTON_LABEL": "应用过滤器", "CANCEL_BUTTON_LABEL": "取消", - "CLEAR_BUTTON_LABEL": "Clear Filters", - "EMPTY_VALUE_ERROR": "Value is required", - "TOOLTIP_LABEL": "Filter conversations", + "CLEAR_BUTTON_LABEL": "清除过滤器", + "EMPTY_VALUE_ERROR": "必须填写值", + "TOOLTIP_LABEL": "过滤会话", "QUERY_DROPDOWN_LABELS": { - "AND": "AND", - "OR": "OR" + "AND": "和", + "OR": "或" }, "OPERATOR_LABELS": { - "equal_to": "Equal to", - "not_equal_to": "Not equal to", - "contains": "Contains", - "does_not_contain": "Does not contain", - "is_present": "Is present", - "is_not_present": "Is not present", - "is_greater_than": "Is greater than", - "is_less_than": "Is lesser than", - "days_before": "Is x days before" + "equal_to": "等于", + "not_equal_to": "不等于", + "contains": "包含", + "does_not_contain": "不包含", + "is_present": "存在", + "is_not_present": "不存在", + "is_greater_than": "大于", + "is_less_than": "小于:", + "days_before": "是 x 天前" }, "ATTRIBUTE_LABELS": { - "TRUE": "True", - "FALSE": "False" + "TRUE": "真的", + "FALSE": "错误" }, "ATTRIBUTES": { "STATUS": "状态", - "ASSIGNEE_NAME": "Assignee Name", + "ASSIGNEE_NAME": "指派人姓名", "INBOX_NAME": "收件箱名称", - "TEAM_NAME": "Team Name", - "CONVERSATION_IDENTIFIER": "Conversation Identifier", - "CAMPAIGN_NAME": "Campaign Name", + "TEAM_NAME": "团队名称", + "CONVERSATION_IDENTIFIER": "会话标识符", + "CAMPAIGN_NAME": "活动名称", "LABELS": "标签", - "BROWSER_LANGUAGE": "Browser Language", - "COUNTRY_NAME": "Country Name", - "REFERER_LINK": "Referer link", - "CUSTOM_ATTRIBUTE_LIST": "List", - "CUSTOM_ATTRIBUTE_TEXT": "Text", - "CUSTOM_ATTRIBUTE_NUMBER": "Number", - "CUSTOM_ATTRIBUTE_LINK": "Link", - "CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox", - "CREATED_AT": "Created At", - "LAST_ACTIVITY": "Last Activity" + "BROWSER_LANGUAGE": "浏览器语言", + "COUNTRY_NAME": "国家", + "REFERER_LINK": "引用链接", + "CUSTOM_ATTRIBUTE_LIST": "列表", + "CUSTOM_ATTRIBUTE_TEXT": "文本", + "CUSTOM_ATTRIBUTE_NUMBER": "号码", + "CUSTOM_ATTRIBUTE_LINK": "链接", + "CUSTOM_ATTRIBUTE_CHECKBOX": "复选框", + "CREATED_AT": "创建于", + "LAST_ACTIVITY": "上次活动" }, "GROUPS": { - "STANDARD_FILTERS": "Standard Filters", - "ADDITIONAL_FILTERS": "Additional Filters", + "STANDARD_FILTERS": "标准过滤器", + "ADDITIONAL_FILTERS": "附加过滤器", "CUSTOM_ATTRIBUTES": "自定义属性" }, "CUSTOM_VIEWS": { "ADD": { - "TITLE": "Do you want to save this filter?", - "LABEL": "Name this filter", - "PLACEHOLDER": "Enter a name for this filter", + "TITLE": "您想要保存此过滤器吗?", + "LABEL": "给此过滤器命名", + "PLACEHOLDER": "输入此过滤器的名称", "ERROR_MESSAGE": "名字必填", - "SAVE_BUTTON": "Save filter", + "SAVE_BUTTON": "保存过滤器", "CANCEL_BUTTON": "取消", "API_FOLDERS": { - "SUCCESS_MESSAGE": "Folder created successfully", - "ERROR_MESSAGE": "Error while creating folder" + "SUCCESS_MESSAGE": "文件夹创建成功", + "ERROR_MESSAGE": "文件夹创建失败" }, "API_SEGMENTS": { - "SUCCESS_MESSAGE": "Segment created successfully", - "ERROR_MESSAGE": "Error while creating segment" + "SUCCESS_MESSAGE": "片段创建成功", + "ERROR_MESSAGE": "创建片段时出错" } }, "DELETE": { - "DELETE_BUTTON": "Delete filter", + "DELETE_BUTTON": "删除过滤器", "MODAL": { "CONFIRM": { "TITLE": "确认删除", - "MESSAGE": "Are you sure to delete the filter ", + "MESSAGE": "您确定要删除过滤器吗? ", "YES": "是,删除", "NO": "否,保留它" } }, "API_FOLDERS": { - "SUCCESS_MESSAGE": "Folder deleted successfully", - "ERROR_MESSAGE": "Error while deleting folder" + "SUCCESS_MESSAGE": "文件夹删除成功", + "ERROR_MESSAGE": "删除文件夹时出错" }, "API_SEGMENTS": { - "SUCCESS_MESSAGE": "Segment deleted successfully", - "ERROR_MESSAGE": "Error while deleting segment" + "SUCCESS_MESSAGE": "片段删除成功", + "ERROR_MESSAGE": "删除片段时出错" } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/attributesMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/attributesMgmt.json index b1d468b67..22b9d13b8 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/attributesMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/attributesMgmt.json @@ -3,7 +3,7 @@ "HEADER": "自定义属性", "HEADER_BTN_TXT": "添加自定义属性", "LOADING": "正在获取自定义属性", - "SIDEBAR_TXT": "

Custom Attributes

A custom attribute tracks facts about your contacts/conversation — like the subscription plan, or when they ordered the first item etc.

For creating a Custom Attribute, just click on the Add Custom Attribute. You can also edit or delete an existing Custom Attribute by clicking on the Edit or Delete button.

", + "SIDEBAR_TXT": "

自定义属性

自定义属性跟踪您的联系人/对话 — 就像订阅计划 或者当他们订购第一个物品等时。

要创建自定义属性,只需点击添加自定义属性。 您也可以通过点击编辑或删除按钮编辑或删除现有的自定义属性。

", "ADD": { "TITLE": "添加自定义属性", "SUBMIT": "创建", @@ -16,67 +16,67 @@ }, "DESC": { "LABEL": "描述信息", - "PLACEHOLDER": "Enter custom attribute description", - "ERROR": "Description is required" + "PLACEHOLDER": "输入自定义属性描述", + "ERROR": "描述是必需的" }, "MODEL": { "LABEL": "应用到", "PLACEHOLDER": "请选择一个", - "ERROR": "Model is required" + "ERROR": "模型是必需的" }, "TYPE": { "LABEL": "类型", "PLACEHOLDER": "请选择一个类型", - "ERROR": "Type is required", + "ERROR": "类型是必需的", "LIST": { - "LABEL": "List Values", - "PLACEHOLDER": "Please enter value and press enter key", - "ERROR": "Must have at least one value" + "LABEL": "列表值", + "PLACEHOLDER": "请输入值并按回车键", + "ERROR": "必须至少有一个值" } }, "KEY": { "LABEL": "键", - "PLACEHOLDER": "Enter custom attribute key", + "PLACEHOLDER": "输入自定义属性键", "ERROR": "键是必需的", "IN_VALID": "无效键" } }, "API": { - "SUCCESS_MESSAGE": "Custom Attribute added successfully", - "ERROR_MESSAGE": "Could not able to create a custom attribute, Please try again later" + "SUCCESS_MESSAGE": "自定义属性添加成功", + "ERROR_MESSAGE": "无法创建自定义属性,请稍后再试" } }, "DELETE": { "BUTTON_TEXT": "删除", "API": { - "SUCCESS_MESSAGE": "Custom Attribute deleted successfully.", - "ERROR_MESSAGE": "Couldn't delete the custom attribute. Try again." + "SUCCESS_MESSAGE": "自定义属性删除成功", + "ERROR_MESSAGE": "无法删除自定义属性。请重试。" }, "CONFIRM": { - "TITLE": "Are you sure want to delete - %{attributeName}", - "PLACE_HOLDER": "Please type {attributeName} to confirm", - "MESSAGE": "Deleting will remove the custom attribute", + "TITLE": "您确定要删除 - %{attributeName}", + "PLACE_HOLDER": "请输入 {attributeName} 以确认", + "MESSAGE": "删除将删除自定义属性", "YES": "删除 ", "NO": "取消" } }, "EDIT": { - "TITLE": "Edit Custom Attribute", + "TITLE": "编辑自定义属性", "UPDATE_BUTTON_TEXT": "更新", "TYPE": { "LIST": { - "LABEL": "List Values", - "PLACEHOLDER": "Please enter values and press enter key" + "LABEL": "列表值", + "PLACEHOLDER": "请输入值并按输入键" } }, "API": { - "SUCCESS_MESSAGE": "Custom Attribute updated successfully", - "ERROR_MESSAGE": "There was an error updating custom attribute, please try again" + "SUCCESS_MESSAGE": "自定义属性更新成功", + "ERROR_MESSAGE": "更新自定义属性时出错,请重试" } }, "TABS": { "HEADER": "自定义属性", - "CONVERSATION": "Conversation", + "CONVERSATION": "会话", "CONTACT": "联系人" }, "LIST": { @@ -91,8 +91,8 @@ "DELETE": "删除" }, "EMPTY_RESULT": { - "404": "There are no custom attributes created", - "NOT_FOUND": "There are no custom attributes configured" + "404": "没有创建自定义属性", + "NOT_FOUND": "没有配置自定义属性" } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/automation.json b/app/javascript/dashboard/i18n/locale/zh_CN/automation.json index cbb17c275..a33296c4a 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/automation.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/automation.json @@ -17,7 +17,7 @@ "DESC": { "LABEL": "描述信息", "PLACEHOLDER": "Enter rule description", - "ERROR": "Description is required" + "ERROR": "描述是必需的" }, "EVENT": { "LABEL": "Event", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json index 8976fdfff..8be366df2 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json @@ -186,8 +186,8 @@ "SEARCH_BUTTON": "搜索", "SEARCH_INPUT_PLACEHOLDER": "搜索联系人", "FILTER_CONTACTS": "Filter", - "FILTER_CONTACTS_SAVE": "Save filter", - "FILTER_CONTACTS_DELETE": "Delete filter", + "FILTER_CONTACTS_SAVE": "保存过滤器", + "FILTER_CONTACTS_DELETE": "删除过滤器", "LIST": { "LOADING_MESSAGE": "正在加载联系人列表...", "404": "没有搜索到联系人🔍", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/contactFilters.json b/app/javascript/dashboard/i18n/locale/zh_CN/contactFilters.json index 2a001b828..867d18cde 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/contactFilters.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/contactFilters.json @@ -2,28 +2,28 @@ "CONTACTS_FILTER": { "TITLE": "Filter Contacts", "SUBTITLE": "Add filters below and hit 'Submit' to filter contacts.", - "ADD_NEW_FILTER": "Add Filter", + "ADD_NEW_FILTER": "添加过滤器", "CLEAR_ALL_FILTERS": "Clear All Filters", - "FILTER_DELETE_ERROR": "You should have atleast one filter to save", + "FILTER_DELETE_ERROR": "您至少需要一个过滤器来保存", "SUBMIT_BUTTON_LABEL": "提交", "CANCEL_BUTTON_LABEL": "取消", - "CLEAR_BUTTON_LABEL": "Clear Filters", - "EMPTY_VALUE_ERROR": "Value is required", + "CLEAR_BUTTON_LABEL": "清除过滤器", + "EMPTY_VALUE_ERROR": "必须填写值", "TOOLTIP_LABEL": "Filter contacts", "QUERY_DROPDOWN_LABELS": { - "AND": "AND", - "OR": "OR" + "AND": "和", + "OR": "或" }, "OPERATOR_LABELS": { - "equal_to": "Equal to", - "not_equal_to": "Not equal to", - "contains": "Contains", - "does_not_contain": "Does not contain", - "is_present": "Is present", - "is_not_present": "Is not present", - "is_greater_than": "Is greater than", + "equal_to": "等于", + "not_equal_to": "不等于", + "contains": "包含", + "does_not_contain": "不包含", + "is_present": "存在", + "is_not_present": "不存在", + "is_greater_than": "大于", "is_lesser_than": "Is lesser than", - "days_before": "Is x days before" + "days_before": "是 x 天前" }, "ATTRIBUTES": { "NAME": "姓名:", @@ -32,17 +32,17 @@ "IDENTIFIER": "Identifier", "CITY": "City", "COUNTRY": "Country", - "CUSTOM_ATTRIBUTE_LIST": "List", - "CUSTOM_ATTRIBUTE_TEXT": "Text", - "CUSTOM_ATTRIBUTE_NUMBER": "Number", - "CUSTOM_ATTRIBUTE_LINK": "Link", - "CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox", - "CREATED_AT": "Created At", + "CUSTOM_ATTRIBUTE_LIST": "列表", + "CUSTOM_ATTRIBUTE_TEXT": "文本", + "CUSTOM_ATTRIBUTE_NUMBER": "号码", + "CUSTOM_ATTRIBUTE_LINK": "链接", + "CUSTOM_ATTRIBUTE_CHECKBOX": "复选框", + "CREATED_AT": "创建于", "LAST_ACTIVITY": "Last Activity" }, "GROUPS": { - "STANDARD_FILTERS": "Standard Filters", - "ADDITIONAL_FILTERS": "Additional Filters", + "STANDARD_FILTERS": "标准过滤器", + "ADDITIONAL_FILTERS": "附加过滤器", "CUSTOM_ATTRIBUTES": "自定义属性" } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/generalSettings.json b/app/javascript/dashboard/i18n/locale/zh_CN/generalSettings.json index 151434225..514e7ca89 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/generalSettings.json @@ -97,7 +97,7 @@ "SECTIONS": { "GENERAL": "General", "REPORTS": "报告", - "CONVERSATION": "Conversation", + "CONVERSATION": "会话", "CHANGE_ASSIGNEE": "Change Assignee", "CHANGE_TEAM": "Change Team", "ADD_LABEL": "Add label to the conversation", diff --git a/config/locales/it.yml b/config/locales/it.yml index fabe6efdd..1d8d6c444 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -47,14 +47,14 @@ it: default_group_by: giorno csat: headers: - contact_name: Contact Name - contact_email_address: Contact Email Address - contact_phone_number: Contact Phone Number - link_to_the_conversation: Link to the conversation + contact_name: Nome contatto + contact_email_address: Indirizzo email contatto + contact_phone_number: Numero di telefono contatto + link_to_the_conversation: Link alla conversazione agent_name: Nome dell'agente rating: Valutazione - feedback: Feedback Comment - recorded_at: Recorded date + feedback: Commento del feedback + recorded_at: Data di registrazione notifications: notification_title: conversation_creation: "[Nuova conversazione] - #%{display_id} è stato creato in %{inbox_name}" From 52fad886b88e71f88a81ad44916da746b60cd56d Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Fri, 27 May 2022 09:26:59 +0530 Subject: [PATCH 30/39] feat: Add business hours in downloadable reports (#4674) Co-authored-by: Aswin Dev P.S --- .../api/v2/accounts/reports_controller.rb | 27 +++++---- app/helpers/api/v2/accounts/reports_helper.rb | 56 +++++++++++++++++++ app/javascript/dashboard/api/reports.js | 16 +++--- .../dashboard/api/specs/reports.spec.js | 13 +++-- .../dashboard/helper/downloadHelper.js | 9 ++- .../helper/specs/downloadHelper.spec.js | 4 ++ .../reports/components/WootReports.vue | 6 +- .../dashboard/store/modules/reports.js | 8 +-- .../api/v2/accounts/reports/agents.csv.erb | 9 +-- .../api/v2/accounts/reports/inboxes.csv.erb | 19 ++++--- .../api/v2/accounts/reports/labels.csv.erb | 18 +++--- .../api/v2/accounts/reports/teams.csv.erb | 9 +-- config/locales/en.yml | 11 ++++ 13 files changed, 138 insertions(+), 67 deletions(-) create mode 100644 app/helpers/api/v2/accounts/reports_helper.rb diff --git a/app/controllers/api/v2/accounts/reports_controller.rb b/app/controllers/api/v2/accounts/reports_controller.rb index c2117583a..bbc4dde7b 100644 --- a/app/controllers/api/v2/accounts/reports_controller.rb +++ b/app/controllers/api/v2/accounts/reports_controller.rb @@ -1,4 +1,5 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController + include Api::V2::Accounts::ReportsHelper before_action :check_authorization def index @@ -12,27 +13,23 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController end def agents - response.headers['Content-Type'] = 'text/csv' - response.headers['Content-Disposition'] = 'attachment; filename=agents_report.csv' - render layout: false, template: 'api/v2/accounts/reports/agents.csv.erb', format: 'csv' + @report_data = generate_agents_report + generate_csv('agents_report', 'api/v2/accounts/reports/agents.csv.erb') end def inboxes - response.headers['Content-Type'] = 'text/csv' - response.headers['Content-Disposition'] = 'attachment; filename=inboxes_report.csv' - render layout: false, template: 'api/v2/accounts/reports/inboxes.csv.erb', format: 'csv' + @report_data = generate_inboxes_report + generate_csv('inboxes_report', 'api/v2/accounts/reports/inboxes.csv.erb') end def labels - response.headers['Content-Type'] = 'text/csv' - response.headers['Content-Disposition'] = 'attachment; filename=labels_report.csv' - render layout: false, template: 'api/v2/accounts/reports/labels.csv.erb', format: 'csv' + @report_data = generate_labels_report + generate_csv('labels_report', 'api/v2/accounts/reports/labels.csv.erb') end def teams - response.headers['Content-Type'] = 'text/csv' - response.headers['Content-Disposition'] = 'attachment; filename=teams_report.csv' - render layout: false, template: 'api/v2/accounts/reports/teams.csv.erb', format: 'csv' + @report_data = generate_teams_report + generate_csv('teams_report', 'api/v2/accounts/reports/teams.csv.erb') end def conversations @@ -43,6 +40,12 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController private + def generate_csv(filename, template) + response.headers['Content-Type'] = 'text/csv' + response.headers['Content-Disposition'] = "attachment; filename=#{filename}.csv" + render layout: false, template: template, format: 'csv' + end + def check_authorization raise Pundit::NotAuthorizedError unless Current.account_user.administrator? end diff --git a/app/helpers/api/v2/accounts/reports_helper.rb b/app/helpers/api/v2/accounts/reports_helper.rb new file mode 100644 index 000000000..0604eba2f --- /dev/null +++ b/app/helpers/api/v2/accounts/reports_helper.rb @@ -0,0 +1,56 @@ +module Api::V2::Accounts::ReportsHelper + def generate_agents_report + Current.account.users.map do |agent| + agent_report = generate_report({ type: :agent, id: agent.id }) + [agent.name] + generate_readable_report_metrics(agent_report) + end + end + + def generate_inboxes_report + Current.account.inboxes.map do |inbox| + inbox_report = generate_report({ type: :inbox, id: inbox.id }) + [inbox.name, inbox.channel&.name] + generate_readable_report_metrics(inbox_report) + end + end + + def generate_teams_report + Current.account.teams.map do |team| + team_report = generate_report({ type: :team, id: team.id }) + [team.name] + generate_readable_report_metrics(team_report) + end + end + + def generate_labels_report + Current.account.labels.map do |label| + label_report = generate_report({ type: :label, id: label.id }) + [label.title] + generate_readable_report_metrics(label_report) + end + end + + def generate_report(report_params) + V2::ReportBuilder.new( + Current.account, + report_params.merge( + { + since: params[:since], + until: params[:until], + business_hours: ActiveModel::Type::Boolean.new.cast(params[:business_hours]) + } + ) + ).summary + end + + private + + def generate_readable_report_metrics(report_metric) + [ + report_metric[:conversations_count], + time_to_minutes(report_metric[:avg_first_response_time]), + time_to_minutes(report_metric[:avg_resolution_time]) + ] + end + + def time_to_minutes(time_in_seconds) + (time_in_seconds / 60).to_i + end +end diff --git a/app/javascript/dashboard/api/reports.js b/app/javascript/dashboard/api/reports.js index ca50c062f..61fd0adca 100644 --- a/app/javascript/dashboard/api/reports.js +++ b/app/javascript/dashboard/api/reports.js @@ -53,27 +53,27 @@ class ReportsAPI extends ApiClient { }); } - getAgentReports(since, until) { + getAgentReports({ from: since, to: until, businessHours }) { return axios.get(`${this.url}/agents`, { - params: { since, until }, + params: { since, until, business_hours: businessHours }, }); } - getLabelReports(since, until) { + getLabelReports({ from: since, to: until, businessHours }) { return axios.get(`${this.url}/labels`, { - params: { since, until }, + params: { since, until, business_hours: businessHours }, }); } - getInboxReports(since, until) { + getInboxReports({ from: since, to: until, businessHours }) { return axios.get(`${this.url}/inboxes`, { - params: { since, until }, + params: { since, until, business_hours: businessHours }, }); } - getTeamReports(since, until) { + getTeamReports({ from: since, to: until, businessHours }) { return axios.get(`${this.url}/teams`, { - params: { since, until }, + params: { since, until, business_hours: businessHours }, }); } } diff --git a/app/javascript/dashboard/api/specs/reports.spec.js b/app/javascript/dashboard/api/specs/reports.spec.js index b51c87db5..4e2a8f38f 100644 --- a/app/javascript/dashboard/api/specs/reports.spec.js +++ b/app/javascript/dashboard/api/specs/reports.spec.js @@ -47,20 +47,25 @@ describe('#Reports API', () => { }); it('#getAgentReports', () => { - reportsAPI.getAgentReports(1621103400, 1621621800); + reportsAPI.getAgentReports({ + from: 1621103400, + to: 1621621800, + businessHours: true, + }); expect(context.axiosMock.get).toHaveBeenCalledWith( '/api/v2/reports/agents', { params: { since: 1621103400, until: 1621621800, + business_hours: true, }, } ); }); it('#getLabelReports', () => { - reportsAPI.getLabelReports(1621103400, 1621621800); + reportsAPI.getLabelReports({ from: 1621103400, to: 1621621800 }); expect(context.axiosMock.get).toHaveBeenCalledWith( '/api/v2/reports/labels', { @@ -73,7 +78,7 @@ describe('#Reports API', () => { }); it('#getInboxReports', () => { - reportsAPI.getInboxReports(1621103400, 1621621800); + reportsAPI.getInboxReports({ from: 1621103400, to: 1621621800 }); expect(context.axiosMock.get).toHaveBeenCalledWith( '/api/v2/reports/inboxes', { @@ -86,7 +91,7 @@ describe('#Reports API', () => { }); it('#getTeamReports', () => { - reportsAPI.getTeamReports(1621103400, 1621621800); + reportsAPI.getTeamReports({ from: 1621103400, to: 1621621800 }); expect(context.axiosMock.get).toHaveBeenCalledWith( '/api/v2/reports/teams', { diff --git a/app/javascript/dashboard/helper/downloadHelper.js b/app/javascript/dashboard/helper/downloadHelper.js index 68c3b5cee..94b6a69bd 100644 --- a/app/javascript/dashboard/helper/downloadHelper.js +++ b/app/javascript/dashboard/helper/downloadHelper.js @@ -13,5 +13,10 @@ export const downloadCsvFile = (fileName, content) => { return link; }; -export const generateFileName = ({ type, to }) => - `${type}-report-${format(fromUnixTime(to), 'dd-MM-yyyy')}.csv`; +export const generateFileName = ({ type, to, businessHours = false }) => { + let name = `${type}-report-${format(fromUnixTime(to), 'dd-MM-yyyy')}`; + if (businessHours) { + name = `${name}-business-hours`; + } + return `${name}.csv`; +}; diff --git a/app/javascript/dashboard/helper/specs/downloadHelper.spec.js b/app/javascript/dashboard/helper/specs/downloadHelper.spec.js index 6cdec4160..477123422 100644 --- a/app/javascript/dashboard/helper/specs/downloadHelper.spec.js +++ b/app/javascript/dashboard/helper/specs/downloadHelper.spec.js @@ -5,5 +5,9 @@ describe('#generateFileName', () => { expect(generateFileName({ type: 'csat', to: 1652812199 })).toEqual( 'csat-report-17-05-2022.csv' ); + + expect( + generateFileName({ type: 'csat', to: 1652812199, businessHours: true }) + ).toEqual('csat-report-17-05-2022-business-hours.csv'); }); }); diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/WootReports.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/WootReports.vue index 34188a12a..098960e85 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/components/WootReports.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/WootReports.vue @@ -251,7 +251,7 @@ export default { }); }, downloadReports() { - const { from, to, type } = this; + const { from, to, type, businessHours } = this; const dispatchMethods = { agent: 'downloadAgentReports', label: 'downloadLabelReports', @@ -259,8 +259,8 @@ export default { team: 'downloadTeamReports', }; if (dispatchMethods[type]) { - const fileName = generateFileName({ type, to }); - const params = { from, to, fileName }; + const fileName = generateFileName({ type, to, businessHours }); + const params = { from, to, fileName, businessHours }; this.$store.dispatch(dispatchMethods[type], params); } }, diff --git a/app/javascript/dashboard/store/modules/reports.js b/app/javascript/dashboard/store/modules/reports.js index 9ae571803..0404d1aca 100644 --- a/app/javascript/dashboard/store/modules/reports.js +++ b/app/javascript/dashboard/store/modules/reports.js @@ -120,7 +120,7 @@ export const actions = { commit(types.default.UPDATE_REPORT_AGENTS_STATUS, data); }, downloadAgentReports(_, reportObj) { - return Report.getAgentReports(reportObj.from, reportObj.to) + return Report.getAgentReports(reportObj) .then(response => { downloadCsvFile(reportObj.fileName, response.data); }) @@ -129,7 +129,7 @@ export const actions = { }); }, downloadLabelReports(_, reportObj) { - return Report.getLabelReports(reportObj.from, reportObj.to) + return Report.getLabelReports(reportObj) .then(response => { downloadCsvFile(reportObj.fileName, response.data); }) @@ -138,7 +138,7 @@ export const actions = { }); }, downloadInboxReports(_, reportObj) { - return Report.getInboxReports(reportObj.from, reportObj.to) + return Report.getInboxReports(reportObj) .then(response => { downloadCsvFile(reportObj.fileName, response.data); }) @@ -147,7 +147,7 @@ export const actions = { }); }, downloadTeamReports(_, reportObj) { - return Report.getTeamReports(reportObj.from, reportObj.to) + return Report.getTeamReports(reportObj) .then(response => { downloadCsvFile(reportObj.fileName, response.data); }) diff --git a/app/views/api/v2/accounts/reports/agents.csv.erb b/app/views/api/v2/accounts/reports/agents.csv.erb index 9c8f1f814..bed88dfd7 100644 --- a/app/views/api/v2/accounts/reports/agents.csv.erb +++ b/app/views/api/v2/accounts/reports/agents.csv.erb @@ -6,14 +6,7 @@ ] %> <%= CSV.generate_line headers -%> -<% Current.account.users.each do |agent| %> - <% agent_report = V2::ReportBuilder.new(Current.account, { - type: :agent, - id: agent.id, - since: params[:since], - until: params[:until] - }).summary %> - <% row = [ agent.name, agent_report[:conversations_count], (agent_report[:avg_first_response_time]/60).to_i, (agent_report[:avg_resolution_time]/60).to_i ] %> +<% @report_data.each do |row| %> <%= CSV.generate_line row -%> <% end %> <%= CSV.generate_line [I18n.t('reports.period', since: Date.strptime(params[:since], '%s'), until: Date.strptime(params[:until], '%s'))] %> diff --git a/app/views/api/v2/accounts/reports/inboxes.csv.erb b/app/views/api/v2/accounts/reports/inboxes.csv.erb index c82be2df4..89b3b1182 100644 --- a/app/views/api/v2/accounts/reports/inboxes.csv.erb +++ b/app/views/api/v2/accounts/reports/inboxes.csv.erb @@ -1,12 +1,13 @@ -<% headers = ['Inbox name', 'Conversations count', 'Avg first response time (Minutes)', 'Avg resolution time (Minutes)'] %> +<% headers = [ + I18n.t('reports.inbox_csv.inbox_name'), + I18n.t('reports.inbox_csv.inbox_type'), + I18n.t('reports.inbox_csv.conversations_count'), + I18n.t('reports.inbox_csv.avg_first_response_time'), + I18n.t('reports.inbox_csv.avg_resolution_time') + ] +%> <%= CSV.generate_line headers -%> -<% Current.account.inboxes.each do |inbox| %> - <% inbox_report = V2::ReportBuilder.new(Current.account, { - type: :inbox, - id: inbox.id, - since: params[:since], - until: params[:until] - }).summary %> - <% row = [ inbox.name, inbox_report[:conversations_count], (inbox_report[:avg_first_response_time]/60).to_i, (inbox_report[:avg_resolution_time]/60).to_i ] %> +<% @report_data.each do |row| %> <%= CSV.generate_line row -%> <% end %> +<%= CSV.generate_line [I18n.t('reports.period', since: Date.strptime(params[:since], '%s'), until: Date.strptime(params[:until], '%s'))] %> diff --git a/app/views/api/v2/accounts/reports/labels.csv.erb b/app/views/api/v2/accounts/reports/labels.csv.erb index dcbc2b974..9fd0a9cc5 100644 --- a/app/views/api/v2/accounts/reports/labels.csv.erb +++ b/app/views/api/v2/accounts/reports/labels.csv.erb @@ -1,12 +1,12 @@ -<% headers = ['Label Title', 'Conversations count', 'Avg first response time (Minutes)', 'Avg resolution time (Minutes)'] %> +<% headers = [ + I18n.t('reports.label_csv.label_title'), + I18n.t('reports.label_csv.conversations_count'), + I18n.t('reports.label_csv.avg_first_response_time'), + I18n.t('reports.label_csv.avg_resolution_time') + ] +%> <%= CSV.generate_line headers -%> -<% Current.account.labels.each do |label| %> - <% label_report = V2::ReportBuilder.new(Current.account, { - type: :label, - id: label.id, - since: params[:since], - until: params[:until] - }).summary %> - <% row = [ label.title, label_report[:conversations_count], (label_report[:avg_first_response_time]/60).to_i, (label_report[:avg_resolution_time]/60).to_i ] %> +<% @report_data.each do |row| %> <%= CSV.generate_line row -%> <% end %> +<%= CSV.generate_line [I18n.t('reports.period', since: Date.strptime(params[:since], '%s'), until: Date.strptime(params[:until], '%s'))] %> diff --git a/app/views/api/v2/accounts/reports/teams.csv.erb b/app/views/api/v2/accounts/reports/teams.csv.erb index f7b82cb1d..e50e195bd 100644 --- a/app/views/api/v2/accounts/reports/teams.csv.erb +++ b/app/views/api/v2/accounts/reports/teams.csv.erb @@ -6,14 +6,7 @@ ] %> <%= CSV.generate_line headers -%> -<% Current.account.teams.each do |team| %> - <% team_report = V2::ReportBuilder.new(Current.account, { - type: :team, - id: team.id, - since: params[:since], - until: params[:until] - }).summary %> - <% row = [ team.name, team_report[:conversations_count], (team_report[:avg_first_response_time]/60).to_i, (team_report[:avg_resolution_time]/60).to_i ] %> +<% @report_data.each do |row| %> <%= CSV.generate_line row -%> <% end %> <%= CSV.generate_line [I18n.t('reports.period', since: Date.strptime(params[:since], '%s'), until: Date.strptime(params[:until], '%s'))] %> diff --git a/config/locales/en.yml b/config/locales/en.yml index bd7829b53..b986ef1c1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -54,6 +54,17 @@ en: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count From 50d2dbd46257eb40b8741b6fe91850b6e896e1a3 Mon Sep 17 00:00:00 2001 From: Devin Ellis Date: Thu, 26 May 2022 23:53:29 -0700 Subject: [PATCH 31/39] chore: Fix the exception while destructuring data in chatwoot:error listener (#4702) --- app/javascript/widget/store/modules/contacts.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/javascript/widget/store/modules/contacts.js b/app/javascript/widget/store/modules/contacts.js index c8187a9f8..587b84ac6 100644 --- a/app/javascript/widget/store/modules/contacts.js +++ b/app/javascript/widget/store/modules/contacts.js @@ -61,9 +61,7 @@ export const actions = { dispatch('conversationAttributes/getAttributes', {}, { root: true }); } } catch (error) { - const { - response: { data }, - } = error; + const data = error && error.response && error.response.data ? error.response.data : error IFrameHelper.sendMessage({ event: 'error', errorType: SET_USER_ERROR, From 568c30e93e92ddcaffcf8874332d07c692590b8d Mon Sep 17 00:00:00 2001 From: Vishnu Narayanan Date: Fri, 27 May 2022 17:33:24 +0530 Subject: [PATCH 32/39] chore: Update ruby and docker base image to 3.0.4 (#4693) * chore: Update ruby version to 3.0.4 * chore: update ruby version in docker workflow * chore: update ruby version to 3.1.2 * Upgrade vue-jest to remove deasync * Revert to 3.0.4 to see if deasync issue is fixed * fix: script failure if pg/redis not opted in Co-authored-by: Pranav Raj S --- .circleci/config.yml | 2 +- .github/workflows/run_foss_spec.yml | 2 +- .ruby-version | 2 +- Gemfile | 2 +- Gemfile.lock | 2 +- deployment/chatwoot-web.1.service | 6 +- deployment/chatwoot-worker.1.service | 6 +- deployment/setup_18.04.sh | 4 +- deployment/setup_20.04.sh | 14 +- docker/Dockerfile | 4 +- package.json | 2 +- yarn.lock | 370 ++++++++++++++------------- 12 files changed, 209 insertions(+), 207 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 076903576..87572fdc3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,7 +7,7 @@ defaults: &defaults working_directory: ~/build docker: # specify the version you desire here - - image: cimg/ruby:3.0.2-browsers + - image: cimg/ruby:3.0.4-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images diff --git a/.github/workflows/run_foss_spec.yml b/.github/workflows/run_foss_spec.yml index 395e063e7..39df7aa3d 100644 --- a/.github/workflows/run_foss_spec.yml +++ b/.github/workflows/run_foss_spec.yml @@ -47,7 +47,7 @@ jobs: - uses: ruby/setup-ruby@v1 with: - ruby-version: 3.0.2 # Not needed with a .ruby-version file + ruby-version: 3.0.4 # Not needed with a .ruby-version file bundler-cache: true # runs 'bundle install' and caches installed gems automatically - name: yarn diff --git a/.ruby-version b/.ruby-version index b50214693..b0f2dcb32 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.0.2 +3.0.4 diff --git a/Gemfile b/Gemfile index 55d02d87c..f7cac3c70 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -ruby '3.0.2' +ruby '3.0.4' ##-- base gems for rails --## gem 'rack-cors', require: 'rack/cors' diff --git a/Gemfile.lock b/Gemfile.lock index 880390f16..3ba3e0a36 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -752,7 +752,7 @@ DEPENDENCIES working_hours RUBY VERSION - ruby 3.0.2p107 + ruby 3.0.4p208 BUNDLED WITH 2.3.10 diff --git a/deployment/chatwoot-web.1.service b/deployment/chatwoot-web.1.service index 40f64b563..15d70e1bf 100644 --- a/deployment/chatwoot-web.1.service +++ b/deployment/chatwoot-web.1.service @@ -16,10 +16,10 @@ KillMode=mixed StandardInput=null SyslogIdentifier=%p -Environment="PATH=/home/chatwoot/.rvm/gems/ruby-3.0.2/bin:/home/chatwoot/.rvm/gems/ruby-3.0.2@global/bin:/home/chatwoot/.rvm/rubies/ruby-3.0.2/bin:/home/chatwoot/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/chatwoot/.rvm/bin:/home/chatwoot/.rvm/bin" +Environment="PATH=/home/chatwoot/.rvm/gems/ruby-3.0.4/bin:/home/chatwoot/.rvm/gems/ruby-3.0.4@global/bin:/home/chatwoot/.rvm/rubies/ruby-3.0.4/bin:/home/chatwoot/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/chatwoot/.rvm/bin:/home/chatwoot/.rvm/bin" Environment="PORT=3000" Environment="RAILS_ENV=production" Environment="NODE_ENV=production" Environment="RAILS_LOG_TO_STDOUT=true" -Environment="GEM_HOME=/home/chatwoot/.rvm/gems/ruby-3.0.2" -Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-3.0.2:/home/chatwoot/.rvm/gems/ruby-3.0.2@global" +Environment="GEM_HOME=/home/chatwoot/.rvm/gems/ruby-3.0.4" +Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-3.0.4:/home/chatwoot/.rvm/gems/ruby-3.0.4@global" diff --git a/deployment/chatwoot-worker.1.service b/deployment/chatwoot-worker.1.service index fa13898c0..6e6e113f0 100644 --- a/deployment/chatwoot-worker.1.service +++ b/deployment/chatwoot-worker.1.service @@ -16,10 +16,10 @@ KillMode=mixed StandardInput=null SyslogIdentifier=%p -Environment="PATH=/home/chatwoot/.rvm/gems/ruby-3.0.2/bin:/home/chatwoot/.rvm/gems/ruby-3.0.2@global/bin:/home/chatwoot/.rvm/rubies/ruby-3.0.2/bin:/home/chatwoot/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/chatwoot/.rvm/bin:/home/chatwoot/.rvm/bin" +Environment="PATH=/home/chatwoot/.rvm/gems/ruby-3.0.4/bin:/home/chatwoot/.rvm/gems/ruby-3.0.4@global/bin:/home/chatwoot/.rvm/rubies/ruby-3.0.4/bin:/home/chatwoot/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/chatwoot/.rvm/bin:/home/chatwoot/.rvm/bin" Environment="PORT=3000" Environment="RAILS_ENV=production" Environment="NODE_ENV=production" Environment="RAILS_LOG_TO_STDOUT=true" -Environment="GEM_HOME=/home/chatwoot/.rvm/gems/ruby-3.0.2" -Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-3.0.2:/home/chatwoot/.rvm/gems/ruby-3.0.2@global" +Environment="GEM_HOME=/home/chatwoot/.rvm/gems/ruby-3.0.4" +Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-3.0.4:/home/chatwoot/.rvm/gems/ruby-3.0.4@global" diff --git a/deployment/setup_18.04.sh b/deployment/setup_18.04.sh index 9e9e3cf12..d8250f5eb 100644 --- a/deployment/setup_18.04.sh +++ b/deployment/setup_18.04.sh @@ -43,8 +43,8 @@ RAILS_ENV=production sudo -i -u chatwoot << EOF rvm --version rvm autolibs disable -rvm install "ruby-3.0.2" -rvm use 3.0.2 --default +rvm install "ruby-3.0.4" +rvm use 3.0.4 --default git clone https://github.com/chatwoot/chatwoot.git cd chatwoot diff --git a/deployment/setup_20.04.sh b/deployment/setup_20.04.sh index 13c26f513..6f9512f39 100644 --- a/deployment/setup_20.04.sh +++ b/deployment/setup_20.04.sh @@ -7,7 +7,8 @@ set -eu -o pipefail trap exit_handler EXIT - +pg_pass=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 15 ; echo '') + function exit_handler() { if [ "$?" -ne 0 ]; then echo -en "\nSome error has occured. Check '/var/log/chatwoot-setup.log' for details.\n" @@ -77,8 +78,7 @@ function configure_rvm() { } function configure_db() { - pg_pass=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 15 ; echo '') - sudo -i -u postgres psql << EOF + sudo -i -u postgres psql << EOF \set pass `echo $pg_pass` CREATE USER chatwoot CREATEDB; ALTER USER chatwoot PASSWORD :'pass'; @@ -103,8 +103,8 @@ function setup_chatwoot() { sudo -i -u chatwoot << EOF rvm --version rvm autolibs disable - rvm install "ruby-3.0.2" - rvm use 3.0.2 --default + rvm install "ruby-3.0.4" + rvm use 3.0.4 --default git clone https://github.com/chatwoot/chatwoot.git cd chatwoot @@ -236,7 +236,7 @@ EOF configure_systemd_services &>> "${LOG_FILE}" public_ip=$(curl http://checkip.amazonaws.com -s) - + if [ "$configure_webserver" != "yes" ] then cat << EOF @@ -245,7 +245,7 @@ EOF Woot! Woot!! Chatwoot server installation is complete. The server will be accessible at http://$public_ip:3000 -To configure a domain and SSL certificate, follow the guide at +To configure a domain and SSL certificate, follow the guide at https://www.chatwoot.com/docs/deployment/deploy-chatwoot-in-linux-vm Join the community at https://chatwoot.com/community diff --git a/docker/Dockerfile b/docker/Dockerfile index 64c49b324..71a6dc72f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ # pre-build stage -FROM ruby:3.0.2-alpine AS pre-builder +FROM ruby:3.0.4-alpine AS pre-builder # ARG default to production settings # For development docker-compose file overrides ARGS @@ -66,7 +66,7 @@ RUN rm -rf /gems/ruby/3.0.0/cache/*.gem \ && find /gems/ruby/3.0.0/gems/ \( -name "*.c" -o -name "*.o" \) -delete # final build stage -FROM ruby:3.0.2-alpine +FROM ruby:3.0.4-alpine ARG BUNDLE_WITHOUT="development:test" ENV BUNDLE_WITHOUT ${BUNDLE_WITHOUT} diff --git a/package.json b/package.json index f862e0fbe..dcfd8d5db 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "lint-staged": "10.5.4", "prettier": "^1.16.4", "rimraf": "^3.0.0", - "vue-jest": "3.0.7", + "vue-jest": "4", "webpack-dev-server": "3.11.2" }, "engines": { diff --git a/yarn.lock b/yarn.lock index fa46ddb37..bd138a972 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,6 +16,13 @@ dependencies: "@babel/highlight" "^7.12.13" +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" @@ -73,6 +80,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" + integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== + dependencies: + "@babel/types" "^7.18.2" + "@jridgewell/gen-mapping" "^0.3.0" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" @@ -145,6 +161,11 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" + integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== + "@babel/helper-explode-assignable-expression@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" @@ -161,6 +182,14 @@ "@babel/template" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" @@ -176,6 +205,13 @@ "@babel/traverse" "^7.13.15" "@babel/types" "^7.13.16" +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" @@ -190,6 +226,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.14": version "7.13.14" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" @@ -204,6 +247,20 @@ "@babel/traverse" "^7.13.13" "@babel/types" "^7.13.14" +"@babel/helper-module-transforms@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" + integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.0" + "@babel/types" "^7.18.0" + "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" @@ -221,6 +278,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== +"@babel/helper-plugin-utils@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" + integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== + "@babel/helper-remap-async-to-generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" @@ -247,6 +309,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-simple-access@^7.17.7", "@babel/helper-simple-access@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" + integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== + dependencies: + "@babel/types" "^7.18.2" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -261,11 +330,23 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-validator-identifier@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" @@ -299,11 +380,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.16.7": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" + integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.12.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.13", "@babel/parser@^7.12.7", "@babel/parser@^7.13.12", "@babel/parser@^7.13.16", "@babel/parser@^7.13.9", "@babel/parser@^7.6.0", "@babel/parser@^7.7.0", "@babel/parser@^7.9.6": version "7.13.16" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37" integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw== +"@babel/parser@^7.16.7", "@babel/parser@^7.18.0": + version "7.18.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.3.tgz#39e99c7b0c4c56cef4d1eed8de9f506411c2ebc2" + integrity sha512-rL50YcEuHbbauAFAysNsJA4/f89fGTOBRNs9P81sniKnKAr4xULe5AecolcsKbi88xu0ByWYDj/S1AJ3FSFuSQ== + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" @@ -724,6 +819,16 @@ "@babel/helper-simple-access" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz#1aa8efa2e2a6e818b6a7f2235fceaf09bdb31e9e" + integrity sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-simple-access" "^7.18.2" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-systemjs@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" @@ -1049,6 +1154,15 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15", "@babel/traverse@^7.13.17", "@babel/traverse@^7.7.0": version "7.13.17" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.17.tgz#c85415e0c7d50ac053d758baec98b28b2ecfeea3" @@ -1063,6 +1177,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.18.0": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.2.tgz#b77a52604b5cc836a9e1e08dca01cba67a12d2e8" + integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.18.0" + "@babel/types" "^7.18.2" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.12.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.7", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.13.17", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.6.1", "@babel/types@^7.7.0", "@babel/types@^7.9.6": version "7.13.17" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4" @@ -1071,6 +1201,14 @@ "@babel/helper-validator-identifier" "^7.12.11" to-fast-properties "^2.0.0" +"@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.2.tgz#191abfed79ebe6f4242f643a9a5cbaa36b10b091" + integrity sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + "@base2/pretty-print-object@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.0.tgz#860ce718b0b73f4009e153541faff2cb6b85d047" @@ -1518,6 +1656,38 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" + integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" + integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@lit/reactive-element@^1.0.0", "@lit/reactive-element@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-1.1.1.tgz#523b29e529e881fce47bab764ea1b8058fd45796" @@ -2717,16 +2887,6 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== -"@types/strip-bom@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" - integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= - -"@types/strip-json-comments@0.0.30": - version "0.0.30" - resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" - integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== - "@types/tapable@^1", "@types/tapable@^1.0.5": version "1.0.7" resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.7.tgz#545158342f949e8fd3bfd813224971ecddc3fac4" @@ -3591,15 +3751,6 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -3660,13 +3811,6 @@ babel-loader@8.2.2, babel-loader@^8.2.2: make-dir "^3.1.0" schema-utils "^2.6.5" -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - babel-plugin-apply-mdx-type-prop@1.6.22: version "1.6.22" resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" @@ -3804,24 +3948,6 @@ babel-plugin-syntax-jsx@^6.18.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= -babel-plugin-transform-es2015-modules-commonjs@^6.26.0: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - babel-plugin-transform-vue-jsx@^3.5.0, babel-plugin-transform-vue-jsx@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-3.7.0.tgz#d40492e6692a36b594f7e9a1928f43e969740960" @@ -3891,50 +4017,6 @@ babel-preset-vue@^2.0.2: babel-plugin-syntax-jsx "^6.18.0" babel-plugin-transform-vue-jsx "^3.5.0" -babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - babel-walk@3.0.0-canary-5: version "3.0.0-canary-5" resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" @@ -3942,11 +4024,6 @@ babel-walk@3.0.0-canary-5: dependencies: "@babel/types" "^7.9.6" -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" @@ -4726,7 +4803,7 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clone@2.x, clone@^2.1.2: +clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= @@ -5061,11 +5138,6 @@ core-js@3.11.0, core-js@^3.0.4, core-js@^3.11.0, core-js@^3.6.5, core-js@^3.8.2: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.11.0.tgz#05dac6aa70c0a4ad842261f8957b961d36eb8926" integrity sha512-bd79DPpx+1Ilh9+30aT5O1sgpQd4Ttg8oqkqi51ZzhedMM1omD2e6IOF48Z/DzDCZ2svp49tN/3vneTK6ZBkXw== -core-js@^2.4.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -5540,14 +5612,6 @@ de-indent@^1.0.2: resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= -deasync@^0.1.15: - version "0.1.21" - resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.21.tgz#bb11eabd4466c0d8776f0d82deb8a6126460d30f" - integrity sha512-kUmM8Y+PZpMpQ+B4AuOW9k2Pfx/mSupJtxOsLzmnHY2WqZUYRFccFn2RhzPAqt3Xb+sorK/badW2D4zNzqZz5w== - dependencies: - bindings "^1.5.0" - node-addon-api "^1.7.1" - debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -6890,14 +6954,6 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-babel-config@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" - integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== - dependencies: - json5 "^0.5.1" - path-exists "^3.0.0" - find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -7409,11 +7465,6 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - globalthis@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b" @@ -8127,7 +8178,7 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4: +invariant@^2.2.3, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -9185,7 +9236,7 @@ jest@26.6.3: import-local "^3.0.2" jest-cli "^26.6.3" -js-beautify@^1.6.12, js-beautify@^1.6.14: +js-beautify@^1.6.12: version "1.13.13" resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.13.tgz#756907d1728f329f2b84c42efd56ad17514620bf" integrity sha512-oH+nc0U5mOAqX8M5JO1J0Pw/7Q35sAdOsM5W3i87pir9Ntx6P/5Gx1xLNoK+MGyvHk4rqqRCE4Oq58H6xl2W7A== @@ -9216,11 +9267,6 @@ js-stringify@^1.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - js-yaml@^3.13.1, js-yaml@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -9335,11 +9381,6 @@ json3@^3.3.3: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -10398,19 +10439,6 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-addon-api@^1.7.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" - integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== - -node-cache@^4.1.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-4.2.1.tgz#efd8474dee4edec4138cdded580f5516500f7334" - integrity sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A== - dependencies: - clone "2.x" - lodash "^4.17.15" - node-dir@^0.1.17: version "0.1.17" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" @@ -12903,11 +12931,6 @@ regenerate@^1.4.0: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" @@ -13799,6 +13822,11 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= + source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -14172,11 +14200,6 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - strip-json-comments@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" @@ -14534,11 +14557,6 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -14676,16 +14694,6 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" -tsconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" - integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== - dependencies: - "@types/strip-bom" "^3.0.0" - "@types/strip-json-comments" "0.0.30" - strip-bom "^3.0.0" - strip-json-comments "^2.0.0" - tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -15330,22 +15338,16 @@ vue-inbrowser-compiler-utils@^4.37.0: dependencies: camelcase "^5.3.1" -vue-jest@3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/vue-jest/-/vue-jest-3.0.7.tgz#a6d29758a5cb4d750f5d1242212be39be4296a33" - integrity sha512-PIOxFM+wsBMry26ZpfBvUQ/DGH2hvp5khDQ1n51g3bN0TwFwTy4J85XVfxTRMukqHji/GnAoGUnlZ5Ao73K62w== +vue-jest@4: + version "4.0.1" + resolved "https://registry.yarnpkg.com/vue-jest/-/vue-jest-4.0.1.tgz#683efc351c24456865b1356bae69d5bb663dafb5" + integrity sha512-4jewjN8HVgpIW0ZdEwzCWz5vcRLIs1PxMs+5IqJ/6f9KRbEQ+DEqEKHUzIjoNzW2UJOUYBZzWpBnVHakpc/k5w== dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.26.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@vue/component-compiler-utils" "^3.1.0" chalk "^2.1.0" - deasync "^0.1.15" extract-from-css "^0.4.4" - find-babel-config "^1.1.0" - js-beautify "^1.6.14" - node-cache "^4.1.1" - object-assign "^4.1.1" - source-map "^0.5.6" - tsconfig "^7.0.0" - vue-template-es2015-compiler "^1.6.0" + source-map "0.5.6" vue-loader@15.9.6: version "15.9.6" @@ -15391,7 +15393,7 @@ vue-template-compiler@2.6.12, vue-template-compiler@^2.6.11: de-indent "^1.0.2" he "^1.1.0" -vue-template-es2015-compiler@^1.6.0, vue-template-es2015-compiler@^1.9.0: +vue-template-es2015-compiler@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== From e924ce8b4e60530e5f4d1fe284413f3465c339da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 May 2022 17:18:18 +0530 Subject: [PATCH 33/39] chore(deps): bump rack from 2.2.3 to 2.2.3.1 (#4756) Bumps [rack](https://github.com/rack/rack) from 2.2.3 to 2.2.3.1. - [Release notes](https://github.com/rack/rack/releases) - [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md) - [Commits](https://github.com/rack/rack/compare/2.2.3...2.2.3.1) --- updated-dependencies: - dependency-name: rack dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3ba3e0a36..b12a2fc5c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -409,7 +409,7 @@ GEM activesupport (>= 3.0.0) raabro (1.4.0) racc (1.6.0) - rack (2.2.3) + rack (2.2.3.1) rack-attack (6.6.0) rack (>= 1.0, < 3) rack-cors (1.1.1) From afc7c1ac64f96fe754d16f5a15bf39c6ed6f70dc Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Mon, 30 May 2022 18:39:20 +0530 Subject: [PATCH 34/39] chore: Update translations (#4755) --- .../dashboard/i18n/locale/cs/conversation.json | 16 ++++++++-------- .../i18n/locale/cs/setNewPassword.json | 2 +- .../i18n/locale/pt/attributesMgmt.json | 18 +++++++++--------- .../dashboard/i18n/locale/pt/automation.json | 16 ++++++++-------- .../dashboard/i18n/locale/pt/chatlist.json | 2 +- config/locales/ar.yml | 11 +++++++++++ config/locales/bg.yml | 11 +++++++++++ config/locales/ca.yml | 11 +++++++++++ config/locales/cs.yml | 11 +++++++++++ config/locales/da.yml | 11 +++++++++++ config/locales/de.yml | 11 +++++++++++ config/locales/el.yml | 11 +++++++++++ config/locales/es.yml | 11 +++++++++++ config/locales/fa.yml | 11 +++++++++++ config/locales/fi.yml | 11 +++++++++++ config/locales/fr.yml | 11 +++++++++++ config/locales/he.yml | 11 +++++++++++ config/locales/hi.yml | 11 +++++++++++ config/locales/hu.yml | 11 +++++++++++ config/locales/id.yml | 11 +++++++++++ config/locales/it.yml | 11 +++++++++++ config/locales/ja.yml | 11 +++++++++++ config/locales/ko.yml | 11 +++++++++++ config/locales/lv.yml | 11 +++++++++++ config/locales/ml.yml | 11 +++++++++++ config/locales/ne.yml | 11 +++++++++++ config/locales/nl.yml | 11 +++++++++++ config/locales/no.yml | 11 +++++++++++ config/locales/pl.yml | 11 +++++++++++ config/locales/pt.yml | 11 +++++++++++ config/locales/pt_BR.yml | 11 +++++++++++ config/locales/ro.yml | 11 +++++++++++ config/locales/ru.yml | 11 +++++++++++ config/locales/sk.yml | 11 +++++++++++ config/locales/sr.yml | 11 +++++++++++ config/locales/sv.yml | 11 +++++++++++ config/locales/ta.yml | 11 +++++++++++ config/locales/th.yml | 11 +++++++++++ config/locales/tr.yml | 11 +++++++++++ config/locales/uk.yml | 11 +++++++++++ config/locales/ur.yml | 11 +++++++++++ config/locales/ur_IN.yml | 11 +++++++++++ config/locales/vi.yml | 11 +++++++++++ config/locales/zh_CN.yml | 11 +++++++++++ config/locales/zh_TW.yml | 11 +++++++++++ 45 files changed, 467 insertions(+), 27 deletions(-) diff --git a/app/javascript/dashboard/i18n/locale/cs/conversation.json b/app/javascript/dashboard/i18n/locale/cs/conversation.json index ee68d3fc0..ac17cd1c7 100644 --- a/app/javascript/dashboard/i18n/locale/cs/conversation.json +++ b/app/javascript/dashboard/i18n/locale/cs/conversation.json @@ -24,9 +24,9 @@ "24_HOURS_WINDOW": "24 hodinové omezení okna", "NOT_ASSIGNED_TO_YOU": "Tato konverzace vám není přiřazena. Chcete si přiřadit tuto konverzaci?", "ASSIGN_TO_ME": "Přiřadit mi", - "TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to", + "TWILIO_WHATSAPP_CAN_REPLY": "Na tuto konverzaci můžete odpovědět pouze pomocí šablony zprávy z důvodu", "TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 hodinové omezení okna", - "SELECT_A_TWEET_TO_REPLY": "Please select a tweet to reply to.", + "SELECT_A_TWEET_TO_REPLY": "Vyberte prosím tweet, na který chcete odpovědět.", "REPLYING_TO": "Odpovídáte uživateli:", "REMOVE_SELECTION": "Odstranit výběr", "DOWNLOAD": "Stáhnout", @@ -74,13 +74,13 @@ "TIP_FORMAT_ICON": "Zobrazit formátovaný textový editor", "TIP_EMOJI_ICON": "Zobrazit výběr emoji", "TIP_ATTACH_ICON": "Přiložit soubory", - "TIP_AUDIORECORDER_ICON": "Record audio", - "TIP_AUDIORECORDER_PERMISSION": "Allow access to audio", - "TIP_AUDIORECORDER_ERROR": "Could not open the audio", + "TIP_AUDIORECORDER_ICON": "Nahrát zvuk", + "TIP_AUDIORECORDER_PERMISSION": "Povolit přístup ke zvuku", + "TIP_AUDIORECORDER_ERROR": "Zvuk se nepodařilo otevřít", "ENTER_TO_SEND": "Enterem odeslat", - "DRAG_DROP": "Drag and drop here to attach", - "START_AUDIO_RECORDING": "Start audio recording", - "STOP_AUDIO_RECORDING": "Stop audio recording", + "DRAG_DROP": "Přetažením sem připojíte", + "START_AUDIO_RECORDING": "Spustit nahrávání zvuku", + "STOP_AUDIO_RECORDING": "Zastavit nahrávání zvuku", "": "", "EMAIL_HEAD": { "ADD_BCC": "Přidat bcc", diff --git a/app/javascript/dashboard/i18n/locale/cs/setNewPassword.json b/app/javascript/dashboard/i18n/locale/cs/setNewPassword.json index 5c81bea0a..e6421e12c 100644 --- a/app/javascript/dashboard/i18n/locale/cs/setNewPassword.json +++ b/app/javascript/dashboard/i18n/locale/cs/setNewPassword.json @@ -16,7 +16,7 @@ "ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později" }, "CAPTCHA": { - "ERROR": "Verification expired. Please solve captcha again." + "ERROR": "Ověření vypršelo. Vyřešte captchu znovu." }, "SUBMIT": "Odeslat" } diff --git a/app/javascript/dashboard/i18n/locale/pt/attributesMgmt.json b/app/javascript/dashboard/i18n/locale/pt/attributesMgmt.json index 2aaac9bd4..dba146efd 100644 --- a/app/javascript/dashboard/i18n/locale/pt/attributesMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt/attributesMgmt.json @@ -3,7 +3,7 @@ "HEADER": "Atributos personalizados", "HEADER_BTN_TXT": "Adicionar Atributo Personalizado", "LOADING": "Obtendo atributos personalizados", - "SIDEBAR_TXT": "

Custom Attributes

A custom attribute tracks facts about your contacts/conversation — like the subscription plan, or when they ordered the first item etc.

For creating a Custom Attribute, just click on the Add Custom Attribute. You can also edit or delete an existing Custom Attribute by clicking on the Edit or Delete button.

", + "SIDEBAR_TXT": "

Atributos personalizados

Um atributo personalizado rastreia factos sobre os seus contactos/conversação - como o plano de assinatura, ou quando encomendaram o primeiro artigo, etc.

Para criar um Atributo Personalizado, basta clicar no botão Adicionar Atributo Personalizado. Também pode editar ou apagar um Atributo Personalizado existente, clicando no botão Editar ou Apagar.

", "ADD": { "TITLE": "Adicionar Atributo Personalizado", "SUBMIT": "Criar", @@ -11,12 +11,12 @@ "FORM": { "NAME": { "LABEL": "Mostrar Nome", - "PLACEHOLDER": "Enter custom attribute display name", + "PLACEHOLDER": "Introduzia um nome de exibição de atributo personalizado", "ERROR": "Nome é obrigatório" }, "DESC": { "LABEL": "Descrição", - "PLACEHOLDER": "Enter custom attribute description", + "PLACEHOLDER": "Introduza a descrição do atributo personalizado", "ERROR": "Descrição é obrigatória" }, "MODEL": { @@ -43,19 +43,19 @@ }, "API": { "SUCCESS_MESSAGE": "Atributo Personalizado adicionado com sucesso", - "ERROR_MESSAGE": "Could not able to create a custom attribute, Please try again later" + "ERROR_MESSAGE": "Não foi possível criar um atributo personalizado, por favor tente novamente mais tarde" } }, "DELETE": { "BUTTON_TEXT": "excluir", "API": { - "SUCCESS_MESSAGE": "Custom Attribute deleted successfully.", - "ERROR_MESSAGE": "Couldn't delete the custom attribute. Try again." + "SUCCESS_MESSAGE": "Atributo personalizado eliminado com sucesso.", + "ERROR_MESSAGE": "Não foi possível apagar o atributo personalizado. Tente novamente." }, "CONFIRM": { "TITLE": "Tem a certeza que quer apagar a equipa - %{attributeName}", "PLACE_HOLDER": "Por favor, digite {attributeName} para confirmar", - "MESSAGE": "Deleting will remove the custom attribute", + "MESSAGE": "A eliminação irá remover o atributo personalizado", "YES": "excluir ", "NO": "cancelar" } @@ -70,8 +70,8 @@ } }, "API": { - "SUCCESS_MESSAGE": "Custom Attribute updated successfully", - "ERROR_MESSAGE": "There was an error updating custom attribute, please try again" + "SUCCESS_MESSAGE": "Atributo personalizado atualizado com sucesso", + "ERROR_MESSAGE": "Houve um erro na actualização do atributo personalizado, por favor tente novamente" } }, "TABS": { diff --git a/app/javascript/dashboard/i18n/locale/pt/automation.json b/app/javascript/dashboard/i18n/locale/pt/automation.json index b83b9f772..cee202fbc 100644 --- a/app/javascript/dashboard/i18n/locale/pt/automation.json +++ b/app/javascript/dashboard/i18n/locale/pt/automation.json @@ -34,8 +34,8 @@ "CONDITION_BUTTON_LABEL": "Adicionar Condição", "ACTION_BUTTON_LABEL": "Adicionar Ação", "API": { - "SUCCESS_MESSAGE": "Automation rule added successfully", - "ERROR_MESSAGE": "Could not able to create a automation rule, Please try again later" + "SUCCESS_MESSAGE": "Regra de automatização adicionada com sucesso", + "ERROR_MESSAGE": "Não foi possível criar uma regra de automatização, por favor tente novamente mais tarde" } }, "LIST": { @@ -58,7 +58,7 @@ "NO": "Não, Manter " }, "API": { - "SUCCESS_MESSAGE": "Automation rule deleted successfully", + "SUCCESS_MESSAGE": "Regra de automatização eliminada com sucesso", "ERROR_MESSAGE": "Could not able to delete a automation rule, Please try again later" } }, @@ -90,8 +90,8 @@ }, "ACTION": { "DELETE_MESSAGE": "É necessário ter pelo menos uma ação para salvar", - "TEAM_MESSAGE_INPUT_PLACEHOLDER": "Enter your message here", - "TEAM_DROPDOWN_PLACEHOLDER": "Select teams" + "TEAM_MESSAGE_INPUT_PLACEHOLDER": "Introduza aqui a sua mensagem", + "TEAM_DROPDOWN_PLACEHOLDER": "Selecionar equipas" }, "TOGGLE": { "ACTIVATION_TITLE": "Ativar Regra de Automação", @@ -106,10 +106,10 @@ "CANCEL_LABEL": "Não" }, "ATTACHMENT": { - "UPLOAD_ERROR": "Could not upload attachment, Please try again", - "LABEL_IDLE": "Upload Attachment", + "UPLOAD_ERROR": "Não foi possível carregar anexo, por favor tente novamente", + "LABEL_IDLE": "Carregar anexo", "LABEL_UPLOADING": "A carregar...", - "LABEL_UPLOADED": "Succesfully Uploaded", + "LABEL_UPLOADED": "Carregado com sucesso", "LABEL_UPLOAD_FAILED": "Upload Failed" } } diff --git a/app/javascript/dashboard/i18n/locale/pt/chatlist.json b/app/javascript/dashboard/i18n/locale/pt/chatlist.json index d344a1076..21a2eaac8 100644 --- a/app/javascript/dashboard/i18n/locale/pt/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/pt/chatlist.json @@ -15,7 +15,7 @@ "ASSIGNEE_TYPE_TABS": { "me": "Minerar", "unassigned": "Não atribuído", - "all": "Todos" + "all": "TODOS" }, "CHAT_STATUS_FILTER_ITEMS": { "open": { diff --git a/config/locales/ar.yml b/config/locales/ar.yml index c5afdb402..58d316646 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -39,6 +39,17 @@ ar: conversations_count: عدد المحادثات avg_first_response_time: متوسط وقت الرد الأول (الدقائق) avg_resolution_time: متوسط وقت المحادثة (الدقائق) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: متوسط وقت الرد الأول (الدقائق) + avg_resolution_time: متوسط وقت المحادثة (الدقائق) + label_csv: + label_title: الوسم + conversations_count: No. of conversations + avg_first_response_time: متوسط وقت الرد الأول (الدقائق) + avg_resolution_time: متوسط وقت المحادثة (الدقائق) team_csv: team_name: اسم الفريق conversations_count: عدد المحادثات diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 6469857f4..101b76ee9 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -39,6 +39,17 @@ bg: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 269b98285..f23afb7a7 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -39,6 +39,17 @@ ca: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 5cb16ce18..afd830dbd 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -39,6 +39,17 @@ cs: conversations_count: Conversations count avg_first_response_time: Prům. doba první odpovědi (minuty) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Prům. doba první odpovědi (minuty) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Prům. doba první odpovědi (minuty) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/da.yml b/config/locales/da.yml index 34e42b394..ce6b0479e 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -39,6 +39,17 @@ da: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/de.yml b/config/locales/de.yml index 82354838b..ecda08060 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -39,6 +39,17 @@ de: conversations_count: Anzahl Gespräche avg_first_response_time: Durchschnittliche Reaktionszeit (Minuten) avg_resolution_time: Durchschnittliche Auflösungszeit (Minuten) + inbox_csv: + inbox_name: Posteingangsname + inbox_type: Posteingangstyp + conversations_count: Anzahl der Konversationen + avg_first_response_time: Durchschnittliche Reaktionszeit (Minuten) + avg_resolution_time: Durchschnittliche Auflösungszeit (Minuten) + label_csv: + label_title: Label + conversations_count: Anzahl der Konversationen + avg_first_response_time: Durchschnittliche Reaktionszeit (Minuten) + avg_resolution_time: Durchschnittliche Auflösungszeit (Minuten) team_csv: team_name: Teamname conversations_count: Anzahl Gespräche diff --git a/config/locales/el.yml b/config/locales/el.yml index e7f9d219b..456731e7c 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -39,6 +39,17 @@ el: conversations_count: Αριθμός συνομιλιών avg_first_response_time: Μέσος χρόνος πρώτης ανταπόκρισης (λεπτά) avg_resolution_time: Μέσος χρόνος επίλυσης (λεπτά) + inbox_csv: + inbox_name: Όνομα Κιβωτίου + inbox_type: Τύπος κιβωτίου εισερχόμενων + conversations_count: Αριθμός συνομιλιών + avg_first_response_time: Μέσος χρόνος πρώτης ανταπόκρισης (λεπτά) + avg_resolution_time: Μέσος χρόνος επίλυσης (λεπτά) + label_csv: + label_title: Ετικέτα + conversations_count: Αριθμός συνομιλιών + avg_first_response_time: Μέσος χρόνος πρώτης ανταπόκρισης (λεπτά) + avg_resolution_time: Μέσος χρόνος επίλυσης (λεπτά) team_csv: team_name: Όνομα ομάδας conversations_count: Αριθμός συνομιλιών diff --git a/config/locales/es.yml b/config/locales/es.yml index 9ae7f5ab0..680eb5da7 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -39,6 +39,17 @@ es: conversations_count: Cantidad de conversaciones avg_first_response_time: Promedio de tiempo de la primera respuesta (Minutos) avg_resolution_time: Promedio de tiempo de resolución (Minutos) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Promedio de tiempo de la primera respuesta (Minutos) + avg_resolution_time: Promedio de tiempo de resolución (Minutos) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Promedio de tiempo de la primera respuesta (Minutos) + avg_resolution_time: Promedio de tiempo de resolución (Minutos) team_csv: team_name: Nombre del equipo conversations_count: Cantidad de conversaciones diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 94d15d78a..cdf50fedc 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -39,6 +39,17 @@ fa: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: نام صندوق ورودی + inbox_type: نوع صندوق ورودی + conversations_count: تعداد گفتگوها + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: برچسب + conversations_count: تعداد گفتگوها + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: نام تیم conversations_count: Conversations count diff --git a/config/locales/fi.yml b/config/locales/fi.yml index abc42d30c..8331ee75a 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -39,6 +39,17 @@ fi: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/fr.yml b/config/locales/fr.yml index f24823871..e9eddddbc 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -39,6 +39,17 @@ fr: conversations_count: Nombre de conversations avg_first_response_time: Temps de réponse moyen (Minutes) avg_resolution_time: Temps moyen de résolution (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Temps de réponse moyen (Minutes) + avg_resolution_time: Temps moyen de résolution (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Temps de réponse moyen (Minutes) + avg_resolution_time: Temps moyen de résolution (Minutes) team_csv: team_name: Nom de l'équipe conversations_count: Nombre de conversations diff --git a/config/locales/he.yml b/config/locales/he.yml index 7013aeec9..7a3cca980 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -39,6 +39,17 @@ he: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/hi.yml b/config/locales/hi.yml index fe9e0e127..eeeccb9f2 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -39,6 +39,17 @@ hi: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 03949320d..7d401d86f 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -39,6 +39,17 @@ hu: conversations_count: Beszélgetésszám avg_first_response_time: Átlagos első reakcióidő (perc) avg_resolution_time: Átlagos megoldási idő (perc) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Átlagos első reakcióidő (perc) + avg_resolution_time: Átlagos megoldási idő (perc) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Átlagos első reakcióidő (perc) + avg_resolution_time: Átlagos megoldási idő (perc) team_csv: team_name: Csapatnév conversations_count: Beszélgetésszám diff --git a/config/locales/id.yml b/config/locales/id.yml index 598a2952f..ab38f992f 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -39,6 +39,17 @@ id: conversations_count: Jumlah percakapan avg_first_response_time: Rata-rata waktu respons pertama (Menit) avg_resolution_time: Rata-rata waktu resolusi (Menit) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Rata-rata waktu respons pertama (Menit) + avg_resolution_time: Rata-rata waktu resolusi (Menit) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Rata-rata waktu respons pertama (Menit) + avg_resolution_time: Rata-rata waktu resolusi (Menit) team_csv: team_name: Nama Tim conversations_count: Jumlah percakapan diff --git a/config/locales/it.yml b/config/locales/it.yml index 1d8d6c444..97dfb0ffb 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -39,6 +39,17 @@ it: conversations_count: Numero di conversazioni avg_first_response_time: Tempo medio di prima risposta (minuti) avg_resolution_time: Tempo medio di risoluzione (minuti) + inbox_csv: + inbox_name: Nome casella + inbox_type: Tipo casella + conversations_count: Numero di conversazioni + avg_first_response_time: Tempo medio di prima risposta (minuti) + avg_resolution_time: Tempo medio di risoluzione (minuti) + label_csv: + label_title: Etichetta + conversations_count: Numero di conversazioni + avg_first_response_time: Tempo medio di prima risposta (minuti) + avg_resolution_time: Tempo medio di risoluzione (minuti) team_csv: team_name: Nome del team conversations_count: Numero di conversazioni diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 50f1afb0e..51ec1b922 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -39,6 +39,17 @@ ja: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/ko.yml b/config/locales/ko.yml index a9032f824..2a5eea72c 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -39,6 +39,17 @@ ko: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 6ed29e8f7..cf12dc0eb 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -39,6 +39,17 @@ lv: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/ml.yml b/config/locales/ml.yml index 7c80c69f4..0896849fb 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -39,6 +39,17 @@ ml: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: ടീമിന്റെ പേര് conversations_count: സംഭാഷണങ്ങളുടെ എണ്ണം diff --git a/config/locales/ne.yml b/config/locales/ne.yml index 15f26703f..f0edba6a8 100644 --- a/config/locales/ne.yml +++ b/config/locales/ne.yml @@ -39,6 +39,17 @@ ne: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/nl.yml b/config/locales/nl.yml index ed10eba6c..7780f960c 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -39,6 +39,17 @@ nl: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/no.yml b/config/locales/no.yml index f134f24af..e5b592df0 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -39,6 +39,17 @@ conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/pl.yml b/config/locales/pl.yml index cf3676f1e..ec1773e9a 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -39,6 +39,17 @@ pl: conversations_count: Liczba rozmów avg_first_response_time: Średni czas pierwszej odpowiedzi (minuty) avg_resolution_time: Średni czas do rozwiązania problemu (minuty) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Średni czas pierwszej odpowiedzi (minuty) + avg_resolution_time: Średni czas do rozwiązania problemu (minuty) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Średni czas pierwszej odpowiedzi (minuty) + avg_resolution_time: Średni czas do rozwiązania problemu (minuty) team_csv: team_name: Nazwa zespołu conversations_count: Liczba rozmów diff --git a/config/locales/pt.yml b/config/locales/pt.yml index c8a310aff..86890ee02 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -39,6 +39,17 @@ pt: conversations_count: Número de conversas avg_first_response_time: Média do tempo de resposta (minutos) avg_resolution_time: Média do tempo de resolução (minutos) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Média do tempo de resposta (minutos) + avg_resolution_time: Média do tempo de resolução (minutos) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Média do tempo de resposta (minutos) + avg_resolution_time: Média do tempo de resolução (minutos) team_csv: team_name: Nome da equipa conversations_count: Número de conversas diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml index c8fb9090b..a7e0425cd 100644 --- a/config/locales/pt_BR.yml +++ b/config/locales/pt_BR.yml @@ -39,6 +39,17 @@ pt_BR: conversations_count: Contagem de conversas avg_first_response_time: Tempo médio de primeira resposta (minutos) avg_resolution_time: Tempo médio de resolução (minutos) + inbox_csv: + inbox_name: Nome da Caixa de Entrada + inbox_type: Tipo da Caixa de Entrada + conversations_count: Nº de Conversas + avg_first_response_time: Média de tempo da primeira resposta (minutos) + avg_resolution_time: Tempo médio de resolução (minutos) + label_csv: + label_title: Nome do campo + conversations_count: Nº de Conversas + avg_first_response_time: Tempo médio de primeira resposta (minutos) + avg_resolution_time: Tempo médio de resolução (minutos) team_csv: team_name: Nome do departamento conversations_count: Contagem de conversas diff --git a/config/locales/ro.yml b/config/locales/ro.yml index adcad7a68..0ac716b04 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -39,6 +39,17 @@ ro: conversations_count: Conversațiile contează avg_first_response_time: Avg primul timp de răspuns (minute) avg_resolution_time: Timp de rezoluție AVG (proces-verbal) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg primul timp de răspuns (minute) + avg_resolution_time: Timp de rezoluție AVG (proces-verbal) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg primul timp de răspuns (minute) + avg_resolution_time: Timp de rezoluție AVG (proces-verbal) team_csv: team_name: Numele echipei conversations_count: Conversațiile contează diff --git a/config/locales/ru.yml b/config/locales/ru.yml index ce5ae1d54..47ded8644 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -39,6 +39,17 @@ ru: conversations_count: Количество бесед avg_first_response_time: Среднее время первого ответа (в минутах) avg_resolution_time: Среднее время решения (в минутах) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Среднее время первого ответа (в минутах) + avg_resolution_time: Среднее время решения (в минутах) + label_csv: + label_title: Метка + conversations_count: No. of conversations + avg_first_response_time: Среднее время первого ответа (в минутах) + avg_resolution_time: Среднее время решения (в минутах) team_csv: team_name: Название команды conversations_count: Количество бесед diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 02406b0b3..8a592a040 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -39,6 +39,17 @@ sk: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Názov tímu conversations_count: Conversations count diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 04ab3bf57..9bbea927b 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -39,6 +39,17 @@ sr-Latn: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/sv.yml b/config/locales/sv.yml index ef685a384..930b481d1 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -39,6 +39,17 @@ sv: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/ta.yml b/config/locales/ta.yml index e8c2d09c5..e1a340b5a 100644 --- a/config/locales/ta.yml +++ b/config/locales/ta.yml @@ -39,6 +39,17 @@ ta: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/th.yml b/config/locales/th.yml index 4290ff009..211e3392f 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -39,6 +39,17 @@ th: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: ป้ายกำกับ + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: ชื่อทีม conversations_count: Conversations count diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 3a79c0791..5470142ab 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -39,6 +39,17 @@ tr: conversations_count: Konuşma sayısı avg_first_response_time: Ortalama cevap süresi(dakika) avg_resolution_time: Ortalama çözüm üretme süresi(dakika) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Ortalama cevap süresi(dakika) + avg_resolution_time: Ortalama çözüm üretme süresi(dakika) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Ortalama cevap süresi(dakika) + avg_resolution_time: Ortalama çözüm üretme süresi(dakika) team_csv: team_name: Ekip İsmi conversations_count: Konuşma sayısı diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 956eb0a9b..bd7b9718e 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -39,6 +39,17 @@ uk: conversations_count: Кількість бесід avg_first_response_time: Середній час першої відповіді (Хвилин) avg_resolution_time: Середній час вирішення (Хвилин) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Середній час першої відповіді (Хвилин) + avg_resolution_time: Середній час вирішення (Хвилин) + label_csv: + label_title: Мітка + conversations_count: No. of conversations + avg_first_response_time: Середній час першої відповіді (Хвилин) + avg_resolution_time: Середній час вирішення (Хвилин) team_csv: team_name: Назва команди conversations_count: Кількість бесід diff --git a/config/locales/ur.yml b/config/locales/ur.yml index 633be0001..a14706483 100644 --- a/config/locales/ur.yml +++ b/config/locales/ur.yml @@ -39,6 +39,17 @@ ur: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/ur_IN.yml b/config/locales/ur_IN.yml index 6887bb4b9..0f05aec46 100644 --- a/config/locales/ur_IN.yml +++ b/config/locales/ur_IN.yml @@ -39,6 +39,17 @@ ur: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/vi.yml b/config/locales/vi.yml index e82342c64..f1e0faca3 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -39,6 +39,17 @@ vi: conversations_count: Số cuộc trò chuyện avg_first_response_time: Thời gian trung bình của phản hồi đầu tiên (phút) avg_resolution_time: Thời gian giải quyết trung bình (phút) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Thời gian trung bình của phản hồi đầu tiên (phút) + avg_resolution_time: Thời gian giải quyết trung bình (phút) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Thời gian trung bình của phản hồi đầu tiên (phút) + avg_resolution_time: Thời gian giải quyết trung bình (phút) team_csv: team_name: Tên nhóm conversations_count: Số cuộc trò chuyện diff --git a/config/locales/zh_CN.yml b/config/locales/zh_CN.yml index 0c9f79573..0bc5acad0 100644 --- a/config/locales/zh_CN.yml +++ b/config/locales/zh_CN.yml @@ -39,6 +39,17 @@ zh_CN: conversations_count: Conversations count avg_first_response_time: Avg first response time (Minutes) avg_resolution_time: Avg resolution time (Minutes) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: Avg first response time (Minutes) + avg_resolution_time: Avg resolution time (Minutes) team_csv: team_name: Team name conversations_count: Conversations count diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml index e8cde15fd..b76b65e0a 100644 --- a/config/locales/zh_TW.yml +++ b/config/locales/zh_TW.yml @@ -39,6 +39,17 @@ zh_TW: conversations_count: 對話數量 avg_first_response_time: 平均第一次回覆時間(分鐘) avg_resolution_time: 平均解決時間(分鐘) + inbox_csv: + inbox_name: Inbox name + inbox_type: Inbox type + conversations_count: No. of conversations + avg_first_response_time: 平均第一次回覆時間(分鐘) + avg_resolution_time: 平均解決時間(分鐘) + label_csv: + label_title: Label + conversations_count: No. of conversations + avg_first_response_time: 平均第一次回覆時間(分鐘) + avg_resolution_time: 平均解決時間(分鐘) team_csv: team_name: 團隊名稱 conversations_count: 對話數量 From 3f382e5979d508fbd6d9f153b37433c7fe6f0cbe Mon Sep 17 00:00:00 2001 From: Fayaz Ahmed <15716057+fayazara@users.noreply.github.com> Date: Tue, 31 May 2022 16:38:24 +0530 Subject: [PATCH 35/39] Handle falsy values for filename (#4766) --- .../components/widgets/conversation/bubble/File.vue | 7 +++++-- app/javascript/dashboard/i18n/locale/en/conversation.json | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/javascript/dashboard/components/widgets/conversation/bubble/File.vue b/app/javascript/dashboard/components/widgets/conversation/bubble/File.vue index a8f2993d3..5861e0df1 100644 --- a/app/javascript/dashboard/components/widgets/conversation/bubble/File.vue +++ b/app/javascript/dashboard/components/widgets/conversation/bubble/File.vue @@ -29,8 +29,11 @@ export default { }, computed: { fileName() { - const filename = this.url.substring(this.url.lastIndexOf('/') + 1); - return filename; + if (this.url) { + const filename = this.url.substring(this.url.lastIndexOf('/') + 1); + return filename || this.$t('CONVERSATION.UNKNOWN_FILE_TYPE'); + } + return this.$t('CONVERSATION.UNKNOWN_FILE_TYPE'); }, }, methods: { diff --git a/app/javascript/dashboard/i18n/locale/en/conversation.json b/app/javascript/dashboard/i18n/locale/en/conversation.json index ac25a5aed..e545ce0d2 100644 --- a/app/javascript/dashboard/i18n/locale/en/conversation.json +++ b/app/javascript/dashboard/i18n/locale/en/conversation.json @@ -30,6 +30,7 @@ "REPLYING_TO": "You are replying to:", "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Download", + "UNKNOWN_FILE_TYPE": "Unknown File", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", From 55f7be4ffc429aadefb0b814636a0023456e00f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jun 2022 10:57:18 +0530 Subject: [PATCH 36/39] chore(deps): bump eventsource from 1.1.0 to 1.1.1 (#4774) Bumps [eventsource](https://github.com/EventSource/eventsource) from 1.1.0 to 1.1.1. - [Release notes](https://github.com/EventSource/eventsource/releases) - [Changelog](https://github.com/EventSource/eventsource/blob/master/HISTORY.md) - [Commits](https://github.com/EventSource/eventsource/compare/v1.1.0...v1.1.1) --- updated-dependencies: - dependency-name: eventsource dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index bd138a972..a4e62441d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6563,9 +6563,9 @@ events@^3.0.0: integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== eventsource@^1.0.7: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" - integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.1.tgz#4544a35a57d7120fba4fa4c86cb4023b2c09df2f" + integrity sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA== dependencies: original "^1.0.0" From b9aa4444b3ed87026cd060e9a062ba80e7373afa Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Wed, 1 Jun 2022 11:13:10 +0530 Subject: [PATCH 37/39] feat: Allow users to create dashboard apps to give agents more context (#4761) --- .../v1/accounts/dashboard_apps_controller.rb | 44 +++++ app/javascript/dashboard/api/dashboardApps.js | 9 + .../dashboard/api/specs/dashboardApps.spec.js | 13 ++ .../components/widgets/DashboardApp/Frame.vue | 64 +++++++ .../widgets/conversation/ConversationBox.vue | 57 ++++++- .../i18n/locale/en/conversation.json | 1 + app/javascript/dashboard/store/index.js | 14 +- .../dashboard/store/modules/dashboardApps.js | 54 ++++++ .../specs/dashboardApps/actions.spec.js | 21 +++ .../specs/dashboardApps/getters.spec.js | 29 ++++ .../specs/dashboardApps/mutations.spec.js | 20 +++ .../dashboard/store/mutation-types.js | 4 + .../widget/store/modules/contacts.js | 5 +- app/models/account.rb | 13 +- app/models/dashboard_app.rb | 49 ++++++ app/models/user.rb | 3 +- .../dashboard_apps/create.json.jbuilder | 1 + .../dashboard_apps/index.json.jbuilder | 3 + .../dashboard_apps/show.json.jbuilder | 1 + .../dashboard_apps/update.json.jbuilder | 1 + .../v1/models/_dashboard_app.json.jbuilder | 4 + config/routes.rb | 2 +- .../20220525141844_create_dashboard_apps.rb | 11 ++ db/schema.rb | 15 +- .../dashboard_apps_controller_spec.rb | 158 ++++++++++++++++++ spec/factories/dashboard_app.rb | 10 ++ 26 files changed, 585 insertions(+), 21 deletions(-) create mode 100644 app/controllers/api/v1/accounts/dashboard_apps_controller.rb create mode 100644 app/javascript/dashboard/api/dashboardApps.js create mode 100644 app/javascript/dashboard/api/specs/dashboardApps.spec.js create mode 100644 app/javascript/dashboard/components/widgets/DashboardApp/Frame.vue create mode 100644 app/javascript/dashboard/store/modules/dashboardApps.js create mode 100644 app/javascript/dashboard/store/modules/specs/dashboardApps/actions.spec.js create mode 100644 app/javascript/dashboard/store/modules/specs/dashboardApps/getters.spec.js create mode 100644 app/javascript/dashboard/store/modules/specs/dashboardApps/mutations.spec.js create mode 100644 app/models/dashboard_app.rb create mode 100644 app/views/api/v1/accounts/dashboard_apps/create.json.jbuilder create mode 100644 app/views/api/v1/accounts/dashboard_apps/index.json.jbuilder create mode 100644 app/views/api/v1/accounts/dashboard_apps/show.json.jbuilder create mode 100644 app/views/api/v1/accounts/dashboard_apps/update.json.jbuilder create mode 100644 app/views/api/v1/models/_dashboard_app.json.jbuilder create mode 100644 db/migrate/20220525141844_create_dashboard_apps.rb create mode 100644 spec/controllers/api/v1/accounts/dashboard_apps_controller_spec.rb create mode 100644 spec/factories/dashboard_app.rb diff --git a/app/controllers/api/v1/accounts/dashboard_apps_controller.rb b/app/controllers/api/v1/accounts/dashboard_apps_controller.rb new file mode 100644 index 000000000..a8d7ebcb9 --- /dev/null +++ b/app/controllers/api/v1/accounts/dashboard_apps_controller.rb @@ -0,0 +1,44 @@ +class Api::V1::Accounts::DashboardAppsController < Api::V1::Accounts::BaseController + before_action :fetch_dashboard_apps, except: [:create] + before_action :fetch_dashboard_app, only: [:show, :update, :destroy] + + def index; end + + def show; end + + def create + @dashboard_app = Current.account.dashboard_apps.create!( + permitted_payload.merge(user_id: Current.user.id) + ) + end + + def update + @dashboard_app.update!(permitted_payload) + end + + def destroy + @dashboard_app.destroy! + head :no_content + end + + private + + def fetch_dashboard_apps + @dashboard_apps = Current.account.dashboard_apps + end + + def fetch_dashboard_app + @dashboard_app = @dashboard_apps.find(permitted_params[:id]) + end + + def permitted_payload + params.require(:dashboard_app).permit( + :title, + content: [:url, :type] + ) + end + + def permitted_params + params.permit(:id) + end +end diff --git a/app/javascript/dashboard/api/dashboardApps.js b/app/javascript/dashboard/api/dashboardApps.js new file mode 100644 index 000000000..b22ab698e --- /dev/null +++ b/app/javascript/dashboard/api/dashboardApps.js @@ -0,0 +1,9 @@ +import ApiClient from './ApiClient'; + +class DashboardAppsAPI extends ApiClient { + constructor() { + super('dashboard_apps', { accountScoped: true }); + } +} + +export default new DashboardAppsAPI(); diff --git a/app/javascript/dashboard/api/specs/dashboardApps.spec.js b/app/javascript/dashboard/api/specs/dashboardApps.spec.js new file mode 100644 index 000000000..f3196ae2a --- /dev/null +++ b/app/javascript/dashboard/api/specs/dashboardApps.spec.js @@ -0,0 +1,13 @@ +import dashboardAppsAPI from '../dashboardApps'; +import ApiClient from '../ApiClient'; + +describe('#dashboardAppsAPI', () => { + it('creates correct instance', () => { + expect(dashboardAppsAPI).toBeInstanceOf(ApiClient); + expect(dashboardAppsAPI).toHaveProperty('get'); + expect(dashboardAppsAPI).toHaveProperty('show'); + expect(dashboardAppsAPI).toHaveProperty('create'); + expect(dashboardAppsAPI).toHaveProperty('update'); + expect(dashboardAppsAPI).toHaveProperty('delete'); + }); +}); diff --git a/app/javascript/dashboard/components/widgets/DashboardApp/Frame.vue b/app/javascript/dashboard/components/widgets/DashboardApp/Frame.vue new file mode 100644 index 000000000..0c2c0e8ed --- /dev/null +++ b/app/javascript/dashboard/components/widgets/DashboardApp/Frame.vue @@ -0,0 +1,64 @@ +