Merge branch 'develop' into chore/rename_private

This commit is contained in:
Sojan Jose 2021-05-24 12:50:18 +05:30 committed by GitHub
commit 2414b19835
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
549 changed files with 13168 additions and 2510 deletions

View file

@ -30,3 +30,6 @@ exclude_patterns:
- "**/*.md" - "**/*.md"
- "**/*.yml" - "**/*.yml"
- "app/javascript/dashboard/i18n/locale" - "app/javascript/dashboard/i18n/locale"
- "stories/**/*"
- "**/*.stories.js"
- "**/stories/"

View file

@ -1,5 +1,6 @@
{ {
"printWidth": 80, "printWidth": 80,
"singleQuote": true, "singleQuote": true,
"trailingComma": "es5" "trailingComma": "es5",
"arrowParens": "avoid"
} }

View file

@ -101,6 +101,7 @@ Rails/BulkChangeTable:
- 'db/migrate/20170511134418_latlong.rb' - 'db/migrate/20170511134418_latlong.rb'
- 'db/migrate/20191027054756_create_contact_inboxes.rb' - 'db/migrate/20191027054756_create_contact_inboxes.rb'
- 'db/migrate/20191130164019_add_template_type_to_messages.rb' - 'db/migrate/20191130164019_add_template_type_to_messages.rb'
- 'db/migrate/20210425093724_convert_integration_hook_settings_field.rb'
Rails/UniqueValidationWithoutIndex: Rails/UniqueValidationWithoutIndex:
Exclude: Exclude:
- 'app/models/channel/twitter_profile.rb' - 'app/models/channel/twitter_profile.rb'

View file

@ -8,8 +8,7 @@ const custom = require('../config/webpack/environment');
module.exports = { module.exports = {
stories: [ stories: [
'../stories/**/*.stories.mdx', '../stories/**/*.stories.mdx',
'../app/javascript/dashboard/components/ui/stories/**/*.stories.@(js|jsx|ts|tsx)', '../app/javascript/**/*.stories.@(js|jsx|ts|tsx)',
'../stories/**/*.stories.@(js|jsx|ts|tsx)',
], ],
addons: [ addons: [
{ {

View file

@ -2,6 +2,7 @@ import { addDecorator } from '@storybook/vue';
import Vue from 'vue'; import Vue from 'vue';
import Vuex from 'vuex'; import Vuex from 'vuex';
import VueI18n from 'vue-i18n'; import VueI18n from 'vue-i18n';
import Vuelidate from 'vuelidate';
import WootUiKit from '../app/javascript/dashboard/components'; import WootUiKit from '../app/javascript/dashboard/components';
import i18n from '../app/javascript/dashboard/i18n'; import i18n from '../app/javascript/dashboard/i18n';
@ -9,6 +10,7 @@ import i18n from '../app/javascript/dashboard/i18n';
import '../app/javascript/dashboard/assets/scss/storybook.scss'; import '../app/javascript/dashboard/assets/scss/storybook.scss';
Vue.use(VueI18n); Vue.use(VueI18n);
Vue.use(Vuelidate);
Vue.use(WootUiKit); Vue.use(WootUiKit);
Vue.use(Vuex); Vue.use(Vuex);

View file

@ -31,6 +31,8 @@ gem 'haikunator'
gem 'liquid' gem 'liquid'
# Parse Markdown to HTML # Parse Markdown to HTML
gem 'commonmarker' gem 'commonmarker'
# Validate Data against JSON Schema
gem 'json_schemer'
##-- for active storage --## ##-- for active storage --##
gem 'aws-sdk-s3', require: false gem 'aws-sdk-s3', require: false
@ -80,6 +82,8 @@ gem 'twitty'
gem 'koala' gem 'koala'
# slack client # slack client
gem 'slack-ruby-client' gem 'slack-ruby-client'
# for dialogflow integrations
gem 'google-cloud-dialogflow'
##--- gems for debugging and error reporting ---## ##--- gems for debugging and error reporting ---##
# static analysis # static analysis
@ -105,6 +109,8 @@ gem 'maxminddb'
# to create db triggers # to create db triggers
gem 'hairtrigger' gem 'hairtrigger'
gem 'procore-sift'
group :development do group :development do
gem 'annotate' gem 'annotate'
gem 'bullet' gem 'bullet'
@ -112,7 +118,7 @@ group :development do
gem 'web-console' gem 'web-console'
# used in swagger build # used in swagger build
gem 'json_refs', git: 'https://github.com/tzmfreedom/json_refs', ref: 'e32deb0' gem 'json_refs', git: 'https://github.com/tzmfreedom/json_refs', ref: '131b11294fd6af9c428171f38516e6222a58c874'
# When we want to squash migrations # When we want to squash migrations
gem 'squasher' gem 'squasher'

View file

@ -7,10 +7,10 @@ GIT
GIT GIT
remote: https://github.com/tzmfreedom/json_refs remote: https://github.com/tzmfreedom/json_refs
revision: e32deb073ce9aef39bdd63556bffd7fe7c2a803d revision: 131b11294fd6af9c428171f38516e6222a58c874
ref: e32deb0 ref: 131b11294fd6af9c428171f38516e6222a58c874
specs: specs:
json_refs (0.1.2) json_refs (0.1.6)
hana hana
GEM GEM
@ -18,58 +18,58 @@ GEM
specs: specs:
action-cable-testing (0.6.1) action-cable-testing (0.6.1)
actioncable (>= 5.0) actioncable (>= 5.0)
actioncable (6.0.3.6) actioncable (6.0.3.7)
actionpack (= 6.0.3.6) actionpack (= 6.0.3.7)
nio4r (~> 2.0) nio4r (~> 2.0)
websocket-driver (>= 0.6.1) websocket-driver (>= 0.6.1)
actionmailbox (6.0.3.6) actionmailbox (6.0.3.7)
actionpack (= 6.0.3.6) actionpack (= 6.0.3.7)
activejob (= 6.0.3.6) activejob (= 6.0.3.7)
activerecord (= 6.0.3.6) activerecord (= 6.0.3.7)
activestorage (= 6.0.3.6) activestorage (= 6.0.3.7)
activesupport (= 6.0.3.6) activesupport (= 6.0.3.7)
mail (>= 2.7.1) mail (>= 2.7.1)
actionmailer (6.0.3.6) actionmailer (6.0.3.7)
actionpack (= 6.0.3.6) actionpack (= 6.0.3.7)
actionview (= 6.0.3.6) actionview (= 6.0.3.7)
activejob (= 6.0.3.6) activejob (= 6.0.3.7)
mail (~> 2.5, >= 2.5.4) mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
actionpack (6.0.3.6) actionpack (6.0.3.7)
actionview (= 6.0.3.6) actionview (= 6.0.3.7)
activesupport (= 6.0.3.6) activesupport (= 6.0.3.7)
rack (~> 2.0, >= 2.0.8) rack (~> 2.0, >= 2.0.8)
rack-test (>= 0.6.3) rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (6.0.3.6) actiontext (6.0.3.7)
actionpack (= 6.0.3.6) actionpack (= 6.0.3.7)
activerecord (= 6.0.3.6) activerecord (= 6.0.3.7)
activestorage (= 6.0.3.6) activestorage (= 6.0.3.7)
activesupport (= 6.0.3.6) activesupport (= 6.0.3.7)
nokogiri (>= 1.8.5) nokogiri (>= 1.8.5)
actionview (6.0.3.6) actionview (6.0.3.7)
activesupport (= 6.0.3.6) activesupport (= 6.0.3.7)
builder (~> 3.1) builder (~> 3.1)
erubi (~> 1.4) erubi (~> 1.4)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0)
activejob (6.0.3.6) activejob (6.0.3.7)
activesupport (= 6.0.3.6) activesupport (= 6.0.3.7)
globalid (>= 0.3.6) globalid (>= 0.3.6)
activemodel (6.0.3.6) activemodel (6.0.3.7)
activesupport (= 6.0.3.6) activesupport (= 6.0.3.7)
activerecord (6.0.3.6) activerecord (6.0.3.7)
activemodel (= 6.0.3.6) activemodel (= 6.0.3.7)
activesupport (= 6.0.3.6) activesupport (= 6.0.3.7)
activerecord-import (1.0.7) activerecord-import (1.0.7)
activerecord (>= 3.2) activerecord (>= 3.2)
activestorage (6.0.3.6) activestorage (6.0.3.7)
actionpack (= 6.0.3.6) actionpack (= 6.0.3.7)
activejob (= 6.0.3.6) activejob (= 6.0.3.7)
activerecord (= 6.0.3.6) activerecord (= 6.0.3.7)
marcel (~> 1.0.0) marcel (~> 1.0.0)
activesupport (6.0.3.6) activesupport (6.0.3.7)
concurrent-ruby (~> 1.0, >= 1.0.2) concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2) i18n (>= 0.7, < 2)
minitest (~> 5.1) minitest (~> 5.1)
@ -79,11 +79,10 @@ GEM
activerecord (>= 5.0, < 6.1) activerecord (>= 5.0, < 6.1)
addressable (2.7.0) addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0) public_suffix (>= 2.0.2, < 5.0)
administrate (0.14.0) administrate (0.16.0)
actionpack (>= 4.2) actionpack (>= 5.0)
actionview (>= 4.2) actionview (>= 5.0)
activerecord (>= 4.2) activerecord (>= 5.0)
autoprefixer-rails (>= 6.0)
datetime_picker_rails (~> 0.0.7) datetime_picker_rails (~> 0.0.7)
jquery-rails (>= 4.0) jquery-rails (>= 4.0)
kaminari (>= 1.0) kaminari (>= 1.0)
@ -95,8 +94,6 @@ GEM
rake (>= 10.4, < 14.0) rake (>= 10.4, < 14.0)
ast (2.4.1) ast (2.4.1)
attr_extras (6.2.4) attr_extras (6.2.4)
autoprefixer-rails (9.8.6.3)
execjs
aws-eventstream (1.1.0) aws-eventstream (1.1.0)
aws-partitions (1.360.0) aws-partitions (1.360.0)
aws-sdk-core (3.105.0) aws-sdk-core (3.105.0)
@ -184,6 +181,8 @@ GEM
dotenv-rails (2.7.6) dotenv-rails (2.7.6)
dotenv (= 2.7.6) dotenv (= 2.7.6)
railties (>= 3.2) railties (>= 3.2)
ecma-re-validator (0.2.1)
regexp_parser (~> 1.2)
equalizer (0.0.11) equalizer (0.0.11)
erubi (1.10.0) erubi (1.10.0)
et-orbi (1.2.4) et-orbi (1.2.4)
@ -205,12 +204,18 @@ GEM
faraday (~> 1.0) faraday (~> 1.0)
fcm (1.0.2) fcm (1.0.2)
faraday (~> 1.0.0) faraday (~> 1.0.0)
ffi (1.14.2) ffi (1.15.0)
flag_shih_tzu (0.3.23) flag_shih_tzu (0.3.23)
foreman (0.87.2) foreman (0.87.2)
fugit (1.4.1) fugit (1.4.1)
et-orbi (~> 1.1, >= 1.1.8) et-orbi (~> 1.1, >= 1.1.8)
raabro (~> 1.4) raabro (~> 1.4)
gapic-common (0.3.4)
google-protobuf (~> 3.12, >= 3.12.2)
googleapis-common-protos (>= 1.3.9, < 2.0)
googleapis-common-protos-types (>= 1.0.4, < 2.0)
googleauth (~> 0.9)
grpc (~> 1.25)
geocoder (1.6.3) geocoder (1.6.3)
gli (2.19.2) gli (2.19.2)
globalid (0.4.2) globalid (0.4.2)
@ -223,12 +228,18 @@ GEM
representable (~> 3.0) representable (~> 3.0)
retriable (>= 2.0, < 4.0) retriable (>= 2.0, < 4.0)
signet (~> 0.12) signet (~> 0.12)
google-cloud-core (1.5.0) google-cloud-core (1.6.0)
google-cloud-env (~> 1.0) google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0) google-cloud-errors (~> 1.0)
google-cloud-env (1.3.3) google-cloud-dialogflow (1.2.0)
google-cloud-core (~> 1.5)
google-cloud-dialogflow-v2 (~> 0.1)
google-cloud-dialogflow-v2 (0.6.4)
gapic-common (~> 0.3)
google-cloud-errors (~> 1.0)
google-cloud-env (1.5.0)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.3, < 2.0)
google-cloud-errors (1.0.1) google-cloud-errors (1.1.0)
google-cloud-storage (1.28.0) google-cloud-storage (1.28.0)
addressable (~> 2.5) addressable (~> 2.5)
digest-crc (~> 0.4) digest-crc (~> 0.4)
@ -236,7 +247,14 @@ GEM
google-cloud-core (~> 1.2) google-cloud-core (~> 1.2)
googleauth (~> 0.9) googleauth (~> 0.9)
mini_mime (~> 1.0) mini_mime (~> 1.0)
googleauth (0.13.1) google-protobuf (3.15.8)
googleapis-common-protos (1.3.11)
google-protobuf (~> 3.14)
googleapis-common-protos-types (>= 1.0.6, < 2.0)
grpc (~> 1.27)
googleapis-common-protos-types (1.0.6)
google-protobuf (~> 3.14)
googleauth (0.16.2)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.3, < 2.0)
jwt (>= 1.4, < 3.0) jwt (>= 1.4, < 3.0)
memoist (~> 0.16) memoist (~> 0.16)
@ -245,12 +263,15 @@ GEM
signet (~> 0.14) signet (~> 0.14)
groupdate (5.1.0) groupdate (5.1.0)
activesupport (>= 5) activesupport (>= 5)
grpc (1.37.1)
google-protobuf (~> 3.15)
googleapis-common-protos-types (~> 1.0)
haikunator (1.1.0) haikunator (1.1.0)
hairtrigger (0.2.23) hairtrigger (0.2.23)
activerecord (>= 5.0, < 7) activerecord (>= 5.0, < 7)
ruby2ruby (~> 2.4) ruby2ruby (~> 2.4)
ruby_parser (~> 3.10) ruby_parser (~> 3.10)
hana (1.3.6) hana (1.3.7)
hashdiff (1.0.1) hashdiff (1.0.1)
hashie (4.1.0) hashie (4.1.0)
hkdf (0.3.0) hkdf (0.3.0)
@ -261,7 +282,7 @@ GEM
mime-types (~> 3.0) mime-types (~> 3.0)
multi_xml (>= 0.5.2) multi_xml (>= 0.5.2)
httpclient (2.8.3) httpclient (2.8.3)
i18n (1.8.9) i18n (1.8.10)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
ice_nine (0.11.2) ice_nine (0.11.2)
inflecto (0.0.2) inflecto (0.0.2)
@ -273,7 +294,12 @@ GEM
railties (>= 4.2.0) railties (>= 4.2.0)
thor (>= 0.14, < 2.0) thor (>= 0.14, < 2.0)
json (2.3.1) json (2.3.1)
jwt (2.2.2) json_schemer (0.2.16)
ecma-re-validator (~> 0.2)
hana (~> 1.3)
regexp_parser (~> 1.5)
uri_template (~> 0.7)
jwt (2.2.3)
kaminari (1.2.1) kaminari (1.2.1)
activesupport (>= 4.1.0) activesupport (>= 4.1.0)
kaminari-actionview (= 1.2.1) kaminari-actionview (= 1.2.1)
@ -298,12 +324,12 @@ GEM
listen (3.3.3) listen (3.3.3)
rb-fsevent (~> 0.10, >= 0.10.3) rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10) rb-inotify (~> 0.9, >= 0.9.10)
loofah (2.9.0) loofah (2.9.1)
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.5.9) nokogiri (>= 1.5.9)
mail (2.7.1) mail (2.7.1)
mini_mime (>= 0.1.1) mini_mime (>= 0.1.1)
marcel (1.0.0) marcel (1.0.1)
maxminddb (0.1.22) maxminddb (0.1.22)
memoist (0.16.2) memoist (0.16.2)
method_source (1.0.0) method_source (1.0.0)
@ -311,8 +337,8 @@ GEM
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
mime-types-data (3.2020.0512) mime-types-data (3.2020.0512)
mini_magick (4.10.1) mini_magick (4.10.1)
mini_mime (1.0.3) mini_mime (1.1.0)
mini_portile2 (2.5.0) mini_portile2 (2.5.1)
minitest (5.14.4) minitest (5.14.4)
momentjs-rails (2.20.1) momentjs-rails (2.20.1)
railties (>= 3.1) railties (>= 3.1)
@ -324,7 +350,7 @@ GEM
connection_pool (~> 2.2) connection_pool (~> 2.2)
netrc (0.11.0) netrc (0.11.0)
nio4r (2.5.7) nio4r (2.5.7)
nokogiri (1.11.2) nokogiri (1.11.4)
mini_portile2 (~> 2.5.0) mini_portile2 (~> 2.5.0)
racc (~> 1.4) racc (~> 1.4)
oauth (0.5.6) oauth (0.5.6)
@ -334,13 +360,15 @@ GEM
parser (2.7.1.4) parser (2.7.1.4)
ast (~> 2.4.1) ast (~> 2.4.1)
pg (1.2.3) pg (1.2.3)
procore-sift (0.15.0)
rails (> 4.2.0)
pry (0.13.1) pry (0.13.1)
coderay (~> 1.1) coderay (~> 1.1)
method_source (~> 1.0) method_source (~> 1.0)
pry-rails (0.3.9) pry-rails (0.3.9)
pry (>= 0.10.4) pry (>= 0.10.4)
public_suffix (4.0.5) public_suffix (4.0.6)
puma (4.3.6) puma (4.3.8)
nio4r (~> 2.0) nio4r (~> 2.0)
pundit (2.1.0) pundit (2.1.0)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
@ -355,29 +383,29 @@ GEM
rack rack
rack-test (1.1.0) rack-test (1.1.0)
rack (>= 1.0, < 3) rack (>= 1.0, < 3)
rails (6.0.3.6) rails (6.0.3.7)
actioncable (= 6.0.3.6) actioncable (= 6.0.3.7)
actionmailbox (= 6.0.3.6) actionmailbox (= 6.0.3.7)
actionmailer (= 6.0.3.6) actionmailer (= 6.0.3.7)
actionpack (= 6.0.3.6) actionpack (= 6.0.3.7)
actiontext (= 6.0.3.6) actiontext (= 6.0.3.7)
actionview (= 6.0.3.6) actionview (= 6.0.3.7)
activejob (= 6.0.3.6) activejob (= 6.0.3.7)
activemodel (= 6.0.3.6) activemodel (= 6.0.3.7)
activerecord (= 6.0.3.6) activerecord (= 6.0.3.7)
activestorage (= 6.0.3.6) activestorage (= 6.0.3.7)
activesupport (= 6.0.3.6) activesupport (= 6.0.3.7)
bundler (>= 1.3.0) bundler (>= 1.3.0)
railties (= 6.0.3.6) railties (= 6.0.3.7)
sprockets-rails (>= 2.0.0) sprockets-rails (>= 2.0.0)
rails-dom-testing (2.0.3) rails-dom-testing (2.0.3)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
nokogiri (>= 1.6) nokogiri (>= 1.6)
rails-html-sanitizer (1.3.0) rails-html-sanitizer (1.3.0)
loofah (~> 2.3) loofah (~> 2.3)
railties (6.0.3.6) railties (6.0.3.7)
actionpack (= 6.0.3.6) actionpack (= 6.0.3.7)
activesupport (= 6.0.3.6) activesupport (= 6.0.3.7)
method_source method_source
rake (>= 0.8.7) rake (>= 0.8.7)
thor (>= 0.20.3, < 2.0) thor (>= 0.20.3, < 2.0)
@ -489,7 +517,7 @@ GEM
sidekiq-cron (1.2.0) sidekiq-cron (1.2.0)
fugit (~> 1.1) fugit (~> 1.1)
sidekiq (>= 4.2.1) sidekiq (>= 4.2.1)
signet (0.14.0) signet (0.15.0)
addressable (~> 2.3) addressable (~> 2.3)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.3, < 2.0)
jwt (>= 1.5, < 3.0) jwt (>= 1.5, < 3.0)
@ -547,6 +575,7 @@ GEM
unf_ext (0.0.7.7) unf_ext (0.0.7.7)
unicode-display_width (1.7.0) unicode-display_width (1.7.0)
uniform_notifier (1.13.0) uniform_notifier (1.13.0)
uri_template (0.7.0)
valid_email2 (3.3.1) valid_email2 (3.3.1)
activemodel (>= 3.2) activemodel (>= 3.2)
mail (~> 2.5) mail (~> 2.5)
@ -612,6 +641,7 @@ DEPENDENCIES
flag_shih_tzu flag_shih_tzu
foreman foreman
geocoder geocoder
google-cloud-dialogflow
google-cloud-storage google-cloud-storage
groupdate groupdate
haikunator haikunator
@ -619,6 +649,7 @@ DEPENDENCIES
hashie hashie
jbuilder jbuilder
json_refs! json_refs!
json_schemer
jwt jwt
kaminari kaminari
koala koala
@ -629,6 +660,7 @@ DEPENDENCIES
mini_magick mini_magick
mock_redis! mock_redis!
pg pg
procore-sift
pry-rails pry-rails
puma puma
pundit pundit

