From 6cdefb19a2993889c6f3a77949d9e2850b7be5db Mon Sep 17 00:00:00 2001 From: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com> Date: Fri, 18 Jun 2021 14:29:43 +0530 Subject: [PATCH 01/69] chore: Add multiselect support in stories (#2427) --- .storybook/preview.js | 2 ++ .../assets/scss/plugins/_multiselect.scss | 20 +++++++++++++++++-- .../dashboard/assets/scss/storybook.scss | 3 +++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.storybook/preview.js b/.storybook/preview.js index c62c3ef00..e0c27a1ac 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -3,6 +3,7 @@ import Vue from 'vue'; import Vuex from 'vuex'; import VueI18n from 'vue-i18n'; import Vuelidate from 'vuelidate'; +import Multiselect from 'vue-multiselect'; import WootUiKit from '../app/javascript/dashboard/components'; import i18n from '../app/javascript/dashboard/i18n'; @@ -13,6 +14,7 @@ Vue.use(VueI18n); Vue.use(Vuelidate); Vue.use(WootUiKit); Vue.use(Vuex); +Vue.component('multiselect', Multiselect); const store = new Vuex.Store({}); const i18nConfig = new VueI18n({ diff --git a/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss b/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss index 1e4d9c733..51309625a 100644 --- a/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss +++ b/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss @@ -137,6 +137,7 @@ } .sidebar-labels-wrap { + &.has-edited, &:hover { .multiselect { @@ -162,6 +163,12 @@ .multiselect-wrap--small { $multiselect-height: 3.8rem; + .multiselect__tags, + .multiselect__input { + align-items: center; + display: flex; + } + .multiselect__tags, .multiselect__input, .multiselect { @@ -177,15 +184,24 @@ } .multiselect__single { + align-items: center; + display: flex; font-size: var(--font-size-small); - padding: var(--space-small) 0; + margin: 0; + padding: var(--space-smaller) var(--space-micro); } .multiselect__placeholder { - padding: var(--space-small) 0; + margin: 0; + padding: var(--space-smaller) var(--space-micro); } .multiselect__select { min-height: $multiselect-height; } + + .multiselect--disabled .multiselect__current, + .multiselect--disabled .multiselect__select { + background: transparent; + } } diff --git a/app/javascript/dashboard/assets/scss/storybook.scss b/app/javascript/dashboard/assets/scss/storybook.scss index f6a9d5eb3..2364c3d5b 100644 --- a/app/javascript/dashboard/assets/scss/storybook.scss +++ b/app/javascript/dashboard/assets/scss/storybook.scss @@ -8,6 +8,7 @@ @import 'variables'; @import '~spinkit/scss/spinners/7-three-bounce'; +@import '~vue-multiselect/dist/vue-multiselect.min.css'; @import '~shared/assets/stylesheets/ionicons'; @import 'mixins'; @@ -27,3 +28,5 @@ @import 'foundation-custom'; @import 'widgets/buttons'; @import 'widgets/forms'; + +@import 'plugins/multiselect'; From 50e4bb3e639449a61b0b4102a792b27f0025dbcb Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Fri, 18 Jun 2021 15:55:48 +0530 Subject: [PATCH 02/69] chore: Add CSAT survey toggle attribute to Inboxes (#2455) ref: #1890 --- app/models/inbox.rb | 1 + db/migrate/20210618095823_add_csat_toggle_for_inbox.rb | 5 +++++ db/schema.rb | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20210618095823_add_csat_toggle_for_inbox.rb diff --git a/app/models/inbox.rb b/app/models/inbox.rb index e331901cb..15e21e150 100644 --- a/app/models/inbox.rb +++ b/app/models/inbox.rb @@ -6,6 +6,7 @@ # # id :integer not null, primary key # channel_type :string +# csat_survey_enabled :boolean default(FALSE) # email_address :string # enable_auto_assignment :boolean default(TRUE) # enable_email_collect :boolean default(TRUE) diff --git a/db/migrate/20210618095823_add_csat_toggle_for_inbox.rb b/db/migrate/20210618095823_add_csat_toggle_for_inbox.rb new file mode 100644 index 000000000..bcdfd839c --- /dev/null +++ b/db/migrate/20210618095823_add_csat_toggle_for_inbox.rb @@ -0,0 +1,5 @@ +class AddCsatToggleForInbox < ActiveRecord::Migration[6.0] + def change + add_column :inboxes, :csat_survey_enabled, :boolean, default: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 4edb50157..1e22906be 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: 2021_06_09_133433) do +ActiveRecord::Schema.define(version: 2021_06_18_095823) do # These are extensions that must be enabled in order to support this database enable_extension "pg_stat_statements" @@ -329,6 +329,7 @@ ActiveRecord::Schema.define(version: 2021_06_09_133433) do t.string "out_of_office_message" t.string "timezone", default: "UTC" t.boolean "enable_email_collect", default: true + t.boolean "csat_survey_enabled", default: false t.index ["account_id"], name: "index_inboxes_on_account_id" end From 6c49e58ff870a5e599563a0a8fc9f3251578d6c5 Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Fri, 18 Jun 2021 20:08:58 +0530 Subject: [PATCH 03/69] feat: Add contact label filter (#2454) Co-authored-by: Sojan Jose --- .../api/v1/accounts/contacts_controller.rb | 17 ++++--- app/javascript/dashboard/api/contacts.js | 33 ++++++++++--- .../dashboard/api/specs/contacts.spec.js | 22 +++++++-- .../dashboard/components/layout/Sidebar.vue | 46 +++++++++++++++++++ .../components/layout/SidebarItem.vue | 22 +-------- .../dashboard/i18n/default-sidebar.js | 25 +++++++++- .../dashboard/i18n/locale/en/contact.json | 1 + .../dashboard/i18n/locale/en/settings.json | 4 +- .../contacts/components/ContactsTable.vue | 4 ++ .../contacts/components/ContactsView.vue | 15 +++++- .../dashboard/contacts/components/Header.vue | 6 ++- .../routes/dashboard/contacts/routes.js | 9 ++++ .../labels/specs/validationMixin.spec.js | 20 ++++---- .../settings/labels/validationMixin.js | 19 ++++---- .../store/modules/contacts/actions.js | 8 ++-- lib/redis/config.rb | 4 +- .../v1/accounts/contacts_controller_spec.rb | 16 +++++++ 17 files changed, 201 insertions(+), 70 deletions(-) diff --git a/app/controllers/api/v1/accounts/contacts_controller.rb b/app/controllers/api/v1/accounts/contacts_controller.rb index 46f6b83c7..3e7b50bc2 100644 --- a/app/controllers/api/v1/accounts/contacts_controller.rb +++ b/app/controllers/api/v1/accounts/contacts_controller.rb @@ -15,7 +15,7 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController def index @contacts_count = resolved_contacts.count - @contacts = fetch_contact_last_seen_at(resolved_contacts) + @contacts = fetch_contacts_with_conversation_count(resolved_contacts) end def search @@ -26,7 +26,7 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController search: "%#{params[:q]}%" ) @contacts_count = contacts.count - @contacts = fetch_contact_last_seen_at(contacts) + @contacts = fetch_contacts_with_conversation_count(contacts) end def import @@ -72,17 +72,22 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController private + # TODO: Move this to a finder class def resolved_contacts - @resolved_contacts ||= Current.account.contacts - .where.not(email: [nil, '']) - .or(Current.account.contacts.where.not(phone_number: [nil, ''])) + return @resolved_contacts if @resolved_contacts + + @resolved_contacts = Current.account.contacts + .where.not(email: [nil, '']) + .or(Current.account.contacts.where.not(phone_number: [nil, ''])) + @resolved_contacts = @resolved_contacts.tagged_with(params[:labels], any: true) if params[:labels].present? + @resolved_contacts end def set_current_page @current_page = params[:page] || 1 end - def fetch_contact_last_seen_at(contacts) + def fetch_contacts_with_conversation_count(contacts) filtrate(contacts).left_outer_joins(:conversations) .select('contacts.*, COUNT(conversations.id) as conversations_count') .group('contacts.id') diff --git a/app/javascript/dashboard/api/contacts.js b/app/javascript/dashboard/api/contacts.js index cc8448873..443a5b8dd 100644 --- a/app/javascript/dashboard/api/contacts.js +++ b/app/javascript/dashboard/api/contacts.js @@ -1,13 +1,30 @@ /* global axios */ import ApiClient from './ApiClient'; +export const buildContactParams = (page, sortAttr, label, search) => { + let params = `page=${page}&sort=${sortAttr}`; + if (search) { + params = `${params}&q=${search}`; + } + if (label) { + params = `${params}&labels[]=${label}`; + } + return params; +}; + class ContactAPI extends ApiClient { constructor() { super('contacts', { accountScoped: true }); } - get(page, sortAttr = 'name') { - return axios.get(`${this.url}?page=${page}&sort=${sortAttr}`); + get(page, sortAttr = 'name', label = '') { + let requestURL = `${this.url}?${buildContactParams( + page, + sortAttr, + label, + '' + )}`; + return axios.get(requestURL); } getConversations(contactId) { @@ -26,10 +43,14 @@ class ContactAPI extends ApiClient { return axios.post(`${this.url}/${contactId}/labels`, { labels }); } - search(search = '', page = 1, sortAttr = 'name') { - return axios.get( - `${this.url}/search?q=${search}&page=${page}&sort=${sortAttr}` - ); + search(search = '', page = 1, sortAttr = 'name', label = '') { + let requestURL = `${this.url}/search?${buildContactParams( + page, + sortAttr, + label, + search + )}`; + return axios.get(requestURL); } } diff --git a/app/javascript/dashboard/api/specs/contacts.spec.js b/app/javascript/dashboard/api/specs/contacts.spec.js index a7080a634..08f6ace03 100644 --- a/app/javascript/dashboard/api/specs/contacts.spec.js +++ b/app/javascript/dashboard/api/specs/contacts.spec.js @@ -1,4 +1,4 @@ -import contactAPI from '../contacts'; +import contactAPI, { buildContactParams } from '../contacts'; import ApiClient from '../ApiClient'; import describeWithAPIMock from './apiSpecHelper'; @@ -15,9 +15,9 @@ describe('#ContactsAPI', () => { describeWithAPIMock('API calls', context => { it('#get', () => { - contactAPI.get(1, 'name'); + contactAPI.get(1, 'name', 'customer-support'); expect(context.axiosMock.get).toHaveBeenCalledWith( - '/api/v1/contacts?page=1&sort=name' + '/api/v1/contacts?page=1&sort=name&labels[]=customer-support' ); }); @@ -54,10 +54,22 @@ describe('#ContactsAPI', () => { }); it('#search', () => { - contactAPI.search('leads', 1, 'date'); + contactAPI.search('leads', 1, 'date', 'customer-support'); expect(context.axiosMock.get).toHaveBeenCalledWith( - '/api/v1/contacts/search?q=leads&page=1&sort=date' + '/api/v1/contacts/search?page=1&sort=date&q=leads&labels[]=customer-support' ); }); }); }); + +describe('#buildContactParams', () => { + it('returns correct string', () => { + expect(buildContactParams(1, 'name', '', '')).toBe('page=1&sort=name'); + expect(buildContactParams(1, 'name', 'customer-support', '')).toBe( + 'page=1&sort=name&labels[]=customer-support' + ); + expect( + buildContactParams(1, 'name', 'customer-support', 'message-content') + ).toBe('page=1&sort=name&q=message-content&labels[]=customer-support'); + }); +}); diff --git a/app/javascript/dashboard/components/layout/Sidebar.vue b/app/javascript/dashboard/components/layout/Sidebar.vue index 996494789..61405f6cd 100644 --- a/app/javascript/dashboard/components/layout/Sidebar.vue +++ b/app/javascript/dashboard/components/layout/Sidebar.vue @@ -27,6 +27,13 @@ v-if="shouldShowSidebarItem" :key="labelSection.toState" :menu-item="labelSection" + @add-label="showAddLabelPopup" + /> + @@ -57,6 +64,10 @@ :show="showCreateAccountModal" @close-account-create-modal="closeCreateAccountModal" /> + + + + @@ -74,6 +85,7 @@ import AgentDetails from './sidebarComponents/AgentDetails.vue'; import OptionsMenu from './sidebarComponents/OptionsMenu.vue'; import AccountSelector from './sidebarComponents/AccountSelector.vue'; import AddAccountModal from './sidebarComponents/AddAccountModal.vue'; +import AddLabelModal from '../../routes/dashboard/settings/labels/AddLabel'; export default { components: { @@ -84,6 +96,7 @@ export default { OptionsMenu, AccountSelector, AddAccountModal, + AddLabelModal, }, mixins: [adminMixin, alertMixin], data() { @@ -91,6 +104,7 @@ export default { showOptionsMenu: false, showAccountModal: false, showCreateAccountModal: false, + showAddLabelModal: false, }; }, @@ -131,6 +145,9 @@ export default { shouldShowSidebarItem() { return this.sidemenuItems.common.routes.includes(this.currentRoute); }, + showShowContactSideMenu() { + return this.sidemenuItems.contacts.routes.includes(this.currentRoute); + }, shouldShowTeams() { return this.shouldShowSidebarItem && this.teams.length; }, @@ -177,6 +194,29 @@ export default { })), }; }, + contactLabelSection() { + return { + icon: 'ion-pound', + label: 'TAGGED_WITH', + hasSubMenu: true, + key: 'label', + newLink: false, + cssClass: 'menu-title align-justify', + toState: frontendURL(`accounts/${this.accountId}/settings/labels`), + toStateName: 'labels_list', + showModalForNewItem: true, + modalName: 'AddLabel', + children: this.accountLabels.map(label => ({ + id: label.id, + label: label.title, + color: label.color, + truncateLabel: true, + toState: frontendURL( + `accounts/${this.accountId}/labels/${label.title}/contacts` + ), + })), + }; + }, teamSection() { return { icon: 'ion-ios-people', @@ -253,6 +293,12 @@ export default { closeCreateAccountModal() { this.showCreateAccountModal = false; }, + showAddLabelPopup() { + this.showAddLabelModal = true; + }, + hideAddLabelPopup() { + this.showAddLabelModal = false; + }, }, }; diff --git a/app/javascript/dashboard/components/layout/SidebarItem.vue b/app/javascript/dashboard/components/layout/SidebarItem.vue index 810155bef..bd4a00487 100644 --- a/app/javascript/dashboard/components/layout/SidebarItem.vue +++ b/app/javascript/dashboard/components/layout/SidebarItem.vue @@ -52,11 +52,6 @@ - @@ -66,17 +61,8 @@ import { mapGetters } from 'vuex'; import router from '../../routes'; import adminMixin from '../../mixins/isAdmin'; import { getInboxClassByType } from 'dashboard/helper/inbox'; -import AddLabelModal from '../../routes/dashboard/settings/labels/AddLabel'; export default { - components: { - AddLabelModal, - }, mixins: [adminMixin], - data() { - return { - showAddLabel: false, - }; - }, props: { menuItem: { type: Object, @@ -127,19 +113,13 @@ export default { router.push({ name: item.newLinkRouteName, params: { page: 'new' } }); } else if (item.showModalForNewItem) { if (item.modalName === 'AddLabel') { - this.showAddLabelPopup(); + this.$emit('add-label'); } } }, showItem(item) { return this.isAdmin && item.newLink !== undefined; }, - showAddLabelPopup() { - this.showAddLabel = true; - }, - hideAddLabelPopup() { - this.showAddLabel = false; - }, }, }; diff --git a/app/javascript/dashboard/i18n/default-sidebar.js b/app/javascript/dashboard/i18n/default-sidebar.js index 8bb78f61b..e5c8b79c5 100644 --- a/app/javascript/dashboard/i18n/default-sidebar.js +++ b/app/javascript/dashboard/i18n/default-sidebar.js @@ -7,8 +7,6 @@ export const getSidebarItems = accountId => ({ 'inbox_dashboard', 'inbox_conversation', 'conversation_through_inbox', - 'contacts_dashboard', - 'contacts_dashboard_manage', 'notifications_dashboard', 'settings_account_reports', 'profile_settings', @@ -59,6 +57,29 @@ export const getSidebarItems = accountId => ({ }, }, }, + contacts: { + routes: [ + 'contacts_dashboard', + 'contacts_dashboard_manage', + 'contacts_labels_dashboard', + ], + menuItems: { + back: { + icon: 'ion-ios-arrow-back', + label: 'HOME', + hasSubMenu: false, + toStateName: 'home', + toState: frontendURL(`accounts/${accountId}/dashboard`), + }, + contacts: { + icon: 'ion-person', + label: 'ALL_CONTACTS', + hasSubMenu: false, + toState: frontendURL(`accounts/${accountId}/contacts`), + toStateName: 'contacts_dashboard', + }, + }, + }, settings: { routes: [ 'agent_list', diff --git a/app/javascript/dashboard/i18n/locale/en/contact.json b/app/javascript/dashboard/i18n/locale/en/contact.json index 84e6303fc..24bcbc27e 100644 --- a/app/javascript/dashboard/i18n/locale/en/contact.json +++ b/app/javascript/dashboard/i18n/locale/en/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Name", "PHONE_NUMBER": "Phone Number", diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json index c7bb0cb6d..509cc07f5 100644 --- a/app/javascript/dashboard/i18n/locale/en/settings.json +++ b/app/javascript/dashboard/i18n/locale/en/settings.json @@ -135,7 +135,9 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsTable.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsTable.vue index 67faaac22..6f83cf0bd 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsTable.vue +++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsTable.vue @@ -14,6 +14,10 @@ v-if="showSearchEmptyState" :title="$t('CONTACTS_PAGE.LIST.404')" /> +
{{ $t('CONTACTS_PAGE.LIST.LOADING_MESSAGE') }} diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue index 7874302ae..ada19502e 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue +++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue @@ -7,6 +7,7 @@ this-selected-contact-id="" :on-input-search="onInputSearch" :on-toggle-create="onToggleCreate" + :header-title="label" />

- {{ $t('CONTACTS_PAGE.HEADER') }} + {{ headerTitle ? `#${headerTitle}` : $t('CONTACTS_PAGE.HEADER') }}

@@ -42,6 +42,10 @@ export default { components: {}, props: { + headerTitle: { + type: String, + default: '', + }, searchQuery: { type: String, default: '', diff --git a/app/javascript/dashboard/routes/dashboard/contacts/routes.js b/app/javascript/dashboard/routes/dashboard/contacts/routes.js index f5ef5ad14..b8b129435 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/routes.js +++ b/app/javascript/dashboard/routes/dashboard/contacts/routes.js @@ -10,6 +10,15 @@ export const routes = [ roles: ['administrator', 'agent'], component: ContactsView, }, + { + path: frontendURL('accounts/:accountId/labels/:label/contacts'), + name: 'contacts_labels_dashboard', + roles: ['administrator', 'agent'], + component: ContactsView, + props: route => { + return { label: route.params.label }; + }, + }, { path: frontendURL('accounts/:accountId/contacts/:contactId'), name: 'contacts_dashboard_manage', diff --git a/app/javascript/dashboard/routes/dashboard/settings/labels/specs/validationMixin.spec.js b/app/javascript/dashboard/routes/dashboard/settings/labels/specs/validationMixin.spec.js index ee02f674e..8e1628bdb 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/labels/specs/validationMixin.spec.js +++ b/app/javascript/dashboard/routes/dashboard/settings/labels/specs/validationMixin.spec.js @@ -26,11 +26,10 @@ describe('validationMixin', () => { i18n: i18nConfig, localVue, data() { - return { - title: 'sales', - }; + return { title: 'sales' }; }, }); + wrapper.vm.$v.$touch(); expect(wrapper.vm.getLabelTitleErrorMessage).toBe(''); }); it('it should return label required error message if empty name is passed', async () => { @@ -38,11 +37,10 @@ describe('validationMixin', () => { i18n: i18nConfig, localVue, data() { - return { - title: '', - }; + return { title: '' }; }, }); + wrapper.vm.$v.$touch(); expect(wrapper.vm.getLabelTitleErrorMessage).toBe('Label name is required'); }); it('it should return label minimum length error message if one charceter label name is passed', async () => { @@ -50,11 +48,10 @@ describe('validationMixin', () => { i18n: i18nConfig, localVue, data() { - return { - title: 's', - }; + return { title: 's' }; }, }); + wrapper.vm.$v.$touch(); expect(wrapper.vm.getLabelTitleErrorMessage).toBe( 'Minimum length 2 is required' ); @@ -64,11 +61,10 @@ describe('validationMixin', () => { i18n: i18nConfig, localVue, data() { - return { - title: 'sales enquiry', - }; + return { title: 'sales enquiry' }; }, }); + wrapper.vm.$v.$touch(); expect(wrapper.vm.getLabelTitleErrorMessage).toBe( 'Only Alphabets, Numbers, Hyphen and Underscore are allowed' ); diff --git a/app/javascript/dashboard/routes/dashboard/settings/labels/validationMixin.js b/app/javascript/dashboard/routes/dashboard/settings/labels/validationMixin.js index ca2a0b777..9f11646a6 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/labels/validationMixin.js +++ b/app/javascript/dashboard/routes/dashboard/settings/labels/validationMixin.js @@ -1,16 +1,17 @@ export default { computed: { getLabelTitleErrorMessage() { - if (!this.title) { - return this.$t('LABEL_MGMT.FORM.NAME.REQUIRED_ERROR'); + let errorMessage = ''; + if (!this.$v.title.$error) { + errorMessage = ''; + } else if (!this.$v.title.required) { + errorMessage = this.$t('LABEL_MGMT.FORM.NAME.REQUIRED_ERROR'); + } else if (!this.$v.title.minLength) { + errorMessage = this.$t('LABEL_MGMT.FORM.NAME.MINIMUM_LENGTH_ERROR'); + } else if (!this.$v.title.validLabelCharacters) { + errorMessage = this.$t('LABEL_MGMT.FORM.NAME.VALID_ERROR'); } - if (!this.$v.title.minLength) { - return this.$t('LABEL_MGMT.FORM.NAME.MINIMUM_LENGTH_ERROR'); - } - if (!this.$v.title.validLabelCharacters) { - return this.$t('LABEL_MGMT.FORM.NAME.VALID_ERROR'); - } - return ''; + return errorMessage; }, }, }; diff --git a/app/javascript/dashboard/store/modules/contacts/actions.js b/app/javascript/dashboard/store/modules/contacts/actions.js index 0e5e3a8df..09761c443 100644 --- a/app/javascript/dashboard/store/modules/contacts/actions.js +++ b/app/javascript/dashboard/store/modules/contacts/actions.js @@ -6,12 +6,12 @@ import types from '../../mutation-types'; import ContactAPI from '../../../api/contacts'; export const actions = { - search: async ({ commit }, { search, page, sortAttr }) => { + search: async ({ commit }, { search, page, sortAttr, label }) => { commit(types.SET_CONTACT_UI_FLAG, { isFetching: true }); try { const { data: { payload, meta }, - } = await ContactAPI.search(search, page, sortAttr); + } = await ContactAPI.search(search, page, sortAttr, label); commit(types.CLEAR_CONTACTS); commit(types.SET_CONTACTS, payload); commit(types.SET_CONTACT_META, meta); @@ -21,12 +21,12 @@ export const actions = { } }, - get: async ({ commit }, { page = 1, sortAttr } = {}) => { + get: async ({ commit }, { page = 1, sortAttr, label } = {}) => { commit(types.SET_CONTACT_UI_FLAG, { isFetching: true }); try { const { data: { payload, meta }, - } = await ContactAPI.get(page, sortAttr); + } = await ContactAPI.get(page, sortAttr, label); commit(types.CLEAR_CONTACTS); commit(types.SET_CONTACTS, payload); commit(types.SET_CONTACT_META, meta); diff --git a/lib/redis/config.rb b/lib/redis/config.rb index 35ea3e617..f6027d1f6 100644 --- a/lib/redis/config.rb +++ b/lib/redis/config.rb @@ -1,6 +1,6 @@ module Redis::Config - DEFAULT_SENTINEL_PORT = '26379'.freeze - SIDEKIQ_SIZE = 25 + DEFAULT_SENTINEL_PORT ||= '26379'.freeze + SIDEKIQ_SIZE ||= 25 class << self def app diff --git a/spec/controllers/api/v1/accounts/contacts_controller_spec.rb b/spec/controllers/api/v1/accounts/contacts_controller_spec.rb index 12b58c90f..0ebe6b8a0 100644 --- a/spec/controllers/api/v1/accounts/contacts_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/contacts_controller_spec.rb @@ -40,6 +40,22 @@ RSpec.describe 'Contacts API', type: :request do expect(response_body['payload'].first['conversations_count']).to eq(contact.conversations.count) expect(response_body['payload'].first['last_seen_at']).present? end + + it 'filters contacts based on label filter' do + contact_with_label1, contact_with_label2 = FactoryBot.create_list(:contact, 2, account: account) + contact_with_label1.update_labels(['label1']) + contact_with_label2.update_labels(['label2']) + + get "/api/v1/accounts/#{account.id}/contacts", + params: { labels: %w[label1 label2] }, + headers: admin.create_new_auth_token, + as: :json + + expect(response).to have_http_status(:success) + response_body = JSON.parse(response.body) + expect(response_body['meta']['count']).to eq(2) + expect(response_body['payload'].pluck('email')).to include(contact_with_label1.email, contact_with_label2.email) + end end end From e45abebe3991557a292414c01706c4aebb9b016e Mon Sep 17 00:00:00 2001 From: Anubhav Jain Date: Fri, 18 Jun 2021 20:12:43 +0530 Subject: [PATCH 04/69] feat: Improve scrolling for last message on agent side (#2421) * Improve chat widget scrolling * refactor the class names to snake-case * refactor the scrollTop calculations to a helper * Add tests for scrollTopCalculationHelper Co-authored-by: Nithin David Thomas Co-authored-by: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com> --- .../widgets/conversation/MessagesView.vue | 21 ++++++++++++++++++- .../helpers/scrollTopCalculationHelper.js | 18 ++++++++++++++++ .../specs/scrollTopCalculationHelper.spec.js | 18 ++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 app/javascript/dashboard/components/widgets/conversation/helpers/scrollTopCalculationHelper.js create mode 100644 app/javascript/dashboard/components/widgets/conversation/helpers/specs/scrollTopCalculationHelper.spec.js diff --git a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue index d825e4634..9b4de3651 100644 --- a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue +++ b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue @@ -56,6 +56,7 @@ @@ -72,6 +73,7 @@ @@ -106,6 +108,7 @@ import { getTypingUsersText } from '../../../helper/commons'; import { BUS_EVENTS } from 'shared/constants/busEvents'; import { REPLY_POLICY } from 'shared/constants/links'; import inboxMixin from 'shared/mixins/inboxMixin'; +import { calculateScrollTop } from './helpers/scrollTopCalculationHelper'; export default { components: { @@ -259,7 +262,23 @@ export default { this.conversationPanel.removeEventListener('scroll', this.handleScroll); }, scrollToBottom() { - this.conversationPanel.scrollTop = this.conversationPanel.scrollHeight; + let relevantMessages = []; + if (this.getUnreadCount > 0) { + // capturing only the unread messages + relevantMessages = this.conversationPanel.querySelectorAll( + '.message--unread' + ); + } else { + // capturing last message from the messages list + relevantMessages = Array.from( + this.conversationPanel.querySelectorAll('.message--read') + ).slice(-1); + } + this.conversationPanel.scrollTop = calculateScrollTop( + this.conversationPanel.scrollHeight, + this.$el.scrollHeight, + relevantMessages + ); }, onToggleContactPanel() { this.$emit('contact-panel-toggle'); diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/scrollTopCalculationHelper.js b/app/javascript/dashboard/components/widgets/conversation/helpers/scrollTopCalculationHelper.js new file mode 100644 index 000000000..f588089c3 --- /dev/null +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/scrollTopCalculationHelper.js @@ -0,0 +1,18 @@ +const totalMessageHeight = (total, element) => { + return total + element.scrollHeight; +}; + +export const calculateScrollTop = ( + conversationPanelHeight, + parentHeight, + relevantMessages +) => { + // add up scrollHeight of a `relevantMessages` + let combinedMessageScrollHeight = [...relevantMessages].reduce( + totalMessageHeight, + 0 + ); + return ( + conversationPanelHeight - combinedMessageScrollHeight - parentHeight / 2 + ); +}; diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/scrollTopCalculationHelper.spec.js b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/scrollTopCalculationHelper.spec.js new file mode 100644 index 000000000..03caf7560 --- /dev/null +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/scrollTopCalculationHelper.spec.js @@ -0,0 +1,18 @@ +import { calculateScrollTop } from '../scrollTopCalculationHelper'; + +describe('#calculateScrollTop', () => { + it('returns calculated value of the scrollTop property', () => { + class DOMElement { + constructor(scrollHeight) { + this.scrollHeight = scrollHeight; + } + } + let count = 3; + let relevantMessages = []; + while (count > 0) { + relevantMessages.push(new DOMElement(100)); + count -= 1; + } + expect(calculateScrollTop(1000, 300, relevantMessages)).toEqual(550); + }); +}); From e34fe1c614e2bc9e1eaa7335b62782ac88a8a8b4 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Sun, 20 Jun 2021 19:25:36 +0530 Subject: [PATCH 05/69] fix: Fix the sender tooltip getting `undefined` in bot messages (#2453) --- .../components/widgets/conversation/Message.vue | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/app/javascript/dashboard/components/widgets/conversation/Message.vue b/app/javascript/dashboard/components/widgets/conversation/Message.vue index eb6644c91..b866ef4e7 100644 --- a/app/javascript/dashboard/components/widgets/conversation/Message.vue +++ b/app/javascript/dashboard/components/widgets/conversation/Message.vue @@ -71,7 +71,7 @@ import BubbleText from './bubble/Text'; import BubbleImage from './bubble/Image'; import BubbleFile from './bubble/File'; import Spinner from 'shared/components/Spinner'; - +import { isEmptyObject } from 'dashboard/helper/commons'; import contentTypeMixin from 'shared/mixins/contentTypeMixin'; import BubbleActions from './bubble/Actions'; import { MESSAGE_TYPE, MESSAGE_STATUS } from 'shared/constants/messages'; @@ -95,11 +95,6 @@ export default { default: false, }, }, - data() { - return { - isHovered: false, - }; - }, computed: { message() { const botMessageContent = generateBotMessageContent( @@ -179,8 +174,7 @@ export default { }, sentByMessage() { const { sender } = this; - - return this.data.message_type === 1 && !this.isHovered && sender + return this.data.message_type === 1 && !isEmptyObject(sender) ? { content: `${this.$t('CONVERSATION.SENT_BY')} ${sender.name}`, classes: 'top', From f809431074d9312e9e6848a25a953b4c8fa58cbc Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Sun, 20 Jun 2021 19:54:57 +0530 Subject: [PATCH 06/69] chore: Update the design of the attachments preview (#2447) --- .../components/widgets/AttachmentsPreview.vue | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue b/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue index 2d5ded515..2c4f48895 100644 --- a/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue +++ b/app/javascript/dashboard/components/widgets/AttachmentsPreview.vue @@ -65,7 +65,11 @@ export default { display: flex; padding: var(--space-slab) 0 0; background: var(--color-background-light); - background: transparent; + background: var(--b-50); + border-radius: var(--border-radius-normal); + width: fit-content; + padding: var(--space-smaller); + margin-top: var(--space-normal); } .thumb-wrap { @@ -114,6 +118,8 @@ export default { max-width: 50%; overflow: hidden; text-overflow: ellipsis; + margin-left: var(--space-small); + .item { height: var(--space-normal); overflow: hidden; @@ -123,7 +129,7 @@ export default { } .file-size-wrap { - width: 20%; + width: 30%; justify-content: center; } From 3d748aa8d4ac0960dcfc63e7f8accb5135c668a5 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Mon, 21 Jun 2021 15:16:26 +0530 Subject: [PATCH 07/69] chore: Add contact note model (#2462) --- app/models/account.rb | 1 + app/models/contact.rb | 1 + app/models/note.rb | 34 +++++++++++++++++++++++ app/models/user.rb | 1 + db/migrate/20210618073042_create_notes.rb | 11 ++++++++ db/schema.rb | 15 ++++++++++ spec/factories/notes.rb | 10 +++++++ spec/models/note_spec.rb | 23 +++++++++++++++ 8 files changed, 96 insertions(+) create mode 100644 app/models/note.rb create mode 100644 db/migrate/20210618073042_create_notes.rb create mode 100644 spec/factories/notes.rb create mode 100644 spec/models/note_spec.rb diff --git a/app/models/account.rb b/app/models/account.rb index b0c4e2b72..57d1b88c4 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -37,6 +37,7 @@ class Account < ApplicationRecord has_many :data_imports, dependent: :destroy has_many :users, through: :account_users has_many :inboxes, dependent: :destroy + has_many :notes, dependent: :destroy has_many :campaigns, dependent: :destroy has_many :conversations, dependent: :destroy has_many :messages, dependent: :destroy diff --git a/app/models/contact.rb b/app/models/contact.rb index 34d54bee6..62d4970ea 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -41,6 +41,7 @@ class Contact < ApplicationRecord has_many :contact_inboxes, dependent: :destroy has_many :inboxes, through: :contact_inboxes has_many :messages, as: :sender, dependent: :destroy + has_many :notes, dependent: :destroy before_validation :prepare_email_attribute after_create_commit :dispatch_create_event, :ip_lookup diff --git a/app/models/note.rb b/app/models/note.rb new file mode 100644 index 000000000..81613558d --- /dev/null +++ b/app/models/note.rb @@ -0,0 +1,34 @@ +# == Schema Information +# +# Table name: notes +# +# id :bigint not null, primary key +# content :text not null +# created_at :datetime not null +# updated_at :datetime not null +# account_id :bigint not null +# contact_id :bigint not null +# user_id :bigint +# +# Indexes +# +# index_notes_on_account_id (account_id) +# index_notes_on_contact_id (contact_id) +# index_notes_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (account_id => accounts.id) +# fk_rails_... (contact_id => contacts.id) +# fk_rails_... (user_id => users.id) +# +class Note < ApplicationRecord + validates :content, presence: true + validates :account_id, presence: true + validates :contact_id, presence: true + validates :user_id, presence: true + + belongs_to :account + belongs_to :contact + belongs_to :user +end diff --git a/app/models/user.rb b/app/models/user.rb index 460608178..3fc8d7668 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -82,6 +82,7 @@ class User < ApplicationRecord has_many :notification_subscriptions, dependent: :destroy has_many :team_members, dependent: :destroy has_many :teams, through: :team_members + has_many :notes, dependent: :nullify before_validation :set_password_and_uid, on: :create diff --git a/db/migrate/20210618073042_create_notes.rb b/db/migrate/20210618073042_create_notes.rb new file mode 100644 index 000000000..1e7b091a7 --- /dev/null +++ b/db/migrate/20210618073042_create_notes.rb @@ -0,0 +1,11 @@ +class CreateNotes < ActiveRecord::Migration[6.0] + def change + create_table :notes do |t| + t.text :content, null: false + t.references :account, foreign_key: true, null: false + t.references :contact, foreign_key: true, null: false + t.references :user, foreign_key: true + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 1e22906be..2e93206de 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -438,6 +438,18 @@ ActiveRecord::Schema.define(version: 2021_06_18_095823) do t.index ["source_id"], name: "index_messages_on_source_id" end + create_table "notes", force: :cascade do |t| + t.text "content", null: false + t.bigint "account_id", null: false + t.bigint "contact_id", null: false + t.bigint "user_id" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["account_id"], name: "index_notes_on_account_id" + t.index ["contact_id"], name: "index_notes_on_contact_id" + t.index ["user_id"], name: "index_notes_on_user_id" + end + create_table "notification_settings", force: :cascade do |t| t.integer "account_id" t.integer "user_id" @@ -629,6 +641,9 @@ ActiveRecord::Schema.define(version: 2021_06_18_095823) do add_foreign_key "conversations", "contact_inboxes" add_foreign_key "conversations", "teams" add_foreign_key "data_imports", "accounts" + add_foreign_key "notes", "accounts" + add_foreign_key "notes", "contacts" + add_foreign_key "notes", "users" add_foreign_key "team_members", "teams" add_foreign_key "team_members", "users" add_foreign_key "teams", "accounts" diff --git a/spec/factories/notes.rb b/spec/factories/notes.rb new file mode 100644 index 000000000..be650010f --- /dev/null +++ b/spec/factories/notes.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :note do + content { 'Hey welcome to chatwoot' } + account + user + contact + end +end diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb new file mode 100644 index 000000000..3d36c56ae --- /dev/null +++ b/spec/models/note_spec.rb @@ -0,0 +1,23 @@ +require 'rails_helper' + +RSpec.describe Note, type: :model do + describe 'validations' do + it { is_expected.to validate_presence_of(:content) } + it { is_expected.to validate_presence_of(:account_id) } + it { is_expected.to validate_presence_of(:user_id) } + it { is_expected.to validate_presence_of(:contact_id) } + end + + describe 'associations' do + it { is_expected.to belong_to(:account) } + it { is_expected.to belong_to(:user) } + it { is_expected.to belong_to(:contact) } + end + + describe 'validates_factory' do + it 'creates valid note object' do + note = create(:note) + expect(note.content).to eq 'Hey welcome to chatwoot' + end + end +end From a357b657a86535869f21af5c14ba0cb0ec130b83 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Tue, 22 Jun 2021 07:05:23 +0530 Subject: [PATCH 08/69] chore: Adds story for woot input (#2449) --- .../widget/components/Form/Input.stories.js | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 app/javascript/widget/components/Form/Input.stories.js diff --git a/app/javascript/widget/components/Form/Input.stories.js b/app/javascript/widget/components/Form/Input.stories.js new file mode 100644 index 000000000..74879f5ee --- /dev/null +++ b/app/javascript/widget/components/Form/Input.stories.js @@ -0,0 +1,50 @@ +import { action } from '@storybook/addon-actions'; +import wootInput from './Input'; + +export default { + title: 'Components/Form/Input', + component: wootInput, + argTypes: { + label: { + defaultValue: 'Email Address', + control: { + type: 'text', + }, + }, + type: { + defaultValue: 'email', + control: { + type: 'text', + }, + }, + placeholder: { + defaultValue: 'Please enter your email address', + control: { + type: 'text', + }, + }, + value: { + defaultValue: 'John12@ync.in', + control: { + type: 'text ,number', + }, + }, + error: { + defaultValue: '', + control: { + type: 'text', + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { wootInput }, + template: '', +}); + +export const Input = Template.bind({}); +Input.args = { + onClick: action('Added'), +}; From 29b9915d3b6f9a3c54a4b64aa2ac33086f55869c Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Tue, 22 Jun 2021 13:01:19 +0530 Subject: [PATCH 09/69] feat: Add customer satisfaction component (#2456) --- .codeclimate.yml | 1 + .../dashboard/i18n/locale/en/csatMgmt.json | 6 + .../dashboard/i18n/locale/en/index.js | 2 + .../CustomerSatisfaction.stories.js | 19 +++ .../components/CustomerSatisfaction.vue | 137 ++++++++++++++++++ app/javascript/shared/constants/messages.js | 28 ++++ .../widget/components/AgentMessageBubble.vue | 18 ++- app/javascript/widget/i18n/locale/en.json | 4 + app/models/message.rb | 3 +- db/seeds.rb | 2 + lib/woot_message_seeder.rb | 11 ++ 11 files changed, 225 insertions(+), 6 deletions(-) create mode 100644 app/javascript/dashboard/i18n/locale/en/csatMgmt.json create mode 100644 app/javascript/shared/components/CustomerSatisfaction.stories.js create mode 100644 app/javascript/shared/components/CustomerSatisfaction.vue diff --git a/.codeclimate.yml b/.codeclimate.yml index bc58a4029..ac541cda3 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -30,6 +30,7 @@ exclude_patterns: - "**/*.md" - "**/*.yml" - "app/javascript/dashboard/i18n/locale" + - "**/*.stories.js" - "stories/**/*" - "**/*.stories.js" - "**/stories/" diff --git a/app/javascript/dashboard/i18n/locale/en/csatMgmt.json b/app/javascript/dashboard/i18n/locale/en/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/en/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/en/index.js b/app/javascript/dashboard/i18n/locale/en/index.js index 4afba79aa..4203b60ff 100644 --- a/app/javascript/dashboard/i18n/locale/en/index.js +++ b/app/javascript/dashboard/i18n/locale/en/index.js @@ -16,6 +16,7 @@ import { default as _settings } from './settings.json'; import { default as _signup } from './signup.json'; import { default as _teamsSettings } from './teamsSettings.json'; import { default as _integrationApps } from './integrationApps.json'; +import { default as _csatMgmtMgmt } from './csatMgmt.json'; export default { ..._agentMgmt, @@ -36,4 +37,5 @@ export default { ..._signup, ..._teamsSettings, ..._integrationApps, + ..._csatMgmtMgmt, }; diff --git a/app/javascript/shared/components/CustomerSatisfaction.stories.js b/app/javascript/shared/components/CustomerSatisfaction.stories.js new file mode 100644 index 000000000..6f50dd7aa --- /dev/null +++ b/app/javascript/shared/components/CustomerSatisfaction.stories.js @@ -0,0 +1,19 @@ +import { action } from '@storybook/addon-actions'; +import CustomerSatisfaction from './CustomerSatisfaction'; + +export default { + title: 'Components/CustomerSatisfaction', + component: CustomerSatisfaction, + argTypes: {}, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { CustomerSatisfaction }, + template: '', +}); + +export const item = Template.bind({}); +item.args = { + onClick: action('Selected'), +}; diff --git a/app/javascript/shared/components/CustomerSatisfaction.vue b/app/javascript/shared/components/CustomerSatisfaction.vue new file mode 100644 index 000000000..3a346be18 --- /dev/null +++ b/app/javascript/shared/components/CustomerSatisfaction.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/app/javascript/shared/constants/messages.js b/app/javascript/shared/constants/messages.js index 75eda5352..11614797c 100644 --- a/app/javascript/shared/constants/messages.js +++ b/app/javascript/shared/constants/messages.js @@ -12,3 +12,31 @@ export const MESSAGE_TYPE = { }; // Size in mega bytes export const MAXIMUM_FILE_UPLOAD_SIZE = 40; + +export const CSAT_RATINGS = [ + { + key: 'disappointed', + emoji: '😞', + value: 0, + }, + { + key: 'expressionless', + emoji: '😑', + value: 1, + }, + { + key: 'neutral', + emoji: '😐', + value: 2, + }, + { + key: 'grinning', + emoji: '😀', + value: 3, + }, + { + key: 'smiling', + emoji: '😍', + value: 4, + }, +]; diff --git a/app/javascript/widget/components/AgentMessageBubble.vue b/app/javascript/widget/components/AgentMessageBubble.vue index ec44e860d..3ed3a2f2b 100755 --- a/app/javascript/widget/components/AgentMessageBubble.vue +++ b/app/javascript/widget/components/AgentMessageBubble.vue @@ -1,7 +1,9 @@ @@ -52,6 +55,7 @@ import ChatForm from 'shared/components/ChatForm'; import ChatOptions from 'shared/components/ChatOptions'; import ChatArticle from './template/Article'; import EmailInput from './template/EmailInput'; +import CustomerSatisfaction from 'shared/components/CustomerSatisfaction'; export default { name: 'AgentMessageBubble', @@ -61,13 +65,14 @@ export default { ChatForm, ChatOptions, EmailInput, + CustomerSatisfaction, }, mixins: [messageFormatterMixin], props: { - message: String, - contentType: String, - messageType: Number, - messageId: Number, + message: { type: String, default: null }, + contentType: { type: String, default: null }, + messageType: { type: Number, default: null }, + messageId: { type: Number, default: null }, messageContentAttributes: { type: Object, default: () => {}, @@ -92,6 +97,9 @@ export default { isArticle() { return this.contentType === 'article'; }, + isCSAT() { + return this.contentType === 'input_csat'; + }, }, methods: { onResponse(messageResponse) { diff --git a/app/javascript/widget/i18n/locale/en.json b/app/javascript/widget/i18n/locale/en.json index 44a2b5dcf..3cbcd6020 100644 --- a/app/javascript/widget/i18n/locale/en.json +++ b/app/javascript/widget/i18n/locale/en.json @@ -56,5 +56,9 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/models/message.rb b/app/models/message.rb index aaaa34db5..35c175aa2 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -49,7 +49,8 @@ class Message < ApplicationRecord cards: 5, form: 6, article: 7, - incoming_email: 8 + incoming_email: 8, + input_csat: 9 } enum status: { sent: 0, delivered: 1, read: 2, failed: 3 } # [:submitted_email, :items, :submitted_values] : Used for bot message types diff --git a/db/seeds.rb b/db/seeds.rb index 6fb8b7970..2cce3e7cf 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -72,6 +72,8 @@ unless Rails.env.production? WootMessageSeeder.create_sample_form_message conversation # articles WootMessageSeeder.create_sample_articles_message conversation + # csat + WootMessageSeeder.create_sample_csat_collect_message conversation CannedResponse.create!(account: account, short_code: 'start', content: 'Hello welcome to chatwoot.') end diff --git a/lib/woot_message_seeder.rb b/lib/woot_message_seeder.rb index 7e9aaebe1..5dc3aee48 100644 --- a/lib/woot_message_seeder.rb +++ b/lib/woot_message_seeder.rb @@ -10,6 +10,17 @@ module WootMessageSeeder ) end + def self.create_sample_csat_collect_message(conversation) + Message.create!( + account: conversation.account, + inbox: conversation.inbox, + conversation: conversation, + message_type: :template, + content_type: :input_csat, + content: 'Please rate the support' + ) + end + def self.create_sample_cards_message(conversation) Message.create!( account: conversation.account, From bd9bac75adfe944cdeec1d5dd55dfdb2be37c735 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Tue, 22 Jun 2021 15:57:48 +0530 Subject: [PATCH 10/69] fix: Adds condition to handle base and mergee contact being same (#2485) When an agent updates a contact email in the dashboard and the contact also update his email via the email collect box, Merge action receives the same base and mergee contacts which could cause data corruption. --- app/actions/contact_merge_action.rb | 4 ++++ spec/actions/contact_merge_action_spec.rb | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/app/actions/contact_merge_action.rb b/app/actions/contact_merge_action.rb index f2d9b6d06..3a3ef11ed 100644 --- a/app/actions/contact_merge_action.rb +++ b/app/actions/contact_merge_action.rb @@ -2,6 +2,10 @@ class ContactMergeAction pattr_initialize [:account!, :base_contact!, :mergee_contact!] def perform + # This case happens when an agent updates a contact email in dashboard, + # while the contact also update his email via email collect box + return @base_contact if base_contact.id == mergee_contact.id + ActiveRecord::Base.transaction do validate_contacts merge_conversations diff --git a/spec/actions/contact_merge_action_spec.rb b/spec/actions/contact_merge_action_spec.rb index 815518ae3..9cbdeb343 100644 --- a/spec/actions/contact_merge_action_spec.rb +++ b/spec/actions/contact_merge_action_spec.rb @@ -19,6 +19,14 @@ describe ::ContactMergeAction do expect { mergee_contact.reload }.to raise_error(ActiveRecord::RecordNotFound) end + context 'when base contact and merge contact are same' do + it 'does not delete contact' do + mergee_contact = base_contact + contact_merge + expect { mergee_contact.reload }.not_to raise_error(ActiveRecord::RecordNotFound) + end + end + context 'when mergee contact has conversations' do it 'moves the conversations to base contact' do contact_merge From 640e028bde7c40e3103632e047f01bee7f992e90 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Wed, 23 Jun 2021 11:52:06 +0530 Subject: [PATCH 11/69] chore: Add help-text for slack integration (#2409) --- .../dashboard/i18n/locale/en/integrations.json | 6 ++++++ .../settings/integrations/IntegrationHelpText.vue | 12 ++++++++++++ .../settings/integrations/ShowIntegration.vue | 5 +++++ 3 files changed, 23 insertions(+) create mode 100644 app/javascript/dashboard/routes/dashboard/settings/integrations/IntegrationHelpText.vue diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json index cbbe0ebbf..4562183c7 100644 --- a/app/javascript/dashboard/i18n/locale/en/integrations.json +++ b/app/javascript/dashboard/i18n/locale/en/integrations.json @@ -63,6 +63,12 @@ } } }, + "SLACK": { + "HELP_TEXT" : { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Delete", "API": { diff --git a/app/javascript/dashboard/routes/dashboard/settings/integrations/IntegrationHelpText.vue b/app/javascript/dashboard/routes/dashboard/settings/integrations/IntegrationHelpText.vue new file mode 100644 index 000000000..25049f2d0 --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/integrations/IntegrationHelpText.vue @@ -0,0 +1,12 @@ + diff --git a/app/javascript/dashboard/routes/dashboard/settings/integrations/ShowIntegration.vue b/app/javascript/dashboard/routes/dashboard/settings/integrations/ShowIntegration.vue index de270e388..f12b9d295 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/integrations/ShowIntegration.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/integrations/ShowIntegration.vue @@ -13,6 +13,9 @@ :integration-action="integrationAction()" />
+
+ +
@@ -22,10 +25,12 @@ import { mapGetters } from 'vuex'; import globalConfigMixin from 'shared/mixins/globalConfigMixin'; import Integration from './Integration'; +import IntegrationHelpText from './IntegrationHelpText'; export default { components: { Integration, + IntegrationHelpText, }, mixins: [globalConfigMixin], props: ['integrationId', 'code'], From cd11efea1de5d7f1ed85b7ae64fccdf26c08405f Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Wed, 23 Jun 2021 19:29:27 +0530 Subject: [PATCH 12/69] feat: Add CSAT Message Template Hooks (#2494) --- app/models/inbox.rb | 4 +- .../hook_execution_service.rb | 31 ++++++++++-- .../message_templates/template/csat_survey.rb | 24 +++++++++ config/locales/en.yml | 1 + .../hook_execution_service_spec.rb | 49 +++++++++++++++++++ .../template/csat_survey_spec.rb | 13 +++++ 6 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 app/services/message_templates/template/csat_survey.rb create mode 100644 spec/services/message_templates/template/csat_survey_spec.rb diff --git a/app/models/inbox.rb b/app/models/inbox.rb index 15e21e150..3de590cd2 100644 --- a/app/models/inbox.rb +++ b/app/models/inbox.rb @@ -67,11 +67,11 @@ class Inbox < ApplicationRecord end def facebook? - channel.class.name.to_s == 'Channel::FacebookPage' + channel_type == 'Channel::FacebookPage' end def web_widget? - channel.class.name.to_s == 'Channel::WebWidget' + channel_type == 'Channel::WebWidget' end def inbox_type diff --git a/app/services/message_templates/hook_execution_service.rb b/app/services/message_templates/hook_execution_service.rb index 9700ff78b..ee116f462 100644 --- a/app/services/message_templates/hook_execution_service.rb +++ b/app/services/message_templates/hook_execution_service.rb @@ -5,11 +5,7 @@ class MessageTemplates::HookExecutionService return if inbox.agent_bot_inbox&.active? return if conversation.campaign.present? - # TODO: let's see whether this is needed and remove this and related logic if not - # ::MessageTemplates::Template::OutOfOffice.new(conversation: conversation).perform if should_send_out_of_office_message? - - ::MessageTemplates::Template::Greeting.new(conversation: conversation).perform if should_send_greeting? - ::MessageTemplates::Template::EmailCollect.new(conversation: conversation).perform if inbox.enable_email_collect && should_send_email_collect? + trigger_templates end private @@ -17,6 +13,14 @@ class MessageTemplates::HookExecutionService delegate :inbox, :conversation, to: :message delegate :contact, to: :conversation + def trigger_templates + # TODO: let's see whether this is needed and remove this and related logic if not + # ::MessageTemplates::Template::OutOfOffice.new(conversation: conversation).perform if should_send_out_of_office_message? + ::MessageTemplates::Template::Greeting.new(conversation: conversation).perform if should_send_greeting? + ::MessageTemplates::Template::EmailCollect.new(conversation: conversation).perform if inbox.enable_email_collect && should_send_email_collect? + ::MessageTemplates::Template::CsatSurvey.new(conversation: conversation).perform if should_send_csat_survey? + end + def should_send_out_of_office_message? inbox.out_of_office? && conversation.messages.today.template.empty? && inbox.out_of_office_message.present? end @@ -41,4 +45,21 @@ class MessageTemplates::HookExecutionService def contact_has_email? contact.email end + + def csat_enabled_inbox? + # for now csat only available in web widget channel + return unless inbox.web_widget? + return unless inbox.csat_survey_enabled? + + true + end + + def should_send_csat_survey? + return unless conversation.resolved? + return unless csat_enabled_inbox? + # only send CSAT once in a conversation + return if conversation.messages.where(content_type: :input_csat).present? + + true + end end diff --git a/app/services/message_templates/template/csat_survey.rb b/app/services/message_templates/template/csat_survey.rb new file mode 100644 index 000000000..4171367c7 --- /dev/null +++ b/app/services/message_templates/template/csat_survey.rb @@ -0,0 +1,24 @@ +class MessageTemplates::Template::CsatSurvey + pattr_initialize [:conversation!] + + def perform + ActiveRecord::Base.transaction do + conversation.messages.create!(csat_survey_message_params) + end + end + + private + + delegate :contact, :account, to: :conversation + delegate :inbox, to: :message + + def csat_survey_message_params + { + account_id: @conversation.account_id, + inbox_id: @conversation.inbox_id, + message_type: :template, + content_type: :input_csat, + content: I18n.t('conversations.templates.csat_input_message_body') + } + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index b4bd4357c..2e7e85d03 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -82,6 +82,7 @@ en: greeting_message_body: "%{account_name} typically replies in a few hours." ways_to_reach_you_message_body: "Give the team a way to reach you." email_input_box_message_body: "Get notified by email" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "New messages on this conversation" transcript_subject: "Conversation Transcript" diff --git a/spec/services/message_templates/hook_execution_service_spec.rb b/spec/services/message_templates/hook_execution_service_spec.rb index 435d6b4d3..0c20f643d 100644 --- a/spec/services/message_templates/hook_execution_service_spec.rb +++ b/spec/services/message_templates/hook_execution_service_spec.rb @@ -87,6 +87,55 @@ describe ::MessageTemplates::HookExecutionService do end end + context 'when CSAT Survey' do + let(:csat_survey) { double } + let(:conversation) { create(:conversation) } + + before do + allow(::MessageTemplates::Template::CsatSurvey).to receive(:new).and_return(csat_survey) + allow(csat_survey).to receive(:perform).and_return(true) + end + + it 'calls ::MessageTemplates::Template::CsatSurvey when a conversation is resolved in an inbox with survey enabled' do + conversation.inbox.update(csat_survey_enabled: true) + + conversation.resolved! + + expect(::MessageTemplates::Template::CsatSurvey).to have_received(:new).with(conversation: conversation) + expect(csat_survey).to have_received(:perform) + end + + it 'will not call ::MessageTemplates::Template::CsatSurvey when Csat is not enabled' do + conversation.inbox.update(csat_survey_enabled: false) + + conversation.resolved! + + expect(::MessageTemplates::Template::CsatSurvey).not_to have_received(:new).with(conversation: conversation) + expect(csat_survey).not_to have_received(:perform) + end + + it 'will not call ::MessageTemplates::Template::CsatSurvey if its not a website widget' do + api_channel = create(:channel_api) + conversation = create(:conversation, inbox: create(:inbox, channel: api_channel)) + conversation.inbox.update(csat_survey_enabled: true) + + conversation.resolved! + + expect(::MessageTemplates::Template::CsatSurvey).not_to have_received(:new).with(conversation: conversation) + expect(csat_survey).not_to have_received(:perform) + end + + it 'will not call ::MessageTemplates::Template::CsatSurvey if another Csat was already sent' do + conversation.inbox.update(csat_survey_enabled: true) + conversation.messages.create!(message_type: 'outgoing', content_type: :input_csat, account: conversation.account, inbox: conversation.inbox) + + conversation.resolved! + + expect(::MessageTemplates::Template::CsatSurvey).not_to have_received(:new).with(conversation: conversation) + expect(csat_survey).not_to have_received(:perform) + end + end + # TODO: remove this if this hook is removed # context 'when it is after working hours' do # it 'calls ::MessageTemplates::Template::OutOfOffice' do diff --git a/spec/services/message_templates/template/csat_survey_spec.rb b/spec/services/message_templates/template/csat_survey_spec.rb new file mode 100644 index 000000000..e02c93520 --- /dev/null +++ b/spec/services/message_templates/template/csat_survey_spec.rb @@ -0,0 +1,13 @@ +require 'rails_helper' + +describe ::MessageTemplates::Template::CsatSurvey do + context 'when this hook is called' do + let(:conversation) { create(:conversation) } + + it 'creates the out of office messages' do + described_class.new(conversation: conversation).perform + expect(conversation.messages.template.count).to eq(1) + expect(conversation.messages.template.first.content_type).to eq('input_csat') + end + end +end From ae53aa6cfbb447221c555341d4abf654f19eb5ef Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Wed, 23 Jun 2021 19:29:50 +0530 Subject: [PATCH 13/69] feat: Add inbox info to previous conversations (#2491) --- .../routes/dashboard/conversation/ContactConversations.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/dashboard/routes/dashboard/conversation/ContactConversations.vue b/app/javascript/dashboard/routes/dashboard/conversation/ContactConversations.vue index 54cef7362..b2b257ca3 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/ContactConversations.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/ContactConversations.vue @@ -16,7 +16,7 @@ v-for="conversation in previousConversations" :key="conversation.id" :chat="conversation" - :hide-inbox-name="true" + :hide-inbox-name="false" :hide-thumbnail="true" class="compact" /> From 2f9637bde548126da2c12fc843fc474f17687a16 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Thu, 24 Jun 2021 17:47:56 +0530 Subject: [PATCH 14/69] feat: Adds time zone in Business Hours (#2497) --- .../inbox/helpers/specs/businessHour.spec.js | 2 +- .../settings/inbox/helpers/timezones.json | 302 +++++++++--------- 2 files changed, 152 insertions(+), 152 deletions(-) diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/specs/businessHour.spec.js b/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/specs/businessHour.spec.js index 62b9b28ac..d6534cb5e 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/specs/businessHour.spec.js +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/specs/businessHour.spec.js @@ -79,7 +79,7 @@ describe('#timeZoneOptions', () => { it('returns transforms correctly', () => { expect(timeZoneOptions()[0]).toStrictEqual({ value: 'Etc/GMT+12', - label: 'International Date Line West', + label: 'International Date Line West (GMT−12:00)', }); }); }); diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/timezones.json b/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/timezones.json index 8cfe6f882..b238add21 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/timezones.json +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/helpers/timezones.json @@ -1,153 +1,153 @@ { - "International Date Line West": "Etc/GMT+12", - "Midway Island": "Pacific/Midway", - "American Samoa": "Pacific/Pago_Pago", - "Hawaii": "Pacific/Honolulu", - "Alaska": "America/Juneau", - "Pacific Time (US & Canada)": "America/Los_Angeles", - "Tijuana": "America/Tijuana", - "Mountain Time (US & Canada)": "America/Denver", - "Arizona": "America/Phoenix", - "Chihuahua": "America/Chihuahua", - "Mazatlan": "America/Mazatlan", - "Central Time (US & Canada)": "America/Chicago", - "Saskatchewan": "America/Regina", - "Guadalajara": "America/Mexico_City", - "Mexico City": "America/Mexico_City", - "Monterrey": "America/Monterrey", - "Central America": "America/Guatemala", - "Eastern Time (US & Canada)": "America/New_York", - "Indiana (East)": "America/Indiana/Indianapolis", - "Bogota": "America/Bogota", - "Lima": "America/Lima", - "Quito": "America/Lima", - "Atlantic Time (Canada)": "America/Halifax", - "Caracas": "America/Caracas", - "La Paz": "America/La_Paz", - "Santiago": "America/Santiago", - "Newfoundland": "America/St_Johns", - "Brasilia": "America/Sao_Paulo", - "Buenos Aires": "America/Argentina/Buenos_Aires", - "Montevideo": "America/Montevideo", - "Georgetown": "America/Guyana", - "Puerto Rico": "America/Puerto_Rico", - "Greenland": "America/Godthab", - "Mid-Atlantic": "Atlantic/South_Georgia", - "Azores": "Atlantic/Azores", - "Cape Verde Is.": "Atlantic/Cape_Verde", - "Dublin": "Europe/Dublin", - "Edinburgh": "Europe/London", - "Lisbon": "Europe/Lisbon", - "London": "Europe/London", - "Casablanca": "Africa/Casablanca", - "Monrovia": "Africa/Monrovia", - "UTC": "Etc/UTC", - "Belgrade": "Europe/Belgrade", - "Bratislava": "Europe/Bratislava", - "Budapest": "Europe/Budapest", - "Ljubljana": "Europe/Ljubljana", - "Prague": "Europe/Prague", - "Sarajevo": "Europe/Sarajevo", - "Skopje": "Europe/Skopje", - "Warsaw": "Europe/Warsaw", - "Zagreb": "Europe/Zagreb", - "Brussels": "Europe/Brussels", - "Copenhagen": "Europe/Copenhagen", - "Madrid": "Europe/Madrid", - "Paris": "Europe/Paris", - "Amsterdam": "Europe/Amsterdam", - "Berlin": "Europe/Berlin", - "Bern": "Europe/Zurich", - "Zurich": "Europe/Zurich", - "Rome": "Europe/Rome", - "Stockholm": "Europe/Stockholm", - "Vienna": "Europe/Vienna", - "West Central Africa": "Africa/Algiers", - "Bucharest": "Europe/Bucharest", - "Cairo": "Africa/Cairo", - "Helsinki": "Europe/Helsinki", - "Kyiv": "Europe/Kiev", - "Riga": "Europe/Riga", - "Sofia": "Europe/Sofia", - "Tallinn": "Europe/Tallinn", - "Vilnius": "Europe/Vilnius", - "Athens": "Europe/Athens", - "Istanbul": "Europe/Istanbul", - "Minsk": "Europe/Minsk", - "Jerusalem": "Asia/Jerusalem", - "Harare": "Africa/Harare", - "Pretoria": "Africa/Johannesburg", - "Kaliningrad": "Europe/Kaliningrad", - "Moscow": "Europe/Moscow", - "St. Petersburg": "Europe/Moscow", - "Volgograd": "Europe/Volgograd", - "Samara": "Europe/Samara", - "Kuwait": "Asia/Kuwait", - "Riyadh": "Asia/Riyadh", - "Nairobi": "Africa/Nairobi", - "Baghdad": "Asia/Baghdad", - "Tehran": "Asia/Tehran", - "Abu Dhabi": "Asia/Muscat", - "Muscat": "Asia/Muscat", - "Baku": "Asia/Baku", - "Tbilisi": "Asia/Tbilisi", - "Yerevan": "Asia/Yerevan", - "Kabul": "Asia/Kabul", - "Ekaterinburg": "Asia/Yekaterinburg", - "Islamabad": "Asia/Karachi", - "Karachi": "Asia/Karachi", - "Tashkent": "Asia/Tashkent", - "Chennai": "Asia/Kolkata", - "Kolkata": "Asia/Kolkata", - "Mumbai": "Asia/Kolkata", - "New Delhi": "Asia/Kolkata", - "Kathmandu": "Asia/Kathmandu", - "Astana": "Asia/Dhaka", - "Dhaka": "Asia/Dhaka", - "Sri Jayawardenepura": "Asia/Colombo", - "Almaty": "Asia/Almaty", - "Novosibirsk": "Asia/Novosibirsk", - "Rangoon": "Asia/Rangoon", - "Bangkok": "Asia/Bangkok", - "Hanoi": "Asia/Bangkok", - "Jakarta": "Asia/Jakarta", - "Krasnoyarsk": "Asia/Krasnoyarsk", - "Beijing": "Asia/Shanghai", - "Chongqing": "Asia/Chongqing", - "Hong Kong": "Asia/Hong_Kong", - "Urumqi": "Asia/Urumqi", - "Kuala Lumpur": "Asia/Kuala_Lumpur", - "Singapore": "Asia/Singapore", - "Taipei": "Asia/Taipei", - "Perth": "Australia/Perth", - "Irkutsk": "Asia/Irkutsk", - "Ulaanbaatar": "Asia/Ulaanbaatar", - "Seoul": "Asia/Seoul", - "Osaka": "Asia/Tokyo", - "Sapporo": "Asia/Tokyo", - "Tokyo": "Asia/Tokyo", - "Yakutsk": "Asia/Yakutsk", - "Darwin": "Australia/Darwin", - "Adelaide": "Australia/Adelaide", - "Canberra": "Australia/Melbourne", - "Melbourne": "Australia/Melbourne", - "Sydney": "Australia/Sydney", - "Brisbane": "Australia/Brisbane", - "Hobart": "Australia/Hobart", - "Vladivostok": "Asia/Vladivostok", - "Guam": "Pacific/Guam", - "Port Moresby": "Pacific/Port_Moresby", - "Magadan": "Asia/Magadan", - "Srednekolymsk": "Asia/Srednekolymsk", - "Solomon Is.": "Pacific/Guadalcanal", - "New Caledonia": "Pacific/Noumea", - "Fiji": "Pacific/Fiji", - "Kamchatka": "Asia/Kamchatka", - "Marshall Is.": "Pacific/Majuro", - "Auckland": "Pacific/Auckland", - "Wellington": "Pacific/Auckland", - "Nuku'alofa": "Pacific/Tongatapu", - "Tokelau Is.": "Pacific/Fakaofo", - "Chatham Is.": "Pacific/Chatham", - "Samoa": "Pacific/Apia" + "International Date Line West (GMT−12:00)": "Etc/GMT+12", + "Midway Island (GMT-11:00)": "Pacific/Midway", + "American Samoa (GMT-11:00)": "Pacific/Pago_Pago", + "Hawaii (GMT-10:00)": "Pacific/Honolulu", + "Alaska (GMT-08:00)": "America/Juneau", + "Pacific Time (US & Canada) (GMT-07:00)": "America/Los_Angeles", + "Tijuana (GMT-07:00)": "America/Tijuana", + "Mountain Time (US & Canada) (GMT-06:00)": "America/Denver", + "Arizona (GMT-07:00)": "America/Phoenix", + "Chihuahua (GMT-06:00)": "America/Chihuahua", + "Mazatlan (GMT-06:00)": "America/Mazatlan", + "Central Time (US & Canada) (GMT-05:00)": "America/Chicago", + "Saskatchewan (GMT-06:00)": "America/Regina", + "Guadalajara (GMT-05:00)": "America/Mexico_City", + "Mexico City (GMT-05:00)": "America/Mexico_City", + "Monterrey (GMT-05:00)": "America/Monterrey", + "Central America (GMT−06:00)": "America/Guatemala", + "Eastern Time (US & Canada) (GMT-04:00)": "America/New_York", + "Indiana (East) (GMT-04:00)": "America/Indiana/Indianapolis", + "Bogota (GMT-05:00)": "America/Bogota", + "Lima (GMT-05:00)": "America/Lima", + "Quito (GMT-05:00)": "America/Lima", + "Atlantic Time (Canada) (GMT-03:00)": "America/Halifax", + "Caracas (GMT-04:00)": "America/Caracas", + "La Paz (GMT-04:00)": "America/La_Paz", + "Santiago (GMT-04:00)": "America/Santiago", + "Newfoundland (GMT-02:30)": "America/St_Johns", + "Brasilia (GMT-03:00)": "America/Sao_Paulo", + "Buenos Aires (GMT-03:00)": "America/Argentina/Buenos_Aires", + "Montevideo (GMT-03:00)": "America/Montevideo", + "Georgetown (GMT-04:00)": "America/Guyana", + "Puerto Rico (GMT-04:00)": "America/Puerto_Rico", + "Greenland (GMT-02:00)": "America/Godthab", + "Mid-Atlantic (GMT-02:00)": "Atlantic/South_Georgia", + "Azores (GMT-01:00)": "Atlantic/Azores", + "Cape Verde Is. (GMT-01:00)": "Atlantic/Cape_Verde", + "Dublin (GMT+01:00)": "Europe/Dublin", + "Edinburgh (GMT+01:00)": "Europe/London", + "Lisbon (GMT+01:00)": "Europe/Lisbon", + "London (GMT+01:00)": "Europe/London", + "Casablanca (GMT+01:00)": "Africa/Casablanca", + "Monrovia (GMT+00:00)": "Africa/Monrovia", + "UTC (UTC+00:00)": "Etc/UTC", + "Belgrade (GMT+02:00)": "Europe/Belgrade", + "Bratislava (GMT+02:00)": "Europe/Bratislava", + "Budapest (GMT+02:00)": "Europe/Budapest", + "Ljubljana (GMT+02:00)": "Europe/Ljubljana", + "Prague (GMT+02:00)": "Europe/Prague", + "Sarajevo (GMT+02:00)": "Europe/Sarajevo", + "Skopje (GMT+02:00)": "Europe/Skopje", + "Warsaw (GMT+02:00)": "Europe/Warsaw", + "Zagreb (GMT+02:00)": "Europe/Zagreb", + "Brussels (GMT+02:00)": "Europe/Brussels", + "Copenhagen (GMT+02:00)": "Europe/Copenhagen", + "Madrid (GMT+02:00)": "Europe/Madrid", + "Paris (GMT+02:00)": "Europe/Paris", + "Amsterdam (GMT+02:00)": "Europe/Amsterdam", + "Berlin (GMT+02:00)": "Europe/Berlin", + "Bern (GMT+02:00)": "Europe/Zurich", + "Zurich (GMT+02:00)": "Europe/Zurich", + "Rome (GMT+02:00)": "Europe/Rome", + "Stockholm (GMT+02:00)": "Europe/Stockholm", + "Vienna (GMT+02:00)": "Europe/Vienna", + "West Central Africa (GMT+01:00)": "Africa/Algiers", + "Bucharest (GMT+03:00)": "Europe/Bucharest", + "Cairo (GMT+02:00)": "Africa/Cairo", + "Helsinki (GMT+03:00)": "Europe/Helsinki", + "Kyiv (GMT+03:00)": "Europe/Kiev", + "Riga (GMT+03:00)": "Europe/Riga", + "Sofia (GMT+03:00)": "Europe/Sofia", + "Tallinn (GMT+03:00)": "Europe/Tallinn", + "Vilnius (GMT+03:00)": "Europe/Vilnius", + "Athens (GMT+03:00)": "Europe/Athens", + "Istanbul (GMT+03:00)": "Europe/Istanbul", + "Minsk (GMT+03:00)": "Europe/Minsk", + "Jerusalem (GMT+03:00)": "Asia/Jerusalem", + "Harare (GMT+02:00)": "Africa/Harare", + "Pretoria (GMT+02:00)": "Africa/Johannesburg", + "Kaliningrad (GMT+02:00)": "Europe/Kaliningrad", + "Moscow (GMT+03:00)": "Europe/Moscow", + "St. Petersburg (GMT+03:00)": "Europe/Moscow", + "Volgograd (GMT+03:00)": "Europe/Volgograd", + "Samara (GMT+04:00)": "Europe/Samara", + "Kuwait (GMT+03:00)": "Asia/Kuwait", + "Riyadh (GMT+03:00)": "Asia/Riyadh", + "Nairobi (GMT+03:00)": "Africa/Nairobi", + "Baghdad (GMT+03:00)": "Asia/Baghdad", + "Tehran (GMT+04:30)": "Asia/Tehran", + "Abu Dhabi (GMT+04:00)": "Asia/Muscat", + "Muscat (GMT+04:00)": "Asia/Muscat", + "Baku (GMT+04:00)": "Asia/Baku", + "Tbilisi (GMT+04:00)": "Asia/Tbilisi", + "Yerevan (GMT+04:00)": "Asia/Yerevan", + "Kabul (GMT+04:30)": "Asia/Kabul", + "Ekaterinburg (GMT+05:00)": "Asia/Yekaterinburg", + "Islamabad (GMT+05:00)": "Asia/Karachi", + "Karachi (GMT+05:00)": "Asia/Karachi", + "Tashkent (GMT+05:00)": "Asia/Tashkent", + "Chennai (GMT+05:30)": "Asia/Kolkata", + "Kolkata (GMT+05:30)": "Asia/Kolkata", + "Mumbai (GMT+05:30)": "Asia/Kolkata", + "New Delhi (GMT+05:30)": "Asia/Kolkata", + "Kathmandu (GMT+05:45)": "Asia/Kathmandu", + "Astana (GMT+06:00)": "Asia/Dhaka", + "Dhaka (GMT+06:00)": "Asia/Dhaka", + "Sri Jayawardenepura (GMT+05:30)": "Asia/Colombo", + "Almaty (GMT+06:00)": "Asia/Almaty", + "Novosibirsk (GMT+07:00)": "Asia/Novosibirsk", + "Rangoon (GMT+06:30)": "Asia/Rangoon", + "Bangkok (GMT+07:00)": "Asia/Bangkok", + "Hanoi (GMT+07:00)": "Asia/Bangkok", + "Jakarta (GMT+07:00)": "Asia/Jakarta", + "Krasnoyarsk (GMT+07:00)": "Asia/Krasnoyarsk", + "Beijing (GMT+08:00)": "Asia/Shanghai", + "Chongqing (GMT+08:00)": "Asia/Chongqing", + "Hong Kong (GMT+08:00)": "Asia/Hong_Kong", + "Urumqi (GMT+08:00)": "Asia/Urumqi", + "Kuala Lumpur (GMT+08:00)": "Asia/Kuala_Lumpur", + "Singapore (GMT+08:00)": "Asia/Singapore", + "Taipei (GMT+08:00)": "Asia/Taipei", + "Perth (GMT+08:00)": "Australia/Perth", + "Irkutsk (GMT+08:00)": "Asia/Irkutsk", + "Ulaanbaatar (GMT+08:00)": "Asia/Ulaanbaatar", + "Seoul (GMT+09:00)": "Asia/Seoul", + "Osaka (GMT+09:00)": "Asia/Tokyo", + "Sapporo (GMT+09:00)": "Asia/Tokyo", + "Tokyo (GMT+09:00)": "Asia/Tokyo", + "Yakutsk (GMT+09:00)": "Asia/Yakutsk", + "Darwin (GMT+09:30)": "Australia/Darwin", + "Adelaide (GMT+09:30)": "Australia/Adelaide", + "Canberra (GMT+10:00)": "Australia/Melbourne", + "Melbourne (GMT+10:00)": "Australia/Melbourne", + "Sydney (GMT+10:00)": "Australia/Sydney", + "Brisbane (GMT+10:00)": "Australia/Brisbane", + "Hobart (GMT+10:00)": "Australia/Hobart", + "Vladivostok (GMT+10:00)": "Asia/Vladivostok", + "Guam (GMT+10:00)": "Pacific/Guam", + "Port Moresby (GMT+10:00)": "Pacific/Port_Moresby", + "Magadan (GMT+11:00)": "Asia/Magadan", + "Srednekolymsk (GMT+11:00)": "Asia/Srednekolymsk", + "Solomon Is. (GMT+11:00)": "Pacific/Guadalcanal", + "New Caledonia (GMT+11:00)": "Pacific/Noumea", + "Fiji (GMT+12:00)": "Pacific/Fiji", + "Kamchatka (GMT+12:00)": "Asia/Kamchatka", + "Marshall Is. (GMT+12:00)": "Pacific/Majuro", + "Auckland (GMT+12:00)": "Pacific/Auckland", + "Wellington (GMT+12:00)": "Pacific/Auckland", + "Nuku'alofa (GMT+13:00)": "Pacific/Tongatapu", + "Tokelau Is. (GMT+13:00)": "Pacific/Fakaofo", + "Chatham Is. (GMT+12:45)": "Pacific/Chatham", + "Samoa (GMT+13:00)": "Pacific/Apia" } From dbddb1ece428191de8cfc553d947897860259550 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Fri, 25 Jun 2021 12:00:49 +0530 Subject: [PATCH 15/69] feat: Add CSAT response submit action (#2506) Co-authored-by: Pranav Raj S --- .../api/v1/widget/messages_controller.rb | 2 +- .../components/CustomerSatisfaction.vue | 100 ++++++++++++++---- app/javascript/shared/constants/messages.js | 10 +- .../widget/components/AgentMessage.vue | 2 +- .../widget/components/AgentMessageBubble.vue | 17 ++- app/javascript/widget/i18n/locale/en.json | 1 + 6 files changed, 103 insertions(+), 29 deletions(-) diff --git a/app/controllers/api/v1/widget/messages_controller.rb b/app/controllers/api/v1/widget/messages_controller.rb index 991b2f428..c5492eff9 100644 --- a/app/controllers/api/v1/widget/messages_controller.rb +++ b/app/controllers/api/v1/widget/messages_controller.rb @@ -54,7 +54,7 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController end def message_update_params - params.permit(message: [{ submitted_values: [:name, :title, :value] }]) + params.permit(message: [{ submitted_values: [:name, :title, :value, { csat_survey_response: [:feedback_text, :rating] }] }]) end def permitted_params diff --git a/app/javascript/shared/components/CustomerSatisfaction.vue b/app/javascript/shared/components/CustomerSatisfaction.vue index 3a346be18..4a49e8c89 100644 --- a/app/javascript/shared/components/CustomerSatisfaction.vue +++ b/app/javascript/shared/components/CustomerSatisfaction.vue @@ -1,21 +1,20 @@ @@ -121,6 +125,17 @@ export default { messageId: this.messageId, }); }, + onCSATSubmit({ feedback, rating }) { + this.onResponse({ + submittedValues: { + csat_survey_response: { + rating, + feedback_text: feedback, + }, + }, + messageId: this.messageId, + }); + }, }, }; diff --git a/app/javascript/widget/i18n/locale/en.json b/app/javascript/widget/i18n/locale/en.json index 3cbcd6020..dd114afff 100644 --- a/app/javascript/widget/i18n/locale/en.json +++ b/app/javascript/widget/i18n/locale/en.json @@ -59,6 +59,7 @@ }, "CSAT": { "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", "PLACEHOLDER": "Tell us more..." } } From ad431c200843fae69f46dc8e48d24206c4904c1d Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Fri, 25 Jun 2021 12:56:10 +0530 Subject: [PATCH 16/69] chore: fixes gutter space between settings page content and sidebar (#2505) * chore: fixes no gutter space between the settings page content and right content. * Review fixes --- app/javascript/dashboard/assets/scss/_foundation-custom.scss | 4 ++++ .../dashboard/routes/dashboard/settings/agents/Index.vue | 2 +- .../dashboard/routes/dashboard/settings/canned/Index.vue | 2 +- .../dashboard/routes/dashboard/settings/inbox/Index.vue | 2 +- .../settings/integrationapps/MultipleIntegrationHooks.vue | 2 +- .../routes/dashboard/settings/integrations/Webhook.vue | 2 +- .../dashboard/routes/dashboard/settings/labels/Index.vue | 2 +- .../dashboard/routes/dashboard/settings/teams/Index.vue | 2 +- 8 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/javascript/dashboard/assets/scss/_foundation-custom.scss b/app/javascript/dashboard/assets/scss/_foundation-custom.scss index 6fc3961fc..8a82e89c0 100644 --- a/app/javascript/dashboard/assets/scss/_foundation-custom.scss +++ b/app/javascript/dashboard/assets/scss/_foundation-custom.scss @@ -45,3 +45,7 @@ code { .cursor-pointer { cursor: pointer; } +// remove when grid gutters are fixed +.columns.with-right-space { + padding-right: var(--space-normal); +} diff --git a/app/javascript/dashboard/routes/dashboard/settings/agents/Index.vue b/app/javascript/dashboard/routes/dashboard/settings/agents/Index.vue index ac3d78946..38f07ea3f 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/agents/Index.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/agents/Index.vue @@ -11,7 +11,7 @@
-
+
-
+

-
+

{{ $t('INBOX_MGMT.LIST.404') }}

-
+
diff --git a/app/javascript/dashboard/routes/dashboard/settings/integrations/Webhook.vue b/app/javascript/dashboard/routes/dashboard/settings/integrations/Webhook.vue index 6607909f4..04fb325f0 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/integrations/Webhook.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/integrations/Webhook.vue @@ -10,7 +10,7 @@
-
+

-
+

-
+

{{ $t('TEAMS_SETTINGS.LIST.404') }} Date: Fri, 25 Jun 2021 13:18:24 +0530 Subject: [PATCH 17/69] chore: Adds storybook for woot textarea (#2451) * chore: Adds storybook for woot textarea * Review fixes * Minor fixes Co-authored-by: Muhsin Keloth Co-authored-by: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com> --- .../components/Form/TextArea.stories.js | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 app/javascript/widget/components/Form/TextArea.stories.js diff --git a/app/javascript/widget/components/Form/TextArea.stories.js b/app/javascript/widget/components/Form/TextArea.stories.js new file mode 100644 index 000000000..3f47c3323 --- /dev/null +++ b/app/javascript/widget/components/Form/TextArea.stories.js @@ -0,0 +1,51 @@ +import { action } from '@storybook/addon-actions'; +import wootTextArea from './TextArea'; + +export default { + title: 'Components/Form/Text Area', + component: wootTextArea, + argTypes: { + label: { + defaultValue: 'Message', + control: { + type: 'text', + }, + }, + type: { + defaultValue: '', + control: { + type: 'text', + }, + }, + placeholder: { + defaultValue: 'Please enter your message', + control: { + type: 'text', + }, + }, + value: { + defaultValue: 'Lorem ipsum is a placeholder text commonly used', + control: { + type: 'text ,number', + }, + }, + error: { + defaultValue: '', + control: { + type: 'text', + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { wootTextArea }, + template: + '', +}); + +export const TextArea = Template.bind({}); +TextArea.args = { + onClick: action('Added'), +}; From bd1b17baf3209e04431f1b800537aba8b3bc2ec4 Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Fri, 25 Jun 2021 13:37:51 +0530 Subject: [PATCH 18/69] feat: Show the CSAT response to the agent (#2511) --- .../api/v1/widget/messages_controller.rb | 2 +- .../widgets/conversation/Message.vue | 8 +++- .../helpers/botMessageContentHelper.js | 48 +++++++++++++++---- .../specs/botMessageContentHelper.spec.js | 24 ++++++++++ .../i18n/locale/en/conversation.json | 2 + .../widget/components/AgentMessageBubble.vue | 2 +- 6 files changed, 74 insertions(+), 12 deletions(-) diff --git a/app/controllers/api/v1/widget/messages_controller.rb b/app/controllers/api/v1/widget/messages_controller.rb index c5492eff9..f0286ecd2 100644 --- a/app/controllers/api/v1/widget/messages_controller.rb +++ b/app/controllers/api/v1/widget/messages_controller.rb @@ -54,7 +54,7 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController end def message_update_params - params.permit(message: [{ submitted_values: [:name, :title, :value, { csat_survey_response: [:feedback_text, :rating] }] }]) + params.permit(message: [{ submitted_values: [:name, :title, :value, { csat_survey_response: [:feedback, :rating] }] }]) end def permitted_params diff --git a/app/javascript/dashboard/components/widgets/conversation/Message.vue b/app/javascript/dashboard/components/widgets/conversation/Message.vue index b866ef4e7..e43b8e3e5 100644 --- a/app/javascript/dashboard/components/widgets/conversation/Message.vue +++ b/app/javascript/dashboard/components/widgets/conversation/Message.vue @@ -100,7 +100,13 @@ export default { const botMessageContent = generateBotMessageContent( this.contentType, this.contentAttributes, - this.$t('CONVERSATION.NO_RESPONSE') + { + noResponseText: this.$t('CONVERSATION.NO_RESPONSE'), + csat: { + ratingTitle: this.$t('CONVERSATION.RATING_TITLE'), + feedbackTitle: this.$t('CONVERSATION.FEEDBACK_TITLE'), + }, + } ); const { diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js b/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js index 42e59a161..b7e105abf 100644 --- a/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js @@ -1,4 +1,6 @@ -const generateInputSelectContent = (contentType, contentAttributes) => { +import { CSAT_RATINGS } from '../../../../../shared/constants/messages'; + +const generateInputSelectContent = contentAttributes => { const { submitted_values: submittedValues = [] } = contentAttributes; const [selectedOption] = submittedValues; @@ -8,7 +10,7 @@ const generateInputSelectContent = (contentType, contentAttributes) => { return ''; }; -const generateInputEmailContent = (contentType, contentAttributes) => { +const generateInputEmailContent = contentAttributes => { const { submitted_email: submittedEmail = '' } = contentAttributes; if (submittedEmail) { return `${submittedEmail}`; @@ -16,11 +18,7 @@ const generateInputEmailContent = (contentType, contentAttributes) => { return ''; }; -const generateFormContent = ( - contentType, - contentAttributes, - noResponseText -) => { +const generateFormContent = (contentAttributes, { noResponseText }) => { const { items, submitted_values: submittedValues = [] } = contentAttributes; if (submittedValues.length) { const submittedObject = submittedValues.reduce((acc, keyValuePair) => { @@ -38,20 +36,52 @@ const generateFormContent = ( return ''; }; +const generateCSATContent = ( + contentAttributes, + { ratingTitle, feedbackTitle } +) => { + const { + submitted_values: { csat_survey_response: surveyResponse = {} } = {}, + } = contentAttributes; + const { rating, feedback } = surveyResponse || {}; + + let messageContent = ''; + if (rating) { + const [ratingObject = {}] = CSAT_RATINGS.filter( + csatRating => csatRating.value === rating + ); + messageContent += `

${ratingTitle}
`; + messageContent += `

${ratingObject.emoji}

`; + } + if (feedback) { + messageContent += `
${feedbackTitle}
`; + messageContent += `

${feedback}

`; + } + return messageContent; +}; + export const generateBotMessageContent = ( contentType, contentAttributes, - noResponseText = 'No response' + { + noResponseText = 'No response', + csat: { ratingTitle = 'Rating', feedbackTitle = 'Feedback' } = {}, + } = {} ) => { const contentTypeMethods = { input_select: generateInputSelectContent, input_email: generateInputEmailContent, form: generateFormContent, + input_csat: generateCSATContent, }; const contentTypeMethod = contentTypeMethods[contentType]; if (contentTypeMethod && typeof contentTypeMethod === 'function') { - return contentTypeMethod(contentType, contentAttributes, noResponseText); + return contentTypeMethod(contentAttributes, { + noResponseText, + ratingTitle, + feedbackTitle, + }); } return ''; }; diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js index 716fdd65b..9268b4559 100644 --- a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js @@ -17,6 +17,30 @@ describe('#generateBotMessageContent', () => { ).toEqual('hello@chatwoot.com'); }); + it('return correct input_csat content', () => { + expect( + generateBotMessageContent('input_csat', { + submitted_values: { + csat_survey_response: { rating: 5, feedback: 'Great Service' }, + }, + }) + ).toEqual( + '
Rating

😍

Feedback

Great Service

' + ); + + expect( + generateBotMessageContent( + 'input_csat', + { + submitted_values: { + csat_survey_response: { rating: 1, feedback: '' }, + }, + }, + { csat: { ratingTitle: 'റേറ്റിംഗ്', feedbackTitle: 'പ്രതികരണം' } } + ) + ).toEqual('
റേറ്റിംഗ്

😞

'); + }); + it('return correct form content', () => { expect( generateBotMessageContent('form', { diff --git a/app/javascript/dashboard/i18n/locale/en/conversation.json b/app/javascript/dashboard/i18n/locale/en/conversation.json index 976d1395a..587530e74 100644 --- a/app/javascript/dashboard/i18n/locale/en/conversation.json +++ b/app/javascript/dashboard/i18n/locale/en/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolve", "REOPEN_ACTION": "Reopen", diff --git a/app/javascript/widget/components/AgentMessageBubble.vue b/app/javascript/widget/components/AgentMessageBubble.vue index 95921e867..071a37d26 100755 --- a/app/javascript/widget/components/AgentMessageBubble.vue +++ b/app/javascript/widget/components/AgentMessageBubble.vue @@ -130,7 +130,7 @@ export default { submittedValues: { csat_survey_response: { rating, - feedback_text: feedback, + feedback, }, }, messageId: this.messageId, From d840b7b13da14d3c8ee2ee270d8e3ac91f583f25 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Fri, 25 Jun 2021 17:14:37 +0530 Subject: [PATCH 19/69] feat: Adds storybook for search component. (#2444) * feat: Adds storybook for search component. * Review fixes * Uses woot-label for conv-id Co-authored-by: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com> --- .../conversation/search/ResultItem.stories.js | 41 ++++++++++++++++ .../conversation/search/ResultItem.vue | 44 ++++++++--------- .../search/SearchMessageItem.stories.js | 47 +++++++++++++++++++ .../conversation/search/SearchMessageItem.vue | 8 ++-- 4 files changed, 111 insertions(+), 29 deletions(-) create mode 100644 app/javascript/dashboard/routes/dashboard/conversation/search/ResultItem.stories.js create mode 100644 app/javascript/dashboard/routes/dashboard/conversation/search/SearchMessageItem.stories.js diff --git a/app/javascript/dashboard/routes/dashboard/conversation/search/ResultItem.stories.js b/app/javascript/dashboard/routes/dashboard/conversation/search/ResultItem.stories.js new file mode 100644 index 000000000..b0652e538 --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/conversation/search/ResultItem.stories.js @@ -0,0 +1,41 @@ +import ResultItem from './ResultItem'; + +export default { + title: 'Components/Search/Result Items', + component: ResultItem, + argTypes: { + conversationId: { + defaultValue: '1', + control: { + type: 'number', + }, + }, + userName: { + defaultValue: 'John davies', + control: { + type: 'text', + }, + }, + inboxName: { + defaultValue: 'Support', + control: { + type: 'text', + }, + }, + timestamp: { + defaultValue: '1618046084', + control: { + type: 'number', + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { ResultItem }, + template: '', +}); + +export const ResultItems = Template.bind({}); +ResultItems.args = {}; diff --git a/app/javascript/dashboard/routes/dashboard/conversation/search/ResultItem.vue b/app/javascript/dashboard/routes/dashboard/conversation/search/ResultItem.vue index 20bb34cc9..30b95ed88 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/search/ResultItem.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/search/ResultItem.vue @@ -4,11 +4,15 @@
-
- {{ userName }} -
- # {{ conversationId }} +
+
+ {{ userName }}
+
{{ inboxName }}
@@ -69,6 +73,9 @@ export default { ...mapGetters({ accountId: 'getCurrentAccountId', }), + conversationsId() { + return `# ${this.conversationId}`; + }, readableTime() { if (!this.timestamp) { return ''; @@ -124,10 +131,6 @@ export default { .ion-ios-chatboxes-outline { color: var(--white); } - .conversation-id { - background: var(--w-50); - color: var(--s-500); - } } } @@ -149,35 +152,26 @@ export default { padding: var(--space-smaller) var(--space-one); } -.name-wrap { +.user-wrap { display: flex; - width: 20rem; - .user-name { - font-size: var(--font-size-default); - font-weight: var(--font-weight-bold); - margin-right: var(--space-micro); + .name-wrap { + max-width: 20rem; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; - } - .conversation-id { - background: var(--w-400); - border-radius: var(--border-radius-normal); - color: var(--w-50); - align-items: center; - font-size: var(--font-size-mini); - font-weight: var(--font-weight-bold); - padding: 0 var(--space-smaller); - white-space: nowrap; + .sub-block-title { + font-weight: var(--font-weight-bold); + margin-right: var(--space-micro); + } } } .inbox-name { border-radius: var(--border-radius-normal); color: var(--s-500); - font-size: var(--font-size-normal); + font-size: var(--font-size-mini); font-weight: var(--font-weight-medium); } diff --git a/app/javascript/dashboard/routes/dashboard/conversation/search/SearchMessageItem.stories.js b/app/javascript/dashboard/routes/dashboard/conversation/search/SearchMessageItem.stories.js new file mode 100644 index 000000000..78f0d0deb --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/conversation/search/SearchMessageItem.stories.js @@ -0,0 +1,47 @@ +import SearchMessage from './SearchMessageItem'; + +export default { + title: 'Components/Search/Messages', + component: SearchMessage, + argTypes: { + userName: { + defaultValue: 'John davies', + control: { + type: 'text', + }, + }, + timestamp: { + defaultValue: '1618046084', + control: { + type: 'number', + }, + }, + messageType: { + control: { + type: 'number', + }, + }, + content: { + defaultValue: + 'some designers and developers around the web know this and have put together a bunch of text generators', + control: { + type: 'text', + }, + }, + searchTerm: { + defaultValue: 'developers', + control: { + type: 'text', + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { SearchMessage }, + template: '', +}); + +export const Messages = Template.bind({}); +Messages.args = {}; diff --git a/app/javascript/dashboard/routes/dashboard/conversation/search/SearchMessageItem.vue b/app/javascript/dashboard/routes/dashboard/conversation/search/SearchMessageItem.vue index 40da05e99..09a3c6d00 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/search/SearchMessageItem.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/search/SearchMessageItem.vue @@ -3,7 +3,7 @@
- {{ userName }} + {{ userName }}
@@ -109,10 +109,9 @@ export default { .name-wrap { display: flex; - width: 22rem; + max-width: 22rem; - .user-name { - font-size: var(--font-size-small); + .text-block-title { font-weight: var(--font-weight-bold); text-overflow: ellipsis; overflow: hidden; @@ -141,6 +140,7 @@ p { .message-content { font-size: var(--font-size-small); margin-bottom: var(--space-micro); + margin-top: var(--space-micro); padding: 0; line-height: 1.35; overflow-wrap: break-word; From 151bfbd1dd683466e4e388e7f6773e21d6c1d627 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Fri, 25 Jun 2021 17:41:24 +0530 Subject: [PATCH 20/69] feat: Creates new component for multiselect. (#2446) --- .codeclimate.yml | 1 + .../assets/scss/widgets/_buttons.scss | 4 + .../dashboard/i18n/locale/en/agentMgmt.json | 2 +- .../ui/MultiselectDropdown.stories.js | 65 ++++++ .../ui/MultiselectDropdownItems.stories.js | 67 ++++++ .../ui/MultiselectDropdownItems.vue | 197 ++++++++++++++++++ .../components/ui/MutiselectDropdown.vue | 165 +++++++++++++++ 7 files changed, 500 insertions(+), 1 deletion(-) create mode 100644 app/javascript/shared/components/ui/MultiselectDropdown.stories.js create mode 100644 app/javascript/shared/components/ui/MultiselectDropdownItems.stories.js create mode 100644 app/javascript/shared/components/ui/MultiselectDropdownItems.vue create mode 100644 app/javascript/shared/components/ui/MutiselectDropdown.vue diff --git a/.codeclimate.yml b/.codeclimate.yml index ac541cda3..2fca0d306 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -34,3 +34,4 @@ exclude_patterns: - "stories/**/*" - "**/*.stories.js" - "**/stories/" + - "app/javascript/**/*.stories.js" diff --git a/app/javascript/dashboard/assets/scss/widgets/_buttons.scss b/app/javascript/dashboard/assets/scss/widgets/_buttons.scss index edbef16bb..1a72d51df 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_buttons.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_buttons.scss @@ -6,6 +6,10 @@ $default-button-height: 4.0rem; height: $default-button-height; margin-bottom: 0; + .button__content { + width: 100%; + } + .spinner { padding: 0 var(--space-small); } diff --git a/app/javascript/dashboard/i18n/locale/en/agentMgmt.json b/app/javascript/dashboard/i18n/locale/en/agentMgmt.json index ac4a62127..dcc8c9fda 100644 --- a/app/javascript/dashboard/i18n/locale/en/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No agents found." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/shared/components/ui/MultiselectDropdown.stories.js b/app/javascript/shared/components/ui/MultiselectDropdown.stories.js new file mode 100644 index 000000000..ff3f366f0 --- /dev/null +++ b/app/javascript/shared/components/ui/MultiselectDropdown.stories.js @@ -0,0 +1,65 @@ +import { action } from '@storybook/addon-actions'; +import Dropdown from './MutiselectDropdown'; + +export default { + title: 'Components/Dropdown/Multiselect Dropdown', + component: Dropdown, + argTypes: { + options: { + control: { + type: 'object', + }, + }, + selectedItem: { + control: { + type: 'object', + }, + }, + multiselectorTitle: { + control: { + type: 'text', + }, + }, + multiselectorPlaceholder: { + control: { + type: 'text', + }, + }, + noSearchResult: { + control: { + type: 'text', + }, + }, + inputPlaceholder: { + control: { + type: 'text', + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { Dropdown }, + template: '', +}); + +export const MultiselectDropdown = Template.bind({}); +MultiselectDropdown.args = { + onClick: action('Opened'), + options: [ + { + id: 1, + availability_status: 'online', + name: 'James Philip', + thumbnail: 'https://randomuser.me/api/portraits/men/4.jpg', + }, + ], + + selectedItem: { + id: 1, + availability_status: 'online', + name: 'James Philip', + thumbnail: 'https://randomuser.me/api/portraits/men/4.jpg', + }, +}; diff --git a/app/javascript/shared/components/ui/MultiselectDropdownItems.stories.js b/app/javascript/shared/components/ui/MultiselectDropdownItems.stories.js new file mode 100644 index 000000000..a3f057eaa --- /dev/null +++ b/app/javascript/shared/components/ui/MultiselectDropdownItems.stories.js @@ -0,0 +1,67 @@ +import { action } from '@storybook/addon-actions'; +import DropdownItems from './MultiselectDropdownItems'; + +export default { + title: 'Components/Dropdown/Multiselect Dropdown Items', + component: DropdownItems, + argTypes: { + options: { + control: { + type: 'object', + }, + }, + selectedItem: { + control: { + type: 'object', + }, + }, + inputPlaceholder: { + control: { + type: 'text', + }, + }, + noSearchResult: { + control: { + type: 'text', + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { DropdownItems }, + template: + '', +}); + +export const MultiselectDropdownItems = Template.bind({}); +MultiselectDropdownItems.args = { + onClick: action('Added'), + options: [ + { + id: '0', + name: 'None', + thumbnail: '', + }, + { + id: '1', + name: 'James Philip', + availability_status: 'online', + role: 'administrator', + thumbnail: 'https://randomuser.me/api/portraits/men/4.jpg', + }, + { + id: '2', + name: 'Support Team', + thumbnail: '', + }, + { + id: '3', + name: 'Agent', + thumbnail: '', + }, + ], + + selectedItem: { id: '1' }, +}; diff --git a/app/javascript/shared/components/ui/MultiselectDropdownItems.vue b/app/javascript/shared/components/ui/MultiselectDropdownItems.vue new file mode 100644 index 000000000..d95b013ef --- /dev/null +++ b/app/javascript/shared/components/ui/MultiselectDropdownItems.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/app/javascript/shared/components/ui/MutiselectDropdown.vue b/app/javascript/shared/components/ui/MutiselectDropdown.vue new file mode 100644 index 000000000..5f99a8dbd --- /dev/null +++ b/app/javascript/shared/components/ui/MutiselectDropdown.vue @@ -0,0 +1,165 @@ + + + + + From bed197998690a2429d5535acbbc6e9bb5d0bc355 Mon Sep 17 00:00:00 2001 From: Vishnu Narayanan Date: Fri, 25 Jun 2021 21:19:08 +0530 Subject: [PATCH 21/69] fix: rvm gpg key issue (#2514) sks-keyserver gpg pool is now deprecated due to GDPR issues and is no longer reliable. Switching to use ubuntu keyserver for the time being as this is the only server returning rvm maintainers gpg keys. --- deployment/setup_18.04.sh | 2 +- deployment/setup_20.04.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deployment/setup_18.04.sh b/deployment/setup_18.04.sh index 25af78256..d10cf7749 100644 --- a/deployment/setup_18.04.sh +++ b/deployment/setup_18.04.sh @@ -22,7 +22,7 @@ apt install -y \ adduser --disabled-login --gecos "" chatwoot sudo -i -u chatwoot bash << EOF -gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB +gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB curl -sSL https://get.rvm.io | bash -s stable EOF diff --git a/deployment/setup_20.04.sh b/deployment/setup_20.04.sh index c35855c9b..d6ddf7143 100644 --- a/deployment/setup_20.04.sh +++ b/deployment/setup_20.04.sh @@ -22,8 +22,8 @@ apt install -y \ adduser --disabled-login --gecos "" chatwoot -gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB -gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB +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 addgroup chatwoot rvm From ac657e3bf964c3614e9896b6e96e0bebf3f1984c Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Sat, 26 Jun 2021 11:50:40 +0530 Subject: [PATCH 22/69] fix: Remove style tags from email content (#2515) --- .../components/widgets/conversation/Message.vue | 12 ++++++------ .../conversation/helpers/EmailContentParser.js | 12 ++++++++++++ .../helpers/specs/EmailContentParser.spec.js | 13 +++++++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 app/javascript/dashboard/components/widgets/conversation/helpers/EmailContentParser.js create mode 100644 app/javascript/dashboard/components/widgets/conversation/helpers/specs/EmailContentParser.spec.js diff --git a/app/javascript/dashboard/components/widgets/conversation/Message.vue b/app/javascript/dashboard/components/widgets/conversation/Message.vue index e43b8e3e5..d5d6e9edf 100644 --- a/app/javascript/dashboard/components/widgets/conversation/Message.vue +++ b/app/javascript/dashboard/components/widgets/conversation/Message.vue @@ -76,6 +76,8 @@ import contentTypeMixin from 'shared/mixins/contentTypeMixin'; import BubbleActions from './bubble/Actions'; import { MESSAGE_TYPE, MESSAGE_STATUS } from 'shared/constants/messages'; import { generateBotMessageContent } from './helpers/botMessageContentHelper'; +import { stripStyleCharacters } from './helpers/EmailContentParser'; + export default { components: { BubbleActions, @@ -116,12 +118,10 @@ export default { } = this.contentAttributes; if ((replyHTMLContent || fullHTMLContent) && this.isIncoming) { - let parsedContent = new DOMParser().parseFromString( - replyHTMLContent || fullHTMLContent || '', - 'text/html' - ); - if (!parsedContent.getElementsByTagName('parsererror').length) { - return parsedContent.body.innerHTML; + let contentToBeParsed = replyHTMLContent || fullHTMLContent || ''; + const parsedContent = stripStyleCharacters(contentToBeParsed); + if (parsedContent) { + return parsedContent; } } return ( diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/EmailContentParser.js b/app/javascript/dashboard/components/widgets/conversation/helpers/EmailContentParser.js new file mode 100644 index 000000000..1f716fad1 --- /dev/null +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/EmailContentParser.js @@ -0,0 +1,12 @@ +export const stripStyleCharacters = emailContent => { + let contentToBeParsed = emailContent.replace(//g, ''); + contentToBeParsed = contentToBeParsed.replace(/style="(.*?)"/g, ''); + let parsedContent = new DOMParser().parseFromString( + contentToBeParsed, + 'text/html' + ); + if (!parsedContent.getElementsByTagName('parsererror').length) { + return parsedContent.body.innerHTML; + } + return ''; +}; diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/EmailContentParser.spec.js b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/EmailContentParser.spec.js new file mode 100644 index 000000000..663d31735 --- /dev/null +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/EmailContentParser.spec.js @@ -0,0 +1,13 @@ +import { stripStyleCharacters } from '../EmailContentParser'; + +describe('#stripStyleCharacters', () => { + it('remove style characters', () => { + expect( + stripStyleCharacters( + `\n
Test Content
\n` + ) + ).toEqual( + '\n
Test Content
\n' + ); + }); +}); From b705eb39e2a89ad8d2802a4ede6c90fcfcd18f12 Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Mon, 28 Jun 2021 18:32:01 +0530 Subject: [PATCH 23/69] fix: Add missing Cache-Control headers in the production config (#2518) --- config/environments/production.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/environments/production.rb b/config/environments/production.rb index c60fff3e6..fb6c124d8 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -21,6 +21,9 @@ Rails.application.configure do # Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. config.public_file_server.enabled = ActiveModel::Type::Boolean.new.cast(ENV.fetch('RAILS_SERVE_STATIC_FILES', true)) + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.year.to_i}" + } # Compress JavaScripts and CSS. # config.assets.js_compressor = :uglifier # config.assets.css_compressor = :sass From 044b6872a4f6cb66b953fd941dd7b7d82da8a65d Mon Sep 17 00:00:00 2001 From: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com> Date: Tue, 29 Jun 2021 11:19:08 +0530 Subject: [PATCH 24/69] feat: Add actions and API for deleting message via API (#2519) --- app/javascript/dashboard/api/inbox/message.js | 4 ++++ .../store/modules/conversations/actions.js | 14 ++++++++++++++ .../specs/conversations/actions.spec.js | 19 +++++++++++++++++++ .../dashboard/store/mutation-types.js | 1 + 4 files changed, 38 insertions(+) diff --git a/app/javascript/dashboard/api/inbox/message.js b/app/javascript/dashboard/api/inbox/message.js index 0020a4138..84e77fb8b 100644 --- a/app/javascript/dashboard/api/inbox/message.js +++ b/app/javascript/dashboard/api/inbox/message.js @@ -30,6 +30,10 @@ class MessageApi extends ApiClient { }); } + delete(conversationID, messageId) { + return axios.delete(`${this.url}/${conversationID}/messages/${messageId}`); + } + getPreviousMessages({ conversationId, before }) { return axios.get(`${this.url}/${conversationId}/messages`, { params: { before }, diff --git a/app/javascript/dashboard/store/modules/conversations/actions.js b/app/javascript/dashboard/store/modules/conversations/actions.js index e983ca2f2..042c3e2a1 100644 --- a/app/javascript/dashboard/store/modules/conversations/actions.js +++ b/app/javascript/dashboard/store/modules/conversations/actions.js @@ -178,6 +178,20 @@ const actions = { commit(types.default.ADD_MESSAGE, message); }, + deleteMessage: async function deleteLabels( + { commit }, + { conversationId, messageId } + ) { + try { + const response = await MessageApi.delete(conversationId, messageId); + const { data } = response; + // The delete message is actually deleting the content. + commit(types.default.ADD_MESSAGE, data); + } catch (error) { + throw new Error(error); + } + }, + addConversation({ commit, state, dispatch }, conversation) { const { currentInbox } = state; const { diff --git a/app/javascript/dashboard/store/modules/specs/conversations/actions.spec.js b/app/javascript/dashboard/store/modules/specs/conversations/actions.spec.js index a4e59f5c3..ad794611c 100644 --- a/app/javascript/dashboard/store/modules/specs/conversations/actions.spec.js +++ b/app/javascript/dashboard/store/modules/specs/conversations/actions.spec.js @@ -238,3 +238,22 @@ describe('#actions', () => { }); }); }); + +describe('#deleteMessage', () => { + it('sends correct actions if API is success', async () => { + const [conversationId, messageId] = [1, 1]; + axios.delete.mockResolvedValue({ data: { id: 1, content: 'deleted' } }); + await actions.deleteMessage({ commit }, { conversationId, messageId }); + expect(commit.mock.calls).toEqual([ + [types.default.ADD_MESSAGE, { id: 1, content: 'deleted' }], + ]); + }); + it('sends no actions if API is error', async () => { + const [conversationId, messageId] = [1, 1]; + axios.delete.mockRejectedValue({ message: 'Incorrect header' }); + await expect( + actions.deleteMessage({ commit }, { conversationId, messageId }) + ).rejects.toThrow(Error); + expect(commit.mock.calls).toEqual([]); + }); +}); diff --git a/app/javascript/dashboard/store/mutation-types.js b/app/javascript/dashboard/store/mutation-types.js index 657c6ec57..a61b14362 100755 --- a/app/javascript/dashboard/store/mutation-types.js +++ b/app/javascript/dashboard/store/mutation-types.js @@ -31,6 +31,7 @@ export default { ASSIGN_TEAM: 'ASSIGN_TEAM', SET_CHAT_META: 'SET_CHAT_META', ADD_MESSAGE: 'ADD_MESSAGE', + DELETE_MESSAGE: 'DELETE_MESSAGE', ADD_PENDING_MESSAGE: 'ADD_PENDING_MESSAGE', MARK_MESSAGE_READ: 'MARK_MESSAGE_READ', SET_PREVIOUS_CONVERSATIONS: 'SET_PREVIOUS_CONVERSATIONS', From 8027c69c1c781025c488ce82c2394ed2ca0bff1a Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Tue, 29 Jun 2021 14:32:57 +0530 Subject: [PATCH 25/69] chore: Change the notification text for mention notification type (#2534) --- app/helpers/message_format_helper.rb | 6 +++++ app/models/notification.rb | 3 ++- lib/regex_helper.rb | 1 + spec/helpers/message_format_helper_spec.rb | 11 +++++++++ spec/models/notification_spec.rb | 27 +++++++++++++++++++--- 5 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 app/helpers/message_format_helper.rb create mode 100644 spec/helpers/message_format_helper_spec.rb diff --git a/app/helpers/message_format_helper.rb b/app/helpers/message_format_helper.rb new file mode 100644 index 000000000..e27e61fce --- /dev/null +++ b/app/helpers/message_format_helper.rb @@ -0,0 +1,6 @@ +module MessageFormatHelper + include RegexHelper + def transform_user_mention_content(message_content) + message_content.gsub(MENTION_REGEX, '\1') + end +end diff --git a/app/models/notification.rb b/app/models/notification.rb index a92faf67e..752d03100 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -23,6 +23,7 @@ # class Notification < ApplicationRecord + include MessageFormatHelper belongs_to :account belongs_to :user @@ -73,7 +74,7 @@ class Notification < ApplicationRecord content: primary_actor.content&.truncate_words(10) ) when 'conversation_mention' - I18n.t('notifications.notification_title.conversation_mention', display_id: conversation.display_id, name: secondary_actor.name) + "[##{conversation.display_id}] #{transform_user_mention_content primary_actor.content}" else '' end diff --git a/lib/regex_helper.rb b/lib/regex_helper.rb index 88f2b2835..2bbd51809 100644 --- a/lib/regex_helper.rb +++ b/lib/regex_helper.rb @@ -5,4 +5,5 @@ module RegexHelper # valid unicode letter, unicode number, underscore, hyphen # shouldn't start with a underscore or hyphen UNICODE_CHARACTER_NUMBER_HYPHEN_UNDERSCORE = Regexp.new('\A[\p{L}\p{N}]+[\p{L}\p{N}_-]+\Z') + MENTION_REGEX = Regexp.new('\[(@[\w_. ]+)\]\(mention://(?:user|team)/\d+/(.*?)+\)') end diff --git a/spec/helpers/message_format_helper_spec.rb b/spec/helpers/message_format_helper_spec.rb new file mode 100644 index 000000000..a2edc38c0 --- /dev/null +++ b/spec/helpers/message_format_helper_spec.rb @@ -0,0 +1,11 @@ +require 'rails_helper' + +describe MessageFormatHelper, type: :helper do + describe '#transform_user_mention_content' do + context 'when transform_user_mention_content called' do + it 'return transormed text correctly' do + expect(helper.transform_user_mention_content('[@john](mention://user/1/John%20K), check this ticket')).to eq '@john, check this ticket' + end + end + end +end diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb index be10fc411..8b37b7c75 100644 --- a/spec/models/notification_spec.rb +++ b/spec/models/notification_spec.rb @@ -50,11 +50,32 @@ RSpec.describe Notification do end it 'returns appropriate title suited for the notification type conversation_mention' do - message = create(:message, sender: create(:user)) + message = create(:message, sender: create(:user), content: 'Hey [@John](mention://user/1/john), can you check this ticket?') notification = create(:notification, notification_type: 'conversation_mention', primary_actor: message, secondary_actor: message.sender) - expect(notification.push_message_title).to eq "You have been mentioned in conversation [ID - #{message.conversation.display_id}] \ -by #{message.sender.name}" + expect(notification.push_message_title).to eq "[##{message.conversation.display_id}] Hey @John, can you check this ticket?" + end + + it 'returns appropriate title suited for the notification type conversation_mention having multiple mentions' do + message = create( + :message, sender: + create(:user), + content: 'Hey [@John](mention://user/1/john), [@Alisha Peter](mention://user/2/alisha) can you check this ticket?' + ) + notification = create(:notification, notification_type: 'conversation_mention', primary_actor: message, secondary_actor: message.sender) + + expect(notification.push_message_title).to eq "[##{message.conversation.display_id}] Hey @John, @Alisha Peter can you check this ticket?" + end + + it 'returns appropriate title suited for the notification type conversation_mention if username contains white space' do + message = create( + :message, sender: + create(:user), + content: 'Hey [@John Peter](mention://user/1/john%20K) please check this?' + ) + notification = create(:notification, notification_type: 'conversation_mention', primary_actor: message, secondary_actor: message.sender) + + expect(notification.push_message_title).to eq "[##{message.conversation.display_id}] Hey @John Peter please check this?" end end end From 07a422219a8d62f95e29e6dd4066b78e0ce88442 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Tue, 29 Jun 2021 18:12:33 +0530 Subject: [PATCH 26/69] chore: New translation updates (#2533) Co-authored-by: Muhsin Keloth --- .../dashboard/i18n/locale/ar/agentMgmt.json | 2 +- .../dashboard/i18n/locale/ar/contact.json | 1 + .../i18n/locale/ar/conversation.json | 2 + .../dashboard/i18n/locale/ar/csatMgmt.json | 6 +++ .../i18n/locale/ar/integrations.json | 6 +++ .../dashboard/i18n/locale/ar/settings.json | 4 +- .../dashboard/i18n/locale/ca/agentMgmt.json | 2 +- .../dashboard/i18n/locale/ca/contact.json | 1 + .../i18n/locale/ca/conversation.json | 2 + .../dashboard/i18n/locale/ca/csatMgmt.json | 6 +++ .../i18n/locale/ca/integrations.json | 6 +++ .../dashboard/i18n/locale/ca/settings.json | 4 +- .../dashboard/i18n/locale/cs/agentMgmt.json | 2 +- .../dashboard/i18n/locale/cs/contact.json | 1 + .../i18n/locale/cs/conversation.json | 2 + .../dashboard/i18n/locale/cs/csatMgmt.json | 6 +++ .../i18n/locale/cs/integrations.json | 6 +++ .../dashboard/i18n/locale/cs/settings.json | 4 +- .../dashboard/i18n/locale/da/agentMgmt.json | 2 +- .../dashboard/i18n/locale/da/contact.json | 1 + .../i18n/locale/da/conversation.json | 2 + .../dashboard/i18n/locale/da/csatMgmt.json | 6 +++ .../i18n/locale/da/integrations.json | 6 +++ .../dashboard/i18n/locale/da/settings.json | 4 +- .../dashboard/i18n/locale/de/agentMgmt.json | 2 +- .../dashboard/i18n/locale/de/contact.json | 1 + .../i18n/locale/de/conversation.json | 2 + .../dashboard/i18n/locale/de/csatMgmt.json | 6 +++ .../i18n/locale/de/integrations.json | 6 +++ .../dashboard/i18n/locale/de/settings.json | 4 +- .../dashboard/i18n/locale/el/agentMgmt.json | 2 +- .../dashboard/i18n/locale/el/contact.json | 1 + .../i18n/locale/el/conversation.json | 2 + .../dashboard/i18n/locale/el/csatMgmt.json | 6 +++ .../i18n/locale/el/integrations.json | 6 +++ .../dashboard/i18n/locale/el/settings.json | 4 +- .../dashboard/i18n/locale/es/agentMgmt.json | 2 +- .../dashboard/i18n/locale/es/contact.json | 1 + .../i18n/locale/es/conversation.json | 2 + .../dashboard/i18n/locale/es/csatMgmt.json | 6 +++ .../i18n/locale/es/integrations.json | 6 +++ .../dashboard/i18n/locale/es/settings.json | 4 +- .../dashboard/i18n/locale/fa/agentMgmt.json | 2 +- .../dashboard/i18n/locale/fa/contact.json | 1 + .../i18n/locale/fa/conversation.json | 2 + .../dashboard/i18n/locale/fa/csatMgmt.json | 6 +++ .../i18n/locale/fa/integrations.json | 6 +++ .../dashboard/i18n/locale/fa/settings.json | 4 +- .../dashboard/i18n/locale/fi/agentMgmt.json | 2 +- .../dashboard/i18n/locale/fi/contact.json | 1 + .../i18n/locale/fi/conversation.json | 2 + .../dashboard/i18n/locale/fi/csatMgmt.json | 6 +++ .../i18n/locale/fi/integrations.json | 6 +++ .../dashboard/i18n/locale/fi/settings.json | 4 +- .../dashboard/i18n/locale/fr/agentMgmt.json | 2 +- .../dashboard/i18n/locale/fr/contact.json | 1 + .../i18n/locale/fr/conversation.json | 2 + .../dashboard/i18n/locale/fr/csatMgmt.json | 6 +++ .../i18n/locale/fr/integrations.json | 6 +++ .../dashboard/i18n/locale/fr/settings.json | 4 +- .../dashboard/i18n/locale/he/agentMgmt.json | 2 +- .../dashboard/i18n/locale/he/contact.json | 1 + .../i18n/locale/he/conversation.json | 2 + .../dashboard/i18n/locale/he/csatMgmt.json | 6 +++ .../i18n/locale/he/integrations.json | 6 +++ .../dashboard/i18n/locale/he/settings.json | 4 +- .../dashboard/i18n/locale/hi/agentMgmt.json | 2 +- .../dashboard/i18n/locale/hi/contact.json | 1 + .../i18n/locale/hi/conversation.json | 2 + .../dashboard/i18n/locale/hi/csatMgmt.json | 6 +++ .../i18n/locale/hi/integrations.json | 6 +++ .../dashboard/i18n/locale/hi/settings.json | 4 +- .../dashboard/i18n/locale/hu/agentMgmt.json | 2 +- .../dashboard/i18n/locale/hu/contact.json | 1 + .../i18n/locale/hu/conversation.json | 2 + .../dashboard/i18n/locale/hu/csatMgmt.json | 6 +++ .../i18n/locale/hu/integrations.json | 6 +++ .../dashboard/i18n/locale/hu/settings.json | 4 +- .../dashboard/i18n/locale/id/agentMgmt.json | 2 +- .../dashboard/i18n/locale/id/contact.json | 1 + .../i18n/locale/id/conversation.json | 2 + .../dashboard/i18n/locale/id/csatMgmt.json | 6 +++ .../i18n/locale/id/integrations.json | 6 +++ .../dashboard/i18n/locale/id/settings.json | 4 +- .../dashboard/i18n/locale/it/agentMgmt.json | 2 +- .../dashboard/i18n/locale/it/contact.json | 1 + .../i18n/locale/it/conversation.json | 2 + .../dashboard/i18n/locale/it/csatMgmt.json | 6 +++ .../i18n/locale/it/integrations.json | 6 +++ .../dashboard/i18n/locale/it/settings.json | 4 +- .../dashboard/i18n/locale/ja/agentMgmt.json | 2 +- .../dashboard/i18n/locale/ja/contact.json | 1 + .../i18n/locale/ja/conversation.json | 2 + .../dashboard/i18n/locale/ja/csatMgmt.json | 6 +++ .../i18n/locale/ja/integrations.json | 6 +++ .../dashboard/i18n/locale/ja/settings.json | 4 +- .../dashboard/i18n/locale/ko/agentMgmt.json | 2 +- .../dashboard/i18n/locale/ko/contact.json | 1 + .../i18n/locale/ko/conversation.json | 2 + .../dashboard/i18n/locale/ko/csatMgmt.json | 6 +++ .../i18n/locale/ko/integrations.json | 6 +++ .../dashboard/i18n/locale/ko/settings.json | 4 +- .../dashboard/i18n/locale/ml/agentMgmt.json | 2 +- .../dashboard/i18n/locale/ml/contact.json | 1 + .../i18n/locale/ml/conversation.json | 2 + .../dashboard/i18n/locale/ml/csatMgmt.json | 6 +++ .../i18n/locale/ml/integrations.json | 6 +++ .../dashboard/i18n/locale/ml/settings.json | 4 +- .../dashboard/i18n/locale/ne/agentMgmt.json | 2 +- .../dashboard/i18n/locale/ne/contact.json | 1 + .../i18n/locale/ne/conversation.json | 2 + .../dashboard/i18n/locale/ne/csatMgmt.json | 6 +++ .../i18n/locale/ne/integrations.json | 6 +++ .../dashboard/i18n/locale/ne/settings.json | 4 +- .../dashboard/i18n/locale/nl/agentMgmt.json | 2 +- .../dashboard/i18n/locale/nl/contact.json | 1 + .../i18n/locale/nl/conversation.json | 2 + .../dashboard/i18n/locale/nl/csatMgmt.json | 6 +++ .../i18n/locale/nl/integrations.json | 6 +++ .../dashboard/i18n/locale/nl/settings.json | 4 +- .../dashboard/i18n/locale/no/agentMgmt.json | 2 +- .../dashboard/i18n/locale/no/contact.json | 1 + .../i18n/locale/no/conversation.json | 2 + .../dashboard/i18n/locale/no/csatMgmt.json | 6 +++ .../i18n/locale/no/integrations.json | 6 +++ .../dashboard/i18n/locale/no/settings.json | 4 +- .../dashboard/i18n/locale/pl/agentMgmt.json | 2 +- .../dashboard/i18n/locale/pl/contact.json | 1 + .../i18n/locale/pl/conversation.json | 2 + .../dashboard/i18n/locale/pl/csatMgmt.json | 6 +++ .../i18n/locale/pl/integrations.json | 6 +++ .../dashboard/i18n/locale/pl/settings.json | 4 +- .../dashboard/i18n/locale/pt/agentMgmt.json | 2 +- .../dashboard/i18n/locale/pt/contact.json | 1 + .../i18n/locale/pt/conversation.json | 2 + .../dashboard/i18n/locale/pt/csatMgmt.json | 6 +++ .../i18n/locale/pt/integrations.json | 6 +++ .../dashboard/i18n/locale/pt/settings.json | 4 +- .../i18n/locale/pt_BR/agentMgmt.json | 2 +- .../dashboard/i18n/locale/pt_BR/contact.json | 15 +++--- .../i18n/locale/pt_BR/conversation.json | 4 +- .../dashboard/i18n/locale/pt_BR/csatMgmt.json | 6 +++ .../i18n/locale/pt_BR/inboxMgmt.json | 10 ++-- .../i18n/locale/pt_BR/integrationApps.json | 30 ++++++------ .../i18n/locale/pt_BR/integrations.json | 12 +++-- .../dashboard/i18n/locale/pt_BR/settings.json | 4 +- .../dashboard/i18n/locale/ro/agentMgmt.json | 2 +- .../dashboard/i18n/locale/ro/contact.json | 1 + .../i18n/locale/ro/conversation.json | 2 + .../dashboard/i18n/locale/ro/csatMgmt.json | 6 +++ .../i18n/locale/ro/integrations.json | 6 +++ .../dashboard/i18n/locale/ro/settings.json | 4 +- .../dashboard/i18n/locale/ru/agentMgmt.json | 2 +- .../dashboard/i18n/locale/ru/contact.json | 1 + .../i18n/locale/ru/conversation.json | 2 + .../dashboard/i18n/locale/ru/csatMgmt.json | 6 +++ .../i18n/locale/ru/integrations.json | 6 +++ .../dashboard/i18n/locale/ru/settings.json | 4 +- .../dashboard/i18n/locale/sk/agentMgmt.json | 2 +- .../dashboard/i18n/locale/sk/contact.json | 1 + .../i18n/locale/sk/conversation.json | 2 + .../dashboard/i18n/locale/sk/csatMgmt.json | 6 +++ .../i18n/locale/sk/integrations.json | 6 +++ .../dashboard/i18n/locale/sk/settings.json | 4 +- .../dashboard/i18n/locale/sv/agentMgmt.json | 2 +- .../dashboard/i18n/locale/sv/contact.json | 1 + .../i18n/locale/sv/conversation.json | 2 + .../dashboard/i18n/locale/sv/csatMgmt.json | 6 +++ .../i18n/locale/sv/integrations.json | 6 +++ .../dashboard/i18n/locale/sv/settings.json | 4 +- .../dashboard/i18n/locale/ta/agentMgmt.json | 2 +- .../dashboard/i18n/locale/ta/contact.json | 1 + .../i18n/locale/ta/conversation.json | 2 + .../dashboard/i18n/locale/ta/csatMgmt.json | 6 +++ .../i18n/locale/ta/integrations.json | 6 +++ .../dashboard/i18n/locale/ta/settings.json | 4 +- .../dashboard/i18n/locale/th/agentMgmt.json | 2 +- .../dashboard/i18n/locale/th/contact.json | 1 + .../i18n/locale/th/conversation.json | 2 + .../dashboard/i18n/locale/th/csatMgmt.json | 6 +++ .../i18n/locale/th/integrations.json | 6 +++ .../dashboard/i18n/locale/th/settings.json | 4 +- .../dashboard/i18n/locale/tr/agentMgmt.json | 2 +- .../dashboard/i18n/locale/tr/contact.json | 1 + .../i18n/locale/tr/conversation.json | 2 + .../dashboard/i18n/locale/tr/csatMgmt.json | 6 +++ .../i18n/locale/tr/integrations.json | 6 +++ .../dashboard/i18n/locale/tr/settings.json | 4 +- .../dashboard/i18n/locale/uk/agentMgmt.json | 2 +- .../dashboard/i18n/locale/uk/contact.json | 1 + .../i18n/locale/uk/conversation.json | 2 + .../dashboard/i18n/locale/uk/csatMgmt.json | 6 +++ .../i18n/locale/uk/integrations.json | 6 +++ .../dashboard/i18n/locale/uk/settings.json | 4 +- .../dashboard/i18n/locale/vi/agentMgmt.json | 2 +- .../dashboard/i18n/locale/vi/campaign.json | 2 +- .../dashboard/i18n/locale/vi/chatlist.json | 4 +- .../dashboard/i18n/locale/vi/contact.json | 5 +- .../i18n/locale/vi/conversation.json | 2 + .../dashboard/i18n/locale/vi/csatMgmt.json | 6 +++ .../i18n/locale/vi/integrations.json | 6 +++ .../dashboard/i18n/locale/vi/settings.json | 4 +- .../i18n/locale/zh_CN/agentMgmt.json | 2 +- .../dashboard/i18n/locale/zh_CN/campaign.json | 4 +- .../dashboard/i18n/locale/zh_CN/contact.json | 47 ++++++++++--------- .../i18n/locale/zh_CN/conversation.json | 2 + .../dashboard/i18n/locale/zh_CN/csatMgmt.json | 6 +++ .../i18n/locale/zh_CN/integrations.json | 6 +++ .../dashboard/i18n/locale/zh_CN/settings.json | 4 +- .../i18n/locale/zh_TW/agentMgmt.json | 2 +- .../dashboard/i18n/locale/zh_TW/contact.json | 1 + .../i18n/locale/zh_TW/conversation.json | 2 + .../dashboard/i18n/locale/zh_TW/csatMgmt.json | 6 +++ .../i18n/locale/zh_TW/integrations.json | 6 +++ .../dashboard/i18n/locale/zh_TW/settings.json | 4 +- app/javascript/widget/i18n/locale/ar.json | 5 ++ app/javascript/widget/i18n/locale/ca.json | 5 ++ app/javascript/widget/i18n/locale/cs.json | 5 ++ app/javascript/widget/i18n/locale/da.json | 5 ++ app/javascript/widget/i18n/locale/de.json | 5 ++ app/javascript/widget/i18n/locale/el.json | 5 ++ app/javascript/widget/i18n/locale/es.json | 5 ++ app/javascript/widget/i18n/locale/fa.json | 5 ++ app/javascript/widget/i18n/locale/fi.json | 5 ++ app/javascript/widget/i18n/locale/fr.json | 5 ++ app/javascript/widget/i18n/locale/he.json | 5 ++ app/javascript/widget/i18n/locale/hi.json | 5 ++ app/javascript/widget/i18n/locale/hu.json | 5 ++ app/javascript/widget/i18n/locale/id.json | 5 ++ app/javascript/widget/i18n/locale/it.json | 5 ++ app/javascript/widget/i18n/locale/ja.json | 5 ++ app/javascript/widget/i18n/locale/ko.json | 5 ++ app/javascript/widget/i18n/locale/ml.json | 5 ++ app/javascript/widget/i18n/locale/ne.json | 5 ++ app/javascript/widget/i18n/locale/nl.json | 5 ++ app/javascript/widget/i18n/locale/no.json | 5 ++ app/javascript/widget/i18n/locale/pl.json | 5 ++ app/javascript/widget/i18n/locale/pt.json | 5 ++ app/javascript/widget/i18n/locale/pt_BR.json | 5 ++ app/javascript/widget/i18n/locale/ro.json | 5 ++ app/javascript/widget/i18n/locale/ru.json | 5 ++ app/javascript/widget/i18n/locale/sk.json | 5 ++ app/javascript/widget/i18n/locale/sv.json | 5 ++ app/javascript/widget/i18n/locale/ta.json | 5 ++ app/javascript/widget/i18n/locale/th.json | 5 ++ app/javascript/widget/i18n/locale/tr.json | 5 ++ app/javascript/widget/i18n/locale/uk.json | 5 ++ app/javascript/widget/i18n/locale/vi.json | 5 ++ app/javascript/widget/i18n/locale/zh_CN.json | 31 +++++++----- app/javascript/widget/i18n/locale/zh_TW.json | 5 ++ config/locales/ar.yml | 1 + config/locales/ca.yml | 1 + config/locales/cs.yml | 1 + config/locales/da.yml | 1 + config/locales/de.yml | 1 + config/locales/el.yml | 1 + config/locales/es.yml | 1 + config/locales/fa.yml | 1 + config/locales/fi.yml | 1 + config/locales/fr.yml | 1 + config/locales/he.yml | 1 + config/locales/hi.yml | 1 + config/locales/hu.yml | 1 + config/locales/id.yml | 1 + config/locales/it.yml | 1 + config/locales/ja.yml | 1 + config/locales/ko.yml | 1 + config/locales/ml.yml | 1 + config/locales/ne.yml | 1 + config/locales/nl.yml | 1 + config/locales/no.yml | 1 + config/locales/pl.yml | 1 + config/locales/pt.yml | 1 + config/locales/pt_BR.yml | 5 +- config/locales/ro.yml | 1 + config/locales/ru.yml | 1 + config/locales/sk.yml | 1 + config/locales/sv.yml | 1 + config/locales/ta.yml | 1 + config/locales/th.yml | 1 + config/locales/tr.yml | 1 + config/locales/uk.yml | 1 + config/locales/vi.yml | 1 + config/locales/zh_CN.yml | 1 + config/locales/zh_TW.yml | 1 + 285 files changed, 951 insertions(+), 146 deletions(-) create mode 100644 app/javascript/dashboard/i18n/locale/ar/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ca/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/cs/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/da/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/de/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/el/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/es/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/fa/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/fi/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/fr/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/he/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/hi/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/hu/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/id/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/it/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ja/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ko/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ml/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ne/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/nl/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/no/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/pl/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/pt/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/pt_BR/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ro/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ru/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/sk/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/sv/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/ta/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/th/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/tr/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/uk/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/vi/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/zh_CN/csatMgmt.json create mode 100644 app/javascript/dashboard/i18n/locale/zh_TW/csatMgmt.json diff --git a/app/javascript/dashboard/i18n/locale/ar/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ar/agentMgmt.json index a8cd89474..3a82adb0a 100644 --- a/app/javascript/dashboard/i18n/locale/ar/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ar/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "لم يتم العثور على موظفين." + "NO_RESULTS": "لم يتم العثور على النتائج." } } } diff --git a/app/javascript/dashboard/i18n/locale/ar/contact.json b/app/javascript/dashboard/i18n/locale/ar/contact.json index b4b4d394a..0de4ad81a 100644 --- a/app/javascript/dashboard/i18n/locale/ar/contact.json +++ b/app/javascript/dashboard/i18n/locale/ar/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "جاري تحميل جهات الاتصال...", "404": "لا توجد جهات اتصال تطابق بحثك 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "الاسم", "PHONE_NUMBER": "رقم الهاتف", diff --git a/app/javascript/dashboard/i18n/locale/ar/conversation.json b/app/javascript/dashboard/i18n/locale/ar/conversation.json index 99c38282c..871a10786 100644 --- a/app/javascript/dashboard/i18n/locale/ar/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ar/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "تنزيل", "UPLOADING_ATTACHMENTS": "جاري تحميل المرفقات...", "NO_RESPONSE": "لا توجد استجابة", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "إغلاق المحادثة", "REOPEN_ACTION": "إعادة فتح", diff --git a/app/javascript/dashboard/i18n/locale/ar/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ar/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ar/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ar/integrations.json b/app/javascript/dashboard/i18n/locale/ar/integrations.json index a0805e5f7..812ef9391 100644 --- a/app/javascript/dashboard/i18n/locale/ar/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ar/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "حذف", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ar/settings.json b/app/javascript/dashboard/i18n/locale/ar/settings.json index 48f45bcdf..95197cec7 100644 --- a/app/javascript/dashboard/i18n/locale/ar/settings.json +++ b/app/javascript/dashboard/i18n/locale/ar/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "إعدادات الحساب", "APPLICATIONS": "Applications", "LABELS": "الوسوم", - "TEAMS": "الفرق" + "TEAMS": "الفرق", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "حساب جديد", diff --git a/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json index 9fb6b933b..efb044f94 100644 --- a/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ca/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No s'han trobat agents." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ca/contact.json b/app/javascript/dashboard/i18n/locale/ca/contact.json index c39462d78..554d686ec 100644 --- a/app/javascript/dashboard/i18n/locale/ca/contact.json +++ b/app/javascript/dashboard/i18n/locale/ca/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Carregant contactes...", "404": "No hi ha cap contacte que coincideixi amb la vostra cerca 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nom", "PHONE_NUMBER": "Número de telèfon", diff --git a/app/javascript/dashboard/i18n/locale/ca/conversation.json b/app/javascript/dashboard/i18n/locale/ca/conversation.json index bd4ecd3e4..5fb54a674 100644 --- a/app/javascript/dashboard/i18n/locale/ca/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ca/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Descarrega", "UPLOADING_ATTACHMENTS": "Pujant fitxers adjunts...", "NO_RESPONSE": "Sense resposta", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resoldre", "REOPEN_ACTION": "Tornar a obrir", diff --git a/app/javascript/dashboard/i18n/locale/ca/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ca/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ca/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ca/integrations.json b/app/javascript/dashboard/i18n/locale/ca/integrations.json index 6a155d0c2..af8cd6b59 100644 --- a/app/javascript/dashboard/i18n/locale/ca/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ca/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Suprimeix", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ca/settings.json b/app/javascript/dashboard/i18n/locale/ca/settings.json index 2a136cfb4..08467b9ed 100644 --- a/app/javascript/dashboard/i18n/locale/ca/settings.json +++ b/app/javascript/dashboard/i18n/locale/ca/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Configuració del compte", "APPLICATIONS": "Applications", "LABELS": "Etiquetes", - "TEAMS": "Equips" + "TEAMS": "Equips", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Compte nou", diff --git a/app/javascript/dashboard/i18n/locale/cs/agentMgmt.json b/app/javascript/dashboard/i18n/locale/cs/agentMgmt.json index 27a254d85..c9e245c09 100644 --- a/app/javascript/dashboard/i18n/locale/cs/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/cs/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nebyli nalezeni žádní agenti." + "NO_RESULTS": "Žádné výsledky." } } } diff --git a/app/javascript/dashboard/i18n/locale/cs/contact.json b/app/javascript/dashboard/i18n/locale/cs/contact.json index 5c105ad8c..efb3920e6 100644 --- a/app/javascript/dashboard/i18n/locale/cs/contact.json +++ b/app/javascript/dashboard/i18n/locale/cs/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Načítání kontaktů...", "404": "Vašemu hledání neodpovídají žádné kontakty 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Název", "PHONE_NUMBER": "Telefonní číslo", diff --git a/app/javascript/dashboard/i18n/locale/cs/conversation.json b/app/javascript/dashboard/i18n/locale/cs/conversation.json index 14b17cf7e..73205f9a0 100644 --- a/app/javascript/dashboard/i18n/locale/cs/conversation.json +++ b/app/javascript/dashboard/i18n/locale/cs/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Stáhnout", "UPLOADING_ATTACHMENTS": "Nahrávání příloh...", "NO_RESPONSE": "Bez odpovědi", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Vyřešit", "REOPEN_ACTION": "Znovu otevřít", diff --git a/app/javascript/dashboard/i18n/locale/cs/csatMgmt.json b/app/javascript/dashboard/i18n/locale/cs/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/cs/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/cs/integrations.json b/app/javascript/dashboard/i18n/locale/cs/integrations.json index 86fa337b7..7cf53accb 100644 --- a/app/javascript/dashboard/i18n/locale/cs/integrations.json +++ b/app/javascript/dashboard/i18n/locale/cs/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Vymazat", "API": { diff --git a/app/javascript/dashboard/i18n/locale/cs/settings.json b/app/javascript/dashboard/i18n/locale/cs/settings.json index 059c2fd1d..33e6ac244 100644 --- a/app/javascript/dashboard/i18n/locale/cs/settings.json +++ b/app/javascript/dashboard/i18n/locale/cs/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Nastavení účtu", "APPLICATIONS": "Applications", "LABELS": "Štítky", - "TEAMS": "Týmy" + "TEAMS": "Týmy", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Nový účet", diff --git a/app/javascript/dashboard/i18n/locale/da/agentMgmt.json b/app/javascript/dashboard/i18n/locale/da/agentMgmt.json index 323d54a2a..ccc198e16 100644 --- a/app/javascript/dashboard/i18n/locale/da/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/da/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Ingen agenter fundet." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/da/contact.json b/app/javascript/dashboard/i18n/locale/da/contact.json index a678d9a6e..8ede1ef5f 100644 --- a/app/javascript/dashboard/i18n/locale/da/contact.json +++ b/app/javascript/dashboard/i18n/locale/da/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Indlæser kontakter...", "404": "Ingen kontakter matcher din søgning 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Navn", "PHONE_NUMBER": "Telefonnummer", diff --git a/app/javascript/dashboard/i18n/locale/da/conversation.json b/app/javascript/dashboard/i18n/locale/da/conversation.json index b6e38aa30..2cc420d6c 100644 --- a/app/javascript/dashboard/i18n/locale/da/conversation.json +++ b/app/javascript/dashboard/i18n/locale/da/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Løs", "REOPEN_ACTION": "Genåben", diff --git a/app/javascript/dashboard/i18n/locale/da/csatMgmt.json b/app/javascript/dashboard/i18n/locale/da/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/da/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/da/integrations.json b/app/javascript/dashboard/i18n/locale/da/integrations.json index 42d160f93..3d8b0629c 100644 --- a/app/javascript/dashboard/i18n/locale/da/integrations.json +++ b/app/javascript/dashboard/i18n/locale/da/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Slet", "API": { diff --git a/app/javascript/dashboard/i18n/locale/da/settings.json b/app/javascript/dashboard/i18n/locale/da/settings.json index fd2aecb8a..464bfa337 100644 --- a/app/javascript/dashboard/i18n/locale/da/settings.json +++ b/app/javascript/dashboard/i18n/locale/da/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Kontoindstillinger", "APPLICATIONS": "Applications", "LABELS": "Etiketter", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Ny Konto", diff --git a/app/javascript/dashboard/i18n/locale/de/agentMgmt.json b/app/javascript/dashboard/i18n/locale/de/agentMgmt.json index dd996a20e..3e3cbd234 100644 --- a/app/javascript/dashboard/i18n/locale/de/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/de/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Keine Agenten gefunden." + "NO_RESULTS": "Keine Ergebnisse gefunden." } } } diff --git a/app/javascript/dashboard/i18n/locale/de/contact.json b/app/javascript/dashboard/i18n/locale/de/contact.json index b81a85a2d..bce763959 100644 --- a/app/javascript/dashboard/i18n/locale/de/contact.json +++ b/app/javascript/dashboard/i18n/locale/de/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Kontakte werden geladen...", "404": "Keine Kontakte entsprechend Deiner Suche gefunden 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Name", "PHONE_NUMBER": "Telefonnummer", diff --git a/app/javascript/dashboard/i18n/locale/de/conversation.json b/app/javascript/dashboard/i18n/locale/de/conversation.json index 757798fa9..ecf42f1b1 100644 --- a/app/javascript/dashboard/i18n/locale/de/conversation.json +++ b/app/javascript/dashboard/i18n/locale/de/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Herunterladen", "UPLOADING_ATTACHMENTS": "Anhänge werden hochgeladen...", "NO_RESPONSE": "Keine Antwort", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Fall schließen", "REOPEN_ACTION": "Wieder öffnen", diff --git a/app/javascript/dashboard/i18n/locale/de/csatMgmt.json b/app/javascript/dashboard/i18n/locale/de/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/de/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/de/integrations.json b/app/javascript/dashboard/i18n/locale/de/integrations.json index a330bd221..9c3ba40f5 100644 --- a/app/javascript/dashboard/i18n/locale/de/integrations.json +++ b/app/javascript/dashboard/i18n/locale/de/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Löschen", "API": { diff --git a/app/javascript/dashboard/i18n/locale/de/settings.json b/app/javascript/dashboard/i18n/locale/de/settings.json index 02480427b..a46dca51c 100644 --- a/app/javascript/dashboard/i18n/locale/de/settings.json +++ b/app/javascript/dashboard/i18n/locale/de/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Kontoeinstellungen", "APPLICATIONS": "Anwendungen", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Neuer Account", diff --git a/app/javascript/dashboard/i18n/locale/el/agentMgmt.json b/app/javascript/dashboard/i18n/locale/el/agentMgmt.json index 80c935285..c580772d3 100644 --- a/app/javascript/dashboard/i18n/locale/el/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/el/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Δεν βρέθηκαν Πράκτορες." + "NO_RESULTS": "Δεν βρέθηκαν αποτελέσματα." } } } diff --git a/app/javascript/dashboard/i18n/locale/el/contact.json b/app/javascript/dashboard/i18n/locale/el/contact.json index 1e50c3f9f..fdf0dac36 100644 --- a/app/javascript/dashboard/i18n/locale/el/contact.json +++ b/app/javascript/dashboard/i18n/locale/el/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Φόρτωση επαφών...", "404": "Δεν υπάρχουν επαφές που να αντιστοιχούν με την αναζήτησή σας 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Όνομα", "PHONE_NUMBER": "Αριθμός Τηλεφώνου", diff --git a/app/javascript/dashboard/i18n/locale/el/conversation.json b/app/javascript/dashboard/i18n/locale/el/conversation.json index 0b8925564..bb13cb4b1 100644 --- a/app/javascript/dashboard/i18n/locale/el/conversation.json +++ b/app/javascript/dashboard/i18n/locale/el/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Κατέβασμα", "UPLOADING_ATTACHMENTS": "Ανέβασμα επισυναπτόμενων...", "NO_RESPONSE": "Καμία ανταπόκριση", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Επίλυση", "REOPEN_ACTION": "Επαναφορά", diff --git a/app/javascript/dashboard/i18n/locale/el/csatMgmt.json b/app/javascript/dashboard/i18n/locale/el/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/el/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/el/integrations.json b/app/javascript/dashboard/i18n/locale/el/integrations.json index 7f5f7b6f2..c8fdee29f 100644 --- a/app/javascript/dashboard/i18n/locale/el/integrations.json +++ b/app/javascript/dashboard/i18n/locale/el/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Διαγραφή", "API": { diff --git a/app/javascript/dashboard/i18n/locale/el/settings.json b/app/javascript/dashboard/i18n/locale/el/settings.json index d6875e198..eeddb966f 100644 --- a/app/javascript/dashboard/i18n/locale/el/settings.json +++ b/app/javascript/dashboard/i18n/locale/el/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Ρυθμίσεις Λογαριασμού", "APPLICATIONS": "Εφαρμογές", "LABELS": "Ετικέτες", - "TEAMS": "Ομάδες" + "TEAMS": "Ομάδες", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Νέος Λογαριασμός", diff --git a/app/javascript/dashboard/i18n/locale/es/agentMgmt.json b/app/javascript/dashboard/i18n/locale/es/agentMgmt.json index 4c8fc3226..d089308c6 100644 --- a/app/javascript/dashboard/i18n/locale/es/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/es/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No se encontraron agentes." + "NO_RESULTS": "No se encontraron resultados." } } } diff --git a/app/javascript/dashboard/i18n/locale/es/contact.json b/app/javascript/dashboard/i18n/locale/es/contact.json index 6bf649381..7ecbebb0c 100644 --- a/app/javascript/dashboard/i18n/locale/es/contact.json +++ b/app/javascript/dashboard/i18n/locale/es/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Cargando contactos...", "404": "No hay contactos que coincidan con tu búsqueda 🔍", + "NO_CONTACTS": "No hay contactos disponibles", "TABLE_HEADER": { "NAME": "Nombre", "PHONE_NUMBER": "Número telefónico", diff --git a/app/javascript/dashboard/i18n/locale/es/conversation.json b/app/javascript/dashboard/i18n/locale/es/conversation.json index 0b7318d67..cb7f609b4 100644 --- a/app/javascript/dashboard/i18n/locale/es/conversation.json +++ b/app/javascript/dashboard/i18n/locale/es/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Descargar", "UPLOADING_ATTACHMENTS": "Subiendo archivos adjuntos...", "NO_RESPONSE": "No hay respuesta", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolver", "REOPEN_ACTION": "Reabrir", diff --git a/app/javascript/dashboard/i18n/locale/es/csatMgmt.json b/app/javascript/dashboard/i18n/locale/es/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/es/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/es/integrations.json b/app/javascript/dashboard/i18n/locale/es/integrations.json index c22a1582d..4646f140f 100644 --- a/app/javascript/dashboard/i18n/locale/es/integrations.json +++ b/app/javascript/dashboard/i18n/locale/es/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Eliminar", "API": { diff --git a/app/javascript/dashboard/i18n/locale/es/settings.json b/app/javascript/dashboard/i18n/locale/es/settings.json index 7ca0181b8..80ecea3ba 100644 --- a/app/javascript/dashboard/i18n/locale/es/settings.json +++ b/app/javascript/dashboard/i18n/locale/es/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Configuración de la cuenta", "APPLICATIONS": "Aplicaciones", "LABELS": "Etiquetas", - "TEAMS": "Equipos" + "TEAMS": "Equipos", + "ALL_CONTACTS": "Todos los contactos", + "TAGGED_WITH": "Etiquetado con" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Nueva cuenta", diff --git a/app/javascript/dashboard/i18n/locale/fa/agentMgmt.json b/app/javascript/dashboard/i18n/locale/fa/agentMgmt.json index b20a80a24..35f7dfb1b 100644 --- a/app/javascript/dashboard/i18n/locale/fa/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fa/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "اپراتوری یافت نشد." + "NO_RESULTS": "نتیجه‌ای یافت نشد." } } } diff --git a/app/javascript/dashboard/i18n/locale/fa/contact.json b/app/javascript/dashboard/i18n/locale/fa/contact.json index 67130d3f4..aab86195e 100644 --- a/app/javascript/dashboard/i18n/locale/fa/contact.json +++ b/app/javascript/dashboard/i18n/locale/fa/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "در حال بارگذاری مخاطبین...", "404": "هیچ مخاطبی با جستجوی شما مطابقت ندارد 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "نام", "PHONE_NUMBER": "شماره تلفن", diff --git a/app/javascript/dashboard/i18n/locale/fa/conversation.json b/app/javascript/dashboard/i18n/locale/fa/conversation.json index 090d258fd..18295fa5c 100644 --- a/app/javascript/dashboard/i18n/locale/fa/conversation.json +++ b/app/javascript/dashboard/i18n/locale/fa/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "دانلود", "UPLOADING_ATTACHMENTS": "در حال بارگذاری پیوست‌ها...", "NO_RESPONSE": "بدون پاسخ", + "RATING_TITLE": "رتبه", + "FEEDBACK_TITLE": "بازخورد", "HEADER": { "RESOLVE_ACTION": "حل شد", "REOPEN_ACTION": "دوباره باز کنید", diff --git a/app/javascript/dashboard/i18n/locale/fa/csatMgmt.json b/app/javascript/dashboard/i18n/locale/fa/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fa/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/fa/integrations.json b/app/javascript/dashboard/i18n/locale/fa/integrations.json index 0c6c38840..06ba49b3c 100644 --- a/app/javascript/dashboard/i18n/locale/fa/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fa/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "حذف", "API": { diff --git a/app/javascript/dashboard/i18n/locale/fa/settings.json b/app/javascript/dashboard/i18n/locale/fa/settings.json index b67274d99..2d464d64b 100644 --- a/app/javascript/dashboard/i18n/locale/fa/settings.json +++ b/app/javascript/dashboard/i18n/locale/fa/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "تنظیمات حساب", "APPLICATIONS": "Applications", "LABELS": "برچسب‌ها", - "TEAMS": "تیم‌ها" + "TEAMS": "تیم‌ها", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "حساب‌کاربری جدید", diff --git a/app/javascript/dashboard/i18n/locale/fi/agentMgmt.json b/app/javascript/dashboard/i18n/locale/fi/agentMgmt.json index 06f3156e8..bec05d7e9 100644 --- a/app/javascript/dashboard/i18n/locale/fi/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fi/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Edustajia ei löytynyt." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/fi/contact.json b/app/javascript/dashboard/i18n/locale/fi/contact.json index 044d8e78e..84ab88c90 100644 --- a/app/javascript/dashboard/i18n/locale/fi/contact.json +++ b/app/javascript/dashboard/i18n/locale/fi/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Ladataan yhteystietoja...", "404": "Ei hakua vastaavia yhteystietoja 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nimi", "PHONE_NUMBER": "Puhelinnumero", diff --git a/app/javascript/dashboard/i18n/locale/fi/conversation.json b/app/javascript/dashboard/i18n/locale/fi/conversation.json index 6c02b3b3c..83318d8e8 100644 --- a/app/javascript/dashboard/i18n/locale/fi/conversation.json +++ b/app/javascript/dashboard/i18n/locale/fi/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Lataa", "UPLOADING_ATTACHMENTS": "Ladataan liitteitä...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Ratkaise", "REOPEN_ACTION": "Uudelleenavaa", diff --git a/app/javascript/dashboard/i18n/locale/fi/csatMgmt.json b/app/javascript/dashboard/i18n/locale/fi/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fi/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/fi/integrations.json b/app/javascript/dashboard/i18n/locale/fi/integrations.json index 386ee11a8..f5b7ef0a8 100644 --- a/app/javascript/dashboard/i18n/locale/fi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fi/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Poista", "API": { diff --git a/app/javascript/dashboard/i18n/locale/fi/settings.json b/app/javascript/dashboard/i18n/locale/fi/settings.json index 302d2e035..f4e93bfaf 100644 --- a/app/javascript/dashboard/i18n/locale/fi/settings.json +++ b/app/javascript/dashboard/i18n/locale/fi/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Tilin asetukset", "APPLICATIONS": "Applications", "LABELS": "Tunnisteet", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Uusi tili", diff --git a/app/javascript/dashboard/i18n/locale/fr/agentMgmt.json b/app/javascript/dashboard/i18n/locale/fr/agentMgmt.json index 08ca5fd66..27d4619f1 100644 --- a/app/javascript/dashboard/i18n/locale/fr/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fr/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Aucun agent trouvé." + "NO_RESULTS": "Aucun résultat trouvé." } } } diff --git a/app/javascript/dashboard/i18n/locale/fr/contact.json b/app/javascript/dashboard/i18n/locale/fr/contact.json index 918b292b0..aa777e81f 100644 --- a/app/javascript/dashboard/i18n/locale/fr/contact.json +++ b/app/javascript/dashboard/i18n/locale/fr/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Chargement des contacts...", "404": "Aucun contact ne correspond à votre recherche 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nom", "PHONE_NUMBER": "Numéro de téléphone", diff --git a/app/javascript/dashboard/i18n/locale/fr/conversation.json b/app/javascript/dashboard/i18n/locale/fr/conversation.json index 3f269b836..214586790 100644 --- a/app/javascript/dashboard/i18n/locale/fr/conversation.json +++ b/app/javascript/dashboard/i18n/locale/fr/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Télécharger", "UPLOADING_ATTACHMENTS": "Envoi des pièces jointes...", "NO_RESPONSE": "Pas de réponse", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Résoudre", "REOPEN_ACTION": "Ré-ouvrir", diff --git a/app/javascript/dashboard/i18n/locale/fr/csatMgmt.json b/app/javascript/dashboard/i18n/locale/fr/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/fr/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/fr/integrations.json b/app/javascript/dashboard/i18n/locale/fr/integrations.json index 32c860922..248491ce4 100644 --- a/app/javascript/dashboard/i18n/locale/fr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fr/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Supprimer", "API": { diff --git a/app/javascript/dashboard/i18n/locale/fr/settings.json b/app/javascript/dashboard/i18n/locale/fr/settings.json index 326e0dad3..8a6d63889 100644 --- a/app/javascript/dashboard/i18n/locale/fr/settings.json +++ b/app/javascript/dashboard/i18n/locale/fr/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Paramètres du compte", "APPLICATIONS": "Applications", "LABELS": "Étiquettes", - "TEAMS": "Équipes" + "TEAMS": "Équipes", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Nouveau compte", diff --git a/app/javascript/dashboard/i18n/locale/he/agentMgmt.json b/app/javascript/dashboard/i18n/locale/he/agentMgmt.json index ef673c7a5..f36486efd 100644 --- a/app/javascript/dashboard/i18n/locale/he/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/he/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "לא נמצא סוכן." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/he/contact.json b/app/javascript/dashboard/i18n/locale/he/contact.json index 9e5181198..1df00c01c 100644 --- a/app/javascript/dashboard/i18n/locale/he/contact.json +++ b/app/javascript/dashboard/i18n/locale/he/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "שם", "PHONE_NUMBER": "Phone Number", diff --git a/app/javascript/dashboard/i18n/locale/he/conversation.json b/app/javascript/dashboard/i18n/locale/he/conversation.json index 2cc9a49a5..caaeba2e7 100644 --- a/app/javascript/dashboard/i18n/locale/he/conversation.json +++ b/app/javascript/dashboard/i18n/locale/he/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "הורד", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolve", "REOPEN_ACTION": "Reopen", diff --git a/app/javascript/dashboard/i18n/locale/he/csatMgmt.json b/app/javascript/dashboard/i18n/locale/he/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/he/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/he/integrations.json b/app/javascript/dashboard/i18n/locale/he/integrations.json index d01e57955..4217bb205 100644 --- a/app/javascript/dashboard/i18n/locale/he/integrations.json +++ b/app/javascript/dashboard/i18n/locale/he/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "מחק", "API": { diff --git a/app/javascript/dashboard/i18n/locale/he/settings.json b/app/javascript/dashboard/i18n/locale/he/settings.json index 102a18671..49664e981 100644 --- a/app/javascript/dashboard/i18n/locale/he/settings.json +++ b/app/javascript/dashboard/i18n/locale/he/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/hi/agentMgmt.json b/app/javascript/dashboard/i18n/locale/hi/agentMgmt.json index 2b2358c9a..de999a260 100644 --- a/app/javascript/dashboard/i18n/locale/hi/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hi/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No agents found." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/hi/contact.json b/app/javascript/dashboard/i18n/locale/hi/contact.json index 84e6303fc..24bcbc27e 100644 --- a/app/javascript/dashboard/i18n/locale/hi/contact.json +++ b/app/javascript/dashboard/i18n/locale/hi/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Name", "PHONE_NUMBER": "Phone Number", diff --git a/app/javascript/dashboard/i18n/locale/hi/conversation.json b/app/javascript/dashboard/i18n/locale/hi/conversation.json index 976d1395a..587530e74 100644 --- a/app/javascript/dashboard/i18n/locale/hi/conversation.json +++ b/app/javascript/dashboard/i18n/locale/hi/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolve", "REOPEN_ACTION": "Reopen", diff --git a/app/javascript/dashboard/i18n/locale/hi/csatMgmt.json b/app/javascript/dashboard/i18n/locale/hi/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/hi/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/hi/integrations.json b/app/javascript/dashboard/i18n/locale/hi/integrations.json index c75454f9e..a54d8e9e0 100644 --- a/app/javascript/dashboard/i18n/locale/hi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hi/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Delete", "API": { diff --git a/app/javascript/dashboard/i18n/locale/hi/settings.json b/app/javascript/dashboard/i18n/locale/hi/settings.json index f2d285291..b3ed7b95f 100644 --- a/app/javascript/dashboard/i18n/locale/hi/settings.json +++ b/app/javascript/dashboard/i18n/locale/hi/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/hu/agentMgmt.json b/app/javascript/dashboard/i18n/locale/hu/agentMgmt.json index e5a65c807..6e8e8053a 100644 --- a/app/javascript/dashboard/i18n/locale/hu/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hu/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nem találunk ügynököt." + "NO_RESULTS": "Nincs találat." } } } diff --git a/app/javascript/dashboard/i18n/locale/hu/contact.json b/app/javascript/dashboard/i18n/locale/hu/contact.json index 36fb7a632..2336d4915 100644 --- a/app/javascript/dashboard/i18n/locale/hu/contact.json +++ b/app/javascript/dashboard/i18n/locale/hu/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Kontaktok betöltése...", "404": "Nincs a keresésnek megfelelő kontakt 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Név", "PHONE_NUMBER": "Telefonszám", diff --git a/app/javascript/dashboard/i18n/locale/hu/conversation.json b/app/javascript/dashboard/i18n/locale/hu/conversation.json index e85c1e889..374933346 100644 --- a/app/javascript/dashboard/i18n/locale/hu/conversation.json +++ b/app/javascript/dashboard/i18n/locale/hu/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Letöltés", "UPLOADING_ATTACHMENTS": "Csatolt fileok feltöltése...", "NO_RESPONSE": "Nincs válasz", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Megoldva", "REOPEN_ACTION": "Újranyitás", diff --git a/app/javascript/dashboard/i18n/locale/hu/csatMgmt.json b/app/javascript/dashboard/i18n/locale/hu/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/hu/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/hu/integrations.json b/app/javascript/dashboard/i18n/locale/hu/integrations.json index d302cb056..313bf8063 100644 --- a/app/javascript/dashboard/i18n/locale/hu/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hu/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Törlés", "API": { diff --git a/app/javascript/dashboard/i18n/locale/hu/settings.json b/app/javascript/dashboard/i18n/locale/hu/settings.json index 8579e726c..7bb3c1590 100644 --- a/app/javascript/dashboard/i18n/locale/hu/settings.json +++ b/app/javascript/dashboard/i18n/locale/hu/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Fiókbeállítások", "APPLICATIONS": "Applications", "LABELS": "Cimkék", - "TEAMS": "Csapatok" + "TEAMS": "Csapatok", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Új fiók", diff --git a/app/javascript/dashboard/i18n/locale/id/agentMgmt.json b/app/javascript/dashboard/i18n/locale/id/agentMgmt.json index d8fb676cc..d5d59f312 100644 --- a/app/javascript/dashboard/i18n/locale/id/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/id/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Tidak ada agen." + "NO_RESULTS": "Tidak ada hasil ditemukan." } } } diff --git a/app/javascript/dashboard/i18n/locale/id/contact.json b/app/javascript/dashboard/i18n/locale/id/contact.json index 07129ad7f..871f82c43 100644 --- a/app/javascript/dashboard/i18n/locale/id/contact.json +++ b/app/javascript/dashboard/i18n/locale/id/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Memuat kontak...", "404": "Tidak ada kontak yang cocok dengan pencarian Anda 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nama", "PHONE_NUMBER": "Nomor Telpon", diff --git a/app/javascript/dashboard/i18n/locale/id/conversation.json b/app/javascript/dashboard/i18n/locale/id/conversation.json index 32428267e..3d62b7c90 100644 --- a/app/javascript/dashboard/i18n/locale/id/conversation.json +++ b/app/javascript/dashboard/i18n/locale/id/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Unduh", "UPLOADING_ATTACHMENTS": "Unggah lampiran...", "NO_RESPONSE": "Tidak ada respon", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Menyelesaikan", "REOPEN_ACTION": "Buka Kembali", diff --git a/app/javascript/dashboard/i18n/locale/id/csatMgmt.json b/app/javascript/dashboard/i18n/locale/id/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/id/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/id/integrations.json b/app/javascript/dashboard/i18n/locale/id/integrations.json index a088bac90..27f11f168 100644 --- a/app/javascript/dashboard/i18n/locale/id/integrations.json +++ b/app/javascript/dashboard/i18n/locale/id/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Hapus", "API": { diff --git a/app/javascript/dashboard/i18n/locale/id/settings.json b/app/javascript/dashboard/i18n/locale/id/settings.json index bd206b161..f2b28a293 100644 --- a/app/javascript/dashboard/i18n/locale/id/settings.json +++ b/app/javascript/dashboard/i18n/locale/id/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Pengaturan Akun", "APPLICATIONS": "Applications", "LABELS": "Label", - "TEAMS": "Tim" + "TEAMS": "Tim", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Akun Baru", diff --git a/app/javascript/dashboard/i18n/locale/it/agentMgmt.json b/app/javascript/dashboard/i18n/locale/it/agentMgmt.json index 59dfa55fd..38cf20136 100644 --- a/app/javascript/dashboard/i18n/locale/it/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/it/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nessun agente trovato." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/it/contact.json b/app/javascript/dashboard/i18n/locale/it/contact.json index f21ec859d..c7cafff52 100644 --- a/app/javascript/dashboard/i18n/locale/it/contact.json +++ b/app/javascript/dashboard/i18n/locale/it/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "nome", "PHONE_NUMBER": "Phone Number", diff --git a/app/javascript/dashboard/i18n/locale/it/conversation.json b/app/javascript/dashboard/i18n/locale/it/conversation.json index 390c54117..96aafd45e 100644 --- a/app/javascript/dashboard/i18n/locale/it/conversation.json +++ b/app/javascript/dashboard/i18n/locale/it/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Scaricare", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Risolvi", "REOPEN_ACTION": "Riapri", diff --git a/app/javascript/dashboard/i18n/locale/it/csatMgmt.json b/app/javascript/dashboard/i18n/locale/it/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/it/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/it/integrations.json b/app/javascript/dashboard/i18n/locale/it/integrations.json index c761143ad..2cc391d77 100644 --- a/app/javascript/dashboard/i18n/locale/it/integrations.json +++ b/app/javascript/dashboard/i18n/locale/it/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Cancellare", "API": { diff --git a/app/javascript/dashboard/i18n/locale/it/settings.json b/app/javascript/dashboard/i18n/locale/it/settings.json index 97129ac1d..e44d2923e 100644 --- a/app/javascript/dashboard/i18n/locale/it/settings.json +++ b/app/javascript/dashboard/i18n/locale/it/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Impostazioni Account", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/ja/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ja/agentMgmt.json index 48dfaa581..68fd4a109 100644 --- a/app/javascript/dashboard/i18n/locale/ja/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ja/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "担当者が見つかりません" + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ja/contact.json b/app/javascript/dashboard/i18n/locale/ja/contact.json index 95a276840..4920808b5 100644 --- a/app/javascript/dashboard/i18n/locale/ja/contact.json +++ b/app/javascript/dashboard/i18n/locale/ja/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "名前", "PHONE_NUMBER": "電話番号", diff --git a/app/javascript/dashboard/i18n/locale/ja/conversation.json b/app/javascript/dashboard/i18n/locale/ja/conversation.json index ee3e35d21..70966f56e 100644 --- a/app/javascript/dashboard/i18n/locale/ja/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ja/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "ダウンロード", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "解決する", "REOPEN_ACTION": "再開する", diff --git a/app/javascript/dashboard/i18n/locale/ja/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ja/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ja/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ja/integrations.json b/app/javascript/dashboard/i18n/locale/ja/integrations.json index b4cbac8ed..144fcb5dc 100644 --- a/app/javascript/dashboard/i18n/locale/ja/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ja/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "削除", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ja/settings.json b/app/javascript/dashboard/i18n/locale/ja/settings.json index dcf87f61b..429e5ae59 100644 --- a/app/javascript/dashboard/i18n/locale/ja/settings.json +++ b/app/javascript/dashboard/i18n/locale/ja/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "アカウント設定", "APPLICATIONS": "Applications", "LABELS": "ラベル", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "新規アカウント", diff --git a/app/javascript/dashboard/i18n/locale/ko/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ko/agentMgmt.json index aea59be19..a1baad94c 100644 --- a/app/javascript/dashboard/i18n/locale/ko/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ko/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "에이전트를 찾을 수 없음." + "NO_RESULTS": "검색 결과가 없습니다." } } } diff --git a/app/javascript/dashboard/i18n/locale/ko/contact.json b/app/javascript/dashboard/i18n/locale/ko/contact.json index b63eb581a..095e6f7e8 100644 --- a/app/javascript/dashboard/i18n/locale/ko/contact.json +++ b/app/javascript/dashboard/i18n/locale/ko/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "연락처를 불러오는 중...", "404": "검색과 일치하는 연락처 없음 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "이름", "PHONE_NUMBER": "전화 번호", diff --git a/app/javascript/dashboard/i18n/locale/ko/conversation.json b/app/javascript/dashboard/i18n/locale/ko/conversation.json index 91f4bf887..5549cd4be 100644 --- a/app/javascript/dashboard/i18n/locale/ko/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ko/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "다운로드", "UPLOADING_ATTACHMENTS": "첨부 업로드 중...", "NO_RESPONSE": "응답없음", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "해결함", "REOPEN_ACTION": "다시 열기", diff --git a/app/javascript/dashboard/i18n/locale/ko/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ko/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ko/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ko/integrations.json b/app/javascript/dashboard/i18n/locale/ko/integrations.json index 907df1cac..572084d5f 100644 --- a/app/javascript/dashboard/i18n/locale/ko/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ko/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "삭제", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ko/settings.json b/app/javascript/dashboard/i18n/locale/ko/settings.json index 81f208e6d..50f1d9c48 100644 --- a/app/javascript/dashboard/i18n/locale/ko/settings.json +++ b/app/javascript/dashboard/i18n/locale/ko/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "계정 설정", "APPLICATIONS": "Applications", "LABELS": "라벨", - "TEAMS": "팀" + "TEAMS": "팀", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "새 계정", diff --git a/app/javascript/dashboard/i18n/locale/ml/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ml/agentMgmt.json index fff303be2..8b3242c32 100644 --- a/app/javascript/dashboard/i18n/locale/ml/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ml/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "ഏജന്റകളെ ഒന്നും കണ്ടെത്താൻ സാധിച്ചില്ല." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ml/contact.json b/app/javascript/dashboard/i18n/locale/ml/contact.json index 15bcf3595..b5a91ff68 100644 --- a/app/javascript/dashboard/i18n/locale/ml/contact.json +++ b/app/javascript/dashboard/i18n/locale/ml/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "കോൺ‌ടാക്റ്റുകൾ‌ ലോഡുചെയ്യുന്നു...", "404": "കോൺ‌ടാക്റ്റുകളൊന്നും നിങ്ങളുടെ തിരയലുമായി പൊരുത്തപ്പെടുന്നില്ല", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "പേര്", "PHONE_NUMBER": "ഫോൺ നമ്പർ", diff --git a/app/javascript/dashboard/i18n/locale/ml/conversation.json b/app/javascript/dashboard/i18n/locale/ml/conversation.json index 4a8d30d5a..41f4e98ed 100644 --- a/app/javascript/dashboard/i18n/locale/ml/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ml/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "ഡൗൺലോഡ്", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "പരിഹരിക്കുക", "REOPEN_ACTION": "വീണ്ടും തുറക്കുക", diff --git a/app/javascript/dashboard/i18n/locale/ml/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ml/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ml/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ml/integrations.json b/app/javascript/dashboard/i18n/locale/ml/integrations.json index e0b2f82f5..a9a81c11a 100644 --- a/app/javascript/dashboard/i18n/locale/ml/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ml/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "ഇല്ലാതാക്കുക", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ml/settings.json b/app/javascript/dashboard/i18n/locale/ml/settings.json index 5e31e694e..587929146 100644 --- a/app/javascript/dashboard/i18n/locale/ml/settings.json +++ b/app/javascript/dashboard/i18n/locale/ml/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "അക്കൗണ്ട് ക്രമീകരണങ്ങൾ", "APPLICATIONS": "Applications", "LABELS": "ലേബലുകൾ", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "പുതിയ അക്കൗണ്ട്", diff --git a/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json index ac4a62127..dcc8c9fda 100644 --- a/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ne/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No agents found." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ne/contact.json b/app/javascript/dashboard/i18n/locale/ne/contact.json index c523b75a6..2ff3c17f1 100644 --- a/app/javascript/dashboard/i18n/locale/ne/contact.json +++ b/app/javascript/dashboard/i18n/locale/ne/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Name", "PHONE_NUMBER": "Phone Number", diff --git a/app/javascript/dashboard/i18n/locale/ne/conversation.json b/app/javascript/dashboard/i18n/locale/ne/conversation.json index 976d1395a..587530e74 100644 --- a/app/javascript/dashboard/i18n/locale/ne/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ne/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolve", "REOPEN_ACTION": "Reopen", diff --git a/app/javascript/dashboard/i18n/locale/ne/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ne/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ne/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ne/integrations.json b/app/javascript/dashboard/i18n/locale/ne/integrations.json index c75454f9e..a54d8e9e0 100644 --- a/app/javascript/dashboard/i18n/locale/ne/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ne/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Delete", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ne/settings.json b/app/javascript/dashboard/i18n/locale/ne/settings.json index ec0278f27..d7e387e54 100644 --- a/app/javascript/dashboard/i18n/locale/ne/settings.json +++ b/app/javascript/dashboard/i18n/locale/ne/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/nl/agentMgmt.json b/app/javascript/dashboard/i18n/locale/nl/agentMgmt.json index 2ff181b33..42f20084d 100644 --- a/app/javascript/dashboard/i18n/locale/nl/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/nl/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Geen medewerkers gevonden." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/nl/contact.json b/app/javascript/dashboard/i18n/locale/nl/contact.json index f0966fbcd..23cae44db 100644 --- a/app/javascript/dashboard/i18n/locale/nl/contact.json +++ b/app/javascript/dashboard/i18n/locale/nl/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Naam", "PHONE_NUMBER": "Phone Number", diff --git a/app/javascript/dashboard/i18n/locale/nl/conversation.json b/app/javascript/dashboard/i18n/locale/nl/conversation.json index f665e9458..cc8fd83c5 100644 --- a/app/javascript/dashboard/i18n/locale/nl/conversation.json +++ b/app/javascript/dashboard/i18n/locale/nl/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Oplossen", "REOPEN_ACTION": "Heropenen", diff --git a/app/javascript/dashboard/i18n/locale/nl/csatMgmt.json b/app/javascript/dashboard/i18n/locale/nl/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/nl/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/nl/integrations.json b/app/javascript/dashboard/i18n/locale/nl/integrations.json index 2adad48f2..b3fdff191 100644 --- a/app/javascript/dashboard/i18n/locale/nl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/nl/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Verwijderen", "API": { diff --git a/app/javascript/dashboard/i18n/locale/nl/settings.json b/app/javascript/dashboard/i18n/locale/nl/settings.json index 6c550266e..42e2d5e1a 100644 --- a/app/javascript/dashboard/i18n/locale/nl/settings.json +++ b/app/javascript/dashboard/i18n/locale/nl/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Accountinstellingen", "APPLICATIONS": "Applications", "LABELS": "Labelen", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/no/agentMgmt.json b/app/javascript/dashboard/i18n/locale/no/agentMgmt.json index a02049e06..36b494b35 100644 --- a/app/javascript/dashboard/i18n/locale/no/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/no/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Ingen agenter funnet." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/no/contact.json b/app/javascript/dashboard/i18n/locale/no/contact.json index d629c6888..dd907ecc9 100644 --- a/app/javascript/dashboard/i18n/locale/no/contact.json +++ b/app/javascript/dashboard/i18n/locale/no/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Laster inn kontakter...", "404": "Ingen kontakter samsvarer med søket ditt 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Navn", "PHONE_NUMBER": "Telefonnummer", diff --git a/app/javascript/dashboard/i18n/locale/no/conversation.json b/app/javascript/dashboard/i18n/locale/no/conversation.json index 3e487acf0..aa6c9b41d 100644 --- a/app/javascript/dashboard/i18n/locale/no/conversation.json +++ b/app/javascript/dashboard/i18n/locale/no/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Last ned", "UPLOADING_ATTACHMENTS": "Laster opp vedlegg...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Løs", "REOPEN_ACTION": "Gjenåpne", diff --git a/app/javascript/dashboard/i18n/locale/no/csatMgmt.json b/app/javascript/dashboard/i18n/locale/no/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/no/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/no/integrations.json b/app/javascript/dashboard/i18n/locale/no/integrations.json index 355551955..9de34483f 100644 --- a/app/javascript/dashboard/i18n/locale/no/integrations.json +++ b/app/javascript/dashboard/i18n/locale/no/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Slett", "API": { diff --git a/app/javascript/dashboard/i18n/locale/no/settings.json b/app/javascript/dashboard/i18n/locale/no/settings.json index a0c16d647..316c19053 100644 --- a/app/javascript/dashboard/i18n/locale/no/settings.json +++ b/app/javascript/dashboard/i18n/locale/no/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Kontoinnstillinger", "APPLICATIONS": "Applications", "LABELS": "Etiketter", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Ny konto", diff --git a/app/javascript/dashboard/i18n/locale/pl/agentMgmt.json b/app/javascript/dashboard/i18n/locale/pl/agentMgmt.json index 74c869da5..37a2ea9ba 100644 --- a/app/javascript/dashboard/i18n/locale/pl/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pl/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nie znaleziono żadnych agentów." + "NO_RESULTS": "Brak wyników." } } } diff --git a/app/javascript/dashboard/i18n/locale/pl/contact.json b/app/javascript/dashboard/i18n/locale/pl/contact.json index e4d9753ba..965f61068 100644 --- a/app/javascript/dashboard/i18n/locale/pl/contact.json +++ b/app/javascript/dashboard/i18n/locale/pl/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Ładowanie kontaktów...", "404": "Brak kontaktów pasujących do Twojego wyszukiwania 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nazwisko", "PHONE_NUMBER": "Numer telefonu", diff --git a/app/javascript/dashboard/i18n/locale/pl/conversation.json b/app/javascript/dashboard/i18n/locale/pl/conversation.json index d3b5f6eab..42f185fec 100644 --- a/app/javascript/dashboard/i18n/locale/pl/conversation.json +++ b/app/javascript/dashboard/i18n/locale/pl/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Pobierz", "UPLOADING_ATTACHMENTS": "Przesyłanie załączników...", "NO_RESPONSE": "Brak odpowiedzi", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Rozwiąż", "REOPEN_ACTION": "Otwórz ponownie", diff --git a/app/javascript/dashboard/i18n/locale/pl/csatMgmt.json b/app/javascript/dashboard/i18n/locale/pl/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pl/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/pl/integrations.json b/app/javascript/dashboard/i18n/locale/pl/integrations.json index 73bd899c7..9a3d9cc25 100644 --- a/app/javascript/dashboard/i18n/locale/pl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pl/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Usuń", "API": { diff --git a/app/javascript/dashboard/i18n/locale/pl/settings.json b/app/javascript/dashboard/i18n/locale/pl/settings.json index 634b58819..1d8798b35 100644 --- a/app/javascript/dashboard/i18n/locale/pl/settings.json +++ b/app/javascript/dashboard/i18n/locale/pl/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/pt/agentMgmt.json b/app/javascript/dashboard/i18n/locale/pt/agentMgmt.json index a3acf9de6..5035ce402 100644 --- a/app/javascript/dashboard/i18n/locale/pt/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nenhum agente encontrado." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/pt/contact.json b/app/javascript/dashboard/i18n/locale/pt/contact.json index 4b85c36cb..cdaa48809 100644 --- a/app/javascript/dashboard/i18n/locale/pt/contact.json +++ b/app/javascript/dashboard/i18n/locale/pt/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nome:", "PHONE_NUMBER": "Phone Number", diff --git a/app/javascript/dashboard/i18n/locale/pt/conversation.json b/app/javascript/dashboard/i18n/locale/pt/conversation.json index 31ee92b4e..989840a58 100644 --- a/app/javascript/dashboard/i18n/locale/pt/conversation.json +++ b/app/javascript/dashboard/i18n/locale/pt/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "BAIXAR", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolver", "REOPEN_ACTION": "Reabrir", diff --git a/app/javascript/dashboard/i18n/locale/pt/csatMgmt.json b/app/javascript/dashboard/i18n/locale/pt/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt/integrations.json b/app/javascript/dashboard/i18n/locale/pt/integrations.json index 5b0b12148..37cfcf4e6 100644 --- a/app/javascript/dashboard/i18n/locale/pt/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pt/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "excluir", "API": { diff --git a/app/javascript/dashboard/i18n/locale/pt/settings.json b/app/javascript/dashboard/i18n/locale/pt/settings.json index aed6f633b..140fbe36a 100644 --- a/app/javascript/dashboard/i18n/locale/pt/settings.json +++ b/app/javascript/dashboard/i18n/locale/pt/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Etiquetas", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/agentMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/agentMgmt.json index d8be4a31a..8aa83ffca 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Nenhum agente encontrado." + "NO_RESULTS": "Nenhum resultado encontrado." } } } diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json index 124b70b8d..425402073 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json @@ -19,8 +19,8 @@ }, "LABELS": { "CONTACT": { - "TITLE": "Contact Labels", - "ERROR": "Couldn't update labels" + "TITLE": "Etiquetas de contato", + "ERROR": "Falha ao atualizar etiquetas" }, "CONVERSATION": { "TITLE": "Marcador da conversa", @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Carregando contatos...", "404": "Nenhum contato corresponde à sua pesquisa 🔍", + "NO_CONTACTS": "Não há contatos disponíveis", "TABLE_HEADER": { "NAME": "Nome", "PHONE_NUMBER": "Número de Telefone", @@ -153,11 +154,11 @@ "REMINDER": { "ADD_BUTTON": { "BUTTON": "Adicionar", - "TITLE": "Shift + Enter to create a task" + "TITLE": "Shift + Enter para criar uma nota" }, "FOOTER": { - "DUE_DATE": "Due date", - "LABEL_TITLE": "Set type" + "DUE_DATE": "Data de vencimento", + "LABEL_TITLE": "Definir tipo" } }, "NOTES": { @@ -175,11 +176,11 @@ }, "EVENTS": { "HEADER": { - "TITLE": "Activities" + "TITLE": "Atividades" }, "BUTTON": { "PILL_BUTTON_NOTES": "observações", - "PILL_BUTTON_EVENTS": "events", + "PILL_BUTTON_EVENTS": "Eventos", "PILL_BUTTON_CONVO": "conversas" } }, diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json index f2b0c1018..cc5d6ec56 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Baixar", "UPLOADING_ATTACHMENTS": "Enviando anexos...", "NO_RESPONSE": "Sem resposta", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolver", "REOPEN_ACTION": "Reabrir", @@ -109,7 +111,7 @@ }, "CONVERSATION_SIDEBAR": { "ASSIGNEE_LABEL": "Agente atribuído", - "SELF_ASSIGN": "Assign to me", + "SELF_ASSIGN": "Atribuir a mim", "TEAM_LABEL": "Equipe Atribuída", "SELECT": { "PLACEHOLDER": "Nenhuma" diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/csatMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/csatMgmt.json new file mode 100644 index 000000000..08bd95d2b --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/pt_BR/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Avalie sua conversa", + "PLACEHOLDER": "Conte-nos mais..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json index dedb80e72..45c4cfeb4 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json @@ -30,10 +30,10 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nome da Caixa de Entrada", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Digite o nome da caixa de entrada (ex: Acme Inc)" }, "WEBSITE_NAME": { - "LABEL": "Website Name", + "LABEL": "Nome do site", "PLACEHOLDER": "Informe o nome do seu site (por exemplo: Acme Inc)" }, "FB": { @@ -223,7 +223,7 @@ "CONFIRM": { "TITLE": "Confirmar exclusão", "MESSAGE": "Você tem certeza que deseja excluir ", - "PLACE_HOLDER": "Please type {inboxName} to confirm", + "PLACE_HOLDER": "Digite {inboxName} para confirmar", "YES": "Sim, excluir ", "NO": "Não, Mantenha " }, @@ -252,8 +252,8 @@ "INBOX_AGENTS": "Agentes", "INBOX_AGENTS_SUB_TEXT": "Adicionar ou remover agentes dessa caixa de entrada", "UPDATE": "Atualizar", - "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", - "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", + "ENABLE_EMAIL_COLLECT_BOX": "Ativar caixa de coleta de e-mail", + "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Ativar ou desativar caixa de coleta de e-mails em novas conversas", "AUTO_ASSIGNMENT": "Habilitar atribuição automática", "INBOX_UPDATE_TITLE": "Configurações da Caixa de entrada", "INBOX_UPDATE_SUB_TEXT": "Atualize suas configurações de caixa de entrada", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json b/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json index bbfd20da6..759019ae2 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/integrationApps.json @@ -1,35 +1,35 @@ { "INTEGRATION_APPS": { - "FETCHING": "Fetching Integrations", - "NO_HOOK_CONFIGURED": "There are no %{integrationId} integrations configured in this account.", - "HEADER": "Applications", + "FETCHING": "Buscando integrações", + "NO_HOOK_CONFIGURED": "Não há integrações %{integrationId} configuradas nesta conta.", + "HEADER": "Aplicações", "STATUS": { "ENABLED": "Ativado", "DISABLED": "Desativado" }, "CONFIGURE": "Configurar", - "ADD_BUTTON": "Add a new hook", + "ADD_BUTTON": "Adicionar um novo hook", "DELETE": { "TITLE": { - "INBOX": "Confirm deletion", - "ACCOUNT": "Disconnect" + "INBOX": "Confirmar exclusão", + "ACCOUNT": "Desconectado" }, "MESSAGE": { "INBOX": "Você tem certeza que deseja excluir?", - "ACCOUNT": "Are you sure to disconnect?" + "ACCOUNT": "Tem certeza que deseja desconectar?" }, "CONFIRM_BUTTON_TEXT": { "INBOX": "Sim, excluir", - "ACCOUNT": "Yes, Disconnect" + "ACCOUNT": "Sim, Desconectar" }, "CANCEL_BUTTON_TEXT": "Cancelar", "API": { - "SUCCESS_MESSAGE": "Hook deleted successfully", + "SUCCESS_MESSAGE": "Webhook excluído com sucesso", "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" } }, "LIST": { - "FETCHING": "Fetching integration hooks", + "FETCHING": "Buscando integrações", "INBOX": "Caixa de Entrada", "DELETE": { "BUTTON_TEXT": "Excluir" @@ -38,14 +38,14 @@ "ADD": { "FORM": { "INBOX": { - "LABEL": "Select Inbox", - "PLACEHOLDER": "Select Inbox" + "LABEL": "Selecionar caixa de entrada", + "PLACEHOLDER": "Selecionar caixa de entrada" }, "SUBMIT": "Criar", "CANCEL": "Cancelar" }, "API": { - "SUCCESS_MESSAGE": "Integration hook added successfully", + "SUCCESS_MESSAGE": "Integração adicionada com sucesso", "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" } }, @@ -53,10 +53,10 @@ "BUTTON_TEXT": "Conectar" }, "DISCONNECT": { - "BUTTON_TEXT": "Disconnect" + "BUTTON_TEXT": "Desconectado" }, "SIDEBAR_DESCRIPTION": { - "DIALOGFLOW": "Dialogflow is a natural language understanding platform that makes it easy to design and integrate a conversational user interface into your mobile app, web application, device, bot, interactive voice response system, and so on.

Dialogflow integration with %{installationName} allows you to configure a Dialogflow bot with your inboxes which lets the bot handle the queries initially and hand them over to an agent when needed. Dialogflow can be used to qualifying the leads, reduce the workload of agents by providing frequently asked questions etc.

To add Dialogflow, you need to create a Service Account in your Google project console and share the credentials. Please refer to the Dialogflow docs for more information." + "DIALOGFLOW": "Dialogflow é uma plataforma natural de entendimento em linguagem que torna fácil projetar e integrar uma interface de usuário conversacional em seu aplicativo móvel, aplicativo web, dispositivo, bot, sistema de resposta de voz interativo, etc.

A integração do fluxo de diálogo com o %{installationName} permite que você configure um bot de Dialogflow com suas caixas de entrada, o que permite que o bot lide inicialmente as consultas e entregue-as a um agente quando necessário. O fluxo de diálogo pode ser usado para qualificar as chumbas, reduzir a carga de trabalho dos agentes, fornecendo perguntas frequentes, etc.

Para adicionar um fluxo de diálogo, você precisa criar uma Conta de Serviço no seu console do projeto Google e compartilhar as credenciais. Por favor, consulte a documentação do fluxo de diálogo para obter mais informações." } } } diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json index 498dbf8c7..c0888db73 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json @@ -19,7 +19,7 @@ }, "EDIT": { "BUTTON_TEXT": "Alterar", - "TITLE": "Edit webhook", + "TITLE": "Editar webhook", "CANCEL": "Cancelar", "DESC": "Webhook Os eventos fornecem informações em tempo real sobre o que está acontecendo na sua conta do Chatwoot. Digite um URL válido para configurar um retorno de chamada.", "FORM": { @@ -28,10 +28,10 @@ "PLACEHOLDER": "Exemplo: https://example/api/webhook", "ERROR": "Por favor, insira uma URL válida" }, - "SUBMIT": "Edit webhook" + "SUBMIT": "Editar webhook" }, "API": { - "SUCCESS_MESSAGE": "Webhook URL updated successfully", + "SUCCESS_MESSAGE": "URL do Webhook atualizado com sucesso", "ERROR_MESSAGE": "Não foi possível conectar ao servidor Woot, por favor tente novamente mais tarde" } }, @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Excluir", "API": { diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json index 28c2ee8fa..5fd4ce5ea 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Configurações da conta", "APPLICATIONS": "Aplicações", "LABELS": "Marcadores", - "TEAMS": "Times" + "TEAMS": "Times", + "ALL_CONTACTS": "Todos os Contatos", + "TAGGED_WITH": "Marcado com" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Nova conta", diff --git a/app/javascript/dashboard/i18n/locale/ro/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ro/agentMgmt.json index bc582e4ed..a76fa06fb 100644 --- a/app/javascript/dashboard/i18n/locale/ro/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ro/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Niciun agent găsit." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ro/contact.json b/app/javascript/dashboard/i18n/locale/ro/contact.json index b34cd2bf3..1dae9b3c1 100644 --- a/app/javascript/dashboard/i18n/locale/ro/contact.json +++ b/app/javascript/dashboard/i18n/locale/ro/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Nume", "PHONE_NUMBER": "Phone Number", diff --git a/app/javascript/dashboard/i18n/locale/ro/conversation.json b/app/javascript/dashboard/i18n/locale/ro/conversation.json index 85782d5f2..5f272965f 100644 --- a/app/javascript/dashboard/i18n/locale/ro/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ro/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Descărcare", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Rezolvă", "REOPEN_ACTION": "Redeschide", diff --git a/app/javascript/dashboard/i18n/locale/ro/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ro/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ro/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ro/integrations.json b/app/javascript/dashboard/i18n/locale/ro/integrations.json index fb16f804a..ab3cf0bd5 100644 --- a/app/javascript/dashboard/i18n/locale/ro/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ro/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Şterge", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ro/settings.json b/app/javascript/dashboard/i18n/locale/ro/settings.json index ee28e40f2..bff4aebfc 100644 --- a/app/javascript/dashboard/i18n/locale/ro/settings.json +++ b/app/javascript/dashboard/i18n/locale/ro/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Setările contului", "APPLICATIONS": "Applications", "LABELS": "Etichete", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Cont Nou", diff --git a/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json index 3f1582d65..77ebbdd8b 100644 --- a/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ru/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Операторы не найдены." + "NO_RESULTS": "Результаты не найдены." } } } diff --git a/app/javascript/dashboard/i18n/locale/ru/contact.json b/app/javascript/dashboard/i18n/locale/ru/contact.json index ae36dff4c..50833704b 100644 --- a/app/javascript/dashboard/i18n/locale/ru/contact.json +++ b/app/javascript/dashboard/i18n/locale/ru/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Загрузка контактов...", "404": "Нет контактов по вашему запросу 🔍", + "NO_CONTACTS": "Нет доступных контактов", "TABLE_HEADER": { "NAME": "Имя", "PHONE_NUMBER": "Номер телефона", diff --git a/app/javascript/dashboard/i18n/locale/ru/conversation.json b/app/javascript/dashboard/i18n/locale/ru/conversation.json index ac8581237..13fc0f2d5 100644 --- a/app/javascript/dashboard/i18n/locale/ru/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ru/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Скачать", "UPLOADING_ATTACHMENTS": "Загрузка вложений...", "NO_RESPONSE": "Нет ответа", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Завершить", "REOPEN_ACTION": "Открыть заново", diff --git a/app/javascript/dashboard/i18n/locale/ru/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ru/csatMgmt.json new file mode 100644 index 000000000..e7fff705a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ru/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Оцените разговор", + "PLACEHOLDER": "Расскажите подробнее..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ru/integrations.json b/app/javascript/dashboard/i18n/locale/ru/integrations.json index 2e279b181..d249a2231 100644 --- a/app/javascript/dashboard/i18n/locale/ru/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ru/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Использование интеграции Slack", + "BODY": "

Chatwoot теперь будет синхронизировать все входящие разговоры с каналом разговоров с клиентами внутри вашего рабочего места.

Ответ на цепочку разговоров в канале slack для разговоров с клиентом создаст ответ клиенту через chatwoot.

Начните ответы с примечания: для создания приватных сообщений. примечания вместо ответов.

Если отвечающий в Slack имеет профиль агента в chatwoot под тем же адресом электронной почты, ответы будут связаны соответственно.

Если отвечающий не имеет связанного профиля агента, ответы будут отправляться из профиля бота.

" + } + }, "DELETE": { "BUTTON_TEXT": "Удалить", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ru/settings.json b/app/javascript/dashboard/i18n/locale/ru/settings.json index 450e310c0..410d01813 100644 --- a/app/javascript/dashboard/i18n/locale/ru/settings.json +++ b/app/javascript/dashboard/i18n/locale/ru/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Настройки аккаунта", "APPLICATIONS": "Приложения", "LABELS": "Категории", - "TEAMS": "Команды" + "TEAMS": "Команды", + "ALL_CONTACTS": "Все контакты", + "TAGGED_WITH": "С метками" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Новый аккаунт", diff --git a/app/javascript/dashboard/i18n/locale/sk/agentMgmt.json b/app/javascript/dashboard/i18n/locale/sk/agentMgmt.json index 2b2358c9a..de999a260 100644 --- a/app/javascript/dashboard/i18n/locale/sk/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/sk/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No agents found." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/sk/contact.json b/app/javascript/dashboard/i18n/locale/sk/contact.json index 84e6303fc..24bcbc27e 100644 --- a/app/javascript/dashboard/i18n/locale/sk/contact.json +++ b/app/javascript/dashboard/i18n/locale/sk/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Name", "PHONE_NUMBER": "Phone Number", diff --git a/app/javascript/dashboard/i18n/locale/sk/conversation.json b/app/javascript/dashboard/i18n/locale/sk/conversation.json index 976d1395a..587530e74 100644 --- a/app/javascript/dashboard/i18n/locale/sk/conversation.json +++ b/app/javascript/dashboard/i18n/locale/sk/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolve", "REOPEN_ACTION": "Reopen", diff --git a/app/javascript/dashboard/i18n/locale/sk/csatMgmt.json b/app/javascript/dashboard/i18n/locale/sk/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/sk/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/sk/integrations.json b/app/javascript/dashboard/i18n/locale/sk/integrations.json index c75454f9e..a54d8e9e0 100644 --- a/app/javascript/dashboard/i18n/locale/sk/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sk/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Delete", "API": { diff --git a/app/javascript/dashboard/i18n/locale/sk/settings.json b/app/javascript/dashboard/i18n/locale/sk/settings.json index f2d285291..b3ed7b95f 100644 --- a/app/javascript/dashboard/i18n/locale/sk/settings.json +++ b/app/javascript/dashboard/i18n/locale/sk/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/sv/agentMgmt.json b/app/javascript/dashboard/i18n/locale/sv/agentMgmt.json index 3a24ba227..308b32300 100644 --- a/app/javascript/dashboard/i18n/locale/sv/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/sv/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Inga agenter hittades." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/sv/contact.json b/app/javascript/dashboard/i18n/locale/sv/contact.json index 05d42258c..53c27dd5e 100644 --- a/app/javascript/dashboard/i18n/locale/sv/contact.json +++ b/app/javascript/dashboard/i18n/locale/sv/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Laddar kontakter...", "404": "Inga kontakter matchar din sökning 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Namn", "PHONE_NUMBER": "Telefonnummer", diff --git a/app/javascript/dashboard/i18n/locale/sv/conversation.json b/app/javascript/dashboard/i18n/locale/sv/conversation.json index 3990678cb..7d26a7df0 100644 --- a/app/javascript/dashboard/i18n/locale/sv/conversation.json +++ b/app/javascript/dashboard/i18n/locale/sv/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Hämta", "UPLOADING_ATTACHMENTS": "Laddar upp bilagor...", "NO_RESPONSE": "Inget svar", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Lös", "REOPEN_ACTION": "Återöppna", diff --git a/app/javascript/dashboard/i18n/locale/sv/csatMgmt.json b/app/javascript/dashboard/i18n/locale/sv/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/sv/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/sv/integrations.json b/app/javascript/dashboard/i18n/locale/sv/integrations.json index 166f9d527..29cd79650 100644 --- a/app/javascript/dashboard/i18n/locale/sv/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sv/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Radera", "API": { diff --git a/app/javascript/dashboard/i18n/locale/sv/settings.json b/app/javascript/dashboard/i18n/locale/sv/settings.json index d8a5c1dc3..d68adf684 100644 --- a/app/javascript/dashboard/i18n/locale/sv/settings.json +++ b/app/javascript/dashboard/i18n/locale/sv/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Kontoinställningar", "APPLICATIONS": "Applications", "LABELS": "Etiketter", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Nytt konto", diff --git a/app/javascript/dashboard/i18n/locale/ta/agentMgmt.json b/app/javascript/dashboard/i18n/locale/ta/agentMgmt.json index 0d46a23cc..e98d91a62 100644 --- a/app/javascript/dashboard/i18n/locale/ta/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ta/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "ஏஜென்ட்கள் யாரும் இல்லை." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/ta/contact.json b/app/javascript/dashboard/i18n/locale/ta/contact.json index 4b290a106..cafd3abac 100644 --- a/app/javascript/dashboard/i18n/locale/ta/contact.json +++ b/app/javascript/dashboard/i18n/locale/ta/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "பெயர்", "PHONE_NUMBER": "Phone Number", diff --git a/app/javascript/dashboard/i18n/locale/ta/conversation.json b/app/javascript/dashboard/i18n/locale/ta/conversation.json index aee6efaa6..53fec603d 100644 --- a/app/javascript/dashboard/i18n/locale/ta/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ta/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "பதிவிறக்கம்", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "தீர்", "REOPEN_ACTION": "மீண்டும் திற", diff --git a/app/javascript/dashboard/i18n/locale/ta/csatMgmt.json b/app/javascript/dashboard/i18n/locale/ta/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/ta/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/ta/integrations.json b/app/javascript/dashboard/i18n/locale/ta/integrations.json index 4425aa5ae..53c248139 100644 --- a/app/javascript/dashboard/i18n/locale/ta/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ta/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Delete", "API": { diff --git a/app/javascript/dashboard/i18n/locale/ta/settings.json b/app/javascript/dashboard/i18n/locale/ta/settings.json index 49020c1b7..081f78e00 100644 --- a/app/javascript/dashboard/i18n/locale/ta/settings.json +++ b/app/javascript/dashboard/i18n/locale/ta/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "கணக்கின் அமைப்புகள்", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/th/agentMgmt.json b/app/javascript/dashboard/i18n/locale/th/agentMgmt.json index bf1d2f43c..1f26bdf10 100644 --- a/app/javascript/dashboard/i18n/locale/th/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/th/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "ไม่พบพนักงาน" + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/th/contact.json b/app/javascript/dashboard/i18n/locale/th/contact.json index 49a4a20ab..29246d21d 100644 --- a/app/javascript/dashboard/i18n/locale/th/contact.json +++ b/app/javascript/dashboard/i18n/locale/th/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "กำลังโหลดรายชื่อผู้ติดต่อ", "404": "ไม่มีผู้ติดต่อที่ตรงกัน 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "ชื่อ", "PHONE_NUMBER": "หมายเลขโทรศัพท์", diff --git a/app/javascript/dashboard/i18n/locale/th/conversation.json b/app/javascript/dashboard/i18n/locale/th/conversation.json index b0afb783c..cc41efa7f 100644 --- a/app/javascript/dashboard/i18n/locale/th/conversation.json +++ b/app/javascript/dashboard/i18n/locale/th/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "ดาวโหลด", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "เสร็จสิ้น", "REOPEN_ACTION": "เปิดใหม่อีกครั้ง", diff --git a/app/javascript/dashboard/i18n/locale/th/csatMgmt.json b/app/javascript/dashboard/i18n/locale/th/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/th/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/th/integrations.json b/app/javascript/dashboard/i18n/locale/th/integrations.json index f13cb47dd..5a2e0ac7f 100644 --- a/app/javascript/dashboard/i18n/locale/th/integrations.json +++ b/app/javascript/dashboard/i18n/locale/th/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "ลบ", "API": { diff --git a/app/javascript/dashboard/i18n/locale/th/settings.json b/app/javascript/dashboard/i18n/locale/th/settings.json index c4ab1c02a..63c79d0f0 100644 --- a/app/javascript/dashboard/i18n/locale/th/settings.json +++ b/app/javascript/dashboard/i18n/locale/th/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Account Settings", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/tr/agentMgmt.json b/app/javascript/dashboard/i18n/locale/tr/agentMgmt.json index 971a7f796..a9e167411 100644 --- a/app/javascript/dashboard/i18n/locale/tr/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/tr/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Kullanıcı bulunamadı." + "NO_RESULTS": "Sonuç bulunamadı." } } } diff --git a/app/javascript/dashboard/i18n/locale/tr/contact.json b/app/javascript/dashboard/i18n/locale/tr/contact.json index 05eb5131e..47fc64c72 100644 --- a/app/javascript/dashboard/i18n/locale/tr/contact.json +++ b/app/javascript/dashboard/i18n/locale/tr/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Kişiler yükleniyor ...", "404": "Aramanızla eşleşen kişi yok 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "İsim", "PHONE_NUMBER": "Telefon numarası", diff --git a/app/javascript/dashboard/i18n/locale/tr/conversation.json b/app/javascript/dashboard/i18n/locale/tr/conversation.json index f2ec9c24b..14536ea7b 100644 --- a/app/javascript/dashboard/i18n/locale/tr/conversation.json +++ b/app/javascript/dashboard/i18n/locale/tr/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "İndir", "UPLOADING_ATTACHMENTS": "Dosyalar gönderiliyor...", "NO_RESPONSE": "Cevap Yok", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Çözüldü", "REOPEN_ACTION": "Yeniden aç", diff --git a/app/javascript/dashboard/i18n/locale/tr/csatMgmt.json b/app/javascript/dashboard/i18n/locale/tr/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/tr/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/tr/integrations.json b/app/javascript/dashboard/i18n/locale/tr/integrations.json index 577c5f2aa..dbbd8a6cb 100644 --- a/app/javascript/dashboard/i18n/locale/tr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/tr/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Sil", "API": { diff --git a/app/javascript/dashboard/i18n/locale/tr/settings.json b/app/javascript/dashboard/i18n/locale/tr/settings.json index 88c03d3f8..ec799c1fa 100644 --- a/app/javascript/dashboard/i18n/locale/tr/settings.json +++ b/app/javascript/dashboard/i18n/locale/tr/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Hesap ayarları", "APPLICATIONS": "Applications", "LABELS": "Etiketler", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Yeni hesap", diff --git a/app/javascript/dashboard/i18n/locale/uk/agentMgmt.json b/app/javascript/dashboard/i18n/locale/uk/agentMgmt.json index 2578e4cb3..e525fbf0d 100644 --- a/app/javascript/dashboard/i18n/locale/uk/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/uk/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "Агентів не знайдено." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/uk/contact.json b/app/javascript/dashboard/i18n/locale/uk/contact.json index daf7fdb44..59f70ce7c 100644 --- a/app/javascript/dashboard/i18n/locale/uk/contact.json +++ b/app/javascript/dashboard/i18n/locale/uk/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Ім'я", "PHONE_NUMBER": "Phone Number", diff --git a/app/javascript/dashboard/i18n/locale/uk/conversation.json b/app/javascript/dashboard/i18n/locale/uk/conversation.json index ba23ac674..21c9795bc 100644 --- a/app/javascript/dashboard/i18n/locale/uk/conversation.json +++ b/app/javascript/dashboard/i18n/locale/uk/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Звантажити", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Вирішити", "REOPEN_ACTION": "Відкрити знову", diff --git a/app/javascript/dashboard/i18n/locale/uk/csatMgmt.json b/app/javascript/dashboard/i18n/locale/uk/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/uk/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/uk/integrations.json b/app/javascript/dashboard/i18n/locale/uk/integrations.json index 9231c6cf7..f3b65a7d8 100644 --- a/app/javascript/dashboard/i18n/locale/uk/integrations.json +++ b/app/javascript/dashboard/i18n/locale/uk/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Видалити", "API": { diff --git a/app/javascript/dashboard/i18n/locale/uk/settings.json b/app/javascript/dashboard/i18n/locale/uk/settings.json index 933bb4608..f57df4362 100644 --- a/app/javascript/dashboard/i18n/locale/uk/settings.json +++ b/app/javascript/dashboard/i18n/locale/uk/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Налаштування акаунту", "APPLICATIONS": "Applications", "LABELS": "Labels", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/vi/agentMgmt.json b/app/javascript/dashboard/i18n/locale/vi/agentMgmt.json index 375d317c4..eed729b82 100644 --- a/app/javascript/dashboard/i18n/locale/vi/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/vi/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "No agents found." + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/vi/campaign.json b/app/javascript/dashboard/i18n/locale/vi/campaign.json index 83cd8fe1d..3e827de0f 100644 --- a/app/javascript/dashboard/i18n/locale/vi/campaign.json +++ b/app/javascript/dashboard/i18n/locale/vi/campaign.json @@ -82,7 +82,7 @@ }, "STATUS": { "ENABLED": "Bật", - "DISABLED": "Không bật" + "DISABLED": "Tắt" }, "SENDER": { "BOT": "Bot" diff --git a/app/javascript/dashboard/i18n/locale/vi/chatlist.json b/app/javascript/dashboard/i18n/locale/vi/chatlist.json index 34a077990..806e2cb63 100644 --- a/app/javascript/dashboard/i18n/locale/vi/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/vi/chatlist.json @@ -80,7 +80,7 @@ "RECEIVED_VIA_EMAIL": "Nhận được từ email", "VIEW_TWEET_IN_TWITTER": "Xem tweet trên Twitter", "REPLY_TO_TWEET": "Trả lời cho tweet này", - "NO_MESSAGES": "No Messages", - "NO_CONTENT": "No content available" + "NO_MESSAGES": "Không có tin nhắn", + "NO_CONTENT": "Không có nội dung" } } diff --git a/app/javascript/dashboard/i18n/locale/vi/contact.json b/app/javascript/dashboard/i18n/locale/vi/contact.json index f97e32755..64414c0ed 100644 --- a/app/javascript/dashboard/i18n/locale/vi/contact.json +++ b/app/javascript/dashboard/i18n/locale/vi/contact.json @@ -3,7 +3,7 @@ "NOT_AVAILABLE": "Không có sẵn", "EMAIL_ADDRESS": "Địa chỉ email", "PHONE_NUMBER": "Số điện thoại", - "COPY_SUCCESSFUL": "Copied to clipboard successfully", + "COPY_SUCCESSFUL": "Đã sao chép mã thành công", "COMPANY": "Công ty", "LOCATION": "Vị trí", "CONVERSATION_TITLE": "Chi tiết của cuộc trò chuyện", @@ -12,7 +12,7 @@ "INITIATED_FROM": "Bắt đầu từ", "INITIATED_AT": "Bắt đầu lúc", "IP_ADDRESS": "Địa chỉ IP", - "NEW_MESSAGE": "New message", + "NEW_MESSAGE": "Tin nhắn mới", "CONVERSATIONS": { "NO_RECORDS_FOUND": "Không có cuộc trò chuyện trước đó được liên kết với liên hệ này.", "TITLE": "Cuộc trò chuyện trước đó" @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "Loading contacts...", "404": "No contacts matches your search 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "Tên", "PHONE_NUMBER": "Số điện thoại", diff --git a/app/javascript/dashboard/i18n/locale/vi/conversation.json b/app/javascript/dashboard/i18n/locale/vi/conversation.json index 511a057a7..2768544da 100644 --- a/app/javascript/dashboard/i18n/locale/vi/conversation.json +++ b/app/javascript/dashboard/i18n/locale/vi/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "Tải xuống", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Giải quyết", "REOPEN_ACTION": "Mở lại", diff --git a/app/javascript/dashboard/i18n/locale/vi/csatMgmt.json b/app/javascript/dashboard/i18n/locale/vi/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/vi/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/vi/integrations.json b/app/javascript/dashboard/i18n/locale/vi/integrations.json index 6ffbe1288..a6237565e 100644 --- a/app/javascript/dashboard/i18n/locale/vi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/vi/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "Xoá", "API": { diff --git a/app/javascript/dashboard/i18n/locale/vi/settings.json b/app/javascript/dashboard/i18n/locale/vi/settings.json index 264f77dd9..238c59e62 100644 --- a/app/javascript/dashboard/i18n/locale/vi/settings.json +++ b/app/javascript/dashboard/i18n/locale/vi/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "Cài Đặt Tài Khoản", "APPLICATIONS": "Applications", "LABELS": "Nhãn", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Tạo mới tài khoản", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/agentMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/agentMgmt.json index d39695127..785681a02 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "没有找到代理人。" + "NO_RESULTS": "No results found." } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json b/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json index 16ad60a97..a23281f85 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json @@ -15,7 +15,7 @@ "ERROR": "Title is required" }, "MESSAGE": { - "LABEL": "Message", + "LABEL": "消息", "PLACEHOLDER": "Please enter the message of campaign", "ERROR": "Message is required" }, @@ -68,7 +68,7 @@ "404": "There are no campaigns created for this inbox.", "TABLE_HEADER": { "TITLE": "Title", - "MESSAGE": "Message", + "MESSAGE": "消息", "STATUS": "状态", "SENDER": "Sender", "URL": "URL", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json index f7a504bea..8b2902bfb 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json @@ -12,52 +12,52 @@ "INITIATED_FROM": "启动自:", "INITIATED_AT": "发起于", "IP_ADDRESS": "IP 地址", - "NEW_MESSAGE": "New message", + "NEW_MESSAGE": "新消息", "CONVERSATIONS": { "NO_RECORDS_FOUND": "此联系人没有关联到以前的会话。", "TITLE": "上一次对话" }, "LABELS": { "CONTACT": { - "TITLE": "Contact Labels", - "ERROR": "Couldn't update labels" + "TITLE": "联系人标签", + "ERROR": "无法更新标签" }, "CONVERSATION": { "TITLE": "对话标记", - "ADD_BUTTON": "Add Labels" + "ADD_BUTTON": "添加标签" }, "LABEL_SELECT": { - "TITLE": "Add Labels", - "PLACEHOLDER": "Search labels", - "NO_RESULT": "No labels found" + "TITLE": "添加标签", + "PLACEHOLDER": "搜索标签", + "NO_RESULT": "未找到标签" } }, - "MUTE_CONTACT": "Mute Conversation", - "UNMUTE_CONTACT": "Unmute Conversation", - "MUTED_SUCCESS": "This conversation is muted for 6 hours", - "UNMUTED_SUCCESS": "This conversation is unmuted", + "MUTE_CONTACT": "开始会话", + "UNMUTE_CONTACT": "取消静音", + "MUTED_SUCCESS": "此对话被静音6小时", + "UNMUTED_SUCCESS": "此对话已取消静音", "SEND_TRANSCRIPT": "Send Transcript", "EDIT_LABEL": "编辑" }, "EDIT_CONTACT": { "BUTTON_LABEL": "编辑联系人", - "TITLE": "Edit contact", - "DESC": "Edit contact details" + "TITLE": "编辑联系人", + "DESC": "编辑联系人详情" }, "CREATE_CONTACT": { - "BUTTON_LABEL": "New Contact", - "TITLE": "Create new contact", - "DESC": "Add basic information details about the contact." + "BUTTON_LABEL": "新建联系人", + "TITLE": "创建新联系人", + "DESC": "添加联系人的基本信息。" }, "CONTACT_FORM": { "FORM": { "SUBMIT": "提交", "CANCEL": "取消", "AVATAR": { - "LABEL": "Contact Avatar" + "LABEL": "联系人头像" }, "NAME": { - "PLACEHOLDER": "Enter the full name of the contact", + "PLACEHOLDER": "输入联系人的名字", "LABEL": "名字" }, "BIO": { @@ -65,14 +65,14 @@ "LABEL": "Bio" }, "EMAIL_ADDRESS": { - "PLACEHOLDER": "Enter the email address of the contact", + "PLACEHOLDER": "输入联系人的电子邮件地址", "LABEL": "电子邮件地址" }, "PHONE_NUMBER": { - "PLACEHOLDER": "Enter the phone number of the contact", + "PLACEHOLDER": "输入联系人的电话号码", "LABEL": "电话号码", - "HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]", - "ERROR": "Phone number should be either empty or of E.164 format" + "HELP": "电话号码应为E.164格式,例如:+14155555 [+] [国家代码][地区代码][本地电话号码]", + "ERROR": "电话号码应为空或E.164格式" }, "LOCATION": { "PLACEHOLDER": "Enter the location of the contact", @@ -119,7 +119,7 @@ "ERROR": "Select an inbox" }, "MESSAGE": { - "LABEL": "Message", + "LABEL": "消息", "PLACEHOLDER": "Write your message here", "ERROR": "Message can't be empty" }, @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "正在加载联系人列表...", "404": "没有搜索到联系人🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "姓名:", "PHONE_NUMBER": "电话号码", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json index 796426431..11acc7e76 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "下载", "UPLOADING_ATTACHMENTS": "Uploading attachments...", "NO_RESPONSE": "No response", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "已解决", "REOPEN_ACTION": "重新打开", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/csatMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/zh_CN/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json index 5cb319e63..b3779e431 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "删除", "API": { diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json index 6bcf28024..835c350a0 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "帐户设置", "APPLICATIONS": "Applications", "LABELS": "标签", - "TEAMS": "Teams" + "TEAMS": "Teams", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "New Account", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json index 90337cc93..d3de7163b 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json @@ -90,7 +90,7 @@ } }, "SEARCH": { - "NO_RESULTS": "查無客服。" + "NO_RESULTS": "查無結果。" } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json index f134d8b36..be3bba6b9 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json @@ -136,6 +136,7 @@ "LIST": { "LOADING_MESSAGE": "聯絡人載入中...", "404": "找不到符合條件的聯絡人 🔍", + "NO_CONTACTS": "There are no available contacts", "TABLE_HEADER": { "NAME": "姓名", "PHONE_NUMBER": "聯絡人電話", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json index a95919571..6c7f4ebd3 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json @@ -28,6 +28,8 @@ "DOWNLOAD": "下載", "UPLOADING_ATTACHMENTS": "正在上傳附件...", "NO_RESPONSE": "無回應", + "RATING_TITLE": "Rating", + "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "已解決", "REOPEN_ACTION": "重新打開", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/csatMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/csatMgmt.json new file mode 100644 index 000000000..d7d2efc2a --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/zh_TW/csatMgmt.json @@ -0,0 +1,6 @@ +{ + "CSAT": { + "TITLE": "Rate your conversation", + "PLACEHOLDER": "Tell us more..." + } +} diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json index 517d35d46..197670a7e 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json @@ -66,6 +66,12 @@ } } }, + "SLACK": { + "HELP_TEXT": { + "TITLE": "Using Slack Integration", + "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + } + }, "DELETE": { "BUTTON_TEXT": "刪除", "API": { diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json index c877cc359..14bdf0cdf 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json @@ -139,7 +139,9 @@ "ACCOUNT_SETTINGS": "帳戶設定", "APPLICATIONS": "Applications", "LABELS": "標籤", - "TEAMS": "團隊" + "TEAMS": "團隊", + "ALL_CONTACTS": "All Contacts", + "TAGGED_WITH": "Tagged with" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "新帳戶", diff --git a/app/javascript/widget/i18n/locale/ar.json b/app/javascript/widget/i18n/locale/ar.json index bf6107a54..b8e459ecb 100644 --- a/app/javascript/widget/i18n/locale/ar.json +++ b/app/javascript/widget/i18n/locale/ar.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/ca.json b/app/javascript/widget/i18n/locale/ca.json index f7a81c155..5a8175179 100644 --- a/app/javascript/widget/i18n/locale/ca.json +++ b/app/javascript/widget/i18n/locale/ca.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/cs.json b/app/javascript/widget/i18n/locale/cs.json index 045db8e3f..f9bf37745 100644 --- a/app/javascript/widget/i18n/locale/cs.json +++ b/app/javascript/widget/i18n/locale/cs.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/da.json b/app/javascript/widget/i18n/locale/da.json index d054c55ff..898ca5aac 100644 --- a/app/javascript/widget/i18n/locale/da.json +++ b/app/javascript/widget/i18n/locale/da.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/de.json b/app/javascript/widget/i18n/locale/de.json index d60d8c142..ad38f9ac3 100644 --- a/app/javascript/widget/i18n/locale/de.json +++ b/app/javascript/widget/i18n/locale/de.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Ungültiges Feld" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/el.json b/app/javascript/widget/i18n/locale/el.json index 38c5ddbe8..8a690dca4 100644 --- a/app/javascript/widget/i18n/locale/el.json +++ b/app/javascript/widget/i18n/locale/el.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Μη έγκυρο πεδίο" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/es.json b/app/javascript/widget/i18n/locale/es.json index 8b9663248..1725d3885 100644 --- a/app/javascript/widget/i18n/locale/es.json +++ b/app/javascript/widget/i18n/locale/es.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Campo no válido" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/fa.json b/app/javascript/widget/i18n/locale/fa.json index b9dfc62a1..25c8671c4 100644 --- a/app/javascript/widget/i18n/locale/fa.json +++ b/app/javascript/widget/i18n/locale/fa.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "فیلد نامتعارف" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "با تشکر از شما برای ثبت رتبه", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/fi.json b/app/javascript/widget/i18n/locale/fi.json index 3247f1665..688a9d20d 100644 --- a/app/javascript/widget/i18n/locale/fi.json +++ b/app/javascript/widget/i18n/locale/fi.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/fr.json b/app/javascript/widget/i18n/locale/fr.json index 4a20b723e..730f074e8 100644 --- a/app/javascript/widget/i18n/locale/fr.json +++ b/app/javascript/widget/i18n/locale/fr.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/he.json b/app/javascript/widget/i18n/locale/he.json index e96fd3e45..27650aaf2 100644 --- a/app/javascript/widget/i18n/locale/he.json +++ b/app/javascript/widget/i18n/locale/he.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/hi.json b/app/javascript/widget/i18n/locale/hi.json index 44a2b5dcf..dd114afff 100644 --- a/app/javascript/widget/i18n/locale/hi.json +++ b/app/javascript/widget/i18n/locale/hi.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/hu.json b/app/javascript/widget/i18n/locale/hu.json index 74cfdc7ac..dd66ef812 100644 --- a/app/javascript/widget/i18n/locale/hu.json +++ b/app/javascript/widget/i18n/locale/hu.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/id.json b/app/javascript/widget/i18n/locale/id.json index dcfc318a1..2722e4e1c 100644 --- a/app/javascript/widget/i18n/locale/id.json +++ b/app/javascript/widget/i18n/locale/id.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/it.json b/app/javascript/widget/i18n/locale/it.json index 4c09e32e1..7f5281799 100644 --- a/app/javascript/widget/i18n/locale/it.json +++ b/app/javascript/widget/i18n/locale/it.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/ja.json b/app/javascript/widget/i18n/locale/ja.json index 72c4e1611..0dadae116 100644 --- a/app/javascript/widget/i18n/locale/ja.json +++ b/app/javascript/widget/i18n/locale/ja.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/ko.json b/app/javascript/widget/i18n/locale/ko.json index bb39f72cb..c36916d09 100644 --- a/app/javascript/widget/i18n/locale/ko.json +++ b/app/javascript/widget/i18n/locale/ko.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/ml.json b/app/javascript/widget/i18n/locale/ml.json index ba2a3bdfd..5be38ee21 100644 --- a/app/javascript/widget/i18n/locale/ml.json +++ b/app/javascript/widget/i18n/locale/ml.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/ne.json b/app/javascript/widget/i18n/locale/ne.json index 22630b1a3..ce46cdd02 100644 --- a/app/javascript/widget/i18n/locale/ne.json +++ b/app/javascript/widget/i18n/locale/ne.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/nl.json b/app/javascript/widget/i18n/locale/nl.json index fae7eaeb9..d633068a0 100644 --- a/app/javascript/widget/i18n/locale/nl.json +++ b/app/javascript/widget/i18n/locale/nl.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/no.json b/app/javascript/widget/i18n/locale/no.json index e02922553..31f65589c 100644 --- a/app/javascript/widget/i18n/locale/no.json +++ b/app/javascript/widget/i18n/locale/no.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/pl.json b/app/javascript/widget/i18n/locale/pl.json index 5ce508068..88151e0c2 100644 --- a/app/javascript/widget/i18n/locale/pl.json +++ b/app/javascript/widget/i18n/locale/pl.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/pt.json b/app/javascript/widget/i18n/locale/pt.json index 003150e6e..e366f7a8f 100644 --- a/app/javascript/widget/i18n/locale/pt.json +++ b/app/javascript/widget/i18n/locale/pt.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/pt_BR.json b/app/javascript/widget/i18n/locale/pt_BR.json index 1a5d6fcc7..5b5ab92d6 100644 --- a/app/javascript/widget/i18n/locale/pt_BR.json +++ b/app/javascript/widget/i18n/locale/pt_BR.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Campo inválido" } + }, + "CSAT": { + "TITLE": "Avalie sua conversa", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Conte-nos mais..." } } diff --git a/app/javascript/widget/i18n/locale/ro.json b/app/javascript/widget/i18n/locale/ro.json index bb4c86e0d..ab5fde156 100644 --- a/app/javascript/widget/i18n/locale/ro.json +++ b/app/javascript/widget/i18n/locale/ro.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/ru.json b/app/javascript/widget/i18n/locale/ru.json index adbd559a9..e96672ff4 100644 --- a/app/javascript/widget/i18n/locale/ru.json +++ b/app/javascript/widget/i18n/locale/ru.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Неверное поле" } + }, + "CSAT": { + "TITLE": "Оцените разговор", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Расскажите подробнее..." } } diff --git a/app/javascript/widget/i18n/locale/sk.json b/app/javascript/widget/i18n/locale/sk.json index 44a2b5dcf..dd114afff 100644 --- a/app/javascript/widget/i18n/locale/sk.json +++ b/app/javascript/widget/i18n/locale/sk.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/sv.json b/app/javascript/widget/i18n/locale/sv.json index 0c6d7654f..307ff1709 100644 --- a/app/javascript/widget/i18n/locale/sv.json +++ b/app/javascript/widget/i18n/locale/sv.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/ta.json b/app/javascript/widget/i18n/locale/ta.json index cf46e6b7e..9da18c1b1 100644 --- a/app/javascript/widget/i18n/locale/ta.json +++ b/app/javascript/widget/i18n/locale/ta.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/th.json b/app/javascript/widget/i18n/locale/th.json index aed719778..12be549e7 100644 --- a/app/javascript/widget/i18n/locale/th.json +++ b/app/javascript/widget/i18n/locale/th.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/tr.json b/app/javascript/widget/i18n/locale/tr.json index 0b1d12cad..2fcd22d56 100644 --- a/app/javascript/widget/i18n/locale/tr.json +++ b/app/javascript/widget/i18n/locale/tr.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/uk.json b/app/javascript/widget/i18n/locale/uk.json index 3cfbec0a8..041be0802 100644 --- a/app/javascript/widget/i18n/locale/uk.json +++ b/app/javascript/widget/i18n/locale/uk.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/vi.json b/app/javascript/widget/i18n/locale/vi.json index f8fde56bd..1ff32e406 100644 --- a/app/javascript/widget/i18n/locale/vi.json +++ b/app/javascript/widget/i18n/locale/vi.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/app/javascript/widget/i18n/locale/zh_CN.json b/app/javascript/widget/i18n/locale/zh_CN.json index de9c86462..708d16b2c 100644 --- a/app/javascript/widget/i18n/locale/zh_CN.json +++ b/app/javascript/widget/i18n/locale/zh_CN.json @@ -10,7 +10,7 @@ }, "TEAM_AVAILABILITY": { "ONLINE": "在线", - "OFFLINE": "We are away at the moment" + "OFFLINE": "当前已离线" }, "REPLY_TIME": { "IN_A_FEW_MINUTES": "通常在几分钟内回复您", @@ -21,7 +21,7 @@ "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "查看新消息", "CLOSE_MESSAGES_BUTTON": "关闭", - "COMPANY_FROM": "from", + "COMPANY_FROM": "发自", "BOT": "机器人" }, "BUBBLE": { @@ -30,31 +30,36 @@ "POWERED_BY": "由 Chatwoot 支持", "EMAIL_PLACEHOLDER": "请输入您的电子邮件", "CHAT_PLACEHOLDER": "输入您的消息", - "TODAY": "今日", - "YESTERDAY": "昨日", + "TODAY": "今天", + "YESTERDAY": "昨天", "PRE_CHAT_FORM": { "FIELDS": { "FULL_NAME": { "LABEL": "名字", - "PLACEHOLDER": "Please enter your full name", - "ERROR": "Full Name is required" + "PLACEHOLDER": "请输入您的姓名", + "ERROR": "必须填写姓名" }, "EMAIL_ADDRESS": { "LABEL": "电子邮件地址", - "PLACEHOLDER": "Please enter your email address", - "ERROR": "Invalid email address" + "PLACEHOLDER": "请输入您的邮箱地址", + "ERROR": "无效的邮箱地址" }, "MESSAGE": { - "LABEL": "Message", - "PLACEHOLDER": "Please enter your message", - "ERROR": "Message too short" + "LABEL": "消息", + "PLACEHOLDER": "请输入您的消息", + "ERROR": "消息太短了" } } }, - "FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_FILE_UPLOAD_SIZE} attachment limit", + "FILE_SIZE_LIMIT": "文件超过大小 {MAXIMUM_FILE_UPLOAD_SIZE} 附件限制", "CHAT_FORM": { "INVALID": { - "FIELD": "Invalid field" + "FIELD": "无效字段" } + }, + "CSAT": { + "TITLE": "评价您的对话", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "请告诉我们更多..." } } diff --git a/app/javascript/widget/i18n/locale/zh_TW.json b/app/javascript/widget/i18n/locale/zh_TW.json index fda7c62ea..15b5b6296 100644 --- a/app/javascript/widget/i18n/locale/zh_TW.json +++ b/app/javascript/widget/i18n/locale/zh_TW.json @@ -56,5 +56,10 @@ "INVALID": { "FIELD": "Invalid field" } + }, + "CSAT": { + "TITLE": "Rate your conversation", + "SUBMITTED_TITLE": "Thank you for submitting the rating", + "PLACEHOLDER": "Tell us more..." } } diff --git a/config/locales/ar.yml b/config/locales/ar.yml index df67dfd57..ff1404d13 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -66,6 +66,7 @@ ar: greeting_message_body: "%{account_name} يرد عادة خلال بضع ساعات." ways_to_reach_you_message_body: "زودنا بوسيلة للتواصل معك." email_input_box_message_body: "احصل على الإشعارات في البريد الإلكتروني" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "رسائل جديدة في هذه المحادثة" transcript_subject: "نص المحادثة" diff --git a/config/locales/ca.yml b/config/locales/ca.yml index ce64fa910..c08d3a8c7 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -66,6 +66,7 @@ ca: greeting_message_body: "%{account_name} normalment respon a les poques hores." ways_to_reach_you_message_body: "Fes saber a l'equip la forma de posar-nos en contacte amb tu." email_input_box_message_body: "Rep les notificacions per correu electrònic" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Missatges nous en aquesta conversa" transcript_subject: "Transcripció de conversa" diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 8a5340eea..c8faf0f6d 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -66,6 +66,7 @@ cs: greeting_message_body: "%{account_name} typically replies in a few hours." ways_to_reach_you_message_body: "Dejte týmu způsob, jak se k vám dostat." email_input_box_message_body: "Dostat upozornění e-mailem" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "New messages on this conversation" transcript_subject: "Přepis konverzace" diff --git a/config/locales/da.yml b/config/locales/da.yml index 2a2571850..740644e20 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -66,6 +66,7 @@ da: greeting_message_body: "%{account_name} svarer typisk på et par timer." ways_to_reach_you_message_body: "Giv teamet en måde at kontakte dig på." email_input_box_message_body: "Få besked via e-mail" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Nye beskeder i denne samtale" transcript_subject: "Samtaleudskrift" diff --git a/config/locales/de.yml b/config/locales/de.yml index 54e0f04cb..b112a6f35 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -66,6 +66,7 @@ de: greeting_message_body: "%{account_name} antwortet in der Regel in wenigen Stunden." ways_to_reach_you_message_body: "Geben Sie dem Team einen Weg, Sie zu erreichen." email_input_box_message_body: "Lassen Sie sich per E-Mail benachrichtigen" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Neue Nachrichten in dieser Unterhaltung" transcript_subject: "Konversations-Protokoll" diff --git a/config/locales/el.yml b/config/locales/el.yml index fd8797c3b..b5769b767 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -66,6 +66,7 @@ el: greeting_message_body: "Στον λογαριασμό %{account_name} τυπικά έχετε απάντηση σε μερικές ώρες." ways_to_reach_you_message_body: "Δώστε στην ομάδα ένα τρόπο να φτάσει σε σας." email_input_box_message_body: "Ειδοποιηθείτε με email" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "νέα μηνύματα σε αυτήν την συνομιλία" transcript_subject: "Μεταγραφή Συνομιλίας" diff --git a/config/locales/es.yml b/config/locales/es.yml index 1a2fd3e22..387f47c1b 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -66,6 +66,7 @@ es: greeting_message_body: "%{account_name} normalmente responde en unas pocas horas." ways_to_reach_you_message_body: "Dale al equipo una forma de llegar a ti." email_input_box_message_body: "Recibir notificaciones por correo electrónico" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Nuevos mensajes en esta conversación" transcript_subject: "Transcripción de la conversación" diff --git a/config/locales/fa.yml b/config/locales/fa.yml index fe4d296c9..0a8c3794b 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -66,6 +66,7 @@ fa: greeting_message_body: "%{account_name} معمولا ظرف مدت کوتاهی پاسخ می‌دهد." ways_to_reach_you_message_body: "راهی برای ارتباط گرفتن تیم با شما قرار دهید" email_input_box_message_body: "پیام جدیدی به این گفتگو اضافه شده است" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "پیام‌های جدید در این مکالمه" transcript_subject: "متن مکالمه" diff --git a/config/locales/fi.yml b/config/locales/fi.yml index ccaf7f360..b5d26eed5 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -66,6 +66,7 @@ fi: greeting_message_body: "%{account_name} vastaa tyypillisesti muutamassa tunnissa." ways_to_reach_you_message_body: "Anna tiimillemme tapa tavoittaa sinut." email_input_box_message_body: "Saa ilmoitus sähköpostitse" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Uusia viestejä" transcript_subject: "Keskustelukopio" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index ce91d0f14..362109b4d 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -66,6 +66,7 @@ fr: greeting_message_body: "%{account_name} répond généralement en quelques heures." ways_to_reach_you_message_body: "Donnez à l'équipe un moyen de vous recontacter." email_input_box_message_body: "Recevez des notifications par courriel" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Nouveaux messages dans cette conversation" transcript_subject: "Transcription de conversation" diff --git a/config/locales/he.yml b/config/locales/he.yml index f9522338a..281de23fd 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -66,6 +66,7 @@ he: greeting_message_body: "%{account_name} typically replies in a few hours." ways_to_reach_you_message_body: "Give the team a way to reach you." email_input_box_message_body: "Get notified by email" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "New messages on this conversation" transcript_subject: "Conversation Transcript" diff --git a/config/locales/hi.yml b/config/locales/hi.yml index 47e62700a..156c5b0aa 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -66,6 +66,7 @@ hi: greeting_message_body: "%{account_name} typically replies in a few hours." ways_to_reach_you_message_body: "Give the team a way to reach you." email_input_box_message_body: "Get notified by email" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "New messages on this conversation" transcript_subject: "Conversation Transcript" diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 74e9033b2..b1e6d3b57 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -66,6 +66,7 @@ hu: greeting_message_body: "%{account_name} általában néhány órán belül válaszol." ways_to_reach_you_message_body: "Adj egy elérhetőséget hogy megkereshessenek." email_input_box_message_body: "E-mail értesítés kérése" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Új üzenet a beszélgetésben" transcript_subject: "Beszélgetés kivonat" diff --git a/config/locales/id.yml b/config/locales/id.yml index d8718e188..441e9a3fc 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -66,6 +66,7 @@ id: greeting_message_body: "%{account_name} biasanya membalas dalam beberapa jam." ways_to_reach_you_message_body: "Beri tim cara untuk menghubungi Anda." email_input_box_message_body: "Dapatkan pemberitahuan melalui email" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Pesan baru pada percakapan ini" transcript_subject: "Transkrip Percakapan" diff --git a/config/locales/it.yml b/config/locales/it.yml index 71c6e5dd2..a22b3ec00 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -66,6 +66,7 @@ it: greeting_message_body: "%{account_name}, in genere, risponde in poche ore." ways_to_reach_you_message_body: "Offri alla squadra un modo per raggiungerti." email_input_box_message_body: "Ricevi una notifica via email" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Nuovi messaggi in questa conversazione" transcript_subject: "Conversation Transcript" diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 3f78cef21..46d9ee329 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -66,6 +66,7 @@ ja: greeting_message_body: "%{account_name} は通常数時間で返信します。" ways_to_reach_you_message_body: "チームがあなたに連絡する方法を設定してください" email_input_box_message_body: "Eメールで通知を受ける" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "この会話に新着メッセージがあります" transcript_subject: "会話の記録" diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 0003ac300..a7e2c7d79 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -66,6 +66,7 @@ ko: greeting_message_body: "%{account_name} typically replies in a few hours." ways_to_reach_you_message_body: "저희가 연락드릴 방법을 알려주세요." email_input_box_message_body: "이메일로 연락받기" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "New messages on this conversation" transcript_subject: "Conversation Transcript" diff --git a/config/locales/ml.yml b/config/locales/ml.yml index 2ab817f9d..841000f6a 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -66,6 +66,7 @@ ml: greeting_message_body: "%{account_name} സാധാരണ കുറച്ച് മണിക്കൂറിനുള്ളിൽ മറുപടി നൽകുന്നു." ways_to_reach_you_message_body: "നിങ്ങളിലേക്ക് എത്താൻ ടീമിന് ഒരു വഴി നൽകുക." email_input_box_message_body: "ഇമെയിൽ വഴി അറിയിപ്പ് നേടുക" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "ഈ സംഭാഷണത്തിലെ പുതിയ സന്ദേശങ്ങൾ" transcript_subject: "സംഭാഷണ ട്രാൻസ്ക്രിപ്റ്റ്" diff --git a/config/locales/ne.yml b/config/locales/ne.yml index 91970c298..c0227aada 100644 --- a/config/locales/ne.yml +++ b/config/locales/ne.yml @@ -66,6 +66,7 @@ ne: greeting_message_body: "%{account_name} typically replies in a few hours." ways_to_reach_you_message_body: "Give the team a way to reach you." email_input_box_message_body: "Get notified by email" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "New messages on this conversation" transcript_subject: "Conversation Transcript" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 4130041b0..30b545ea8 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -66,6 +66,7 @@ nl: greeting_message_body: "%{account_name} reageert meestal binnen een paar uur." ways_to_reach_you_message_body: "Geef het team een manier om je te bereiken." email_input_box_message_body: "Ontvang een melding via e-mail" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "New messages on this conversation" transcript_subject: "Conversation Transcript" diff --git a/config/locales/no.yml b/config/locales/no.yml index cf041e5f1..11f6dcad0 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -66,6 +66,7 @@ greeting_message_body: "%{account_name} svarer vanligvis innen et par timer." ways_to_reach_you_message_body: "Gi oss en måte å ta kontakt med deg på." email_input_box_message_body: "Få beskjed via e-post" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Nye meldinger i denne samtalen" transcript_subject: "Kopi av samtale" diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 4bca06934..53968d310 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -66,6 +66,7 @@ pl: greeting_message_body: "%{account_name} zazwyczaj odpowiada w ciągu kilku godzin." ways_to_reach_you_message_body: "Daj zespołowi możliwość dotarcia do Ciebie." email_input_box_message_body: "Otrzymuj powiadomienia przez e-mail" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Nowe wiadomości w tej dyskusji" transcript_subject: "Transkrypcja rozmowy" diff --git a/config/locales/pt.yml b/config/locales/pt.yml index 0c84171b9..803421f9a 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -66,6 +66,7 @@ pt: greeting_message_body: "%{account_name} typically replies in a few hours." ways_to_reach_you_message_body: "Dê à equipe um jeito de contatá-lo." email_input_box_message_body: "Seja notificado por e-mail" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "New messages on this conversation" transcript_subject: "Conversation Transcript" diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml index adf67c14d..ccadfef42 100644 --- a/config/locales/pt_BR.yml +++ b/config/locales/pt_BR.yml @@ -66,6 +66,7 @@ pt_BR: greeting_message_body: "%{account_name} normalmente responde em algumas horas." ways_to_reach_you_message_body: "Informe uma forma para entrarmos em contato com você." email_input_box_message_body: "Seja notificado por e-mail" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Novas mensagens nesta conversa" transcript_subject: "Transcrição da conversa" @@ -78,7 +79,7 @@ pt_BR: description: "Webhooks fornecem informações em tempo real sobre o que está acontecendo em sua conta. Você pode usar os webhooks para comunicar eventos com seus aplicativos favoritos como Slack ou Github. Clique em Configurar para configurar seus webhooks." dialogflow: name: "Fluxo de diálogo" - description: "Build chatbots using Dialogflow and connect them to your inbox quickly. Let the bots handle the queries before handing them off to a customer service agent." + description: "Construa chatbots usando Dialogflow e conecte-os à sua caixa de entrada rapidamente. Deixe os bots lidarem com as consultas antes de entregá-los a um agente de atendimento ao cliente." fullcontact: name: "Contato completo" - description: "FullContact integration helps to enrich visitor profiles. Identify the users as soon as they share their email address and offer them tailored customer service. Connect your FullContact to your account by sharing the FullContact API Key." + description: "A integração de contatos completos ajuda a enriquecer perfis de visitantes. Identifique os usuários assim que eles compartilham seu endereço de e-mail e ofereça um atendimento ao cliente personalizado. Conecte seu FullContact à sua conta compartilhando a chave de API de Contato Fullcot." diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 6449fa303..954503953 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -66,6 +66,7 @@ ro: greeting_message_body: "%{account_name} răspunde de obicei în câteva ore." ways_to_reach_you_message_body: "Dă-i echipei o modalitate de a te contacta." email_input_box_message_body: "Primește notificări prin e-mail" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Mesaje noi în această conversație" transcript_subject: "Conversation Transcript" diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 8762cc471..c3af39493 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -66,6 +66,7 @@ ru: greeting_message_body: "%{account_name} как правило отвечает в течении несколько часов." ways_to_reach_you_message_body: "Оставьте ваш email для связи" email_input_box_message_body: "Получать уведомления по email" + csat_input_message_body: "Пожалуйста, оцените разговор" reply: email_subject: "Новые сообщения в этом диалоге" transcript_subject: "Субтитры общения" diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 2fee5e528..b2c04c2aa 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -66,6 +66,7 @@ sk: greeting_message_body: "%{account_name} typically replies in a few hours." ways_to_reach_you_message_body: "Give the team a way to reach you." email_input_box_message_body: "Get notified by email" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "New messages on this conversation" transcript_subject: "Conversation Transcript" diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 83a198290..598694ef1 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -66,6 +66,7 @@ sv: greeting_message_body: "%{account_name} svarar vanligtvis inom några timmar." ways_to_reach_you_message_body: "Ge teamet ett sätt att nå dig." email_input_box_message_body: "Få meddelande via e-post" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Nya meddelanden i denna konversation" transcript_subject: "Konversationstranskribering" diff --git a/config/locales/ta.yml b/config/locales/ta.yml index 96f7f7302..6b265ad98 100644 --- a/config/locales/ta.yml +++ b/config/locales/ta.yml @@ -66,6 +66,7 @@ ta: greeting_message_body: "%{account_name} பொதுவாக சில மணிநேரங்களில் பதிலளிப்பார்." ways_to_reach_you_message_body: "உங்களை அடைய அணிக்கு ஒரு வழியைக் கொடுங்கள்." email_input_box_message_body: "இமெயில் மூலம் அறிய" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "இந்த உரையாடலில் புதிய செய்திகள்" transcript_subject: "Conversation Transcript" diff --git a/config/locales/th.yml b/config/locales/th.yml index 277f8826c..12c952b97 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -66,6 +66,7 @@ th: greeting_message_body: "%{account_name} typically replies in a few hours." ways_to_reach_you_message_body: "Give the team a way to reach you." email_input_box_message_body: "Get notified by email" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "New messages on this conversation" transcript_subject: "Conversation Transcript" diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 29fcaa07c..f90a7f301 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -66,6 +66,7 @@ tr: greeting_message_body: "%{account_name} genellikle birkaç saat içinde yanıt verir." ways_to_reach_you_message_body: "Ekibin size ulaşması için bir bilgi verin." email_input_box_message_body: "E-posta ile haberdar olun" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Bu görüşmedeki yeni mesajlar" transcript_subject: "Konuşma Metni" diff --git a/config/locales/uk.yml b/config/locales/uk.yml index c205a8328..245fa3147 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -66,6 +66,7 @@ uk: greeting_message_body: "%{account_name} typically replies in a few hours." ways_to_reach_you_message_body: "Дайте команді можливість з вами зв'язатися." email_input_box_message_body: "Отримувати сповіщення електронною поштою" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "New messages on this conversation" transcript_subject: "Conversation Transcript" diff --git a/config/locales/vi.yml b/config/locales/vi.yml index fdd538e19..3c1c06855 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -66,6 +66,7 @@ vi: greeting_message_body: "%{account_name} thường trả lời trong vài giờ." ways_to_reach_you_message_body: "Cung cấp cho nhóm một cách để tiếp cận bạn." email_input_box_message_body: "Nhận thông báo qua email" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "Tin nhắn mới về cuộc trò chuyện này" transcript_subject: "Bản ghi cuộc hội thoại" diff --git a/config/locales/zh_CN.yml b/config/locales/zh_CN.yml index 57c94886e..254e28e8c 100644 --- a/config/locales/zh_CN.yml +++ b/config/locales/zh_CN.yml @@ -66,6 +66,7 @@ zh_CN: greeting_message_body: "%{account_name} 通常在几小时内回复。" ways_to_reach_you_message_body: "给团队一个联系您的方法。" email_input_box_message_body: "通过电子邮件得到通知" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "此对话中的新消息" transcript_subject: "Conversation Transcript" diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml index 3cda18b9d..079686ab4 100644 --- a/config/locales/zh_TW.yml +++ b/config/locales/zh_TW.yml @@ -66,6 +66,7 @@ zh_TW: greeting_message_body: "%{account_name} 通常在幾小時內回覆" ways_to_reach_you_message_body: "給個聯繫方式讓團隊可以聯繫到您。" email_input_box_message_body: "透過電子郵件得到通知。" + csat_input_message_body: "Please rate the conversation" reply: email_subject: "在對話中的新訊息" transcript_subject: "對話紀錄" From fa37f8e185c3a03cd7e6decb46b8ba9c6efde167 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Tue, 29 Jun 2021 19:18:10 +0530 Subject: [PATCH 27/69] chore: Support Github Codespaces (#2510) Note: Update the ruby version 2.7.3. For production Linux VM, install 2.7.3 and follow the upgrade steps as shown in https://www.chatwoot.com/docs/self-hosted/deployment/linux-vm#upgrading-to-a-newer-version-of-chatwoot --- .circleci/config.yml | 2 +- .devcontainer/Dockerfile | 50 ++----------------- .devcontainer/Dockerfile.base | 45 +++++++++++++++++ .devcontainer/devcontainer.json | 8 +++ .github/workflows/publish_codespace_image.yml | 23 +++++++++ .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 | 4 +- docker/Dockerfile | 4 +- 13 files changed, 97 insertions(+), 61 deletions(-) create mode 100644 .devcontainer/Dockerfile.base create mode 100644 .github/workflows/publish_codespace_image.yml diff --git a/.circleci/config.yml b/.circleci/config.yml index 635f60c90..0e3153a7a 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: circleci/ruby:2.7.2-node-browsers + - image: circleci/ruby:2.7.3-node-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index b1bef7b28..8e6bc0acf 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,51 +1,11 @@ -# pre-build stage -ARG VARIANT=2.7 -FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT} - -# Update args in docker-compose.yaml to set the UID/GID of the "vscode" user. -ARG USER_UID=1000 -ARG USER_GID=$USER_UID -RUN if [ "$USER_GID" != "1000" ] || [ "$USER_UID" != "1000" ]; then \ - groupmod --gid $USER_GID vscode \ - && usermod --uid $USER_UID --gid $USER_GID vscode \ - && chmod -R $USER_UID:$USER_GID /home/vscode; \ - fi - -# [Option] Install Node.js -ARG INSTALL_NODE="true" -ARG NODE_VERSION="lts/*" -RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi - - -# tmux is for overmind -# TODO : install foreman in future -# packages: postgresql-server-dev-all -# may be postgres in same machine - -RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends \ - libssl-dev \ - tar \ - tzdata \ - postgresql-client \ - yarn \ - git \ - imagemagick \ - tmux \ - zsh - -# [Optional] Uncomment this line to install global node packages. -# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g " 2>&1 - +# The below image is created out of the Dockerfile.base +# It has the dependencies already installed so that codespace will boot up fast +FROM ghcr.io/sojan-official/chatwoot_codespace:latest # Do the set up required for chatwoot app WORKDIR /workspace COPY . /workspace +RUN yarn -# TODO: figure out installing rvm -# RUN rvm install COPY Gemfile Gemfile.lock ./ -RUN gem install bundler -RUN bundle install -COPY package.json yarn.lock ./ -RUN yarn install +RUN gem install bundler && bundle install \ No newline at end of file diff --git a/.devcontainer/Dockerfile.base b/.devcontainer/Dockerfile.base new file mode 100644 index 000000000..dcbbd27ca --- /dev/null +++ b/.devcontainer/Dockerfile.base @@ -0,0 +1,45 @@ +# pre-build stage +ARG VARIANT=2.7 +FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT} + +# Update args in docker-compose.yaml to set the UID/GID of the "vscode" user. +ARG USER_UID=1000 +ARG USER_GID=$USER_UID +RUN if [ "$USER_GID" != "1000" ] || [ "$USER_UID" != "1000" ]; then \ + groupmod --gid $USER_GID vscode \ + && usermod --uid $USER_UID --gid $USER_GID vscode \ + && chmod -R $USER_UID:$USER_GID /home/vscode; \ + fi + +# [Option] Install Node.js +ARG INSTALL_NODE="true" +ARG NODE_VERSION="lts/*" +RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi + +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends \ + libssl-dev \ + tar \ + tzdata \ + postgresql-client \ + yarn \ + git \ + imagemagick \ + tmux \ + zsh + + +# Install overmind +RUN curl -L https://github.com/DarthSim/overmind/releases/download/v2.1.0/overmind-v2.1.0-linux-amd64.gz > overmind.gz \ + && gunzip overmind.gz \ + && sudo mv overmind /usr/local/bin \ + && chmod +x /usr/local/bin/overmind + +# Do the set up required for chatwoot app +WORKDIR /workspace +COPY . /workspace +RUN yarn + +COPY Gemfile Gemfile.lock ./ +RUN gem install bundler && bundle install + diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 5f878e5e0..194a9d909 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -30,4 +30,12 @@ // Use 'postCreateCommand' to run commands after the container is created. // #TODO: can we move logic of copy env file into dockerfile ? "postCreateCommand": "cp .env.example .env", + "portsAttributes": { + "3000": { + "label": "Rails Server" + }, + "8025": { + "label": "Mailhog UI" + } + }, } diff --git a/.github/workflows/publish_codespace_image.yml b/.github/workflows/publish_codespace_image.yml new file mode 100644 index 000000000..d71787eb1 --- /dev/null +++ b/.github/workflows/publish_codespace_image.yml @@ -0,0 +1,23 @@ +name: Publish Codespace Base Image + +on: + workflow_dispatch: + +jobs: + publish-code-space-image: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build the Codespace Base Image + run: | + docker build . -t ghcr.io/chatwoot/chatwoot_codespace:latest -f .devcontainer/Dockerfile.base + docker push ghcr.io/chatwoot/chatwoot_codespace:latest diff --git a/.ruby-version b/.ruby-version index 37c2961c2..2c9b4ef42 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.7.2 +2.7.3 diff --git a/Gemfile b/Gemfile index ae0938676..6a35ddb47 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -ruby '2.7.2' +ruby '2.7.3' ##-- base gems for rails --## gem 'rack-cors', require: 'rack/cors' diff --git a/Gemfile.lock b/Gemfile.lock index 55d3dbd29..00cf3b2de 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -704,7 +704,7 @@ DEPENDENCIES wisper (= 2.0.0) RUBY VERSION - ruby 2.7.2p137 + ruby 2.7.3p183 BUNDLED WITH 2.1.4 diff --git a/deployment/chatwoot-web.1.service b/deployment/chatwoot-web.1.service index 9ef63aeb6..1e55b55bb 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-2.7.2/bin:/home/chatwoot/.rvm/gems/ruby-2.7.2@global/bin:/home/chatwoot/.rvm/rubies/ruby-2.7.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-2.7.3/bin:/home/chatwoot/.rvm/gems/ruby-2.7.3@global/bin:/home/chatwoot/.rvm/rubies/ruby-2.7.3/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-2.7.2" -Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-2.7.2:/home/chatwoot/.rvm/gems/ruby-2.7.2@global" +Environment="GEM_HOME=/home/chatwoot/.rvm/gems/ruby-2.7.3" +Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-2.7.3:/home/chatwoot/.rvm/gems/ruby-2.7.3@global" diff --git a/deployment/chatwoot-worker.1.service b/deployment/chatwoot-worker.1.service index ac24709cd..98cdf357a 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-2.7.2/bin:/home/chatwoot/.rvm/gems/ruby-2.7.2@global/bin:/home/chatwoot/.rvm/rubies/ruby-2.7.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-2.7.3/bin:/home/chatwoot/.rvm/gems/ruby-2.7.3@global/bin:/home/chatwoot/.rvm/rubies/ruby-2.7.3/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-2.7.2" -Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-2.7.2:/home/chatwoot/.rvm/gems/ruby-2.7.2@global" +Environment="GEM_HOME=/home/chatwoot/.rvm/gems/ruby-2.7.3" +Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-2.7.3:/home/chatwoot/.rvm/gems/ruby-2.7.3@global" diff --git a/deployment/setup_18.04.sh b/deployment/setup_18.04.sh index d10cf7749..fb2184f19 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-2.7.2" -rvm use 2.7.2 --default +rvm install "ruby-2.7.3" +rvm use 2.7.3 --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 d6ddf7143..69683b695 100644 --- a/deployment/setup_20.04.sh +++ b/deployment/setup_20.04.sh @@ -50,8 +50,8 @@ RAILS_ENV=production sudo -i -u chatwoot << EOF rvm --version rvm autolibs disable -rvm install "ruby-2.7.2" -rvm use 2.7.2 --default +rvm install "ruby-2.7.3" +rvm use 2.7.3 --default git clone https://github.com/chatwoot/chatwoot.git cd chatwoot diff --git a/docker/Dockerfile b/docker/Dockerfile index 99a82b8b2..7eebf35a5 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ # pre-build stage -FROM ruby:2.7.2-alpine AS pre-builder +FROM ruby:2.7.3-alpine AS pre-builder # ARG default to production settings # For development docker-compose file overrides ARGS @@ -51,7 +51,7 @@ RUN if [ "$RAILS_ENV" = "production" ]; then \ fi # final build stage -FROM ruby:2.7.2-alpine +FROM ruby:2.7.3-alpine ARG BUNDLE_WITHOUT="development:test" ENV BUNDLE_WITHOUT ${BUNDLE_WITHOUT} From 30832d8a34e97b753b6c0d959d6f902e949c3f72 Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Tue, 29 Jun 2021 19:29:57 +0530 Subject: [PATCH 28/69] feat: Add APIs to create custom views on the dashboard (#2498) --- .../v1/accounts/custom_filters_controller.rb | 50 ++++ app/models/account.rb | 1 + app/models/custom_filter.rb | 24 ++ app/models/user.rb | 1 + .../custom_filters/create.json.jbuilder | 1 + .../custom_filters/index.json.jbuilder | 3 + .../custom_filters/show.json.jbuilder | 1 + .../custom_filters/update.json.jbuilder | 1 + .../v1/models/_custom_filter.json.jbuilder | 6 + config/routes.rb | 2 +- .../20210623150613_create_custom_filters.rb | 12 + db/schema.rb | 14 +- .../custom_filters_controller_spec.rb | 146 ++++++++++++ spec/factories/custom_filters.rb | 11 + swagger/definitions/index.yml | 6 + .../custom_filter/create_update_payload.yml | 12 + .../definitions/resource/custom_filter.yml | 21 ++ swagger/index.yml | 7 +- swagger/parameters/custom_filter_id.yml | 6 + swagger/parameters/index.yml | 4 +- swagger/paths/custom_filters/create.yml | 19 ++ swagger/paths/custom_filters/delete.yml | 12 + swagger/paths/custom_filters/index.yml | 15 ++ swagger/paths/custom_filters/show.yml | 14 ++ swagger/paths/custom_filters/update.yml | 18 ++ swagger/paths/index.yml | 32 ++- swagger/swagger.json | 224 +++++++++++++++++- 27 files changed, 654 insertions(+), 9 deletions(-) create mode 100644 app/controllers/api/v1/accounts/custom_filters_controller.rb create mode 100644 app/models/custom_filter.rb create mode 100644 app/views/api/v1/accounts/custom_filters/create.json.jbuilder create mode 100644 app/views/api/v1/accounts/custom_filters/index.json.jbuilder create mode 100644 app/views/api/v1/accounts/custom_filters/show.json.jbuilder create mode 100644 app/views/api/v1/accounts/custom_filters/update.json.jbuilder create mode 100644 app/views/api/v1/models/_custom_filter.json.jbuilder create mode 100644 db/migrate/20210623150613_create_custom_filters.rb create mode 100644 spec/controllers/api/v1/accounts/custom_filters_controller_spec.rb create mode 100644 spec/factories/custom_filters.rb create mode 100644 swagger/definitions/request/custom_filter/create_update_payload.yml create mode 100644 swagger/definitions/resource/custom_filter.yml create mode 100644 swagger/parameters/custom_filter_id.yml create mode 100644 swagger/paths/custom_filters/create.yml create mode 100644 swagger/paths/custom_filters/delete.yml create mode 100644 swagger/paths/custom_filters/index.yml create mode 100644 swagger/paths/custom_filters/show.yml create mode 100644 swagger/paths/custom_filters/update.yml diff --git a/app/controllers/api/v1/accounts/custom_filters_controller.rb b/app/controllers/api/v1/accounts/custom_filters_controller.rb new file mode 100644 index 000000000..169b6cd1e --- /dev/null +++ b/app/controllers/api/v1/accounts/custom_filters_controller.rb @@ -0,0 +1,50 @@ +class Api::V1::Accounts::CustomFiltersController < Api::V1::Accounts::BaseController + protect_from_forgery with: :null_session + before_action :fetch_custom_filters, except: [:create] + before_action :fetch_custom_filter, only: [:show, :update, :destroy] + DEFAULT_FILTER_TYPE = 'conversation'.freeze + + def index; end + + def show; end + + def create + @custom_filter = current_user.custom_filters.create!( + permitted_payload.merge(account_id: Current.account.id) + ) + end + + def update + @custom_filter.update!(permitted_payload) + end + + def destroy + @custom_filter.destroy + head :no_content + end + + private + + def fetch_custom_filters + @custom_filters = current_user.custom_filters.where( + account_id: Current.account.id, + filter_type: permitted_params[:filter_type] || DEFAULT_FILTER_TYPE + ) + end + + def fetch_custom_filter + @custom_filter = @custom_filters.find(permitted_params[:id]) + end + + def permitted_payload + params.require(:custom_filter).permit( + :name, + :filter_type, + query: {} + ) + end + + def permitted_params + params.permit(:id, :filter_type) + end +end diff --git a/app/models/account.rb b/app/models/account.rb index 57d1b88c4..e042b7a95 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -59,6 +59,7 @@ class Account < ApplicationRecord has_many :kbase_categories, dependent: :destroy, class_name: '::Kbase::Category' has_many :kbase_articles, dependent: :destroy, class_name: '::Kbase::Article' has_many :teams, dependent: :destroy + has_many :custom_filters, dependent: :destroy has_flags ACCOUNT_SETTINGS_FLAGS.merge(column: 'settings_flags').merge(DEFAULT_QUERY_SETTING) enum locale: LANGUAGES_CONFIG.map { |key, val| [val[:iso_639_1_code], key] }.to_h diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb new file mode 100644 index 000000000..e506edc5a --- /dev/null +++ b/app/models/custom_filter.rb @@ -0,0 +1,24 @@ +# == Schema Information +# +# Table name: custom_filters +# +# id :bigint not null, primary key +# filter_type :integer default("conversation"), not null +# name :string not null +# query :jsonb not null +# created_at :datetime not null +# updated_at :datetime not null +# account_id :bigint not null +# user_id :bigint not null +# +# Indexes +# +# index_custom_filters_on_account_id (account_id) +# index_custom_filters_on_user_id (user_id) +# +class CustomFilter < ApplicationRecord + belongs_to :user + belongs_to :account + + enum filter_type: { conversation: 0, contact: 1, report: 2 } +end diff --git a/app/models/user.rb b/app/models/user.rb index 3fc8d7668..d8d5931e1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -83,6 +83,7 @@ class User < ApplicationRecord has_many :team_members, dependent: :destroy has_many :teams, through: :team_members has_many :notes, dependent: :nullify + has_many :custom_filters, dependent: :destroy before_validation :set_password_and_uid, on: :create diff --git a/app/views/api/v1/accounts/custom_filters/create.json.jbuilder b/app/views/api/v1/accounts/custom_filters/create.json.jbuilder new file mode 100644 index 000000000..085761e41 --- /dev/null +++ b/app/views/api/v1/accounts/custom_filters/create.json.jbuilder @@ -0,0 +1 @@ +json.partial! 'api/v1/models/custom_filter.json.jbuilder', resource: @custom_filter diff --git a/app/views/api/v1/accounts/custom_filters/index.json.jbuilder b/app/views/api/v1/accounts/custom_filters/index.json.jbuilder new file mode 100644 index 000000000..0fc3e67b4 --- /dev/null +++ b/app/views/api/v1/accounts/custom_filters/index.json.jbuilder @@ -0,0 +1,3 @@ +json.array! @custom_filters do |custom_filter| + json.partial! 'api/v1/models/custom_filter.json.jbuilder', resource: custom_filter +end diff --git a/app/views/api/v1/accounts/custom_filters/show.json.jbuilder b/app/views/api/v1/accounts/custom_filters/show.json.jbuilder new file mode 100644 index 000000000..085761e41 --- /dev/null +++ b/app/views/api/v1/accounts/custom_filters/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! 'api/v1/models/custom_filter.json.jbuilder', resource: @custom_filter diff --git a/app/views/api/v1/accounts/custom_filters/update.json.jbuilder b/app/views/api/v1/accounts/custom_filters/update.json.jbuilder new file mode 100644 index 000000000..085761e41 --- /dev/null +++ b/app/views/api/v1/accounts/custom_filters/update.json.jbuilder @@ -0,0 +1 @@ +json.partial! 'api/v1/models/custom_filter.json.jbuilder', resource: @custom_filter diff --git a/app/views/api/v1/models/_custom_filter.json.jbuilder b/app/views/api/v1/models/_custom_filter.json.jbuilder new file mode 100644 index 000000000..473f2d2c2 --- /dev/null +++ b/app/views/api/v1/models/_custom_filter.json.jbuilder @@ -0,0 +1,6 @@ +json.id resource.id +json.name resource.name +json.filter_type resource.filter_type +json.query resource.query +json.created_at resource.created_at +json.updated_at resource.updated_at diff --git a/config/routes.rb b/config/routes.rb index 82876ceba..60898723c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -87,7 +87,7 @@ Rails.application.routes.draw do resources :labels, only: [:create, :index] end end - + resources :custom_filters, only: [:index, :show, :create, :update, :destroy] resources :inboxes, only: [:index, :create, :update, :destroy] do get :assignable_agents, on: :member get :campaigns, on: :member diff --git a/db/migrate/20210623150613_create_custom_filters.rb b/db/migrate/20210623150613_create_custom_filters.rb new file mode 100644 index 000000000..fe9d920ce --- /dev/null +++ b/db/migrate/20210623150613_create_custom_filters.rb @@ -0,0 +1,12 @@ +class CreateCustomFilters < ActiveRecord::Migration[6.0] + def change + create_table :custom_filters do |t| + t.string :name, null: false + t.integer :filter_type, null: false, default: 0 + t.jsonb :query, null: false, default: '{}' + t.references :account, index: true, null: false + t.references :user, index: true, null: false + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 2e93206de..232aba915 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: 2021_06_18_095823) do +ActiveRecord::Schema.define(version: 2021_06_23_150613) do # These are extensions that must be enabled in order to support this database enable_extension "pg_stat_statements" @@ -267,6 +267,18 @@ ActiveRecord::Schema.define(version: 2021_06_18_095823) do t.index ["team_id"], name: "index_conversations_on_team_id" end + create_table "custom_filters", force: :cascade do |t| + t.string "name", null: false + t.integer "filter_type", default: 0, null: false + t.jsonb "query", default: "{}", null: false + t.bigint "account_id", null: false + t.bigint "user_id", null: false + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["account_id"], name: "index_custom_filters_on_account_id" + t.index ["user_id"], name: "index_custom_filters_on_user_id" + end + create_table "data_imports", force: :cascade do |t| t.bigint "account_id", null: false t.string "data_type", null: false diff --git a/spec/controllers/api/v1/accounts/custom_filters_controller_spec.rb b/spec/controllers/api/v1/accounts/custom_filters_controller_spec.rb new file mode 100644 index 000000000..76798898f --- /dev/null +++ b/spec/controllers/api/v1/accounts/custom_filters_controller_spec.rb @@ -0,0 +1,146 @@ +require 'rails_helper' + +RSpec.describe 'Custom Filters API', type: :request do + let(:account) { create(:account) } + + describe 'GET /api/v1/accounts/{account.id}/custom_filters' do + context 'when it is an unauthenticated user' do + it 'returns unauthorized' do + get "/api/v1/accounts/#{account.id}/custom_filters" + + expect(response).to have_http_status(:unauthorized) + end + end + + context 'when it is an authenticated user' do + let(:user) { create(:user, account: account) } + let!(:custom_filter) { create(:custom_filter, user: user, account: account) } + + it 'returns all custom_filter related to the user' do + get "/api/v1/accounts/#{account.id}/custom_filters", + headers: user.create_new_auth_token, + as: :json + + expect(response).to have_http_status(:success) + response_body = JSON.parse(response.body) + expect(response_body.first['name']).to eq(custom_filter.name) + expect(response_body.first['query']).to eq(custom_filter.query) + end + end + end + + describe 'GET /api/v1/accounts/{account.id}/custom_filters/:id' do + let(:user) { create(:user, account: account) } + let!(:custom_filter) { create(:custom_filter, user: user, account: account) } + + context 'when it is an unauthenticated user' do + it 'returns unauthorized' do + get "/api/v1/accounts/#{account.id}/custom_filters/#{custom_filter.id}" + + expect(response).to have_http_status(:unauthorized) + end + end + + context 'when it is an authenticated user' do + it 'shows the custom filter' do + get "/api/v1/accounts/#{account.id}/custom_filters/#{custom_filter.id}", + headers: user.create_new_auth_token, + as: :json + + expect(response).to have_http_status(:success) + expect(response.body).to include(custom_filter.name) + end + end + end + + describe 'POST /api/v1/accounts/{account.id}/custom_filters' do + let(:payload) { { custom_filter: { name: 'vip-customers', filter_type: 'conversation', query: { labels: ['vip-customers'] } } } } + + context 'when it is an unauthenticated user' do + it 'returns unauthorized' do + expect { post "/api/v1/accounts/#{account.id}/custom_filters", params: payload }.to change(CustomFilter, :count).by(0) + + expect(response).to have_http_status(:unauthorized) + end + end + + context 'when it is an authenticated user' do + let(:user) { create(:user, account: account) } + + it 'creates the filter' do + expect do + post "/api/v1/accounts/#{account.id}/custom_filters", headers: user.create_new_auth_token, + params: payload + end.to change(CustomFilter, :count).by(1) + + expect(response).to have_http_status(:success) + json_response = JSON.parse(response.body) + expect(json_response['name']).to eq 'vip-customers' + end + end + end + + describe 'PATCH /api/v1/accounts/{account.id}/custom_filters/:id' do + let(:payload) { { custom_filter: { name: 'vip-customers', filter_type: 'contact', query: { labels: ['vip-customers'] } } } } + let(:user) { create(:user, account: account) } + let!(:custom_filter) { create(:custom_filter, user: user, account: account) } + + context 'when it is an unauthenticated user' do + it 'returns unauthorized' do + put "/api/v1/accounts/#{account.id}/custom_filters/#{custom_filter.id}", + params: payload + + expect(response).to have_http_status(:unauthorized) + end + end + + context 'when it is an authenticated user' do + it 'updates the custom filter' do + patch "/api/v1/accounts/#{account.id}/custom_filters/#{custom_filter.id}", + headers: user.create_new_auth_token, + params: payload, + as: :json + + expect(response).to have_http_status(:success) + expect(custom_filter.reload.name).to eq('vip-customers') + expect(custom_filter.reload.filter_type).to eq('contact') + expect(custom_filter.reload.query['labels']).to eq(['vip-customers']) + end + + it 'prevents the update of custom filter of another user/account' do + other_account = create(:account) + other_user = create(:user, account: other_account) + other_custom_filter = create(:custom_filter, user: other_user, account: other_account) + + patch "/api/v1/accounts/#{account.id}/custom_filters/#{other_custom_filter.id}", + headers: user.create_new_auth_token, + params: payload, + as: :json + + expect(response).to have_http_status(:not_found) + end + end + end + + describe 'DELETE /api/v1/accounts/{account.id}/custom_filters/:id' do + let(:user) { create(:user, account: account) } + let!(:custom_filter) { create(:custom_filter, user: user, account: account) } + + context 'when it is an unauthenticated user' do + it 'returns unauthorized' do + delete "/api/v1/accounts/#{account.id}/custom_filters/#{custom_filter.id}" + expect(response).to have_http_status(:unauthorized) + end + end + + context 'when it is an authenticated admin user' do + it 'deletes custom filter if it is attached to the current user and account' do + delete "/api/v1/accounts/#{account.id}/custom_filters/#{custom_filter.id}", + headers: user.create_new_auth_token, + as: :json + expect(response).to have_http_status(:no_content) + expect(user.custom_filters.count).to be 0 + end + end + end +end diff --git a/spec/factories/custom_filters.rb b/spec/factories/custom_filters.rb new file mode 100644 index 000000000..009e4094f --- /dev/null +++ b/spec/factories/custom_filters.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :custom_filter do + sequence(:name) { |n| "Custom Filter #{n}" } + filter_type { 0 } + query { { labels: ['customer-support'], status: 'open' } } + user + account + end +end diff --git a/swagger/definitions/index.yml b/swagger/definitions/index.yml index 56aeeef2b..a330326bf 100644 --- a/swagger/definitions/index.yml +++ b/swagger/definitions/index.yml @@ -28,6 +28,8 @@ contact_inboxes: $ref: ./resource/contact_inboxes.yml contactable_inboxes: $ref: ./resource/contactable_inboxes.yml +custom_filter: + $ref: ./resource/custom_filter.yml account: $ref: ./resource/account.yml platform_account: @@ -74,6 +76,10 @@ conversation_message_create: team_create_update_payload: $ref: ./request/team/create_update_payload.yml +# Custom Filter request Payload +custom_filter_create_update_payload: + $ref: ./request/custom_filter/create_update_payload.yml + integrations_hook_create_payload: $ref: ./request/integrations/hook_create_payload.yml diff --git a/swagger/definitions/request/custom_filter/create_update_payload.yml b/swagger/definitions/request/custom_filter/create_update_payload.yml new file mode 100644 index 000000000..86a6cd8c1 --- /dev/null +++ b/swagger/definitions/request/custom_filter/create_update_payload.yml @@ -0,0 +1,12 @@ +type: object +properties: + name: + type: string + description: The name of the custom filter + type: + type: string + enum: ["conversation", "contact", "report"] + description: The description about the custom filter + query: + type: object + description: A query that needs to be saved as a custom filter diff --git a/swagger/definitions/resource/custom_filter.yml b/swagger/definitions/resource/custom_filter.yml new file mode 100644 index 000000000..130377d62 --- /dev/null +++ b/swagger/definitions/resource/custom_filter.yml @@ -0,0 +1,21 @@ +type: object +properties: + id: + type: number + description: The ID of the custom filter + name: + type: string + description: The name of the custom filter + type: + type: string + enum: ["conversation", "contact", "report"] + description: The description about the custom filter + query: + type: object + description: A query that needs to be saved as a custom filter + created_at: + type: datetime + description: The time at which the custom filter was created + updated_at: + type: datetime + description: The time at which the custom filter was updated diff --git a/swagger/index.yml b/swagger/index.yml index c0e36a5ec..2010f1de6 100644 --- a/swagger/index.yml +++ b/swagger/index.yml @@ -10,7 +10,7 @@ info: name: MIT License url: https://opensource.org/licenses/MIT host: app.chatwoot.com -basePath: +basePath: schemes: - https produces: @@ -62,8 +62,9 @@ x-tagGroups: - Integrations - Profile - Teams + - Custom Filter - name: Public - tags: + tags: - Contacts API - Conversations API - - Messages API \ No newline at end of file + - Messages API diff --git a/swagger/parameters/custom_filter_id.yml b/swagger/parameters/custom_filter_id.yml new file mode 100644 index 000000000..46776511f --- /dev/null +++ b/swagger/parameters/custom_filter_id.yml @@ -0,0 +1,6 @@ +in: path +name: custom_filter_id +schema: + type: integer +required: true +description: The numeric ID of the custom filter diff --git a/swagger/parameters/index.yml b/swagger/parameters/index.yml index 3e123b868..4926fe166 100644 --- a/swagger/parameters/index.yml +++ b/swagger/parameters/index.yml @@ -28,9 +28,11 @@ page: platform_user_id: $ref: ./platform_user_id.yml +custom_filter_id: + $ref: ./custom_filter_id.yml public_inbox_identifier: $ref: ./public/inbox_identifier.yml public_contact_identifier: - $ref: ./public/contact_identifier.yml \ No newline at end of file + $ref: ./public/contact_identifier.yml diff --git a/swagger/paths/custom_filters/create.yml b/swagger/paths/custom_filters/create.yml new file mode 100644 index 000000000..6fbc4c7f8 --- /dev/null +++ b/swagger/paths/custom_filters/create.yml @@ -0,0 +1,19 @@ +tags: + - Custom Filter +operationId: create-a-custom-filter +summary: Create a custom filter +description: Create a custom filter in the account +parameters: + - $ref: '#/parameters/account_id' + - name: data + in: body + required: true + schema: + $ref: '#/definitions/custom_filter_create_update_payload' +responses: + 200: + description: Success + schema: + $ref: '#/definitions/custom_filter' + 401: + description: Unauthorized diff --git a/swagger/paths/custom_filters/delete.yml b/swagger/paths/custom_filters/delete.yml new file mode 100644 index 000000000..3ae042e9b --- /dev/null +++ b/swagger/paths/custom_filters/delete.yml @@ -0,0 +1,12 @@ +tags: + - Custom Filter +operationId: delete-a-custom-filter +summary: Delete a custom filter +description: Delete a custom filter from the account +responses: + 200: + description: Success + 401: + description: Unauthorized + 404: + description: The custom filter does not exist in the account diff --git a/swagger/paths/custom_filters/index.yml b/swagger/paths/custom_filters/index.yml new file mode 100644 index 000000000..b66e7b6f8 --- /dev/null +++ b/swagger/paths/custom_filters/index.yml @@ -0,0 +1,15 @@ +tags: + - Custom Filter +operationId: list-all-filters +summary: List all custom filters +description: List all custom filters in a category of a user +responses: + 200: + description: Success + schema: + type: array + description: 'Array of custom filters' + items: + $ref: '#/definitions/custom_filter' + 401: + description: Unauthorized diff --git a/swagger/paths/custom_filters/show.yml b/swagger/paths/custom_filters/show.yml new file mode 100644 index 000000000..e2e2bf529 --- /dev/null +++ b/swagger/paths/custom_filters/show.yml @@ -0,0 +1,14 @@ +tags: + - Custom Filter +operationId: get-details-of-a-single-custom-filter +summary: Get a custom filter details +description: Get the details of a custom filter in the account +responses: + 200: + description: Success + schema: + $ref: '#/definitions/custom_filter' + 401: + description: Unauthorized + 404: + description: The given team ID does not exist in the account diff --git a/swagger/paths/custom_filters/update.yml b/swagger/paths/custom_filters/update.yml new file mode 100644 index 000000000..23ff97781 --- /dev/null +++ b/swagger/paths/custom_filters/update.yml @@ -0,0 +1,18 @@ +tags: + - Custom Filter +operationId: update-a-custom-filter +summary: Update a custom filter +description: Update a custom filter's attributes +parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/custom_filter_create_update_payload' +responses: + 200: + description: Success + schema: + $ref: '#/definitions/custom_filter' + 401: + description: Unauthorized diff --git a/swagger/paths/index.yml b/swagger/paths/index.yml index b358d307e..0d3791fa9 100644 --- a/swagger/paths/index.yml +++ b/swagger/paths/index.yml @@ -92,7 +92,7 @@ public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversat - $ref: '#/parameters/public_contact_identifier' post: $ref: ./public/inboxes/conversations/create.yml - get: + get: $ref: ./public/inboxes/conversations/index.yml public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversations/{conversation_id}/messages: @@ -102,7 +102,7 @@ public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversat - $ref: '#/parameters/conversation_id' post: $ref: ./public/inboxes/messages/create.yml - get: + get: $ref: ./public/inboxes/messages/index.yml public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversations/{conversation_id}/messages/{message_id}: parameters: @@ -264,3 +264,31 @@ public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversat $ref: ./teams/update.yml delete: $ref: ./teams/delete.yml + +### Custom Filters + +# Teams +/api/v1/accounts/{account_id}/custom_filters: + parameters: + - $ref: '#/parameters/account_id' + - in: query + name: filter_type + schema: + type: string + enum: ['conversation', 'contact', 'report'] + required: false + description: The type of custom filter + get: + $ref: ./custom_filters/index.yml + post: + $ref: ./custom_filters/create.yml +/api/v1/accounts/{account_id}/custom_filters/{custom_filter_id}: + parameters: + - $ref: '#/parameters/account_id' + - $ref: '#/parameters/custom_filter_id' + get: + $ref: './custom_filters/show.yml' + patch: + $ref: ./custom_filters/update.yml + delete: + $ref: ./custom_filters/delete.yml diff --git a/swagger/swagger.json b/swagger/swagger.json index 60ab58b48..8ad079bd0 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -2527,6 +2527,162 @@ } } } + }, + "/api/v1/accounts/{account_id}/custom_filters": { + "parameters": [ + { + "$ref": "#/parameters/account_id" + }, + { + "in": "query", + "name": "filter_type", + "schema": { + "type": "string", + "enum": [ + "conversation", + "contact", + "report" + ] + }, + "required": false, + "description": "The type of custom filter" + } + ], + "get": { + "tags": [ + "Custom Filter" + ], + "operationId": "list-all-filters", + "summary": "List all custom filters", + "description": "List all custom filters in a category of a user", + "responses": { + "200": { + "description": "Success", + "schema": { + "type": "array", + "description": "Array of custom filters", + "items": { + "$ref": "#/definitions/custom_filter" + } + } + }, + "401": { + "description": "Unauthorized" + } + } + }, + "post": { + "tags": [ + "Custom Filter" + ], + "operationId": "create-a-custom-filter", + "summary": "Create a custom filter", + "description": "Create a custom filter in the account", + "parameters": [ + { + "$ref": "#/parameters/account_id" + }, + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/custom_filter_create_update_payload" + } + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/custom_filter" + } + }, + "401": { + "description": "Unauthorized" + } + } + } + }, + "/api/v1/accounts/{account_id}/custom_filters/{custom_filter_id}": { + "parameters": [ + { + "$ref": "#/parameters/account_id" + }, + { + "$ref": "#/parameters/custom_filter_id" + } + ], + "get": { + "tags": [ + "Custom Filter" + ], + "operationId": "get-details-of-a-single-custom-filter", + "summary": "Get a custom filter details", + "description": "Get the details of a custom filter in the account", + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/custom_filter" + } + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "The given team ID does not exist in the account" + } + } + }, + "patch": { + "tags": [ + "Custom Filter" + ], + "operationId": "update-a-custom-filter", + "summary": "Update a custom filter", + "description": "Update a custom filter's attributes", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/custom_filter_create_update_payload" + } + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/custom_filter" + } + }, + "401": { + "description": "Unauthorized" + } + } + }, + "delete": { + "tags": [ + "Custom Filter" + ], + "operationId": "delete-a-custom-filter", + "summary": "Delete a custom filter", + "description": "Delete a custom filter from the account", + "responses": { + "200": { + "description": "Success" + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "The custom filter does not exist in the account" + } + } + } } }, "definitions": { @@ -2846,6 +3002,40 @@ } } }, + "custom_filter": { + "type": "object", + "properties": { + "id": { + "type": "number", + "description": "The ID of the custom filter" + }, + "name": { + "type": "string", + "description": "The name of the custom filter" + }, + "type": { + "type": "string", + "enum": [ + "conversation", + "contact", + "report" + ], + "description": "The description about the custom filter" + }, + "query": { + "type": "object", + "description": "A query that needs to be saved as a custom filter" + }, + "created_at": { + "type": "datetime", + "description": "The time at which the custom filter was created" + }, + "updated_at": { + "type": "datetime", + "description": "The time at which the custom filter was updated" + } + } + }, "account": { "type": "object", "properties": { @@ -3191,6 +3381,28 @@ } } }, + "custom_filter_create_update_payload": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the custom filter" + }, + "type": { + "type": "string", + "enum": [ + "conversation", + "contact", + "report" + ], + "description": "The description about the custom filter" + }, + "query": { + "type": "object", + "description": "A query that needs to be saved as a custom filter" + } + } + }, "integrations_hook_create_payload": { "type": "object", "properties": { @@ -3643,6 +3855,15 @@ "required": true, "description": "The numeric ID of the user on the platform" }, + "custom_filter_id": { + "in": "path", + "name": "custom_filter_id", + "schema": { + "type": "integer" + }, + "required": true, + "description": "The numeric ID of the custom filter" + }, "public_inbox_identifier": { "in": "path", "name": "inbox_identifier", @@ -3684,7 +3905,8 @@ "Messages", "Integrations", "Profile", - "Teams" + "Teams", + "Custom Filter" ] }, { From 2e71006f9d399fea08721316aceeced8bfc629a7 Mon Sep 17 00:00:00 2001 From: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com> Date: Tue, 29 Jun 2021 20:06:40 +0530 Subject: [PATCH 29/69] feat: Add option to delete message content (#2532) --- .../widgets/conversation/Message.vue | 92 +++++++++++++++++- .../i18n/locale/en/conversation.json | 6 ++ .../components/MessageContextMenu.vue | 93 +++++++++++++++++++ 3 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue diff --git a/app/javascript/dashboard/components/widgets/conversation/Message.vue b/app/javascript/dashboard/components/widgets/conversation/Message.vue index d5d6e9edf..6c319ee15 100644 --- a/app/javascript/dashboard/components/widgets/conversation/Message.vue +++ b/app/javascript/dashboard/components/widgets/conversation/Message.vue @@ -43,6 +43,16 @@ :source-id="data.source_id" />
+ + @@ -294,4 +345,35 @@ export default { margin-left: var(--space-smaller); } } + +.button--delete-message { + visibility: hidden; +} + +.wrap { + display: flex; + align-items: flex-end; +} + +li.right .wrap { + flex-direction: row-reverse; +} + +li.left, +li.right { + &:hover .button--delete-message { + visibility: visible; + } +} + +.has-context-menu { + background: var(--color-background); + .button--delete-message { + visibility: visible; + } +} + +.context-menu { + position: relative; +} diff --git a/app/javascript/dashboard/i18n/locale/en/conversation.json b/app/javascript/dashboard/i18n/locale/en/conversation.json index 587530e74..133bdcaa2 100644 --- a/app/javascript/dashboard/i18n/locale/en/conversation.json +++ b/app/javascript/dashboard/i18n/locale/en/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -66,6 +68,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "Delete" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue b/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue new file mode 100644 index 000000000..9a7cd1d4c --- /dev/null +++ b/app/javascript/dashboard/modules/conversations/components/MessageContextMenu.vue @@ -0,0 +1,93 @@ + + + From dd9d5e410cfbdfe879363506d085bfc55b5fd041 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Tue, 29 Jun 2021 20:59:41 +0530 Subject: [PATCH 30/69] feat: Add CSAT response APIs (#2503) Co-authored-by: Pranav Raj S --- app/builders/csat_surveys/response_builder.rb | 28 ++++++++++ app/builders/v2/report_builder.rb | 12 +---- .../csat_survey_responses_controller.rb | 22 ++++++++ .../api/v1/widget/messages_controller.rb | 2 +- app/dispatchers/async_dispatcher.rb | 8 +-- app/helpers/date_range_helper.rb | 19 +++++++ .../helpers/botMessageContentHelper.js | 6 +-- .../specs/botMessageContentHelper.spec.js | 7 ++- .../widget/components/AgentMessageBubble.vue | 2 +- app/listeners/csat_survey_listener.rb | 8 +++ app/models/account.rb | 1 + app/models/contact.rb | 1 + app/models/conversation.rb | 1 + app/models/csat_survey_response.rb | 43 +++++++++++++++ app/models/message.rb | 1 + app/models/user.rb | 1 + app/policies/csat_survey_response_policy.rb | 5 ++ .../csat_survey_responses/index.json.jbuilder | 3 ++ .../_csat_survey_response.json.jbuilder | 9 ++++ config/routes.rb | 1 + ...0623155413_create_csat_survey_responses.rb | 15 ++++++ db/schema.rb | 24 ++++++++- .../csat_surveys/response_builder_spec.rb | 30 +++++++++++ .../v1/accounts/campaigns_controller_spec.rb | 4 +- .../csat_survey_responses_controller_spec.rb | 52 +++++++++++++++++++ spec/factories/csat_survey_responses.rb | 12 +++++ spec/listeners/csat_survey_listener_spec.rb | 36 +++++++++++++ spec/models/csat_survey_response_spec.rb | 28 ++++++++++ 28 files changed, 358 insertions(+), 23 deletions(-) create mode 100644 app/builders/csat_surveys/response_builder.rb create mode 100644 app/controllers/api/v1/accounts/csat_survey_responses_controller.rb create mode 100644 app/helpers/date_range_helper.rb create mode 100644 app/listeners/csat_survey_listener.rb create mode 100644 app/models/csat_survey_response.rb create mode 100644 app/policies/csat_survey_response_policy.rb create mode 100644 app/views/api/v1/accounts/csat_survey_responses/index.json.jbuilder create mode 100644 app/views/api/v1/models/_csat_survey_response.json.jbuilder create mode 100644 db/migrate/20210623155413_create_csat_survey_responses.rb create mode 100644 spec/builders/csat_surveys/response_builder_spec.rb create mode 100644 spec/controllers/api/v1/accounts/csat_survey_responses_controller_spec.rb create mode 100644 spec/factories/csat_survey_responses.rb create mode 100644 spec/listeners/csat_survey_listener_spec.rb create mode 100644 spec/models/csat_survey_response_spec.rb diff --git a/app/builders/csat_surveys/response_builder.rb b/app/builders/csat_surveys/response_builder.rb new file mode 100644 index 000000000..7c120ddb2 --- /dev/null +++ b/app/builders/csat_surveys/response_builder.rb @@ -0,0 +1,28 @@ +class CsatSurveys::ResponseBuilder + pattr_initialize [:message] + + def perform + raise 'Invalid Message' unless message.input_csat? + + conversation = message.conversation + rating = message.content_attributes.dig('submitted_values', 'csat_survey_response', 'rating') + feedback_message = message.content_attributes.dig('submitted_values', 'csat_survey_response', 'feedback_message') + + return if rating.blank? + + process_csat_response(conversation, rating, feedback_message) + end + + private + + def process_csat_response(conversation, rating, feedback_message) + csat_survey_response = message.csat_survey_response || CsatSurveyResponse.new( + message_id: message.id, account_id: message.account_id, conversation_id: message.conversation_id, + contact_id: conversation.contact_id, assigned_agent: conversation.assignee + ) + csat_survey_response.rating = rating + csat_survey_response.feedback_message = feedback_message + csat_survey_response.save! + csat_survey_response + end +end diff --git a/app/builders/v2/report_builder.rb b/app/builders/v2/report_builder.rb index 35f484f95..2a7a55a8a 100644 --- a/app/builders/v2/report_builder.rb +++ b/app/builders/v2/report_builder.rb @@ -1,4 +1,5 @@ class V2::ReportBuilder + include DateRangeHelper attr_reader :account, :params def initialize(account, params) @@ -83,10 +84,6 @@ class V2::ReportBuilder .average(:value) end - def range - parse_date_time(params[:since])..parse_date_time(params[:until]) - end - # Taking average of average is not too accurate # https://en.wikipedia.org/wiki/Simpson's_paradox # TODO: Will optimize this later @@ -101,11 +98,4 @@ class V2::ReportBuilder (avg_first_response_time.values.sum / avg_first_response_time.values.length) end - - def parse_date_time(datetime) - return datetime if datetime.is_a?(DateTime) - return datetime.to_datetime if datetime.is_a?(Time) || datetime.is_a?(Date) - - DateTime.strptime(datetime, '%s') - end end diff --git a/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb b/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb new file mode 100644 index 000000000..c449ecf96 --- /dev/null +++ b/app/controllers/api/v1/accounts/csat_survey_responses_controller.rb @@ -0,0 +1,22 @@ +class Api::V1::Accounts::CsatSurveyResponsesController < Api::V1::Accounts::BaseController + include DateRangeHelper + + RESULTS_PER_PAGE = 25 + + before_action :check_authorization + before_action :csat_survey_responses, only: [:index] + + def index; end + + private + + def csat_survey_responses + @csat_survey_responses = Current.account.csat_survey_responses + @csat_survey_responses = @csat_survey_responses.where(created_at: range) if range.present? + @csat_survey_responses.page(@current_page).per(RESULTS_PER_PAGE) + end + + def set_current_page + @current_page = params[:page] || 1 + end +end diff --git a/app/controllers/api/v1/widget/messages_controller.rb b/app/controllers/api/v1/widget/messages_controller.rb index f0286ecd2..9e6f770ad 100644 --- a/app/controllers/api/v1/widget/messages_controller.rb +++ b/app/controllers/api/v1/widget/messages_controller.rb @@ -54,7 +54,7 @@ class Api::V1::Widget::MessagesController < Api::V1::Widget::BaseController end def message_update_params - params.permit(message: [{ submitted_values: [:name, :title, :value, { csat_survey_response: [:feedback, :rating] }] }]) + params.permit(message: [{ submitted_values: [:name, :title, :value, { csat_survey_response: [:feedback_message, :rating] }] }]) end def permitted_params diff --git a/app/dispatchers/async_dispatcher.rb b/app/dispatchers/async_dispatcher.rb index 0e238e3a0..1cbb56747 100644 --- a/app/dispatchers/async_dispatcher.rb +++ b/app/dispatchers/async_dispatcher.rb @@ -10,10 +10,12 @@ class AsyncDispatcher < BaseDispatcher def listeners [ + CampaignListener.instance, + CsatSurveyListener.instance, EventListener.instance, - WebhookListener.instance, - InstallationWebhookListener.instance, HookListener.instance, - CampaignListener.instance + HookListener.instance, + InstallationWebhookListener.instance, + WebhookListener.instance ] end end diff --git a/app/helpers/date_range_helper.rb b/app/helpers/date_range_helper.rb new file mode 100644 index 000000000..175d6c72b --- /dev/null +++ b/app/helpers/date_range_helper.rb @@ -0,0 +1,19 @@ +############################################## +# Helpers to implement date range filtering to APIs +# Include in your controller or service class where params is available +############################################## + +module DateRangeHelper + def range + return if params[:since].blank? || params[:until].blank? + + parse_date_time(params[:since])..parse_date_time(params[:until]) + end + + def parse_date_time(datetime) + return datetime if datetime.is_a?(DateTime) + return datetime.to_datetime if datetime.is_a?(Time) || datetime.is_a?(Date) + + DateTime.strptime(datetime, '%s') + end +end diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js b/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js index b7e105abf..2f4521f72 100644 --- a/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/botMessageContentHelper.js @@ -43,7 +43,7 @@ const generateCSATContent = ( const { submitted_values: { csat_survey_response: surveyResponse = {} } = {}, } = contentAttributes; - const { rating, feedback } = surveyResponse || {}; + const { rating, feedback_message } = surveyResponse || {}; let messageContent = ''; if (rating) { @@ -53,9 +53,9 @@ const generateCSATContent = ( messageContent += `
${ratingTitle}
`; messageContent += `

${ratingObject.emoji}

`; } - if (feedback) { + if (feedback_message) { messageContent += `
${feedbackTitle}
`; - messageContent += `

${feedback}

`; + messageContent += `

${feedback_message}

`; } return messageContent; }; diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js index 9268b4559..a0901aa1a 100644 --- a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/botMessageContentHelper.spec.js @@ -21,7 +21,10 @@ describe('#generateBotMessageContent', () => { expect( generateBotMessageContent('input_csat', { submitted_values: { - csat_survey_response: { rating: 5, feedback: 'Great Service' }, + csat_survey_response: { + rating: 5, + feedback_message: 'Great Service', + }, }, }) ).toEqual( @@ -33,7 +36,7 @@ describe('#generateBotMessageContent', () => { 'input_csat', { submitted_values: { - csat_survey_response: { rating: 1, feedback: '' }, + csat_survey_response: { rating: 1, feedback_message: '' }, }, }, { csat: { ratingTitle: 'റേറ്റിംഗ്', feedbackTitle: 'പ്രതികരണം' } } diff --git a/app/javascript/widget/components/AgentMessageBubble.vue b/app/javascript/widget/components/AgentMessageBubble.vue index 071a37d26..bdb7ba981 100755 --- a/app/javascript/widget/components/AgentMessageBubble.vue +++ b/app/javascript/widget/components/AgentMessageBubble.vue @@ -130,7 +130,7 @@ export default { submittedValues: { csat_survey_response: { rating, - feedback, + feedback_message: feedback, }, }, messageId: this.messageId, diff --git a/app/listeners/csat_survey_listener.rb b/app/listeners/csat_survey_listener.rb new file mode 100644 index 000000000..abc366400 --- /dev/null +++ b/app/listeners/csat_survey_listener.rb @@ -0,0 +1,8 @@ +class CsatSurveyListener < BaseListener + def message_updated(event) + message = extract_message_and_account(event)[0] + return unless message.input_csat? + + CsatSurveys::ResponseBuilder.new(message: message).perform + end +end diff --git a/app/models/account.rb b/app/models/account.rb index e042b7a95..ba73d1eaa 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -34,6 +34,7 @@ class Account < ApplicationRecord has_many :account_users, dependent: :destroy has_many :agent_bot_inboxes, dependent: :destroy has_many :agent_bots, dependent: :destroy + has_many :csat_survey_responses, dependent: :destroy has_many :data_imports, dependent: :destroy has_many :users, through: :account_users has_many :inboxes, dependent: :destroy diff --git a/app/models/contact.rb b/app/models/contact.rb index 62d4970ea..f789eaf17 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -39,6 +39,7 @@ class Contact < ApplicationRecord belongs_to :account has_many :conversations, dependent: :destroy has_many :contact_inboxes, dependent: :destroy + has_many :csat_survey_responses, dependent: :destroy has_many :inboxes, through: :contact_inboxes has_many :messages, as: :sender, dependent: :destroy has_many :notes, dependent: :destroy diff --git a/app/models/conversation.rb b/app/models/conversation.rb index 613e2a1c1..97115dde6 100644 --- a/app/models/conversation.rb +++ b/app/models/conversation.rb @@ -60,6 +60,7 @@ class Conversation < ApplicationRecord belongs_to :campaign, optional: true has_many :messages, dependent: :destroy, autosave: true + has_one :csat_survey_response, dependent: :destroy before_create :set_bot_conversation diff --git a/app/models/csat_survey_response.rb b/app/models/csat_survey_response.rb new file mode 100644 index 000000000..eec70c8b4 --- /dev/null +++ b/app/models/csat_survey_response.rb @@ -0,0 +1,43 @@ +# == Schema Information +# +# Table name: csat_survey_responses +# +# id :bigint not null, primary key +# feedback_message :text +# rating :integer not null +# created_at :datetime not null +# updated_at :datetime not null +# account_id :bigint not null +# assigned_agent_id :bigint +# contact_id :bigint not null +# conversation_id :bigint not null +# message_id :bigint not null +# +# Indexes +# +# index_csat_survey_responses_on_account_id (account_id) +# index_csat_survey_responses_on_assigned_agent_id (assigned_agent_id) +# index_csat_survey_responses_on_contact_id (contact_id) +# index_csat_survey_responses_on_conversation_id (conversation_id) +# index_csat_survey_responses_on_message_id (message_id) UNIQUE +# +# Foreign Keys +# +# fk_rails_... (account_id => accounts.id) +# fk_rails_... (assigned_agent_id => users.id) +# fk_rails_... (contact_id => contacts.id) +# fk_rails_... (conversation_id => conversations.id) +# fk_rails_... (message_id => messages.id) +# +class CsatSurveyResponse < ApplicationRecord + belongs_to :account + belongs_to :conversation + belongs_to :contact + belongs_to :message + belongs_to :assigned_agent, class_name: 'User', optional: true + + validates :rating, presence: true, inclusion: { in: [1, 2, 3, 4, 5] } + validates :account_id, presence: true + validates :contact_id, presence: true + validates :conversation_id, presence: true +end diff --git a/app/models/message.rb b/app/models/message.rb index 35c175aa2..a3657ce8b 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -79,6 +79,7 @@ class Message < ApplicationRecord belongs_to :sender, polymorphic: true, required: false has_many :attachments, dependent: :destroy, autosave: true, before_add: :validate_attachments_limit + has_one :csat_survey_response, dependent: :destroy after_create :reopen_conversation, :notify_via_mail diff --git a/app/models/user.rb b/app/models/user.rb index d8d5931e1..56608f687 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -71,6 +71,7 @@ class User < ApplicationRecord has_many :assigned_conversations, foreign_key: 'assignee_id', class_name: 'Conversation', dependent: :nullify alias_attribute :conversations, :assigned_conversations + has_many :csat_survey_responses, foreign_key: 'assigned_agent_id', dependent: :nullify has_many :inbox_members, dependent: :destroy has_many :inboxes, through: :inbox_members, source: :inbox diff --git a/app/policies/csat_survey_response_policy.rb b/app/policies/csat_survey_response_policy.rb new file mode 100644 index 000000000..c49b284f0 --- /dev/null +++ b/app/policies/csat_survey_response_policy.rb @@ -0,0 +1,5 @@ +class CsatSurveyResponsePolicy < ApplicationPolicy + def index? + @account_user.administrator? + end +end diff --git a/app/views/api/v1/accounts/csat_survey_responses/index.json.jbuilder b/app/views/api/v1/accounts/csat_survey_responses/index.json.jbuilder new file mode 100644 index 000000000..e5e3dbc93 --- /dev/null +++ b/app/views/api/v1/accounts/csat_survey_responses/index.json.jbuilder @@ -0,0 +1,3 @@ +json.array! @csat_survey_responses do |csat_survey_response| + json.partial! 'api/v1/models/csat_survey_response.json.jbuilder', resource: csat_survey_response +end diff --git a/app/views/api/v1/models/_csat_survey_response.json.jbuilder b/app/views/api/v1/models/_csat_survey_response.json.jbuilder new file mode 100644 index 000000000..3fd60addb --- /dev/null +++ b/app/views/api/v1/models/_csat_survey_response.json.jbuilder @@ -0,0 +1,9 @@ +json.id resource.id +json.rating resource.rating +json.feedback_message resource.feedback_message +json.account_id resource.account_id +json.message_id resource.message_id +json.contact resource.contact +json.conversation_id resource.conversation.display_id +json.assigned_agent resource.assigned_agent +json.created_at resource.created_at diff --git a/config/routes.rb b/config/routes.rb index 60898723c..e8494a0ce 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -87,6 +87,7 @@ Rails.application.routes.draw do resources :labels, only: [:create, :index] end end + resources :csat_survey_responses, only: [:index] resources :custom_filters, only: [:index, :show, :create, :update, :destroy] resources :inboxes, only: [:index, :create, :update, :destroy] do get :assignable_agents, on: :member diff --git a/db/migrate/20210623155413_create_csat_survey_responses.rb b/db/migrate/20210623155413_create_csat_survey_responses.rb new file mode 100644 index 000000000..02c232b24 --- /dev/null +++ b/db/migrate/20210623155413_create_csat_survey_responses.rb @@ -0,0 +1,15 @@ +class CreateCsatSurveyResponses < ActiveRecord::Migration[6.0] + def change + create_table :csat_survey_responses do |t| + t.references :account, null: false, foreign_key: true + t.references :conversation, null: false, foreign_key: true + t.references :message, null: false, foreign_key: true, index: { unique: true } + t.integer :rating, null: false + t.text :feedback_message + t.references :contact, null: false, foreign_key: true + t.references :assigned_agent, foreign_key: { to_table: :users } + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 232aba915..cc0ad871d 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: 2021_06_23_150613) do +ActiveRecord::Schema.define(version: 2021_06_23_155413) do # These are extensions that must be enabled in order to support this database enable_extension "pg_stat_statements" @@ -267,6 +267,23 @@ ActiveRecord::Schema.define(version: 2021_06_23_150613) do t.index ["team_id"], name: "index_conversations_on_team_id" end + create_table "csat_survey_responses", force: :cascade do |t| + t.bigint "account_id", null: false + t.bigint "conversation_id", null: false + t.bigint "message_id", null: false + t.integer "rating", null: false + t.text "feedback_message" + t.bigint "contact_id", null: false + t.bigint "assigned_agent_id" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["account_id"], name: "index_csat_survey_responses_on_account_id" + t.index ["assigned_agent_id"], name: "index_csat_survey_responses_on_assigned_agent_id" + t.index ["contact_id"], name: "index_csat_survey_responses_on_contact_id" + t.index ["conversation_id"], name: "index_csat_survey_responses_on_conversation_id" + t.index ["message_id"], name: "index_csat_survey_responses_on_message_id", unique: true + end + create_table "custom_filters", force: :cascade do |t| t.string "name", null: false t.integer "filter_type", default: 0, null: false @@ -652,6 +669,11 @@ ActiveRecord::Schema.define(version: 2021_06_23_150613) do add_foreign_key "conversations", "campaigns" add_foreign_key "conversations", "contact_inboxes" add_foreign_key "conversations", "teams" + add_foreign_key "csat_survey_responses", "accounts" + add_foreign_key "csat_survey_responses", "contacts" + add_foreign_key "csat_survey_responses", "conversations" + add_foreign_key "csat_survey_responses", "messages" + add_foreign_key "csat_survey_responses", "users", column: "assigned_agent_id" add_foreign_key "data_imports", "accounts" add_foreign_key "notes", "accounts" add_foreign_key "notes", "contacts" diff --git a/spec/builders/csat_surveys/response_builder_spec.rb b/spec/builders/csat_surveys/response_builder_spec.rb new file mode 100644 index 000000000..5400e9bfd --- /dev/null +++ b/spec/builders/csat_surveys/response_builder_spec.rb @@ -0,0 +1,30 @@ +require 'rails_helper' + +describe ::CsatSurveys::ResponseBuilder do + let(:message) do + create( + :message, content_type: :input_csat, + content_attributes: { 'submitted_values': { 'csat_survey_response': { 'rating': 5, 'feedback_message': 'hello' } } } + ) + end + + describe '#perform' do + it 'creates a new csat survey response' do + csat_survey_response = described_class.new( + message: message + ).perform + + expect(csat_survey_response.valid?).to eq(true) + end + + it 'updates the value of csat survey response if response already exists' do + existing_survey_response = create(:csat_survey_response, message: message) + csat_survey_response = described_class.new( + message: message + ).perform + + expect(csat_survey_response.id).to eq(existing_survey_response.id) + expect(csat_survey_response.rating).to eq(5) + end + end +end diff --git a/spec/controllers/api/v1/accounts/campaigns_controller_spec.rb b/spec/controllers/api/v1/accounts/campaigns_controller_spec.rb index ebe7d4dae..5371eb535 100644 --- a/spec/controllers/api/v1/accounts/campaigns_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/campaigns_controller_spec.rb @@ -18,7 +18,9 @@ RSpec.describe 'Campaigns API', type: :request do let!(:campaign) { create(:campaign, account: account) } it 'returns unauthorized for agents' do - get "/api/v1/accounts/#{account.id}/campaigns" + get "/api/v1/accounts/#{account.id}/campaigns", + headers: agent.create_new_auth_token, + as: :json expect(response).to have_http_status(:unauthorized) end 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 new file mode 100644 index 000000000..23e7e96cd --- /dev/null +++ b/spec/controllers/api/v1/accounts/csat_survey_responses_controller_spec.rb @@ -0,0 +1,52 @@ +require 'rails_helper' + +RSpec.describe 'CSAT Survey Responses API', type: :request do + let(:account) { create(:account) } + let!(:csat_survey_response) { create(:csat_survey_response, account: account) } + let(:administrator) { create(:user, account: account, role: :administrator) } + let(:agent) { create(:user, account: account, role: :agent) } + + describe 'GET /api/v1/accounts/{account.id}/csat_survey_responses' do + context 'when it is an unauthenticated user' do + it 'returns unauthorized' do + get "/api/v1/accounts/#{account.id}/csat_survey_responses" + + expect(response).to have_http_status(:unauthorized) + end + end + + context 'when it is an authenticated user' do + it 'returns unauthorized for agents' do + get "/api/v1/accounts/#{account.id}/csat_survey_responses", + headers: agent.create_new_auth_token, + as: :json + + expect(response).to have_http_status(:unauthorized) + end + + it 'returns all the csat survey responses for administrators' do + get "/api/v1/accounts/#{account.id}/csat_survey_responses", + headers: administrator.create_new_auth_token, + as: :json + + expect(response).to have_http_status(:success) + expect(JSON.parse(response.body).first['feedback_message']).to eq(csat_survey_response.feedback_message) + end + + it 'filters csat responsed based on a date range' do + csat_10_days_ago = create(:csat_survey_response, account: account, created_at: 10.days.ago) + csat_3_days_ago = create(:csat_survey_response, account: account, created_at: 3.days.ago) + + get "/api/v1/accounts/#{account.id}/csat_survey_responses", + params: { since: 5.days.ago.to_time.to_i.to_s, until: Time.zone.today.to_time.to_i.to_s }, + headers: administrator.create_new_auth_token, + as: :json + + expect(response).to have_http_status(:success) + response_data = JSON.parse(response.body) + expect(response_data.pluck('id')).to include(csat_3_days_ago.id) + expect(response_data.pluck('id')).not_to include(csat_10_days_ago.id) + end + end + end +end diff --git a/spec/factories/csat_survey_responses.rb b/spec/factories/csat_survey_responses.rb new file mode 100644 index 000000000..92a8bdbe6 --- /dev/null +++ b/spec/factories/csat_survey_responses.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :csat_survey_response do + rating { 1 } + feedback_message { Faker::Movie.quote } + account + conversation + message + contact + end +end diff --git a/spec/listeners/csat_survey_listener_spec.rb b/spec/listeners/csat_survey_listener_spec.rb new file mode 100644 index 000000000..9161c4e71 --- /dev/null +++ b/spec/listeners/csat_survey_listener_spec.rb @@ -0,0 +1,36 @@ +require 'rails_helper' +describe CsatSurveyListener do + let(:listener) { described_class.instance } + let!(:account) { create(:account) } + let!(:user) { create(:user, account: account) } + let!(:inbox) { create(:inbox, account: account) } + let!(:conversation) { create(:conversation, account: account, inbox: inbox, assignee: user) } + let!(:message) do + create( + :message, message_type: 'outgoing', account: account, inbox: inbox, conversation: conversation, + content_type: :input_csat, + content_attributes: { 'submitted_values': { 'csat_survey_response': { 'rating': 5, 'feedback_message': 'hello' } } } + ) + end + let!(:event) { Events::Base.new(event_name, Time.zone.now, message: message) } + + describe '#message_updated' do + let(:event_name) { 'message.updated' } + let(:response_builder) { double } + + context 'when CsatSurveys::ResponseBuilder' do + it 'triggers if message is input csat' do + expect(response_builder).to receive(:perform) + expect(CsatSurveys::ResponseBuilder).to receive(:new).with(message: message).and_return(response_builder).once + listener.message_updated(event) + end + + it 'will not trigger if message is not input csat' do + message = create(:message) + event = Events::Base.new(event_name, Time.zone.now, message: message) + expect(CsatSurveys::ResponseBuilder).not_to receive(:new).with(message: message) + listener.message_updated(event) + end + end + end +end diff --git a/spec/models/csat_survey_response_spec.rb b/spec/models/csat_survey_response_spec.rb new file mode 100644 index 000000000..931ea15e2 --- /dev/null +++ b/spec/models/csat_survey_response_spec.rb @@ -0,0 +1,28 @@ +require 'rails_helper' + +RSpec.describe CsatSurveyResponse, type: :model do + describe 'validations' do + it { is_expected.to validate_presence_of(:rating) } + it { is_expected.to validate_presence_of(:account_id) } + it { is_expected.to validate_presence_of(:conversation_id) } + it { is_expected.to validate_presence_of(:contact_id) } + + it 'validates that the rating can only be in range 1-5' do + csat_survey_response = build(:csat_survey_response, rating: 6) + expect(csat_survey_response.valid?).to eq false + end + end + + describe 'associations' do + it { is_expected.to belong_to(:account) } + it { is_expected.to belong_to(:conversation) } + it { is_expected.to belong_to(:contact) } + end + + describe 'validates_factory' do + it 'creates valid csat_survey_response object' do + csat_survey_response = create(:csat_survey_response) + expect(csat_survey_response.valid?).to eq true + end + end +end From e6e9916fdb377400af0a7a9985a9a394b9819013 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Wed, 30 Jun 2021 20:32:17 +0530 Subject: [PATCH 31/69] feat: Add drag and drop for images/files in the agent input box (#2546) --- .../widgets/WootWriter/ReplyBottomPanel.vue | 28 +++++++++++++++++++ .../i18n/locale/en/conversation.json | 3 +- .../shared/assets/stylesheets/colors.scss | 1 + 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/javascript/dashboard/components/widgets/WootWriter/ReplyBottomPanel.vue b/app/javascript/dashboard/components/widgets/WootWriter/ReplyBottomPanel.vue index 60e7625e5..65bcdc74f 100644 --- a/app/javascript/dashboard/components/widgets/WootWriter/ReplyBottomPanel.vue +++ b/app/javascript/dashboard/components/widgets/WootWriter/ReplyBottomPanel.vue @@ -12,8 +12,11 @@ /> + + +
@@ -198,4 +212,18 @@ export default { background: var(--s-100); } } + +.modal-mask { + color: var(--s-600); + background: var(--white-transparent); + flex-direction: column; +} + +.page-sub-title { + color: var(--s-600); +} + +.icon { + font-size: 8rem; +} diff --git a/app/javascript/dashboard/i18n/locale/en/conversation.json b/app/javascript/dashboard/i18n/locale/en/conversation.json index 133bdcaa2..81c023aa5 100644 --- a/app/javascript/dashboard/i18n/locale/en/conversation.json +++ b/app/javascript/dashboard/i18n/locale/en/conversation.json @@ -56,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team", "CHANGE_STATUS": "Conversation status changed", diff --git a/app/javascript/shared/assets/stylesheets/colors.scss b/app/javascript/shared/assets/stylesheets/colors.scss index eca7b4514..ba1b44045 100644 --- a/app/javascript/shared/assets/stylesheets/colors.scss +++ b/app/javascript/shared/assets/stylesheets/colors.scss @@ -1,5 +1,6 @@ :root { --white: #fff; + --white-transparent: rgba(255, 255, 255, 0.9); --w-50: #E3F2FF; --w-100: #BBDDFF; From f0f66c7da683128f39e6bf07c79c6fb80c44b872 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Wed, 30 Jun 2021 21:09:44 +0530 Subject: [PATCH 32/69] feat: Add ability to create a new conversation if the previous conversation is resolved (#2512) Co-authored-by: Pranav Raj S --- app/javascript/shared/constants/busEvents.js | 1 + app/javascript/widget/App.vue | 2 +- .../widget/components/ChatFooter.vue | 57 +++++++++++++++++-- app/javascript/widget/i18n/locale/en.json | 1 + app/javascript/widget/mixins/configMixin.js | 10 +++- .../widget/mixins/specs/configMixin.spec.js | 9 +++ .../store/modules/conversation/actions.js | 3 +- .../store/modules/conversationAttributes.js | 10 +++- .../conversationAttributes/actions.spec.js | 14 +++-- .../conversationAttributes/mutations.spec.js | 11 ++++ app/javascript/widget/store/types.js | 1 + app/javascript/widget/views/Home.vue | 15 ++++- app/views/widgets/show.html.erb | 1 + 13 files changed, 119 insertions(+), 16 deletions(-) diff --git a/app/javascript/shared/constants/busEvents.js b/app/javascript/shared/constants/busEvents.js index 45992a63d..6958f755f 100644 --- a/app/javascript/shared/constants/busEvents.js +++ b/app/javascript/shared/constants/busEvents.js @@ -2,4 +2,5 @@ export const BUS_EVENTS = { SET_REFERRER_HOST: 'SET_REFERRER_HOST', SET_TWEET_REPLY: 'SET_TWEET_REPLY', ATTACHMENT_SIZE_CHECK_ERROR: 'ATTACHMENT_SIZE_CHECK_ERROR', + START_NEW_CONVERSATION: 'START_NEW_CONVERSATION', }; diff --git a/app/javascript/widget/App.vue b/app/javascript/widget/App.vue index 60c02076f..fc2e9bb55 100755 --- a/app/javascript/widget/App.vue +++ b/app/javascript/widget/App.vue @@ -77,7 +77,7 @@ export default { this.registerListeners(); this.sendRNWebViewLoadedEvent(); } - this.$store.dispatch('conversationAttributes/get'); + this.$store.dispatch('conversationAttributes/getAttributes'); this.setWidgetColor(window.chatwootWebChannel); this.registerUnreadEvents(); this.registerCampaignEvents(); diff --git a/app/javascript/widget/components/ChatFooter.vue b/app/javascript/widget/components/ChatFooter.vue index dbfbb5633..75d64cae2 100755 --- a/app/javascript/widget/components/ChatFooter.vue +++ b/app/javascript/widget/components/ChatFooter.vue @@ -1,19 +1,33 @@ diff --git a/app/javascript/widget/i18n/locale/en.json b/app/javascript/widget/i18n/locale/en.json index dd114afff..bbb43acfa 100644 --- a/app/javascript/widget/i18n/locale/en.json +++ b/app/javascript/widget/i18n/locale/en.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Typically replies in a day" }, "START_CONVERSATION": "Start Conversation", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "See new messages", "CLOSE_MESSAGES_BUTTON": "Close", diff --git a/app/javascript/widget/mixins/configMixin.js b/app/javascript/widget/mixins/configMixin.js index c70d9ca57..53cc26a00 100644 --- a/app/javascript/widget/mixins/configMixin.js +++ b/app/javascript/widget/mixins/configMixin.js @@ -22,10 +22,16 @@ export default { return window.chatwootWebChannel.preChatFormEnabled; }, preChatFormOptions() { + let requireEmail = false; + let preChatMessage = ''; const options = window.chatwootWebChannel.preChatFormOptions || {}; + if (!this.isOnNewConversation) { + requireEmail = options.require_email; + preChatMessage = options.pre_chat_message; + } return { - requireEmail: options.require_email, - preChatMessage: options.pre_chat_message, + requireEmail, + preChatMessage, }; }, }, diff --git a/app/javascript/widget/mixins/specs/configMixin.spec.js b/app/javascript/widget/mixins/specs/configMixin.spec.js index 663cf695d..c87d9fd71 100644 --- a/app/javascript/widget/mixins/specs/configMixin.spec.js +++ b/app/javascript/widget/mixins/specs/configMixin.spec.js @@ -6,6 +6,7 @@ global.chatwootWebChannel = { avatarUrl: 'https://test.url', hasAConnectedAgentBot: 'AgentBot', enabledFeatures: ['emoji_picker', 'attachments'], + preChatFormOptions: { require_email: false, pre_chat_message: '' }, }; global.chatwootWidgetDefaults = { @@ -31,6 +32,14 @@ describe('configMixin', () => { avatarUrl: 'https://test.url', hasAConnectedAgentBot: 'AgentBot', enabledFeatures: ['emoji_picker', 'attachments'], + preChatFormOptions: { + pre_chat_message: '', + require_email: false, + }, + }); + expect(wrapper.vm.preChatFormOptions).toEqual({ + requireEmail: false, + preChatMessage: '', }); }); }); diff --git a/app/javascript/widget/store/modules/conversation/actions.js b/app/javascript/widget/store/modules/conversation/actions.js index 3101428a0..ddae68024 100644 --- a/app/javascript/widget/store/modules/conversation/actions.js +++ b/app/javascript/widget/store/modules/conversation/actions.js @@ -11,7 +11,7 @@ import { refreshActionCableConnector } from '../../../helpers/actionCable'; import { createTemporaryMessage, onNewMessageCreated } from './helpers'; export const actions = { - createConversation: async ({ commit }, params) => { + createConversation: async ({ commit, dispatch }, params) => { commit('setConversationUIFlag', { isCreating: true }); try { const { data } = await createConversationAPI(params); @@ -22,6 +22,7 @@ export const actions = { const [message = {}] = messages; commit('pushMessageToConversation', message); refreshActionCableConnector(pubsubToken); + dispatch('conversationAttributes/getAttributes', {}, { root: true }); } catch (error) { console.log(error); // Ignore error diff --git a/app/javascript/widget/store/modules/conversationAttributes.js b/app/javascript/widget/store/modules/conversationAttributes.js index 3391b2960..ddcd8d6e0 100644 --- a/app/javascript/widget/store/modules/conversationAttributes.js +++ b/app/javascript/widget/store/modules/conversationAttributes.js @@ -1,6 +1,7 @@ import { SET_CONVERSATION_ATTRIBUTES, UPDATE_CONVERSATION_ATTRIBUTES, + CLEAR_CONVERSATION_ATTRIBUTES, } from '../types'; import { getConversationAPI } from '../../api/conversation'; @@ -14,7 +15,7 @@ export const getters = { }; export const actions = { - get: async ({ commit }) => { + getAttributes: async ({ commit }) => { try { const { data } = await getConversationAPI(); const { contact_last_seen_at: lastSeen } = data; @@ -27,6 +28,9 @@ export const actions = { update({ commit }, data) { commit(UPDATE_CONVERSATION_ATTRIBUTES, data); }, + clearConversationAttributes: ({ commit }) => { + commit('CLEAR_CONVERSATION_ATTRIBUTES'); + }, }; export const mutations = { @@ -40,6 +44,10 @@ export const mutations = { $state.status = data.status; } }, + [CLEAR_CONVERSATION_ATTRIBUTES]($state) { + $state.id = ''; + $state.status = ''; + }, }; export default { diff --git a/app/javascript/widget/store/modules/specs/conversationAttributes/actions.spec.js b/app/javascript/widget/store/modules/specs/conversationAttributes/actions.spec.js index 15a447e85..51c864ad2 100644 --- a/app/javascript/widget/store/modules/specs/conversationAttributes/actions.spec.js +++ b/app/javascript/widget/store/modules/specs/conversationAttributes/actions.spec.js @@ -5,10 +5,10 @@ const commit = jest.fn(); jest.mock('widget/helpers/axios'); describe('#actions', () => { - describe('#update', () => { + describe('#get attributes', () => { it('sends mutation if api is success', async () => { API.get.mockResolvedValue({ data: { id: 1, status: 'bot' } }); - await actions.get({ commit }); + await actions.getAttributes({ commit }); expect(commit.mock.calls).toEqual([ ['SET_CONVERSATION_ATTRIBUTES', { id: 1, status: 'bot' }], ['conversation/setMetaUserLastSeenAt', undefined, { root: true }], @@ -16,12 +16,12 @@ describe('#actions', () => { }); it('doesnot send mutation if api is error', async () => { API.get.mockRejectedValue({ message: 'Invalid Headers' }); - await actions.get({ commit }); + await actions.getAttributes({ commit }); expect(commit.mock.calls).toEqual([]); }); }); - describe('#update', () => { + describe('#update attributes', () => { it('sends correct mutations', () => { actions.update({ commit }, { id: 1, status: 'bot' }); expect(commit).toBeCalledWith('UPDATE_CONVERSATION_ATTRIBUTES', { @@ -30,4 +30,10 @@ describe('#actions', () => { }); }); }); + describe('#clear attributes', () => { + it('sends correct mutations', () => { + actions.clearConversationAttributes({ commit }); + expect(commit).toBeCalledWith('CLEAR_CONVERSATION_ATTRIBUTES'); + }); + }); }); diff --git a/app/javascript/widget/store/modules/specs/conversationAttributes/mutations.spec.js b/app/javascript/widget/store/modules/specs/conversationAttributes/mutations.spec.js index f47e29825..2b2bd62fc 100644 --- a/app/javascript/widget/store/modules/specs/conversationAttributes/mutations.spec.js +++ b/app/javascript/widget/store/modules/specs/conversationAttributes/mutations.spec.js @@ -30,4 +30,15 @@ describe('#mutations', () => { expect(state).toEqual({ id: 1, status: 'bot' }); }); }); + + describe('#CLEAR_CONVERSATION_ATTRIBUTES', () => { + it('clear status if it is same conversation', () => { + const state = { id: 1, status: 'open' }; + mutations.CLEAR_CONVERSATION_ATTRIBUTES(state, { + id: 1, + status: 'open', + }); + expect(state).toEqual({ id: '', status: '' }); + }); + }); }); diff --git a/app/javascript/widget/store/types.js b/app/javascript/widget/store/types.js index a091e7a3a..0ade84403 100644 --- a/app/javascript/widget/store/types.js +++ b/app/javascript/widget/store/types.js @@ -1,3 +1,4 @@ export const SET_WIDGET_COLOR = 'SET_WIDGET_COLOR'; export const SET_CONVERSATION_ATTRIBUTES = 'SET_CONVERSATION_ATTRIBUTES'; export const UPDATE_CONVERSATION_ATTRIBUTES = 'UPDATE_CONVERSATION_ATTRIBUTES'; +export const CLEAR_CONVERSATION_ATTRIBUTES = 'CLEAR_CONVERSATION_ATTRIBUTES'; diff --git a/app/javascript/widget/views/Home.vue b/app/javascript/widget/views/Home.vue index a86c29a28..539d12922 100755 --- a/app/javascript/widget/views/Home.vue +++ b/app/javascript/widget/views/Home.vue @@ -113,7 +113,11 @@ export default { }, }, data() { - return { isOnCollapsedView: false, showAttachmentError: false }; + return { + isOnCollapsedView: false, + showAttachmentError: false, + isOnNewConversation: false, + }; }, computed: { ...mapGetters({ @@ -130,7 +134,10 @@ export default { if (this.conversationSize) { return 'messageView'; } - if (this.preChatFormEnabled && !currentUserEmail) { + if ( + this.isOnNewConversation || + (this.preChatFormEnabled && !currentUserEmail) + ) { return 'preChatFormView'; } return 'messageView'; @@ -163,6 +170,10 @@ export default { this.showAttachmentError = false; }, 3000); }); + bus.$on(BUS_EVENTS.START_NEW_CONVERSATION, () => { + this.isOnCollapsedView = true; + this.isOnNewConversation = true; + }); }, methods: { startConversation() { diff --git a/app/views/widgets/show.html.erb b/app/views/widgets/show.html.erb index c63dd08eb..04f8ac0e6 100644 --- a/app/views/widgets/show.html.erb +++ b/app/views/widgets/show.html.erb @@ -20,6 +20,7 @@ preChatFormEnabled: <%= @web_widget.pre_chat_form_enabled %>, preChatFormOptions: <%= @web_widget.pre_chat_form_options.to_json.html_safe %>, workingHoursEnabled: <%= @web_widget.inbox.working_hours_enabled %>, + csatSurveyEnabled: <%= @web_widget.inbox.csat_survey_enabled %>, workingHours: <%= @web_widget.inbox.working_hours.to_json.html_safe %>, outOfOfficeMessage: <%= @web_widget.inbox.out_of_office_message.to_json.html_safe %>, utcOffset: '<%= ActiveSupport::TimeZone[@web_widget.inbox.timezone].formatted_offset %>' From 8341a43143a564b01297ca41e9eb8fa4ce3aded6 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Fri, 2 Jul 2021 14:52:20 +0530 Subject: [PATCH 33/69] chore: Update CSAT submit action behaviour (#2556) * update behaviour of CSAT submit * code cleanup --- .../components/CustomerSatisfaction.vue | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/app/javascript/shared/components/CustomerSatisfaction.vue b/app/javascript/shared/components/CustomerSatisfaction.vue index 4a49e8c89..ead32834d 100644 --- a/app/javascript/shared/components/CustomerSatisfaction.vue +++ b/app/javascript/shared/components/CustomerSatisfaction.vue @@ -14,7 +14,7 @@
@@ -50,6 +50,10 @@ export default { type: Object, default: () => {}, }, + messageId: { + type: Number, + required: true, + }, }, data() { return { @@ -84,10 +88,10 @@ export default { mounted() { if (this.isRatingSubmitted) { const { - csat_survey_response: { rating, feedback }, + csat_survey_response: { rating, feedback_message }, } = this.messageContentAttributes; this.selectedRating = rating; - this.feedback = feedback; + this.feedback = feedback_message; } }, @@ -100,11 +104,23 @@ export default { 'emoji-button', ]; }, - onSubmit() { - this.$emit('submit', { - rating: this.selectedRating, - feedback: this.feedback, - }); + async onSubmit() { + this.isUpdating = true; + try { + await this.$store.dispatch('message/update', { + submittedValues: { + csat_survey_response: { + rating: this.selectedRating, + feedback_message: this.feedback, + }, + }, + messageId: this.messageId, + }); + } catch (error) { + // Ignore error + } finally { + this.isUpdating = false; + } }, selectRating(rating) { this.selectedRating = rating.value; diff --git a/app/javascript/widget/components/AgentMessageBubble.vue b/app/javascript/widget/components/AgentMessageBubble.vue index bdb7ba981..2aec14e05 100755 --- a/app/javascript/widget/components/AgentMessageBubble.vue +++ b/app/javascript/widget/components/AgentMessageBubble.vue @@ -47,7 +47,7 @@
@@ -125,17 +125,6 @@ export default { messageId: this.messageId, }); }, - onCSATSubmit({ feedback, rating }) { - this.onResponse({ - submittedValues: { - csat_survey_response: { - rating, - feedback_message: feedback, - }, - }, - messageId: this.messageId, - }); - }, }, }; diff --git a/app/javascript/widget/components/template/EmailInput.vue b/app/javascript/widget/components/template/EmailInput.vue index 3afcebb64..cf37839f0 100644 --- a/app/javascript/widget/components/template/EmailInput.vue +++ b/app/javascript/widget/components/template/EmailInput.vue @@ -18,7 +18,7 @@ :disabled="$v.email.$invalid" :style="{ background: widgetColor, borderColor: widgetColor }" > - + @@ -47,11 +47,11 @@ export default { data() { return { email: '', + isUpdating: false, }; }, computed: { ...mapGetters({ - uiFlags: 'message/getUIFlags', widgetColor: 'appConfig/getWidgetColor', }), hasSubmitted() { @@ -68,15 +68,21 @@ export default { }, }, methods: { - onSubmit() { + async onSubmit() { if (this.$v.$invalid) { return; } - - this.$store.dispatch('message/update', { - email: this.email, - messageId: this.messageId, - }); + this.isUpdating = true; + try { + await this.$store.dispatch('message/update', { + email: this.email, + messageId: this.messageId, + }); + } catch (error) { + // Ignore error + } finally { + this.isUpdating = false; + } }, }, }; From 38cce3c1c009392a25e36f1c820c62f859873008 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Wed, 7 Jul 2021 21:25:04 +0530 Subject: [PATCH 42/69] chore: New translation updates (#2585) * New translations contact.json (Vietnamese) * New translations conversation.json (Vietnamese) * New translations inboxMgmt.json (Vietnamese) * New translations settings.json (Vietnamese) * New translations en.json (Vietnamese) * New translations inboxMgmt.json (Chinese Traditional) * New translations contact.json (Chinese Traditional) * New translations conversation.json (Chinese Traditional) * New translations settings.json (Chinese Traditional) * New translations en.json (Chinese Traditional) * New translations en.yml (Chinese Simplified) * New translations settings.json (Indonesian) * New translations en.json (Indonesian) * New translations contact.json (Persian) * New translations conversation.json (Persian) * New translations inboxMgmt.json (Persian) * New translations inboxMgmt.json (Indonesian) * New translations contact.json (Portuguese, Brazilian) * New translations conversation.json (Portuguese, Brazilian) * New translations inboxMgmt.json (Portuguese, Brazilian) * New translations integrations.json (Portuguese, Brazilian) * New translations settings.json (Portuguese, Brazilian) * New translations en.json (Portuguese, Brazilian) * New translations contact.json (Indonesian) * New translations conversation.json (Indonesian) * New translations en.json (Chinese Simplified) * New translations devise.en.yml (Chinese Simplified) * New translations inboxMgmt.json (Swedish) * New translations settings.json (Swedish) * New translations conversation.json (Swedish) * New translations en.json (Swedish) * New translations contact.json (Turkish) * New translations conversation.json (Turkish) * New translations contact.json (Swedish) * New translations conversation.json (Slovak) * New translations inboxMgmt.json (Slovak) * New translations settings.json (Slovak) * New translations en.json (Slovak) * New translations inboxMgmt.json (Turkish) * New translations en.json (Ukrainian) * New translations contact.json (Chinese Simplified) * New translations settings.json (Ukrainian) * New translations conversation.json (Chinese Simplified) * New translations inboxMgmt.json (Chinese Simplified) * New translations settings.json (Chinese Simplified) * New translations settings.json (Turkish) * New translations en.json (Turkish) * New translations contact.json (Ukrainian) * New translations conversation.json (Ukrainian) * New translations inboxMgmt.json (Ukrainian) * New translations settings.json (Persian) * New translations integrationApps.json (French) * New translations en.json (Hebrew) * New translations contact.json (Hebrew) * New translations en.json (Nepali) * New translations conversation.json (Hebrew) * New translations inboxMgmt.json (Hebrew) * New translations settings.json (Hebrew) * New translations settings.json (Nepali) * New translations csatMgmt.json (French) * New translations contact.json (Thai) * New translations conversation.json (Thai) * New translations inboxMgmt.json (Thai) * New translations settings.json (Thai) * New translations en.json (Thai) * New translations en.json (Tamil) * New translations contact.json (Tamil) * New translations en.json (Persian) * New translations conversation.json (Tamil) * New translations inboxMgmt.json (Tamil) * New translations settings.json (Tamil) * New translations settings.json (Malayalam) * New translations en.json (Malayalam) * New translations contact.json (Nepali) * New translations conversation.json (Nepali) * New translations inboxMgmt.json (Nepali) * New translations inboxMgmt.json (Malayalam) * New translations contact.json (Hindi) * New translations conversation.json (Hindi) * New translations inboxMgmt.json (Hindi) * New translations settings.json (Hindi) * New translations en.json (Hindi) * New translations contact.json (Malayalam) * New translations conversation.json (Malayalam) * New translations contact.json (Slovak) * New translations contact.json (Danish) * New translations conversation.json (Danish) * New translations inboxMgmt.json (Danish) * New translations settings.json (Danish) * New translations en.json (Danish) * New translations inboxMgmt.json (Czech) * New translations contact.json (Czech) * New translations conversation.json (Czech) * New translations settings.json (Czech) * New translations en.json (Czech) * New translations contact.json (German) * New translations settings.json (Greek) * New translations en.json (Greek) * New translations contact.json (Finnish) * New translations conversation.json (Finnish) * New translations inboxMgmt.json (Finnish) * New translations inboxMgmt.json (Greek) * New translations conversation.json (German) * New translations inboxMgmt.json (German) * New translations integrations.json (German) * New translations settings.json (German) * New translations en.yml (German) * New translations en.json (German) * New translations contact.json (Greek) * New translations conversation.json (Greek) * New translations en.json (Catalan) * New translations inboxMgmt.json (French) * New translations integrations.json (French) * New translations report.json (French) * New translations settings.json (French) * New translations en.yml (French) * New translations conversation.json (French) * New translations en.json (French) * New translations labelsMgmt.json (French) * New translations teamsSettings.json (French) * New translations campaign.json (French) * New translations contact.json (Spanish) * New translations conversation.json (Spanish) * New translations contact.json (French) * New translations contact.json (Romanian) * New translations conversation.json (Romanian) * New translations inboxMgmt.json (Romanian) * New translations settings.json (Romanian) * New translations chatlist.json (French) * New translations en.json (Romanian) * New translations inboxMgmt.json (Spanish) * New translations en.json (Arabic) * New translations contact.json (Catalan) * New translations settings.json (Arabic) * New translations conversation.json (Catalan) * New translations inboxMgmt.json (Catalan) * New translations settings.json (Catalan) * New translations settings.json (Spanish) * New translations en.json (Spanish) * New translations contact.json (Arabic) * New translations conversation.json (Arabic) * New translations inboxMgmt.json (Arabic) * New translations settings.json (Norwegian) * New translations en.json (Norwegian) * New translations contact.json (Polish) * New translations conversation.json (Polish) * New translations inboxMgmt.json (Polish) * New translations inboxMgmt.json (Norwegian) * New translations conversation.json (Dutch) * New translations inboxMgmt.json (Dutch) * New translations settings.json (Dutch) * New translations en.json (Dutch) * New translations contact.json (Norwegian) * New translations conversation.json (Norwegian) * New translations settings.json (Finnish) * New translations contact.json (Russian) * New translations conversation.json (Russian) * New translations inboxMgmt.json (Russian) * New translations settings.json (Russian) * New translations en.json (Russian) * New translations en.json (Portuguese) * New translations settings.json (Polish) * New translations en.json (Polish) * New translations contact.json (Portuguese) * New translations conversation.json (Portuguese) * New translations inboxMgmt.json (Portuguese) * New translations settings.json (Portuguese) * New translations contact.json (Dutch) * New translations en.json (Hungarian) * New translations contact.json (Italian) * New translations conversation.json (Italian) * New translations inboxMgmt.json (Italian) * New translations settings.json (Italian) * New translations en.json (Italian) * New translations en.json (Finnish) * New translations contact.json (Hungarian) * New translations conversation.json (Hungarian) * New translations inboxMgmt.json (Hungarian) * New translations settings.json (Hungarian) * New translations contact.json (Korean) * New translations conversation.json (Korean) * New translations inboxMgmt.json (Korean) * New translations settings.json (Korean) * New translations en.json (Korean) * New translations en.json (Japanese) * New translations contact.json (Japanese) * New translations conversation.json (Japanese) * New translations inboxMgmt.json (Japanese) * New translations settings.json (Japanese) * New translations en.yml (Portuguese, Brazilian) * chore: revert key name * Update zh_CN.yml * New translations contact.json (Russian) Co-authored-by: Muhsin Keloth --- .../dashboard/i18n/locale/ar/contact.json | 29 +++++ .../i18n/locale/ar/conversation.json | 9 +- .../dashboard/i18n/locale/ar/inboxMgmt.json | 6 + .../dashboard/i18n/locale/ar/settings.json | 4 +- .../dashboard/i18n/locale/ca/contact.json | 29 +++++ .../i18n/locale/ca/conversation.json | 9 +- .../dashboard/i18n/locale/ca/inboxMgmt.json | 6 + .../dashboard/i18n/locale/ca/settings.json | 4 +- .../dashboard/i18n/locale/cs/contact.json | 29 +++++ .../i18n/locale/cs/conversation.json | 9 +- .../dashboard/i18n/locale/cs/inboxMgmt.json | 6 + .../dashboard/i18n/locale/cs/settings.json | 4 +- .../dashboard/i18n/locale/da/contact.json | 29 +++++ .../i18n/locale/da/conversation.json | 9 +- .../dashboard/i18n/locale/da/inboxMgmt.json | 6 + .../dashboard/i18n/locale/da/settings.json | 4 +- .../dashboard/i18n/locale/de/contact.json | 31 ++++- .../i18n/locale/de/conversation.json | 11 +- .../dashboard/i18n/locale/de/inboxMgmt.json | 8 +- .../i18n/locale/de/integrations.json | 4 +- .../dashboard/i18n/locale/de/settings.json | 4 +- .../dashboard/i18n/locale/el/contact.json | 29 +++++ .../i18n/locale/el/conversation.json | 9 +- .../dashboard/i18n/locale/el/inboxMgmt.json | 6 + .../dashboard/i18n/locale/el/settings.json | 4 +- .../dashboard/i18n/locale/es/contact.json | 29 +++++ .../i18n/locale/es/conversation.json | 9 +- .../dashboard/i18n/locale/es/inboxMgmt.json | 6 + .../dashboard/i18n/locale/es/settings.json | 4 +- .../dashboard/i18n/locale/fa/contact.json | 29 +++++ .../i18n/locale/fa/conversation.json | 9 +- .../dashboard/i18n/locale/fa/inboxMgmt.json | 6 + .../dashboard/i18n/locale/fa/settings.json | 4 +- .../dashboard/i18n/locale/fi/contact.json | 29 +++++ .../i18n/locale/fi/conversation.json | 9 +- .../dashboard/i18n/locale/fi/inboxMgmt.json | 6 + .../dashboard/i18n/locale/fi/settings.json | 4 +- .../dashboard/i18n/locale/fr/campaign.json | 62 +++++----- .../dashboard/i18n/locale/fr/chatlist.json | 2 +- .../dashboard/i18n/locale/fr/contact.json | 111 +++++++++++------- .../i18n/locale/fr/conversation.json | 19 ++- .../dashboard/i18n/locale/fr/csatMgmt.json | 4 +- .../dashboard/i18n/locale/fr/inboxMgmt.json | 20 ++-- .../i18n/locale/fr/integrationApps.json | 30 ++--- .../i18n/locale/fr/integrations.json | 10 +- .../dashboard/i18n/locale/fr/labelsMgmt.json | 6 +- .../dashboard/i18n/locale/fr/report.json | 6 +- .../dashboard/i18n/locale/fr/settings.json | 14 ++- .../i18n/locale/fr/teamsSettings.json | 80 ++++++------- .../dashboard/i18n/locale/he/contact.json | 29 +++++ .../i18n/locale/he/conversation.json | 9 +- .../dashboard/i18n/locale/he/inboxMgmt.json | 6 + .../dashboard/i18n/locale/he/settings.json | 4 +- .../dashboard/i18n/locale/hi/contact.json | 29 +++++ .../i18n/locale/hi/conversation.json | 9 +- .../dashboard/i18n/locale/hi/inboxMgmt.json | 6 + .../dashboard/i18n/locale/hi/settings.json | 4 +- .../dashboard/i18n/locale/hu/contact.json | 29 +++++ .../i18n/locale/hu/conversation.json | 9 +- .../dashboard/i18n/locale/hu/inboxMgmt.json | 6 + .../dashboard/i18n/locale/hu/settings.json | 4 +- .../dashboard/i18n/locale/id/contact.json | 29 +++++ .../i18n/locale/id/conversation.json | 9 +- .../dashboard/i18n/locale/id/inboxMgmt.json | 6 + .../dashboard/i18n/locale/id/settings.json | 4 +- .../dashboard/i18n/locale/it/contact.json | 29 +++++ .../i18n/locale/it/conversation.json | 9 +- .../dashboard/i18n/locale/it/inboxMgmt.json | 6 + .../dashboard/i18n/locale/it/settings.json | 4 +- .../dashboard/i18n/locale/ja/contact.json | 29 +++++ .../i18n/locale/ja/conversation.json | 9 +- .../dashboard/i18n/locale/ja/inboxMgmt.json | 6 + .../dashboard/i18n/locale/ja/settings.json | 4 +- .../dashboard/i18n/locale/ko/contact.json | 29 +++++ .../i18n/locale/ko/conversation.json | 9 +- .../dashboard/i18n/locale/ko/inboxMgmt.json | 6 + .../dashboard/i18n/locale/ko/settings.json | 4 +- .../dashboard/i18n/locale/ml/contact.json | 29 +++++ .../i18n/locale/ml/conversation.json | 9 +- .../dashboard/i18n/locale/ml/inboxMgmt.json | 6 + .../dashboard/i18n/locale/ml/settings.json | 4 +- .../dashboard/i18n/locale/ne/contact.json | 29 +++++ .../i18n/locale/ne/conversation.json | 9 +- .../dashboard/i18n/locale/ne/inboxMgmt.json | 6 + .../dashboard/i18n/locale/ne/settings.json | 4 +- .../dashboard/i18n/locale/nl/contact.json | 29 +++++ .../i18n/locale/nl/conversation.json | 9 +- .../dashboard/i18n/locale/nl/inboxMgmt.json | 6 + .../dashboard/i18n/locale/nl/settings.json | 4 +- .../dashboard/i18n/locale/no/contact.json | 29 +++++ .../i18n/locale/no/conversation.json | 9 +- .../dashboard/i18n/locale/no/inboxMgmt.json | 6 + .../dashboard/i18n/locale/no/settings.json | 4 +- .../dashboard/i18n/locale/pl/contact.json | 29 +++++ .../i18n/locale/pl/conversation.json | 9 +- .../dashboard/i18n/locale/pl/inboxMgmt.json | 6 + .../dashboard/i18n/locale/pl/settings.json | 4 +- .../dashboard/i18n/locale/pt/contact.json | 29 +++++ .../i18n/locale/pt/conversation.json | 9 +- .../dashboard/i18n/locale/pt/inboxMgmt.json | 6 + .../dashboard/i18n/locale/pt/settings.json | 4 +- .../dashboard/i18n/locale/pt_BR/contact.json | 29 +++++ .../i18n/locale/pt_BR/conversation.json | 11 +- .../i18n/locale/pt_BR/inboxMgmt.json | 6 + .../i18n/locale/pt_BR/integrations.json | 4 +- .../dashboard/i18n/locale/pt_BR/settings.json | 4 +- .../dashboard/i18n/locale/ro/contact.json | 29 +++++ .../i18n/locale/ro/conversation.json | 9 +- .../dashboard/i18n/locale/ro/inboxMgmt.json | 6 + .../dashboard/i18n/locale/ro/settings.json | 4 +- .../dashboard/i18n/locale/ru/contact.json | 29 +++++ .../i18n/locale/ru/conversation.json | 13 +- .../dashboard/i18n/locale/ru/inboxMgmt.json | 6 + .../dashboard/i18n/locale/ru/settings.json | 4 +- .../dashboard/i18n/locale/sk/contact.json | 29 +++++ .../i18n/locale/sk/conversation.json | 9 +- .../dashboard/i18n/locale/sk/inboxMgmt.json | 6 + .../dashboard/i18n/locale/sk/settings.json | 4 +- .../dashboard/i18n/locale/sv/contact.json | 29 +++++ .../i18n/locale/sv/conversation.json | 9 +- .../dashboard/i18n/locale/sv/inboxMgmt.json | 6 + .../dashboard/i18n/locale/sv/settings.json | 4 +- .../dashboard/i18n/locale/ta/contact.json | 29 +++++ .../i18n/locale/ta/conversation.json | 9 +- .../dashboard/i18n/locale/ta/inboxMgmt.json | 6 + .../dashboard/i18n/locale/ta/settings.json | 4 +- .../dashboard/i18n/locale/th/contact.json | 29 +++++ .../i18n/locale/th/conversation.json | 9 +- .../dashboard/i18n/locale/th/inboxMgmt.json | 6 + .../dashboard/i18n/locale/th/settings.json | 4 +- .../dashboard/i18n/locale/tr/contact.json | 29 +++++ .../i18n/locale/tr/conversation.json | 9 +- .../dashboard/i18n/locale/tr/inboxMgmt.json | 6 + .../dashboard/i18n/locale/tr/settings.json | 4 +- .../dashboard/i18n/locale/uk/contact.json | 29 +++++ .../i18n/locale/uk/conversation.json | 9 +- .../dashboard/i18n/locale/uk/inboxMgmt.json | 6 + .../dashboard/i18n/locale/uk/settings.json | 4 +- .../dashboard/i18n/locale/vi/contact.json | 29 +++++ .../i18n/locale/vi/conversation.json | 9 +- .../dashboard/i18n/locale/vi/inboxMgmt.json | 6 + .../dashboard/i18n/locale/vi/settings.json | 4 +- .../dashboard/i18n/locale/zh_CN/contact.json | 29 +++++ .../i18n/locale/zh_CN/conversation.json | 9 +- .../i18n/locale/zh_CN/inboxMgmt.json | 6 + .../dashboard/i18n/locale/zh_CN/settings.json | 4 +- .../dashboard/i18n/locale/zh_TW/contact.json | 29 +++++ .../i18n/locale/zh_TW/conversation.json | 9 +- .../i18n/locale/zh_TW/inboxMgmt.json | 6 + .../dashboard/i18n/locale/zh_TW/settings.json | 4 +- app/javascript/widget/i18n/locale/ar.json | 1 + app/javascript/widget/i18n/locale/ca.json | 1 + app/javascript/widget/i18n/locale/cs.json | 1 + app/javascript/widget/i18n/locale/da.json | 1 + app/javascript/widget/i18n/locale/de.json | 7 +- app/javascript/widget/i18n/locale/el.json | 1 + app/javascript/widget/i18n/locale/es.json | 1 + app/javascript/widget/i18n/locale/fa.json | 1 + app/javascript/widget/i18n/locale/fi.json | 1 + app/javascript/widget/i18n/locale/fr.json | 13 +- app/javascript/widget/i18n/locale/he.json | 1 + app/javascript/widget/i18n/locale/hi.json | 1 + app/javascript/widget/i18n/locale/hu.json | 1 + app/javascript/widget/i18n/locale/id.json | 1 + app/javascript/widget/i18n/locale/it.json | 1 + app/javascript/widget/i18n/locale/ja.json | 1 + app/javascript/widget/i18n/locale/ko.json | 1 + app/javascript/widget/i18n/locale/ml.json | 1 + app/javascript/widget/i18n/locale/ne.json | 1 + app/javascript/widget/i18n/locale/nl.json | 1 + app/javascript/widget/i18n/locale/no.json | 1 + app/javascript/widget/i18n/locale/pl.json | 1 + app/javascript/widget/i18n/locale/pt.json | 1 + app/javascript/widget/i18n/locale/pt_BR.json | 3 +- app/javascript/widget/i18n/locale/ro.json | 1 + app/javascript/widget/i18n/locale/ru.json | 3 +- app/javascript/widget/i18n/locale/sk.json | 1 + app/javascript/widget/i18n/locale/sv.json | 1 + app/javascript/widget/i18n/locale/ta.json | 1 + app/javascript/widget/i18n/locale/th.json | 1 + app/javascript/widget/i18n/locale/tr.json | 1 + app/javascript/widget/i18n/locale/uk.json | 1 + app/javascript/widget/i18n/locale/vi.json | 1 + app/javascript/widget/i18n/locale/zh_CN.json | 1 + app/javascript/widget/i18n/locale/zh_TW.json | 1 + config/locales/de.yml | 2 +- config/locales/fr.yml | 6 +- config/locales/pt_BR.yml | 2 +- 188 files changed, 1829 insertions(+), 254 deletions(-) diff --git a/app/javascript/dashboard/i18n/locale/ar/contact.json b/app/javascript/dashboard/i18n/locale/ar/contact.json index 0de4ad81a..bbd9a6fa0 100644 --- a/app/javascript/dashboard/i18n/locale/ar/contact.json +++ b/app/javascript/dashboard/i18n/locale/ar/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "جهات الاتصال", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "بحث", "SEARCH_INPUT_PLACEHOLDER": "بحث عن جهات الاتصال", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "إلغاء", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ar/conversation.json b/app/javascript/dashboard/i18n/locale/ar/conversation.json index 871a10786..63394c504 100644 --- a/app/javascript/dashboard/i18n/locale/ar/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ar/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "إزالة التحديد", "DOWNLOAD": "تنزيل", "UPLOADING_ATTACHMENTS": "جاري تحميل المرفقات...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "لا توجد استجابة", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "عرض محرر النصوص", "TIP_EMOJI_ICON": "إظهار قائمة الرموز التعبيرية", "TIP_ATTACH_ICON": "إرفاق الملفات", - "ENTER_TO_SEND": "زر الإدخل للإرسال" + "ENTER_TO_SEND": "زر الإدخل للإرسال", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "ملاحظة خاصة: مرئية فقط لأعضاء فريق العمل والموظفين", "CHANGE_STATUS": "تم تغيير حالة المحادثة", @@ -66,6 +69,10 @@ "SELECT_AGENT": "اختر وكيل", "REMOVE": "حذف", "ASSIGN": "تكليف" + }, + "CONTEXT_MENU": { + "COPY": "نسخ", + "DELETE": "حذف" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json index 087f6cd0b..9c8ec9604 100644 --- a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "مفعل", "DISABLED": "معطّل" + }, + "ENABLE_CSAT": { + "ENABLED": "مفعل", + "DISABLED": "معطّل" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "تفعيل الإسناد التلقائي", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "إعدادات قناة التواصل", "INBOX_UPDATE_SUB_TEXT": "تحديث إعدادات قناة التواصل", "AUTO_ASSIGNMENT_SUB_TEXT": "تمكين أو تعطيل الإسناد التلقائي للمحادثات الجديدة إلى الموظفين المضافين إلى قناة التواصل هذه.", diff --git a/app/javascript/dashboard/i18n/locale/ar/settings.json b/app/javascript/dashboard/i18n/locale/ar/settings.json index 95197cec7..4d0f55f66 100644 --- a/app/javascript/dashboard/i18n/locale/ar/settings.json +++ b/app/javascript/dashboard/i18n/locale/ar/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "الإشعارات الصوتية", "NOTE": "تمكين التنبيهات الصوتية في لوحة التحكم للرسائل والمحادثات الجديدة.", - "ENABLE_AUDIO": "تشغيل إشعار صوتي عند إنشاء محادثة جديدة أو وصول رسائل جديدة" + "NONE": "لا شيء", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "إشعارات البريد الإلكتروني", diff --git a/app/javascript/dashboard/i18n/locale/ca/contact.json b/app/javascript/dashboard/i18n/locale/ca/contact.json index 554d686ec..680fcf59f 100644 --- a/app/javascript/dashboard/i18n/locale/ca/contact.json +++ b/app/javascript/dashboard/i18n/locale/ca/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contactes", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Cercar", "SEARCH_INPUT_PLACEHOLDER": "Cerca de contactes", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancel·la", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ca/conversation.json b/app/javascript/dashboard/i18n/locale/ca/conversation.json index 5fb54a674..c85be15b5 100644 --- a/app/javascript/dashboard/i18n/locale/ca/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ca/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Elimina la selecció", "DOWNLOAD": "Descarrega", "UPLOADING_ATTACHMENTS": "Pujant fitxers adjunts...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Sense resposta", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Mostra l'editor de text enriquit", "TIP_EMOJI_ICON": "Mostra la selecció d'emoticones", "TIP_ATTACH_ICON": "Ajuntar fitxers", - "ENTER_TO_SEND": "Intro per enviar" + "ENTER_TO_SEND": "Intro per enviar", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Nota privada: Només és visible per tu i el vostre equip", "CHANGE_STATUS": "Estat de la conversa canviat", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Seleccionar Agent", "REMOVE": "Suprimeix", "ASSIGN": "Assignar" + }, + "CONTEXT_MENU": { + "COPY": "Copia", + "DELETE": "Esborrar" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json index 5b3ca8b2c..d80d1c295 100644 --- a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Habilita", "DISABLED": "Inhabilita" + }, + "ENABLE_CSAT": { + "ENABLED": "Habilita", + "DISABLED": "Inhabilita" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Activa l'assignació automàtica", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Configuració de la safata d'entrada", "INBOX_UPDATE_SUB_TEXT": "Actualitza la configuració de la safata d'entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Activa o desactiva l'assignació automàtica d'agents disponibles a les noves converses", diff --git a/app/javascript/dashboard/i18n/locale/ca/settings.json b/app/javascript/dashboard/i18n/locale/ca/settings.json index 08467b9ed..f2d249148 100644 --- a/app/javascript/dashboard/i18n/locale/ca/settings.json +++ b/app/javascript/dashboard/i18n/locale/ca/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notificacions per correu electrònic", diff --git a/app/javascript/dashboard/i18n/locale/cs/contact.json b/app/javascript/dashboard/i18n/locale/cs/contact.json index efb3920e6..abe276041 100644 --- a/app/javascript/dashboard/i18n/locale/cs/contact.json +++ b/app/javascript/dashboard/i18n/locale/cs/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakty", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Hledat", "SEARCH_INPUT_PLACEHOLDER": "Hledat kontakty", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Zrušit", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/cs/conversation.json b/app/javascript/dashboard/i18n/locale/cs/conversation.json index 73205f9a0..06d4ceaf2 100644 --- a/app/javascript/dashboard/i18n/locale/cs/conversation.json +++ b/app/javascript/dashboard/i18n/locale/cs/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Odstranit výběr", "DOWNLOAD": "Stáhnout", "UPLOADING_ATTACHMENTS": "Nahrávání příloh...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Bez odpovědi", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Zobrazit formátovaný textový editor", "TIP_EMOJI_ICON": "Zobrazit výběr emoji", "TIP_ATTACH_ICON": "Přiložit soubory", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Soukromá poznámka: Viditelné pouze pro vás a váš tým", "CHANGE_STATUS": "Stav konverzace byl změněn", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Vybrat agenta", "REMOVE": "Odebrat", "ASSIGN": "Přiřadit" + }, + "CONTEXT_MENU": { + "COPY": "Kopírovat", + "DELETE": "Vymazat" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json index 559352bcc..8eeaa3435 100644 --- a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Povoleno", "DISABLED": "Zakázáno" + }, + "ENABLE_CSAT": { + "ENABLED": "Povoleno", + "DISABLED": "Zakázáno" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Povolit automatické přiřazení", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Nastavení doručené pošty", "INBOX_UPDATE_SUB_TEXT": "Aktualizujte nastavení doručené pošty", "AUTO_ASSIGNMENT_SUB_TEXT": "Povolit nebo zakázat automatické přiřazování nových konverzací agentům přidaným do této schránky.", diff --git a/app/javascript/dashboard/i18n/locale/cs/settings.json b/app/javascript/dashboard/i18n/locale/cs/settings.json index 33e6ac244..85f01594d 100644 --- a/app/javascript/dashboard/i18n/locale/cs/settings.json +++ b/app/javascript/dashboard/i18n/locale/cs/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "Nic", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-mailová oznámení", diff --git a/app/javascript/dashboard/i18n/locale/da/contact.json b/app/javascript/dashboard/i18n/locale/da/contact.json index 8ede1ef5f..e93030c61 100644 --- a/app/javascript/dashboard/i18n/locale/da/contact.json +++ b/app/javascript/dashboard/i18n/locale/da/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakter", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Søg", "SEARCH_INPUT_PLACEHOLDER": "Søg efter kontakter", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Annuller", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/da/conversation.json b/app/javascript/dashboard/i18n/locale/da/conversation.json index 2cc420d6c..7b2765263 100644 --- a/app/javascript/dashboard/i18n/locale/da/conversation.json +++ b/app/javascript/dashboard/i18n/locale/da/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Fjern Markering", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Privat Note: Kun synlig for dig og dit team", "CHANGE_STATUS": "Samtalestatus ændret", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Fjern", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Kopiér", + "DELETE": "Slet" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json index d8178b209..2287b1c67 100644 --- a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Aktiveret", "DISABLED": "Deaktiveret" + }, + "ENABLE_CSAT": { + "ENABLED": "Aktiveret", + "DISABLED": "Deaktiveret" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Aktiver automatisk tildeling", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Indbakke Indstillinger", "INBOX_UPDATE_SUB_TEXT": "Opdater dine indbakkeindstillinger", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktiver eller deaktiver automatisk tildeling af nye samtaler til agenter tilføjet til denne indbakke.", diff --git a/app/javascript/dashboard/i18n/locale/da/settings.json b/app/javascript/dashboard/i18n/locale/da/settings.json index 464bfa337..9a5aa7ce5 100644 --- a/app/javascript/dashboard/i18n/locale/da/settings.json +++ b/app/javascript/dashboard/i18n/locale/da/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-Mail Notifikationer", diff --git a/app/javascript/dashboard/i18n/locale/de/contact.json b/app/javascript/dashboard/i18n/locale/de/contact.json index bce763959..d2bba01bb 100644 --- a/app/javascript/dashboard/i18n/locale/de/contact.json +++ b/app/javascript/dashboard/i18n/locale/de/contact.json @@ -131,12 +131,13 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakte", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Suchen", "SEARCH_INPUT_PLACEHOLDER": "Suche nach Kontakten", "LIST": { "LOADING_MESSAGE": "Kontakte werden geladen...", "404": "Keine Kontakte entsprechend Deiner Suche gefunden 🔍", - "NO_CONTACTS": "There are no available contacts", + "NO_CONTACTS": "Keine Kontakte verfügbar", "TABLE_HEADER": { "NAME": "Name", "PHONE_NUMBER": "Telefonnummer", @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Stornieren", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/de/conversation.json b/app/javascript/dashboard/i18n/locale/de/conversation.json index ecf42f1b1..0290d66a1 100644 --- a/app/javascript/dashboard/i18n/locale/de/conversation.json +++ b/app/javascript/dashboard/i18n/locale/de/conversation.json @@ -27,8 +27,10 @@ "REMOVE_SELECTION": "Auswahl entfernen", "DOWNLOAD": "Herunterladen", "UPLOADING_ATTACHMENTS": "Anhänge werden hochgeladen...", + "SUCCESS_DELETE_MESSAGE": "Nachricht erfolgreich gelöscht", + "FAIL_DELETE_MESSSAGE": "Nachricht konnte nicht gelöscht werden! Versuche es erneut", "NO_RESPONSE": "Keine Antwort", - "RATING_TITLE": "Rating", + "RATING_TITLE": "Bewertung", "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Fall schließen", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Rich Text Editor anzeigen", "TIP_EMOJI_ICON": "Emoji-Auswahl anzeigen", "TIP_ATTACH_ICON": "Dateien anhängen", - "ENTER_TO_SEND": "Zum senden ENTER drücken" + "ENTER_TO_SEND": "Zum senden ENTER drücken", + "DRAG_DROP": "Ziehen und Ablegen hierher, um anzuhängen" }, "VISIBLE_TO_AGENTS": "Privater Hinweis: Nur für Sie und Ihr Team sichtbar", "CHANGE_STATUS": "Gesprächsstatus geändert", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Agent auswählen", "REMOVE": "Entfernen", "ASSIGN": "Zuordnen" + }, + "CONTEXT_MENU": { + "COPY": "Kopieren", + "DELETE": "Löschen" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json index fb842b085..13ae33d12 100644 --- a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json @@ -34,7 +34,7 @@ }, "WEBSITE_NAME": { "LABEL": "Webseiten-Name", - "PLACEHOLDER": "Geben Sie den Namen Ihrer Website ein (eg: Acme Inc)" + "PLACEHOLDER": "Geben Sie den Namen Ihrer Website ein (zum Beispiel: Acme Inc)" }, "FB": { "HELP": "PS: Durch die Anmeldung erhalten wir nur Zugriff auf die Nachrichten Ihrer Seite. Auf Ihre privaten Nachrichten kann Chatwoot niemals zugreifen.", @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Aktiviert", "DISABLED": "Behindert" + }, + "ENABLE_CSAT": { + "ENABLED": "Aktiviert", + "DISABLED": "Behindert" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "E-Mail-Sammelbox aktivieren", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Aktiviere oder deaktiviere die E-Mail-Sammelbox bei einer neuen Unterhaltung", "AUTO_ASSIGNMENT": "Aktivieren Sie die automatische Zuweisung", + "ENABLE_CSAT": "CSAT aktivieren", + "ENABLE_CSAT_SUB_TEXT": "CSAT(Kundenzufriedenheit) Umfrage aktivieren/deaktivieren nach Abschluss eines Gesprächs", "INBOX_UPDATE_TITLE": "Posteingangseinstellungen", "INBOX_UPDATE_SUB_TEXT": "Posteingangseinstellungen aktualisieren", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktivieren oder deaktivieren Sie die automatische Zuweisung verfügbarer Agenten für neue Konversationen", diff --git a/app/javascript/dashboard/i18n/locale/de/integrations.json b/app/javascript/dashboard/i18n/locale/de/integrations.json index 9c3ba40f5..2de48e7fc 100644 --- a/app/javascript/dashboard/i18n/locale/de/integrations.json +++ b/app/javascript/dashboard/i18n/locale/de/integrations.json @@ -68,8 +68,8 @@ }, "SLACK": { "HELP_TEXT": { - "TITLE": "Using Slack Integration", - "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + "TITLE": "Nutzung von Slack Integration", + "BODY": "

Chatwoot wird nun alle eingehenden Unterhaltungen in den Kundengespräche Channel innerhalb Ihres Slack Arbeitsplatzes synchronisieren.

Wenn Sie in Kunden-Konversationen antworten, wird der Slack Kanal eine Antwort an den Kunden durch Chat erzeugen.

Starten Sie die Antworten mit Notiz: um private Notizen anstatt Antworten zu erstellen.

Wenn der Replier auf Slack ein Agentenprofil im Chatwoot unter der gleichen E-Mail hat, werden die Antworten entsprechend assoziiert.

Wenn der Replier kein Agentenprofil hat, werden die Antworten aus dem Bot-Profil getätigt.

" } }, "DELETE": { diff --git a/app/javascript/dashboard/i18n/locale/de/settings.json b/app/javascript/dashboard/i18n/locale/de/settings.json index a46dca51c..646a93189 100644 --- a/app/javascript/dashboard/i18n/locale/de/settings.json +++ b/app/javascript/dashboard/i18n/locale/de/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio-Benachrichtigungen", "NOTE": "Audio-Benachrichtigungen im Dashboard für neue Nachrichten und Unterhaltungen aktivieren.", - "ENABLE_AUDIO": "Audio-Benachrichtigung abspielen, wenn eine neue Unterhaltung erstellt wurde oder neue Nachrichten eintreffen" + "NONE": "Keine", + "ASSIGNED": "Zugewiesene Unterhaltungen", + "ALL_CONVERSATIONS": "Alle Unterhaltungen" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-Mail Benachrichtigungen", diff --git a/app/javascript/dashboard/i18n/locale/el/contact.json b/app/javascript/dashboard/i18n/locale/el/contact.json index fdf0dac36..8d81e0212 100644 --- a/app/javascript/dashboard/i18n/locale/el/contact.json +++ b/app/javascript/dashboard/i18n/locale/el/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Επαφές", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Αναζήτηση", "SEARCH_INPUT_PLACEHOLDER": "Αναζήτηση Επαφών", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "π.χ.: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Άκυρο", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/el/conversation.json b/app/javascript/dashboard/i18n/locale/el/conversation.json index bb13cb4b1..fab77400d 100644 --- a/app/javascript/dashboard/i18n/locale/el/conversation.json +++ b/app/javascript/dashboard/i18n/locale/el/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Διαγραφή Επιλογής", "DOWNLOAD": "Κατέβασμα", "UPLOADING_ATTACHMENTS": "Ανέβασμα επισυναπτόμενων...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Καμία ανταπόκριση", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Προβολή επεξεργαστή εμπλουτισμένου κειμένου", "TIP_EMOJI_ICON": "Προβολή επιλογέα emoji", "TIP_ATTACH_ICON": "Επισύναψη αρχείων", - "ENTER_TO_SEND": "Εισαγωγή για αποστολή" + "ENTER_TO_SEND": "Εισαγωγή για αποστολή", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Ιδιωτική Σημείωση: Ορατή μόνο σε σας και την ομάδα σας", "CHANGE_STATUS": "Η κατάσταση της συνομιλίας άλλαξε", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Επιλογή πράκτορα", "REMOVE": "Διαγραφή", "ASSIGN": "Αντιστοίχιση" + }, + "CONTEXT_MENU": { + "COPY": "Αντιγραφή", + "DELETE": "Διαγραφή" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json index 30812408f..6c0171c29 100644 --- a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Ενεργό", "DISABLED": "Ανενεργό" + }, + "ENABLE_CSAT": { + "ENABLED": "Ενεργό", + "DISABLED": "Ανενεργό" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Ενεργοποιήσετε το πλαίσιο συλλογής email", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Ενεργοποίηση ή απενεργοποίηση του πλαισίου συλλογής μηνυμάτων ηλεκτρονικού ταχυδρομείου στη νέα συνομιλία", "AUTO_ASSIGNMENT": "Επιτρέπεται η αυτόματη αντιστοίχιση", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Ρυθμίσεις Κιβωτίου", "INBOX_UPDATE_SUB_TEXT": "Ενημερώστε τις ρυθμίσεις του κιβωτίου σας", "AUTO_ASSIGNMENT_SUB_TEXT": "Ενεργοποιήστε ή απενεργοποιήστε την αυτόματη αντιστοίχιση των νέων συζητήσεων στους πράκτορες αυτού του κιβωτίου.", diff --git a/app/javascript/dashboard/i18n/locale/el/settings.json b/app/javascript/dashboard/i18n/locale/el/settings.json index eeddb966f..425f7242b 100644 --- a/app/javascript/dashboard/i18n/locale/el/settings.json +++ b/app/javascript/dashboard/i18n/locale/el/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Ειδοποιήσεις Ήχου", "NOTE": "Ενεργοποίηση ηχητικών ειδοποιήσεων για νέα μηνύματα και συνομιλίες.", - "ENABLE_AUDIO": "Αναπαραγωγή ηχητικής ειδοποίησης όταν δημιουργείται μια νέα συνομιλία ή φτάνουν νέα μηνύματα" + "NONE": "Κανένα", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Ειδοποιήσεις Email", diff --git a/app/javascript/dashboard/i18n/locale/es/contact.json b/app/javascript/dashboard/i18n/locale/es/contact.json index 7ecbebb0c..ce03e674f 100644 --- a/app/javascript/dashboard/i18n/locale/es/contact.json +++ b/app/javascript/dashboard/i18n/locale/es/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contactos", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Buscar", "SEARCH_INPUT_PLACEHOLDER": "Buscar contactos", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancelar", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/es/conversation.json b/app/javascript/dashboard/i18n/locale/es/conversation.json index cb7f609b4..23a79a373 100644 --- a/app/javascript/dashboard/i18n/locale/es/conversation.json +++ b/app/javascript/dashboard/i18n/locale/es/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Eliminar selección", "DOWNLOAD": "Descargar", "UPLOADING_ATTACHMENTS": "Subiendo archivos adjuntos...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No hay respuesta", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Mostrar editor de textos", "TIP_EMOJI_ICON": "Mostrar selector de emoji", "TIP_ATTACH_ICON": "Adjuntar archivos", - "ENTER_TO_SEND": "Ingresar para enviar" + "ENTER_TO_SEND": "Ingresar para enviar", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Nota privada: solo visible para ti y tu equipo", "CHANGE_STATUS": "Estado de la conversación cambiado", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Seleccionar agente", "REMOVE": "Eliminar", "ASSIGN": "Asignar" + }, + "CONTEXT_MENU": { + "COPY": "Copiar", + "DELETE": "Eliminar" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json index c9dc764f4..9d04db022 100644 --- a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Activado", "DISABLED": "Deshabilitado" + }, + "ENABLE_CSAT": { + "ENABLED": "Activado", + "DISABLED": "Deshabilitado" } }, "DELETE": { @@ -255,6 +259,8 @@ "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", "AUTO_ASSIGNMENT": "Activar asignación automática", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Ajustes de la Bandeja de Entrada", "INBOX_UPDATE_SUB_TEXT": "Actualizar la configuración de tu bandeja de entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Activar o desactivar la asignación automática de nuevas conversaciones a los agentes añadidos a esta bandeja de entrada.", diff --git a/app/javascript/dashboard/i18n/locale/es/settings.json b/app/javascript/dashboard/i18n/locale/es/settings.json index 80ecea3ba..94a3c677b 100644 --- a/app/javascript/dashboard/i18n/locale/es/settings.json +++ b/app/javascript/dashboard/i18n/locale/es/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Notificaciones con sonido", "NOTE": "Active las notificaciones de sonido en el tablero para los mensajes nuevos y conversaciones.", - "ENABLE_AUDIO": "Realizar un sonido cuando una nueva conversación ha sido creada o un nuevo mensaje llegue" + "NONE": "Ninguna", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notificaciones por email", diff --git a/app/javascript/dashboard/i18n/locale/fa/contact.json b/app/javascript/dashboard/i18n/locale/fa/contact.json index aab86195e..4d03d9feb 100644 --- a/app/javascript/dashboard/i18n/locale/fa/contact.json +++ b/app/javascript/dashboard/i18n/locale/fa/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "مخاطبین", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "جستجو", "SEARCH_INPUT_PLACEHOLDER": "جستجوی مخاطبین", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "انصراف", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/fa/conversation.json b/app/javascript/dashboard/i18n/locale/fa/conversation.json index 18295fa5c..cc8e261f5 100644 --- a/app/javascript/dashboard/i18n/locale/fa/conversation.json +++ b/app/javascript/dashboard/i18n/locale/fa/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "حذف انتخاب‌شده‌ها", "DOWNLOAD": "دانلود", "UPLOADING_ATTACHMENTS": "در حال بارگذاری پیوست‌ها...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "بدون پاسخ", "RATING_TITLE": "رتبه", "FEEDBACK_TITLE": "بازخورد", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "نمایش ویرایشگر متنی پیشرفته", "TIP_EMOJI_ICON": "انتخاب ایموجی", "TIP_ATTACH_ICON": "ضمیمه فایل", - "ENTER_TO_SEND": "برای ارسال Enter را بزنید" + "ENTER_TO_SEND": "برای ارسال Enter را بزنید", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "یادداشت خصوصی: فقط برای شما و تیم شما قابل مشاهده است", "CHANGE_STATUS": "وضعیت گفتگو تغییر کرد", @@ -66,6 +69,10 @@ "SELECT_AGENT": "انتخاب ایجنت", "REMOVE": "حذف", "ASSIGN": "اختصاص دادن" + }, + "CONTEXT_MENU": { + "COPY": "کپی", + "DELETE": "حذف" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json index 7ce451254..d1e1cf162 100644 --- a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "فعال", "DISABLED": "غیرفعال" + }, + "ENABLE_CSAT": { + "ENABLED": "فعال", + "DISABLED": "غیرفعال" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "فعال کردن واگذاری خودکار گفتگو به اپراتورها", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "تنظیمات صندوق ورودی", "INBOX_UPDATE_SUB_TEXT": "تغییر پارامترهای صندوق ورودی", "AUTO_ASSIGNMENT_SUB_TEXT": "فعال کردن یا غیرفعال کردن واگذاری خودکار گفتگوها به اپراتورهای عضو این صندوق ورودی.", diff --git a/app/javascript/dashboard/i18n/locale/fa/settings.json b/app/javascript/dashboard/i18n/locale/fa/settings.json index 2d464d64b..9c0af9ec9 100644 --- a/app/javascript/dashboard/i18n/locale/fa/settings.json +++ b/app/javascript/dashboard/i18n/locale/fa/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "اعلامیه‌ به ایمیل", diff --git a/app/javascript/dashboard/i18n/locale/fi/contact.json b/app/javascript/dashboard/i18n/locale/fi/contact.json index 84ab88c90..9f4f0fcfb 100644 --- a/app/javascript/dashboard/i18n/locale/fi/contact.json +++ b/app/javascript/dashboard/i18n/locale/fi/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Yhteystiedot", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Etsi", "SEARCH_INPUT_PLACEHOLDER": "Etsi yhteystietoja", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Peruuta", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/fi/conversation.json b/app/javascript/dashboard/i18n/locale/fi/conversation.json index 83318d8e8..74a060e29 100644 --- a/app/javascript/dashboard/i18n/locale/fi/conversation.json +++ b/app/javascript/dashboard/i18n/locale/fi/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Poista valinnat", "DOWNLOAD": "Lataa", "UPLOADING_ATTACHMENTS": "Ladataan liitteitä...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Yksityinen huomautus: Näkyy vain sinulle ja tiimillesi", "CHANGE_STATUS": "Keskustelun tila muutettu", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Valitse edustaja", "REMOVE": "Poista", "ASSIGN": "Delegoi" + }, + "CONTEXT_MENU": { + "COPY": "Kopioi", + "DELETE": "Poista" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json index 7b63acfbf..aa91bbb75 100644 --- a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Käytössä", "DISABLED": "Pois käytöstä" + }, + "ENABLE_CSAT": { + "ENABLED": "Käytössä", + "DISABLED": "Pois käytöstä" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Ota automaattinen delegointi käyttöön", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Postilaatikon tiedot", "INBOX_UPDATE_SUB_TEXT": "Päivitä postilaatikon asetukset", "AUTO_ASSIGNMENT_SUB_TEXT": "Ota käyttöön tai poista käytöstä automaattinen keskusteluiden delegointi edustajille.", diff --git a/app/javascript/dashboard/i18n/locale/fi/settings.json b/app/javascript/dashboard/i18n/locale/fi/settings.json index f4e93bfaf..0b257d1fe 100644 --- a/app/javascript/dashboard/i18n/locale/fi/settings.json +++ b/app/javascript/dashboard/i18n/locale/fi/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Sähköposti-ilmoitukset", diff --git a/app/javascript/dashboard/i18n/locale/fr/campaign.json b/app/javascript/dashboard/i18n/locale/fr/campaign.json index cabd2ce49..5a185037a 100644 --- a/app/javascript/dashboard/i18n/locale/fr/campaign.json +++ b/app/javascript/dashboard/i18n/locale/fr/campaign.json @@ -1,45 +1,45 @@ { "CAMPAIGN": { - "HEADER": "Campaigns", - "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.", - "HEADER_BTN_TXT": "Create a campaign", + "HEADER": "Campagnes", + "SIDEBAR_TXT": "Les messages proactifs permettent au client d'envoyer des messages sortants à ses contacts, qui déclenchent plus de conversations. Cliquer sur Ajouter une campagne pour créer une nouvelle campagne. Vous pouvez également modifier ou supprimer une campagne existante en cliquant sur le bouton Éditer ou Supprimer.", + "HEADER_BTN_TXT": "Créer une campagne", "ADD": { - "TITLE": "Create a campaign", - "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.", + "TITLE": "Créer une campagne", + "DESC": "Les messages proactifs permettent au client d'envoyer des messages sortants à ses contacts, ce qui déclencherait plus de conversations.", "CANCEL_BUTTON_TEXT": "Annuler", "CREATE_BUTTON_TEXT": "Créer", "FORM": { "TITLE": { - "LABEL": "Title", - "PLACEHOLDER": "Please enter the title of campaign", - "ERROR": "Title is required" + "LABEL": "Titre", + "PLACEHOLDER": "Veuillez entrer le titre de la campagne", + "ERROR": "Le titre est requis" }, "MESSAGE": { "LABEL": "Message", - "PLACEHOLDER": "Please enter the message of campaign", - "ERROR": "Message is required" + "PLACEHOLDER": "Veuillez entrer le titre de la campagne", + "ERROR": "Le message est obligatoire" }, "SENT_BY": { "LABEL": "Envoyé par", - "PLACEHOLDER": "Please select the the content of campaign", - "ERROR": "Sender is required" + "PLACEHOLDER": "Veuillez sélectionner le contenu de la campagne", + "ERROR": "L'expéditeur est requis" }, "END_POINT": { "LABEL": "URL", - "PLACEHOLDER": "Please enter the URL", + "PLACEHOLDER": "Veuillez saisir l'URL", "ERROR": "Veuillez entrer une URL valide" }, "TIME_ON_PAGE": { - "LABEL": "Time on page(Seconds)", - "PLACEHOLDER": "Please enter the time", - "ERROR": "Time on page is required" + "LABEL": "Temps sur la page (secondes)", + "PLACEHOLDER": "Veuillez indiquer le temps", + "ERROR": "Le temps sur la page est requis" }, - "ENABLED": "Enable campaign", - "SUBMIT": "Add Campaign" + "ENABLED": "Activer la campagne", + "SUBMIT": "Ajouter une campagne" }, "API": { - "SUCCESS_MESSAGE": "Campaign created successfully", - "ERROR_MESSAGE": "There was an error. Please try again." + "SUCCESS_MESSAGE": "Compte créé avec succès", + "ERROR_MESSAGE": "Une erreur est survenue, veuillez réessayer." } }, "DELETE": { @@ -51,32 +51,32 @@ "NO": "Non, Conserver " }, "API": { - "SUCCESS_MESSAGE": "Campaign deleted successfully", - "ERROR_MESSAGE": "Could not delete the campaign. Please try again later." + "SUCCESS_MESSAGE": "La campagne a bien été supprimée", + "ERROR_MESSAGE": "Impossible de supprimer la campagne. Veuillez réessayer plus tard." } }, "EDIT": { - "TITLE": "Edit campaign", + "TITLE": "Modifier la campagne", "UPDATE_BUTTON_TEXT": "Mettre à jour", "API": { - "SUCCESS_MESSAGE": "Campaign updated successfully", + "SUCCESS_MESSAGE": "Campagne mise à jour avec succès", "ERROR_MESSAGE": "Une erreur est survenue, veuillez réessayer" } }, "LIST": { - "LOADING_MESSAGE": "Loading campaigns...", - "404": "There are no campaigns created for this inbox.", + "LOADING_MESSAGE": "Chargement des campagnes...", + "404": "Il n'y a aucune campagne pour cette boîte de réception.", "TABLE_HEADER": { - "TITLE": "Title", + "TITLE": "Titre", "MESSAGE": "Message", "STATUS": "État", - "SENDER": "Sender", + "SENDER": "Expéditeur", "URL": "URL", - "TIME_ON_PAGE": "Time(Seconds)", - "CREATED_AT": "Created at" + "TIME_ON_PAGE": "Temps(secondes)", + "CREATED_AT": "Créé le" }, "BUTTONS": { - "ADD": "Add", + "ADD": "Ajouter", "EDIT": "Modifier", "DELETE": "Supprimer" }, diff --git a/app/javascript/dashboard/i18n/locale/fr/chatlist.json b/app/javascript/dashboard/i18n/locale/fr/chatlist.json index 4319d6466..3eb7840f5 100644 --- a/app/javascript/dashboard/i18n/locale/fr/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/fr/chatlist.json @@ -81,6 +81,6 @@ "VIEW_TWEET_IN_TWITTER": "Voir le tweet sur Twitter", "REPLY_TO_TWEET": "Répondre à ce tweet", "NO_MESSAGES": "Pas de messages", - "NO_CONTENT": "No content available" + "NO_CONTENT": "Aucun contenu disponible" } } diff --git a/app/javascript/dashboard/i18n/locale/fr/contact.json b/app/javascript/dashboard/i18n/locale/fr/contact.json index aa777e81f..de54b6cae 100644 --- a/app/javascript/dashboard/i18n/locale/fr/contact.json +++ b/app/javascript/dashboard/i18n/locale/fr/contact.json @@ -12,24 +12,24 @@ "INITIATED_FROM": "Initié depuis", "INITIATED_AT": "Initié à", "IP_ADDRESS": "Adresse IP", - "NEW_MESSAGE": "New message", + "NEW_MESSAGE": "Nouveau message", "CONVERSATIONS": { "NO_RECORDS_FOUND": "Il n'y a aucune conversation précédente associée à ce contact.", "TITLE": "Conversations précédentes" }, "LABELS": { "CONTACT": { - "TITLE": "Contact Labels", - "ERROR": "Couldn't update labels" + "TITLE": "Libellés des contacts", + "ERROR": "Impossible de mettre à jour les étiquettes" }, "CONVERSATION": { "TITLE": "Étiquettes de conversation", - "ADD_BUTTON": "Add Labels" + "ADD_BUTTON": "Ajouter des étiquettes" }, "LABEL_SELECT": { - "TITLE": "Add Labels", - "PLACEHOLDER": "Search labels", - "NO_RESULT": "No labels found" + "TITLE": "Ajouter une étiquette", + "PLACEHOLDER": "Rechercher des étiquettes", + "NO_RESULT": "Aucune étiquette trouvée" } }, "MUTE_CONTACT": "Mettre la conversation en sourdine", @@ -71,8 +71,8 @@ "PHONE_NUMBER": { "PLACEHOLDER": "Entrez le numéro de téléphone du contact", "LABEL": "Numéro de téléphone", - "HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]", - "ERROR": "Phone number should be either empty or of E.164 format" + "HELP": "Le numéro de téléphone doit être au format E.164. Ex. : +1415555555 [+][code pays][code régional][numéro de téléphone local]", + "ERROR": "Le numéro de téléphone doit être soit vide soit au format E.164" }, "LOCATION": { "PLACEHOLDER": "Entrez l'emplacement du contact", @@ -106,37 +106,38 @@ "ERROR_MESSAGE": "Une erreur est survenue, veuillez réessayer" }, "NEW_CONVERSATION": { - "BUTTON_LABEL": "Start conversation", + "BUTTON_LABEL": "Nouvelle conversation", "TITLE": "Nouvelle conversation", - "DESC": "Start a new conversation by sending a new message.", - "NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.", + "DESC": "Commencez une nouvelle conversation en envoyant un nouveau message.", + "NO_INBOX": "Impossible de trouver une boîte de réception pour lancer une nouvelle conversation avec ce contact.", "FORM": { "TO": { - "LABEL": "To" + "LABEL": "À" }, "INBOX": { - "LABEL": "Inbox", - "ERROR": "Select an inbox" + "LABEL": "Boîte de réception", + "ERROR": "Sélectionner une boîte de réception" }, "MESSAGE": { "LABEL": "Message", - "PLACEHOLDER": "Write your message here", - "ERROR": "Message can't be empty" + "PLACEHOLDER": "Ecrivez votre message ici", + "ERROR": "Le message ne peut être vide" }, - "SUBMIT": "Send message", + "SUBMIT": "Envoyer un message", "CANCEL": "Annuler", - "SUCCESS_MESSAGE": "Message sent!", - "ERROR_MESSAGE": "Couldn't send! try again" + "SUCCESS_MESSAGE": "Message envoyé !", + "ERROR_MESSAGE": "Impossible d'envoyer ! Veuillez réessayer" } }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Rechercher", "SEARCH_INPUT_PLACEHOLDER": "Rechercher des contacts", "LIST": { "LOADING_MESSAGE": "Chargement des contacts...", "404": "Aucun contact ne correspond à votre recherche 🔍", - "NO_CONTACTS": "There are no available contacts", + "NO_CONTACTS": "Il n'y a aucun contact disponible", "TABLE_HEADER": { "NAME": "Nom", "PHONE_NUMBER": "Numéro de téléphone", @@ -153,12 +154,12 @@ }, "REMINDER": { "ADD_BUTTON": { - "BUTTON": "Add", - "TITLE": "Shift + Enter to create a task" + "BUTTON": "Ajouter", + "TITLE": "Shift + Entrée pour créer une tâche" }, "FOOTER": { - "DUE_DATE": "Due date", - "LABEL_TITLE": "Set type" + "DUE_DATE": "Date d'échéance", + "LABEL_TITLE": "Définir le type" } }, "NOTES": { @@ -166,43 +167,71 @@ "TITLE": "Notes" }, "ADD": { - "BUTTON": "Add", - "PLACEHOLDER": "Add a note", - "TITLE": "Shift + Enter to create a note" + "BUTTON": "Ajouter", + "PLACEHOLDER": "Ajouter une note", + "TITLE": "Shift + Entrée pour créer une note" }, "FOOTER": { - "BUTTON": "View all notes" + "BUTTON": "Voir toutes les notes" } }, "EVENTS": { "HEADER": { - "TITLE": "Activities" + "TITLE": "Activités" }, "BUTTON": { - "PILL_BUTTON_NOTES": "notes", - "PILL_BUTTON_EVENTS": "events", + "PILL_BUTTON_NOTES": "Notes", + "PILL_BUTTON_EVENTS": "Evénements", "PILL_BUTTON_CONVO": "conversations" } }, "CUSTOM_ATTRIBUTES": { "TITLE": "Attributs personnalisés", - "BUTTON": "Add custom attribute", + "BUTTON": "Ajouter un attribut personnalisé", "ADD": { - "TITLE": "Create custom attribute", - "DESC": "Add custom information to this contact." + "TITLE": "Créer un attribut personnalisé", + "DESC": "Ajouter des informations personnalisées à ce contact." }, "FORM": { - "CREATE": "Add attribute", + "CREATE": "Ajouter un attribut", "CANCEL": "Annuler", "NAME": { - "LABEL": "Custom attribute name", - "PLACEHOLDER": "Eg: shopify id", - "ERROR": "Invalid custom attribute name" + "LABEL": "Nom de l'attribut personnalisé", + "PLACEHOLDER": "Ex. : id shopify", + "ERROR": "Nom de l'attribut personnalisé invalide" }, "VALUE": { - "LABEL": "Attribute value", - "PLACEHOLDER": "Eg: 11901 " + "LABEL": "Valeur de l'attribut", + "PLACEHOLDER": "Ex.: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Annuler", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/fr/conversation.json b/app/javascript/dashboard/i18n/locale/fr/conversation.json index 214586790..fa3001f70 100644 --- a/app/javascript/dashboard/i18n/locale/fr/conversation.json +++ b/app/javascript/dashboard/i18n/locale/fr/conversation.json @@ -20,16 +20,18 @@ "LOADING_CONVERSATIONS": "Chargement des conversations", "CANNOT_REPLY": "Vous ne pouvez pas répondre en raison de", "24_HOURS_WINDOW": "Restriction de fenêtre de message de 24 heures", - "TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to", + "TWILIO_WHATSAPP_CAN_REPLY": "Vous pouvez seulement répondre à cette conversation en utilisant un modèle de message en raison de", "TWILIO_WHATSAPP_24_HOURS_WINDOW": "Restriction de fenêtre de message de 24 heures", "LAST_INCOMING_TWEET": "Vous répondez au dernier tweet entrant", "REPLYING_TO": "Vous répondez à :", "REMOVE_SELECTION": "Supprimer la sélection", "DOWNLOAD": "Télécharger", "UPLOADING_ATTACHMENTS": "Envoi des pièces jointes...", + "SUCCESS_DELETE_MESSAGE": "Le message a bien été supprimé", + "FAIL_DELETE_MESSSAGE": "Impossible de supprimer le message ! Veuillez réessayez", "NO_RESPONSE": "Pas de réponse", - "RATING_TITLE": "Rating", - "FEEDBACK_TITLE": "Feedback", + "RATING_TITLE": "Note", + "FEEDBACK_TITLE": "Commentaires", "HEADER": { "RESOLVE_ACTION": "Résoudre", "REOPEN_ACTION": "Ré-ouvrir", @@ -54,18 +56,23 @@ "TIP_FORMAT_ICON": "Afficher l'éditeur de texte enrichi", "TIP_EMOJI_ICON": "Montrer le sélecteur d'émoji", "TIP_ATTACH_ICON": "Joindre des fichiers", - "ENTER_TO_SEND": "Entrer pour envoyer" + "ENTER_TO_SEND": "Entrer pour envoyer", + "DRAG_DROP": "Glissez et déposez ici pour lier" }, "VISIBLE_TO_AGENTS": "Note privée : uniquement visible par vous et votre équipe", "CHANGE_STATUS": "Statut de la conversation modifié", "CHANGE_AGENT": "Responsable de la conversation modifié", "CHANGE_TEAM": "L'équipe de conversation a été modifiée", - "FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_FILE_UPLOAD_SIZE} attachment limit", + "FILE_SIZE_LIMIT": "Le fichier dépasse la limite de {MAXIMUM_FILE_UPLOAD_SIZE} pour les pièces jointes", "SENT_BY": "Envoyé par:", "ASSIGNMENT": { "SELECT_AGENT": "Sélectionner un agent", "REMOVE": "Supprimer", "ASSIGN": "Assigner" + }, + "CONTEXT_MENU": { + "COPY": "Copier", + "DELETE": "Supprimer" } }, "EMAIL_TRANSCRIPT": { @@ -111,7 +118,7 @@ }, "CONVERSATION_SIDEBAR": { "ASSIGNEE_LABEL": "Agent Assigné", - "SELF_ASSIGN": "Assign to me", + "SELF_ASSIGN": "M’assigner la conversation", "TEAM_LABEL": "Équipe assignée", "SELECT": { "PLACEHOLDER": "Aucun" diff --git a/app/javascript/dashboard/i18n/locale/fr/csatMgmt.json b/app/javascript/dashboard/i18n/locale/fr/csatMgmt.json index d7d2efc2a..90a27f6af 100644 --- a/app/javascript/dashboard/i18n/locale/fr/csatMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fr/csatMgmt.json @@ -1,6 +1,6 @@ { "CSAT": { - "TITLE": "Rate your conversation", - "PLACEHOLDER": "Tell us more..." + "TITLE": "Évaluer votre conversation", + "PLACEHOLDER": "Dites-nous en plus..." } } diff --git a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json index 3a37cdcad..4b3854da0 100644 --- a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json @@ -30,11 +30,11 @@ "ADD": { "CHANNEL_NAME": { "LABEL": "Nom de la boîte de réception", - "PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)" + "PLACEHOLDER": "Entrez le nom de votre boîte de réception (ex: Acme Inc)" }, "WEBSITE_NAME": { - "LABEL": "Nom du site Web", - "PLACEHOLDER": "Entrez le nom de votre site Web (ex : Acme Inc)" + "LABEL": "Nom du site web", + "PLACEHOLDER": "Entrez le nom de votre boîte de réception (ex: Acme Inc)" }, "FB": { "HELP": "PS : En vous connectant, nous avons seulement accès aux messages de votre page. Vos messages privés ne peuvent jamais être consultés par Chatwoot.", @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Activé", "DISABLED": "Désactivé" + }, + "ENABLE_CSAT": { + "ENABLED": "Activé", + "DISABLED": "Désactivé" } }, "DELETE": { @@ -223,7 +227,7 @@ "CONFIRM": { "TITLE": "Confirmer la suppression", "MESSAGE": "Êtes-vous sûr de vouloir supprimer ", - "PLACE_HOLDER": "Please type {inboxName} to confirm", + "PLACE_HOLDER": "Veuillez taper {inboxName} pour confirmer", "YES": "Oui, supprimer ", "NO": "Non, Conserver " }, @@ -236,7 +240,7 @@ "SETTINGS": "Paramètres", "COLLABORATORS": "Collaborateurs", "CONFIGURATION": "Configuration", - "CAMPAIGN": "Campaigns", + "CAMPAIGN": "Campagnes", "PRE_CHAT_FORM": "Formulaire avant chat", "BUSINESS_HOURS": "Heures de bureau" }, @@ -252,9 +256,11 @@ "INBOX_AGENTS": "Agents", "INBOX_AGENTS_SUB_TEXT": "Ajouter ou supprimer des agents de cette boîte de réception", "UPDATE": "Mettre à jour", - "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", - "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", + "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", "AUTO_ASSIGNMENT": "Activer l'assignation automatique", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Paramètres de boîtes de réception", "INBOX_UPDATE_SUB_TEXT": "Mettre à jour les paramètres de votre boîte de réception", "AUTO_ASSIGNMENT_SUB_TEXT": "Activer ou désactiver l'affectation automatique de nouvelles conversations aux agents ajoutés à cette boîte de réception.", diff --git a/app/javascript/dashboard/i18n/locale/fr/integrationApps.json b/app/javascript/dashboard/i18n/locale/fr/integrationApps.json index ec047a23f..60bbb5ac8 100644 --- a/app/javascript/dashboard/i18n/locale/fr/integrationApps.json +++ b/app/javascript/dashboard/i18n/locale/fr/integrationApps.json @@ -1,36 +1,36 @@ { "INTEGRATION_APPS": { - "FETCHING": "Fetching Integrations", - "NO_HOOK_CONFIGURED": "There are no %{integrationId} integrations configured in this account.", + "FETCHING": "Récupération des intégrations", + "NO_HOOK_CONFIGURED": "Aucune intégration %{integrationId} n'est configurée dans ce compte.", "HEADER": "Applications", "STATUS": { "ENABLED": "Activé", "DISABLED": "Désactivé" }, "CONFIGURE": "Configurer", - "ADD_BUTTON": "Add a new hook", + "ADD_BUTTON": "Ajouter un nouveau hook", "DELETE": { "TITLE": { - "INBOX": "Confirm deletion", - "ACCOUNT": "Disconnect" + "INBOX": "Confirmer la suppression", + "ACCOUNT": "Déconnecter" }, "MESSAGE": { "INBOX": "Êtes-vous sûr de vouloir supprimer?", - "ACCOUNT": "Are you sure to disconnect?" + "ACCOUNT": "Êtes-vous sûr de vouloir déconnecter?" }, "CONFIRM_BUTTON_TEXT": { "INBOX": "Oui, supprimer", - "ACCOUNT": "Yes, Disconnect" + "ACCOUNT": "Oui, déconnecter" }, "CANCEL_BUTTON_TEXT": "Annuler", "API": { - "SUCCESS_MESSAGE": "Hook deleted successfully", + "SUCCESS_MESSAGE": "Webhook supprimé avec succès", "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" } }, "LIST": { - "FETCHING": "Fetching integration hooks", - "INBOX": "Inbox", + "FETCHING": "Récupération des webhooks de l'intégration", + "INBOX": "Boîte de réception", "DELETE": { "BUTTON_TEXT": "Supprimer" } @@ -38,14 +38,14 @@ "ADD": { "FORM": { "INBOX": { - "LABEL": "Select Inbox", - "PLACEHOLDER": "Select Inbox" + "LABEL": "Sélectionner la boîte de réception", + "PLACEHOLDER": "Sélectionner la boîte de réception" }, "SUBMIT": "Créer", "CANCEL": "Annuler" }, "API": { - "SUCCESS_MESSAGE": "Integration hook added successfully", + "SUCCESS_MESSAGE": "Hook d'intégration ajouté avec succès", "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" } }, @@ -53,10 +53,10 @@ "BUTTON_TEXT": "Connecter" }, "DISCONNECT": { - "BUTTON_TEXT": "Disconnect" + "BUTTON_TEXT": "Déconnecter" }, "SIDEBAR_DESCRIPTION": { - "DIALOGFLOW": "Dialogflow is a natural language understanding platform that makes it easy to design and integrate a conversational user interface into your mobile app, web application, device, bot, interactive voice response system, and so on.

Dialogflow integration with %{installationName} allows you to configure a Dialogflow bot with your inboxes which lets the bot handle the queries initially and hand them over to an agent when needed. Dialogflow can be used to qualifying the leads, reduce the workload of agents by providing frequently asked questions etc.

To add Dialogflow, you need to create a Service Account in your Google project console and share the credentials. Please refer to the Dialogflow docs for more information." + "DIALOGFLOW": "Dialogflow est une plateforme de compréhension du langage naturel qui facilite la conception et l'intégration d'une interface utilisateur dans votre application mobile, application web, périphérique, bot, système de réponse vocale interactive, et ainsi de suite.

L'intégration de Dialogflow avec %{installationName} vous permet de configurer un bot Dialogflow avec vos boîtes de réception qui permet au bot de gérer les requêtes initialement et de les remettre à un agent si nécessaire. Le Dialogflow peut être utilisé pour qualifier les plombs, réduire la charge de travail des agents en fournissant des questions fréquentes, etc.

Pour ajouter Dialogflow, vous devez créer un compte de service dans votre console de projet Google et partager les identifiants. Reportez-vous à la documentation Dialogflow pour plus d'informations." } } } diff --git a/app/javascript/dashboard/i18n/locale/fr/integrations.json b/app/javascript/dashboard/i18n/locale/fr/integrations.json index 248491ce4..ea9a35c32 100644 --- a/app/javascript/dashboard/i18n/locale/fr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fr/integrations.json @@ -19,7 +19,7 @@ }, "EDIT": { "BUTTON_TEXT": "Modifier", - "TITLE": "Edit webhook", + "TITLE": "Modifier le webhook", "CANCEL": "Annuler", "DESC": "Les événements Webhook vous fournissent des informations en temps réel sur ce qui se passe dans votre compte Chatwoot. Veuillez entrer une URL valide pour configurer un callback.", "FORM": { @@ -28,10 +28,10 @@ "PLACEHOLDER": "Exemple : https://exemple/api/webhook", "ERROR": "Veuillez entrer une URL valide" }, - "SUBMIT": "Edit webhook" + "SUBMIT": "Modifier le webhook" }, "API": { - "SUCCESS_MESSAGE": "Webhook URL updated successfully", + "SUCCESS_MESSAGE": "URL du webhook mise à jour avec succès", "ERROR_MESSAGE": "Impossible de se connecter au serveur Woot, veuillez réessayer plus tard" } }, @@ -68,8 +68,8 @@ }, "SLACK": { "HELP_TEXT": { - "TITLE": "Using Slack Integration", - "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + "TITLE": "Utilisation de l'intégration Slack", + "BODY": "

Chatwoot va maintenant synchroniser toutes les conversations entrantes dans le canal customer-conversations à l'intérieur de Workspace Sack.

Répondre à un fil de conversation dans le canal Slack customer-conversations créera une réponse au client via chatwoot.

Commencez les réponses avec note : pour créer des notes privées au lieu de réponses.

Si le répondant sur Slack a un profil d'agent dans le chat avec la même adresse email, les réponses seront associées en conséquence.

Lorsque le répondant n'a pas de profil d'agent associé, les réponses seront faites avec le profil du bot.

" } }, "DELETE": { diff --git a/app/javascript/dashboard/i18n/locale/fr/labelsMgmt.json b/app/javascript/dashboard/i18n/locale/fr/labelsMgmt.json index cd25a727a..8500cff6a 100644 --- a/app/javascript/dashboard/i18n/locale/fr/labelsMgmt.json +++ b/app/javascript/dashboard/i18n/locale/fr/labelsMgmt.json @@ -19,9 +19,9 @@ "NAME": { "LABEL": "Nom de l'étiquette", "PLACEHOLDER": "Nom de l'étiquette", - "REQUIRED_ERROR": "Label name is required", - "MINIMUM_LENGTH_ERROR": "Minimum length 2 is required", - "VALID_ERROR": "Only Alphabets, Numbers, Hyphen and Underscore are allowed" + "REQUIRED_ERROR": "Le nom de l'étiquette est requis", + "MINIMUM_LENGTH_ERROR": "Longueur minimale de 2 requise", + "VALID_ERROR": "Seuls les caractères alphabétiques, les chiffres, les traits d'union et les tirets bas sont autorisés" }, "DESCRIPTION": { "LABEL": "Description", diff --git a/app/javascript/dashboard/i18n/locale/fr/report.json b/app/javascript/dashboard/i18n/locale/fr/report.json index 82d3dd070..8c48ecfb9 100644 --- a/app/javascript/dashboard/i18n/locale/fr/report.json +++ b/app/javascript/dashboard/i18n/locale/fr/report.json @@ -41,15 +41,15 @@ }, { "id": 2, - "name": "Last 3 months" + "name": "3 derniers mois" }, { "id": 3, - "name": "Last 6 months" + "name": "6 derniers mois" }, { "id": 4, - "name": "Last year" + "name": "Année dernière" } ] } diff --git a/app/javascript/dashboard/i18n/locale/fr/settings.json b/app/javascript/dashboard/i18n/locale/fr/settings.json index 8a6d63889..d93e10764 100644 --- a/app/javascript/dashboard/i18n/locale/fr/settings.json +++ b/app/javascript/dashboard/i18n/locale/fr/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Notifications audio", "NOTE": "Activer les notifications audio dans le tableau de bord pour les nouveaux messages et conversations.", - "ENABLE_AUDIO": "Jouer une notification audio lorsqu'une nouvelle conversation est créée ou que de nouveaux messages arrivent" + "NONE": "Aucun", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notifications par courriel", @@ -79,9 +81,9 @@ "PLACEHOLDER": "Veuillez entrer votre adresse de courriel, cela sera affiché dans les conversations" }, "CURRENT_PASSWORD": { - "LABEL": "Current password", - "ERROR": "Please enter the current password", - "PLACEHOLDER": "Please enter the current password" + "LABEL": "Mot de passe actuel", + "ERROR": "Veuillez entrer le mot de passe actuel", + "PLACEHOLDER": "Veuillez entrer le mot de passe actuel" }, "PASSWORD": { "LABEL": "Mot de passe", @@ -140,8 +142,8 @@ "APPLICATIONS": "Applications", "LABELS": "Étiquettes", "TEAMS": "Équipes", - "ALL_CONTACTS": "All Contacts", - "TAGGED_WITH": "Tagged with" + "ALL_CONTACTS": "Tous les contacts", + "TAGGED_WITH": "Tagué avec" }, "CREATE_ACCOUNT": { "NEW_ACCOUNT": "Nouveau compte", diff --git a/app/javascript/dashboard/i18n/locale/fr/teamsSettings.json b/app/javascript/dashboard/i18n/locale/fr/teamsSettings.json index 122371db3..79b7d5678 100644 --- a/app/javascript/dashboard/i18n/locale/fr/teamsSettings.json +++ b/app/javascript/dashboard/i18n/locale/fr/teamsSettings.json @@ -15,21 +15,21 @@ "AGENTS": { "BUTTON_TEXT": "Ajouter un agent à votre équipe", "TITLE": "Ajouter des agents à l'équipe - %{teamName}", - "DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation." + "DESC": "Ajouter des agents à votre équipe nouvellement créée. Cela vous permet de collaborer en équipe sur les conversations, d'être informé des nouveaux événements dans la même conversation." }, "WIZARD": [ { "title": "Créer", "route": "settings_teams_new", - "body": "Create a new team of agents." + "body": "Créer une nouvelle équipe d'agents." }, { "title": "Ajouter des agents", "route": "settings_teams_add_agents", - "body": "Add agents to the team." + "body": "Ajouter des agents à l'équipe." }, { - "title": "Finish", + "title": "Terminer", "route": "settings_teams_finish", "body": "Vous êtes paré !" } @@ -37,89 +37,89 @@ }, "EDIT_FLOW": { "CREATE": { - "TITLE": "Edit your team details", - "DESC": "Edit title and description to your team.", - "BUTTON_TEXT": "Update team" + "TITLE": "Modifier les détails de votre équipe", + "DESC": "Modifier le titre et la description de votre équipe.", + "BUTTON_TEXT": "Mettre à jour l'équipe" }, "AGENTS": { - "BUTTON_TEXT": "Update agents in team", + "BUTTON_TEXT": "Mettre à jour les agents dans l'équipe", "TITLE": "Ajouter des agents à l'équipe - %{teamName}", - "DESC": "Add Agents to your newly created team. All the added agents will be notified when a conversation is assigned to this team." + "DESC": "Ajouter des agents à votre équipe nouvellement créée. Tous les agents ajoutés seront notifiés lorsqu'une conversation est assignée à cette équipe." }, "WIZARD": [ { - "title": "Team details", + "title": "Détails de l'équipe", "route": "settings_teams_edit", - "body": "Change name, description and other details." + "body": "Changer le nom, la description et d'autres détails." }, { - "title": "Edit Agents", + "title": "Modifier les agents", "route": "settings_teams_edit_members", - "body": "Edit agents in your team." + "body": "Modifier les agents dans votre équipe." }, { - "title": "Finish", + "title": "Terminer", "route": "settings_teams_edit_finish", "body": "Vous êtes paré !" } ] }, "TEAM_FORM": { - "ERROR_MESSAGE": "Couldn't save the team details. Try again." + "ERROR_MESSAGE": "Impossible d'enregistrer les détails de l'équipe. Veuillez réessayer." }, "AGENTS": { "AGENT": "AGENT", "EMAIL": "COURRIEL", "BUTTON_TEXT": "Ajouter des agents", - "ADD_AGENTS": "Adding Agents to your Team...", - "SELECT": "select", - "SELECT_ALL": "select all agents", - "SELECTED_COUNT": "%{selected} out of %{total} agents selected." + "ADD_AGENTS": "Ajout d'agents à votre équipe...", + "SELECT": "sélectionner", + "SELECT_ALL": "sélectionner tous les agents", + "SELECTED_COUNT": "%{selected} agents sur %{total} sélectionnés." }, "ADD": { "TITLE": "Ajouter des agents à l'équipe - %{teamName}", - "DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation.", - "SELECT": "select", - "SELECT_ALL": "select all agents", - "SELECTED_COUNT": "%{selected} out of %{total} agents selected.", + "DESC": "Ajouter des agents à votre équipe nouvellement créée. Cela vous permet de collaborer en équipe sur les conversations, d'être informé des nouveaux événements dans la même conversation.", + "SELECT": "sélectionner", + "SELECT_ALL": "sélectionner tous les agents", + "SELECTED_COUNT": "%{selected} agents sur %{total} sélectionnés.", "BUTTON_TEXT": "Ajouter des agents", - "AGENT_VALIDATION_ERROR": "Select atleaset one agent." + "AGENT_VALIDATION_ERROR": "Veuillez sélectionner au moins un agent." }, "FINISH": { - "TITLE": "Your team is ready!", - "MESSAGE": "You can now collaborate as a team on conversations. Happy supporting ", - "BUTTON_TEXT": "Finish" + "TITLE": "Votre équipe est prête !", + "MESSAGE": "Vous pouvez maintenant collaborer en tant qu'équipe dans les conversations. Bonne assistance ", + "BUTTON_TEXT": "Terminer" }, "DELETE": { "BUTTON_TEXT": "Supprimer", "API": { - "SUCCESS_MESSAGE": "Team deleted successfully.", - "ERROR_MESSAGE": "Couldn't delete the team. Try again." + "SUCCESS_MESSAGE": "Équipe supprimée avec succès.", + "ERROR_MESSAGE": "Impossible de supprimer l'équipe. Veuillez réessayer." }, "CONFIRM": { - "TITLE": "Are you sure want to delete - %{teamName}", - "PLACE_HOLDER": "Please type {teamName} to confirm", - "MESSAGE": "Deleting the team will remove the team assignment from the conversations assigned to this team.", + "TITLE": "Voulez-vous vraiment supprimer - %{teamName}", + "PLACE_HOLDER": "Veuillez entrer {teamName} pour confirmer", + "MESSAGE": "La suppression de l'équipe supprimera les affectations liées aux conversations de cette équipe.", "YES": "Supprimer ", "NO": "Annuler" } }, "SETTINGS": "Paramètres", "FORM": { - "UPDATE": "Update team", - "CREATE": "Create team", + "UPDATE": "Mettre à jour l'équipe", + "CREATE": "Créer une équipe", "NAME": { - "LABEL": "Team name", - "PLACEHOLDER": "Example: Sales, Customer Support" + "LABEL": "Nom de l'équipe", + "PLACEHOLDER": "Exemple : Ventes, Support Client" }, "DESCRIPTION": { - "LABEL": "Team Description", - "PLACEHOLDER": "Short description about this team." + "LABEL": "Description de l'équipe", + "PLACEHOLDER": "Brève description de cette équipe." }, "AUTO_ASSIGN": { - "LABEL": "Allow auto assign for this team." + "LABEL": "Autoriser l'affectation automatique pour cette équipe." }, - "SUBMIT_CREATE": "Create team" + "SUBMIT_CREATE": "Créer une équipe" } } } diff --git a/app/javascript/dashboard/i18n/locale/he/contact.json b/app/javascript/dashboard/i18n/locale/he/contact.json index 1df00c01c..daaa7eac8 100644 --- a/app/javascript/dashboard/i18n/locale/he/contact.json +++ b/app/javascript/dashboard/i18n/locale/he/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "ביטול", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/he/conversation.json b/app/javascript/dashboard/i18n/locale/he/conversation.json index caaeba2e7..307bf6d7f 100644 --- a/app/javascript/dashboard/i18n/locale/he/conversation.json +++ b/app/javascript/dashboard/i18n/locale/he/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "הורד", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team", "CHANGE_STATUS": "Conversation status changed", @@ -66,6 +69,10 @@ "SELECT_AGENT": "בחר סוכן", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "מחק" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json index f0ff404de..e124878a0 100644 --- a/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/he/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "מופעל", "DISABLED": "כבוי" + }, + "ENABLE_CSAT": { + "ENABLED": "מופעל", + "DISABLED": "כבוי" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Enable auto assignment", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/he/settings.json b/app/javascript/dashboard/i18n/locale/he/settings.json index 49664e981..0f2ea9957 100644 --- a/app/javascript/dashboard/i18n/locale/he/settings.json +++ b/app/javascript/dashboard/i18n/locale/he/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", diff --git a/app/javascript/dashboard/i18n/locale/hi/contact.json b/app/javascript/dashboard/i18n/locale/hi/contact.json index 24bcbc27e..051aad27e 100644 --- a/app/javascript/dashboard/i18n/locale/hi/contact.json +++ b/app/javascript/dashboard/i18n/locale/hi/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancel", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/hi/conversation.json b/app/javascript/dashboard/i18n/locale/hi/conversation.json index 587530e74..81c023aa5 100644 --- a/app/javascript/dashboard/i18n/locale/hi/conversation.json +++ b/app/javascript/dashboard/i18n/locale/hi/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team", "CHANGE_STATUS": "Conversation status changed", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "Delete" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json index 06eeb3d5d..1dc1d366d 100644 --- a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", "DISABLED": "Disabled" + }, + "ENABLE_CSAT": { + "ENABLED": "Enabled", + "DISABLED": "Disabled" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Enable auto assignment", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/hi/settings.json b/app/javascript/dashboard/i18n/locale/hi/settings.json index b3ed7b95f..dcdb58fac 100644 --- a/app/javascript/dashboard/i18n/locale/hi/settings.json +++ b/app/javascript/dashboard/i18n/locale/hi/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", diff --git a/app/javascript/dashboard/i18n/locale/hu/contact.json b/app/javascript/dashboard/i18n/locale/hu/contact.json index 2336d4915..2671721c7 100644 --- a/app/javascript/dashboard/i18n/locale/hu/contact.json +++ b/app/javascript/dashboard/i18n/locale/hu/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontaktok", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Keresés", "SEARCH_INPUT_PLACEHOLDER": "Kontaktok keresése", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Mégse", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/hu/conversation.json b/app/javascript/dashboard/i18n/locale/hu/conversation.json index 374933346..3bc0ee681 100644 --- a/app/javascript/dashboard/i18n/locale/hu/conversation.json +++ b/app/javascript/dashboard/i18n/locale/hu/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Kijelölés törlése", "DOWNLOAD": "Letöltés", "UPLOADING_ATTACHMENTS": "Csatolt fileok feltöltése...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Nincs válasz", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Rich szövegszerkesztő mutatása", "TIP_EMOJI_ICON": "Emoji választó mutatása", "TIP_ATTACH_ICON": "Fileok csatolása", - "ENTER_TO_SEND": "Enter-rel elküld" + "ENTER_TO_SEND": "Enter-rel elküld", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Privát megjegyzés: csak Neked és a csapat tagjainak látható", "CHANGE_STATUS": "A beszélgetés státusza megváltozott", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Ügynök kiválasztása", "REMOVE": "Eltávolítás", "ASSIGN": "Hozzárendelés" + }, + "CONTEXT_MENU": { + "COPY": "Másolás", + "DELETE": "Törlés" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json index 6ef55fd89..3a4c015c5 100644 --- a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Engedélyezve", "DISABLED": "Letiltva" + }, + "ENABLE_CSAT": { + "ENABLED": "Engedélyezve", + "DISABLED": "Letiltva" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Automata hozzárendelés engedélyezése", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Fiókbeállítások", "INBOX_UPDATE_SUB_TEXT": "Frissítsd az inbox beállításaidat", "AUTO_ASSIGNMENT_SUB_TEXT": "Bekapcsolása vagy kikapcsolása az inboxhoz kapcsolódó automatikus ügynökhozzárendelésnek új beszélgetések esetén.", diff --git a/app/javascript/dashboard/i18n/locale/hu/settings.json b/app/javascript/dashboard/i18n/locale/hu/settings.json index 7bb3c1590..933dc2556 100644 --- a/app/javascript/dashboard/i18n/locale/hu/settings.json +++ b/app/javascript/dashboard/i18n/locale/hu/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Hangüzenetek", "NOTE": "Hangüzenetek engedélyezése a vezérlőpulton új üzenetek és beszélgetések esetén.", - "ENABLE_AUDIO": "Kapj hangüzenetet ha új beszélgetés vagy üzenet érkezik" + "NONE": "Nincs", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-mail értesítések", diff --git a/app/javascript/dashboard/i18n/locale/id/contact.json b/app/javascript/dashboard/i18n/locale/id/contact.json index 871f82c43..9c63b42de 100644 --- a/app/javascript/dashboard/i18n/locale/id/contact.json +++ b/app/javascript/dashboard/i18n/locale/id/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontak", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Cari", "SEARCH_INPUT_PLACEHOLDER": "Cari Kontak", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Batalkan", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/id/conversation.json b/app/javascript/dashboard/i18n/locale/id/conversation.json index 3d62b7c90..6c19b4eea 100644 --- a/app/javascript/dashboard/i18n/locale/id/conversation.json +++ b/app/javascript/dashboard/i18n/locale/id/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Hapus Pilihan", "DOWNLOAD": "Unduh", "UPLOADING_ATTACHMENTS": "Unggah lampiran...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Tidak ada respon", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Tampilkan editor teks", "TIP_EMOJI_ICON": "Tampilkan pemilih emoji", "TIP_ATTACH_ICON": "Lampirkan file", - "ENTER_TO_SEND": "Enter untuk mengirim" + "ENTER_TO_SEND": "Enter untuk mengirim", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Catatan Pribadi: Hanya terlihat oleh Anda dan tim Anda", "CHANGE_STATUS": "Status percakapan berubah", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Pilih Agen", "REMOVE": "Hapus", "ASSIGN": "Tugaskan" + }, + "CONTEXT_MENU": { + "COPY": "Salin", + "DELETE": "Hapus" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json index 7b624d13a..44cde61ec 100644 --- a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Diaktifkan", "DISABLED": "Nonaktif" + }, + "ENABLE_CSAT": { + "ENABLED": "Diaktifkan", + "DISABLED": "Nonaktif" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Aktifkan penugasan otomatis", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Pengaturan Kotak Masuk", "INBOX_UPDATE_SUB_TEXT": "Perbarui pengaturan kotak masuk Anda", "AUTO_ASSIGNMENT_SUB_TEXT": "Mengaktifkan atau menonaktifkan penugasan otomatis percakapan baru ke agen yang ditambahkan ke kotak masuk ini.", diff --git a/app/javascript/dashboard/i18n/locale/id/settings.json b/app/javascript/dashboard/i18n/locale/id/settings.json index f2b28a293..f4049be4d 100644 --- a/app/javascript/dashboard/i18n/locale/id/settings.json +++ b/app/javascript/dashboard/i18n/locale/id/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Pemberitahuan Audio", "NOTE": "Aktifkan notifikasi audio di dasbor untuk pesan dan percakapan baru.", - "ENABLE_AUDIO": "Putar pemberitahuan audio ketika percakapan baru dibuat atau pesan baru masuk" + "NONE": "Tidak ada", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notifikasi Email", diff --git a/app/javascript/dashboard/i18n/locale/it/contact.json b/app/javascript/dashboard/i18n/locale/it/contact.json index c7cafff52..b7610853b 100644 --- a/app/javascript/dashboard/i18n/locale/it/contact.json +++ b/app/javascript/dashboard/i18n/locale/it/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "annulla", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/it/conversation.json b/app/javascript/dashboard/i18n/locale/it/conversation.json index 96aafd45e..fe10fc000 100644 --- a/app/javascript/dashboard/i18n/locale/it/conversation.json +++ b/app/javascript/dashboard/i18n/locale/it/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Scaricare", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Nota privata: visibile solo a te e al tuo team", "CHANGE_STATUS": "Stato conversazione cambiato", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Rimuovi", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copia", + "DELETE": "Cancellare" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json index 6a852df62..fd76785eb 100644 --- a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Abilitato", "DISABLED": "Disabilitato" + }, + "ENABLE_CSAT": { + "ENABLED": "Abilitato", + "DISABLED": "Disabilitato" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Abilita assegnazione automatica", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Impostazioni della Posta In Arrivo", "INBOX_UPDATE_SUB_TEXT": "Aggiorna le impostazioni della posta in arrivo", "AUTO_ASSIGNMENT_SUB_TEXT": "Abilita o disabilita l'assegnazione automatica di nuove conversazioni agli agenti aggiunti a questa casella di posta.", diff --git a/app/javascript/dashboard/i18n/locale/it/settings.json b/app/javascript/dashboard/i18n/locale/it/settings.json index e44d2923e..4e4fe17e2 100644 --- a/app/javascript/dashboard/i18n/locale/it/settings.json +++ b/app/javascript/dashboard/i18n/locale/it/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notifiche email", diff --git a/app/javascript/dashboard/i18n/locale/ja/contact.json b/app/javascript/dashboard/i18n/locale/ja/contact.json index 4920808b5..da1ff34a2 100644 --- a/app/javascript/dashboard/i18n/locale/ja/contact.json +++ b/app/javascript/dashboard/i18n/locale/ja/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "キャンセル", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ja/conversation.json b/app/javascript/dashboard/i18n/locale/ja/conversation.json index 70966f56e..4ec66f9f3 100644 --- a/app/javascript/dashboard/i18n/locale/ja/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ja/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "選択項目を削除", "DOWNLOAD": "ダウンロード", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "非公開設定の注意:あなたとあなたのチームのみに表示されます", "CHANGE_STATUS": "会話の状態が変更されました", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "削除", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "コピー", + "DELETE": "削除" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json index 223c3e8ef..98e2ccb5e 100644 --- a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "有効です", "DISABLED": "無効です" + }, + "ENABLE_CSAT": { + "ENABLED": "有効です", + "DISABLED": "無効です" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "自動割り当てを有効にする", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "受信トレイの設定", "INBOX_UPDATE_SUB_TEXT": "受信トレイの設定を更新する", "AUTO_ASSIGNMENT_SUB_TEXT": "この受信トレイに追加された担当者への新しい会話の自動割り当てを有効または無効にします。", diff --git a/app/javascript/dashboard/i18n/locale/ja/settings.json b/app/javascript/dashboard/i18n/locale/ja/settings.json index 429e5ae59..fdf6bcf1c 100644 --- a/app/javascript/dashboard/i18n/locale/ja/settings.json +++ b/app/javascript/dashboard/i18n/locale/ja/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Eメール通知", diff --git a/app/javascript/dashboard/i18n/locale/ko/contact.json b/app/javascript/dashboard/i18n/locale/ko/contact.json index 095e6f7e8..07f3851dc 100644 --- a/app/javascript/dashboard/i18n/locale/ko/contact.json +++ b/app/javascript/dashboard/i18n/locale/ko/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "연락처", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "검색", "SEARCH_INPUT_PLACEHOLDER": "연락처 검색", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "취소", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ko/conversation.json b/app/javascript/dashboard/i18n/locale/ko/conversation.json index 5549cd4be..d0d635b06 100644 --- a/app/javascript/dashboard/i18n/locale/ko/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ko/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "선택 항목 제거", "DOWNLOAD": "다운로드", "UPLOADING_ATTACHMENTS": "첨부 업로드 중...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "응답없음", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "웹 편집기 보기", "TIP_EMOJI_ICON": "이모티콘 보기", "TIP_ATTACH_ICON": "파일 첨부", - "ENTER_TO_SEND": "엔터를 눌러 전송하기" + "ENTER_TO_SEND": "엔터를 눌러 전송하기", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "개인 노트: 귀하와 귀하의 팀만 볼 수 있음", "CHANGE_STATUS": "대화 상태가 변경됨", @@ -66,6 +69,10 @@ "SELECT_AGENT": "에이전트 선택", "REMOVE": "제거", "ASSIGN": "할당하다" + }, + "CONTEXT_MENU": { + "COPY": "복사", + "DELETE": "삭제" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json index 97561d33d..35b3def66 100644 --- a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "사용함", "DISABLED": "사용 안 함" + }, + "ENABLE_CSAT": { + "ENABLED": "사용함", + "DISABLED": "사용 안 함" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "자동 할당 사용", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "받은 메시지함 설정", "INBOX_UPDATE_SUB_TEXT": "받은 메시지함 설정 업데이트", "AUTO_ASSIGNMENT_SUB_TEXT": "받은 메시지에 추가된 에이전트에 새 대화를 자동으로 할당하거나 할당하지 않도록 설정하십시오.", diff --git a/app/javascript/dashboard/i18n/locale/ko/settings.json b/app/javascript/dashboard/i18n/locale/ko/settings.json index 50f1d9c48..26f1f71cc 100644 --- a/app/javascript/dashboard/i18n/locale/ko/settings.json +++ b/app/javascript/dashboard/i18n/locale/ko/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "음성 알림", "NOTE": "대시보드에서 새 메시지 및 대화에 대한 오디오 알림을 활성화합니다.", - "ENABLE_AUDIO": "새 대화가 생성되거나 새 메시지가 도착할 때 오디오 알림 재생" + "NONE": "없음", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "이메일 알림", diff --git a/app/javascript/dashboard/i18n/locale/ml/contact.json b/app/javascript/dashboard/i18n/locale/ml/contact.json index b5a91ff68..af1c1ea56 100644 --- a/app/javascript/dashboard/i18n/locale/ml/contact.json +++ b/app/javascript/dashboard/i18n/locale/ml/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "കോൺ‌ടാക്റ്റുകൾ", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "തിരയുക", "SEARCH_INPUT_PLACEHOLDER": "കോൺ‌ടാക്റ്റുകൾക്കായി തിരയുക", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "റദ്ദാക്കുക", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ml/conversation.json b/app/javascript/dashboard/i18n/locale/ml/conversation.json index 41f4e98ed..fa65ff98d 100644 --- a/app/javascript/dashboard/i18n/locale/ml/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ml/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "തിരഞ്ഞെടുക്കൽ നീക്കംചെയ്യുക", "DOWNLOAD": "ഡൗൺലോഡ്", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "സ്വകാര്യ കുറിപ്പ്: നിങ്ങൾക്കും നിങ്ങളുടെ ടീമിനും മാത്രം ദൃശ്യമാണ്", "CHANGE_STATUS": "സംഭാഷണ നില മാറ്റി", @@ -66,6 +69,10 @@ "SELECT_AGENT": "ഏജന്റ് തിരഞ്ഞെടുക്കുക", "REMOVE": "നീക്കം ചെയ്യുക", "ASSIGN": "നിയോഗിക്കുക" + }, + "CONTEXT_MENU": { + "COPY": "പകർത്തുക", + "DELETE": "ഇല്ലാതാക്കുക" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json index 34f310ae4..9f123e830 100644 --- a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "പ്രവർത്തനക്ഷമമാക്കി", "DISABLED": "പ്രവർത്തനരഹിതമാക്കി" + }, + "ENABLE_CSAT": { + "ENABLED": "പ്രവർത്തനക്ഷമമാക്കി", + "DISABLED": "പ്രവർത്തനരഹിതമാക്കി" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "ഓട്ടോ അസൈൻമെന്റ് പ്രവർത്തനക്ഷമമാക്കുക", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "പുതിയ സംഭാഷണങ്ങളിൽ ലഭ്യമായ ഏജന്റുമാരുടെ ഓട്ടോമാറ്റിക് അസൈൻമെന്റ് പ്രാപ്തമാക്കുകയോ അപ്രാപ്തമാക്കുകയോ ചെയ്യുക", diff --git a/app/javascript/dashboard/i18n/locale/ml/settings.json b/app/javascript/dashboard/i18n/locale/ml/settings.json index 587929146..6c8a5c21a 100644 --- a/app/javascript/dashboard/i18n/locale/ml/settings.json +++ b/app/javascript/dashboard/i18n/locale/ml/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "ഇമെയിൽ അറിയിപ്പുകൾ", diff --git a/app/javascript/dashboard/i18n/locale/ne/contact.json b/app/javascript/dashboard/i18n/locale/ne/contact.json index 2ff3c17f1..cf9824b90 100644 --- a/app/javascript/dashboard/i18n/locale/ne/contact.json +++ b/app/javascript/dashboard/i18n/locale/ne/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancel", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ne/conversation.json b/app/javascript/dashboard/i18n/locale/ne/conversation.json index 587530e74..81c023aa5 100644 --- a/app/javascript/dashboard/i18n/locale/ne/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ne/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team", "CHANGE_STATUS": "Conversation status changed", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "Delete" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json index 8948adfc4..24463aac8 100644 --- a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", "DISABLED": "Disabled" + }, + "ENABLE_CSAT": { + "ENABLED": "Enabled", + "DISABLED": "Disabled" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Enable auto assignment", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/ne/settings.json b/app/javascript/dashboard/i18n/locale/ne/settings.json index d7e387e54..46941f8ae 100644 --- a/app/javascript/dashboard/i18n/locale/ne/settings.json +++ b/app/javascript/dashboard/i18n/locale/ne/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", diff --git a/app/javascript/dashboard/i18n/locale/nl/contact.json b/app/javascript/dashboard/i18n/locale/nl/contact.json index 23cae44db..5de7c2338 100644 --- a/app/javascript/dashboard/i18n/locale/nl/contact.json +++ b/app/javascript/dashboard/i18n/locale/nl/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Annuleren", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/nl/conversation.json b/app/javascript/dashboard/i18n/locale/nl/conversation.json index cc8fd83c5..6336f74e7 100644 --- a/app/javascript/dashboard/i18n/locale/nl/conversation.json +++ b/app/javascript/dashboard/i18n/locale/nl/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Privéopmerking: alleen zichtbaar voor jou en je team", "CHANGE_STATUS": "Gespreksstatus veranderd", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Verwijderen", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Kopiëren", + "DELETE": "Verwijderen" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json index 1f0ddeab5..454047321 100644 --- a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Ingeschakeld", "DISABLED": "Uitgeschakeld" + }, + "ENABLE_CSAT": { + "ENABLED": "Ingeschakeld", + "DISABLED": "Uitgeschakeld" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Automatische toewijzing inschakelen", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Instellingen Postvak In", "INBOX_UPDATE_SUB_TEXT": "Update uw inbox instellingen", "AUTO_ASSIGNMENT_SUB_TEXT": "In- of uitschakelen van de automatische toewijzing van nieuwe gesprekken aan de agenten die aan deze inbox zijn toegevoegd.", diff --git a/app/javascript/dashboard/i18n/locale/nl/settings.json b/app/javascript/dashboard/i18n/locale/nl/settings.json index 42e2d5e1a..979ee3415 100644 --- a/app/javascript/dashboard/i18n/locale/nl/settings.json +++ b/app/javascript/dashboard/i18n/locale/nl/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-mail notificaties", diff --git a/app/javascript/dashboard/i18n/locale/no/contact.json b/app/javascript/dashboard/i18n/locale/no/contact.json index dd907ecc9..6c2d11a0e 100644 --- a/app/javascript/dashboard/i18n/locale/no/contact.json +++ b/app/javascript/dashboard/i18n/locale/no/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakter", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Søk", "SEARCH_INPUT_PLACEHOLDER": "Søk etter kontakter", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Avbryt", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/no/conversation.json b/app/javascript/dashboard/i18n/locale/no/conversation.json index aa6c9b41d..8dd3c2ae6 100644 --- a/app/javascript/dashboard/i18n/locale/no/conversation.json +++ b/app/javascript/dashboard/i18n/locale/no/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Fjern utvalget", "DOWNLOAD": "Last ned", "UPLOADING_ATTACHMENTS": "Laster opp vedlegg...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Vis rik tekstredigering", "TIP_EMOJI_ICON": "Vis emoji-velger", "TIP_ATTACH_ICON": "Legg ved filer", - "ENTER_TO_SEND": "Trykk enter for å sende" + "ENTER_TO_SEND": "Trykk enter for å sende", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Privat notat: bare synlig for deg og ditt team", "CHANGE_STATUS": "Samtalestatus er endret", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Velg agent", "REMOVE": "Fjern", "ASSIGN": "Tildel" + }, + "CONTEXT_MENU": { + "COPY": "Kopier", + "DELETE": "Slett" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json index 10e71176b..1d889a6b4 100644 --- a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Aktivert", "DISABLED": "Deaktivert" + }, + "ENABLE_CSAT": { + "ENABLED": "Aktivert", + "DISABLED": "Deaktivert" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Aktiver autotilordning", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Innboksinnstillinger", "INBOX_UPDATE_SUB_TEXT": "Oppdater innboksinnstillinger", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktiver eller deaktiver automatisk tildeling av nye samtaler til agenter som er lagt til i denne innboksen.", diff --git a/app/javascript/dashboard/i18n/locale/no/settings.json b/app/javascript/dashboard/i18n/locale/no/settings.json index 316c19053..fc6df1ea0 100644 --- a/app/javascript/dashboard/i18n/locale/no/settings.json +++ b/app/javascript/dashboard/i18n/locale/no/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-postvarsler", diff --git a/app/javascript/dashboard/i18n/locale/pl/contact.json b/app/javascript/dashboard/i18n/locale/pl/contact.json index 965f61068..000f78dd0 100644 --- a/app/javascript/dashboard/i18n/locale/pl/contact.json +++ b/app/javascript/dashboard/i18n/locale/pl/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakty", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Szukaj", "SEARCH_INPUT_PLACEHOLDER": "Szukaj kontaktów", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Anuluj", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/pl/conversation.json b/app/javascript/dashboard/i18n/locale/pl/conversation.json index 42f185fec..9f6190e47 100644 --- a/app/javascript/dashboard/i18n/locale/pl/conversation.json +++ b/app/javascript/dashboard/i18n/locale/pl/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Usuń zaznaczenie", "DOWNLOAD": "Pobierz", "UPLOADING_ATTACHMENTS": "Przesyłanie załączników...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Brak odpowiedzi", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Pokaż zaawansowany edytor", "TIP_EMOJI_ICON": "Pokaż selektor emotikonek", "TIP_ATTACH_ICON": "Dołącz pliki", - "ENTER_TO_SEND": "Naciśnij \"enter\" aby wysłać" + "ENTER_TO_SEND": "Naciśnij \"enter\" aby wysłać", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Prywatna uwaga: widoczne tylko dla Ciebie i twojego zespołu", "CHANGE_STATUS": "Status konwersacji zmieniony", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Wybierz Agenta", "REMOVE": "Usuń", "ASSIGN": "Przypisz" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "Usuń" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json index 46fb7cc92..876b28948 100644 --- a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Włączone", "DISABLED": "Wyłączone" + }, + "ENABLE_CSAT": { + "ENABLED": "Włączone", + "DISABLED": "Wyłączone" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Włącz automatyczne przypisanie", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Ustawienia skrzynki odbiorczej", "INBOX_UPDATE_SUB_TEXT": "Zaktualizuj ustawienia skrzynki odbiorczej", "AUTO_ASSIGNMENT_SUB_TEXT": "Włącz lub wyłącz automatyczne przypisywanie nowych rozmów do agentów dodanych do tej skrzynki odbiorczej.", diff --git a/app/javascript/dashboard/i18n/locale/pl/settings.json b/app/javascript/dashboard/i18n/locale/pl/settings.json index 1d8798b35..1f000abac 100644 --- a/app/javascript/dashboard/i18n/locale/pl/settings.json +++ b/app/javascript/dashboard/i18n/locale/pl/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Powiadomienia dźwiękowe", "NOTE": "Włącz powiadomienia audio na pulpicie dla nowych wiadomości i konwersacji.", - "ENABLE_AUDIO": "Odtwarzaj powiadomienie dźwiękowe po utworzeniu nowej rozmowy lub pojawieniu się nowych wiadomości" + "NONE": "Brak", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Powiadomienia e-mail", diff --git a/app/javascript/dashboard/i18n/locale/pt/contact.json b/app/javascript/dashboard/i18n/locale/pt/contact.json index cdaa48809..fa707f8fc 100644 --- a/app/javascript/dashboard/i18n/locale/pt/contact.json +++ b/app/javascript/dashboard/i18n/locale/pt/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "cancelar", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/pt/conversation.json b/app/javascript/dashboard/i18n/locale/pt/conversation.json index 989840a58..dc42ae608 100644 --- a/app/javascript/dashboard/i18n/locale/pt/conversation.json +++ b/app/javascript/dashboard/i18n/locale/pt/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "BAIXAR", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Nota Privada: Apenas visível para você e sua equipe", "CHANGE_STATUS": "Estado da conversa alterado", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Excluir", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "excluir" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json index 6e6a4aba0..84c841f14 100644 --- a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Ativado", "DISABLED": "Desabilitado" + }, + "ENABLE_CSAT": { + "ENABLED": "Ativado", + "DISABLED": "Desabilitado" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Habilitar atribuição automática", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Configurações da Caixa de Entrada", "INBOX_UPDATE_SUB_TEXT": "Atualize suas configurações da caixa de entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Ativar ou desativar a atribuição automática de novas conversas aos agentes adicionados a essa caixa de entrada.", diff --git a/app/javascript/dashboard/i18n/locale/pt/settings.json b/app/javascript/dashboard/i18n/locale/pt/settings.json index 140fbe36a..fd0ce0466 100644 --- a/app/javascript/dashboard/i18n/locale/pt/settings.json +++ b/app/javascript/dashboard/i18n/locale/pt/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notificações por e-mail", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json index 425402073..bc84c884f 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contato", + "FIELDS": "Campos de contatos", "SEARCH_BUTTON": "Pesquisar", "SEARCH_INPUT_PLACEHOLDER": "Procurar contatos", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Mesclar contatos", + "DESCRIPTION": "Mesclar contatos é útil quando se tem entradas duplicadas de um mesmo contato. Essa ação trata um contato como primário e outro como derivado/secundário/filho. Após mesclar, todos os detalhes do contato primário serão preservados. Se o contato primário não tiver um dos campo listados, será utilizado o valor do campo do contato derivado. Se ocorrem conflitos, os campos do contato primário serão mantidos, e a as diferenças serão copiadas para campos personalizados.", + "PRIMARY": { + "TITLE": "Contato principal" + }, + "CHILD": { + "TITLE": "Contato para mesclar", + "PLACEHOLDER": "Selecione um contato" + }, + "SUMMARY": { + "TITLE": "Sumário", + "DELETE_WARNING": "Contato de %{childContactName}será excluído.", + "ATTRIBUTE_WARNING": "Detalhes de contato de %{childContactName} serão copiados para %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "Mensagem de erro" + }, + "FORM": { + "SUBMIT": " Mesclar contatos", + "CANCEL": "Cancelar", + "CHILD_CONTACT": { + "ERROR": "Selecione um contato filho para mesclar" + }, + "SUCCESS_MESSAGE": "Contato mesclado com sucesso", + "ERROR_MESSAGE": "Não foi possível mesclar contatos, tente novamente!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json index cc5d6ec56..d96468182 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json @@ -27,8 +27,10 @@ "REMOVE_SELECTION": "Remover Seleção", "DOWNLOAD": "Baixar", "UPLOADING_ATTACHMENTS": "Enviando anexos...", + "SUCCESS_DELETE_MESSAGE": "Mensagem excluída com sucesso", + "FAIL_DELETE_MESSSAGE": "Não foi possível excluir a mensagem! Tente novamente", "NO_RESPONSE": "Sem resposta", - "RATING_TITLE": "Rating", + "RATING_TITLE": "Classificação", "FEEDBACK_TITLE": "Feedback", "HEADER": { "RESOLVE_ACTION": "Resolver", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Mostrar editor de texto completo", "TIP_EMOJI_ICON": "Mostrar seletor de emoji", "TIP_ATTACH_ICON": "Anexar arquivos", - "ENTER_TO_SEND": "Enter para enviar" + "ENTER_TO_SEND": "Enter para enviar", + "DRAG_DROP": "Arraste e solte aqui para anexar" }, "VISIBLE_TO_AGENTS": "Mensagem Privada: Apenas visível para você e sua equipe", "CHANGE_STATUS": "Estado da conversa mudou", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Selecione Agente", "REMOVE": "Excluir", "ASSIGN": "Atribua" + }, + "CONTEXT_MENU": { + "COPY": "Copiar", + "DELETE": "Excluir" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json index 45c4cfeb4..22d8e2254 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Ativado", "DISABLED": "Desativado" + }, + "ENABLE_CSAT": { + "ENABLED": "Ativado", + "DISABLED": "Desativado" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Ativar caixa de coleta de e-mail", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Ativar ou desativar caixa de coleta de e-mails em novas conversas", "AUTO_ASSIGNMENT": "Habilitar atribuição automática", + "ENABLE_CSAT": "Habilitar CSAT", + "ENABLE_CSAT_SUB_TEXT": "Ativar/Desativar pesquisa CSAT(satisfação do cliente) após resolver uma conversa", "INBOX_UPDATE_TITLE": "Configurações da Caixa de entrada", "INBOX_UPDATE_SUB_TEXT": "Atualize suas configurações de caixa de entrada", "AUTO_ASSIGNMENT_SUB_TEXT": "Ativar ou desativar a atribuição automática de novas conversas aos agentes adicionados a essa caixa de entrada.", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json index c0888db73..034ec1e31 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json @@ -68,8 +68,8 @@ }, "SLACK": { "HELP_TEXT": { - "TITLE": "Using Slack Integration", - "BODY": "

Chatwoot will now sync all the incoming conversations into the customer-conversations channel inside your slack workplace.

Replying to a conversation thread in customer-conversations slack channel will create a response back to the customer through chatwoot.

Start the replies with note: to create private notes instead of replies.

If the replier on slack has an agent profile in chatwoot under the same email, the replies will be associated accordingly.

When the replier doesn't have an associated agent profile, the replies will be made from the bot profile.

" + "TITLE": "Usando a integração com Slack", + "BODY": "

Chatwoot irá agora sincronizar todas as conversas recebidas no canal de conversas com clientes dentro de seu local de trabalho de slack.

A resposta para uma conversa em conversas ao cliente canal de slack irá criar uma resposta para o cliente através do chatwoot.

Inicie as respostas com nota: para criar notas privadas em vez de respostas.

Se o remetente do slack tiver um perfil de agente no chatwoot sob o mesmo e-mail, as respostas serão associadas de acordo.

Quando o respondente não tiver um perfil de agente associado, as respostas serão dadas a partir do perfil do bot.

" } }, "DELETE": { diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json index 5fd4ce5ea..d160ae0c3 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Notificações de Áudio", "NOTE": "Habilitar notificações de áudio no painel para novas mensagens e conversas.", - "ENABLE_AUDIO": "Reproduzir notificação de áudio quando uma nova conversa é criada ou novas mensagens chegam" + "NONE": "Nenhuma", + "ASSIGNED": "Conversas atribuídas", + "ALL_CONVERSATIONS": "Todas as conversas" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notificações por e-mail", diff --git a/app/javascript/dashboard/i18n/locale/ro/contact.json b/app/javascript/dashboard/i18n/locale/ro/contact.json index 1dae9b3c1..dc5859b8f 100644 --- a/app/javascript/dashboard/i18n/locale/ro/contact.json +++ b/app/javascript/dashboard/i18n/locale/ro/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Renunță", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ro/conversation.json b/app/javascript/dashboard/i18n/locale/ro/conversation.json index 5f272965f..225beda2e 100644 --- a/app/javascript/dashboard/i18n/locale/ro/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ro/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Descărcare", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Notă privată: vizibilă doar pentru tine și echipa ta", "CHANGE_STATUS": "Stare conversație schimbată", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Elimină", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copiază", + "DELETE": "Şterge" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json index 3176536d0..13651e8ce 100644 --- a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Activat", "DISABLED": "Dezactivat" + }, + "ENABLE_CSAT": { + "ENABLED": "Activat", + "DISABLED": "Dezactivat" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Activare atribuire automată", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Setări Inbox", "INBOX_UPDATE_SUB_TEXT": "Actualizează setările de inbox", "AUTO_ASSIGNMENT_SUB_TEXT": "Activează sau dezactivează atribuirea automată a conversațiilor noi la agenții adăugați la această căsuță poștală.", diff --git a/app/javascript/dashboard/i18n/locale/ro/settings.json b/app/javascript/dashboard/i18n/locale/ro/settings.json index bff4aebfc..34700c429 100644 --- a/app/javascript/dashboard/i18n/locale/ro/settings.json +++ b/app/javascript/dashboard/i18n/locale/ro/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Notificări prin e-mail", diff --git a/app/javascript/dashboard/i18n/locale/ru/contact.json b/app/javascript/dashboard/i18n/locale/ru/contact.json index 50833704b..e1ca4c4c8 100644 --- a/app/javascript/dashboard/i18n/locale/ru/contact.json +++ b/app/javascript/dashboard/i18n/locale/ru/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Контакты", + "FIELDS": "Поля контакта", "SEARCH_BUTTON": "Поиск", "SEARCH_INPUT_PLACEHOLDER": "Поиск по контактам", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Объединить контакты", + "DESCRIPTION": "Объединение контактов полезно, когда у вас есть несколько похожих записей контактов. Объединение связывает первичный контакт и похожие контакты. После слияния все детали основного контакта останутся прежними. Если первичный контакт не имеет поля, то значение из похожих контактов будут использованы после слияния. Если произойдет конфликт, поля в первичном контакте не будут затронуты, но поля похожего контакта будут скопированы в дополнительные поля основного.", + "PRIMARY": { + "TITLE": "Основной контакт" + }, + "CHILD": { + "TITLE": "Контакт для слияния", + "PLACEHOLDER": "Выберите контакт" + }, + "SUMMARY": { + "TITLE": "Краткая информация", + "DELETE_WARNING": "Контакт %{childContactName} будет удален.", + "ATTRIBUTE_WARNING": "Контактная информация %{childContactName} будет скопирована в %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Объединить контакты", + "CANCEL": "Отменить", + "CHILD_CONTACT": { + "ERROR": "Выберите контакт, для объединения" + }, + "SUCCESS_MESSAGE": "Контакт успешно объединён", + "ERROR_MESSAGE": "Невозможно объединить контакты, попробуйте еще раз!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ru/conversation.json b/app/javascript/dashboard/i18n/locale/ru/conversation.json index 13fc0f2d5..34e3531e5 100644 --- a/app/javascript/dashboard/i18n/locale/ru/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ru/conversation.json @@ -27,9 +27,11 @@ "REMOVE_SELECTION": "Удалить выделенное", "DOWNLOAD": "Скачать", "UPLOADING_ATTACHMENTS": "Загрузка вложений...", + "SUCCESS_DELETE_MESSAGE": "Сообщение успешно удалено", + "FAIL_DELETE_MESSSAGE": "Не удалось удалить сообщение! Попробуйте еще раз", "NO_RESPONSE": "Нет ответа", - "RATING_TITLE": "Rating", - "FEEDBACK_TITLE": "Feedback", + "RATING_TITLE": "Оценка", + "FEEDBACK_TITLE": "Обратная связь", "HEADER": { "RESOLVE_ACTION": "Завершить", "REOPEN_ACTION": "Открыть заново", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Показать редактор текста", "TIP_EMOJI_ICON": "Показать emoji панель", "TIP_ATTACH_ICON": "Прикрепить файлы", - "ENTER_TO_SEND": "Введите чтобы отправить" + "ENTER_TO_SEND": "Введите чтобы отправить", + "DRAG_DROP": "Перетащите сюда, чтобы прикрепить" }, "VISIBLE_TO_AGENTS": "Приватная заметка: видна только вам и вашей команде", "CHANGE_STATUS": "Статус разговора изменен", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Выбрать Агента", "REMOVE": "Удалить", "ASSIGN": "Назначить" + }, + "CONTEXT_MENU": { + "COPY": "Копировать", + "DELETE": "Удалить" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json index 3d8902b8b..933b16e48 100644 --- a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Включено", "DISABLED": "Выключено" + }, + "ENABLE_CSAT": { + "ENABLED": "Включено", + "DISABLED": "Выключено" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Включить ящик сбора почты", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Включение или отключение ящик для сбора почты в новой беседе", "AUTO_ASSIGNMENT": "Включить автоназначение", + "ENABLE_CSAT": "Включить CSAT", + "ENABLE_CSAT_SUB_TEXT": "Включить/выключить опрос CSAT(степень удовлетворенности пользователя) после завершения беседы", "INBOX_UPDATE_TITLE": "Настройки источника", "INBOX_UPDATE_SUB_TEXT": "Изменить настройки источника", "AUTO_ASSIGNMENT_SUB_TEXT": "Включить или отключить автоматическое назначение новых разговоров к агентам, добавленным к этому источнику.", diff --git a/app/javascript/dashboard/i18n/locale/ru/settings.json b/app/javascript/dashboard/i18n/locale/ru/settings.json index 410d01813..5436619fa 100644 --- a/app/javascript/dashboard/i18n/locale/ru/settings.json +++ b/app/javascript/dashboard/i18n/locale/ru/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Звуковые уведомления", "NOTE": "Включить звуковые уведомления в панели управления для новых сообщений и разговоров.", - "ENABLE_AUDIO": "Воспроизводить звуковое уведомление при создании новой беседы или получении новых сообщений" + "NONE": "Ничего", + "ASSIGNED": "Назначенные беседы", + "ALL_CONVERSATIONS": "Диалоги" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Уведомления", diff --git a/app/javascript/dashboard/i18n/locale/sk/contact.json b/app/javascript/dashboard/i18n/locale/sk/contact.json index 24bcbc27e..051aad27e 100644 --- a/app/javascript/dashboard/i18n/locale/sk/contact.json +++ b/app/javascript/dashboard/i18n/locale/sk/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Cancel", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/sk/conversation.json b/app/javascript/dashboard/i18n/locale/sk/conversation.json index 587530e74..81c023aa5 100644 --- a/app/javascript/dashboard/i18n/locale/sk/conversation.json +++ b/app/javascript/dashboard/i18n/locale/sk/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Download", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Private Note: Only visible to you and your team", "CHANGE_STATUS": "Conversation status changed", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "Delete" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json index 06eeb3d5d..1dc1d366d 100644 --- a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Enabled", "DISABLED": "Disabled" + }, + "ENABLE_CSAT": { + "ENABLED": "Enabled", + "DISABLED": "Disabled" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Enable auto assignment", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/sk/settings.json b/app/javascript/dashboard/i18n/locale/sk/settings.json index b3ed7b95f..dcdb58fac 100644 --- a/app/javascript/dashboard/i18n/locale/sk/settings.json +++ b/app/javascript/dashboard/i18n/locale/sk/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", diff --git a/app/javascript/dashboard/i18n/locale/sv/contact.json b/app/javascript/dashboard/i18n/locale/sv/contact.json index 53c27dd5e..8ae78f0a0 100644 --- a/app/javascript/dashboard/i18n/locale/sv/contact.json +++ b/app/javascript/dashboard/i18n/locale/sv/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Kontakter", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Sök", "SEARCH_INPUT_PLACEHOLDER": "Sök kontakter", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Avbryt", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/sv/conversation.json b/app/javascript/dashboard/i18n/locale/sv/conversation.json index 7d26a7df0..10ad11cd6 100644 --- a/app/javascript/dashboard/i18n/locale/sv/conversation.json +++ b/app/javascript/dashboard/i18n/locale/sv/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Ta bort urval", "DOWNLOAD": "Hämta", "UPLOADING_ATTACHMENTS": "Laddar upp bilagor...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Inget svar", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Visa textformaterare", "TIP_EMOJI_ICON": "Visa emoji-väljare", "TIP_ATTACH_ICON": "Bifoga filer", - "ENTER_TO_SEND": "Enter för att skicka" + "ENTER_TO_SEND": "Enter för att skicka", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Privat anteckning: Endast synlig för dig och ditt team", "CHANGE_STATUS": "Konversationsstatus ändrad", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Välj agent", "REMOVE": "Radera", "ASSIGN": "Tilldela" + }, + "CONTEXT_MENU": { + "COPY": "Kopiera", + "DELETE": "Radera" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json index d185d0bc3..a3a2fc6a9 100644 --- a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Aktiverad", "DISABLED": "Inaktiverad" + }, + "ENABLE_CSAT": { + "ENABLED": "Aktiverad", + "DISABLED": "Inaktiverad" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Aktivera automatisk tilldelning", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inkorgsinställningar", "INBOX_UPDATE_SUB_TEXT": "Uppdatera inställningarna för din inkorg", "AUTO_ASSIGNMENT_SUB_TEXT": "Aktivera eller inaktivera automatisk tilldelning av nya konversationer till de agenter som lagts till den här inkorgen.", diff --git a/app/javascript/dashboard/i18n/locale/sv/settings.json b/app/javascript/dashboard/i18n/locale/sv/settings.json index d68adf684..8ff90d3b6 100644 --- a/app/javascript/dashboard/i18n/locale/sv/settings.json +++ b/app/javascript/dashboard/i18n/locale/sv/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-postaviseringar", diff --git a/app/javascript/dashboard/i18n/locale/ta/contact.json b/app/javascript/dashboard/i18n/locale/ta/contact.json index cafd3abac..f4c9b2e9a 100644 --- a/app/javascript/dashboard/i18n/locale/ta/contact.json +++ b/app/javascript/dashboard/i18n/locale/ta/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "ரத்துசெய்", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/ta/conversation.json b/app/javascript/dashboard/i18n/locale/ta/conversation.json index 53fec603d..e8a7d5e49 100644 --- a/app/javascript/dashboard/i18n/locale/ta/conversation.json +++ b/app/javascript/dashboard/i18n/locale/ta/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "பதிவிறக்கம்", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "தனிப்பட்ட குறிப்பு: உங்களுக்கும் உங்கள் குழுவினருக்கும் மட்டுமே தெரியும்", "CHANGE_STATUS": "உரையாடலின் நிலை மாற்றப்பட்டது", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "நீக்கு", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "நகல்", + "DELETE": "Delete" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json index 93e04b314..7266e26df 100644 --- a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "இயக்கப்பட்டது", "DISABLED": "முடக்கப்பட்டது" + }, + "ENABLE_CSAT": { + "ENABLED": "இயக்கப்பட்டது", + "DISABLED": "முடக்கப்பட்டது" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "தானாக ஒதுக்கீட்டை இயக்கு", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "இன்பாக்ஸ் அமைப்புகள்", "INBOX_UPDATE_SUB_TEXT": "உங்கள் இன்பாக்ஸ் அமைப்புகளைப் புதுப்பிக்கவும்", "AUTO_ASSIGNMENT_SUB_TEXT": "இந்த இன்பாக்ஸில் சேர்க்கப்பட்ட ஏஜென்ட்களுக்கு புதிய உரையாடல்களின் தானியங்கி ஒதுக்கீட்டை இயக்கவும் அல்லது முடக்கவும்.", diff --git a/app/javascript/dashboard/i18n/locale/ta/settings.json b/app/javascript/dashboard/i18n/locale/ta/settings.json index 081f78e00..a9daa9442 100644 --- a/app/javascript/dashboard/i18n/locale/ta/settings.json +++ b/app/javascript/dashboard/i18n/locale/ta/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "ஈமெயில் வழியான அறிவிப்புகள்", diff --git a/app/javascript/dashboard/i18n/locale/th/contact.json b/app/javascript/dashboard/i18n/locale/th/contact.json index 29246d21d..9cbfb6cfe 100644 --- a/app/javascript/dashboard/i18n/locale/th/contact.json +++ b/app/javascript/dashboard/i18n/locale/th/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "ผู้ติดต่อ", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "ค้นหา", "SEARCH_INPUT_PLACEHOLDER": "ค้อนหาผู้ติดต่อ", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "ยกเลิก", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/th/conversation.json b/app/javascript/dashboard/i18n/locale/th/conversation.json index cc41efa7f..54d7a26d1 100644 --- a/app/javascript/dashboard/i18n/locale/th/conversation.json +++ b/app/javascript/dashboard/i18n/locale/th/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "ลบตัวเลือก", "DOWNLOAD": "ดาวโหลด", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "โน้ตส่วนตัว: มีเพียงคุณและทีมเท่านั้นที่มองเห็นได้", "CHANGE_STATUS": "สถานะการสนทนามีการเปลี่ยนเเปลง", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Remove", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Copy", + "DELETE": "ลบ" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json index f5e65fca8..c9b871c49 100644 --- a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "เปิด", "DISABLED": "ปิด" + }, + "ENABLE_CSAT": { + "ENABLED": "เปิด", + "DISABLED": "ปิด" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Enable auto assignment", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/th/settings.json b/app/javascript/dashboard/i18n/locale/th/settings.json index 63c79d0f0..80f976669 100644 --- a/app/javascript/dashboard/i18n/locale/th/settings.json +++ b/app/javascript/dashboard/i18n/locale/th/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", diff --git a/app/javascript/dashboard/i18n/locale/tr/contact.json b/app/javascript/dashboard/i18n/locale/tr/contact.json index 47fc64c72..b8912a9a2 100644 --- a/app/javascript/dashboard/i18n/locale/tr/contact.json +++ b/app/javascript/dashboard/i18n/locale/tr/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Kişiler", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Arama", "SEARCH_INPUT_PLACEHOLDER": "Kişileri arayın", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "İptal Et", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/tr/conversation.json b/app/javascript/dashboard/i18n/locale/tr/conversation.json index 14536ea7b..2422f79a2 100644 --- a/app/javascript/dashboard/i18n/locale/tr/conversation.json +++ b/app/javascript/dashboard/i18n/locale/tr/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Seçimi Kaldır", "DOWNLOAD": "İndir", "UPLOADING_ATTACHMENTS": "Dosyalar gönderiliyor...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "Cevap Yok", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Metin Düzenlemeyi Göster", "TIP_EMOJI_ICON": "Emojileri göster", "TIP_ATTACH_ICON": "Dosya ekle", - "ENTER_TO_SEND": "Göndermek için Enter tuşuna basın" + "ENTER_TO_SEND": "Göndermek için Enter tuşuna basın", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Özel Not: Yalnızca siz ve ekibiniz tarafından görülebilir", "CHANGE_STATUS": "Görüşme durumu değişti", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Temsilci Seçin", "REMOVE": "Kaldır", "ASSIGN": "Atama yap" + }, + "CONTEXT_MENU": { + "COPY": "Kopyala", + "DELETE": "Sil" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json index 0d2144d6e..fbb746f3c 100644 --- a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Etkin", "DISABLED": "Devre dışı" + }, + "ENABLE_CSAT": { + "ENABLED": "Etkin", + "DISABLED": "Devre dışı" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Otomatik atamayı etkinleştir", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Gelen Kutusu Ayarları", "INBOX_UPDATE_SUB_TEXT": "Gelen kutusu ayarlarınızı güncelleyin", "AUTO_ASSIGNMENT_SUB_TEXT": "Bu gelen kutusuna eklenen aracılara yeni görüşmelerin otomatik olarak atanmasını etkinleştirin veya devre dışı bırakın.", diff --git a/app/javascript/dashboard/i18n/locale/tr/settings.json b/app/javascript/dashboard/i18n/locale/tr/settings.json index ec799c1fa..edb60287b 100644 --- a/app/javascript/dashboard/i18n/locale/tr/settings.json +++ b/app/javascript/dashboard/i18n/locale/tr/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Sesli Bildirimler", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "E-posta Bildirimleri", diff --git a/app/javascript/dashboard/i18n/locale/uk/contact.json b/app/javascript/dashboard/i18n/locale/uk/contact.json index 59f70ce7c..712167c67 100644 --- a/app/javascript/dashboard/i18n/locale/uk/contact.json +++ b/app/javascript/dashboard/i18n/locale/uk/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Скасувати", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/uk/conversation.json b/app/javascript/dashboard/i18n/locale/uk/conversation.json index 21c9795bc..760027e65 100644 --- a/app/javascript/dashboard/i18n/locale/uk/conversation.json +++ b/app/javascript/dashboard/i18n/locale/uk/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "Звантажити", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Приватна нотатка: видима тільки вам та вашій команді", "CHANGE_STATUS": "Статус бесіди змінено", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Видалити", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Копіювати", + "DELETE": "Видалити" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json index a87184bbb..991992a67 100644 --- a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Увімкнено", "DISABLED": "Вимкнено" + }, + "ENABLE_CSAT": { + "ENABLED": "Увімкнено", + "DISABLED": "Вимкнено" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Увімкнути автопризначення", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Inbox Settings", "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", "AUTO_ASSIGNMENT_SUB_TEXT": "Enable or disable the automatic assignment of new conversations to the agents added to this inbox.", diff --git a/app/javascript/dashboard/i18n/locale/uk/settings.json b/app/javascript/dashboard/i18n/locale/uk/settings.json index f57df4362..ec54829e3 100644 --- a/app/javascript/dashboard/i18n/locale/uk/settings.json +++ b/app/javascript/dashboard/i18n/locale/uk/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Сповіщення електронною поштою", diff --git a/app/javascript/dashboard/i18n/locale/vi/contact.json b/app/javascript/dashboard/i18n/locale/vi/contact.json index 64414c0ed..67f353cb9 100644 --- a/app/javascript/dashboard/i18n/locale/vi/contact.json +++ b/app/javascript/dashboard/i18n/locale/vi/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "Search", "SEARCH_INPUT_PLACEHOLDER": "Search for contacts", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "Huỷ", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/vi/conversation.json b/app/javascript/dashboard/i18n/locale/vi/conversation.json index 2768544da..303b07e27 100644 --- a/app/javascript/dashboard/i18n/locale/vi/conversation.json +++ b/app/javascript/dashboard/i18n/locale/vi/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Xóa lựa chọn", "DOWNLOAD": "Tải xuống", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "Lưu ý riêng: Chỉ hiển thị với bạn và nhóm của bạn", "CHANGE_STATUS": "Trạng thái cuộc trò chuyện đã thay đổi", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "Xoá", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "Sao Chép", + "DELETE": "Xoá" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json index 8f9c081be..a4b09883c 100644 --- a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "Bật", "DISABLED": "Không bật" + }, + "ENABLE_CSAT": { + "ENABLED": "Bật", + "DISABLED": "Không bật" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "Bật tự động chuyển nhượng", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "Cài đặt Hộp thư đến", "INBOX_UPDATE_SUB_TEXT": "Cập nhật cài đặt hộp thư đến của bạn", "AUTO_ASSIGNMENT_SUB_TEXT": "Bật hoặc tắt tính năng tự động gán các cuộc hội thoại mới cho các tác nhân được thêm vào hộp thư đến này.", diff --git a/app/javascript/dashboard/i18n/locale/vi/settings.json b/app/javascript/dashboard/i18n/locale/vi/settings.json index 238c59e62..550410218 100644 --- a/app/javascript/dashboard/i18n/locale/vi/settings.json +++ b/app/javascript/dashboard/i18n/locale/vi/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Thông Báo Email", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json index 8b2902bfb..367f5b1c6 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "Contacts", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "搜索", "SEARCH_INPUT_PLACEHOLDER": "搜索联系人", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "Eg: 11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "取消", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json index 11acc7e76..e9d337815 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "Remove Selection", "DOWNLOAD": "下载", "UPLOADING_ATTACHMENTS": "Uploading attachments...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "No response", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "Show rich text editor", "TIP_EMOJI_ICON": "Show emoji selector", "TIP_ATTACH_ICON": "Attach files", - "ENTER_TO_SEND": "Enter to send" + "ENTER_TO_SEND": "Enter to send", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "私人便签:仅对您和您的团队可见", "CHANGE_STATUS": "对话状态已更改", @@ -66,6 +69,10 @@ "SELECT_AGENT": "Select Agent", "REMOVE": "删除", "ASSIGN": "Assign" + }, + "CONTEXT_MENU": { + "COPY": "复制", + "DELETE": "删除" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json index e88155d80..0e7220879 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "已启用", "DISABLED": "已禁用" + }, + "ENABLE_CSAT": { + "ENABLED": "已启用", + "DISABLED": "已禁用" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "启用自动分配", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "收件箱设置", "INBOX_UPDATE_SUB_TEXT": "更新收件箱设置", "AUTO_ASSIGNMENT_SUB_TEXT": "启用或禁用添加到此收件箱的代理人自动分配新的会话。", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json index 835c350a0..5d61caa39 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "电子邮件通知", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json index be3bba6b9..2fe4a3782 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json @@ -131,6 +131,7 @@ }, "CONTACTS_PAGE": { "HEADER": "聯絡人", + "FIELDS": "Contact fields", "SEARCH_BUTTON": "搜尋", "SEARCH_INPUT_PLACEHOLDER": "搜尋聯絡人", "LIST": { @@ -204,5 +205,33 @@ "PLACEHOLDER": "例如:11901 " } } + }, + "MERGE_CONTACTS": { + "TITLE": "Merge contacts", + "DESCRIPTION": "Merge contact is helpful when you have duplicated entries of the same contact. Merging action takes a primary contact and a child contact. After merging, all details in the primary contact will remain the same. If the primary contact doesn't have a field, then the value from the child contact will be used after merging. If a conflict happens, fields in primary contact will remain unaffected, but fields from secondary will be copied to the custom attributes in the primary contact.", + "PRIMARY": { + "TITLE": "Primary contact" + }, + "CHILD": { + "TITLE": "Contact to merge", + "PLACEHOLDER": "Choose a contact" + }, + "SUMMARY": { + "TITLE": "Summary", + "DELETE_WARNING": "Contact of %{childContactName}will be deleted.", + "ATTRIBUTE_WARNING": "Contact details of %{childContactName} will be copied to %{primaryContactName}." + }, + "SEARCH": { + "ERROR": "ERROR_MESSAGE" + }, + "FORM": { + "SUBMIT": " Merge contacts", + "CANCEL": "取消", + "CHILD_CONTACT": { + "ERROR": "Select a child contact to merge" + }, + "SUCCESS_MESSAGE": "Contact merged successfully", + "ERROR_MESSAGE": "Could not merge contcts, try again!" + } } } diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json index 6c7f4ebd3..fd705efe0 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json @@ -27,6 +27,8 @@ "REMOVE_SELECTION": "移除選擇項目", "DOWNLOAD": "下載", "UPLOADING_ATTACHMENTS": "正在上傳附件...", + "SUCCESS_DELETE_MESSAGE": "Message deleted successfully", + "FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again", "NO_RESPONSE": "無回應", "RATING_TITLE": "Rating", "FEEDBACK_TITLE": "Feedback", @@ -54,7 +56,8 @@ "TIP_FORMAT_ICON": "顯示文字編輯器", "TIP_EMOJI_ICON": "顯示 emoji 選擇器", "TIP_ATTACH_ICON": "附件", - "ENTER_TO_SEND": "按下 Enter 傳送" + "ENTER_TO_SEND": "按下 Enter 傳送", + "DRAG_DROP": "Drag and drop here to attach" }, "VISIBLE_TO_AGENTS": "私人筆記:僅對您和您的團隊可以看見", "CHANGE_STATUS": "對話狀態已更改", @@ -66,6 +69,10 @@ "SELECT_AGENT": "選擇客服", "REMOVE": "刪除", "ASSIGN": "指派" + }, + "CONTEXT_MENU": { + "COPY": "複製", + "DELETE": "刪除" } }, "EMAIL_TRANSCRIPT": { diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json index c5c22354a..a2b4ca86b 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json @@ -216,6 +216,10 @@ "EMAIL_COLLECT_BOX": { "ENABLED": "已啟用", "DISABLED": "已停用" + }, + "ENABLE_CSAT": { + "ENABLED": "已啟用", + "DISABLED": "已停用" } }, "DELETE": { @@ -255,6 +259,8 @@ "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", "AUTO_ASSIGNMENT": "啟用自動分配", + "ENABLE_CSAT": "Enable CSAT", + "ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation", "INBOX_UPDATE_TITLE": "收件匣設定", "INBOX_UPDATE_SUB_TEXT": "更新收件匣設定", "AUTO_ASSIGNMENT_SUB_TEXT": "啟用或停用此收件匣客服的對話自動分配。", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json index 14bdf0cdf..58f130cee 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "音效通知", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "當新的對話被建立或收到新訊息時播放音效通知" + "NONE": "無", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "電子信箱通知", diff --git a/app/javascript/widget/i18n/locale/ar.json b/app/javascript/widget/i18n/locale/ar.json index b8e459ecb..c8704c7b9 100644 --- a/app/javascript/widget/i18n/locale/ar.json +++ b/app/javascript/widget/i18n/locale/ar.json @@ -18,6 +18,7 @@ "IN_A_DAY": "عادة نقوم بالرد خلال يوم واحد" }, "START_CONVERSATION": "ابدأ المحادثة", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "عرض الرسائل الجديدة", "CLOSE_MESSAGES_BUTTON": "أغلق", diff --git a/app/javascript/widget/i18n/locale/ca.json b/app/javascript/widget/i18n/locale/ca.json index 5a8175179..09ddc3508 100644 --- a/app/javascript/widget/i18n/locale/ca.json +++ b/app/javascript/widget/i18n/locale/ca.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Normalment respon en un dia" }, "START_CONVERSATION": "Inicia la conversa", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Veure missatges nous", "CLOSE_MESSAGES_BUTTON": "Tanca", diff --git a/app/javascript/widget/i18n/locale/cs.json b/app/javascript/widget/i18n/locale/cs.json index f9bf37745..e8ba113d1 100644 --- a/app/javascript/widget/i18n/locale/cs.json +++ b/app/javascript/widget/i18n/locale/cs.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Obvykle odpoví za den" }, "START_CONVERSATION": "Zahájit konverzaci", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Zobrazit nové zprávy", "CLOSE_MESSAGES_BUTTON": "Zavřít", diff --git a/app/javascript/widget/i18n/locale/da.json b/app/javascript/widget/i18n/locale/da.json index 898ca5aac..6050a1d12 100644 --- a/app/javascript/widget/i18n/locale/da.json +++ b/app/javascript/widget/i18n/locale/da.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Svarer typisk på en dag" }, "START_CONVERSATION": "Start Samtale", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Se nye beskeder", "CLOSE_MESSAGES_BUTTON": "Luk", diff --git a/app/javascript/widget/i18n/locale/de.json b/app/javascript/widget/i18n/locale/de.json index ad38f9ac3..ec11ea425 100644 --- a/app/javascript/widget/i18n/locale/de.json +++ b/app/javascript/widget/i18n/locale/de.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Wir antworten üblicherweise innerhalb eines Tages" }, "START_CONVERSATION": "Sende uns eine Nachricht", + "START_NEW_CONVERSATION": "Neue Unterhaltung starten", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Neue Nachrichten anzeigen", "CLOSE_MESSAGES_BUTTON": "Schließen", @@ -58,8 +59,8 @@ } }, "CSAT": { - "TITLE": "Rate your conversation", - "SUBMITTED_TITLE": "Thank you for submitting the rating", - "PLACEHOLDER": "Tell us more..." + "TITLE": "Bewerte deine Unterhaltung", + "SUBMITTED_TITLE": "Danke, dass Sie die Bewertung eingereicht haben", + "PLACEHOLDER": "Erzähl uns mehr..." } } diff --git a/app/javascript/widget/i18n/locale/el.json b/app/javascript/widget/i18n/locale/el.json index 8a690dca4..9ae50dc4e 100644 --- a/app/javascript/widget/i18n/locale/el.json +++ b/app/javascript/widget/i18n/locale/el.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Τυπικά έχετε απάντηση σε μία ημέρα" }, "START_CONVERSATION": "Έναρξη Συνομιλίας", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Δείτε τα νέα μηνύματα", "CLOSE_MESSAGES_BUTTON": "Κλείσιμο", diff --git a/app/javascript/widget/i18n/locale/es.json b/app/javascript/widget/i18n/locale/es.json index 1725d3885..6c2cae01f 100644 --- a/app/javascript/widget/i18n/locale/es.json +++ b/app/javascript/widget/i18n/locale/es.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Normalmente responde en un día" }, "START_CONVERSATION": "Iniciar conversación", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Ver nuevos mensajes", "CLOSE_MESSAGES_BUTTON": "Cerrar", diff --git a/app/javascript/widget/i18n/locale/fa.json b/app/javascript/widget/i18n/locale/fa.json index 25c8671c4..434dcb1e4 100644 --- a/app/javascript/widget/i18n/locale/fa.json +++ b/app/javascript/widget/i18n/locale/fa.json @@ -18,6 +18,7 @@ "IN_A_DAY": "به طور معمول در یک روز پاسخ می دهند" }, "START_CONVERSATION": "شروع گفتگو", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "مشاهده پیام‌های جدید", "CLOSE_MESSAGES_BUTTON": "بستن", diff --git a/app/javascript/widget/i18n/locale/fi.json b/app/javascript/widget/i18n/locale/fi.json index 688a9d20d..3ecd1cad3 100644 --- a/app/javascript/widget/i18n/locale/fi.json +++ b/app/javascript/widget/i18n/locale/fi.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Vastaa tyypillisesti päivässä" }, "START_CONVERSATION": "Aloita keskustelu", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Näytä uudet viestit", "CLOSE_MESSAGES_BUTTON": "Sulje", diff --git a/app/javascript/widget/i18n/locale/fr.json b/app/javascript/widget/i18n/locale/fr.json index 730f074e8..db1b3c61c 100644 --- a/app/javascript/widget/i18n/locale/fr.json +++ b/app/javascript/widget/i18n/locale/fr.json @@ -18,10 +18,11 @@ "IN_A_DAY": "Répond généralement dans la journée" }, "START_CONVERSATION": "Démarrer la conversation", + "START_NEW_CONVERSATION": "Démarrer une nouvelle conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Voir les nouveaux messages", "CLOSE_MESSAGES_BUTTON": "Fermer", - "COMPANY_FROM": "from", + "COMPANY_FROM": "de", "BOT": "Bot" }, "BUBBLE": { @@ -51,15 +52,15 @@ } } }, - "FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_FILE_UPLOAD_SIZE} attachment limit", + "FILE_SIZE_LIMIT": "Le fichier dépasse la limite de {MAXIMUM_FILE_UPLOAD_SIZE} pour les pièces jointes", "CHAT_FORM": { "INVALID": { - "FIELD": "Invalid field" + "FIELD": "Champ non valide" } }, "CSAT": { - "TITLE": "Rate your conversation", - "SUBMITTED_TITLE": "Thank you for submitting the rating", - "PLACEHOLDER": "Tell us more..." + "TITLE": "Évaluer votre conversation", + "SUBMITTED_TITLE": "Merci d'avoir soumis votre évaluation", + "PLACEHOLDER": "Dites-nous en plus..." } } diff --git a/app/javascript/widget/i18n/locale/he.json b/app/javascript/widget/i18n/locale/he.json index 27650aaf2..de4eb2e35 100644 --- a/app/javascript/widget/i18n/locale/he.json +++ b/app/javascript/widget/i18n/locale/he.json @@ -18,6 +18,7 @@ "IN_A_DAY": "מענה ממוצע לאחר יום" }, "START_CONVERSATION": "התחל שיחה", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "ראה הודעות חדשות", "CLOSE_MESSAGES_BUTTON": "סגור", diff --git a/app/javascript/widget/i18n/locale/hi.json b/app/javascript/widget/i18n/locale/hi.json index dd114afff..bbb43acfa 100644 --- a/app/javascript/widget/i18n/locale/hi.json +++ b/app/javascript/widget/i18n/locale/hi.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Typically replies in a day" }, "START_CONVERSATION": "Start Conversation", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "See new messages", "CLOSE_MESSAGES_BUTTON": "Close", diff --git a/app/javascript/widget/i18n/locale/hu.json b/app/javascript/widget/i18n/locale/hu.json index dd66ef812..01723c6fd 100644 --- a/app/javascript/widget/i18n/locale/hu.json +++ b/app/javascript/widget/i18n/locale/hu.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Általánban egy napon belül válaszol" }, "START_CONVERSATION": "Beszélgetés megkezdése", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Új üzenetek", "CLOSE_MESSAGES_BUTTON": "Bezárás", diff --git a/app/javascript/widget/i18n/locale/id.json b/app/javascript/widget/i18n/locale/id.json index 2722e4e1c..594b740ee 100644 --- a/app/javascript/widget/i18n/locale/id.json +++ b/app/javascript/widget/i18n/locale/id.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Biasanya membalas dalam sehari" }, "START_CONVERSATION": "Mulai Percakapan", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Lihat pesan baru", "CLOSE_MESSAGES_BUTTON": "Tutup", diff --git a/app/javascript/widget/i18n/locale/it.json b/app/javascript/widget/i18n/locale/it.json index 7f5281799..5c9141b04 100644 --- a/app/javascript/widget/i18n/locale/it.json +++ b/app/javascript/widget/i18n/locale/it.json @@ -18,6 +18,7 @@ "IN_A_DAY": "In genere le risposte in un giorno" }, "START_CONVERSATION": "Avvia Conversazione", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Vedi nuovi messaggi", "CLOSE_MESSAGES_BUTTON": "Chiudi", diff --git a/app/javascript/widget/i18n/locale/ja.json b/app/javascript/widget/i18n/locale/ja.json index 0dadae116..5f8788ecb 100644 --- a/app/javascript/widget/i18n/locale/ja.json +++ b/app/javascript/widget/i18n/locale/ja.json @@ -18,6 +18,7 @@ "IN_A_DAY": "通常数日以内にご返信します。" }, "START_CONVERSATION": "チャットを開始する", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "新しいメッセージを見る", "CLOSE_MESSAGES_BUTTON": "閉じる", diff --git a/app/javascript/widget/i18n/locale/ko.json b/app/javascript/widget/i18n/locale/ko.json index c36916d09..5f6e303f7 100644 --- a/app/javascript/widget/i18n/locale/ko.json +++ b/app/javascript/widget/i18n/locale/ko.json @@ -18,6 +18,7 @@ "IN_A_DAY": "보통 하루 안에 응답" }, "START_CONVERSATION": "대화 시작", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "새 메시지 보기", "CLOSE_MESSAGES_BUTTON": "닫기", diff --git a/app/javascript/widget/i18n/locale/ml.json b/app/javascript/widget/i18n/locale/ml.json index 5be38ee21..358e2e977 100644 --- a/app/javascript/widget/i18n/locale/ml.json +++ b/app/javascript/widget/i18n/locale/ml.json @@ -18,6 +18,7 @@ "IN_A_DAY": "സാധാരണയായി ഒരു ദിവസത്തിൽ മറുപടി നൽകുന്നു" }, "START_CONVERSATION": "സംഭാഷണം ആരംഭിക്കുക", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "പുതിയ സന്ദേശങ്ങൾ കാണുക", "CLOSE_MESSAGES_BUTTON": "അടയ്ക്കുക", diff --git a/app/javascript/widget/i18n/locale/ne.json b/app/javascript/widget/i18n/locale/ne.json index ce46cdd02..3ec81c589 100644 --- a/app/javascript/widget/i18n/locale/ne.json +++ b/app/javascript/widget/i18n/locale/ne.json @@ -18,6 +18,7 @@ "IN_A_DAY": "धेरै जसो एक दिनमा जवाफ हुन्छ" }, "START_CONVERSATION": "कुराकानी सुरु गर्नुहोस्", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "नयाँ सन्देशहरू हेर्नुहोस्", "CLOSE_MESSAGES_BUTTON": "बन्दा गार्नुहोस्", diff --git a/app/javascript/widget/i18n/locale/nl.json b/app/javascript/widget/i18n/locale/nl.json index d633068a0..cd36aa538 100644 --- a/app/javascript/widget/i18n/locale/nl.json +++ b/app/javascript/widget/i18n/locale/nl.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Reageert meestal binnen een dag" }, "START_CONVERSATION": "Start Chat", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Bekijk nieuwe berichten", "CLOSE_MESSAGES_BUTTON": "Sluiten", diff --git a/app/javascript/widget/i18n/locale/no.json b/app/javascript/widget/i18n/locale/no.json index 31f65589c..d2cda0aa3 100644 --- a/app/javascript/widget/i18n/locale/no.json +++ b/app/javascript/widget/i18n/locale/no.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Svarer vanligvis innen en dag" }, "START_CONVERSATION": "Start samtale", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Se nye meldinger", "CLOSE_MESSAGES_BUTTON": "Lukk", diff --git a/app/javascript/widget/i18n/locale/pl.json b/app/javascript/widget/i18n/locale/pl.json index 88151e0c2..bcfcbfa9e 100644 --- a/app/javascript/widget/i18n/locale/pl.json +++ b/app/javascript/widget/i18n/locale/pl.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Zwykle odpowiadamy w przeciągu jednego dnia" }, "START_CONVERSATION": "Rozpocznij rozmowę", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Pokaż nowe wiadomości", "CLOSE_MESSAGES_BUTTON": "Zamknij", diff --git a/app/javascript/widget/i18n/locale/pt.json b/app/javascript/widget/i18n/locale/pt.json index e366f7a8f..bdb05d73c 100644 --- a/app/javascript/widget/i18n/locale/pt.json +++ b/app/javascript/widget/i18n/locale/pt.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Typically replies in a day" }, "START_CONVERSATION": "Start Conversation", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "See new messages", "CLOSE_MESSAGES_BUTTON": "FECHAR", diff --git a/app/javascript/widget/i18n/locale/pt_BR.json b/app/javascript/widget/i18n/locale/pt_BR.json index 5b5ab92d6..a7b7de881 100644 --- a/app/javascript/widget/i18n/locale/pt_BR.json +++ b/app/javascript/widget/i18n/locale/pt_BR.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Responde normalmente em um dia" }, "START_CONVERSATION": "Iniciar Conversa", + "START_NEW_CONVERSATION": "Iniciar uma nova conversa", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Ver novas mensagens", "CLOSE_MESSAGES_BUTTON": "Fechar", @@ -59,7 +60,7 @@ }, "CSAT": { "TITLE": "Avalie sua conversa", - "SUBMITTED_TITLE": "Thank you for submitting the rating", + "SUBMITTED_TITLE": "Obrigado por enviar a classificação", "PLACEHOLDER": "Conte-nos mais..." } } diff --git a/app/javascript/widget/i18n/locale/ro.json b/app/javascript/widget/i18n/locale/ro.json index ab5fde156..d062ea0fb 100644 --- a/app/javascript/widget/i18n/locale/ro.json +++ b/app/javascript/widget/i18n/locale/ro.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Typically replies in a day" }, "START_CONVERSATION": "Start Conversation", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Vezi mesajele noi", "CLOSE_MESSAGES_BUTTON": "Închide", diff --git a/app/javascript/widget/i18n/locale/ru.json b/app/javascript/widget/i18n/locale/ru.json index e96672ff4..a983cbede 100644 --- a/app/javascript/widget/i18n/locale/ru.json +++ b/app/javascript/widget/i18n/locale/ru.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Обычно отвечаем в течение дня" }, "START_CONVERSATION": "Начать диалог", + "START_NEW_CONVERSATION": "Начать диалог", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Посмотреть новые сообщения", "CLOSE_MESSAGES_BUTTON": "Закрыть", @@ -59,7 +60,7 @@ }, "CSAT": { "TITLE": "Оцените разговор", - "SUBMITTED_TITLE": "Thank you for submitting the rating", + "SUBMITTED_TITLE": "Спасибо за оценку", "PLACEHOLDER": "Расскажите подробнее..." } } diff --git a/app/javascript/widget/i18n/locale/sk.json b/app/javascript/widget/i18n/locale/sk.json index dd114afff..bbb43acfa 100644 --- a/app/javascript/widget/i18n/locale/sk.json +++ b/app/javascript/widget/i18n/locale/sk.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Typically replies in a day" }, "START_CONVERSATION": "Start Conversation", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "See new messages", "CLOSE_MESSAGES_BUTTON": "Close", diff --git a/app/javascript/widget/i18n/locale/sv.json b/app/javascript/widget/i18n/locale/sv.json index 307ff1709..375ded8d4 100644 --- a/app/javascript/widget/i18n/locale/sv.json +++ b/app/javascript/widget/i18n/locale/sv.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Svar vanligtvis inom en dag" }, "START_CONVERSATION": "Starta konversation", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Se nya meddelanden", "CLOSE_MESSAGES_BUTTON": "Stäng", diff --git a/app/javascript/widget/i18n/locale/ta.json b/app/javascript/widget/i18n/locale/ta.json index 9da18c1b1..1a0a0ce0b 100644 --- a/app/javascript/widget/i18n/locale/ta.json +++ b/app/javascript/widget/i18n/locale/ta.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Typically replies in a day" }, "START_CONVERSATION": "Start Conversation", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "See new messages", "CLOSE_MESSAGES_BUTTON": "மூடு", diff --git a/app/javascript/widget/i18n/locale/th.json b/app/javascript/widget/i18n/locale/th.json index 12be549e7..16470a95f 100644 --- a/app/javascript/widget/i18n/locale/th.json +++ b/app/javascript/widget/i18n/locale/th.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Typically replies in a day" }, "START_CONVERSATION": "Start Conversation", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "See new messages", "CLOSE_MESSAGES_BUTTON": "ปิด", diff --git a/app/javascript/widget/i18n/locale/tr.json b/app/javascript/widget/i18n/locale/tr.json index 2fcd22d56..89d8a02c8 100644 --- a/app/javascript/widget/i18n/locale/tr.json +++ b/app/javascript/widget/i18n/locale/tr.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Genellikle bir gün içinde yanıtlar" }, "START_CONVERSATION": "Görüşmeyi Başlatın", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Yeni mesajları gör", "CLOSE_MESSAGES_BUTTON": "Kapat", diff --git a/app/javascript/widget/i18n/locale/uk.json b/app/javascript/widget/i18n/locale/uk.json index 041be0802..9958673ab 100644 --- a/app/javascript/widget/i18n/locale/uk.json +++ b/app/javascript/widget/i18n/locale/uk.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Typically replies in a day" }, "START_CONVERSATION": "Start Conversation", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "See new messages", "CLOSE_MESSAGES_BUTTON": "Закрити", diff --git a/app/javascript/widget/i18n/locale/vi.json b/app/javascript/widget/i18n/locale/vi.json index 1ff32e406..161219d61 100644 --- a/app/javascript/widget/i18n/locale/vi.json +++ b/app/javascript/widget/i18n/locale/vi.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Thường trả lời trong một ngày" }, "START_CONVERSATION": "Bắt đầu một cuộc trò chuyện", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "Xem tin nhắn mới", "CLOSE_MESSAGES_BUTTON": "Đóng", diff --git a/app/javascript/widget/i18n/locale/zh_CN.json b/app/javascript/widget/i18n/locale/zh_CN.json index 708d16b2c..161680829 100644 --- a/app/javascript/widget/i18n/locale/zh_CN.json +++ b/app/javascript/widget/i18n/locale/zh_CN.json @@ -18,6 +18,7 @@ "IN_A_DAY": "通常在一天之内回复您" }, "START_CONVERSATION": "开始会话", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "查看新消息", "CLOSE_MESSAGES_BUTTON": "关闭", diff --git a/app/javascript/widget/i18n/locale/zh_TW.json b/app/javascript/widget/i18n/locale/zh_TW.json index 15b5b6296..c1d1e3db8 100644 --- a/app/javascript/widget/i18n/locale/zh_TW.json +++ b/app/javascript/widget/i18n/locale/zh_TW.json @@ -18,6 +18,7 @@ "IN_A_DAY": "Typically replies in a day" }, "START_CONVERSATION": "開始對話", + "START_NEW_CONVERSATION": "Start a new conversation", "UNREAD_VIEW": { "VIEW_MESSAGES_BUTTON": "查看新訊息", "CLOSE_MESSAGES_BUTTON": "關閉", diff --git a/config/locales/de.yml b/config/locales/de.yml index b112a6f35..65724b162 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -66,7 +66,7 @@ de: greeting_message_body: "%{account_name} antwortet in der Regel in wenigen Stunden." ways_to_reach_you_message_body: "Geben Sie dem Team einen Weg, Sie zu erreichen." email_input_box_message_body: "Lassen Sie sich per E-Mail benachrichtigen" - csat_input_message_body: "Please rate the conversation" + csat_input_message_body: "Bitte bewerte die Unterhaltung" reply: email_subject: "Neue Nachrichten in dieser Unterhaltung" transcript_subject: "Konversations-Protokoll" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 362109b4d..a08b47613 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -66,7 +66,7 @@ fr: greeting_message_body: "%{account_name} répond généralement en quelques heures." ways_to_reach_you_message_body: "Donnez à l'équipe un moyen de vous recontacter." email_input_box_message_body: "Recevez des notifications par courriel" - csat_input_message_body: "Please rate the conversation" + csat_input_message_body: "Veuillez évaluer la conversation" reply: email_subject: "Nouveaux messages dans cette conversation" transcript_subject: "Transcription de conversation" @@ -79,7 +79,7 @@ fr: description: "Les événements Webhook vous fournissent des informations en temps réel sur ce qui se passe dans votre compte. Vous pouvez utiliser les webhooks pour communiquer les événements à vos applications préférées comme Slack ou Github. Cliquez sur Configurer pour configurer vos webhooks." dialogflow: name: "Dialogflow" - description: "Build chatbots using Dialogflow and connect them to your inbox quickly. Let the bots handle the queries before handing them off to a customer service agent." + description: "Construisez des chatbots en utilisant Dialogflow et connectez-les à votre boîte de réception rapidement. Laissez les bots s'occuper des requêtes avant de les transmettre à un agent de service à la clientèle." fullcontact: name: "Fullcontact" - description: "FullContact integration helps to enrich visitor profiles. Identify the users as soon as they share their email address and offer them tailored customer service. Connect your FullContact to your account by sharing the FullContact API Key." + description: "L'intégration FullContact permet d'enrichir les profils de visiteurs. Identifiez les utilisateurs dès qu'ils partagent leur adresse de courriel et offrez-leur un service client sur mesure. Connectez FullContact à votre compte en partageant la clé API FullContact." diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml index ccadfef42..d97dec0c7 100644 --- a/config/locales/pt_BR.yml +++ b/config/locales/pt_BR.yml @@ -66,7 +66,7 @@ pt_BR: greeting_message_body: "%{account_name} normalmente responde em algumas horas." ways_to_reach_you_message_body: "Informe uma forma para entrarmos em contato com você." email_input_box_message_body: "Seja notificado por e-mail" - csat_input_message_body: "Please rate the conversation" + csat_input_message_body: "Por favor, classifique a conversa" reply: email_subject: "Novas mensagens nesta conversa" transcript_subject: "Transcrição da conversa" From efd6f735dc19001c1124e7d21a14ac6244874689 Mon Sep 17 00:00:00 2001 From: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com> Date: Fri, 9 Jul 2021 10:53:28 +0530 Subject: [PATCH 43/69] fix: Align delete message menu on twitter bubble correctly (#2591) * fix: Aligns delete message menu on twitter bubble correctly * Fixes alignment issues --- .../widgets/conversation/Message.vue | 54 +++++++++++-------- .../components/MessageContextMenu.vue | 4 +- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/app/javascript/dashboard/components/widgets/conversation/Message.vue b/app/javascript/dashboard/components/widgets/conversation/Message.vue index 6c319ee15..bc7dbb19c 100644 --- a/app/javascript/dashboard/components/widgets/conversation/Message.vue +++ b/app/javascript/dashboard/components/widgets/conversation/Message.vue @@ -43,16 +43,6 @@ :source-id="data.source_id" />
- -
+ + + diff --git a/app/javascript/dashboard/components/ui/stories/DateRangePicker.stories.js b/app/javascript/dashboard/components/ui/stories/DateRangePicker.stories.js new file mode 100644 index 000000000..91fac6317 --- /dev/null +++ b/app/javascript/dashboard/components/ui/stories/DateRangePicker.stories.js @@ -0,0 +1,38 @@ +import { action } from '@storybook/addon-actions'; +import WootDateRangePicker from '../DateRangePicker'; + +export default { + title: 'Components/Date Picker/Date Range Picker', + argTypes: { + confirmText: { + defaultValue: 'Apply', + control: { + type: 'text', + }, + }, + placeholder: { + defaultValue: 'Select date range', + control: { + type: 'text', + }, + }, + value: { + control: { + type: 'text', + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { WootDateRangePicker }, + template: + '', +}); + +export const DateRangePicker = Template.bind({}); +DateRangePicker.args = { + onChange: action('applied'), + value: [new Date(), new Date()], +}; diff --git a/package.json b/package.json index 42b0f8d1f..8f08e1167 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "vue-router": "~2.2.0", "vue-template-compiler": "2.6.12", "vue-upload-component": "2.8.22", + "vue2-datepicker": "^3.9.1", "vuelidate": "0.7.6", "vuex": "~2.1.1", "vuex-router-sync": "~4.1.2" diff --git a/yarn.lock b/yarn.lock index 8eafe2e3d..abebaf297 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5427,6 +5427,11 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== +date-format-parse@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/date-format-parse/-/date-format-parse-0.2.6.tgz#7ed42817efb6ec39532169eada9670ae3c627aa7" + integrity sha512-sdxnYAWmLopeb+6Hmw+vo3or4OCJOnh4+YoJ9p+Id3o2EnNP0INpTqx7wr8UregfMpgaSZAH473R/ytiaB3gVg== + de-indent@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" @@ -15071,6 +15076,13 @@ vue-upload-component@2.8.22: resolved "https://registry.yarnpkg.com/vue-upload-component/-/vue-upload-component-2.8.22.tgz#7a1573149a4afa5ca6e8c7e0bc70533925fe26b7" integrity sha512-AJpETqiZrgqs8bwJQpWTFrRg3i6s7cUodRRZVnb1f94Jvpd0YYfzGY4zluBqPmssNSkUaYu7EteXaK8aW17Osw== +vue2-datepicker@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/vue2-datepicker/-/vue2-datepicker-3.9.1.tgz#00d11cf30942e850f8b1a397af3c15c7465f248e" + integrity sha512-LuvcgGR+sDYKcih0z+cyvYufGyBwUtIiwzJPwxE63C8gOsAWiE09KuGtZ3OxdQXJEQM2MGQ9t9t1t7382FiFOg== + dependencies: + date-format-parse "^0.2.6" + vue@2.6.12, vue@^2.6.12: version "2.6.12" resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123" From 5726447e473183b97b0b2e93ddbbf008aff709bc Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Fri, 9 Jul 2021 17:45:02 +0530 Subject: [PATCH 47/69] fix: Unescape Slack incoming messages (#2604) --- lib/integrations/slack/incoming_message_builder.rb | 2 +- spec/lib/integrations/slack/incoming_message_builder_spec.rb | 1 + spec/support/slack_stubs.rb | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/integrations/slack/incoming_message_builder.rb b/lib/integrations/slack/incoming_message_builder.rb index a04f4e2bb..93f23d3a4 100644 --- a/lib/integrations/slack/incoming_message_builder.rb +++ b/lib/integrations/slack/incoming_message_builder.rb @@ -83,7 +83,7 @@ class Integrations::Slack::IncomingMessageBuilder message_type: :outgoing, account_id: conversation.account_id, inbox_id: conversation.inbox_id, - content: params[:event][:text], + content: Slack::Messages::Formatting.unescape(params[:event][:text] || ''), external_source_id_slack: params[:event][:ts], private: private_note?, sender: sender diff --git a/spec/lib/integrations/slack/incoming_message_builder_spec.rb b/spec/lib/integrations/slack/incoming_message_builder_spec.rb index a2b0bc603..ac89434c7 100644 --- a/spec/lib/integrations/slack/incoming_message_builder_spec.rb +++ b/spec/lib/integrations/slack/incoming_message_builder_spec.rb @@ -33,6 +33,7 @@ describe Integrations::Slack::IncomingMessageBuilder do allow(builder).to receive(:sender).and_return(nil) builder.perform expect(conversation.messages.count).to eql(messages_count + 1) + expect(conversation.messages.last.content).to eql('this is test https://chatwoot.com Hey @Sojan Test again') end it 'does not create message for invalid event type' do diff --git a/spec/support/slack_stubs.rb b/spec/support/slack_stubs.rb index e7cdb271d..28a25ba54 100644 --- a/spec/support/slack_stubs.rb +++ b/spec/support/slack_stubs.rb @@ -46,7 +46,7 @@ module SlackStubs { "client_msg_id": 'ffc6e64e-6f0c-4a3d-b594-faa6b44e48ab', "type": 'message', - "text": 'this is test', + "text": 'this is test Hey <@U019KT237LP|Sojan> Test again', "user": 'ULYPAKE5S', "ts": '1588623033.006000', "team": 'TLST3048H', From ba547b3f605e628980cb8b4a032e3cff693ed61b Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Mon, 12 Jul 2021 12:28:16 +0530 Subject: [PATCH 48/69] chore: Delete related notifications if a conversation is deleted (#2592) --- app/models/conversation.rb | 1 + ...0842_remove_notifications_without_primary_actor.rb | 9 +++++++++ db/schema.rb | 2 +- spec/models/conversation_spec.rb | 11 +++++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20210708140842_remove_notifications_without_primary_actor.rb diff --git a/app/models/conversation.rb b/app/models/conversation.rb index 97115dde6..779c7668e 100644 --- a/app/models/conversation.rb +++ b/app/models/conversation.rb @@ -61,6 +61,7 @@ class Conversation < ApplicationRecord has_many :messages, dependent: :destroy, autosave: true has_one :csat_survey_response, dependent: :destroy + has_many :notifications, as: :primary_actor, dependent: :destroy before_create :set_bot_conversation diff --git a/db/migrate/20210708140842_remove_notifications_without_primary_actor.rb b/db/migrate/20210708140842_remove_notifications_without_primary_actor.rb new file mode 100644 index 000000000..3d2583400 --- /dev/null +++ b/db/migrate/20210708140842_remove_notifications_without_primary_actor.rb @@ -0,0 +1,9 @@ +class RemoveNotificationsWithoutPrimaryActor < ActiveRecord::Migration[6.0] + def change + deleted_ids = [] + Notification.where(primary_actor_type: 'Conversation').pluck(:primary_actor_id).uniq.each_slice(1000) do |id_list| + deleted_ids << id_list - Conversation.where(id: id_list).pluck(:id) + end + Notification.where(primary_actor_type: 'Conversation', primary_actor_id: deleted_ids).destroy_all + end +end diff --git a/db/schema.rb b/db/schema.rb index cc0ad871d..694639ff1 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: 2021_06_23_155413) do +ActiveRecord::Schema.define(version: 2021_07_08_140842) do # These are extensions that must be enabled in order to support this database enable_extension "pg_stat_statements" diff --git a/spec/models/conversation_spec.rb b/spec/models/conversation_spec.rb index bcfc91a70..cbbd97855 100644 --- a/spec/models/conversation_spec.rb +++ b/spec/models/conversation_spec.rb @@ -399,4 +399,15 @@ RSpec.describe Conversation, type: :model do end end end + + describe '#delete conversation' do + let!(:conversation) { create(:conversation) } + + let!(:notification) { create(:notification, notification_type: 'conversation_creation', primary_actor: conversation) } + + it 'delete associated notifications if conversation is deleted' do + conversation.destroy + expect { notification.reload }.to raise_error ActiveRecord::RecordNotFound + end + end end From fc4ef1595bbe9a2a41b1d7c4ca28d6fe12ac3e66 Mon Sep 17 00:00:00 2001 From: Siddharth Ramesh Date: Mon, 12 Jul 2021 22:33:39 +0530 Subject: [PATCH 49/69] chore: Twilio to individual(SMS/Whatsapp) channels (#2566) --- .../dashboard/assets/images/channels/sms.png | Bin 0 -> 14570 bytes .../components/widgets/ChannelItem.vue | 10 +- .../dashboard/i18n/locale/en/inboxMgmt.json | 8 + .../dashboard/settings/inbox/ChannelList.vue | 3 +- .../settings/inbox/channel-factory.js | 6 +- .../dashboard/settings/inbox/channels/Sms.vue | 21 +++ .../settings/inbox/channels/Twilio.vue | 164 ++++++++---------- .../settings/inbox/channels/Whatsapp.vue | 22 +++ 8 files changed, 138 insertions(+), 96 deletions(-) create mode 100644 app/javascript/dashboard/assets/images/channels/sms.png create mode 100644 app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Sms.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Whatsapp.vue diff --git a/app/javascript/dashboard/assets/images/channels/sms.png b/app/javascript/dashboard/assets/images/channels/sms.png new file mode 100644 index 0000000000000000000000000000000000000000..a8cfa6428a2791998548f504e43fd2e9c08e43e4 GIT binary patch literal 14570 zcmeHuWmuHK*Y_-)0tP7|At)sZDj+EhQW64EBAvnlg2XB+D7{EXO9+x8DUApy&C)HB zOUEM8@2vmpeXi&E_I`Q4Jzl!I&VA3B6EkPdIrE!0+M3GL6wDL=0BThg1zi9L;722w5 z4ZOX*h3s7%J*+IyL(%RYI?=ewp;^2+)E>50r$ab)naW^j!T%Tmd`#S%Ln_oRxHprRijZI z2#`+eqk2od`esU4C8=rWIwK3@xHE^xRM`G8o+s@W<>(?c-q{A4>L^o@e*){E19CTOT}e_SAyPD-HGd)x_t!L z{TYk1@^K_|mt#2h6sTlfKU6!&%sNLPNCZ&Jf0MGbpbGTm=;`e6&)QUcRWQAcZvjX@ zxTz)~nG)7RlZR>?!fUR7uFn2VH#?xcd6%aPyGBV!r-JX2_6}#L+9l^F0|1F#9Bz0@ zx@0+z4KJ1<_pzC7!Pqo4Kv_OQ2TYIOGSJt@8+*SZD=jqk1b|fw)dL?_cB4As!XeH^ zg{wQ(s+D^49RTFsW5|iwGB=nF%{z-HwU1tpwq&6}01HNCOk4lYziG!OoYQz(;`$ga zG_(IPCjiUMUaGcGny&!?Z;BBd(d`;>xU4Khy+1hsyE%6;SFn$dtQ+bZD?yZs^=nmQ zKKn9Za{y%hO$4za$m{h@ku-brseX7{PhOD-1VBy97?V=x@6fVe&bKj+CK#V211O0n ziM7(@zpn;R!V!`MTtlZ-6lE9z%B@{JF;25Jt!OUTKoq!5vjbqR=O-nb?TVP-#8bQK zTz0kgy;%$1KArE;Y(+nU5ddW>&Yuz{qx*&?@1Hi0xdqYh_zs%^Xk5?YVNKR-t&BaC zi>)ShD_=T7fK3y5vow>6FSd9Z0cbM@lVbv)O+C)Tiq>q6kKMTxn}Dd&K|Zln|=zPdx7R(X;oo04ybOVbh`3vPR4W$_X3t!lsD< zh_&oki3v5pQORx;1v>IjU!A9fLnxN3GaIe0qq4((%luP?hKP#U^uu?$1dWP3M`r-o z)avv1(5b`=<)-S4&S(jM%x>P(#3aB0>U+)kyhwiaXY7!IMo}Ffe`M2JYLIqydzui= zV7|Oap}+KSA}|SHO}G9+tzUNMUQ2;`JHH(nitWsy-`{{N?2c?7EWbE?@3w@(PP`44`s)a>O(0XK_%xcE_5mrFN?LR`--Fc} zN^(HRuT2IQM5^@Rx;#N6isC;E_tYoBp=6KYi-1<12!6`r_ZV3+eQqFXkPhvmE#?1b z@)Z#=I-jTvC7^94{ex@RAk*8KC8aKmP|gXovrO`M;F= z|ELWYQAL4s?OTFku`SEe{xtm1x)T%jkgP#TVv_=2g{G+e29 zC^)(5;FX{0Eiqw1xik8*DNb{Ac&JfHoscC9QFrS6RxR{qb>dz`Cc}`#SSn4mZlIWA z_N>zQL9cYhANEIA`njxqvkIk(B;e<`snpl@zHyV~Lq9V4(*)6gsO;|?>a!%H%ojGC z8JM%4b~^GibD^z?O%^MX%j!D@tAz|VkSbb*?zm-N)9HKDwBJJiVZd zFsBO9!j>T%y-6@lsaX1@rMGH(LzfNr1iM!DLU%m-$;aZ5?e!Hx61OwXwc?~kD+GDF z%x9P0-&76^;4kiWy70E(McsjsL||ZXf7*47K>^CAt)X1J+DgYvtH^z>cRM~SPy;WC zP1%Tq*SkWxF2vrd^+@mha^HM}%QLZJ&y-|ZV&AJNVQF7-0%bw2$RSOMXlBb$SX{^% zHscxw+2n zymFrxF{(_2GG-{ry24dQ>FXP6>K?4?m})k^;;W!@Qv{o6M$T>OOR z_|I-_z=3?xf{kKg2BtD1eEB}9{zp<@m-0;Y)E`4#1u8uE7@h2WLx+_v-kdOCG!Cga zWB8Nzi?8GT@QAZ{K|nj-NnOIbA*9|{Pa)Ic>2lFUtYDE)0B8QtpRuYR!MIZ7AydiQ zp3d63mcdvLhny10r@7fIn&F?UwXGwYe|wuAk7pV=uNH;R{;K49J$|qtLU)gesk?k) zQXI>oWwZO8;^S+t%pO47eWT5dcgC(j>jeFd(FxmKYQ;P?ePngb29+%n zP_>=XFc-cV;Nzw`TjN5@MzFUCP9tTJz#-{Fzke(|U5=?&rUBhSsqHg_a7#Nfb=S|Q6bJ1oe9r-?2< zldc?N%MvbAotfU(CQnu*VPvgDPF~TOd}el6F2ALDq1Q65-lO)bR)N_~aot#>xAuY+ z(%zrHsxEnuDkIe{C|TW25-=5MnV8kKzo&ymb8#i^z9I4V(pAt&4B30rmNn4%U{dgD z0f}Zd5L3unPumAf_oQ$}o6J-?|3`&ErxPM=3#hAuPVTd^C1e1>H1-%9QEGMY z+ma6Lh;ULrSSVTOBJi6{$mP_peap;=2~0a1taQjZ8@7NLYuTzhm=_;(po+myNQbpprxnbZ|7`Cy{oKHmXjzz@txwpd^}&+iWp&I}W{@kp12Lk}mMckc(%3$c&k>K zOix)GU2yAiC(xMa2vg_HH3I4wLjtzr4U6{ajPr)<41>YE11`sxe}8)O?a9LacQjm6 zBCL;p-54)-QEB)Ui6y!#Z>n7iE{C0XUz>N;DTrie>{BFhUDeBfK&XA20HsxbUA)~Z zMf&ICpg<;#7`ZjCa$AH3^Rc?ku^@#fPQ_$evMJf>ftG~t3%pcP?`XOiT~{za#YV0U zhESWz8Ct}V2MMO=w-}*roLvYzaqLS##05xmwa3*<8%-+$zVkU2uizBLM1E`?85&lu zJ@Y3huUr_##d2CrbP3w^KosFdKbe^y=D1&1hlP;pEmc`o^r-)AEJS zmh>#o^$}}#pDdMJwNQ~!H@_1W9X&lJ@ldMnEv28HbpiPX4bP;e~hEr_)>wHVCLF$A+e`6ZI!>%Zgx9yuVU;7{5^NMA?7Z z@~c3gf8=?b^iO_1|GhC1Lz=pK8|EQu8G;saM6-H}N9nYM6THJZ zDsSB>p003-FY>+4|Ha?(?1fZf3!HiN&Sj+sw{(byyF2Wic?A_pma5y`maeJWGH$93 z`Nnx?7kB^6D^CfnVT?`u_kL>#a{s&y>9N;gzR$5WQ|75|@3YvMq&9`o%{FCmIi+O>x~tvbUvfG%YpgrAcysvuct)+(FkC1zuu6GKqx(?Tk+Xt6PH~or|PT z-3;~wc}C;&CU^;+t~Vfqn6rghyGwS|r(y$eewxz(5^ePy*6F1DebySG2Q~)znL8Uj z%Pr+$M;$ur0*&vwkj|kY7H=`Wt+cIqDQC8a3uFhG~Ih%R9o!pcp%kSdZI(Scb(Q_JeC-a12hC;Y0 z?8(E4d3PS?(FF&rjbW(?YnOxP$m}$!qz!^iV4JSJ6prk4#Gy_eVLB>NIyF?URk%GC zY&a}=hg{E+2z9ozAo{pA-f3GXwIVE^+O%kDEv{ldsP5%M!{r}pE0U%+cR!&Y*&>`e z4q4xQG$0{ksWI)c_bfw(=7*aW-Skptm1^=X8F!!J_m?b{Gt@n;Y7Z67)k(aLnV|IB zxoOzoD_E=?FKPT$>~APj6TcTdsxQ#ThVhQ<4@u0a(9e|LLWb> zc6IiS_2bO193^F`5ed+?ECseaPV46JmcF6R6H^>;mtM{(_2ur8x>cLzQ}@2~nqFUV5}P2mauQ=2kgoqc z)ECdz;jr>2onKCnQRW9`^qg1V&$O|c=u(N887HPuVSMuGwHO$e{99&GFQst8;nYU|_@DsZ}h}xc=8_O#^CmKkdNx1r6+_qpwz$ZM1{G^P#_|~ny z{Y+8G9)iu*hW2aO{tvzm4sOtw+!H!b0(`w8HXR{{r%(%v!X8gDk?^%-sivDBck--1 zUTkJDn;YVwxC{8At}yKRt8b6>wk)yFf5rXC<)r67<>z^%Do7aQ%4OikRN zUGgQwuQvulF7I67w6fjpCP+Bz;y9XHmHk?!SO2Li=J8XMJRP7AtrA(H$ckVq`AmA@ zzA#tdIf+_1k}?{!XcB_ptv0)$>;+sTv5XoFCugSEu6{IAI=OsQYf zX9EjE4LkOmz0&C_L@0t?MmI;nDOw~k@XBsO6^h%jYYPy_KCk}Lq*YA4!G6R?*huO* z4_lv+0pjIO64U3R8RAP6V3lHx(18w-E}KHq2@-H$=)mb?dBBM2!7SY_1$-B!)Shcp zHSV!EeahBMog`USwbj}rBvMVBl8=e__N3x`ZdcTvL(d!mX;^>UlkkyfHGNxsA5LM2Nfpjpo(0#`yfux7nfzFu;P|FiL%u<^4O9E}MtH;QoBv z_9n}(k-LM69H4R2_pO+Jw8}0KBGSorrbH|x8_n3qWio`>T19~cMa)?6cMJ7f8j&St zWX}`;-wXSVvHInuTl=d$NT;4Y2%$q}zDMu?G=#G~=VUW4N zN%}(6@s-b7b03#8jC4fqv8a1Q?#+hrq3y{7gJ+e;eK(It{7{WS;G1q-j7_b`&XNrb+o4GgVF6Ni5)31DYQm5@ycy1Lr#z5)Yf zd`_kr?D%~}?YZxwT4Mk5Qh!Y6!z2$F0eGi5Ix5!W8x=;_6uOl?F17k@u$U`NAWLpj zDRB^gx2v|1$JMz}hs&8&3^UZgzH&TW;pAOjbl+imJ?}>T6uY6Rk*jm_TQ9?oaZ{Ke zwI|&|Asku-f(RSW%)*HDx8Kxtc>^R=CgdZ3#K%UDm}$d%F30+b}t5; zCRBFVnU9mzpobnmtot%GxH?puYCM1Js^|m6I8W#xse~M3u?aYwxdKXWkD^v0N5ZtYNloK0|Hdh_Rukl*ZOqYd@Ef}!uCa>$K{cB3CvD@T{$siv2f$}BT}#V2*v$sDj*p;GDR>4 zEqKtqh57AW_x`yN|HZnmZ~inPcLQG^%o!HXmzPLBe2WW$kCYgrrX!1j@TV}stu&XxcG|Ks;>yD=0ue5 z#_zD;f@l=QYGvfW)8ZBL&MWNoRGT!1)D`a%nfgr^zawu)vN6ADP-9y6;dlMcFB^2e zB#V+JWN9n%*3#Q6I$~`vipZ|rb*#y+nWoy{unf*r8mnHMNN`DJyC3>IQY)AVkxu2K ze1N6AbB;^(f21}qkJ}Kcw*-IWhrTLB*AAbT@skTGlDcFZPnqjT*M)q~WHzr*SPxr(~$R!nEQ7NYO`L`Bjg{LN#jdmaSe^u{m?5q`7 zr&sPSUAUj&zj_A@R9+KeTvzwdsNT-ab&=%y_&i+B@SGWp&Ys#AW{SVA=i;!7zsS_r zWBYwT?^H{Jpk^SJdhf-Il=zddLYb8D-bE6HO;SXkm5V z6$w*Q3I3e53F?vT5FS(ihkE!Df{5?OykFN0N7jlLcH^xd&eWVM%|5*&o|hkK^@QWw zV(e~2{SH;oODXZd(~tmfFO47;`%6bkV6#cAXAVaZNwVI@aOTYt=4U4nhu_H;f#Pv9 z%c#%1G0G#=_BQX175rLfcIC9ps^{J$4|%#bxZ<;dy#6*13QoU(gGZVk2G>1I8s5 z0#qcuGjg{u=S#as_=drKy=osDjk`%?2(tL@f_Hv*Ixfrk|J}37yu-P4E+Vgo&2)W9 zJ<_JUoOemBQ|!wqrt3zg1IH5AV*}5s>dof`Q%~b*KTFc7AEeof+@#z_AkrxoV1;M% zIa?vweiGr{+~!P0z~4*jdl#Btw*Az|{V-J6U3D-JB<1TQ?nvNeD;tFC=pVURg&_m_ zUos{KU(w*~%vc!q*OP0^70e})?NRcRHQdDyQ91XAwj5;lt35CmN=pw~Ueq#PUNwfM zhXsZ!^2Pch7u&CnjdA&7`w9Z~B*GWgANuI&ky2Ua71QS5C|WmXp7@Ge)$2T|0+HUnU4(01bgy1`pZrCG#1G}HYA%y#f_PPJ zZE3a-x-$#7j@>WG4bemjdE?$U{IL^^q}#y2Rq&rEnGnIj5$MZb+#}OD^{d8x8|E3T zEuV}+^jV7nSR2DI&c)Xb_WCozi@FN;XM3Y<*vV9GrN_QOWx4 zM=Z{5tnYo`av#k}YX3)PB7~|#m`c2srJ(FrJ4@;O6(v!=;5aYdQJvb!CtLF^!6j;=|vA*8dMY%0-_8oHSd&uSW76DmtJ2UG3 z>cK&1H2kFKGC#M@(R;lY!+VB%o?*E@+sE|isews_VSP|Q<@g{2d)M-Z%4UB}lENGO z$E(@NHdFnXGWATI1lspU;*b|8Uw6oZYXkW#4^45}2B(YB1?#5h;e{y8V^iP93ddG* zhB}f9MM&g&ol%{3Q;Sug`I`Sit+)KdIHS$o`23Bo4(zJT-qIh#9b-1ky;ei05@>zwEC@7iRyKf{%;R`iLm`VC{Jd#-PmqAU$e%~x%;IKX-S4YdXzsp9F{)Zsb0 z3h9c5!qT&JVtXPFxzk+D)MmCBu7 zq2dHVR+-izpL1LiH!Rov@4`bfA5)`G{3{Or@wlcxO&*)t>b4P)OE+RVO{1Qz+L>%6 zRB91Zv~B;4>X5+n=U+4x=gr^Q*y!`f@2cI9w9YcURVj)x{$iJzpH}-z%J=DBlFvMK zt>XF8>`zwM?zb&;%`!0XTi&6u-JSFipY`GndoaZ%174KCh3maIkHeCdj*U2*Q6%)~ zw(+z2%ZI+DsXFYcJ=u*e7=tInKM%W{W{|`$D%|SuNx8x9@j0sCgku00P4HNNR|(a{ zg^c$UbZ$Q!$zB}3UA^>y&65eKwf0h^BJn{v0g;PyPJYi(xw31mqb8YMgwM)*?b{Lb zUMq$7ieRO}vD3=(I0N(M;V%>&^rdh=+%1x;B>Z?o{lWPN`agD>`I$*(Hy69Of~jWT z5o?r4%r579xYzguq#vANRXfzCil9G0j^{&1n(*WeuiC^AJxXSw_z6yBEKI*S+vORn z0TIA`;uSvb3AMQsB$G;c@me>vaN^dSwuc7uRNBo9Z6a`fuBmdz*t*f6Rxn6l^x-s0 z2j*(Kjn_%Y%U=W3i`zw_HDZ55rWvD^ZhAZ?{OIH7v$+-oLwphhAii-4s9?;FUlf7H z?vsi!k>4dVO=UF1Tp-;-xX`1l3q?wBpse~AW$(K^b#h5=g+0@s?>y|+A&HS7ocd}? z=_*Y0Ew>Am^U98$LK(>F3?pT8^3DKj|G1tJ{^|ty6ss|_^T%H<6m%Y?M5RES6;YY z`VV7G&^fhYAGIfuBaZrU^kc!sR;}h#tt_KX*esEzG$D9&1ba0@uh?`Fo!$|}ojpzt zUQyI5D&MQ}Q&XTOc{ttiwF)td-$xHwt{rbw>GC@(G?9U&{*$``DYyDiQ|7w9lnl2l z(5)f3!OTuOcDTx&Z_O5d7kds+Qn226DkXMV@~@ll8vqg(5@$1+ts8ev(YTvycXi0X zh@d*gGv_<9cgp7B1RCeWGVX`?__s4FMEXfOQ)b|sKOY{DI8Bh98;!%Q&1NKucPEEc zWlZwS5Wc?coLuM_aU-Ad{h%7)dulMpg6*rEU=Po%3@tnQgTzF2>C5C z5XHTAYXqaOjBo6^Vh+=5mC-o-aT#<$ zHesPl@X$b~-$yd3fBA={7fo&=JkI;L?&#Qh+k`iwWYEs8P1vXARB%j%P)7ikY+u9E zm~V{ghg6?MGa9mIy5bI)+z`}un`Wcp1wVDacQ%~}iPQ!AVi=<%n5-RP<^A5_U%wHd*-+<@nBGU<66?658Prn-kaw4^$zCb=u&QW579L{TcxJJb1)<9M*i1E zokL9)+Z8V8%3z3m*?9V`B}$uFvxx#`+b};zj?RU=-pv^3hRk1Ic>;^C1zu%`&KZ)^c?5^3Tv-M zus+9nX8>cmDC)-Eqa49+dP=}>%Rvh!0XwTCTvJhoJuYTZhRRyK`U654_T;a3H4ppu z4_9CyAUN5XDU~Z&fv>(ZrZn`xI`46SNF`~99N6*AwJTfnF@OfW8X}(xKlt4j7A(KnT|6nR^hU0VC{Y((;yfyJZK)@ zcNiaZwRLNZ1=~l6`><-M|Ww&?3E}hNss@m*?uwp^5*BM+6QI+-mOe$ zMRDVLn5N8^x*HERwSDs_Gbb+^~o{Vis~4 z_^7k>YkJPG$EIB3U^GZK{=VU=T*^^uTrG@9z?)e<}^# zTnP9Txo9AH(Bx4bzk1IuEVs!@p89T*9sAK|nCyqL_vF?5NeoGph2^-4TJkOpeo2E+Kg*o3T6Fk-x$xV;?8z^&(~Hf46tA|5Sx+rREXn)`HG>x znt`s)?(cNgq2TfB3*ms82`gQcuezex~9 zAoy^@j_XQ;K!eG<;RY$=L;O*vg!wq_#Qx?4b6dz7TGF@H_{H`Z$#4i0s(=fgJwYjZ?U9#L{;t%3Xm9Cv!G(q7P`RPAbJG^K zrN&*KvWF&MHWSL$e*H(@bplzsb<;>7VKdE&6kK2Y!YWGYwrd-WGg7v-|>(t)*O zByPT~^kC5OVkrcWyv6l1c(`}kdxVuizX`)ZT*=|H0fWV7hdJ~MdDR~+VJvOVGGcLZ zP+ogeZ_Dgxh;3seX#qyU0!?i`*Yk!f+57V`Ht^IT|PHLO0sCP&v~crMnC#}(_g#E#^L z;N4PUPU%>Uxdv|-x$A59dC!1bwF#8RWsBj$^P)B=T=emg5AP9c=(gCCVjQdviAlI% zGlGuA&(H{T41cGZ@K@hqz7SuOaCZH&*H%qYz;&4%+wo3nCrkSE(o(AN9Sj3|$MV>0 z=D~p6iKy4dv5_?g7<<)BcdqP)&#eFTcH{Bi`I&4`R#WY#R`!U6Xr2`t+%r#L(Mj|VZFHBhSZyyig~ne+FpLJ~uq#a+Lj{u=j@O7seQYIM#k z9B99;|(a4UMfYzcElQHD-kcIm=6PE)%sJ#g#X|R{wdKt0Wfh zEnNoB2fWNQdq}JLG(W8yCl7z=Dyk3E)e{VAmplW5bpKP=uZa`EvrX0!1}|>Sc9)=4LXrK(2=Z6~V2l)cSlOF1+D%Pp*M9Z%Z4tz#XV@|~d@`Nv*)w$35 z{i-1bCdM{}n?lRhCQDnPeT>o4H?Cv|v+MX>n;2PJ{usYgy;wMAuEJE39m!7HXLwop zZGiPU^r!(}uNBwOFP7JNk(|^#Ho*k*Dj-|lg|t%TMsj?Xn00`MTliXDRrjZTkMc88 zv6`(~qx~`*K<~kw%PFJor@AgQX_r)RauS&Jk>4^||vT38vbzs8WOFPk#?e#-^!=Bw;*EVvXezLGemieqd z2}&ZN;HJr;*9L*{qehkv+S&-VPnm6ls0DLX^HWv`EJb1=^MzlLy5 zS}q6+`(K>c|4-DM_9XrQ_H$3|){O|ogXA%5^EJ9e|`VEj3vlW(A@%9}d07pYZ`!~P9=e!!N287#!Y1OVa^UmUDLK%~5Cl6o-&fa*2b z`1pIJQBVNv4)XM}^6YoC~fig)@tmi{iE*OY>ap=(DIr&0H zEV{iQRy5-sgdU@chagHd`qjzoBOAbtea?9*1qX`AI9Pf_*tqfbXb(@|?Q&*lH8F=O z#B9FLB3C><3jw43-2etCXlJDF;ao_x`{}ZxUH_0M{R=%yi?_*x|jn z>?Lo+sv3kk>tQ<38PNgL?B&HW_eBBf5rqX?K}k{KBp61MTU* zUr6vUb`3pD9a?&Ig#iJy+1cLVN}#59cGUf7AQ2VoL~bb|EcbK+6+n%NX<_W=>z8t9 z_2Ka#d`6<~YmE7zzYk}oLx&?;QWW1|;JlHTKJ`D2E7c_KPkoaG;M=O1s_maY;rjZ!fI}6| ztePxJo=N8KdxXFOWx``RGR|vYI!KRL*W`@-YK+MLf|EXb=A`u(lzJdpd zV`HM}6vbZ#sj(F}8pt#}ur{1O~ zHRE#ig)n{JsQBT^l+p2Frlt@RAgK;<`fAmRQw4BBmpgpO3Wa$19XW_;HRQ{eU zD-V`JRXG=m0wm$kyZwAoolcLjzaQDtxHa zMf~p}`L=<6>II}AKxz9vz|g?1(=UXw&Wo}9qa3V$VCdsW^qLrdZ=>Eh$~*GZ5Go=z zJ@krl7b%_qyt5!pkQRfpR1I%}1*F__<2+J)SZ_3&D(~!9)XJxjYI3j<3oYL9Y_ykY zdx(OHyo>|L7LIanOr2z+Pj01zxsq2Tx94{Nyrivh$f_*+IvIAfC`WGw#BO7waA8^E zbuz_SF;93$&`0`v2n*Y~N{TZhT|H)qI1;cqZKLYCwwz=3@ek#NYVesCs>{{ql0~CX zfKUw5&Ta4mMQR+eTD)?8*=>V;Py(&ALyP-isMBs(R z+zJYjCdGqggck=am4NKXgpmDZ{^y97td)S4-bdA3i+A?)9P$#dARqwWP%Q!A^Em>r zJUPBie^^I{Z$CQ((o-RY2ap0h$Og-U&W}pi!763svD+t<`34lXOA>_!JqM8=ul1>nyu=tT-;@S9k4J{q5*~(6d ze{zcmBrH3tE<%;v!ppx*=Ljq^zQUdmCXdo01J}9=(VDh!sK22m;F_WtW*F)+9Is1D zS%4zP6V-=W>W%w3J{oy=4B`C+2-&EG_GjV35Vo(!gaC5;+4#4f&(MRsaHuW|KmhVS znf|*=GW(AZtOJ&RhC)+)V+MMJp~s-{8WH%r7XMqU9#~v-K{N{cs2alCC26FlWZ+j2 z8QA>yk{c1wV}@_1lR&-2iYnt(1@mRu>#mEapcud8i?IT4gJ{eTS2lqq6fK?i66Ckl8W z2guTRplt-n@%*_xAfy#4G3q5= zg~7#t^q0;-g!=ZL8Q=xyV|D}-wvRvp&wu6}Dg#ojRKsA>L!U;P|1eptwj}~%hB)As!-z;%fttz8^5C}4!^Jj4A?fjA$A0H*JjcS?Uy fYQ*5>z$qb@N|Nz=Sph}3uK-m=O@$(Pix>X~8SJ0; literal 0 HcmV?d00001 diff --git a/app/javascript/dashboard/components/widgets/ChannelItem.vue b/app/javascript/dashboard/components/widgets/ChannelItem.vue index 37b82436e..8e9f1455e 100644 --- a/app/javascript/dashboard/components/widgets/ChannelItem.vue +++ b/app/javascript/dashboard/components/widgets/ChannelItem.vue @@ -37,8 +37,12 @@ src="~dashboard/assets/images/channels/website.png" /> +

{{ channel.name }} @@ -72,7 +76,7 @@ export default { if (key === 'email') { return this.enabledFeatures.channel_email; } - return ['website', 'twilio', 'api'].includes(key); + return ['website', 'twilio', 'api', 'whatsapp', 'sms'].includes(key); }, }, methods: { diff --git a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json index 24463aac8..74203a4bb 100644 --- a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json @@ -126,6 +126,14 @@ "API": { "ERROR_MESSAGE": "We were not able to authenticate Twilio credentials, please try again" } + }, + "SMS": { + "TITLE": "SMS Channel via Twilio", + "DESC": "Start supporting your customers via SMS with Twilio integration." + }, + "WHATSAPP": { + "TITLE": "Whatsapp Channel via Twilio", + "DESC": "Start supporting your customers via Whatsapp with Twilio integration." }, "API_CHANNEL": { "TITLE": "API Channel", diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/ChannelList.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/ChannelList.vue index ce19b918e..0ee3b8f03 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/ChannelList.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/ChannelList.vue @@ -42,7 +42,8 @@ export default { { key: 'website', name: 'Website' }, { key: 'facebook', name: 'Facebook' }, { key: 'twitter', name: 'Twitter' }, - { key: 'twilio', name: 'Twilio' }, + { key: 'whatsapp', name: 'WhatsApp via Twilio' }, + { key: 'sms', name: 'SMS via Twilio' }, { key: 'email', name: 'Email' }, { key: 'api', diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channel-factory.js b/app/javascript/dashboard/routes/dashboard/settings/inbox/channel-factory.js index 47c4e4e6e..0cf37f148 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channel-factory.js +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channel-factory.js @@ -1,17 +1,19 @@ import Facebook from './channels/Facebook'; import Website from './channels/Website'; import Twitter from './channels/Twitter'; -import Twilio from './channels/Twilio'; import Api from './channels/Api'; import Email from './channels/Email'; +import Sms from './channels/Sms'; +import Whatsapp from './channels/Whatsapp'; const channelViewList = { facebook: Facebook, website: Website, twitter: Twitter, - twilio: Twilio, api: Api, email: Email, + sms: Sms, + whatsapp: Whatsapp, }; export default { diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Sms.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Sms.vue new file mode 100644 index 000000000..5b5c9f09c --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Sms.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue index e6d4056c1..28d132ab0 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Twilio.vue @@ -1,90 +1,72 @@ + From 15085cfb98b4ad9c82f038f76d2917c9e5b00aec Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Tue, 13 Jul 2021 11:31:21 +0530 Subject: [PATCH 50/69] feat: Conversation transcript in widget (#2549) --- app/javascript/shared/components/Button.vue | 4 ++ app/javascript/shared/constants/busEvents.js | 2 +- app/javascript/widget/api/conversation.js | 7 ++ .../widget/assets/scss/_variables.scss | 1 + app/javascript/widget/components/Banner.vue | 48 ++++++++++++++ .../widget/components/ChatAttachment.vue | 11 +++- .../widget/components/ChatFooter.vue | 66 ++++++++++++++----- app/javascript/widget/i18n/locale/en.json | 5 ++ .../widget/store/modules/message.js | 12 ++-- .../modules/specs/message/actions.spec.js | 38 +++++++++++ .../modules/specs/message/getters.spec.js | 14 ++++ .../modules/specs/message/mutations.spec.js | 11 ++++ app/javascript/widget/views/Home.vue | 27 +------- 13 files changed, 200 insertions(+), 46 deletions(-) create mode 100644 app/javascript/widget/components/Banner.vue create mode 100644 app/javascript/widget/store/modules/specs/message/actions.spec.js create mode 100644 app/javascript/widget/store/modules/specs/message/getters.spec.js create mode 100644 app/javascript/widget/store/modules/specs/message/mutations.spec.js diff --git a/app/javascript/shared/components/Button.vue b/app/javascript/shared/components/Button.vue index 1f099b04e..051c42eba 100644 --- a/app/javascript/shared/components/Button.vue +++ b/app/javascript/shared/components/Button.vue @@ -26,6 +26,10 @@ export default { computed: { buttonClassName() { let className = 'text-white py-3 px-4 rounded shadow-sm'; + if (this.type === 'clear') { + className = 'flex mx-auto mt-4 text-xs w-auto text-black-600'; + } + if (this.type === 'blue' && !Object.keys(this.buttonStyles).length) { className = `${className} bg-woot-500 hover:bg-woot-700`; } diff --git a/app/javascript/shared/constants/busEvents.js b/app/javascript/shared/constants/busEvents.js index 6958f755f..f868e5734 100644 --- a/app/javascript/shared/constants/busEvents.js +++ b/app/javascript/shared/constants/busEvents.js @@ -1,6 +1,6 @@ export const BUS_EVENTS = { SET_REFERRER_HOST: 'SET_REFERRER_HOST', SET_TWEET_REPLY: 'SET_TWEET_REPLY', - ATTACHMENT_SIZE_CHECK_ERROR: 'ATTACHMENT_SIZE_CHECK_ERROR', + SHOW_ALERT: 'SHOW_ALERT', START_NEW_CONVERSATION: 'START_NEW_CONVERSATION', }; diff --git a/app/javascript/widget/api/conversation.js b/app/javascript/widget/api/conversation.js index f22cf8ed9..3552765c7 100755 --- a/app/javascript/widget/api/conversation.js +++ b/app/javascript/widget/api/conversation.js @@ -42,6 +42,12 @@ const setUserLastSeenAt = async ({ lastSeen }) => { { contact_last_seen_at: lastSeen } ); }; +const sendEmailTranscript = async ({ email }) => { + return API.post( + `/api/v1/widget/conversations/transcript${window.location.search}`, + { email } + ); +}; export { createConversationAPI, @@ -51,4 +57,5 @@ export { sendAttachmentAPI, toggleTyping, setUserLastSeenAt, + sendEmailTranscript, }; diff --git a/app/javascript/widget/assets/scss/_variables.scss b/app/javascript/widget/assets/scss/_variables.scss index c47e4a8df..8840c0263 100755 --- a/app/javascript/widget/assets/scss/_variables.scss +++ b/app/javascript/widget/assets/scss/_variables.scss @@ -49,6 +49,7 @@ $color-white: #fff; $color-body: #3c4858; $color-heading: #1f2d3d; $color-error: #ff382d; +$color-success: #44ce4b; // Color-palettes diff --git a/app/javascript/widget/components/Banner.vue b/app/javascript/widget/components/Banner.vue new file mode 100644 index 000000000..d07266745 --- /dev/null +++ b/app/javascript/widget/components/Banner.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/app/javascript/widget/components/ChatAttachment.vue b/app/javascript/widget/components/ChatAttachment.vue index 4c872939c..3a8dc1950 100755 --- a/app/javascript/widget/components/ChatAttachment.vue +++ b/app/javascript/widget/components/ChatAttachment.vue @@ -29,6 +29,11 @@ export default { data() { return { isUploading: false }; }, + computed: { + fileUploadSizeLimit() { + return MAXIMUM_FILE_UPLOAD_SIZE; + }, + }, methods: { getFileType(fileType) { return fileType.includes('image') ? 'image' : 'file'; @@ -47,7 +52,11 @@ export default { thumbUrl, }); } else { - window.bus.$emit(BUS_EVENTS.ATTACHMENT_SIZE_CHECK_ERROR); + window.bus.$emit(BUS_EVENTS.SHOW_ALERT, { + message: this.$t('FILE_SIZE_LIMIT', { + MAXIMUM_FILE_UPLOAD_SIZE: this.fileUploadSizeLimit, + }), + }); } } catch (error) { // Error diff --git a/app/javascript/widget/components/ChatFooter.vue b/app/javascript/widget/components/ChatFooter.vue index 75d64cae2..3deaf06db 100755 --- a/app/javascript/widget/components/ChatFooter.vue +++ b/app/javascript/widget/components/ChatFooter.vue @@ -1,20 +1,31 @@ diff --git a/app/javascript/widget/i18n/locale/en.json b/app/javascript/widget/i18n/locale/en.json index bbb43acfa..2f1c50762 100644 --- a/app/javascript/widget/i18n/locale/en.json +++ b/app/javascript/widget/i18n/locale/en.json @@ -62,5 +62,10 @@ "TITLE": "Rate your conversation", "SUBMITTED_TITLE": "Thank you for submitting the rating", "PLACEHOLDER": "Tell us more..." + }, + "EMAIL_TRANSCRIPT": { + "BUTTON_TEXT": "Request a conversation transcript", + "SEND_EMAIL_SUCCESS": "The chat transcript was sent successfully", + "SEND_EMAIL_ERROR": "There was an error, please try again" } } diff --git a/app/javascript/widget/store/modules/message.js b/app/javascript/widget/store/modules/message.js index 839305d03..b11c5cdd4 100644 --- a/app/javascript/widget/store/modules/message.js +++ b/app/javascript/widget/store/modules/message.js @@ -7,12 +7,15 @@ const state = { }, }; -const getters = { +export const getters = { getUIFlags: $state => $state.uiFlags, }; -const actions = { - update: async ({ commit }, { email, messageId, submittedValues }) => { +export const actions = { + update: async ( + { commit, dispatch }, + { email, messageId, submittedValues } + ) => { commit('toggleUpdateStatus', true); try { const { @@ -33,6 +36,7 @@ const actions = { }, { root: true } ); + dispatch('contacts/get', {}, { root: true }); refreshActionCableConnector(pubsubToken); } catch (error) { // Ignore error @@ -41,7 +45,7 @@ const actions = { }, }; -const mutations = { +export const mutations = { toggleUpdateStatus($state, status) { $state.uiFlags.isUpdating = status; }, diff --git a/app/javascript/widget/store/modules/specs/message/actions.spec.js b/app/javascript/widget/store/modules/specs/message/actions.spec.js new file mode 100644 index 000000000..36e4341ef --- /dev/null +++ b/app/javascript/widget/store/modules/specs/message/actions.spec.js @@ -0,0 +1,38 @@ +import { API } from 'widget/helpers/axios'; +import { actions } from '../../message'; + +const commit = jest.fn(); +jest.mock('widget/helpers/axios'); + +describe('#actions', () => { + describe('#update', () => { + it('sends correct actions', async () => { + const user = { + email: 'john@acme.inc', + messageId: 10, + submittedValues: { + email: 'john@acme.inc', + }, + }; + API.patch.mockResolvedValue({ + data: { contact: { pubsub_token: '8npuMUfDgizrwVoqcK1t7FMY' } }, + }); + await actions.update({ commit }, user); + expect(commit.mock.calls).toEqual([ + ['toggleUpdateStatus', true], + [ + 'conversation/updateMessage', + { + id: 10, + content_attributes: { + submitted_email: 'john@acme.inc', + submitted_values: null, + }, + }, + { root: true }, + ], + ['toggleUpdateStatus', false], + ]); + }); + }); +}); diff --git a/app/javascript/widget/store/modules/specs/message/getters.spec.js b/app/javascript/widget/store/modules/specs/message/getters.spec.js new file mode 100644 index 000000000..400690f4d --- /dev/null +++ b/app/javascript/widget/store/modules/specs/message/getters.spec.js @@ -0,0 +1,14 @@ +import { getters } from '../../message'; + +describe('#getters', () => { + it('getUIFlags', () => { + const state = { + uiFlags: { + isUpdating: false, + }, + }; + expect(getters.getUIFlags(state)).toEqual({ + isUpdating: false, + }); + }); +}); diff --git a/app/javascript/widget/store/modules/specs/message/mutations.spec.js b/app/javascript/widget/store/modules/specs/message/mutations.spec.js new file mode 100644 index 000000000..3c7e6b30d --- /dev/null +++ b/app/javascript/widget/store/modules/specs/message/mutations.spec.js @@ -0,0 +1,11 @@ +import { mutations } from '../../message'; + +describe('#mutations', () => { + describe('#toggleUpdateStatus', () => { + it('set update flags', () => { + const state = { uiFlags: { status: '' } }; + mutations.toggleUpdateStatus(state, 'sent'); + expect(state.uiFlags.isUpdating).toEqual('sent'); + }); + }); +}); diff --git a/app/javascript/widget/views/Home.vue b/app/javascript/widget/views/Home.vue index 539d12922..c8d89cbe2 100755 --- a/app/javascript/widget/views/Home.vue +++ b/app/javascript/widget/views/Home.vue @@ -34,15 +34,7 @@ />

- +
{ - this.showAttachmentError = true; - setTimeout(() => { - this.showAttachmentError = false; - }, 3000); - }); bus.$on(BUS_EVENTS.START_NEW_CONVERSATION, () => { this.isOnCollapsedView = true; this.isOnNewConversation = true; @@ -242,13 +229,5 @@ export default { .input-wrap { padding: 0 $space-normal; } - .banner { - background: $color-error; - color: $color-white; - font-size: $font-size-default; - font-weight: $font-weight-bold; - padding: $space-slab; - text-align: center; - } } From deb45135849d069acb3d23f1bf01289fa2ed3a3f Mon Sep 17 00:00:00 2001 From: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com> Date: Tue, 13 Jul 2021 12:00:29 +0530 Subject: [PATCH 51/69] bug: Fixes alignment issue with deleted messages (#2613) --- .../widgets/conversation/Message.vue | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/app/javascript/dashboard/components/widgets/conversation/Message.vue b/app/javascript/dashboard/components/widgets/conversation/Message.vue index 3ea6ad1f7..1fce9bccf 100644 --- a/app/javascript/dashboard/components/widgets/conversation/Message.vue +++ b/app/javascript/dashboard/components/widgets/conversation/Message.vue @@ -61,15 +61,17 @@
- +
+ +
+ From b7806fc210fda02a3a00e34fa11d7c0a06a55c48 Mon Sep 17 00:00:00 2001 From: Pranav Raj S Date: Tue, 13 Jul 2021 18:54:33 +0530 Subject: [PATCH 54/69] fix: Update styles to fix the image resolution on smaller devices (#2618) --- .../assets/scss/views/settings/channel.scss | 13 ++++++------- .../dashboard/components/widgets/ChannelItem.vue | 2 +- .../dashboard/i18n/locale/en/inboxMgmt.json | 4 ++-- .../routes/dashboard/settings/inbox/ChannelList.vue | 7 ++++++- .../dashboard/settings/inbox/InboxChannels.vue | 2 +- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/javascript/dashboard/assets/scss/views/settings/channel.scss b/app/javascript/dashboard/assets/scss/views/settings/channel.scss index 80400bb71..c22888ba5 100644 --- a/app/javascript/dashboard/assets/scss/views/settings/channel.scss +++ b/app/javascript/dashboard/assets/scss/views/settings/channel.scss @@ -8,12 +8,12 @@ .channel { @include flex; @include padding($space-normal $zero); - @include margin($zero); @include background-white; @include border-light; - flex-direction: column; + cursor: pointer; - border-right-color: $color-white; + flex-direction: column; + margin: -1px; transition: all 0.200s ease-in; &:last-child { @@ -32,14 +32,13 @@ img { @include margin($space-normal auto); - flex: 1; width: 50%; } - .channel__title{ - font-size: $font-size-large; - text-align: center; + .channel__title { color: $color-body; + font-size: var(--font-size-default); + text-align: center; text-transform: capitalize; } diff --git a/app/javascript/dashboard/components/widgets/ChannelItem.vue b/app/javascript/dashboard/components/widgets/ChannelItem.vue index 8e9f1455e..e612fa14b 100644 --- a/app/javascript/dashboard/components/widgets/ChannelItem.vue +++ b/app/javascript/dashboard/components/widgets/ChannelItem.vue @@ -1,6 +1,6 @@