View file

@ -0,0 +1,38 @@
class Campaigns::CampaignConversationBuilder
pattr_initialize [:contact_inbox_id!, :campaign_display_id!, :conversation_additional_attributes]
def perform
@contact_inbox = ContactInbox.find(@contact_inbox_id)
@campaign = @contact_inbox.inbox.campaigns.find_by!(display_id: campaign_display_id)
ActiveRecord::Base.transaction do
@contact_inbox.lock!
# We won't send campaigns if a conversation is already present
return if @contact_inbox.reload.conversations.present?
@conversation = ::Conversation.create!(conversation_params)
Messages::MessageBuilder.new(@campaign.sender, @conversation, message_params).perform
end
@conversation
end
private
def message_params
ActionController::Parameters.new({
content: @campaign.message
})
end
def conversation_params
{
account_id: @campaign.account_id,
inbox_id: @contact_inbox.inbox_id,
contact_id: @contact_inbox.contact_id,
contact_inbox_id: @contact_inbox.id,
campaign_id: @campaign.id,
additional_attributes: conversation_additional_attributes
}
end
end

View file

@ -23,6 +23,6 @@ class Api::V1::Accounts::CampaignsController < Api::V1::Accounts::BaseController
end end
def campaign_params def campaign_params
params.require(:campaign).permit(:title, :description, :content, :enabled, :inbox_id, :sender_id, trigger_rules: {}) params.require(:campaign).permit(:title, :description, :message, :enabled, :inbox_id, :sender_id, trigger_rules: {})
end end
end end

View file

@ -1,4 +1,11 @@
class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
include Sift
sort_on :email, type: :string
sort_on :name, type: :string
sort_on :phone_number, type: :string
sort_on :last_activity_at, type: :datetime
RESULTS_PER_PAGE = 15 RESULTS_PER_PAGE = 15
protect_from_forgery with: :null_session protect_from_forgery with: :null_session
@ -68,7 +75,6 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
@resolved_contacts ||= Current.account.contacts @resolved_contacts ||= Current.account.contacts
.where.not(email: [nil, '']) .where.not(email: [nil, ''])
.or(Current.account.contacts.where.not(phone_number: [nil, ''])) .or(Current.account.contacts.where.not(phone_number: [nil, '']))
.order('LOWER(name)')
end end
def set_current_page def set_current_page
@ -76,11 +82,11 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
end end
def fetch_contact_last_seen_at(contacts) def fetch_contact_last_seen_at(contacts)
contacts.left_outer_joins(:conversations) filtrate(contacts).left_outer_joins(:conversations)
.select('contacts.*, COUNT(conversations.id) as conversations_count, MAX(conversations.contact_last_seen_at) as last_seen_at') .select('contacts.*, COUNT(conversations.id) as conversations_count')
.group('contacts.id') .group('contacts.id')
.includes([{ avatar_attachment: [:blob] }, { contact_inboxes: [:inbox] }]) .includes([{ avatar_attachment: [:blob] }, { contact_inboxes: [:inbox] }])
.page(@current_page).per(RESULTS_PER_PAGE) .page(@current_page).per(RESULTS_PER_PAGE)
end end
def build_contact_inbox def build_contact_inbox

View file

@ -0,0 +1,31 @@
class Api::V1::Accounts::Integrations::HooksController < Api::V1::Accounts::BaseController
before_action :fetch_hook, only: [:update, :destroy]
before_action :check_authorization
def create
@hook = Current.account.hooks.create!(permitted_params)
end
def update
@hook.update!(permitted_params.slice(:status, :settings))
end
def destroy
@hook.destroy
head :ok
end
private
def fetch_hook
@hook = Current.account.hooks.find(params[:id])
end
def check_authorization
authorize(:hook)
end
def permitted_params
params.require(:hook).permit(:app_id, :inbox_id, :status, settings: {})
end
end

View file

@ -0,0 +1,13 @@
class Api::V1::Widget::CampaignsController < Api::V1::Widget::BaseController
skip_before_action :set_contact
def index
@campaigns = @web_widget.inbox.campaigns.where(enabled: true)
end
private
def permitted_params
params.permit(:website_token)
end
end

View file

@ -2,7 +2,8 @@ class Api::V1::Widget::EventsController < Api::V1::Widget::BaseController
include Events::Types include Events::Types
def create def create
Rails.configuration.dispatcher.dispatch(permitted_params[:name], Time.zone.now, contact_inbox: @contact_inbox, event_info: event_info) Rails.configuration.dispatcher.dispatch(permitted_params[:name], Time.zone.now, contact_inbox: @contact_inbox,
event_info: permitted_params[:event_info].to_h.merge(event_info))
head :no_content head :no_content
end end
@ -17,6 +18,6 @@ class Api::V1::Widget::EventsController < Api::V1::Widget::BaseController
end end
def permitted_params def permitted_params
params.permit(:name, :website_token) params.permit(:name, :website_token, event_info: {})
end end
end end

View file

@ -12,7 +12,8 @@ class AsyncDispatcher < BaseDispatcher
[ [
EventListener.instance, EventListener.instance,
WebhookListener.instance, WebhookListener.instance,
InstallationWebhookListener.instance, HookListener.instance InstallationWebhookListener.instance, HookListener.instance,
CampaignListener.instance
] ]
end end
end end

View file

@ -0,0 +1,9 @@
import ApiClient from './ApiClient';
class CampaignsAPI extends ApiClient {
constructor() {
super('campaigns', { accountScoped: true });
}
}
export default new CampaignsAPI();

View file

@ -6,8 +6,8 @@ class ContactAPI extends ApiClient {
super('contacts', { accountScoped: true }); super('contacts', { accountScoped: true });
} }
get(page) { get(page, sortAttr = 'name') {
return axios.get(`${this.url}?page=${page}`); return axios.get(`${this.url}?page=${page}&sort=${sortAttr}`);
} }
getConversations(contactId) { getConversations(contactId) {
@ -18,8 +18,10 @@ class ContactAPI extends ApiClient {
return axios.get(`${this.url}/${contactId}/contactable_inboxes`); return axios.get(`${this.url}/${contactId}/contactable_inboxes`);
} }
search(search = '', page = 1) { search(search = '', page = 1, sortAttr = 'name') {
return axios.get(`${this.url}/search?q=${search}&page=${page}`); return axios.get(
`${this.url}/search?q=${search}&page=${page}&sort=${sortAttr}`
);
} }
} }

View file

@ -9,6 +9,10 @@ class Inboxes extends ApiClient {
getAssignableAgents(inboxId) { getAssignableAgents(inboxId) {
return axios.get(`${this.url}/${inboxId}/assignable_agents`); return axios.get(`${this.url}/${inboxId}/assignable_agents`);
} }
getCampaigns(inboxId) {
return axios.get(`${this.url}/${inboxId}/campaigns`);
}
} }
export default new Inboxes(); export default new Inboxes();

View file

@ -0,0 +1,13 @@
import campaigns from '../campaigns';
import ApiClient from '../ApiClient';
describe('#CampaignAPI', () => {
it('creates correct instance', () => {
expect(campaigns).toBeInstanceOf(ApiClient);
expect(campaigns).toHaveProperty('get');
expect(campaigns).toHaveProperty('show');
expect(campaigns).toHaveProperty('create');
expect(campaigns).toHaveProperty('update');
expect(campaigns).toHaveProperty('delete');
});
});

View file

@ -5,18 +5,14 @@
&.round { &.round {
border-radius: 1000px; border-radius: 1000px;
} }
&.grey-btn {
color: $color-gray;
&:hover {
color: $color-light-gray;
}
}
} }
.label { .card {
font-weight: $font-weight-bold; padding: var(--space-small);
}
.button-wrapper .button.link.grey-btn {
margin-left: var(--space-normal);
} }
.tooltip { .tooltip {

View file

@ -238,7 +238,7 @@ $breadcrumbs-item-slash: true;
// 11. Button // 11. Button
// ---------- // ----------
$button-padding: var(--space-one) var(--space-slab); $button-padding: var(--space-smaller) 1em;
$button-margin: 0 0 $global-margin 0; $button-margin: 0 0 $global-margin 0;
$button-fill: solid; $button-fill: solid;
$button-background: $primary-color; $button-background: $primary-color;
@ -246,7 +246,7 @@ $button-background-hover: scale-color($button-background, $lightness: -15%);
$button-color: $white; $button-color: $white;
$button-color-alt: $white; $button-color-alt: $white;
$button-radius: var(--border-radius-normal); $button-radius: var(--border-radius-normal);
$button-sizes: (tiny: var(--font-size-nano), $button-sizes: (tiny: var(--font-size-micro),
small: var(--font-size-mini), small: var(--font-size-mini),
default: var(--font-size-small), default: var(--font-size-small),
large: var(--font-size-medium)); large: var(--font-size-medium));
@ -285,10 +285,10 @@ $callout-link-tint: 30%;
$card-background: $white; $card-background: $white;
$card-font-color: $body-font-color; $card-font-color: $body-font-color;
$card-divider-background: $light-gray; $card-divider-background: $light-gray;
$card-border: 1px solid $light-gray; $card-border: 1px solid var(--color-border);
$card-shadow: none; $card-shadow: var(--shadow-small);
$card-border-radius: $global-radius; $card-border-radius: var(--border-radius-normal);
$card-padding: $global-padding; $card-padding: var(--space-small);
$card-margin: $global-margin; $card-margin: $global-margin;
// 15. Close Button // 15. Close Button
@ -358,7 +358,7 @@ $form-label-font-weight: $font-weight-medium;
$form-label-line-height: 1.8; $form-label-line-height: 1.8;
$select-background: $white; $select-background: $white;
$select-triangle-color: $dark-gray; $select-triangle-color: $dark-gray;
$select-radius: $global-radius; $select-radius: var(--border-radius-normal);
$input-color: $header-color; $input-color: $header-color;
$input-placeholder-color: $light-gray; $input-placeholder-color: $light-gray;
$input-font-family: inherit; $input-font-family: inherit;
@ -374,19 +374,19 @@ $input-shadow-focus: 0;
$input-cursor-disabled: not-allowed; $input-cursor-disabled: not-allowed;
$input-transition: border-color 0.25s ease-in-out; $input-transition: border-color 0.25s ease-in-out;
$input-number-spinners: true; $input-number-spinners: true;
$input-radius: $global-radius; $input-radius: var(--border-radius-normal);
$form-button-radius: $global-radius; $form-button-radius: var(--border-radius-normal);
// 20. Label // 20. Label
// --------- // ---------
$label-background: lighten($primary-color, 40%); $label-background: $primary-color;
$label-color: $primary-color; $label-color: $white;
$label-color-alt: $black; $label-color-alt: $black;
$label-palette: $foundation-palette; $label-palette: $foundation-palette;
$label-font-size: $font-size-micro; $label-font-size: $font-size-mini;
$label-padding: $space-smaller $space-small; $label-padding: $space-smaller $space-small;
$label-radius: $space-micro; $label-radius: var(--border-radius-small);
// 21. Media Object // 21. Media Object
// ---------------- // ----------------

View file

@ -51,25 +51,6 @@
} }
} }
input,
textarea,
select {
border-radius: var(--space-smaller) !important;
}
.input-group {
.input-group-label:first-child {
border-bottom-left-radius: var(--space-smaller);
border-top-left-radius: var(--space-smaller);
}
.input-group-field {
border-bottom-left-radius: 0 !important;
border-top-left-radius: 0 !important;
}
}
.justify-space-between { .justify-space-between {
justify-content: space-between; justify-content: space-between;
} }

View file

@ -236,3 +236,11 @@ $spinner-before-border-color: rgba(255, 255, 255, 0.7);
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
@mixin three-column-grid($column-one-width: 25.6rem,
$column-three-width: 25.6rem) {
width: 100%;
height: 100%;
display: grid;
grid-template-columns: minmax($column-one-width, 6fr) 10fr minmax($column-three-width, 6fr);
}

View file

@ -1,8 +1,28 @@
@import 'shared/assets/fonts/inter';
@import 'shared/assets/stylesheets/colors';
@import 'shared/assets/stylesheets/spacing';
@import 'shared/assets/stylesheets/font-size';
@import 'shared/assets/stylesheets/font-weights';
@import 'shared/assets/stylesheets/shadows';
@import 'shared/assets/stylesheets/border-radius';
@import 'variables';
@import 'mixins';
@import 'foundation-settings';
@import 'helper-classes';
@import 'foundation-sites/scss/foundation';
@import '~bourbon/core/bourbon';
@include foundation-everything($flex: true);
@import 'typography'; @import 'typography';
@import 'layout'; @import 'layout';
@import 'animations'; @import 'animations';
@import 'foundation-custom'; @import 'foundation-custom';
@import 'widgets/buttons'; @import 'widgets/buttons';
@import 'widgets/conv-header'; @import 'widgets/conv-header';
@import 'widgets/conversation-card'; @import 'widgets/conversation-card';
@ -27,3 +47,4 @@
@import 'plugins/multiselect'; @import 'plugins/multiselect';
@import 'plugins/dropdown'; @import 'plugins/dropdown';
@import '@chatwoot/prosemirror-schema/src/woot-editor.css'; @import '@chatwoot/prosemirror-schema/src/woot-editor.css';
@import '~shared/assets/stylesheets/ionicons';

View file

@ -1,20 +1 @@
@import 'shared/assets/fonts/inter';
@import 'shared/assets/stylesheets/colors';
@import 'shared/assets/stylesheets/spacing';
@import 'shared/assets/stylesheets/font-size';
@import 'shared/assets/stylesheets/font-weights';
@import 'shared/assets/stylesheets/shadows';
@import 'shared/assets/stylesheets/border-radius';
@import 'variables';
@import '~spinkit/scss/spinners/7-three-bounce';
@import '~shared/assets/stylesheets/ionicons';
@import 'mixins';
@import 'foundation-settings';
@import 'helper-classes';
@import 'foundation-sites/scss/foundation';
@import '~bourbon/core/bourbon';
@include foundation-everything($flex: true);
@import 'woot'; @import 'woot';

View file

@ -14,6 +14,8 @@
@import 'foundation-settings'; @import 'foundation-settings';
@import 'helper-classes'; @import 'helper-classes';
@import 'foundation-sites/scss/foundation'; @import 'foundation-sites/scss/foundation';
@include foundation-prototype-spacing;
@import '~bourbon/core/bourbon'; @import '~bourbon/core/bourbon';
@include foundation-everything($flex: true); @include foundation-everything($flex: true);
@ -24,3 +26,4 @@
@import 'foundation-custom'; @import 'foundation-custom';
@import 'widgets/buttons'; @import 'widgets/buttons';
@import 'widgets/forms';

View file

@ -1,4 +1,7 @@
.button { .button {
align-items: center;
display: inline-flex;
height: 4.0rem;
margin-bottom: 0; margin-bottom: 0;
&.button--emoji { &.button--emoji {
@ -19,52 +22,76 @@
} }
} }
.spinner {
padding: 0 var(--space-small);
&.icon {
padding-left: $space-normal;
padding-right: $space-normal;
i {
padding-right: $space-small;
}
} }
&.nice { .icon+.button__content {
border-radius: $space-smaller; padding-left: var(--space-small);
} }
&.hollow { &.expanded {
&.link { display: flex;
border-color: transparent; justify-content: center;
padding-left: 0;
&:hover,
&:focus {
border-color: transparent;
}
}
}
>.icon {
font-size: $font-size-default;
}
&.tiny {
font-size: $font-size-mini;
padding: $space-small $space-slab;
} }
&.round { &.round {
border-radius: $space-larger; border-radius: $space-larger;
} }
// @TODO Use with link
&.compact { &.compact {
padding-bottom: 0; padding-bottom: 0;
padding-top: 0; padding-top: 0;
} }
// Smooth style
&.smooth {
@include button-style(var(--w-100), var(--w-50), var(--w-700));
&.secondary {
@include button-style(var(--s-100), var(--s-50), var(--s-700));
}
&.success {
@include button-style(var(--g-100), var(--g-50), var(--g-700));
}
&.alert {
@include button-style(var(--r-100), var(--r-50), var(--r-700));
}
&.warning {
@include button-style(var(--y-200), var(--y-100), var(--y-900));
}
}
// Sizes
&.tiny {
height: var(--space-medium);
}
&.small {
height: var(--space-large);
}
&.large {
height: var(--space-larger);
}
&.link {
height: auto;
margin: 0;
padding: 0;
}
} }
// @TDOD move to utility file
.button--fixed-right-top { .button--fixed-right-top {
position: fixed; position: fixed;
right: $space-small; right: $space-small;

View file

@ -2,11 +2,11 @@ $resolve-button-width: 13.2rem;
// Conversation header - Light BG // Conversation header - Light BG
.conv-header { .conv-header {
@include padding($space-small $space-normal);
@include background-white; @include background-white;
@include flex; @include flex;
@include flex-align($x: justify, $y: middle); @include flex-align($x: justify, $y: middle);
@include border-normal-bottom; @include border-normal-bottom;
padding: var(--space-small) var(--space-normal);
.multiselect-box { .multiselect-box {
@include flex; @include flex;
@ -39,20 +39,25 @@ $resolve-button-width: 13.2rem;
.user { .user {
@include flex; @include flex;
@include flex-align($x: center, $y: middle); @include flex-align($x: center, $y: middle);
margin-right: var(--space-normal);
min-width: 0;
.user--name { .user--name {
@include margin(0); @include margin(0);
display: inline-block;
font-size: $font-size-medium; font-size: $font-size-medium;
line-height: 1.3; line-height: 1.3;
text-transform: capitalize; text-transform: capitalize;
width: 100%;
} }
.user--profile__meta { .user--profile__meta {
align-items: flex-start; align-items: flex-start;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: flex-start;
margin-left: $space-slab; margin-left: $space-slab;
min-width: 0;
} }
.user--profile__button { .user--profile__button {
@ -65,6 +70,7 @@ $resolve-button-width: 13.2rem;
.header-actions-wrap { .header-actions-wrap {
align-items: center;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
flex-grow: 1; flex-grow: 1;

View file

@ -76,7 +76,6 @@
.status--filter { .status--filter {
@include padding($zero null $zero $space-normal); @include padding($zero null $zero $space-normal);
@include round-corner;
@include margin($space-smaller $space-slab $zero $zero); @include margin($space-smaller $space-slab $zero $zero);
background-color: $color-background-light; background-color: $color-background-light;
border: 1px solid $color-border; border: 1px solid $color-border;
@ -132,7 +131,6 @@
.bubble { .bubble {
@include bubble-with-types; @include bubble-with-types;
max-width: 50rem;
text-align: left; text-align: left;
word-wrap: break-word; word-wrap: break-word;
@ -236,7 +234,9 @@
.wrap { .wrap {
@include margin($zero $space-normal); @include margin($zero $space-normal);
max-width: 69%;
--bubble-max-width: 49.6rem;
max-width: Min(var(--bubble-max-width), 85%);
.sender--name { .sender--name {
font-size: $font-size-mini; font-size: $font-size-mini;

View file

@ -1,7 +1,8 @@
.error { .error {
#{$all-text-inputs}, #{$all-text-inputs},
select, select,
.multiselect > .multiselect__tags { .multiselect>.multiselect__tags {
@include thin-border(var(--r-400)); @include thin-border(var(--r-400));
} }
@ -33,3 +34,10 @@ input {
.help-text { .help-text {
font-weight: $font-weight-normal; font-weight: $font-weight-normal;
} }
.input-group.small {
input {
font-size: var(--font-size-small);
height: var(--space-large);
}
}

View file

@ -32,13 +32,14 @@
<span class="spinner"></span> <span class="spinner"></span>
</div> </div>
<div <woot-button
v-if="!hasCurrentPageEndReached && !chatListLoading" v-if="!hasCurrentPageEndReached && !chatListLoading"
class="clear button load-more-conversations" variant="clear"
size="expanded"
@click="fetchConversations" @click="fetchConversations"
> >
{{ $t('CHAT_LIST.LOAD_MORE_CONVERSATIONS') }} {{ $t('CHAT_LIST.LOAD_MORE_CONVERSATIONS') }}
</div> </woot-button>
<p <p
v-if=" v-if="
@ -217,7 +218,7 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@import '~dashboard/assets/scss/app.scss'; @import '~dashboard/assets/scss/woot';
.spinner { .spinner {
margin-top: var(--space-normal); margin-top: var(--space-normal);
margin-bottom: var(--space-normal); margin-bottom: var(--space-normal);

View file

@ -6,8 +6,10 @@ import Button from './ui/WootButton';
import Code from './Code'; import Code from './Code';
import ColorPicker from './widgets/ColorPicker'; import ColorPicker from './widgets/ColorPicker';
import DeleteModal from './widgets/modal/DeleteModal.vue'; import DeleteModal from './widgets/modal/DeleteModal.vue';
import DropdownItem from 'shared/components/ui/dropdown/DropdownItem';
import DropdownMenu from 'shared/components/ui/dropdown/DropdownMenu';
import Input from './widgets/forms/Input.vue'; import Input from './widgets/forms/Input.vue';
import Label from './widgets/Label.vue'; import Label from './ui/Label';
import LoadingState from './widgets/LoadingState'; import LoadingState from './widgets/LoadingState';
import Modal from './Modal'; import Modal from './Modal';
import ModalHeader from './ModalHeader'; import ModalHeader from './ModalHeader';
@ -26,6 +28,8 @@ const WootUIKit = {
Code, Code,
ColorPicker, ColorPicker,
DeleteModal, DeleteModal,
DropdownItem,
DropdownMenu,
Input, Input,
LoadingState, LoadingState,
Label, Label,

View file

@ -20,22 +20,30 @@
:key="status.value" :key="status.value"
class="status-items" class="status-items"
> >
<button <woot-button
class="button clear status-change--dropdown-button" variant="clear"
:disabled="status.disabled" size="small"
color-scheme="secondary"
class-names="status-change--dropdown-button"
:is-disabled="status.disabled"
@click="changeAvailabilityStatus(status.value)" @click="changeAvailabilityStatus(status.value)"
> >
<availability-status-badge :status="status.value" /> <availability-status-badge :status="status.value" />
{{ status.label }} {{ status.label }}
</button> </woot-button>
</woot-dropdown-item> </woot-dropdown-item>
</woot-dropdown-menu> </woot-dropdown-menu>
</div> </div>
</transition> </transition>
<button class="status-change--change-button" @click="openStatusMenu"> <woot-button
variant="clear"
color-scheme="secondary"
class-names="status-change--change-button link"
@click="openStatusMenu"
>
{{ $t('SIDEBAR_ITEMS.CHANGE_AVAILABILITY_STATUS') }} {{ $t('SIDEBAR_ITEMS.CHANGE_AVAILABILITY_STATUS') }}
</button> </woot-button>
</div> </div>
</div> </div>
</template> </template>
@ -156,15 +164,5 @@ export default {
display: flex; display: flex;
align-items: baseline; align-items: baseline;
} }
& &--change-button {
color: var(--b-600);
font-size: var(--font-size-small);
cursor: pointer;
outline: none;
&:hover {
color: var(--w-600);
}
}
} }
</style> </style>

View file

@ -144,6 +144,7 @@ export default {
cssClass: 'menu-title align-justify', cssClass: 'menu-title align-justify',
toState: frontendURL(`accounts/${this.accountId}/settings/inboxes`), toState: frontendURL(`accounts/${this.accountId}/settings/inboxes`),
toStateName: 'settings_inbox_list', toStateName: 'settings_inbox_list',
newLinkRouteName: 'settings_inbox_new',
children: this.inboxes.map(inbox => ({ children: this.inboxes.map(inbox => ({
id: inbox.id, id: inbox.id,
label: inbox.name, label: inbox.name,
@ -158,10 +159,13 @@ export default {
icon: 'ion-pound', icon: 'ion-pound',
label: 'LABELS', label: 'LABELS',
hasSubMenu: true, hasSubMenu: true,
newLink: true,
key: 'label', key: 'label',
cssClass: 'menu-title align-justify', cssClass: 'menu-title align-justify',
toState: frontendURL(`accounts/${this.accountId}/settings/labels`), toState: frontendURL(`accounts/${this.accountId}/settings/labels`),
toStateName: 'labels_list', toStateName: 'labels_list',
showModalForNewItem: true,
modalName: 'AddLabel',
children: this.accountLabels.map(label => ({ children: this.accountLabels.map(label => ({
id: label.id, id: label.id,
label: label.title, label: label.title,
@ -178,10 +182,12 @@ export default {
icon: 'ion-ios-people', icon: 'ion-ios-people',
label: 'TEAMS', label: 'TEAMS',
hasSubMenu: true, hasSubMenu: true,
newLink: true,
key: 'team', key: 'team',
cssClass: 'menu-title align-justify teams-sidebar-menu', cssClass: 'menu-title align-justify teams-sidebar-menu',
toState: frontendURL(`accounts/${this.accountId}/settings/teams`), toState: frontendURL(`accounts/${this.accountId}/settings/teams`),
toStateName: 'teams_list', toStateName: 'teams_list',
newLinkRouteName: 'settings_teams_new',
children: this.teams.map(team => ({ children: this.teams.map(team => ({
id: team.id, id: team.id,
label: team.name, label: team.name,
@ -264,12 +270,6 @@ export default {
} }
} }
.change-accounts--button.button {
font-weight: $font-weight-normal;
font-size: $font-size-small;
padding: $space-small $space-one;
}
.account-selector { .account-selector {
cursor: pointer; cursor: pointer;
padding: $space-small $space-large; padding: $space-small $space-large;

View file

@ -19,7 +19,7 @@
<span <span
v-if="showItem(menuItem)" v-if="showItem(menuItem)"
class="child-icon ion-android-add-circle" class="child-icon ion-android-add-circle"
@click.prevent="newLinkClick" @click.prevent="newLinkClick(menuItem)"
/> />
</a> </a>
<ul v-if="menuItem.hasSubMenu" class="nested vertical menu"> <ul v-if="menuItem.hasSubMenu" class="nested vertical menu">
@ -52,6 +52,11 @@
</a> </a>
</router-link> </router-link>
</ul> </ul>
<add-label-modal
v-if="showAddLabel"
:show.sync="showAddLabel"
:on-close="hideAddLabelPopup"
/>
</router-link> </router-link>
</template> </template>
@ -61,8 +66,17 @@ import { mapGetters } from 'vuex';
import router from '../../routes'; import router from '../../routes';
import adminMixin from '../../mixins/isAdmin'; import adminMixin from '../../mixins/isAdmin';
import { getInboxClassByType } from 'dashboard/helper/inbox'; import { getInboxClassByType } from 'dashboard/helper/inbox';
import AddLabelModal from '../../routes/dashboard/settings/labels/AddLabel';
export default { export default {
components: {
AddLabelModal,
},
mixins: [adminMixin], mixins: [adminMixin],
data() {
return {
showAddLabel: false,
};
},
props: { props: {
menuItem: { menuItem: {
type: Object, type: Object,
@ -108,12 +122,24 @@ export default {
if (!child.truncateLabel) return false; if (!child.truncateLabel) return false;
return child.label; return child.label;
}, },
newLinkClick() { newLinkClick(item) {
router.push({ name: 'settings_inbox_new', params: { page: 'new' } }); if (item.newLinkRouteName) {
router.push({ name: item.newLinkRouteName, params: { page: 'new' } });
} else if (item.showModalForNewItem) {
if (item.modalName === 'AddLabel') {
this.showAddLabelPopup();
}
}
}, },
showItem(item) { showItem(item) {
return this.isAdmin && item.newLink !== undefined; return this.isAdmin && item.newLink !== undefined;
}, },
showAddLabelPopup() {
this.showAddLabel = true;
},
hideAddLabelPopup() {
this.showAddLabel = false;
},
}, },
}; };
</script> </script>

View file

@ -7,30 +7,42 @@
> >
<woot-dropdown-menu> <woot-dropdown-menu>
<woot-dropdown-item v-if="showChangeAccountOption"> <woot-dropdown-item v-if="showChangeAccountOption">
<button <woot-button
class="button clear change-accounts--button" variant="clear"
size="small"
class=" change-accounts--button"
@click="$emit('toggle-accounts')" @click="$emit('toggle-accounts')"
> >
{{ $t('SIDEBAR_ITEMS.CHANGE_ACCOUNTS') }} {{ $t('SIDEBAR_ITEMS.CHANGE_ACCOUNTS') }}
</button> </woot-button>
</woot-dropdown-item> </woot-dropdown-item>
<woot-dropdown-item v-if="globalConfig.chatwootInboxToken"> <woot-dropdown-item v-if="globalConfig.chatwootInboxToken">
<button <woot-button
class="button clear change-accounts--button" variant="clear"
size="small"
class=" change-accounts--button"
@click="$emit('show-support-chat-window')" @click="$emit('show-support-chat-window')"
> >
Contact Support Contact Support
</button> </woot-button>
</woot-dropdown-item> </woot-dropdown-item>
<woot-dropdown-item> <woot-dropdown-item>
<router-link :to="`/app/accounts/${accountId}/profile/settings`"> <router-link
:to="`/app/accounts/${accountId}/profile/settings`"
class="button clear small change-accounts--button"
>
{{ $t('SIDEBAR_ITEMS.PROFILE_SETTINGS') }} {{ $t('SIDEBAR_ITEMS.PROFILE_SETTINGS') }}
</router-link> </router-link>
</woot-dropdown-item> </woot-dropdown-item>
<woot-dropdown-item> <woot-dropdown-item>
<a href="#" @click.prevent="logout"> <woot-button
variant="clear"
size="small"
class=" change-accounts--button"
@click="logout"
>
{{ $t('SIDEBAR_ITEMS.LOGOUT') }} {{ $t('SIDEBAR_ITEMS.LOGOUT') }}
</a> </woot-button>
</woot-dropdown-item> </woot-dropdown-item>
</woot-dropdown-menu> </woot-dropdown-menu>
</div> </div>

View file

@ -3,11 +3,13 @@ import { createLocalVue, mount } from '@vue/test-utils';
import Vuex from 'vuex'; import Vuex from 'vuex';
import VueI18n from 'vue-i18n'; import VueI18n from 'vue-i18n';
import WootButton from 'dashboard/components/ui/WootButton';
import i18n from 'dashboard/i18n'; import i18n from 'dashboard/i18n';
const localVue = createLocalVue(); const localVue = createLocalVue();
localVue.use(Vuex); localVue.use(Vuex);
localVue.use(VueI18n); localVue.use(VueI18n);
localVue.component('woot-button', WootButton);
const i18nConfig = new VueI18n({ const i18nConfig = new VueI18n({
locale: 'en', locale: 'en',

View file

@ -4,7 +4,7 @@ import SidemenuIcon from '../SidemenuIcon';
describe('SidemenuIcon', () => { describe('SidemenuIcon', () => {
test('matches snapshot', () => { test('matches snapshot', () => {
const wrapper = mount(SidemenuIcon); const wrapper = mount(SidemenuIcon);
expect(wrapper.isVueInstance()).toBeTruthy(); expect(wrapper.vm).toBeTruthy();
expect(wrapper.element).toMatchSnapshot(); expect(wrapper.element).toMatchSnapshot();
}); });
}); });

View file

@ -0,0 +1,149 @@
<template>
<div :class="labelClass" :style="labelStyle" :title="description">
<i v-if="icon" class="label--icon" :class="icon" @click="onClick" />
<span v-if="!href">{{ title }}</span>
<a v-else :href="href" :style="anchorStyle">{{ title }}</a>
<i v-if="showClose" class="close--icon ion-close" @click="onClick" />
</div>
</template>
<script>
import { getContrastingTextColor } from '@chatwoot/utils';
export default {
props: {
title: {
type: String,
required: true,
},
description: {
type: String,
default: '',
},
href: {
type: String,
default: '',
},
bgColor: {
type: String,
default: '',
},
small: {
type: Boolean,
default: false,
},
showClose: {
type: Boolean,
default: false,
},
icon: {
type: String,
default: '',
},
colorScheme: {
type: String,
default: '',
},
},
computed: {
textColor() {
return getContrastingTextColor(this.bgColor);
},
labelClass() {
return `label ${this.colorScheme} ${this.small ? 'small' : ''}`;
},
labelStyle() {
if (this.bgColor) {
return { background: this.bgColor, color: this.textColor };
}
return {};
},
anchorStyle() {
if (this.bgColor) {
return { color: this.textColor };
}
return {};
},
},
methods: {
onClick() {
this.$emit('click', this.title);
},
},
};
</script>
<style scoped lang="scss">
@import '~dashboard/assets/scss/variables';
.label {
font-weight: var(--font-weight-medium);
margin-right: var(--space-smaller);
margin-bottom: var(--space-smaller);
&.small {
font-size: var(--font-size-micro);
}
.label--icon {
cursor: pointer;
}
.label--icon,
.close--icon {
font-size: var(--font-size-micro);
cursor: pointer;
}
&.small .label--icon,
&.small .close--icon {
font-size: var(--font-size-nano);
}
a {
font-size: var(--font-size-mini);
&:hover {
text-decoration: underline;
}
}
/* Color Schemes */
&.primary {
background: var(--w-100);
color: var(--w-900);
border: 1px solid var(--w-200);
a {
color: var(--w-900);
}
}
&.secondary {
background: var(--s-100);
color: var(--s-900);
border: 1px solid var(--s-200);
a {
color: var(--s-900);
}
}
&.success {
background: var(--g-100);
color: var(--g-900);
border: 1px solid var(--g-200);
a {
color: var(--g-900);
}
}
&.alert {
background: var(--r-100);
color: var(--r-900);
border: 1px solid var(--r-200);
a {
color: var(--r-900);
}
}
&.warning {
background: var(--y-100);
color: var(--y-900);
border: 1px solid var(--y-300);
a {
color: var(--y-900);
}
}
}
</style>

View file

@ -1,13 +1,7 @@
<template> <template>
<button <button
class="button" class="button"
:class="[ :class="buttonClasses"
variant,
size,
colorScheme,
classNames,
isDisabled ? 'disabled' : '',
]"
:disabled="isDisabled || isLoading" :disabled="isDisabled || isLoading"
@click="handleClick" @click="handleClick"
> >
@ -51,6 +45,28 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
isExpanded: {
type: Boolean,
default: false,
},
},
computed: {
variantClasses() {
if (this.variant.includes('link')) {
return `clear ${this.variant}`;
}
return this.variant;
},
buttonClasses() {
return [
this.variantClasses,
this.size,
this.colorScheme,
this.classNames,
this.isDisabled ? 'disabled' : '',
this.isExpanded ? 'expanded' : '',
];
},
}, },
methods: { methods: {
handleClick(evt) { handleClick(evt) {
@ -59,20 +75,3 @@ export default {
}, },
}; };
</script> </script>
<style lang="scss" scoped>
.button {
display: flex;
align-items: center;
&.link {
padding: 0;
margin: 0;
}
}
.spinner {
padding: 0 var(--space-small);
}
.icon + .button__content {
padding-left: var(--space-small);
}
</style>

View file

@ -0,0 +1,64 @@
import { action } from '@storybook/addon-actions';
export default {
title: 'Components/Label',
argTypes: {
title: {
defaultValue: 'sales',
control: {
type: 'text',
},
},
colorScheme: {
control: {
type: 'select',
options: ['primary', 'secondary', 'success', 'alert', 'warning'],
},
},
description: {
defaultValue: 'label',
control: {
type: 'text',
},
},
href: {
control: {
type: 'text',
},
},
bgColor: {
defaultValue: '#a83262',
control: {
type: 'text',
},
},
small: {
defaultValue: false,
control: {
type: 'boolean',
},
},
showClose: {
defaultValue: false,
control: {
type: 'boolean',
},
},
icon: {
defaultValue: 'ion-close',
control: {
type: 'text',
},
},
},
};
const Template = (args, { argTypes }) => ({
props: Object.keys(argTypes),
template: '<woot-label v-bind="$props" @click="onClick"></woot-label>',
});
export const DefaultLabel = Template.bind({});
DefaultLabel.args = {
onClick: action('clicked'),
};

View file

@ -1,87 +0,0 @@
<template>
<div
:class="labelClass"
:style="{ background: bgColor, color: textColor }"
:title="description"
>
<span v-if="!href">{{ title }}</span>
<a v-else :href="href" :style="{ color: textColor }">{{ title }}</a>
<i v-if="showIcon" class="label--icon" :class="icon" @click="onClick" />
</div>
</template>
<script>
import { getContrastingTextColor } from 'shared/helpers/ColorHelper';
export default {
props: {
title: {
type: String,
required: true,
},
description: {
type: String,
default: '',
},
href: {
type: String,
default: '',
},
bgColor: {
type: String,
default: '#1f93ff',
},
small: {
type: Boolean,
default: false,
},
showIcon: {
type: Boolean,
default: false,
},
icon: {
type: String,
default: 'ion-close',
},
},
computed: {
textColor() {
return getContrastingTextColor(this.bgColor);
},
labelClass() {
return `label ${this.small ? 'small' : ''}`;
},
},
methods: {
onClick() {
this.$emit('click', this.title);
},
},
};
</script>
<style scoped lang="scss">
@import '~dashboard/assets/scss/variables';
.label {
display: inline-block;
font-size: $font-size-small;
line-height: 1;
margin: $space-micro;
&.small {
font-size: $font-size-mini;
}
a {
&:hover {
text-decoration: underline;
}
}
}
.label--icon {
cursor: pointer;
font-size: $font-size-micro;
line-height: 1.5;
margin-left: $space-smaller;
}
</style>

View file

@ -12,39 +12,54 @@
v-if="totalCount" v-if="totalCount"
class="primary button-group pagination-button-group" class="primary button-group pagination-button-group"
> >
<button <woot-button
class="button small goto-first" size="small"
:class="firstPageButtonClass" variant="clear"
color-scheme="secondary"
class-names="goto-first"
:is-disabled="hasFirstPage"
@click="onFirstPage" @click="onFirstPage"
> >
<i class="ion-chevron-left" /> <i class="ion-chevron-left" />
<i class="ion-chevron-left" /> <i class="ion-chevron-left" />
</button> </woot-button>
<button <woot-button
class="button small" size="small"
:class="prevPageButtonClass" variant="clear"
color-scheme="secondary"
:is-disabled="hasPrevPage"
@click="onPrevPage" @click="onPrevPage"
> >
<i class="ion-chevron-left" /> <i class="ion-chevron-left" />
</button> </woot-button>
<button class="button" @click.prevent> <woot-button
size="small"
variant="clear"
color-scheme="secondary"
@click.prevent
>
{{ currentPage }} {{ currentPage }}
</button> </woot-button>
<button <woot-button
class="button small" size="small"
:class="nextPageButtonClass" variant="clear"
color-scheme="secondary"
:is-disabled="hasNextPage"
@click="onNextPage" @click="onNextPage"
> >
<i class="ion-chevron-right" /> <i class="ion-chevron-right" />
</button> </woot-button>
<button <woot-button
class="button small goto-last" size="small"
:class="lastPageButtonClass" variant="clear"
color-scheme="secondary"
class-names="goto-last"
:is-disabled="hasLastPage"
@click="onLastPage" @click="onLastPage"
> >
<i class="ion-chevron-right" /> <i class="ion-chevron-right" />
<i class="ion-chevron-right" /> <i class="ion-chevron-right" />
</button> </woot-button>
</div> </div>
</div> </div>
</footer> </footer>
@ -91,35 +106,19 @@ export default {
this.currentPage === Math.ceil(this.totalCount / this.pageSize); this.currentPage === Math.ceil(this.totalCount / this.pageSize);
return isDisabled; return isDisabled;
}, },
lastPageButtonClass() {
const className = this.hasLastPage ? 'disabled' : '';
return className;
},
hasFirstPage() { hasFirstPage() {
const isDisabled = this.currentPage === 1; const isDisabled = this.currentPage === 1;
return isDisabled; return isDisabled;
}, },
firstPageButtonClass() {
const className = this.hasFirstPage ? 'disabled' : '';
return className;
},
hasNextPage() { hasNextPage() {
const isDisabled = const isDisabled =
this.currentPage === Math.ceil(this.totalCount / this.pageSize); this.currentPage === Math.ceil(this.totalCount / this.pageSize);
return isDisabled; return isDisabled;
}, },
nextPageButtonClass() {
const className = this.hasNextPage ? 'disabled' : '';
return className;
},
hasPrevPage() { hasPrevPage() {
const isDisabled = this.currentPage === 1; const isDisabled = this.currentPage === 1;
return isDisabled; return isDisabled;
}, },
prevPageButtonClass() {
const className = this.hasPrevPage ? 'disabled' : '';
return className;
},
}, },
methods: { methods: {
onNextPage() { onNextPage() {
@ -161,52 +160,11 @@ export default {
.page-meta { .page-meta {
font-size: var(--font-size-mini); font-size: var(--font-size-mini);
} }
.pagination-button-group {
margin: 0;
.button { .goto-first,
background: transparent; .goto-last {
border-color: var(--color-border); i:last-child {
color: var(--color-body); margin-left: var(--space-minus-smaller);
margin-bottom: 0;
margin-left: -2px;
font-size: var(--font-size-small);
padding: var(--space-small) var(--space-normal);
border-radius: 0;
&:hover,
&:focus,
&:active {
background: var(--s-200);
color: white;
}
&:first-child {
border-top-left-radius: var(--space-smaller);
border-bottom-left-radius: var(--space-smaller);
}
&:last-child {
border-top-right-radius: var(--space-smaller);
border-bottom-right-radius: var(--space-smaller);
}
&.small {
font-size: var(--font-size-micro);
}
&.disabled {
background: var(--s-200);
border-color: var(--s-200);
color: var(--b-900);
}
&.goto-first,
&.goto-last {
i:last-child {
margin-left: var(--space-minus-smaller);
}
}
} }
} }
</style> </style>

View file

@ -14,12 +14,12 @@ const chartOptions = {
scales: { scales: {
xAxes: [ xAxes: [
{ {
barPercentage: 1.26, barPercentage: 1.1,
ticks: { ticks: {
fontFamily, fontFamily,
}, },
gridLines: { gridLines: {
display: false, drawOnChartArea: false,
}, },
}, },
], ],
@ -30,7 +30,7 @@ const chartOptions = {
beginAtZero: true, beginAtZero: true,
}, },
gridLines: { gridLines: {
display: false, drawOnChartArea: false,
}, },
}, },
], ],

View file

@ -75,11 +75,12 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~dashboard/assets/scss/app.scss'; @import '~dashboard/assets/scss/woot';
.conversation-details-wrap { .conversation-details-wrap {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
min-width: 0;
width: 100%; width: 100%;
border-left: 1px solid var(--color-border); border-left: 1px solid var(--color-border);
background: var(--color-background-light); background: var(--color-background-light);

View file

@ -12,8 +12,10 @@
<h3 class="user--name text-truncate"> <h3 class="user--name text-truncate">
{{ currentContact.name }} {{ currentContact.name }}
</h3> </h3>
<button <woot-button
class="user--profile__button clear button small" class="user--profile__button"
size="small"
variant="link"
@click="$emit('contact-panel-toggle')" @click="$emit('contact-panel-toggle')"
> >
{{ {{
@ -23,7 +25,7 @@
: $t('CONVERSATION.HEADER.OPEN') : $t('CONVERSATION.HEADER.OPEN')
} ${$t('CONVERSATION.HEADER.DETAILS')}` } ${$t('CONVERSATION.HEADER.DETAILS')}`
}} }}
</button> </woot-button>
</div> </div>
</div> </div>
<div <div

View file

@ -109,12 +109,14 @@ export default {
); );
const { const {
email: { html_content: { full: fullHTMLContent } = {} } = {}, email: {
html_content: { full: fullHTMLContent, reply: replyHTMLContent } = {},
} = {},
} = this.contentAttributes; } = this.contentAttributes;
if (fullHTMLContent && this.isIncoming) { if ((replyHTMLContent || fullHTMLContent) && this.isIncoming) {
let parsedContent = new DOMParser().parseFromString( let parsedContent = new DOMParser().parseFromString(
fullHTMLContent || '', replyHTMLContent || fullHTMLContent || '',
'text/html' 'text/html'
); );
if (!parsedContent.getElementsByTagName('parsererror').length) { if (!parsedContent.getElementsByTagName('parsererror').length) {

View file

@ -186,10 +186,12 @@ export default {
if (this.isPrivate) { if (this.isPrivate) {
return MESSAGE_MAX_LENGTH.GENERAL; return MESSAGE_MAX_LENGTH.GENERAL;
} }
if (this.isAFacebookInbox) { if (this.isAFacebookInbox) {
return MESSAGE_MAX_LENGTH.FACEBOOK; return MESSAGE_MAX_LENGTH.FACEBOOK;
} }
if (this.isATwilioWhatsappChannel) {
return MESSAGE_MAX_LENGTH.TWILIO_WHATSAPP;
}
if (this.isATwilioSMSChannel) { if (this.isATwilioSMSChannel) {
return MESSAGE_MAX_LENGTH.TWILIO_SMS; return MESSAGE_MAX_LENGTH.TWILIO_SMS;
} }

View file

@ -95,7 +95,7 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~dashboard/assets/scss/app.scss'; @import '~dashboard/assets/scss/woot';
.right { .right {
.message-text--metadata { .message-text--metadata {

View file

@ -0,0 +1,79 @@
{
"CAMPAIGN": {
"HEADER": "Campaigns",
"SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on <b>Add Campaign</b> 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",
"ADD": {
"TITLE": "Create a campaign",
"DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
"CANCEL_BUTTON_TEXT": "إلغاء",
"CREATE_BUTTON_TEXT": "إنشاء",
"FORM": {
"TITLE": {
"LABEL": "Title",
"PLACEHOLDER": "Please enter the title of campaign",
"ERROR": "Title is required"
},
"MESSAGE": {
"LABEL": "رسالة",
"PLACEHOLDER": "Please enter the message of campaign",
"ERROR": "Message is required"
},
"SENT_BY": {
"LABEL": "أرسلت بواسطة",
"PLACEHOLDER": "Please select the the content of campaign",
"ERROR": "Sender is required"
},
"END_POINT": {
"LABEL": "URL",
"PLACEHOLDER": "Please enter the URL",
"ERROR": "الرجاء إدخال عنوان URL صالح"
},
"TIME_ON_PAGE": {
"LABEL": "Time on page(Seconds)",
"PLACEHOLDER": "Please enter the time",
"ERROR": "Time on page is required"
},
"ENABLED": "Enable campaign",
"SUBMIT": "Add Campaign"
},
"API": {
"SUCCESS_MESSAGE": "Campaign created successfully",
"ERROR_MESSAGE": "There was an error. Please try again."
}
},
"EDIT": {
"TITLE": "Edit campaign",
"UPDATE_BUTTON_TEXT": "تحديث",
"API": {
"SUCCESS_MESSAGE": "Campaign updated successfully",
"ERROR_MESSAGE": "حدث خطأ، الرجاء المحاولة مرة أخرى"
}
},
"LIST": {
"LOADING_MESSAGE": "Loading campaigns...",
"404": "There are no campaigns created for this inbox.",
"TABLE_HEADER": {
"TITLE": "Title",
"MESSAGE": "رسالة",
"STATUS": "الحالة",
"SENDER": "Sender",
"URL": "URL",
"TIME_ON_PAGE": "Time(Seconds)",
"CREATED_AT": "Created at"
},
"BUTTONS": {
"ADD": "Add",
"EDIT": "تعديل",
"DELETE": "حذف"
},
"STATUS": {
"ENABLED": "مفعل",
"DISABLED": "معطّل"
},
"SENDER": {
"BOT": "رد آلي"
}
}
}
}

View file

@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "تم تلقيه عبر البريد الإلكتروني", "RECEIVED_VIA_EMAIL": "تم تلقيه عبر البريد الإلكتروني",
"VIEW_TWEET_IN_TWITTER": "عرض التغريدة في تويتر", "VIEW_TWEET_IN_TWITTER": "عرض التغريدة في تويتر",
"REPLY_TO_TWEET": "الرد على هذه التغريدة", "REPLY_TO_TWEET": "الرد على هذه التغريدة",
"NO_MESSAGES": "لا توجد رسائل" "NO_MESSAGES": "لا توجد رسائل",
"NO_CONTENT": "No content available"
} }
} }

View file

@ -17,9 +17,6 @@
"NO_RECORDS_FOUND": "لا توجد محادثات سابقة مرتبطة بجهة الاتصال هذه.", "NO_RECORDS_FOUND": "لا توجد محادثات سابقة مرتبطة بجهة الاتصال هذه.",
"TITLE": "المحادثات السابقة" "TITLE": "المحادثات السابقة"
}, },
"CUSTOM_ATTRIBUTES": {
"TITLE": "سمات مخصصة"
},
"LABELS": { "LABELS": {
"TITLE": "وسوم المحادثة", "TITLE": "وسوم المحادثة",
"MODAL": { "MODAL": {
@ -28,11 +25,17 @@
"INACTIVE_LABELS": "الوسوم المتاحة في الحساب", "INACTIVE_LABELS": "الوسوم المتاحة في الحساب",
"REMOVE": "انقر على أيقونة X لإزالة الوسم", "REMOVE": "انقر على أيقونة X لإزالة الوسم",
"ADD": "اضغط على أيقونة + لإضافة وسوم", "ADD": "اضغط على أيقونة + لإضافة وسوم",
"ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "تحديث الوسوم", "UPDATE_BUTTON": "تحديث الوسوم",
"UPDATE_ERROR": "تعذر تحديث الوسوم، الرجاء المحاولة مرة أخرى." "UPDATE_ERROR": "تعذر تحديث الوسوم، الرجاء المحاولة مرة أخرى."
}, },
"NO_LABELS_TO_ADD": "لا يوجد وسوم في الحساب.", "NO_LABELS_TO_ADD": "لا يوجد وسوم في الحساب.",
"NO_AVAILABLE_LABELS": "لا يوجد وسوم مضافة لهذه المحادثة." "NO_AVAILABLE_LABELS": "لا يوجد وسوم مضافة لهذه المحادثة.",
"LABEL_SELECT": {
"TITLE": "Add Labels",
"PLACEHOLDER": "Search labels",
"NO_RESULT": "No labels found"
}
}, },
"MUTE_CONTACT": "كتم المحادثة", "MUTE_CONTACT": "كتم المحادثة",
"UNMUTE_CONTACT": "إلغاء كتم المحادثة", "UNMUTE_CONTACT": "إلغاء كتم المحادثة",
@ -151,5 +154,39 @@
}, },
"VIEW_DETAILS": "عرض التفاصيل" "VIEW_DETAILS": "عرض التفاصيل"
} }
},
"NOTES": {
"HEADER": {
"TITLE": "Notes"
},
"ADD": {
"BUTTON": "Add",
"PLACEHOLDER": "Add a note",
"TITLE": "Shift + Enter to create a note"
},
"FOOTER": {
"BUTTON": "View all notes"
}
},
"CUSTOM_ATTRIBUTES": {
"TITLE": "سمات مخصصة",
"BUTTON": "Add custom attribute",
"ADD": {
"TITLE": "Create custom attribute",
"DESC": "Add custom information to this contact."
},
"FORM": {
"CREATE": "Add attribute",
"CANCEL": "إلغاء",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
"ERROR": "Invalid custom attribute name"
},
"VALUE": {
"LABEL": "Attribute value",
"PLACEHOLDER": "Eg: 11901 "
}
}
} }
} }

View file

@ -227,6 +227,7 @@
"SETTINGS": "الإعدادات", "SETTINGS": "الإعدادات",
"COLLABORATORS": "المتعاونون", "COLLABORATORS": "المتعاونون",
"CONFIGURATION": "الإعدادات", "CONFIGURATION": "الإعدادات",
"CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "نموذج ما قبل الدردشة", "PRE_CHAT_FORM": "نموذج ما قبل الدردشة",
"BUSINESS_HOURS": "ساعات العمل" "BUSINESS_HOURS": "ساعات العمل"
}, },

View file

@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json'; import { default as _agentMgmt } from './agentMgmt.json';
import { default as _labelsMgmt } from './labelsMgmt.json'; import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json'; import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json'; import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json'; import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json'; import { default as _conversation } from './conversation.json';
import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json'; import { default as _inboxMgmt } from './inboxMgmt.json';
import { default as _integrations } from './integrations.json';
import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json'; import { default as _login } from './login.json';
import { default as _report } from './report.json'; import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json'; import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json'; import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json'; import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json'; import { default as _signup } from './signup.json';
import { default as _integrations } from './integrations.json'; import { default as _teamsSettings } from './teamsSettings.json';
import { default as _generalSettings } from './generalSettings.json';
export default { export default {
..._agentMgmt, ..._agentMgmt,
..._campaign,
..._cannedMgmt, ..._cannedMgmt,
..._chatlist, ..._chatlist,
..._contact, ..._contact,
..._conversation, ..._conversation,
..._generalSettings,
..._inboxMgmt, ..._inboxMgmt,
..._integrations,
..._labelsMgmt,
..._login, ..._login,
..._report, ..._report,
..._labelsMgmt,
..._resetPassword, ..._resetPassword,
..._setNewPassword, ..._setNewPassword,
..._settings, ..._settings,
..._signup, ..._signup,
..._integrations, ..._teamsSettings,
..._generalSettings,
}; };

View file

@ -38,6 +38,18 @@
{ {
"id": 1, "id": 1,
"name": "آخر 30 يوماً" "name": "آخر 30 يوماً"
},
{
"id": 2,
"name": "Last 3 months"
},
{
"id": 3,
"name": "Last 6 months"
},
{
"id": 4,
"name": "Last year"
} }
] ]
} }

View file

@ -0,0 +1,79 @@
{
"CAMPAIGN": {
"HEADER": "Campaigns",
"SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on <b>Add Campaign</b> 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",
"ADD": {
"TITLE": "Create a campaign",
"DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
"CANCEL_BUTTON_TEXT": "Cancel·la",
"CREATE_BUTTON_TEXT": "Crear",
"FORM": {
"TITLE": {
"LABEL": "Title",
"PLACEHOLDER": "Please enter the title of campaign",
"ERROR": "Title is required"
},
"MESSAGE": {
"LABEL": "Missatge",
"PLACEHOLDER": "Please enter the message of campaign",
"ERROR": "Message is required"
},
"SENT_BY": {
"LABEL": "Enviat per",
"PLACEHOLDER": "Please select the the content of campaign",
"ERROR": "Sender is required"
},
"END_POINT": {
"LABEL": "URL",
"PLACEHOLDER": "Please enter the URL",
"ERROR": "Introduïu una URL vàlid"
},
"TIME_ON_PAGE": {
"LABEL": "Time on page(Seconds)",
"PLACEHOLDER": "Please enter the time",
"ERROR": "Time on page is required"
},
"ENABLED": "Enable campaign",
"SUBMIT": "Add Campaign"
},
"API": {
"SUCCESS_MESSAGE": "Campaign created successfully",
"ERROR_MESSAGE": "There was an error. Please try again."
}
},
"EDIT": {
"TITLE": "Edit campaign",
"UPDATE_BUTTON_TEXT": "Actualitza",
"API": {
"SUCCESS_MESSAGE": "Campaign updated successfully",
"ERROR_MESSAGE": "S'ha produït un error; tornau-ho a provar"
}
},
"LIST": {
"LOADING_MESSAGE": "Loading campaigns...",
"404": "There are no campaigns created for this inbox.",
"TABLE_HEADER": {
"TITLE": "Title",
"MESSAGE": "Missatge",
"STATUS": "Estat",
"SENDER": "Sender",
"URL": "URL",
"TIME_ON_PAGE": "Time(Seconds)",
"CREATED_AT": "Created at"
},
"BUTTONS": {
"ADD": "Add",
"EDIT": "Edita",
"DELETE": "Esborrar"
},
"STATUS": {
"ENABLED": "Habilita",
"DISABLED": "Inhabilita"
},
"SENDER": {
"BOT": "Bot"
}
}
}
}

View file

@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Rebut per correu electrònic", "RECEIVED_VIA_EMAIL": "Rebut per correu electrònic",
"VIEW_TWEET_IN_TWITTER": "Veure el tuit a Twitter", "VIEW_TWEET_IN_TWITTER": "Veure el tuit a Twitter",
"REPLY_TO_TWEET": "Respon a aquest tuit", "REPLY_TO_TWEET": "Respon a aquest tuit",
"NO_MESSAGES": "Cap Missatge" "NO_MESSAGES": "Cap Missatge",
"NO_CONTENT": "No content available"
} }
} }

View file

@ -17,9 +17,6 @@
"NO_RECORDS_FOUND": "No hi han converses prèvies associades a aquest contacte.", "NO_RECORDS_FOUND": "No hi han converses prèvies associades a aquest contacte.",
"TITLE": "Converses prèvies" "TITLE": "Converses prèvies"
}, },
"CUSTOM_ATTRIBUTES": {
"TITLE": "Atributs personalitzats"
},
"LABELS": { "LABELS": {
"TITLE": "Etiquetes de converses", "TITLE": "Etiquetes de converses",
"MODAL": { "MODAL": {
@ -28,11 +25,17 @@
"INACTIVE_LABELS": "Etiquetes disponibles al compte", "INACTIVE_LABELS": "Etiquetes disponibles al compte",
"REMOVE": "Fes clic a la icona X per eliminar l'etiqueta", "REMOVE": "Fes clic a la icona X per eliminar l'etiqueta",
"ADD": "Fes clic a la icona + per afegir l'etiqueta", "ADD": "Fes clic a la icona + per afegir l'etiqueta",
"ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Actualitza les etiquetes", "UPDATE_BUTTON": "Actualitza les etiquetes",
"UPDATE_ERROR": "No s'han pogut actualitzar les etiquetes, torna-ho a provar." "UPDATE_ERROR": "No s'han pogut actualitzar les etiquetes, torna-ho a provar."
}, },
"NO_LABELS_TO_ADD": "No hi ha cap etiqueta definida al compte.", "NO_LABELS_TO_ADD": "No hi ha cap etiqueta definida al compte.",
"NO_AVAILABLE_LABELS": "No hi ha etiquetes afegides a aquesta conversa." "NO_AVAILABLE_LABELS": "No hi ha etiquetes afegides a aquesta conversa.",
"LABEL_SELECT": {
"TITLE": "Add Labels",
"PLACEHOLDER": "Search labels",
"NO_RESULT": "No labels found"
}
}, },
"MUTE_CONTACT": "Silencia la conversa", "MUTE_CONTACT": "Silencia la conversa",
"UNMUTE_CONTACT": "Desactiva el silenci de la conversa", "UNMUTE_CONTACT": "Desactiva el silenci de la conversa",
@ -151,5 +154,39 @@
}, },
"VIEW_DETAILS": "View details" "VIEW_DETAILS": "View details"
} }
},
"NOTES": {
"HEADER": {
"TITLE": "Notes"
},
"ADD": {
"BUTTON": "Add",
"PLACEHOLDER": "Add a note",
"TITLE": "Shift + Enter to create a note"
},
"FOOTER": {
"BUTTON": "View all notes"
}
},
"CUSTOM_ATTRIBUTES": {
"TITLE": "Atributs personalitzats",
"BUTTON": "Add custom attribute",
"ADD": {
"TITLE": "Create custom attribute",
"DESC": "Add custom information to this contact."
},
"FORM": {
"CREATE": "Add attribute",
"CANCEL": "Cancel·la",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
"ERROR": "Invalid custom attribute name"
},
"VALUE": {
"LABEL": "Attribute value",
"PLACEHOLDER": "Eg: 11901 "
}
}
} }
} }

View file

@ -227,6 +227,7 @@
"SETTINGS": "Configuracions", "SETTINGS": "Configuracions",
"COLLABORATORS": "Col·laboradors", "COLLABORATORS": "Col·laboradors",
"CONFIGURATION": "Configuració", "CONFIGURATION": "Configuració",
"CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form", "PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours" "BUSINESS_HOURS": "Business Hours"
}, },

View file

@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json'; import { default as _agentMgmt } from './agentMgmt.json';
import { default as _labelsMgmt } from './labelsMgmt.json'; import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json'; import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json'; import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json'; import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json'; import { default as _conversation } from './conversation.json';
import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json'; import { default as _inboxMgmt } from './inboxMgmt.json';
import { default as _integrations } from './integrations.json';
import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json'; import { default as _login } from './login.json';
import { default as _report } from './report.json'; import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json'; import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json'; import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json'; import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json'; import { default as _signup } from './signup.json';
import { default as _integrations } from './integrations.json'; import { default as _teamsSettings } from './teamsSettings.json';
import { default as _generalSettings } from './generalSettings.json';
export default { export default {
..._agentMgmt, ..._agentMgmt,
..._campaign,
..._cannedMgmt, ..._cannedMgmt,
..._chatlist, ..._chatlist,
..._contact, ..._contact,
..._conversation, ..._conversation,
..._generalSettings,
..._inboxMgmt, ..._inboxMgmt,
..._integrations,
..._labelsMgmt,
..._login, ..._login,
..._report, ..._report,
..._labelsMgmt,
..._resetPassword, ..._resetPassword,
..._setNewPassword, ..._setNewPassword,
..._settings, ..._settings,
..._signup, ..._signup,
..._integrations, ..._teamsSettings,
..._generalSettings,
}; };

View file

@ -38,6 +38,18 @@
{ {
"id": 1, "id": 1,
"name": "Últims 30 dies" "name": "Últims 30 dies"
},
{
"id": 2,
"name": "Last 3 months"
},
{
"id": 3,
"name": "Last 6 months"
},
{
"id": 4,
"name": "Last year"
} }
] ]
} }

View file

@ -0,0 +1,79 @@
{
"CAMPAIGN": {
"HEADER": "Campaigns",
"SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on <b>Add Campaign</b> 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",
"ADD": {
"TITLE": "Create a campaign",
"DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
"CANCEL_BUTTON_TEXT": "Zrušit",
"CREATE_BUTTON_TEXT": "Create",
"FORM": {
"TITLE": {
"LABEL": "Title",
"PLACEHOLDER": "Please enter the title of campaign",
"ERROR": "Title is required"
},
"MESSAGE": {
"LABEL": "Zpráva",
"PLACEHOLDER": "Please enter the message of campaign",
"ERROR": "Message is required"
},
"SENT_BY": {
"LABEL": "Odeslal",
"PLACEHOLDER": "Please select the the content of campaign",
"ERROR": "Sender is required"
},
"END_POINT": {
"LABEL": "URL",
"PLACEHOLDER": "Please enter the URL",
"ERROR": "Zadejte prosím platnou URL"
},
"TIME_ON_PAGE": {
"LABEL": "Time on page(Seconds)",
"PLACEHOLDER": "Please enter the time",
"ERROR": "Time on page is required"
},
"ENABLED": "Enable campaign",
"SUBMIT": "Add Campaign"
},
"API": {
"SUCCESS_MESSAGE": "Campaign created successfully",
"ERROR_MESSAGE": "There was an error. Please try again."
}
},
"EDIT": {
"TITLE": "Edit campaign",
"UPDATE_BUTTON_TEXT": "Aktualizovat",
"API": {
"SUCCESS_MESSAGE": "Campaign updated successfully",
"ERROR_MESSAGE": "Došlo k chybě, zkuste to prosím znovu"
}
},
"LIST": {
"LOADING_MESSAGE": "Loading campaigns...",
"404": "There are no campaigns created for this inbox.",
"TABLE_HEADER": {
"TITLE": "Title",
"MESSAGE": "Zpráva",
"STATUS": "Stav",
"SENDER": "Sender",
"URL": "URL",
"TIME_ON_PAGE": "Time(Seconds)",
"CREATED_AT": "Created at"
},
"BUTTONS": {
"ADD": "Add",
"EDIT": "Upravit",
"DELETE": "Vymazat"
},
"STATUS": {
"ENABLED": "Povoleno",
"DISABLED": "Zakázáno"
},
"SENDER": {
"BOT": "Bot"
}
}
}
}

View file

@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Obdrženo e-mailem", "RECEIVED_VIA_EMAIL": "Obdrženo e-mailem",
"VIEW_TWEET_IN_TWITTER": "Zobrazit tweet na Twitteru", "VIEW_TWEET_IN_TWITTER": "Zobrazit tweet na Twitteru",
"REPLY_TO_TWEET": "Odpovědět na tento tweet", "REPLY_TO_TWEET": "Odpovědět na tento tweet",
"NO_MESSAGES": "Žádné zprávy" "NO_MESSAGES": "Žádné zprávy",
"NO_CONTENT": "No content available"
} }
} }

View file

@ -17,9 +17,6 @@
"NO_RECORDS_FOUND": "K tomuto kontaktu nejsou přiřazeny žádné předchozí konverzace.", "NO_RECORDS_FOUND": "K tomuto kontaktu nejsou přiřazeny žádné předchozí konverzace.",
"TITLE": "Předchozí konverzace" "TITLE": "Předchozí konverzace"
}, },
"CUSTOM_ATTRIBUTES": {
"TITLE": "Vlastní atributy"
},
"LABELS": { "LABELS": {
"TITLE": "Štítky konverzace", "TITLE": "Štítky konverzace",
"MODAL": { "MODAL": {
@ -28,11 +25,17 @@
"INACTIVE_LABELS": "Štítky dostupné v účtu", "INACTIVE_LABELS": "Štítky dostupné v účtu",
"REMOVE": "Kliknutím na ikonu X odstraníte štítek", "REMOVE": "Kliknutím na ikonu X odstraníte štítek",
"ADD": "Kliknutím na ikonu + přidáte štítek", "ADD": "Kliknutím na ikonu + přidáte štítek",
"ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Aktualizovat štítky", "UPDATE_BUTTON": "Aktualizovat štítky",
"UPDATE_ERROR": "Nelze aktualizovat štítky, zkuste to znovu." "UPDATE_ERROR": "Nelze aktualizovat štítky, zkuste to znovu."
}, },
"NO_LABELS_TO_ADD": "V účtu nejsou definovány žádné další štítky.", "NO_LABELS_TO_ADD": "V účtu nejsou definovány žádné další štítky.",
"NO_AVAILABLE_LABELS": "Do této konverzace nebyly přidány žádné štítky." "NO_AVAILABLE_LABELS": "Do této konverzace nebyly přidány žádné štítky.",
"LABEL_SELECT": {
"TITLE": "Add Labels",
"PLACEHOLDER": "Search labels",
"NO_RESULT": "No labels found"
}
}, },
"MUTE_CONTACT": "Ztlumit konverzaci", "MUTE_CONTACT": "Ztlumit konverzaci",
"UNMUTE_CONTACT": "Zrušit ztlumení konverzace", "UNMUTE_CONTACT": "Zrušit ztlumení konverzace",
@ -151,5 +154,39 @@
}, },
"VIEW_DETAILS": "Zobrazit detaily" "VIEW_DETAILS": "Zobrazit detaily"
} }
},
"NOTES": {
"HEADER": {
"TITLE": "Notes"
},
"ADD": {
"BUTTON": "Add",
"PLACEHOLDER": "Add a note",
"TITLE": "Shift + Enter to create a note"
},
"FOOTER": {
"BUTTON": "View all notes"
}
},
"CUSTOM_ATTRIBUTES": {
"TITLE": "Vlastní atributy",
"BUTTON": "Add custom attribute",
"ADD": {
"TITLE": "Create custom attribute",
"DESC": "Add custom information to this contact."
},
"FORM": {
"CREATE": "Add attribute",
"CANCEL": "Zrušit",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
"ERROR": "Invalid custom attribute name"
},
"VALUE": {
"LABEL": "Attribute value",
"PLACEHOLDER": "Eg: 11901 "
}
}
} }
} }

View file

@ -227,6 +227,7 @@
"SETTINGS": "Nastavení", "SETTINGS": "Nastavení",
"COLLABORATORS": "Spolupracující", "COLLABORATORS": "Spolupracující",
"CONFIGURATION": "Nastavení", "CONFIGURATION": "Nastavení",
"CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Formulář před chatem", "PRE_CHAT_FORM": "Formulář před chatem",
"BUSINESS_HOURS": "Pracovní doba" "BUSINESS_HOURS": "Pracovní doba"
}, },

View file

@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json'; import { default as _agentMgmt } from './agentMgmt.json';
import { default as _labelsMgmt } from './labelsMgmt.json'; import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json'; import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json'; import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json'; import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json'; import { default as _conversation } from './conversation.json';
import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json'; import { default as _inboxMgmt } from './inboxMgmt.json';
import { default as _integrations } from './integrations.json';
import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json'; import { default as _login } from './login.json';
import { default as _report } from './report.json'; import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json'; import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json'; import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json'; import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json'; import { default as _signup } from './signup.json';
import { default as _integrations } from './integrations.json'; import { default as _teamsSettings } from './teamsSettings.json';
import { default as _generalSettings } from './generalSettings.json';
export default { export default {
..._agentMgmt, ..._agentMgmt,
..._campaign,
..._cannedMgmt, ..._cannedMgmt,
..._chatlist, ..._chatlist,
..._contact, ..._contact,
..._conversation, ..._conversation,
..._generalSettings,
..._inboxMgmt, ..._inboxMgmt,
..._integrations,
..._labelsMgmt,
..._login, ..._login,
..._report, ..._report,
..._labelsMgmt,
..._resetPassword, ..._resetPassword,
..._setNewPassword, ..._setNewPassword,
..._settings, ..._settings,
..._signup, ..._signup,
..._integrations, ..._teamsSettings,
..._generalSettings,
}; };

View file

@ -38,6 +38,18 @@
{ {
"id": 1, "id": 1,
"name": "Posledních 30 dní" "name": "Posledních 30 dní"
},
{
"id": 2,
"name": "Last 3 months"
},
{
"id": 3,
"name": "Last 6 months"
},
{
"id": 4,
"name": "Last year"
} }
] ]
} }

View file

@ -0,0 +1,79 @@
{
"CAMPAIGN": {
"HEADER": "Campaigns",
"SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on <b>Add Campaign</b> 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",
"ADD": {
"TITLE": "Create a campaign",
"DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
"CANCEL_BUTTON_TEXT": "Annuller",
"CREATE_BUTTON_TEXT": "Opret",
"FORM": {
"TITLE": {
"LABEL": "Title",
"PLACEHOLDER": "Please enter the title of campaign",
"ERROR": "Title is required"
},
"MESSAGE": {
"LABEL": "Message",
"PLACEHOLDER": "Please enter the message of campaign",
"ERROR": "Message is required"
},
"SENT_BY": {
"LABEL": "Sent by",
"PLACEHOLDER": "Please select the the content of campaign",
"ERROR": "Sender is required"
},
"END_POINT": {
"LABEL": "URL",
"PLACEHOLDER": "Please enter the URL",
"ERROR": "Angiv en gyldig URL"
},
"TIME_ON_PAGE": {
"LABEL": "Time on page(Seconds)",
"PLACEHOLDER": "Please enter the time",
"ERROR": "Time on page is required"
},
"ENABLED": "Enable campaign",
"SUBMIT": "Add Campaign"
},
"API": {
"SUCCESS_MESSAGE": "Campaign created successfully",
"ERROR_MESSAGE": "There was an error. Please try again."
}
},
"EDIT": {
"TITLE": "Edit campaign",
"UPDATE_BUTTON_TEXT": "Opdater",
"API": {
"SUCCESS_MESSAGE": "Campaign updated successfully",
"ERROR_MESSAGE": "Der opstod en fejl. Prøv venligst igen"
}
},
"LIST": {
"LOADING_MESSAGE": "Loading campaigns...",
"404": "There are no campaigns created for this inbox.",
"TABLE_HEADER": {
"TITLE": "Title",
"MESSAGE": "Message",
"STATUS": "Status",
"SENDER": "Sender",
"URL": "URL",
"TIME_ON_PAGE": "Time(Seconds)",
"CREATED_AT": "Created at"
},
"BUTTONS": {
"ADD": "Add",
"EDIT": "Rediger",
"DELETE": "Slet"
},
"STATUS": {
"ENABLED": "Aktiveret",
"DISABLED": "Deaktiveret"
},
"SENDER": {
"BOT": "Bot"
}
}
}
}

View file

@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Modtaget via e-mail", "RECEIVED_VIA_EMAIL": "Modtaget via e-mail",
"VIEW_TWEET_IN_TWITTER": "Se tweet på Twitter", "VIEW_TWEET_IN_TWITTER": "Se tweet på Twitter",
"REPLY_TO_TWEET": "Svar på dette tweet", "REPLY_TO_TWEET": "Svar på dette tweet",
"NO_MESSAGES": "No Messages" "NO_MESSAGES": "No Messages",
"NO_CONTENT": "No content available"
} }
} }

View file

@ -17,9 +17,6 @@
"NO_RECORDS_FOUND": "Der er ingen tidligere samtaler tilknyttet denne kontakt.", "NO_RECORDS_FOUND": "Der er ingen tidligere samtaler tilknyttet denne kontakt.",
"TITLE": "Tidligere Samtaler" "TITLE": "Tidligere Samtaler"
}, },
"CUSTOM_ATTRIBUTES": {
"TITLE": "Brugerdefinerede Egenskaber"
},
"LABELS": { "LABELS": {
"TITLE": "Samtale Etiketter", "TITLE": "Samtale Etiketter",
"MODAL": { "MODAL": {
@ -28,11 +25,17 @@
"INACTIVE_LABELS": "Etiketter tilgængelige på kontoen", "INACTIVE_LABELS": "Etiketter tilgængelige på kontoen",
"REMOVE": "Klik på X-ikonet for at fjerne etiketten", "REMOVE": "Klik på X-ikonet for at fjerne etiketten",
"ADD": "Klik på + ikonet for at tilføje etiketten", "ADD": "Klik på + ikonet for at tilføje etiketten",
"ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Opdater etiketter", "UPDATE_BUTTON": "Opdater etiketter",
"UPDATE_ERROR": "Etiketter kunne ikke opdateres. Prøv igen." "UPDATE_ERROR": "Etiketter kunne ikke opdateres. Prøv igen."
}, },
"NO_LABELS_TO_ADD": "Der er ikke defineret flere etiketter på kontoen.", "NO_LABELS_TO_ADD": "Der er ikke defineret flere etiketter på kontoen.",
"NO_AVAILABLE_LABELS": "Der er ingen etiketter tilføjet til denne samtale." "NO_AVAILABLE_LABELS": "Der er ingen etiketter tilføjet til denne samtale.",
"LABEL_SELECT": {
"TITLE": "Add Labels",
"PLACEHOLDER": "Search labels",
"NO_RESULT": "No labels found"
}
}, },
"MUTE_CONTACT": "Gør Samtale Lydløs", "MUTE_CONTACT": "Gør Samtale Lydløs",
"UNMUTE_CONTACT": "Fjern Lydløs", "UNMUTE_CONTACT": "Fjern Lydløs",
@ -151,5 +154,39 @@
}, },
"VIEW_DETAILS": "View details" "VIEW_DETAILS": "View details"
} }
},
"NOTES": {
"HEADER": {
"TITLE": "Notes"
},
"ADD": {
"BUTTON": "Add",
"PLACEHOLDER": "Add a note",
"TITLE": "Shift + Enter to create a note"
},
"FOOTER": {
"BUTTON": "View all notes"
}
},
"CUSTOM_ATTRIBUTES": {
"TITLE": "Brugerdefinerede Egenskaber",
"BUTTON": "Add custom attribute",
"ADD": {
"TITLE": "Create custom attribute",
"DESC": "Add custom information to this contact."
},
"FORM": {
"CREATE": "Add attribute",
"CANCEL": "Annuller",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
"ERROR": "Invalid custom attribute name"
},
"VALUE": {
"LABEL": "Attribute value",
"PLACEHOLDER": "Eg: 11901 "
}
}
} }
} }

View file

@ -227,6 +227,7 @@
"SETTINGS": "Indstillinger", "SETTINGS": "Indstillinger",
"COLLABORATORS": "Samarbejdspartnere", "COLLABORATORS": "Samarbejdspartnere",
"CONFIGURATION": "Konfiguration", "CONFIGURATION": "Konfiguration",
"CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form", "PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours" "BUSINESS_HOURS": "Business Hours"
}, },

View file

@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json'; import { default as _agentMgmt } from './agentMgmt.json';
import { default as _labelsMgmt } from './labelsMgmt.json'; import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json'; import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json'; import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json'; import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json'; import { default as _conversation } from './conversation.json';
import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json'; import { default as _inboxMgmt } from './inboxMgmt.json';
import { default as _integrations } from './integrations.json';
import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json'; import { default as _login } from './login.json';
import { default as _report } from './report.json'; import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json'; import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json'; import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json'; import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json'; import { default as _signup } from './signup.json';
import { default as _integrations } from './integrations.json'; import { default as _teamsSettings } from './teamsSettings.json';
import { default as _generalSettings } from './generalSettings.json';
export default { export default {
..._agentMgmt, ..._agentMgmt,
..._campaign,
..._cannedMgmt, ..._cannedMgmt,
..._chatlist, ..._chatlist,
..._contact, ..._contact,
..._conversation, ..._conversation,
..._generalSettings,
..._inboxMgmt, ..._inboxMgmt,
..._integrations,
..._labelsMgmt,
..._login, ..._login,
..._report, ..._report,
..._labelsMgmt,
..._resetPassword, ..._resetPassword,
..._setNewPassword, ..._setNewPassword,
..._settings, ..._settings,
..._signup, ..._signup,
..._integrations, ..._teamsSettings,
..._generalSettings,
}; };

View file

@ -38,6 +38,18 @@
{ {
"id": 1, "id": 1,
"name": "Seneste 30 dage" "name": "Seneste 30 dage"
},
{
"id": 2,
"name": "Last 3 months"
},
{
"id": 3,
"name": "Last 6 months"
},
{
"id": 4,
"name": "Last year"
} }
] ]
} }

View file

@ -0,0 +1,79 @@
{
"CAMPAIGN": {
"HEADER": "Kampagnen",
"SIDEBAR_TXT": "Proaktive Nachrichten erlauben dem Kunden, ausgehende Nachrichten an seine Kontakte zu senden, was weitere Unterhaltungen auslösen würde. Klicke auf <b>Kampagne hinzufügen</b> um eine neue Kampagne zu erstellen. Sie können auch eine bestehende Kampagne bearbeiten oder löschen, indem Sie auf die Schaltfläche Bearbeiten oder Löschen klicken.",
"HEADER_BTN_TXT": "Kampagne erstellen",
"ADD": {
"TITLE": "Kampagne erstellen",
"DESC": "Proaktive Nachrichten erlauben dem Kunden, ausgehende Nachrichten an seine Kontakte zu senden, was weitere Unterhaltungen auslösen würde.",
"CANCEL_BUTTON_TEXT": "Stornieren",
"CREATE_BUTTON_TEXT": "Erstellen",
"FORM": {
"TITLE": {
"LABEL": "Titel",
"PLACEHOLDER": "Bitte geben Sie den Titel der Kampagne ein",
"ERROR": "Titel ist erforderlich"
},
"MESSAGE": {
"LABEL": "Nachricht",
"PLACEHOLDER": "Bitte geben Sie die Nachricht der Kampagne ein",
"ERROR": "Nachricht ist erforderlich"
},
"SENT_BY": {
"LABEL": "Gesendet von",
"PLACEHOLDER": "Bitte wählen Sie den Inhalt der Kampagne aus",
"ERROR": "Absender ist erforderlich"
},
"END_POINT": {
"LABEL": "URL",
"PLACEHOLDER": "Bitte URL eingeben",
"ERROR": "Bitte geben Sie eine gültige URL ein"
},
"TIME_ON_PAGE": {
"LABEL": "Zeit auf Seite (Sekunden)",
"PLACEHOLDER": "Bitte die Uhrzeit eingeben",
"ERROR": "Uhrzeit auf Seite ist erforderlich"
},
"ENABLED": "Kampagne aktivieren",
"SUBMIT": "Kampagne hinzufügen"
},
"API": {
"SUCCESS_MESSAGE": "Kampagne erfolgreich erstellt",
"ERROR_MESSAGE": "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut."
}
},
"EDIT": {
"TITLE": "Kampagne bearbeiten",
"UPDATE_BUTTON_TEXT": "Aktualisieren",
"API": {
"SUCCESS_MESSAGE": "Kampagne erfolgreich aktualisiert",
"ERROR_MESSAGE": "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut"
}
},
"LIST": {
"LOADING_MESSAGE": "Lade Kampagnen...",
"404": "There are no campaigns created for this inbox.",
"TABLE_HEADER": {
"TITLE": "Titel",
"MESSAGE": "Nachricht",
"STATUS": "Status",
"SENDER": "Absender",
"URL": "URL",
"TIME_ON_PAGE": "Zeit (Sekunden)",
"CREATED_AT": "Erstellt am"
},
"BUTTONS": {
"ADD": "Hinzufügen",
"EDIT": "Bearbeiten",
"DELETE": "Löschen"
},
"STATUS": {
"ENABLED": "Aktiviert",
"DISABLED": "Behindert"
},
"SENDER": {
"BOT": "Bot"
}
}
}
}

View file

@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Per E-Mail empfangen", "RECEIVED_VIA_EMAIL": "Per E-Mail empfangen",
"VIEW_TWEET_IN_TWITTER": "Tweet auf Twitter anzeigen", "VIEW_TWEET_IN_TWITTER": "Tweet auf Twitter anzeigen",
"REPLY_TO_TWEET": "Auf diesen Tweet antworten", "REPLY_TO_TWEET": "Auf diesen Tweet antworten",
"NO_MESSAGES": "Keine Nachrichten" "NO_MESSAGES": "Keine Nachrichten",
"NO_CONTENT": "Kein Inhalt verfügbar"
} }
} }

View file

@ -12,14 +12,11 @@
"INITIATED_FROM": "Initiiert von", "INITIATED_FROM": "Initiiert von",
"INITIATED_AT": "Initiiert bei", "INITIATED_AT": "Initiiert bei",
"IP_ADDRESS": "IP-Adresse", "IP_ADDRESS": "IP-Adresse",
"NEW_MESSAGE": "New message", "NEW_MESSAGE": "Neue Nachricht",
"CONVERSATIONS": { "CONVERSATIONS": {
"NO_RECORDS_FOUND": "Es sind keine vorherigen Gespräche mit diesem Kontakt verbunden.", "NO_RECORDS_FOUND": "Es sind keine vorherigen Gespräche mit diesem Kontakt verbunden.",
"TITLE": "Vorherige Gespräche" "TITLE": "Vorherige Gespräche"
}, },
"CUSTOM_ATTRIBUTES": {
"TITLE": "Benutzerdefinierte Attribute"
},
"LABELS": { "LABELS": {
"TITLE": "Konversationsetiketten", "TITLE": "Konversationsetiketten",
"MODAL": { "MODAL": {
@ -28,11 +25,17 @@
"INACTIVE_LABELS": "Verfügbare Labels im Konto", "INACTIVE_LABELS": "Verfügbare Labels im Konto",
"REMOVE": "Klicken Sie auf das X-Symbol, um das Label zu entfernen", "REMOVE": "Klicken Sie auf das X-Symbol, um das Label zu entfernen",
"ADD": "Klicken Sie auf das + Symbol, um ein Label hinzuzufügen", "ADD": "Klicken Sie auf das + Symbol, um ein Label hinzuzufügen",
"ADD_BUTTON": "Label hinzufügen",
"UPDATE_BUTTON": "Labels aktualisieren", "UPDATE_BUTTON": "Labels aktualisieren",
"UPDATE_ERROR": "Etiketten konnten nicht aktualisiert werden. Versuchen Sie es erneut." "UPDATE_ERROR": "Etiketten konnten nicht aktualisiert werden. Versuchen Sie es erneut."
}, },
"NO_LABELS_TO_ADD": "Es sind keine weiteren Labels im Konto definiert.", "NO_LABELS_TO_ADD": "Es sind keine weiteren Labels im Konto definiert.",
"NO_AVAILABLE_LABELS": "Zu dieser Unterhaltung wurden noch keine Labels hinzugefügt." "NO_AVAILABLE_LABELS": "Zu dieser Unterhaltung wurden noch keine Labels hinzugefügt.",
"LABEL_SELECT": {
"TITLE": "Label hinzufügen",
"PLACEHOLDER": "Labels suchen",
"NO_RESULT": "Keine Labels gefunden"
}
}, },
"MUTE_CONTACT": "Unterhaltung stummschalten", "MUTE_CONTACT": "Unterhaltung stummschalten",
"UNMUTE_CONTACT": "Unterhaltung entmuten", "UNMUTE_CONTACT": "Unterhaltung entmuten",
@ -73,8 +76,8 @@
"PHONE_NUMBER": { "PHONE_NUMBER": {
"PLACEHOLDER": "Geben Sie die Telefonnummer des Kontakts ein", "PLACEHOLDER": "Geben Sie die Telefonnummer des Kontakts ein",
"LABEL": "Telefonnummer", "LABEL": "Telefonnummer",
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]", "HELP": "Telefonnummer sollte im E.164-Format sein, z. B.: +1415555555 [+][Landesvorwahl][Landesvorwahl][Ortsvorwahl]",
"ERROR": "Phone number should be either empty or of E.164 format" "ERROR": "Telefonnummer muss leer sein oder im E.164-Format"
}, },
"LOCATION": { "LOCATION": {
"PLACEHOLDER": "Geben Sie den Standort des Kontakts ein", "PLACEHOLDER": "Geben Sie den Standort des Kontakts ein",
@ -108,27 +111,27 @@
"ERROR_MESSAGE": "Es ist ein Fehler aufgetreten, bitte versuche es erneut" "ERROR_MESSAGE": "Es ist ein Fehler aufgetreten, bitte versuche es erneut"
}, },
"NEW_CONVERSATION": { "NEW_CONVERSATION": {
"BUTTON_LABEL": "Start conversation", "BUTTON_LABEL": "Gespräch starten",
"TITLE": "Neue Unterhaltung", "TITLE": "Neue Unterhaltung",
"DESC": "Start a new conversation by sending a new message.", "DESC": "Starte eine Unterhaltung mit einer neuen Nachricht",
"NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.", "NO_INBOX": "Konnte keinen Posteingang finden, um eine neue Unterhaltung mit diesem Kontakt zu starten.",
"FORM": { "FORM": {
"TO": { "TO": {
"LABEL": "To" "LABEL": "An"
}, },
"INBOX": { "INBOX": {
"LABEL": "Inbox", "LABEL": "Posteingang",
"ERROR": "Select an inbox" "ERROR": "Posteingang auswählen"
}, },
"MESSAGE": { "MESSAGE": {
"LABEL": "Nachricht", "LABEL": "Nachricht",
"PLACEHOLDER": "Write your message here", "PLACEHOLDER": "Schreiben Sie Ihre Nachricht hier",
"ERROR": "Message can't be empty" "ERROR": "Nachricht darf nicht leer sein"
}, },
"SUBMIT": "Send message", "SUBMIT": "Nachricht senden",
"CANCEL": "Stornieren", "CANCEL": "Stornieren",
"SUCCESS_MESSAGE": "Message sent!", "SUCCESS_MESSAGE": "Nachricht gesendet!",
"ERROR_MESSAGE": "Couldn't send! try again" "ERROR_MESSAGE": "Senden fehlgeschlagen! Bitte erneut versuchen"
} }
}, },
"CONTACTS_PAGE": { "CONTACTS_PAGE": {
@ -151,5 +154,39 @@
}, },
"VIEW_DETAILS": "Details anzeigen" "VIEW_DETAILS": "Details anzeigen"
} }
},
"NOTES": {
"HEADER": {
"TITLE": "Notizen"
},
"ADD": {
"BUTTON": "Hinzufügen",
"PLACEHOLDER": "Notiz hinzufügen",
"TITLE": "Shift + Enter um eine Notiz zu erstellen"
},
"FOOTER": {
"BUTTON": "Alle Notizen anzeigen"
}
},
"CUSTOM_ATTRIBUTES": {
"TITLE": "Benutzerdefinierte Attribute",
"BUTTON": "Add custom attribute",
"ADD": {
"TITLE": "Create custom attribute",
"DESC": "Add custom information to this contact."
},
"FORM": {
"CREATE": "Add attribute",
"CANCEL": "Stornieren",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
"ERROR": "Invalid custom attribute name"
},
"VALUE": {
"LABEL": "Attribute value",
"PLACEHOLDER": "Eg: 11901 "
}
}
} }
} }

View file

@ -227,6 +227,7 @@
"SETTINGS": "Einstellungen", "SETTINGS": "Einstellungen",
"COLLABORATORS": "Mitarbeitende", "COLLABORATORS": "Mitarbeitende",
"CONFIGURATION": "Konfiguration", "CONFIGURATION": "Konfiguration",
"CAMPAIGN": "Kampagnen",
"PRE_CHAT_FORM": "Pre-Chat-Formular", "PRE_CHAT_FORM": "Pre-Chat-Formular",
"BUSINESS_HOURS": "Öffnungszeiten" "BUSINESS_HOURS": "Öffnungszeiten"
}, },

View file

@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json'; import { default as _agentMgmt } from './agentMgmt.json';
import { default as _labelsMgmt } from './labelsMgmt.json'; import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json'; import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json'; import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json'; import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json'; import { default as _conversation } from './conversation.json';
import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json'; import { default as _inboxMgmt } from './inboxMgmt.json';
import { default as _integrations } from './integrations.json';
import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json'; import { default as _login } from './login.json';
import { default as _report } from './report.json'; import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json'; import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json'; import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json'; import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json'; import { default as _signup } from './signup.json';
import { default as _integrations } from './integrations.json'; import { default as _teamsSettings } from './teamsSettings.json';
import { default as _generalSettings } from './generalSettings.json';
export default { export default {
..._agentMgmt, ..._agentMgmt,
..._campaign,
..._cannedMgmt, ..._cannedMgmt,
..._chatlist, ..._chatlist,
..._contact, ..._contact,
..._conversation, ..._conversation,
..._generalSettings,
..._inboxMgmt, ..._inboxMgmt,
..._integrations,
..._labelsMgmt,
..._login, ..._login,
..._report, ..._report,
..._labelsMgmt,
..._resetPassword, ..._resetPassword,
..._setNewPassword, ..._setNewPassword,
..._settings, ..._settings,
..._signup, ..._signup,
..._integrations, ..._teamsSettings,
..._generalSettings,
}; };

View file

@ -38,6 +38,18 @@
{ {
"id": 1, "id": 1,
"name": "Letzte 30 Tage" "name": "Letzte 30 Tage"
},
{
"id": 2,
"name": "Last 3 months"
},
{
"id": 3,
"name": "Last 6 months"
},
{
"id": 4,
"name": "Last year"
} }
] ]
} }

View file

@ -43,7 +43,7 @@
}, },
"AGENTS": { "AGENTS": {
"BUTTON_TEXT": "Agenten im Team aktualisieren", "BUTTON_TEXT": "Agenten im Team aktualisieren",
"TITLE": "Agenten zu Team hinzufügen - %{teamName}", "TITLE": "Agenten zu Team %{teamName} hinzufügen",
"DESC": "Fügen Sie Agenten zu Ihrem neu erstellten Team hinzu. Alle hinzugefügten Agenten werden benachrichtigt, wenn diesem Team eine Unterhaltung zugewiesen wird." "DESC": "Fügen Sie Agenten zu Ihrem neu erstellten Team hinzu. Alle hinzugefügten Agenten werden benachrichtigt, wenn diesem Team eine Unterhaltung zugewiesen wird."
}, },
"WIZARD": [ "WIZARD": [
@ -77,8 +77,8 @@
"SELECTED_COUNT": "%{selected} von %{total} Agenten ausgewählt." "SELECTED_COUNT": "%{selected} von %{total} Agenten ausgewählt."
}, },
"ADD": { "ADD": {
"TITLE": "Agenten zu Team hinzufügen - %{teamName}", "TITLE": "Agenten zu Team %{teamName} hinzufügen",
"DESC": "Fügen Sie Agenten zu Ihrem neu erstellten Team hinzu. So können Sie bei Gesprächen als Team zusammenarbeiten, erhalten Sie Benachrichtigungen über neue Ereignisse in der gleichen Unterhaltung.", "DESC": "Fügen Sie Agenten zu Ihrem neu erstellten Team hinzu. So können Sie bei Gesprächen als Team zusammenarbeiten und erhalten Benachrichtigungen über neue Ereignisse in der gleichen Unterhaltung.",
"SELECT": "auswählen", "SELECT": "auswählen",
"SELECT_ALL": "alle Agenten auswählen", "SELECT_ALL": "alle Agenten auswählen",
"SELECTED_COUNT": "%{selected} von %{total} Agenten ausgewählt.", "SELECTED_COUNT": "%{selected} von %{total} Agenten ausgewählt.",

View file

@ -0,0 +1,79 @@
{
"CAMPAIGN": {
"HEADER": "Καμπάνιες",
"SIDEBAR_TXT": "Τα προληπτικά μηνύματα επιτρέπουν την αποστολή εξερχόμενων μηνυμάτων στις επαφές, που θα ενεργοποιούν περισσότερες συνομιλίες. Κάντε κλικ στο <b>Προσθήκη Καμπάνιας</b> για να δημιουργήσετε μια νέα καμπάνια. Μπορείτε επίσης να επεξεργαστείτε ή να διαγράψετε μια ήδη υπάρχουσα καμπάνια κάνοντας κλικ στο κουμπί Επεξεργασία ή Διαγραφή.",
"HEADER_BTN_TXT": "Δημιουργία Καμπάνιας",
"ADD": {
"TITLE": "Δημιουργία Καμπάνιας",
"DESC": "Τα προληπτικά μηνύματα επιτρέπουν την αποστολή εξερχόμενων μηνυμάτων στις επαφές, που θα ενεργοποιούν περισσότερες συνομιλίες.",
"CANCEL_BUTTON_TEXT": "Άκυρο",
"CREATE_BUTTON_TEXT": "Δημιουργία",
"FORM": {
"TITLE": {
"LABEL": "Τίτλος",
"PLACEHOLDER": "Παρακαλώ εισάγετε τον τίτλο της καμπάνιας",
"ERROR": "Ο τίτλος είναι απαραίτητος"
},
"MESSAGE": {
"LABEL": "Μήνυμα",
"PLACEHOLDER": "Παρακαλώ εισάγετε το μήνυμα της καμπάνιας",
"ERROR": "Το μήνυμα είναι απαραίτητο"
},
"SENT_BY": {
"LABEL": "Αποστολή από",
"PLACEHOLDER": "Παρακαλώ επιλέξτε το περιεχόμενο της καμπάνιας",
"ERROR": "Ο αποστολέας είναι απαραίτητος"
},
"END_POINT": {
"LABEL": "URL",
"PLACEHOLDER": "Παρακαλώ εισάγετε το URL",
"ERROR": "Παρακαλώ εισάγετε ένα έγκυρο URL"
},
"TIME_ON_PAGE": {
"LABEL": "Χρόνος στη σελίδα(δευτερόλεπτα)",
"PLACEHOLDER": "Παρακαλώ εισάγετε το χρόνο",
"ERROR": "Ο χρόνος στη σελίδα είναι απαραίτητος"
},
"ENABLED": "Ενεργοποίηση καμπάνιας",
"SUBMIT": "Προσθήκη Καμπάνιας"
},
"API": {
"SUCCESS_MESSAGE": "Η καμπάνια δημιουργήθηκε επιτυχώς",
"ERROR_MESSAGE": "Παρουσιάστηκε σφάλμα. Παρακαλώ δοκιμάστε ξανά."
}
},
"EDIT": {
"TITLE": "Επεξεργασία καμπάνιας",
"UPDATE_BUTTON_TEXT": "Ενημέρωση",
"API": {
"SUCCESS_MESSAGE": "Η ετικέτα ενημερώθηκε επιτυχώς",
"ERROR_MESSAGE": "Υπήρξε ένα σφάλμα, παρακαλώ προσπαθήστε ξανά"
}
},
"LIST": {
"LOADING_MESSAGE": "Φόρτωση καμπάνιας...",
"404": "Δεν υπάρχουν εκστρατείες για αυτό το κιβώτιο εισερχόμενων.",
"TABLE_HEADER": {
"TITLE": "Τίτλος",
"MESSAGE": "Μήνυμα",
"STATUS": "Κατάσταση",
"SENDER": "Αποστολέας",
"URL": "URL",
"TIME_ON_PAGE": "Χρόνος (δευτερόλεπτα)",
"CREATED_AT": "Δημιουργήθηκε στις"
},
"BUTTONS": {
"ADD": "Προσθήκη",
"EDIT": "Επεξεργασία",
"DELETE": "Διαγραφή"
},
"STATUS": {
"ENABLED": "Ενεργό",
"DISABLED": "Ανενεργό"
},
"SENDER": {
"BOT": "Bot"
}
}
}
}

View file

@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Παραλήφθηκε από email", "RECEIVED_VIA_EMAIL": "Παραλήφθηκε από email",
"VIEW_TWEET_IN_TWITTER": "Προβολή του tweet στο Twitter", "VIEW_TWEET_IN_TWITTER": "Προβολή του tweet στο Twitter",
"REPLY_TO_TWEET": "Απάντηση στο tweet", "REPLY_TO_TWEET": "Απάντηση στο tweet",
"NO_MESSAGES": "Κανένα Μήνυμα" "NO_MESSAGES": "Κανένα Μήνυμα",
"NO_CONTENT": "Μη διαθέσιμο περιεχόμενο"
} }
} }

View file

@ -12,14 +12,11 @@
"INITIATED_FROM": "Αρχικοποίηση από", "INITIATED_FROM": "Αρχικοποίηση από",
"INITIATED_AT": "Αρχικοποίηση τις", "INITIATED_AT": "Αρχικοποίηση τις",
"IP_ADDRESS": "Διεύθυνση IP", "IP_ADDRESS": "Διεύθυνση IP",
"NEW_MESSAGE": "New message", "NEW_MESSAGE": "Νέο Μήνυμα",
"CONVERSATIONS": { "CONVERSATIONS": {
"NO_RECORDS_FOUND": "Δεν υπάρχουν προηγούμενες συνομιλίες που σχετίζονται με αυτήν την επαφή.", "NO_RECORDS_FOUND": "Δεν υπάρχουν προηγούμενες συνομιλίες που σχετίζονται με αυτήν την επαφή.",
"TITLE": "Προηγούμενες συνομιλίες" "TITLE": "Προηγούμενες συνομιλίες"
}, },
"CUSTOM_ATTRIBUTES": {
"TITLE": "Προσαρμοζόμενες Ιδιότητες"
},
"LABELS": { "LABELS": {
"TITLE": "Ετικέτες συνομιλίας", "TITLE": "Ετικέτες συνομιλίας",
"MODAL": { "MODAL": {
@ -28,11 +25,17 @@
"INACTIVE_LABELS": "Υπάρχουν διαθέσιμες ετικέτες στον λογαριασμό", "INACTIVE_LABELS": "Υπάρχουν διαθέσιμες ετικέτες στον λογαριασμό",
"REMOVE": "Πατήστε στο εικονίδιο X για να απομακρύνετε την ετικέτα", "REMOVE": "Πατήστε στο εικονίδιο X για να απομακρύνετε την ετικέτα",
"ADD": "Πατήστε στο εικονίδιο + για να προσθέστε την ετικέτα", "ADD": "Πατήστε στο εικονίδιο + για να προσθέστε την ετικέτα",
"ADD_BUTTON": "Προσθήκη Ετικετών",
"UPDATE_BUTTON": "Ενημέρωση Ετικετών", "UPDATE_BUTTON": "Ενημέρωση Ετικετών",
"UPDATE_ERROR": "Δεν μπορούν να ενημερωθούν οι ετικέτες, προσπαθήστε ξανά." "UPDATE_ERROR": "Δεν μπορούν να ενημερωθούν οι ετικέτες, προσπαθήστε ξανά."
}, },
"NO_LABELS_TO_ADD": "Δεν υπάρχουν άλλες ετικέτες στον λογαριασμό.", "NO_LABELS_TO_ADD": "Δεν υπάρχουν άλλες ετικέτες στον λογαριασμό.",
"NO_AVAILABLE_LABELS": "Δεν υπάρχουν προστεθεί ετικέτες στην συνομιλία." "NO_AVAILABLE_LABELS": "Δεν υπάρχουν προστεθεί ετικέτες στην συνομιλία.",
"LABEL_SELECT": {
"TITLE": "Προσθήκη Ετικετών",
"PLACEHOLDER": "Αναζήτηση ετικετών",
"NO_RESULT": "Δεν βρέθηκαν ετικέτες"
}
}, },
"MUTE_CONTACT": "Σίγαση Συνομιλίας", "MUTE_CONTACT": "Σίγαση Συνομιλίας",
"UNMUTE_CONTACT": "Επαναφορά Συνομιλίας", "UNMUTE_CONTACT": "Επαναφορά Συνομιλίας",
@ -108,27 +111,27 @@
"ERROR_MESSAGE": "Υπήρξε ένα σφάλμα, παρακαλώ προσπαθήστε ξανά" "ERROR_MESSAGE": "Υπήρξε ένα σφάλμα, παρακαλώ προσπαθήστε ξανά"
}, },
"NEW_CONVERSATION": { "NEW_CONVERSATION": {
"BUTTON_LABEL": "Start conversation", "BUTTON_LABEL": "Έναρξη Συνομιλίας",
"TITLE": "Νέα συνομιλία", "TITLE": "Νέα συνομιλία",
"DESC": "Start a new conversation by sending a new message.", "DESC": "Ξεκινήστε μια νέα συνομιλία στέλνοντας ένα νέο μήνυμα.",
"NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.", "NO_INBOX": "Δεν βρέθηκε ένα κιβώτιο εισερχόμενων για να ξεκινήσει μια νέα συνομιλία με αυτήν την επαφή.",
"FORM": { "FORM": {
"TO": { "TO": {
"LABEL": "To" "LABEL": "Προς"
}, },
"INBOX": { "INBOX": {
"LABEL": "Inbox", "LABEL": "Εισερχόμενα",
"ERROR": "Select an inbox" "ERROR": "Επιλέξτε ένα κιβώτιο εισερχόμενων"
}, },
"MESSAGE": { "MESSAGE": {
"LABEL": "Μήνυμα", "LABEL": "Μήνυμα",
"PLACEHOLDER": "Write your message here", "PLACEHOLDER": "Γράψτε το μήνυμά σας εδώ",
"ERROR": "Message can't be empty" "ERROR": "Το μήνυμα δεν μπορεί να είναι άδειο"
}, },
"SUBMIT": "Send message", "SUBMIT": "Αποστολή μηνύματος",
"CANCEL": "Άκυρο", "CANCEL": "Άκυρο",
"SUCCESS_MESSAGE": "Message sent!", "SUCCESS_MESSAGE": "Το μήνυμα στάλθηκε!",
"ERROR_MESSAGE": "Couldn't send! try again" "ERROR_MESSAGE": "Αδυναμία αποστολής! Προσπαθήστε ξανά"
} }
}, },
"CONTACTS_PAGE": { "CONTACTS_PAGE": {
@ -151,5 +154,39 @@
}, },
"VIEW_DETAILS": "Προβολή λεπτομεριών" "VIEW_DETAILS": "Προβολή λεπτομεριών"
} }
},
"NOTES": {
"HEADER": {
"TITLE": "Σημειώσεις"
},
"ADD": {
"BUTTON": "Προσθήκη",
"PLACEHOLDER": "Προσθήκη σημείωσης",
"TITLE": "Shift + Enter για δημιουργία σημείωσης"
},
"FOOTER": {
"BUTTON": "Εμφάνιση όλων των σημειώσεων"
}
},
"CUSTOM_ATTRIBUTES": {
"TITLE": "Προσαρμοζόμενες Ιδιότητες",
"BUTTON": "Add custom attribute",
"ADD": {
"TITLE": "Create custom attribute",
"DESC": "Add custom information to this contact."
},
"FORM": {
"CREATE": "Add attribute",
"CANCEL": "Άκυρο",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
"ERROR": "Invalid custom attribute name"
},
"VALUE": {
"LABEL": "Attribute value",
"PLACEHOLDER": "Eg: 11901 "
}
}
} }
} }

View file

@ -92,7 +92,7 @@
"DESC": "Ενσωματώστε το Twilio και αρχίστε να υποστηρίζετε τους πελάτες σας μέσω SMS.", "DESC": "Ενσωματώστε το Twilio και αρχίστε να υποστηρίζετε τους πελάτες σας μέσω SMS.",
"ACCOUNT_SID": { "ACCOUNT_SID": {
"LABEL": "SID Λογαριασμού", "LABEL": "SID Λογαριασμού",
"PLACEHOLDER": "Παρακαλώ εισάγετε το SID του Λογαριασμού Twillio", "PLACEHOLDER": "Παρακαλώ εισάγετε το SID του Λογαριασμού Twilio",
"ERROR": "Το πεδίο είναι απαραίτητο" "ERROR": "Το πεδίο είναι απαραίτητο"
}, },
"CHANNEL_TYPE": { "CHANNEL_TYPE": {
@ -118,7 +118,7 @@
"TITLE": "URL επανάκλησης", "TITLE": "URL επανάκλησης",
"SUBTITLE": "Πρέπει να ρυθμίσετε το callback URL στο Twilio με το URL που αναφέρεται εδώ." "SUBTITLE": "Πρέπει να ρυθμίσετε το callback URL στο Twilio με το URL που αναφέρεται εδώ."
}, },
"SUBMIT_BUTTON": "Δημιουργία Καναλιού Twillio", "SUBMIT_BUTTON": "Δημιουργία Καναλιού Twilio",
"API": { "API": {
"ERROR_MESSAGE": "Δεν ήταν δυνατή η πιστοποίηση των διαπιστευτηρίων Twilio. Δοκιμάστε ξανά" "ERROR_MESSAGE": "Δεν ήταν δυνατή η πιστοποίηση των διαπιστευτηρίων Twilio. Δοκιμάστε ξανά"
} }
@ -227,6 +227,7 @@
"SETTINGS": "Ρυθμίσεις", "SETTINGS": "Ρυθμίσεις",
"COLLABORATORS": "Συνεργάτες", "COLLABORATORS": "Συνεργάτες",
"CONFIGURATION": "Διαμόρφωση", "CONFIGURATION": "Διαμόρφωση",
"CAMPAIGN": "Καμπάνιες",
"PRE_CHAT_FORM": "Φόρμα Προ-Συνομιλίας", "PRE_CHAT_FORM": "Φόρμα Προ-Συνομιλίας",
"BUSINESS_HOURS": "Ώρες Εργασίας" "BUSINESS_HOURS": "Ώρες Εργασίας"
}, },

View file

@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json'; import { default as _agentMgmt } from './agentMgmt.json';
import { default as _labelsMgmt } from './labelsMgmt.json'; import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json'; import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json'; import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json'; import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json'; import { default as _conversation } from './conversation.json';
import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json'; import { default as _inboxMgmt } from './inboxMgmt.json';
import { default as _integrations } from './integrations.json';
import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json'; import { default as _login } from './login.json';
import { default as _report } from './report.json'; import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json'; import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json'; import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json'; import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json'; import { default as _signup } from './signup.json';
import { default as _integrations } from './integrations.json'; import { default as _teamsSettings } from './teamsSettings.json';
import { default as _generalSettings } from './generalSettings.json';
export default { export default {
..._agentMgmt, ..._agentMgmt,
..._campaign,
..._cannedMgmt, ..._cannedMgmt,
..._chatlist, ..._chatlist,
..._contact, ..._contact,
..._conversation, ..._conversation,
..._generalSettings,
..._inboxMgmt, ..._inboxMgmt,
..._integrations,
..._labelsMgmt,
..._login, ..._login,
..._report, ..._report,
..._labelsMgmt,
..._resetPassword, ..._resetPassword,
..._setNewPassword, ..._setNewPassword,
..._settings, ..._settings,
..._signup, ..._signup,
..._integrations, ..._teamsSettings,
..._generalSettings,
}; };

View file

@ -38,6 +38,18 @@
{ {
"id": 1, "id": 1,
"name": "Τελευταίες 30 ημέρες" "name": "Τελευταίες 30 ημέρες"
},
{
"id": 2,
"name": "Τελευταίοι 3 μήνες"
},
{
"id": 3,
"name": "Τελευταίοι 6 μήνες"
},
{
"id": 4,
"name": "Τελευταίο έτος"
} }
] ]
} }

View file

@ -1,9 +1,79 @@
{ {
"CAMPAIGN": { "CAMPAIGN": {
"HEADER": "Campaigns", "HEADER": "Campaigns",
"HEADER_BTN_TXT": "Create Campaign", "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on <b>Add Campaign</b> 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",
"ADD": {
"TITLE": "Create a campaign",
"DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
"CANCEL_BUTTON_TEXT": "Cancel",
"CREATE_BUTTON_TEXT": "Create",
"FORM": {
"TITLE": {
"LABEL": "Title",
"PLACEHOLDER": "Please enter the title of campaign",
"ERROR": "Title is required"
},
"MESSAGE": {
"LABEL": "Message",
"PLACEHOLDER": "Please enter the message of campaign",
"ERROR": "Message is required"
},
"SENT_BY": {
"LABEL": "Sent by",
"PLACEHOLDER": "Please select the the content of campaign",
"ERROR": "Sender is required"
},
"END_POINT": {
"LABEL": "URL",
"PLACEHOLDER": "Please enter the URL",
"ERROR": "Please enter a valid URL"
},
"TIME_ON_PAGE": {
"LABEL": "Time on page(Seconds)",
"PLACEHOLDER": "Please enter the time",
"ERROR": "Time on page is required"
},
"ENABLED": "Enable campaign",
"SUBMIT": "Add Campaign"
},
"API": {
"SUCCESS_MESSAGE": "Campaign created successfully",
"ERROR_MESSAGE": "There was an error. Please try again."
}
},
"EDIT": {
"TITLE": "Edit campaign",
"UPDATE_BUTTON_TEXT": "Update",
"API": {
"SUCCESS_MESSAGE": "Campaign updated successfully",
"ERROR_MESSAGE": "There was an error, please try again"
}
},
"LIST": { "LIST": {
"404": "There are no campaigns attached to this inbox" "LOADING_MESSAGE": "Loading campaigns...",
"404": "There are no campaigns created for this inbox.",
"TABLE_HEADER": {
"TITLE": "Title",
"MESSAGE": "Message",
"STATUS": "Status",
"SENDER": "Sender",
"URL": "URL",
"TIME_ON_PAGE": "Time(Seconds)",
"CREATED_AT": "Created at"
},
"BUTTONS": {
"ADD": "Add",
"EDIT": "Edit",
"DELETE": "Delete"
},
"STATUS": {
"ENABLED": "Enabled",
"DISABLED": "Disabled"
},
"SENDER": {
"BOT": "Bot"
}
} }
} }
} }

View file

@ -17,9 +17,6 @@
"NO_RECORDS_FOUND": "There are no previous conversations associated to this contact.", "NO_RECORDS_FOUND": "There are no previous conversations associated to this contact.",
"TITLE": "Previous Conversations" "TITLE": "Previous Conversations"
}, },
"CUSTOM_ATTRIBUTES": {
"TITLE": "Custom Attributes"
},
"LABELS": { "LABELS": {
"TITLE": "Conversation Labels", "TITLE": "Conversation Labels",
"MODAL": { "MODAL": {
@ -28,11 +25,17 @@
"INACTIVE_LABELS": "Labels available in the account", "INACTIVE_LABELS": "Labels available in the account",
"REMOVE": "Click on X icon to remove the label", "REMOVE": "Click on X icon to remove the label",
"ADD": "Click on + icon to add the label", "ADD": "Click on + icon to add the label",
"ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Update labels", "UPDATE_BUTTON": "Update labels",
"UPDATE_ERROR": "Couldn't update labels, try again." "UPDATE_ERROR": "Couldn't update labels, try again."
}, },
"NO_LABELS_TO_ADD": "There are no more labels defined in the account.", "NO_LABELS_TO_ADD": "There are no more labels defined in the account.",
"NO_AVAILABLE_LABELS": "There are no labels added to this conversation." "NO_AVAILABLE_LABELS": "There are no labels added to this conversation.",
"LABEL_SELECT": {
"TITLE": "Add Labels",
"PLACEHOLDER": "Search labels",
"NO_RESULT": "No labels found"
}
}, },
"MUTE_CONTACT": "Mute Conversation", "MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation", "UNMUTE_CONTACT": "Unmute Conversation",
@ -151,5 +154,39 @@
}, },
"VIEW_DETAILS": "View details" "VIEW_DETAILS": "View details"
} }
},
"NOTES": {
"HEADER": {
"TITLE": "Notes"
},
"ADD": {
"BUTTON": "Add",
"PLACEHOLDER": "Add a note",
"TITLE": "Shift + Enter to create a note"
},
"FOOTER": {
"BUTTON": "View all notes"
}
},
"CUSTOM_ATTRIBUTES": {
"TITLE": "Custom Attributes",
"BUTTON": "Add custom attribute",
"ADD": {
"TITLE": "Create custom attribute",
"DESC": "Add custom information to this contact."
},
"FORM": {
"CREATE": "Add attribute",
"CANCEL": "Cancel",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
"ERROR": "Invalid custom attribute name"
},
"VALUE": {
"LABEL": "Attribute value",
"PLACEHOLDER": "Eg: 11901 "
}
}
} }
} }

View file

@ -1,38 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json'; import { default as _agentMgmt } from './agentMgmt.json';
import { default as _labelsMgmt } from './labelsMgmt.json'; import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json'; import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json'; import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json'; import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json'; import { default as _conversation } from './conversation.json';
import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json'; import { default as _inboxMgmt } from './inboxMgmt.json';
import { default as _integrations } from './integrations.json';
import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json'; import { default as _login } from './login.json';
import { default as _report } from './report.json'; import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json'; import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json'; import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json'; import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json'; import { default as _signup } from './signup.json';
import { default as _integrations } from './integrations.json';
import { default as _generalSettings } from './generalSettings.json';
import { default as _teamsSettings } from './teamsSettings.json'; import { default as _teamsSettings } from './teamsSettings.json';
import { default as _campaign } from './campaign.json';
export default { export default {
..._agentMgmt, ..._agentMgmt,
..._campaign,
..._cannedMgmt, ..._cannedMgmt,
..._chatlist, ..._chatlist,
..._contact, ..._contact,
..._conversation, ..._conversation,
..._generalSettings,
..._inboxMgmt, ..._inboxMgmt,
..._integrations,
..._labelsMgmt,
..._login, ..._login,
..._report, ..._report,
..._labelsMgmt,
..._resetPassword, ..._resetPassword,
..._setNewPassword, ..._setNewPassword,
..._settings, ..._settings,
..._signup, ..._signup,
..._integrations,
..._generalSettings,
..._teamsSettings, ..._teamsSettings,
..._campaign,
}; };

View file

@ -38,6 +38,18 @@
{ {
"id": 1, "id": 1,
"name": "Last 30 days" "name": "Last 30 days"
},
{
"id": 2,
"name": "Last 3 months"
},
{
"id": 3,
"name": "Last 6 months"
},
{
"id": 4,
"name": "Last year"
} }
] ]
} }

View file

@ -0,0 +1,79 @@
{
"CAMPAIGN": {
"HEADER": "Campañas",
"SIDEBAR_TXT": "Los mensajes proactivos permiten al cliente enviar mensajes a sus contactos, lo que generaría más conversaciones. Haga clic en <b>Añadir Campaña</b> para crear una nueva campaña. También puede editar o borrar una campaña existente haciendo clic en el botón de Editar o Borrar.",
"HEADER_BTN_TXT": "Crear campaña",
"ADD": {
"TITLE": "Crear campaña",
"DESC": "Los mensajes proactivos permiten al cliente enviar mensajes a sus contactos, lo que generaría más conversaciones.",
"CANCEL_BUTTON_TEXT": "Cancelar",
"CREATE_BUTTON_TEXT": "Crear",
"FORM": {
"TITLE": {
"LABEL": "Título",
"PLACEHOLDER": "Por favor escriba un título para la campaña",
"ERROR": "El título es obligatorio"
},
"MESSAGE": {
"LABEL": "Mensaje",
"PLACEHOLDER": "Por favor escriba el mensaje para la campaña",
"ERROR": "El mensaje es obligatorio"
},
"SENT_BY": {
"LABEL": "Enviado por",
"PLACEHOLDER": "Por favor seleccione el contenido de la campaña",
"ERROR": "El remitente es obligatorio"
},
"END_POINT": {
"LABEL": "URL",
"PLACEHOLDER": "Por favor escriba el URL",
"ERROR": "Por favor, introduzca una URL válida"
},
"TIME_ON_PAGE": {
"LABEL": "Tiempo en la página (segundos)",
"PLACEHOLDER": "Por favor escriba la hora",
"ERROR": "La hora en la página es obligatoria"
},
"ENABLED": "Habilitar campaña",
"SUBMIT": "Añadir campaña"
},
"API": {
"SUCCESS_MESSAGE": "campaña creada satisfactoriamente",
"ERROR_MESSAGE": "Se presentó un error. Por favor intente nuevamente."
}
},
"EDIT": {
"TITLE": "Editar campaña",
"UPDATE_BUTTON_TEXT": "Actualizar",
"API": {
"SUCCESS_MESSAGE": "Campaña actualizada satisfactoriamente",
"ERROR_MESSAGE": "Hubo un error, por favor inténtelo de nuevo"
}
},
"LIST": {
"LOADING_MESSAGE": "Cargando campañas...",
"404": "No hay campañas creadas en esta bandeja.",
"TABLE_HEADER": {
"TITLE": "Título",
"MESSAGE": "Mensaje",
"STATUS": "Estado",
"SENDER": "Remitente",
"URL": "URL",
"TIME_ON_PAGE": "Tiempo (segundos)",
"CREATED_AT": "Creado el"
},
"BUTTONS": {
"ADD": "Añadir",
"EDIT": "Editar",
"DELETE": "Eliminar"
},
"STATUS": {
"ENABLED": "Activado",
"DISABLED": "Deshabilitado"
},
"SENDER": {
"BOT": "Bot"
}
}
}
}

View file

@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Recibido por correo electrónico", "RECEIVED_VIA_EMAIL": "Recibido por correo electrónico",
"VIEW_TWEET_IN_TWITTER": "Ver trino en Twitter", "VIEW_TWEET_IN_TWITTER": "Ver trino en Twitter",
"REPLY_TO_TWEET": "Responder a éste trino", "REPLY_TO_TWEET": "Responder a éste trino",
"NO_MESSAGES": "No hay mensajes" "NO_MESSAGES": "No hay mensajes",
"NO_CONTENT": "No hay contenido disponible"
} }
} }

View file

@ -17,9 +17,6 @@
"NO_RECORDS_FOUND": "No hay conversaciones previas asociadas a este contacto.", "NO_RECORDS_FOUND": "No hay conversaciones previas asociadas a este contacto.",
"TITLE": "Conversaciones anteriores" "TITLE": "Conversaciones anteriores"
}, },
"CUSTOM_ATTRIBUTES": {
"TITLE": "Atributos personalizados"
},
"LABELS": { "LABELS": {
"TITLE": "Etiquetas de conversación", "TITLE": "Etiquetas de conversación",
"MODAL": { "MODAL": {
@ -28,11 +25,17 @@
"INACTIVE_LABELS": "Etiquetas disponibles en la cuenta", "INACTIVE_LABELS": "Etiquetas disponibles en la cuenta",
"REMOVE": "Haga clic en el icono X para quitar la etiqueta", "REMOVE": "Haga clic en el icono X para quitar la etiqueta",
"ADD": "Haga clic en el icono + para añadir la etiqueta", "ADD": "Haga clic en el icono + para añadir la etiqueta",
"ADD_BUTTON": "Añadir etiquetas",
"UPDATE_BUTTON": "Actualizar etiquetas", "UPDATE_BUTTON": "Actualizar etiquetas",
"UPDATE_ERROR": "No se han podido actualizar las etiquetas, inténtelo de nuevo." "UPDATE_ERROR": "No se han podido actualizar las etiquetas, inténtelo de nuevo."
}, },
"NO_LABELS_TO_ADD": "No hay más etiquetas definidas en la cuenta.", "NO_LABELS_TO_ADD": "No hay más etiquetas definidas en la cuenta.",
"NO_AVAILABLE_LABELS": "No hay etiquetas añadidas a esta conversación." "NO_AVAILABLE_LABELS": "No hay etiquetas añadidas a esta conversación.",
"LABEL_SELECT": {
"TITLE": "Añadir etiquetas",
"PLACEHOLDER": "Buscar etiquetas",
"NO_RESULT": "No se encontraron etiquetas"
}
}, },
"MUTE_CONTACT": "Silenciar Conversación", "MUTE_CONTACT": "Silenciar Conversación",
"UNMUTE_CONTACT": "Dessilenciar conversación", "UNMUTE_CONTACT": "Dessilenciar conversación",
@ -151,5 +154,39 @@
}, },
"VIEW_DETAILS": "Ver detalles" "VIEW_DETAILS": "Ver detalles"
} }
},
"NOTES": {
"HEADER": {
"TITLE": "Notas"
},
"ADD": {
"BUTTON": "Añadir",
"PLACEHOLDER": "Añadir nota",
"TITLE": "Shift + Enter para crear una nota"
},
"FOOTER": {
"BUTTON": "Ver todas las notas"
}
},
"CUSTOM_ATTRIBUTES": {
"TITLE": "Atributos personalizados",
"BUTTON": "Add custom attribute",
"ADD": {
"TITLE": "Create custom attribute",
"DESC": "Add custom information to this contact."
},
"FORM": {
"CREATE": "Add attribute",
"CANCEL": "Cancelar",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
"ERROR": "Invalid custom attribute name"
},
"VALUE": {
"LABEL": "Attribute value",
"PLACEHOLDER": "Eg: 11901 "
}
}
} }
} }

View file

@ -11,7 +11,7 @@
"TITLE": "Buscar mensajes", "TITLE": "Buscar mensajes",
"LOADING_MESSAGE": "Cruzando datos...", "LOADING_MESSAGE": "Cruzando datos...",
"PLACEHOLDER": "Escriba cualquier texto para buscar mensajes", "PLACEHOLDER": "Escriba cualquier texto para buscar mensajes",
"NO_MATCHING_RESULTS": "No results found." "NO_MATCHING_RESULTS": "No se encontraron resultados."
}, },
"UNREAD_MESSAGES": "Mensajes no leídos", "UNREAD_MESSAGES": "Mensajes no leídos",
"UNREAD_MESSAGE": "Mensaje sin leer", "UNREAD_MESSAGE": "Mensaje sin leer",
@ -57,7 +57,7 @@
"VISIBLE_TO_AGENTS": "Nota privada: solo visible para ti y tu equipo", "VISIBLE_TO_AGENTS": "Nota privada: solo visible para ti y tu equipo",
"CHANGE_STATUS": "Estado de la conversación cambiado", "CHANGE_STATUS": "Estado de la conversación cambiado",
"CHANGE_AGENT": "Conversación cambiada de asignatario", "CHANGE_AGENT": "Conversación cambiada de asignatario",
"CHANGE_TEAM": "Conversation team changed", "CHANGE_TEAM": "Equipo de conversación cambiado",
"FILE_SIZE_LIMIT": "El archivo excede el límite de los archivos adjuntos {MAXIMUM_FILE_UPLOAD_SIZE}", "FILE_SIZE_LIMIT": "El archivo excede el límite de los archivos adjuntos {MAXIMUM_FILE_UPLOAD_SIZE}",
"SENT_BY": "Enviado por:", "SENT_BY": "Enviado por:",
"ASSIGNMENT": { "ASSIGNMENT": {
@ -108,11 +108,11 @@
} }
}, },
"CONVERSATION_SIDEBAR": { "CONVERSATION_SIDEBAR": {
"DETAILS_TITLE": "Conversations Details", "DETAILS_TITLE": "Detalles de la conversación",
"ASSIGNEE_LABEL": "Assigned Agent", "ASSIGNEE_LABEL": "Agente asignado",
"TEAM_LABEL": "Assigned Team", "TEAM_LABEL": "Equipo asignado",
"SELECT": { "SELECT": {
"PLACEHOLDER": "None" "PLACEHOLDER": "Ninguna"
} }
} }
} }

View file

@ -227,6 +227,7 @@
"SETTINGS": "Ajustes", "SETTINGS": "Ajustes",
"COLLABORATORS": "Colaboradores", "COLLABORATORS": "Colaboradores",
"CONFIGURATION": "Configuración", "CONFIGURATION": "Configuración",
"CAMPAIGN": "Campañas",
"PRE_CHAT_FORM": "Pre-formulario de chat", "PRE_CHAT_FORM": "Pre-formulario de chat",
"BUSINESS_HOURS": "Horarios" "BUSINESS_HOURS": "Horarios"
}, },

View file

@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json'; import { default as _agentMgmt } from './agentMgmt.json';
import { default as _labelsMgmt } from './labelsMgmt.json'; import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json'; import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json'; import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json'; import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json'; import { default as _conversation } from './conversation.json';
import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json'; import { default as _inboxMgmt } from './inboxMgmt.json';
import { default as _integrations } from './integrations.json';
import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json'; import { default as _login } from './login.json';
import { default as _report } from './report.json'; import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json'; import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json'; import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json'; import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json'; import { default as _signup } from './signup.json';
import { default as _integrations } from './integrations.json'; import { default as _teamsSettings } from './teamsSettings.json';
import { default as _generalSettings } from './generalSettings.json';
export default { export default {
..._agentMgmt, ..._agentMgmt,
..._campaign,
..._cannedMgmt, ..._cannedMgmt,
..._chatlist, ..._chatlist,
..._contact, ..._contact,
..._conversation, ..._conversation,
..._generalSettings,
..._inboxMgmt, ..._inboxMgmt,
..._integrations,
..._labelsMgmt,
..._login, ..._login,
..._report, ..._report,
..._labelsMgmt,
..._resetPassword, ..._resetPassword,
..._setNewPassword, ..._setNewPassword,
..._settings, ..._settings,
..._signup, ..._signup,
..._integrations, ..._teamsSettings,
..._generalSettings,
}; };

View file

@ -38,6 +38,18 @@
{ {
"id": 1, "id": 1,
"name": "Últimos 30 días" "name": "Últimos 30 días"
},
{
"id": 2,
"name": "Últimos 3 meses"
},
{
"id": 3,
"name": "Últimos 6 meses"
},
{
"id": 4,
"name": "Último año"
} }
] ]
} }

View file

@ -3,7 +3,7 @@
"LINK": "Ajustes del perfil", "LINK": "Ajustes del perfil",
"TITLE": "Ajustes del perfil", "TITLE": "Ajustes del perfil",
"BTN_TEXT": "Actualizar perfil", "BTN_TEXT": "Actualizar perfil",
"UPDATE_SUCCESS": "Your profile has been updated successfully", "UPDATE_SUCCESS": "Tu perfil se ha actualizado correctamente",
"PASSWORD_UPDATE_SUCCESS": "Su contraseña se ha cambiado correctamente", "PASSWORD_UPDATE_SUCCESS": "Su contraseña se ha cambiado correctamente",
"AFTER_EMAIL_CHANGED": "Su perfil ha sido actualizado con éxito, por favor inicie sesión de nuevo cuando sus credenciales de inicio de sesión se hayan cambiado", "AFTER_EMAIL_CHANGED": "Su perfil ha sido actualizado con éxito, por favor inicie sesión de nuevo cuando sus credenciales de inicio de sesión se hayan cambiado",
"FORM": { "FORM": {
@ -19,7 +19,7 @@
"PASSWORD_SECTION": { "PASSWORD_SECTION": {
"TITLE": "Contraseña", "TITLE": "Contraseña",
"NOTE": "Actualizar tu contraseña restablecería tus entradas en varios dispositivos.", "NOTE": "Actualizar tu contraseña restablecería tus entradas en varios dispositivos.",
"BTN_TEXT": "Change password" "BTN_TEXT": "Cambiar contraseña"
}, },
"ACCESS_TOKEN": { "ACCESS_TOKEN": {
"TITLE": "Token de acceso", "TITLE": "Token de acceso",

View file

@ -0,0 +1,79 @@
{
"CAMPAIGN": {
"HEADER": "Campaigns",
"SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on <b>Add Campaign</b> 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",
"ADD": {
"TITLE": "Create a campaign",
"DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
"CANCEL_BUTTON_TEXT": "انصراف",
"CREATE_BUTTON_TEXT": "ايجاد كردن",
"FORM": {
"TITLE": {
"LABEL": "عنوان",
"PLACEHOLDER": "Please enter the title of campaign",
"ERROR": "Title is required"
},
"MESSAGE": {
"LABEL": "پیام",
"PLACEHOLDER": "Please enter the message of campaign",
"ERROR": "Message is required"
},
"SENT_BY": {
"LABEL": "ارسال شده توسط",
"PLACEHOLDER": "Please select the the content of campaign",
"ERROR": "Sender is required"
},
"END_POINT": {
"LABEL": "URL",
"PLACEHOLDER": "Please enter the URL",
"ERROR": "لطفا آدرس URL صحیحی وارد کنید"
},
"TIME_ON_PAGE": {
"LABEL": "Time on page(Seconds)",
"PLACEHOLDER": "Please enter the time",
"ERROR": "Time on page is required"
},
"ENABLED": "Enable campaign",
"SUBMIT": "Add Campaign"
},
"API": {
"SUCCESS_MESSAGE": "Campaign created successfully",
"ERROR_MESSAGE": "There was an error. Please try again."
}
},
"EDIT": {
"TITLE": "Edit campaign",
"UPDATE_BUTTON_TEXT": "اعمال شود",
"API": {
"SUCCESS_MESSAGE": "Campaign updated successfully",
"ERROR_MESSAGE": "خطایی پیش آمد. لطفا دوباره امتحان کنید"
}
},
"LIST": {
"LOADING_MESSAGE": "Loading campaigns...",
"404": "There are no campaigns created for this inbox.",
"TABLE_HEADER": {
"TITLE": "عنوان",
"MESSAGE": "پیام",
"STATUS": "وضعیت",
"SENDER": "Sender",
"URL": "URL",
"TIME_ON_PAGE": "Time(Seconds)",
"CREATED_AT": "Created at"
},
"BUTTONS": {
"ADD": "افزودن",
"EDIT": "ویرایش",
"DELETE": "حذف"
},
"STATUS": {
"ENABLED": "فعال",
"DISABLED": "غیرفعال"
},
"SENDER": {
"BOT": "ربات"
}
}
}
}

View file

@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "از طریق ایمیل دریافت شد", "RECEIVED_VIA_EMAIL": "از طریق ایمیل دریافت شد",
"VIEW_TWEET_IN_TWITTER": "مشاهده توییت در توییتر", "VIEW_TWEET_IN_TWITTER": "مشاهده توییت در توییتر",
"REPLY_TO_TWEET": "پاسخ به این توییت", "REPLY_TO_TWEET": "پاسخ به این توییت",
"NO_MESSAGES": "هیچ پیامی وجود ندارد" "NO_MESSAGES": "هیچ پیامی وجود ندارد",
"NO_CONTENT": "هیچ محتوایی موجود نیست"
} }
} }

View file

@ -17,9 +17,6 @@
"NO_RECORDS_FOUND": "این اولین گفتگوی این کاربر است.", "NO_RECORDS_FOUND": "این اولین گفتگوی این کاربر است.",
"TITLE": "گفتگوهای قبلی" "TITLE": "گفتگوهای قبلی"
}, },
"CUSTOM_ATTRIBUTES": {
"TITLE": "ویژگی‌های سفارشی"
},
"LABELS": { "LABELS": {
"TITLE": "برچسب‌های گفتگو", "TITLE": "برچسب‌های گفتگو",
"MODAL": { "MODAL": {
@ -28,11 +25,17 @@
"INACTIVE_LABELS": "برچسب‌های موجود در حساب‌کاربری", "INACTIVE_LABELS": "برچسب‌های موجود در حساب‌کاربری",
"REMOVE": "برای پاک کردن برچسب، روی آیکون X کلیک کنید", "REMOVE": "برای پاک کردن برچسب، روی آیکون X کلیک کنید",
"ADD": "برای افزودن برچسب بر روی آیکون + کلیک کنید", "ADD": "برای افزودن برچسب بر روی آیکون + کلیک کنید",
"ADD_BUTTON": "افزودن برچسب‌ها",
"UPDATE_BUTTON": "تغییر برچسب‌ها", "UPDATE_BUTTON": "تغییر برچسب‌ها",
"UPDATE_ERROR": "برچسب‌ها تغییری نکردند، لطفا بعدا امتحان کنید." "UPDATE_ERROR": "برچسب‌ها تغییری نکردند، لطفا بعدا امتحان کنید."
}, },
"NO_LABELS_TO_ADD": "هیچ برچسبی در حساب‌کاربری تعریف نشده است.", "NO_LABELS_TO_ADD": "هیچ برچسبی در حساب‌کاربری تعریف نشده است.",
"NO_AVAILABLE_LABELS": "هیچ برچسبی به این گفتگو اضافه نشده است." "NO_AVAILABLE_LABELS": "هیچ برچسبی به این گفتگو اضافه نشده است.",
"LABEL_SELECT": {
"TITLE": "افزودن برچسب‌ها",
"PLACEHOLDER": "جستجو برچسب‌ها",
"NO_RESULT": "هیچ برچسبی یافت نشد"
}
}, },
"MUTE_CONTACT": "بی‌صدا کردن گفتگو", "MUTE_CONTACT": "بی‌صدا کردن گفتگو",
"UNMUTE_CONTACT": "خارج کردن از حالت بی صدا", "UNMUTE_CONTACT": "خارج کردن از حالت بی صدا",
@ -151,5 +154,39 @@
}, },
"VIEW_DETAILS": "مشاهده جزئیات" "VIEW_DETAILS": "مشاهده جزئیات"
} }
},
"NOTES": {
"HEADER": {
"TITLE": "Notes"
},
"ADD": {
"BUTTON": "افزودن",
"PLACEHOLDER": "افزودن یادداشت",
"TITLE": "برای ایجاد یادداشت Shift + Enter را فشار دهید"
},
"FOOTER": {
"BUTTON": "View all notes"
}
},
"CUSTOM_ATTRIBUTES": {
"TITLE": "ویژگی‌های سفارشی",
"BUTTON": "Add custom attribute",
"ADD": {
"TITLE": "Create custom attribute",
"DESC": "Add custom information to this contact."
},
"FORM": {
"CREATE": "Add attribute",
"CANCEL": "انصراف",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
"ERROR": "Invalid custom attribute name"
},
"VALUE": {
"LABEL": "Attribute value",
"PLACEHOLDER": "Eg: 11901 "
}
}
} }
} }

Some files were not shown because too many files have changed in this diff Show more