Compare commits
105
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b31b8b93c | ||
|
|
4502ed6213 | ||
|
|
f0e376c0d9 | ||
|
|
0be8af9c3d | ||
|
|
f6c4224400 | ||
|
|
8f47496373 | ||
|
|
0990e33860 | ||
|
|
c93c6aed5f | ||
|
|
0381aa188a | ||
|
|
90e212a81a | ||
|
|
76e1643ccf | ||
|
|
0b56add844 | ||
|
|
e9b99a5811 | ||
|
|
a910758fd8 | ||
|
|
aa68525b6b | ||
|
|
ba1f363a28 | ||
|
|
b8e64722a7 | ||
|
|
153d0371ff | ||
|
|
c66f8600ec | ||
|
|
38b5c61d51 | ||
|
|
81f5c9aa12 | ||
|
|
532c5c3324 | ||
|
|
2dca1eee89 | ||
|
|
851f622fe1 | ||
|
|
1503ddeda4 | ||
|
|
c645ba3922 | ||
|
|
5d64079a5e | ||
|
|
82e296b152 | ||
|
|
016a8541c1 | ||
|
|
d289daf6ca | ||
|
|
c8cc157683 | ||
|
|
3fd506c27f | ||
|
|
d8a1fdbce5 | ||
|
|
6840108f30 | ||
|
|
d7288835fa | ||
|
|
31e1d59d58 | ||
|
|
4f55a66fba | ||
|
|
312c8a1a74 | ||
|
|
79f7afaeec | ||
|
|
4e7ca49297 | ||
|
|
db51d2d011 | ||
|
|
6f86944758 | ||
|
|
d74798fcd5 | ||
|
|
394419ce95 | ||
|
|
4fe9b88642 | ||
|
|
0f8037b6fc | ||
|
|
38938fe776 | ||
|
|
02ca4136ad | ||
|
|
da4049d18a | ||
|
|
088608abcf | ||
|
|
afb3c0109b | ||
|
|
c54973eeb2 | ||
|
|
cb2785096e | ||
|
|
27f35a7dd8 | ||
|
|
59790e38da | ||
|
|
461f1b3bf0 | ||
|
|
4056a144e4 | ||
|
|
31681610f2 | ||
|
|
a8b33023f8 | ||
|
|
8c5204d0c9 | ||
|
|
aa5242fdb0 | ||
|
|
b591893486 | ||
|
|
a118bef98e | ||
|
|
daa54f6866 | ||
|
|
c38e7af0e7 | ||
|
|
d6f862a85c | ||
|
|
13f742fd68 | ||
|
|
b74e78f698 | ||
|
|
5d8646a3f3 | ||
|
|
453eba9a81 | ||
|
|
6beb355f29 | ||
|
|
980eca46c6 | ||
|
|
0868a9af70 | ||
|
|
da6fbe8579 | ||
|
|
2c814fff99 | ||
|
|
c1c44512d4 | ||
|
|
1138195846 | ||
|
|
84d31b91f4 | ||
|
|
2df2459674 | ||
|
|
81e18aaafa | ||
|
|
f07a5215cf | ||
|
|
1899a31416 | ||
|
|
60f5145365 | ||
|
|
e58736e746 | ||
|
|
a9fd459cf4 | ||
|
|
7235e44a9d | ||
|
|
ddd1fb5396 | ||
|
|
a97cf6e4ad | ||
|
|
4ecc92ad6d | ||
|
|
ff70fbe2e4 | ||
|
|
4f27f1605a | ||
|
|
e00b54ce07 | ||
|
|
df20a59a6c | ||
|
|
bb6f7b9fcd | ||
|
|
e28c6312e4 | ||
|
|
fc119d14d9 | ||
|
|
9243b6367c | ||
|
|
5af8881a5a | ||
|
|
70029177da | ||
|
|
1abb04f592 | ||
|
|
355b587c2c | ||
|
|
b22a903446 | ||
|
|
2d5993dfe3 | ||
|
|
db50f42054 | ||
|
|
f8afc1509f |
@@ -94,3 +94,6 @@ yarn-debug.log*
|
|||||||
.vscode
|
.vscode
|
||||||
.claude/settings.local.json
|
.claude/settings.local.json
|
||||||
.cursor
|
.cursor
|
||||||
|
|
||||||
|
# react component
|
||||||
|
dist
|
||||||
|
|||||||
@@ -151,9 +151,6 @@ gem 'pg_search'
|
|||||||
# Subscriptions, Billing
|
# Subscriptions, Billing
|
||||||
gem 'stripe'
|
gem 'stripe'
|
||||||
|
|
||||||
# MCP Client for integrating with Model Context Protocol servers
|
|
||||||
gem 'ruby-mcp-client'
|
|
||||||
|
|
||||||
## - helper gems --##
|
## - helper gems --##
|
||||||
## to populate db with sample data
|
## to populate db with sample data
|
||||||
gem 'faker'
|
gem 'faker'
|
||||||
|
|||||||
+1
-5
@@ -702,9 +702,6 @@ GEM
|
|||||||
rubocop-rspec (3.6.0)
|
rubocop-rspec (3.6.0)
|
||||||
lint_roller (~> 1.1)
|
lint_roller (~> 1.1)
|
||||||
rubocop (~> 1.72, >= 1.72.1)
|
rubocop (~> 1.72, >= 1.72.1)
|
||||||
ruby-mcp-client (0.6.2)
|
|
||||||
faraday (~> 2.0)
|
|
||||||
faraday-retry (~> 2.0)
|
|
||||||
ruby-openai (7.3.1)
|
ruby-openai (7.3.1)
|
||||||
event_stream_parser (>= 0.3.0, < 2.0.0)
|
event_stream_parser (>= 0.3.0, < 2.0.0)
|
||||||
faraday (>= 1)
|
faraday (>= 1)
|
||||||
@@ -986,7 +983,6 @@ DEPENDENCIES
|
|||||||
rubocop-performance
|
rubocop-performance
|
||||||
rubocop-rails
|
rubocop-rails
|
||||||
rubocop-rspec
|
rubocop-rspec
|
||||||
ruby-mcp-client
|
|
||||||
ruby-openai
|
ruby-openai
|
||||||
scout_apm
|
scout_apm
|
||||||
scss_lint
|
scss_lint
|
||||||
@@ -1024,4 +1020,4 @@ RUBY VERSION
|
|||||||
ruby 3.4.4p34
|
ruby 3.4.4p34
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.6.7
|
2.5.16
|
||||||
|
|||||||
@@ -1,101 +0,0 @@
|
|||||||
class V2::Reports::LabelSummaryBuilder < V2::Reports::BaseSummaryBuilder
|
|
||||||
attr_reader :account, :params
|
|
||||||
|
|
||||||
# rubocop:disable Lint/MissingSuper
|
|
||||||
# the parent class has no initialize
|
|
||||||
def initialize(account:, params:)
|
|
||||||
@account = account
|
|
||||||
@params = params
|
|
||||||
|
|
||||||
timezone_offset = (params[:timezone_offset] || 0).to_f
|
|
||||||
@timezone = ActiveSupport::TimeZone[timezone_offset]&.name
|
|
||||||
end
|
|
||||||
# rubocop:enable Lint/MissingSuper
|
|
||||||
|
|
||||||
def build
|
|
||||||
labels = account.labels.to_a
|
|
||||||
return [] if labels.empty?
|
|
||||||
|
|
||||||
report_data = collect_report_data
|
|
||||||
labels.map { |label| build_label_report(label, report_data) }
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def collect_report_data
|
|
||||||
conversation_filter = build_conversation_filter
|
|
||||||
use_business_hours = use_business_hours?
|
|
||||||
|
|
||||||
{
|
|
||||||
conversation_counts: fetch_conversation_counts(conversation_filter),
|
|
||||||
resolved_counts: fetch_resolved_counts(conversation_filter),
|
|
||||||
resolution_metrics: fetch_metrics(conversation_filter, 'conversation_resolved', use_business_hours),
|
|
||||||
first_response_metrics: fetch_metrics(conversation_filter, 'first_response', use_business_hours),
|
|
||||||
reply_metrics: fetch_metrics(conversation_filter, 'reply', use_business_hours)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def build_label_report(label, report_data)
|
|
||||||
{
|
|
||||||
id: label.id,
|
|
||||||
name: label.title,
|
|
||||||
conversations_count: report_data[:conversation_counts][label.title] || 0,
|
|
||||||
avg_resolution_time: report_data[:resolution_metrics][label.title] || 0,
|
|
||||||
avg_first_response_time: report_data[:first_response_metrics][label.title] || 0,
|
|
||||||
avg_reply_time: report_data[:reply_metrics][label.title] || 0,
|
|
||||||
resolved_conversations_count: report_data[:resolved_counts][label.title] || 0
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def use_business_hours?
|
|
||||||
ActiveModel::Type::Boolean.new.cast(params[:business_hours])
|
|
||||||
end
|
|
||||||
|
|
||||||
def build_conversation_filter
|
|
||||||
conversation_filter = { account_id: account.id }
|
|
||||||
conversation_filter[:created_at] = range if range.present?
|
|
||||||
|
|
||||||
conversation_filter
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_conversation_counts(conversation_filter)
|
|
||||||
fetch_counts(conversation_filter)
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_resolved_counts(conversation_filter)
|
|
||||||
fetch_counts(conversation_filter.merge(status: :resolved))
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_counts(conversation_filter)
|
|
||||||
ActsAsTaggableOn::Tagging
|
|
||||||
.joins('INNER JOIN conversations ON taggings.taggable_id = conversations.id')
|
|
||||||
.joins('INNER JOIN tags ON taggings.tag_id = tags.id')
|
|
||||||
.where(
|
|
||||||
taggable_type: 'Conversation',
|
|
||||||
context: 'labels',
|
|
||||||
conversations: conversation_filter
|
|
||||||
)
|
|
||||||
.select('tags.name, COUNT(taggings.*) AS count')
|
|
||||||
.group('tags.name')
|
|
||||||
.each_with_object({}) { |record, hash| hash[record.name] = record.count }
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_metrics(conversation_filter, event_name, use_business_hours)
|
|
||||||
ReportingEvent
|
|
||||||
.joins('INNER JOIN conversations ON reporting_events.conversation_id = conversations.id')
|
|
||||||
.joins('INNER JOIN taggings ON taggings.taggable_id = conversations.id')
|
|
||||||
.joins('INNER JOIN tags ON taggings.tag_id = tags.id')
|
|
||||||
.where(
|
|
||||||
conversations: conversation_filter,
|
|
||||||
name: event_name,
|
|
||||||
taggings: { taggable_type: 'Conversation', context: 'labels' }
|
|
||||||
)
|
|
||||||
.group('tags.name')
|
|
||||||
.order('tags.name')
|
|
||||||
.select(
|
|
||||||
'tags.name',
|
|
||||||
use_business_hours ? 'AVG(reporting_events.value_in_business_hours) as avg_value' : 'AVG(reporting_events.value) as avg_value'
|
|
||||||
)
|
|
||||||
.each_with_object({}) { |record, hash| hash[record.name] = record.avg_value.to_f }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
class Api::V2::Accounts::SummaryReportsController < Api::V1::Accounts::BaseController
|
class Api::V2::Accounts::SummaryReportsController < Api::V1::Accounts::BaseController
|
||||||
before_action :check_authorization
|
before_action :check_authorization
|
||||||
before_action :prepare_builder_params, only: [:agent, :team, :inbox, :label]
|
before_action :prepare_builder_params, only: [:agent, :team, :inbox]
|
||||||
|
|
||||||
def agent
|
def agent
|
||||||
render_report_with(V2::Reports::AgentSummaryBuilder)
|
render_report_with(V2::Reports::AgentSummaryBuilder)
|
||||||
@@ -14,10 +14,6 @@ class Api::V2::Accounts::SummaryReportsController < Api::V1::Accounts::BaseContr
|
|||||||
render_report_with(V2::Reports::InboxSummaryBuilder)
|
render_report_with(V2::Reports::InboxSummaryBuilder)
|
||||||
end
|
end
|
||||||
|
|
||||||
def label
|
|
||||||
render_report_with(V2::Reports::LabelSummaryBuilder)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def check_authorization
|
def check_authorization
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class DashboardController < ActionController::Base
|
|||||||
private
|
private
|
||||||
|
|
||||||
def ensure_html_format
|
def ensure_html_format
|
||||||
render json: { error: 'Please use API routes instead of dashboard routes for JSON requests' }, status: :not_acceptable if request.format.json?
|
head :not_acceptable unless request.format.html?
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_global_config
|
def set_global_config
|
||||||
|
|||||||
@@ -36,13 +36,9 @@ module Api::V2::Accounts::ReportsHelper
|
|||||||
end
|
end
|
||||||
|
|
||||||
def generate_labels_report
|
def generate_labels_report
|
||||||
reports = V2::Reports::LabelSummaryBuilder.new(
|
Current.account.labels.map do |label|
|
||||||
account: Current.account,
|
label_report = report_builder({ type: :label, id: label.id }).short_summary
|
||||||
params: build_params({})
|
[label.title] + generate_readable_report_metrics(label_report)
|
||||||
).build
|
|
||||||
|
|
||||||
reports.map do |report|
|
|
||||||
[report[:name]] + generate_readable_report_metrics(report)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,12 @@ class ApiClient {
|
|||||||
|
|
||||||
// eslint-disable-next-line class-methods-use-this
|
// eslint-disable-next-line class-methods-use-this
|
||||||
get accountIdFromRoute() {
|
get accountIdFromRoute() {
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
if (window.__WOOT_ACCOUNT_ID__) {
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
return window.__WOOT_ACCOUNT_ID__;
|
||||||
|
}
|
||||||
|
|
||||||
const isInsideAccountScopedURLs =
|
const isInsideAccountScopedURLs =
|
||||||
window.location.pathname.includes('/app/accounts');
|
window.location.pathname.includes('/app/accounts');
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,14 @@ import {
|
|||||||
} from '../store/utils/api';
|
} from '../store/utils/api';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
validityCheck() {
|
async validityCheck() {
|
||||||
|
if (this.hasAuthToken()) {
|
||||||
|
const urlData = endPoints('profileUpdate');
|
||||||
|
const response = await axios.get(urlData.url);
|
||||||
|
// to match the response signature of the validityCheck endpoint
|
||||||
|
return Promise.resolve({ data: { payload: response } });
|
||||||
|
}
|
||||||
|
|
||||||
const urlData = endPoints('validityCheck');
|
const urlData = endPoints('validityCheck');
|
||||||
return axios.get(urlData.url);
|
return axios.get(urlData.url);
|
||||||
},
|
},
|
||||||
@@ -31,6 +38,10 @@ export default {
|
|||||||
hasAuthCookie() {
|
hasAuthCookie() {
|
||||||
return !!Cookies.get('cw_d_session_info');
|
return !!Cookies.get('cw_d_session_info');
|
||||||
},
|
},
|
||||||
|
hasAuthToken() {
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
return !!window.__WOOT_ACCESS_TOKEN__;
|
||||||
|
},
|
||||||
getAuthData() {
|
getAuthData() {
|
||||||
if (this.hasAuthCookie()) {
|
if (this.hasAuthCookie()) {
|
||||||
const savedAuthInfo = Cookies.get('cw_d_session_info');
|
const savedAuthInfo = Cookies.get('cw_d_session_info');
|
||||||
@@ -38,7 +49,13 @@ export default {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
profileUpdate({ displayName, avatar, ...profileAttributes }) {
|
profileUpdate({
|
||||||
|
password,
|
||||||
|
password_confirmation,
|
||||||
|
displayName,
|
||||||
|
avatar,
|
||||||
|
...profileAttributes
|
||||||
|
}) {
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
Object.keys(profileAttributes).forEach(key => {
|
Object.keys(profileAttributes).forEach(key => {
|
||||||
const hasValue = profileAttributes[key] === undefined;
|
const hasValue = profileAttributes[key] === undefined;
|
||||||
@@ -47,22 +64,16 @@ export default {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
formData.append('profile[display_name]', displayName || '');
|
formData.append('profile[display_name]', displayName || '');
|
||||||
|
if (password && password_confirmation) {
|
||||||
|
formData.append('profile[password]', password);
|
||||||
|
formData.append('profile[password_confirmation]', password_confirmation);
|
||||||
|
}
|
||||||
if (avatar) {
|
if (avatar) {
|
||||||
formData.append('profile[avatar]', avatar);
|
formData.append('profile[avatar]', avatar);
|
||||||
}
|
}
|
||||||
return axios.put(endPoints('profileUpdate').url, formData);
|
return axios.put(endPoints('profileUpdate').url, formData);
|
||||||
},
|
},
|
||||||
|
|
||||||
profilePasswordUpdate({ currentPassword, password, passwordConfirmation }) {
|
|
||||||
return axios.put(endPoints('profileUpdate').url, {
|
|
||||||
profile: {
|
|
||||||
current_password: currentPassword,
|
|
||||||
password,
|
|
||||||
password_confirmation: passwordConfirmation,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
updateUISettings({ uiSettings }) {
|
updateUISettings({ uiSettings }) {
|
||||||
return axios.put(endPoints('profileUpdate').url, {
|
return axios.put(endPoints('profileUpdate').url, {
|
||||||
profile: { ui_settings: uiSettings },
|
profile: { ui_settings: uiSettings },
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ const endPoints = {
|
|||||||
resendConfirmation: {
|
resendConfirmation: {
|
||||||
url: '/api/v1/profile/resend_confirmation',
|
url: '/api/v1/profile/resend_confirmation',
|
||||||
},
|
},
|
||||||
|
|
||||||
resetAccessToken: {
|
resetAccessToken: {
|
||||||
url: '/api/v1/profile/reset_access_token',
|
url: '/api/v1/profile/reset_access_token',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
/* global axios */
|
/* global axios */
|
||||||
import CacheEnabledApiClient from './CacheEnabledApiClient';
|
import CacheEnabledApiClient from './CacheEnabledApiClient';
|
||||||
|
// import ApiClient from './ApiClient';
|
||||||
|
import ApiClient from './ApiClient';
|
||||||
|
|
||||||
class Inboxes extends CacheEnabledApiClient {
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
const BaseClass = window.__WOOT_ISOLATED_SHELL__
|
||||||
|
? ApiClient
|
||||||
|
: CacheEnabledApiClient;
|
||||||
|
|
||||||
|
class Inboxes extends BaseClass {
|
||||||
constructor() {
|
constructor() {
|
||||||
super('inboxes', { accountScoped: true });
|
super('inboxes', { accountScoped: true });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,16 +35,6 @@ class SummaryReportsAPI extends ApiClient {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getLabelReports({ since, until, businessHours } = {}) {
|
|
||||||
return axios.get(`${this.url}/label`, {
|
|
||||||
params: {
|
|
||||||
since,
|
|
||||||
until,
|
|
||||||
business_hours: businessHours,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default new SummaryReportsAPI();
|
export default new SummaryReportsAPI();
|
||||||
|
|||||||
@@ -315,6 +315,9 @@ const componentToRender = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const shouldShowContextMenu = computed(() => {
|
const shouldShowContextMenu = computed(() => {
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
if (window.__WOOT_ISOLATED_SHELL__) return false;
|
||||||
|
|
||||||
return !props.contentAttributes?.isUnsupported;
|
return !props.contentAttributes?.isUnsupported;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -441,7 +444,7 @@ const avatarTooltip = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const setupHighlightTimer = () => {
|
const setupHighlightTimer = () => {
|
||||||
if (Number(route.query.messageId) !== Number(props.id)) {
|
if (Number(route?.query?.messageId) !== Number(props.id)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
<template>
|
||||||
|
<svg
|
||||||
|
class="w-8 h-4"
|
||||||
|
viewBox="0 0 120 30"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="currentColor"
|
||||||
|
>
|
||||||
|
<circle cx="15" cy="15" r="12">
|
||||||
|
<animate
|
||||||
|
attributeName="cy"
|
||||||
|
from="15"
|
||||||
|
to="5"
|
||||||
|
begin="0s"
|
||||||
|
dur="0.9s"
|
||||||
|
values="15;5;15;15;15;15"
|
||||||
|
calcMode="linear"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</circle>
|
||||||
|
<circle cx="55" cy="15" r="12">
|
||||||
|
<animate
|
||||||
|
attributeName="cy"
|
||||||
|
from="15"
|
||||||
|
to="5"
|
||||||
|
begin="0.1s"
|
||||||
|
dur="0.9s"
|
||||||
|
values="15;5;15;15;15;15"
|
||||||
|
calcMode="linear"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</circle>
|
||||||
|
<circle cx="95" cy="15" r="12">
|
||||||
|
<animate
|
||||||
|
attributeName="cy"
|
||||||
|
from="15"
|
||||||
|
to="5"
|
||||||
|
begin="0.2s"
|
||||||
|
dur="0.9s"
|
||||||
|
values="15;5;15;15;15;15"
|
||||||
|
calcMode="linear"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</circle>
|
||||||
|
</svg>
|
||||||
|
</template>
|
||||||
@@ -4,11 +4,9 @@ import BaseBubble from './Base.vue';
|
|||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { CONTENT_TYPES } from '../constants.js';
|
import { CONTENT_TYPES } from '../constants.js';
|
||||||
import { useMessageContext } from '../provider.js';
|
import { useMessageContext } from '../provider.js';
|
||||||
import { useInbox } from 'dashboard/composables/useInbox';
|
|
||||||
|
|
||||||
const { content, contentAttributes, contentType } = useMessageContext();
|
const { content, contentAttributes, contentType } = useMessageContext();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const { isAWebWidgetInbox } = useInbox();
|
|
||||||
|
|
||||||
const formValues = computed(() => {
|
const formValues = computed(() => {
|
||||||
if (contentType.value === CONTENT_TYPES.FORM) {
|
if (contentType.value === CONTENT_TYPES.FORM) {
|
||||||
@@ -58,7 +56,7 @@ const formValues = computed(() => {
|
|||||||
<dd>{{ item.title }}</dd>
|
<dd>{{ item.title }}</dd>
|
||||||
</template>
|
</template>
|
||||||
</dl>
|
</dl>
|
||||||
<div v-else-if="isAWebWidgetInbox" class="my-2 font-medium">
|
<div v-else class="my-2 font-medium">
|
||||||
{{ t('CONVERSATION.NO_RESPONSE') }}
|
{{ t('CONVERSATION.NO_RESPONSE') }}
|
||||||
</div>
|
</div>
|
||||||
</BaseBubble>
|
</BaseBubble>
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { useAlert } from 'dashboard/composables';
|
|||||||
import BaseBubble from './Base.vue';
|
import BaseBubble from './Base.vue';
|
||||||
import Button from 'next/button/Button.vue';
|
import Button from 'next/button/Button.vue';
|
||||||
import Icon from 'next/icon/Icon.vue';
|
import Icon from 'next/icon/Icon.vue';
|
||||||
|
import { useGallery } from '../useGallery';
|
||||||
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
||||||
import { useMessageContext } from '../provider.js';
|
import { useMessageContext } from '../provider.js';
|
||||||
import { downloadFile } from '@chatwoot/utils';
|
import { downloadFile } from '@chatwoot/utils';
|
||||||
@@ -21,8 +22,8 @@ const attachment = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const hasError = ref(false);
|
const hasError = ref(false);
|
||||||
const showGallery = ref(false);
|
|
||||||
const isDownloading = ref(false);
|
const isDownloading = ref(false);
|
||||||
|
const { showGallery, isGalleryAllowed, toggleGallery } = useGallery();
|
||||||
|
|
||||||
const handleError = () => {
|
const handleError = () => {
|
||||||
hasError.value = true;
|
hasError.value = true;
|
||||||
@@ -46,7 +47,7 @@ const downloadAttachment = async () => {
|
|||||||
<BaseBubble
|
<BaseBubble
|
||||||
class="overflow-hidden p-3"
|
class="overflow-hidden p-3"
|
||||||
data-bubble-name="image"
|
data-bubble-name="image"
|
||||||
@click="showGallery = true"
|
@click="toggleGallery(true)"
|
||||||
>
|
>
|
||||||
<div v-if="hasError" class="flex items-center gap-1 text-center rounded-lg">
|
<div v-if="hasError" class="flex items-center gap-1 text-center rounded-lg">
|
||||||
<Icon icon="i-lucide-circle-off" class="text-n-slate-11" />
|
<Icon icon="i-lucide-circle-off" class="text-n-slate-11" />
|
||||||
@@ -82,7 +83,7 @@ const downloadAttachment = async () => {
|
|||||||
</div>
|
</div>
|
||||||
</BaseBubble>
|
</BaseBubble>
|
||||||
<GalleryView
|
<GalleryView
|
||||||
v-if="showGallery"
|
v-if="showGallery && isGalleryAllowed"
|
||||||
v-model:show="showGallery"
|
v-model:show="showGallery"
|
||||||
:attachment="useSnakeCase(attachment)"
|
:attachment="useSnakeCase(attachment)"
|
||||||
:all-attachments="filteredCurrentChatAttachments"
|
:all-attachments="filteredCurrentChatAttachments"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import { ref, computed } from 'vue';
|
import { ref, computed } from 'vue';
|
||||||
import BaseBubble from './Base.vue';
|
import BaseBubble from './Base.vue';
|
||||||
import Icon from 'next/icon/Icon.vue';
|
import Icon from 'next/icon/Icon.vue';
|
||||||
|
import { useGallery } from '../useGallery';
|
||||||
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
||||||
import { useMessageContext } from '../provider.js';
|
import { useMessageContext } from '../provider.js';
|
||||||
import GalleryView from 'dashboard/components/widgets/conversation/components/GalleryView.vue';
|
import GalleryView from 'dashboard/components/widgets/conversation/components/GalleryView.vue';
|
||||||
@@ -9,7 +10,7 @@ import { ATTACHMENT_TYPES } from '../constants';
|
|||||||
|
|
||||||
const emit = defineEmits(['error']);
|
const emit = defineEmits(['error']);
|
||||||
const hasError = ref(false);
|
const hasError = ref(false);
|
||||||
const showGallery = ref(false);
|
const { showGallery, isGalleryAllowed, toggleGallery } = useGallery();
|
||||||
const { filteredCurrentChatAttachments, attachments } = useMessageContext();
|
const { filteredCurrentChatAttachments, attachments } = useMessageContext();
|
||||||
|
|
||||||
const handleError = () => {
|
const handleError = () => {
|
||||||
@@ -30,7 +31,7 @@ const isReel = computed(() => {
|
|||||||
<BaseBubble
|
<BaseBubble
|
||||||
class="overflow-hidden p-3"
|
class="overflow-hidden p-3"
|
||||||
data-bubble-name="video"
|
data-bubble-name="video"
|
||||||
@click="showGallery = true"
|
@click="toggleGallery(true)"
|
||||||
>
|
>
|
||||||
<div class="relative group rounded-lg overflow-hidden">
|
<div class="relative group rounded-lg overflow-hidden">
|
||||||
<div
|
<div
|
||||||
@@ -52,7 +53,7 @@ const isReel = computed(() => {
|
|||||||
</div>
|
</div>
|
||||||
</BaseBubble>
|
</BaseBubble>
|
||||||
<GalleryView
|
<GalleryView
|
||||||
v-if="showGallery"
|
v-if="showGallery && isGalleryAllowed"
|
||||||
v-model:show="showGallery"
|
v-model:show="showGallery"
|
||||||
:attachment="useSnakeCase(attachment)"
|
:attachment="useSnakeCase(attachment)"
|
||||||
:all-attachments="filteredCurrentChatAttachments"
|
:all-attachments="filteredCurrentChatAttachments"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import Icon from 'next/icon/Icon.vue';
|
import Icon from 'next/icon/Icon.vue';
|
||||||
|
import { useGallery } from '../useGallery';
|
||||||
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
||||||
import { useMessageContext } from '../provider.js';
|
import { useMessageContext } from '../provider.js';
|
||||||
|
|
||||||
@@ -13,7 +14,7 @@ defineProps({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
const hasError = ref(false);
|
const hasError = ref(false);
|
||||||
const showGallery = ref(false);
|
const { showGallery, toggleGallery, isGalleryAllowed } = useGallery();
|
||||||
|
|
||||||
const { filteredCurrentChatAttachments } = useMessageContext();
|
const { filteredCurrentChatAttachments } = useMessageContext();
|
||||||
|
|
||||||
@@ -25,7 +26,7 @@ const handleError = () => {
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="size-[72px] overflow-hidden contain-content rounded-xl cursor-pointer"
|
class="size-[72px] overflow-hidden contain-content rounded-xl cursor-pointer"
|
||||||
@click="showGallery = true"
|
@click="toggleGallery(true)"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-if="hasError"
|
v-if="hasError"
|
||||||
@@ -42,7 +43,7 @@ const handleError = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<GalleryView
|
<GalleryView
|
||||||
v-if="showGallery"
|
v-if="showGallery && isGalleryAllowed"
|
||||||
v-model:show="showGallery"
|
v-model:show="showGallery"
|
||||||
:attachment="useSnakeCase(attachment)"
|
:attachment="useSnakeCase(attachment)"
|
||||||
:all-attachments="filteredCurrentChatAttachments"
|
:all-attachments="filteredCurrentChatAttachments"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from 'vue';
|
|
||||||
import Icon from 'next/icon/Icon.vue';
|
import Icon from 'next/icon/Icon.vue';
|
||||||
|
import { useGallery } from '../useGallery';
|
||||||
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
||||||
import { useMessageContext } from '../provider.js';
|
import { useMessageContext } from '../provider.js';
|
||||||
import GalleryView from 'dashboard/components/widgets/conversation/components/GalleryView.vue';
|
import GalleryView from 'dashboard/components/widgets/conversation/components/GalleryView.vue';
|
||||||
@@ -12,7 +12,7 @@ defineProps({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const showGallery = ref(false);
|
const { showGallery, isGalleryAllowed, toggleGallery } = useGallery();
|
||||||
|
|
||||||
const { filteredCurrentChatAttachments } = useMessageContext();
|
const { filteredCurrentChatAttachments } = useMessageContext();
|
||||||
</script>
|
</script>
|
||||||
@@ -20,7 +20,7 @@ const { filteredCurrentChatAttachments } = useMessageContext();
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="size-[72px] overflow-hidden contain-content rounded-xl cursor-pointer relative group"
|
class="size-[72px] overflow-hidden contain-content rounded-xl cursor-pointer relative group"
|
||||||
@click="showGallery = true"
|
@click="toggleGallery(true)"
|
||||||
>
|
>
|
||||||
<video
|
<video
|
||||||
:src="attachment.dataUrl"
|
:src="attachment.dataUrl"
|
||||||
@@ -42,7 +42,7 @@ const { filteredCurrentChatAttachments } = useMessageContext();
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<GalleryView
|
<GalleryView
|
||||||
v-if="showGallery"
|
v-if="showGallery && isGalleryAllowed"
|
||||||
v-model:show="showGallery"
|
v-model:show="showGallery"
|
||||||
:attachment="useSnakeCase(attachment)"
|
:attachment="useSnakeCase(attachment)"
|
||||||
:all-attachments="filteredCurrentChatAttachments"
|
:all-attachments="filteredCurrentChatAttachments"
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import { computed } from 'vue';
|
||||||
|
import { useToggle } from '@vueuse/core';
|
||||||
|
|
||||||
|
export function useGallery() {
|
||||||
|
const [showGallery] = useToggle(false);
|
||||||
|
|
||||||
|
const isGalleryAllowed = computed(() => {
|
||||||
|
return true;
|
||||||
|
// return !window.__WOOT_ISOLATED_SHELL__;
|
||||||
|
});
|
||||||
|
|
||||||
|
const toggleGallery = value => {
|
||||||
|
if (!isGalleryAllowed.value) return;
|
||||||
|
|
||||||
|
showGallery.value = value;
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
showGallery,
|
||||||
|
isGalleryAllowed,
|
||||||
|
toggleGallery,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -87,7 +87,7 @@ const newReportRoutes = () => [
|
|||||||
{
|
{
|
||||||
name: 'Reports Label',
|
name: 'Reports Label',
|
||||||
label: t('SIDEBAR.REPORTS_LABEL'),
|
label: t('SIDEBAR.REPORTS_LABEL'),
|
||||||
to: accountScopedRoute('label_reports_index'),
|
to: accountScopedRoute('label_reports'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Reports Inbox',
|
name: 'Reports Inbox',
|
||||||
|
|||||||
@@ -109,7 +109,6 @@ const advancedFilterTypes = ref(
|
|||||||
attributeName: t(`FILTER.ATTRIBUTES.${filter.attributeI18nKey}`),
|
attributeName: t(`FILTER.ATTRIBUTES.${filter.attributeI18nKey}`),
|
||||||
}))
|
}))
|
||||||
);
|
);
|
||||||
const isInitialLoad = ref(false);
|
|
||||||
|
|
||||||
const currentUser = useMapGetter('getCurrentUser');
|
const currentUser = useMapGetter('getCurrentUser');
|
||||||
const chatLists = useMapGetter('getFilteredConversations');
|
const chatLists = useMapGetter('getFilteredConversations');
|
||||||
@@ -377,7 +376,6 @@ function setFiltersFromUISettings() {
|
|||||||
|
|
||||||
function emitConversationLoaded() {
|
function emitConversationLoaded() {
|
||||||
emit('conversationLoad');
|
emit('conversationLoad');
|
||||||
isInitialLoad.value = false;
|
|
||||||
// [VITE] removing this since the library has changed
|
// [VITE] removing this since the library has changed
|
||||||
// nextTick(() => {
|
// nextTick(() => {
|
||||||
// // Addressing a known issue in the virtual list library where dynamically added items
|
// // Addressing a known issue in the virtual list library where dynamically added items
|
||||||
@@ -422,7 +420,6 @@ function onApplyFilter(payload) {
|
|||||||
foldersQuery.value = filterQueryGenerator(payload);
|
foldersQuery.value = filterQueryGenerator(payload);
|
||||||
store.dispatch('conversationPage/reset');
|
store.dispatch('conversationPage/reset');
|
||||||
store.dispatch('emptyAllConversations');
|
store.dispatch('emptyAllConversations');
|
||||||
isInitialLoad.value = true;
|
|
||||||
fetchFilteredConversations(payload);
|
fetchFilteredConversations(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -577,7 +574,6 @@ function resetAndFetchData() {
|
|||||||
store.dispatch('conversationPage/reset');
|
store.dispatch('conversationPage/reset');
|
||||||
store.dispatch('emptyAllConversations');
|
store.dispatch('emptyAllConversations');
|
||||||
store.dispatch('clearConversationFilters');
|
store.dispatch('clearConversationFilters');
|
||||||
isInitialLoad.value = true;
|
|
||||||
if (hasActiveFolders.value) {
|
if (hasActiveFolders.value) {
|
||||||
const payload = activeFolder.value.query;
|
const payload = activeFolder.value.query;
|
||||||
fetchSavedFilteredConversations(payload);
|
fetchSavedFilteredConversations(payload);
|
||||||
@@ -857,8 +853,6 @@ watch(conversationFilters, (newVal, oldVal) => {
|
|||||||
:has-active-folders="hasActiveFolders"
|
:has-active-folders="hasActiveFolders"
|
||||||
:active-status="activeStatus"
|
:active-status="activeStatus"
|
||||||
:is-on-expanded-layout="isOnExpandedLayout"
|
:is-on-expanded-layout="isOnExpandedLayout"
|
||||||
:conversation-stats="conversationStats"
|
|
||||||
:is-list-loading="isInitialLoad"
|
|
||||||
@add-folders="onClickOpenAddFoldersModal"
|
@add-folders="onClickOpenAddFoldersModal"
|
||||||
@delete-folders="onClickOpenDeleteFoldersModal"
|
@delete-folders="onClickOpenDeleteFoldersModal"
|
||||||
@filters-modal="onToggleAdvanceFiltersModal"
|
@filters-modal="onToggleAdvanceFiltersModal"
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useUISettings } from 'dashboard/composables/useUISettings';
|
import { useUISettings } from 'dashboard/composables/useUISettings';
|
||||||
import { useMapGetter } from 'dashboard/composables/store.js';
|
import { useMapGetter } from 'dashboard/composables/store.js';
|
||||||
import { formatNumber } from '@chatwoot/utils';
|
|
||||||
import wootConstants from 'dashboard/constants/globals';
|
import wootConstants from 'dashboard/constants/globals';
|
||||||
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
|
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
|
||||||
|
|
||||||
@@ -11,13 +10,26 @@ import SwitchLayout from 'dashboard/routes/dashboard/conversation/search/SwitchL
|
|||||||
import NextButton from 'dashboard/components-next/button/Button.vue';
|
import NextButton from 'dashboard/components-next/button/Button.vue';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
pageTitle: { type: String, required: true },
|
pageTitle: {
|
||||||
hasAppliedFilters: { type: Boolean, required: true },
|
type: String,
|
||||||
hasActiveFolders: { type: Boolean, required: true },
|
required: true,
|
||||||
activeStatus: { type: String, required: true },
|
},
|
||||||
isOnExpandedLayout: { type: Boolean, required: true },
|
hasAppliedFilters: {
|
||||||
conversationStats: { type: Object, required: true },
|
type: Boolean,
|
||||||
isListLoading: { type: Boolean, required: true },
|
required: true,
|
||||||
|
},
|
||||||
|
hasActiveFolders: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
activeStatus: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
isOnExpandedLayout: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const emit = defineEmits([
|
const emit = defineEmits([
|
||||||
@@ -50,9 +62,6 @@ const showV4View = computed(() => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
const allCount = computed(() => props.conversationStats?.allCount || 0);
|
|
||||||
const formattedAllCount = computed(() => formatNumber(allCount.value));
|
|
||||||
|
|
||||||
const toggleConversationLayout = () => {
|
const toggleConversationLayout = () => {
|
||||||
const { LAYOUT_TYPES } = wootConstants;
|
const { LAYOUT_TYPES } = wootConstants;
|
||||||
const {
|
const {
|
||||||
@@ -83,15 +92,6 @@ const toggleConversationLayout = () => {
|
|||||||
>
|
>
|
||||||
{{ pageTitle }}
|
{{ pageTitle }}
|
||||||
</h1>
|
</h1>
|
||||||
<span
|
|
||||||
v-if="
|
|
||||||
allCount > 0 && hasAppliedFiltersOrActiveFolders && !isListLoading
|
|
||||||
"
|
|
||||||
class="px-2 py-1 my-0.5 mx-1 rounded-md capitalize bg-n-slate-3 text-xxs text-n-slate-12 shrink-0"
|
|
||||||
:title="allCount"
|
|
||||||
>
|
|
||||||
{{ formattedAllCount }}
|
|
||||||
</span>
|
|
||||||
<span
|
<span
|
||||||
v-if="!hasAppliedFiltersOrActiveFolders"
|
v-if="!hasAppliedFiltersOrActiveFolders"
|
||||||
class="px-2 py-1 my-0.5 mx-1 rounded-md capitalize bg-n-slate-3 text-xxs text-n-slate-12 shrink-0"
|
class="px-2 py-1 my-0.5 mx-1 rounded-md capitalize bg-n-slate-3 text-xxs text-n-slate-12 shrink-0"
|
||||||
|
|||||||
@@ -170,6 +170,10 @@ const shouldShowCannedResponses = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const editorMenuOptions = computed(() => {
|
const editorMenuOptions = computed(() => {
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
if (window.__WOOT_ISOLATED_SHELL__) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
return props.enabledMenuOptions.length
|
return props.enabledMenuOptions.length
|
||||||
? props.enabledMenuOptions
|
? props.enabledMenuOptions
|
||||||
: MESSAGE_EDITOR_MENU_OPTIONS;
|
: MESSAGE_EDITOR_MENU_OPTIONS;
|
||||||
@@ -422,10 +426,14 @@ function updateImgToolbarOnDelete() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function isEnterToSendEnabled() {
|
function isEnterToSendEnabled() {
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
if (window.__WOOT_ISOLATED_SHELL__) return false;
|
||||||
return isEditorHotKeyEnabled('enter');
|
return isEditorHotKeyEnabled('enter');
|
||||||
}
|
}
|
||||||
|
|
||||||
function isCmdPlusEnterToSendEnabled() {
|
function isCmdPlusEnterToSendEnabled() {
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
if (window.__WOOT_ISOLATED_SHELL__) return true;
|
||||||
return isEditorHotKeyEnabled('cmd_enter');
|
return isEditorHotKeyEnabled('cmd_enter');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -653,7 +661,7 @@ watch(sendWithSignature, newValue => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(async () => {
|
||||||
// [VITE] state assignment was done in created before
|
// [VITE] state assignment was done in created before
|
||||||
state = createState(
|
state = createState(
|
||||||
props.modelValue,
|
props.modelValue,
|
||||||
@@ -734,6 +742,10 @@ useEmitter(BUS_EVENTS.INSERT_INTO_RICH_EDITOR, insertContentIntoEditor);
|
|||||||
.ProseMirror-menubar-wrapper {
|
.ProseMirror-menubar-wrapper {
|
||||||
@apply flex flex-col;
|
@apply flex flex-col;
|
||||||
|
|
||||||
|
.ProseMirror-menubar:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.ProseMirror-menubar {
|
.ProseMirror-menubar {
|
||||||
min-height: var(--space-two) !important;
|
min-height: var(--space-two) !important;
|
||||||
@apply -ml-2.5 pb-0 bg-transparent text-n-slate-11;
|
@apply -ml-2.5 pb-0 bg-transparent text-n-slate-11;
|
||||||
|
|||||||
@@ -55,10 +55,16 @@ const translateValue = computed(() => {
|
|||||||
class="flex items-center w-auto h-8 p-1 transition-all border rounded-full bg-n-alpha-2 group relative duration-300 ease-in-out z-0"
|
class="flex items-center w-auto h-8 p-1 transition-all border rounded-full bg-n-alpha-2 group relative duration-300 ease-in-out z-0"
|
||||||
@click="$emit('toggleMode')"
|
@click="$emit('toggleMode')"
|
||||||
>
|
>
|
||||||
<div ref="wootEditorReplyMode" class="flex items-center gap-1 px-2 z-20">
|
<div
|
||||||
|
ref="wootEditorReplyMode"
|
||||||
|
class="flex items-center gap-1 px-2 z-20 text-n-slate-11"
|
||||||
|
>
|
||||||
{{ $t('CONVERSATION.REPLYBOX.REPLY') }}
|
{{ $t('CONVERSATION.REPLYBOX.REPLY') }}
|
||||||
</div>
|
</div>
|
||||||
<div ref="wootEditorPrivateMode" class="flex items-center gap-1 px-2 z-20">
|
<div
|
||||||
|
ref="wootEditorPrivateMode"
|
||||||
|
class="flex items-center gap-1 px-2 z-20 text-n-slate-11"
|
||||||
|
>
|
||||||
{{ $t('CONVERSATION.REPLYBOX.PRIVATE_NOTE') }}
|
{{ $t('CONVERSATION.REPLYBOX.PRIVATE_NOTE') }}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -118,6 +118,12 @@ export default {
|
|||||||
type: String,
|
type: String,
|
||||||
default: '',
|
default: '',
|
||||||
},
|
},
|
||||||
|
allowSignature: { type: Boolean, default: false },
|
||||||
|
allowEmoji: { type: Boolean, default: false },
|
||||||
|
allowAiAssist: { type: Boolean, default: false },
|
||||||
|
allowVideoCall: { type: Boolean, default: false },
|
||||||
|
allowFileUpload: { type: Boolean, default: false },
|
||||||
|
allowAudioRecorder: { type: Boolean, default: false },
|
||||||
},
|
},
|
||||||
emits: [
|
emits: [
|
||||||
'replaceText',
|
'replaceText',
|
||||||
@@ -264,6 +270,7 @@ export default {
|
|||||||
<div class="flex justify-between p-3" :class="wrapClass">
|
<div class="flex justify-between p-3" :class="wrapClass">
|
||||||
<div class="left-wrap">
|
<div class="left-wrap">
|
||||||
<NextButton
|
<NextButton
|
||||||
|
v-if="allowEmoji"
|
||||||
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_EMOJI_ICON')"
|
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_EMOJI_ICON')"
|
||||||
icon="i-ph-smiley-sticker"
|
icon="i-ph-smiley-sticker"
|
||||||
slate
|
slate
|
||||||
@@ -272,6 +279,7 @@ export default {
|
|||||||
@click="toggleEmojiPicker"
|
@click="toggleEmojiPicker"
|
||||||
/>
|
/>
|
||||||
<FileUpload
|
<FileUpload
|
||||||
|
v-if="allowFileUpload"
|
||||||
ref="uploadRef"
|
ref="uploadRef"
|
||||||
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_ATTACH_ICON')"
|
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_ATTACH_ICON')"
|
||||||
input-id="conversationAttachment"
|
input-id="conversationAttachment"
|
||||||
@@ -295,36 +303,40 @@ export default {
|
|||||||
sm
|
sm
|
||||||
/>
|
/>
|
||||||
</FileUpload>
|
</FileUpload>
|
||||||
|
<template v-if="allowAudioRecorder">
|
||||||
|
<NextButton
|
||||||
|
v-if="showAudioRecorderButton"
|
||||||
|
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_AUDIORECORDER_ICON')"
|
||||||
|
:icon="
|
||||||
|
!isRecordingAudio ? 'i-ph-microphone' : 'i-ph-microphone-slash'
|
||||||
|
"
|
||||||
|
slate
|
||||||
|
faded
|
||||||
|
sm
|
||||||
|
@click="toggleAudioRecorder"
|
||||||
|
/>
|
||||||
|
<NextButton
|
||||||
|
v-if="showEditorToggle"
|
||||||
|
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_FORMAT_ICON')"
|
||||||
|
icon="i-ph-quotes"
|
||||||
|
slate
|
||||||
|
faded
|
||||||
|
sm
|
||||||
|
@click="$emit('toggleEditor')"
|
||||||
|
/>
|
||||||
|
<NextButton
|
||||||
|
v-if="showAudioPlayStopButton"
|
||||||
|
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_FORMAT_ICON')"
|
||||||
|
:icon="audioRecorderPlayStopIcon"
|
||||||
|
slate
|
||||||
|
faded
|
||||||
|
sm
|
||||||
|
:label="recordingAudioDurationText"
|
||||||
|
@click="toggleAudioRecorderPlayPause"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
<NextButton
|
<NextButton
|
||||||
v-if="showAudioRecorderButton"
|
v-if="allowSignature && showMessageSignatureButton"
|
||||||
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_AUDIORECORDER_ICON')"
|
|
||||||
:icon="!isRecordingAudio ? 'i-ph-microphone' : 'i-ph-microphone-slash'"
|
|
||||||
slate
|
|
||||||
faded
|
|
||||||
sm
|
|
||||||
@click="toggleAudioRecorder"
|
|
||||||
/>
|
|
||||||
<NextButton
|
|
||||||
v-if="showEditorToggle"
|
|
||||||
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_FORMAT_ICON')"
|
|
||||||
icon="i-ph-quotes"
|
|
||||||
slate
|
|
||||||
faded
|
|
||||||
sm
|
|
||||||
@click="$emit('toggleEditor')"
|
|
||||||
/>
|
|
||||||
<NextButton
|
|
||||||
v-if="showAudioPlayStopButton"
|
|
||||||
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_FORMAT_ICON')"
|
|
||||||
:icon="audioRecorderPlayStopIcon"
|
|
||||||
slate
|
|
||||||
faded
|
|
||||||
sm
|
|
||||||
:label="recordingAudioDurationText"
|
|
||||||
@click="toggleAudioRecorderPlayPause"
|
|
||||||
/>
|
|
||||||
<NextButton
|
|
||||||
v-if="showMessageSignatureButton"
|
|
||||||
v-tooltip.top-end="signatureToggleTooltip"
|
v-tooltip.top-end="signatureToggleTooltip"
|
||||||
icon="i-ph-signature"
|
icon="i-ph-signature"
|
||||||
slate
|
slate
|
||||||
@@ -342,11 +354,15 @@ export default {
|
|||||||
@click="$emit('selectWhatsappTemplate')"
|
@click="$emit('selectWhatsappTemplate')"
|
||||||
/>
|
/>
|
||||||
<VideoCallButton
|
<VideoCallButton
|
||||||
v-if="(isAWebWidgetInbox || isAPIInbox) && !isOnPrivateNote"
|
v-if="
|
||||||
|
allowVideoCall &&
|
||||||
|
(isAWebWidgetInbox || isAPIInbox) &&
|
||||||
|
!isOnPrivateNote
|
||||||
|
"
|
||||||
:conversation-id="conversationId"
|
:conversation-id="conversationId"
|
||||||
/>
|
/>
|
||||||
<AIAssistanceButton
|
<AIAssistanceButton
|
||||||
v-if="!isFetchingAppIntegrations"
|
v-if="allowAiAssist && !isFetchingAppIntegrations"
|
||||||
:conversation-id="conversationId"
|
:conversation-id="conversationId"
|
||||||
:is-private-note="isOnPrivateNote"
|
:is-private-note="isOnPrivateNote"
|
||||||
:message="message"
|
:message="message"
|
||||||
|
|||||||
@@ -15,6 +15,10 @@ export default {
|
|||||||
type: String,
|
type: String,
|
||||||
default: REPLY_EDITOR_MODES.REPLY,
|
default: REPLY_EDITOR_MODES.REPLY,
|
||||||
},
|
},
|
||||||
|
disablePopout: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
isMessageLengthReachingThreshold: {
|
isMessageLengthReachingThreshold: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: () => false,
|
default: () => false,
|
||||||
@@ -85,7 +89,7 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex justify-between h-[3.25rem] gap-2 ltr:pl-3 rtl:pr-3">
|
<div class="flex justify-between h-[3.25rem] gap-2 ms-3">
|
||||||
<EditorModeToggle
|
<EditorModeToggle
|
||||||
:mode="mode"
|
:mode="mode"
|
||||||
class="mt-3"
|
class="mt-3"
|
||||||
@@ -99,6 +103,7 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<NextButton
|
<NextButton
|
||||||
|
v-if="!disablePopout"
|
||||||
ghost
|
ghost
|
||||||
class="ltr:rounded-bl-md rtl:rounded-br-md ltr:rounded-br-none rtl:rounded-bl-none ltr:rounded-tl-none rtl:rounded-tr-none text-n-slate-11 ltr:rounded-tr-[11px] rtl:rounded-tl-[11px]"
|
class="ltr:rounded-bl-md rtl:rounded-br-md ltr:rounded-br-none rtl:rounded-bl-none ltr:rounded-tl-none rtl:rounded-tr-none text-n-slate-11 ltr:rounded-tr-[11px] rtl:rounded-tl-[11px]"
|
||||||
icon="i-lucide-maximize-2"
|
icon="i-lucide-maximize-2"
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import SLACardLabel from './components/SLACardLabel.vue';
|
|||||||
import wootConstants from 'dashboard/constants/globals';
|
import wootConstants from 'dashboard/constants/globals';
|
||||||
import { conversationListPageURL } from 'dashboard/helper/URLHelper';
|
import { conversationListPageURL } from 'dashboard/helper/URLHelper';
|
||||||
import { snoozedReopenTime } from 'dashboard/helper/snoozeHelpers';
|
import { snoozedReopenTime } from 'dashboard/helper/snoozeHelpers';
|
||||||
|
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
|
||||||
|
import Linear from './linear/index.vue';
|
||||||
import { useInbox } from 'dashboard/composables/useInbox';
|
import { useInbox } from 'dashboard/composables/useInbox';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
@@ -34,6 +36,12 @@ const { isAWebWidgetInbox } = useInbox();
|
|||||||
|
|
||||||
const currentChat = computed(() => store.getters.getSelectedChat);
|
const currentChat = computed(() => store.getters.getSelectedChat);
|
||||||
const accountId = computed(() => store.getters.getCurrentAccountId);
|
const accountId = computed(() => store.getters.getCurrentAccountId);
|
||||||
|
const isFeatureEnabledonAccount = computed(
|
||||||
|
() => store.getters['accounts/isFeatureEnabledonAccount']
|
||||||
|
);
|
||||||
|
const appIntegrations = computed(
|
||||||
|
() => store.getters['integrations/getAppIntegrations']
|
||||||
|
);
|
||||||
|
|
||||||
const chatMetadata = computed(() => props.chat.meta);
|
const chatMetadata = computed(() => props.chat.meta);
|
||||||
|
|
||||||
@@ -84,6 +92,16 @@ const hasMultipleInboxes = computed(
|
|||||||
);
|
);
|
||||||
|
|
||||||
const hasSlaPolicyId = computed(() => props.chat?.sla_policy_id);
|
const hasSlaPolicyId = computed(() => props.chat?.sla_policy_id);
|
||||||
|
|
||||||
|
const isLinearIntegrationEnabled = computed(() =>
|
||||||
|
appIntegrations.value.find(
|
||||||
|
integration => integration.id === 'linear' && !!integration.hooks.length
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const isLinearFeatureEnabled = computed(() =>
|
||||||
|
isFeatureEnabledonAccount.value(accountId.value, FEATURE_FLAGS.LINEAR)
|
||||||
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -144,6 +162,12 @@ const hasSlaPolicyId = computed(() => props.chat?.sla_policy_id);
|
|||||||
:parent-width="width"
|
:parent-width="width"
|
||||||
class="hidden md:flex"
|
class="hidden md:flex"
|
||||||
/>
|
/>
|
||||||
|
<Linear
|
||||||
|
v-if="isLinearIntegrationEnabled && isLinearFeatureEnabled"
|
||||||
|
:conversation-id="currentChat.id"
|
||||||
|
:parent-width="width"
|
||||||
|
class="hidden md:flex"
|
||||||
|
/>
|
||||||
<MoreActions :conversation-id="currentChat.id" />
|
<MoreActions :conversation-id="currentChat.id" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1240,6 +1240,12 @@ export default {
|
|||||||
:message="message"
|
:message="message"
|
||||||
:portal-slug="connectedPortalSlug"
|
:portal-slug="connectedPortalSlug"
|
||||||
:new-conversation-modal-active="newConversationModalActive"
|
:new-conversation-modal-active="newConversationModalActive"
|
||||||
|
allow-signature
|
||||||
|
allow-emoji
|
||||||
|
allow-ai-assist
|
||||||
|
allow-video-call
|
||||||
|
allow-audio-recorder
|
||||||
|
allow-file-upload
|
||||||
@select-whatsapp-template="openWhatsappTemplateModal"
|
@select-whatsapp-template="openWhatsappTemplateModal"
|
||||||
@toggle-editor="toggleRichContentEditor"
|
@toggle-editor="toggleRichContentEditor"
|
||||||
@replace-text="replaceText"
|
@replace-text="replaceText"
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ onMounted(() => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="flex-1 mx-2 px-2 truncate text-sm font-medium text-center text-n-slate-12"
|
class="flex-1 mx-2 px-2 truncate text-sm font-medium text-center text-n-slate-12 hidden sm:block"
|
||||||
>
|
>
|
||||||
<span v-dompurify-html="fileNameFromDataUrl" class="truncate" />
|
<span v-dompurify-html="fileNameFromDataUrl" class="truncate" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
<script setup>
|
||||||
|
import { format } from 'date-fns';
|
||||||
|
import UserAvatarWithName from 'dashboard/components/widgets/UserAvatarWithName.vue';
|
||||||
|
import IssueHeader from './IssueHeader.vue';
|
||||||
|
import { computed } from 'vue';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
issue: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
linkId: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const emit = defineEmits(['unlinkIssue']);
|
||||||
|
|
||||||
|
const priorityMap = {
|
||||||
|
1: 'Urgent',
|
||||||
|
2: 'High',
|
||||||
|
3: 'Medium',
|
||||||
|
4: 'Low',
|
||||||
|
};
|
||||||
|
|
||||||
|
const formattedDate = computed(() => {
|
||||||
|
const { createdAt } = props.issue;
|
||||||
|
return format(new Date(createdAt), 'hh:mm a, MMM dd');
|
||||||
|
});
|
||||||
|
|
||||||
|
const assignee = computed(() => {
|
||||||
|
const assigneeDetails = props.issue.assignee;
|
||||||
|
|
||||||
|
if (!assigneeDetails) return null;
|
||||||
|
const { name, avatarUrl } = assigneeDetails;
|
||||||
|
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
thumbnail: avatarUrl,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const labels = computed(() => {
|
||||||
|
return props.issue.labels?.nodes || [];
|
||||||
|
});
|
||||||
|
|
||||||
|
const priorityLabel = computed(() => {
|
||||||
|
return priorityMap[props.issue.priority];
|
||||||
|
});
|
||||||
|
|
||||||
|
const unlinkIssue = () => {
|
||||||
|
emit('unlinkIssue', props.linkId);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="absolute flex flex-col items-start bg-n-alpha-3 backdrop-blur-[100px] z-50 px-4 py-3 border border-solid border-n-container w-[384px] rounded-xl gap-4 max-h-96 overflow-auto"
|
||||||
|
>
|
||||||
|
<div class="flex flex-col w-full">
|
||||||
|
<IssueHeader
|
||||||
|
:identifier="issue.identifier"
|
||||||
|
:link-id="linkId"
|
||||||
|
:issue-url="issue.url"
|
||||||
|
@unlink-issue="unlinkIssue"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<span class="mt-2 text-sm font-medium text-n-slate-12">
|
||||||
|
{{ issue.title }}
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
v-if="issue.description"
|
||||||
|
class="mt-1 text-sm text-n-slate-11 line-clamp-3"
|
||||||
|
>
|
||||||
|
{{ issue.description }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row items-center h-6 gap-2">
|
||||||
|
<UserAvatarWithName v-if="assignee" :user="assignee" class="py-1" />
|
||||||
|
<div v-if="assignee" class="w-px h-3 bg-n-slate-4" />
|
||||||
|
<div class="flex items-center gap-1 py-1">
|
||||||
|
<fluent-icon
|
||||||
|
icon="status"
|
||||||
|
size="14"
|
||||||
|
:style="{ color: issue.state.color }"
|
||||||
|
/>
|
||||||
|
<h6 class="text-xs text-n-slate-12">
|
||||||
|
{{ issue.state.name }}
|
||||||
|
</h6>
|
||||||
|
</div>
|
||||||
|
<div v-if="priorityLabel" class="w-px h-3 bg-n-slate-4" />
|
||||||
|
<div v-if="priorityLabel" class="flex items-center gap-1 py-1">
|
||||||
|
<fluent-icon
|
||||||
|
:icon="`priority-${priorityLabel.toLowerCase()}`"
|
||||||
|
size="14"
|
||||||
|
view-box="0 0 12 12"
|
||||||
|
/>
|
||||||
|
<h6 class="text-xs text-n-slate-12">{{ priorityLabel }}</h6>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="labels.length" class="flex flex-wrap items-center gap-1">
|
||||||
|
<woot-label
|
||||||
|
v-for="label in labels"
|
||||||
|
:key="label.id"
|
||||||
|
:title="label.name"
|
||||||
|
:description="label.description"
|
||||||
|
:color="label.color"
|
||||||
|
variant="smooth"
|
||||||
|
small
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center">
|
||||||
|
<span class="text-xs text-n-slate-11">
|
||||||
|
{{
|
||||||
|
$t('INTEGRATION_SETTINGS.LINEAR.ISSUE.CREATED_AT', {
|
||||||
|
createdAt: formattedDate,
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
import { inject } from 'vue';
|
||||||
import Button from 'dashboard/components-next/button/Button.vue';
|
import Button from 'dashboard/components-next/button/Button.vue';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -14,6 +15,8 @@ const props = defineProps({
|
|||||||
|
|
||||||
const emit = defineEmits(['unlinkIssue']);
|
const emit = defineEmits(['unlinkIssue']);
|
||||||
|
|
||||||
|
const isUnlinking = inject('isUnlinking');
|
||||||
|
|
||||||
const unlinkIssue = () => {
|
const unlinkIssue = () => {
|
||||||
emit('unlinkIssue');
|
emit('unlinkIssue');
|
||||||
};
|
};
|
||||||
@@ -24,33 +27,36 @@ const openIssue = () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex items-center justify-between">
|
<div class="flex flex-row justify-between">
|
||||||
<div
|
<div
|
||||||
class="flex items-center gap-2 px-2 py-1.5 border rounded-lg border-n-strong"
|
class="flex items-center justify-center gap-1 h-[24px] px-2 py-1 border rounded-lg border-ash-200"
|
||||||
>
|
>
|
||||||
<div class="flex items-center gap-1">
|
<fluent-icon
|
||||||
<fluent-icon
|
icon="linear"
|
||||||
icon="linear"
|
size="19"
|
||||||
size="16"
|
class="text-[#5E6AD2]"
|
||||||
class="text-[#5E6AD2]"
|
view-box="0 0 19 19"
|
||||||
view-box="0 0 19 19"
|
/>
|
||||||
/>
|
<span class="text-xs font-medium text-ash-900">{{ identifier }}</span>
|
||||||
<span class="text-xs font-medium text-n-slate-12">
|
</div>
|
||||||
{{ identifier }}
|
<div class="flex items-center gap-1">
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<span class="w-px h-3 text-n-weak bg-n-weak" />
|
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
link
|
ghost
|
||||||
xs
|
xs
|
||||||
slate
|
slate
|
||||||
|
icon="i-lucide-unlink"
|
||||||
|
class="!transition-none"
|
||||||
|
:is-loading="isUnlinking"
|
||||||
|
@click="unlinkIssue"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
ghost
|
||||||
|
xs
|
||||||
|
slate
|
||||||
|
class="!transition-none"
|
||||||
icon="i-lucide-arrow-up-right"
|
icon="i-lucide-arrow-up-right"
|
||||||
class="!size-4"
|
|
||||||
@click="openIssue"
|
@click="openIssue"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Button ghost xs slate icon="i-lucide-unlink" @click="unlinkIssue" />
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,132 +0,0 @@
|
|||||||
<script setup>
|
|
||||||
import { computed, ref, onMounted, watch } from 'vue';
|
|
||||||
import { useAlert, useTrack } from 'dashboard/composables';
|
|
||||||
import { useStoreGetters } from 'dashboard/composables/store';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import LinearAPI from 'dashboard/api/integrations/linear';
|
|
||||||
import CreateOrLinkIssue from './CreateOrLinkIssue.vue';
|
|
||||||
import LinearIssueItem from './LinearIssueItem.vue';
|
|
||||||
import NextButton from 'dashboard/components-next/button/Button.vue';
|
|
||||||
import Spinner from 'dashboard/components-next/spinner/Spinner.vue';
|
|
||||||
import { LINEAR_EVENTS } from 'dashboard/helper/AnalyticsHelper/events';
|
|
||||||
import { parseLinearAPIErrorResponse } from 'dashboard/store/utils/api';
|
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
conversationId: {
|
|
||||||
type: [Number, String],
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
|
||||||
const getters = useStoreGetters();
|
|
||||||
|
|
||||||
const linkedIssues = ref([]);
|
|
||||||
const isLoading = ref(false);
|
|
||||||
const shouldShowCreateModal = ref(false);
|
|
||||||
|
|
||||||
const currentAccountId = getters.getCurrentAccountId;
|
|
||||||
|
|
||||||
const conversation = computed(
|
|
||||||
() => getters.getConversationById.value(props.conversationId) || {}
|
|
||||||
);
|
|
||||||
|
|
||||||
const hasIssues = computed(() => linkedIssues.value.length > 0);
|
|
||||||
|
|
||||||
const loadLinkedIssues = async () => {
|
|
||||||
isLoading.value = true;
|
|
||||||
linkedIssues.value = [];
|
|
||||||
try {
|
|
||||||
const response = await LinearAPI.getLinkedIssue(props.conversationId);
|
|
||||||
linkedIssues.value = response.data || [];
|
|
||||||
} catch (error) {
|
|
||||||
// Silent fail - not critical for UX
|
|
||||||
} finally {
|
|
||||||
isLoading.value = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const unlinkIssue = async linkId => {
|
|
||||||
try {
|
|
||||||
await LinearAPI.unlinkIssue(linkId);
|
|
||||||
useTrack(LINEAR_EVENTS.UNLINK_ISSUE);
|
|
||||||
linkedIssues.value = linkedIssues.value.filter(
|
|
||||||
issue => issue.id !== linkId
|
|
||||||
);
|
|
||||||
useAlert(t('INTEGRATION_SETTINGS.LINEAR.UNLINK.SUCCESS'));
|
|
||||||
} catch (error) {
|
|
||||||
const errorMessage = parseLinearAPIErrorResponse(
|
|
||||||
error,
|
|
||||||
t('INTEGRATION_SETTINGS.LINEAR.UNLINK.ERROR')
|
|
||||||
);
|
|
||||||
useAlert(errorMessage);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const openCreateModal = () => {
|
|
||||||
shouldShowCreateModal.value = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
const closeCreateModal = () => {
|
|
||||||
shouldShowCreateModal.value = false;
|
|
||||||
loadLinkedIssues();
|
|
||||||
};
|
|
||||||
|
|
||||||
watch(
|
|
||||||
() => props.conversationId,
|
|
||||||
() => {
|
|
||||||
loadLinkedIssues();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
loadLinkedIssues();
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<div class="px-4 pt-3 pb-2">
|
|
||||||
<NextButton
|
|
||||||
ghost
|
|
||||||
xs
|
|
||||||
icon="i-lucide-plus"
|
|
||||||
:label="$t('INTEGRATION_SETTINGS.LINEAR.ADD_OR_LINK_BUTTON')"
|
|
||||||
@click="openCreateModal"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="isLoading" class="flex justify-center p-8">
|
|
||||||
<Spinner />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-else-if="!hasIssues" class="flex justify-center p-4">
|
|
||||||
<p class="text-sm text-n-slate-11">
|
|
||||||
{{ $t('INTEGRATION_SETTINGS.LINEAR.NO_LINKED_ISSUES') }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-else class="max-h-[300px] overflow-y-auto">
|
|
||||||
<LinearIssueItem
|
|
||||||
v-for="linkedIssue in linkedIssues"
|
|
||||||
:key="linkedIssue.id"
|
|
||||||
class="pt-3 px-4 pb-4 border-b border-n-weak last:border-b-0"
|
|
||||||
:linked-issue="linkedIssue"
|
|
||||||
@unlink-issue="unlinkIssue"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<woot-modal
|
|
||||||
v-model:show="shouldShowCreateModal"
|
|
||||||
:on-close="closeCreateModal"
|
|
||||||
:close-on-backdrop-click="false"
|
|
||||||
class="!items-start [&>div]:!top-12 [&>div]:sticky"
|
|
||||||
>
|
|
||||||
<CreateOrLinkIssue
|
|
||||||
:conversation="conversation"
|
|
||||||
:account-id="currentAccountId"
|
|
||||||
@close="closeCreateModal"
|
|
||||||
/>
|
|
||||||
</woot-modal>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
<script setup>
|
|
||||||
import { computed } from 'vue';
|
|
||||||
import Icon from 'dashboard/components-next/icon/Icon.vue';
|
|
||||||
import Avatar from 'dashboard/components-next/avatar/Avatar.vue';
|
|
||||||
import CardPriorityIcon from 'dashboard/components-next/Conversation/ConversationCard/CardPriorityIcon.vue';
|
|
||||||
import IssueHeader from './IssueHeader.vue';
|
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
linkedIssue: {
|
|
||||||
type: Object,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const emit = defineEmits(['unlinkIssue']);
|
|
||||||
|
|
||||||
const priorityMap = {
|
|
||||||
1: 'Urgent',
|
|
||||||
2: 'High',
|
|
||||||
3: 'Medium',
|
|
||||||
4: 'Low',
|
|
||||||
};
|
|
||||||
|
|
||||||
const issue = computed(() => props.linkedIssue.issue);
|
|
||||||
|
|
||||||
const assignee = computed(() => {
|
|
||||||
const assigneeDetails = issue.value.assignee;
|
|
||||||
if (!assigneeDetails) return null;
|
|
||||||
return {
|
|
||||||
name: assigneeDetails.name,
|
|
||||||
thumbnail: assigneeDetails.avatarUrl,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
const labels = computed(() => issue.value.labels?.nodes || []);
|
|
||||||
|
|
||||||
const priorityLabel = computed(() => priorityMap[issue.value.priority]);
|
|
||||||
|
|
||||||
const unlinkIssue = () => {
|
|
||||||
emit('unlinkIssue', props.linkedIssue.id);
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="flex flex-col gap-4">
|
|
||||||
<div class="flex flex-col w-full">
|
|
||||||
<IssueHeader
|
|
||||||
:identifier="issue.identifier"
|
|
||||||
:link-id="linkedIssue.id"
|
|
||||||
:issue-url="issue.url"
|
|
||||||
@unlink-issue="unlinkIssue"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<h3 class="mt-2 text-sm font-medium text-n-slate-12">
|
|
||||||
{{ issue.title }}
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<p
|
|
||||||
v-if="issue.description"
|
|
||||||
class="mt-1 text-sm text-n-slate-11 line-clamp-3"
|
|
||||||
>
|
|
||||||
{{ issue.description }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex flex-col gap-2">
|
|
||||||
<div class="flex items-center gap-2">
|
|
||||||
<div v-if="assignee" class="flex items-center gap-1.5">
|
|
||||||
<Avatar :src="assignee.thumbnail" :name="assignee.name" :size="16" />
|
|
||||||
<span class="text-xs capitalize truncate text-n-slate-12">
|
|
||||||
{{ assignee.name }}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="assignee" class="w-px h-3 bg-n-slate-4" />
|
|
||||||
|
|
||||||
<div class="flex items-center gap-1">
|
|
||||||
<Icon
|
|
||||||
icon="i-lucide-activity"
|
|
||||||
class="size-4"
|
|
||||||
:style="{ color: issue.state?.color }"
|
|
||||||
/>
|
|
||||||
<span class="text-xs text-n-slate-12">
|
|
||||||
{{ issue.state?.name }}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="priorityLabel" class="w-px h-3 bg-n-slate-4" />
|
|
||||||
|
|
||||||
<div v-if="priorityLabel" class="flex items-center gap-1.5">
|
|
||||||
<CardPriorityIcon :priority="priorityLabel.toLowerCase()" />
|
|
||||||
<span class="text-xs text-n-slate-12">
|
|
||||||
{{ priorityLabel }}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="labels.length" class="flex flex-wrap">
|
|
||||||
<woot-label
|
|
||||||
v-for="label in labels"
|
|
||||||
:key="label.id"
|
|
||||||
:title="label.name"
|
|
||||||
:description="label.description"
|
|
||||||
:color="label.color"
|
|
||||||
variant="smooth"
|
|
||||||
small
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
<script setup>
|
|
||||||
import { computed } from 'vue';
|
|
||||||
import { useStoreGetters } from 'dashboard/composables/store';
|
|
||||||
import NextButton from 'dashboard/components-next/button/Button.vue';
|
|
||||||
import { frontendURL } from 'dashboard/helper/URLHelper';
|
|
||||||
import { useAdmin } from 'dashboard/composables/useAdmin';
|
|
||||||
|
|
||||||
const { isAdmin } = useAdmin();
|
|
||||||
const getters = useStoreGetters();
|
|
||||||
const accountId = getters.getCurrentAccountId;
|
|
||||||
|
|
||||||
const integrationId = 'linear';
|
|
||||||
|
|
||||||
const actionURL = computed(() =>
|
|
||||||
frontendURL(
|
|
||||||
`accounts/${accountId.value}/settings/integrations/${integrationId}`
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
const openLinearAccount = () => {
|
|
||||||
window.open(actionURL.value, '_blank');
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="flex flex-col p-3">
|
|
||||||
<div class="w-12 h-12 mb-3">
|
|
||||||
<img
|
|
||||||
:src="`/dashboard/images/integrations/${integrationId}.png`"
|
|
||||||
class="object-contain w-full h-full border rounded-md shadow-sm border-n-weak dark:hidden dark:bg-n-alpha-2"
|
|
||||||
/>
|
|
||||||
<img
|
|
||||||
:src="`/dashboard/images/integrations/${integrationId}-dark.png`"
|
|
||||||
class="hidden object-contain w-full h-full border rounded-md shadow-sm border-n-weak dark:block"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex-1 mb-4">
|
|
||||||
<h3 class="mb-1.5 text-sm font-medium text-n-slate-12">
|
|
||||||
{{ $t('INTEGRATION_SETTINGS.LINEAR.CTA.TITLE') }}
|
|
||||||
</h3>
|
|
||||||
<p v-if="isAdmin" class="text-sm text-n-slate-11">
|
|
||||||
{{ $t('INTEGRATION_SETTINGS.LINEAR.CTA.DESCRIPTION') }}
|
|
||||||
</p>
|
|
||||||
<p v-else class="text-sm text-n-slate-11">
|
|
||||||
{{ $t('INTEGRATION_SETTINGS.LINEAR.CTA.AGENT_DESCRIPTION') }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<NextButton v-if="isAdmin" faded slate @click="openLinearAccount">
|
|
||||||
{{ $t('INTEGRATION_SETTINGS.LINEAR.CTA.BUTTON_TEXT') }}
|
|
||||||
</NextButton>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
<script setup>
|
||||||
|
import { computed, ref, onMounted, watch, defineOptions, provide } from 'vue';
|
||||||
|
import { useAlert } from 'dashboard/composables';
|
||||||
|
import { useStoreGetters } from 'dashboard/composables/store';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
import LinearAPI from 'dashboard/api/integrations/linear';
|
||||||
|
import CreateOrLinkIssue from './CreateOrLinkIssue.vue';
|
||||||
|
import Issue from './Issue.vue';
|
||||||
|
import { useTrack } from 'dashboard/composables';
|
||||||
|
import { LINEAR_EVENTS } from 'dashboard/helper/AnalyticsHelper/events';
|
||||||
|
import { parseLinearAPIErrorResponse } from 'dashboard/store/utils/api';
|
||||||
|
import Button from 'dashboard/components-next/button/Button.vue';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
conversationId: {
|
||||||
|
type: [Number, String],
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
parentWidth: {
|
||||||
|
type: Number,
|
||||||
|
default: 10000,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: 'Linear',
|
||||||
|
});
|
||||||
|
|
||||||
|
const getters = useStoreGetters();
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
const linkedIssue = ref(null);
|
||||||
|
const shouldShow = ref(false);
|
||||||
|
const shouldShowPopup = ref(false);
|
||||||
|
const isUnlinking = ref(false);
|
||||||
|
|
||||||
|
provide('isUnlinking', isUnlinking);
|
||||||
|
|
||||||
|
const currentAccountId = getters.getCurrentAccountId;
|
||||||
|
|
||||||
|
const conversation = computed(() =>
|
||||||
|
getters.getConversationById.value(props.conversationId)
|
||||||
|
);
|
||||||
|
|
||||||
|
const tooltipText = computed(() => {
|
||||||
|
return linkedIssue.value === null
|
||||||
|
? t('INTEGRATION_SETTINGS.LINEAR.ADD_OR_LINK_BUTTON')
|
||||||
|
: null;
|
||||||
|
});
|
||||||
|
|
||||||
|
const loadLinkedIssue = async () => {
|
||||||
|
linkedIssue.value = null;
|
||||||
|
try {
|
||||||
|
const response = await LinearAPI.getLinkedIssue(props.conversationId);
|
||||||
|
const issues = response.data;
|
||||||
|
linkedIssue.value = issues && issues.length ? issues[0] : null;
|
||||||
|
} catch (error) {
|
||||||
|
// We don't want to show an error message here, as it's not critical. When someone clicks on the Linear icon, we can inform them that the integration is disabled.
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const unlinkIssue = async linkId => {
|
||||||
|
try {
|
||||||
|
isUnlinking.value = true;
|
||||||
|
await LinearAPI.unlinkIssue(linkId);
|
||||||
|
useTrack(LINEAR_EVENTS.UNLINK_ISSUE);
|
||||||
|
linkedIssue.value = null;
|
||||||
|
useAlert(t('INTEGRATION_SETTINGS.LINEAR.UNLINK.SUCCESS'));
|
||||||
|
} catch (error) {
|
||||||
|
const errorMessage = parseLinearAPIErrorResponse(
|
||||||
|
error,
|
||||||
|
t('INTEGRATION_SETTINGS.LINEAR.UNLINK.ERROR')
|
||||||
|
);
|
||||||
|
useAlert(errorMessage);
|
||||||
|
} finally {
|
||||||
|
isUnlinking.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const shouldShowIssueIdentifier = computed(() => {
|
||||||
|
if (!linkedIssue.value) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return props.parentWidth > 600;
|
||||||
|
});
|
||||||
|
|
||||||
|
const openIssue = () => {
|
||||||
|
if (!linkedIssue.value) shouldShowPopup.value = true;
|
||||||
|
shouldShow.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const closePopup = () => {
|
||||||
|
shouldShowPopup.value = false;
|
||||||
|
loadLinkedIssue();
|
||||||
|
};
|
||||||
|
|
||||||
|
const closeIssue = () => {
|
||||||
|
shouldShow.value = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => props.conversationId,
|
||||||
|
() => {
|
||||||
|
loadLinkedIssue();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
loadLinkedIssue();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="relative after:content-[''] after:h-5 after:bg-transparent after:top-5 after:w-full after:block after:absolute after:z-0"
|
||||||
|
:class="{ group: linkedIssue }"
|
||||||
|
>
|
||||||
|
<Button
|
||||||
|
v-on-clickaway="closeIssue"
|
||||||
|
v-tooltip="tooltipText"
|
||||||
|
sm
|
||||||
|
ghost
|
||||||
|
slate
|
||||||
|
class="!gap-1 group-hover:bg-n-alpha-2"
|
||||||
|
@click="openIssue"
|
||||||
|
>
|
||||||
|
<fluent-icon
|
||||||
|
icon="linear"
|
||||||
|
size="19"
|
||||||
|
class="text-[#5E6AD2] flex-shrink-0"
|
||||||
|
view-box="0 0 19 19"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
v-if="shouldShowIssueIdentifier"
|
||||||
|
class="text-xs font-medium text-n-slate-11"
|
||||||
|
>
|
||||||
|
{{ linkedIssue.issue.identifier }}
|
||||||
|
</span>
|
||||||
|
</Button>
|
||||||
|
<Issue
|
||||||
|
v-if="linkedIssue"
|
||||||
|
:issue="linkedIssue.issue"
|
||||||
|
:link-id="linkedIssue.id"
|
||||||
|
class="absolute start-0 xl:start-auto xl:end-0 top-9 invisible group-hover:visible"
|
||||||
|
@unlink-issue="unlinkIssue"
|
||||||
|
/>
|
||||||
|
<woot-modal
|
||||||
|
v-model:show="shouldShowPopup"
|
||||||
|
:on-close="closePopup"
|
||||||
|
:close-on-backdrop-click="false"
|
||||||
|
class="!items-start [&>div]:!top-12 [&>div]:sticky"
|
||||||
|
>
|
||||||
|
<CreateOrLinkIssue
|
||||||
|
:conversation="conversation"
|
||||||
|
:account-id="currentAccountId"
|
||||||
|
@close="closePopup"
|
||||||
|
/>
|
||||||
|
</woot-modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -2,6 +2,12 @@ import { computed, unref } from 'vue';
|
|||||||
import { getCurrentInstance } from 'vue';
|
import { getCurrentInstance } from 'vue';
|
||||||
|
|
||||||
export const useStore = () => {
|
export const useStore = () => {
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
if (window.__CHATWOOT_STORE__) {
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
return window.__CHATWOOT_STORE__;
|
||||||
|
}
|
||||||
|
|
||||||
const vm = getCurrentInstance();
|
const vm = getCurrentInstance();
|
||||||
if (!vm) throw new Error('must be called in setup');
|
if (!vm) throw new Error('must be called in setup');
|
||||||
return vm.proxy.$store;
|
return vm.proxy.$store;
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ export const DEFAULT_CONVERSATION_SIDEBAR_ITEMS_ORDER = Object.freeze([
|
|||||||
{ name: 'contact_notes' },
|
{ name: 'contact_notes' },
|
||||||
{ name: 'previous_conversation' },
|
{ name: 'previous_conversation' },
|
||||||
{ name: 'conversation_participants' },
|
{ name: 'conversation_participants' },
|
||||||
{ name: 'linear_issues' },
|
|
||||||
{ name: 'shopify_orders' },
|
{ name: 'shopify_orders' },
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,10 @@ const { isImpersonating } = useImpersonation();
|
|||||||
class ActionCableConnector extends BaseActionCableConnector {
|
class ActionCableConnector extends BaseActionCableConnector {
|
||||||
constructor(app, pubsubToken) {
|
constructor(app, pubsubToken) {
|
||||||
const { websocketURL = '' } = window.chatwootConfig || {};
|
const { websocketURL = '' } = window.chatwootConfig || {};
|
||||||
super(app, pubsubToken, websocketURL);
|
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
const wsURL = websocketURL || window.__WEBSOCKET_URL__ || '';
|
||||||
|
super(app, pubsubToken, wsURL);
|
||||||
this.CancelTyping = [];
|
this.CancelTyping = [];
|
||||||
this.events = {
|
this.events = {
|
||||||
'message.created': this.onMessageCreated,
|
'message.created': this.onMessageCreated,
|
||||||
@@ -48,7 +51,9 @@ class ActionCableConnector extends BaseActionCableConnector {
|
|||||||
};
|
};
|
||||||
|
|
||||||
isAValidEvent = data => {
|
isAValidEvent = data => {
|
||||||
return this.app.$store.getters.getCurrentAccountId === data.account_id;
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
const currentAccountId = this.app.$store.getters.getCurrentAccountId;
|
||||||
|
return currentAccountId === data.account_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
onMessageUpdated = data => {
|
onMessageUpdated = data => {
|
||||||
@@ -98,7 +103,10 @@ class ActionCableConnector extends BaseActionCableConnector {
|
|||||||
conversation: { last_activity_at: lastActivityAt },
|
conversation: { last_activity_at: lastActivityAt },
|
||||||
conversation_id: conversationId,
|
conversation_id: conversationId,
|
||||||
} = data;
|
} = data;
|
||||||
DashboardAudioNotificationHelper.onNewMessage(data);
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
if (!window.__WOOT_ISOLATED_SHELL__) {
|
||||||
|
DashboardAudioNotificationHelper.onNewMessage(data);
|
||||||
|
}
|
||||||
this.app.$store.dispatch('addMessage', data);
|
this.app.$store.dispatch('addMessage', data);
|
||||||
this.app.$store.dispatch('updateConversationLastActivity', {
|
this.app.$store.dispatch('updateConversationLastActivity', {
|
||||||
lastActivityAt,
|
lastActivityAt,
|
||||||
|
|||||||
@@ -59,13 +59,6 @@
|
|||||||
"ERROR_MESSAGE": "Could not update bot. Please try again."
|
"ERROR_MESSAGE": "Could not update bot. Please try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ACCESS_TOKEN": {
|
|
||||||
"TITLE": "Access Token",
|
|
||||||
"DESCRIPTION": "Copy the access token and save it securely",
|
|
||||||
"COPY_SUCCESSFUL": "Access token copied to clipboard",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"AVATAR": {
|
"AVATAR": {
|
||||||
"LABEL": "Bot avatar"
|
"LABEL": "Bot avatar"
|
||||||
|
|||||||
@@ -69,9 +69,6 @@
|
|||||||
},
|
},
|
||||||
"ACCOUNT": {
|
"ACCOUNT": {
|
||||||
"EDIT": "{agentName} updated the account configuration (#{id})"
|
"EDIT": "{agentName} updated the account configuration (#{id})"
|
||||||
},
|
|
||||||
"CONVERSATION": {
|
|
||||||
"DELETE": "{agentName} deleted conversation #{id}"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -285,7 +285,6 @@
|
|||||||
"HEADER": {
|
"HEADER": {
|
||||||
"TITLE": "Contacts",
|
"TITLE": "Contacts",
|
||||||
"SEARCH_TITLE": "Search contacts",
|
"SEARCH_TITLE": "Search contacts",
|
||||||
"ACTIVE_TITLE": "Active contacts",
|
|
||||||
"SEARCH_PLACEHOLDER": "Search...",
|
"SEARCH_PLACEHOLDER": "Search...",
|
||||||
"MESSAGE_BUTTON": "Message",
|
"MESSAGE_BUTTON": "Message",
|
||||||
"SEND_MESSAGE": "Send message",
|
"SEND_MESSAGE": "Send message",
|
||||||
@@ -458,10 +457,6 @@
|
|||||||
"PLACEHOLDER": "Add Twitter"
|
"PLACEHOLDER": "Add Twitter"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"DELETE_CONTACT": {
|
|
||||||
"MESSAGE": "This action is permanent and irreversible.",
|
|
||||||
"BUTTON": "Delete now"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DETAILS": {
|
"DETAILS": {
|
||||||
@@ -471,7 +466,7 @@
|
|||||||
"DELETE_CONTACT": "Delete contact",
|
"DELETE_CONTACT": "Delete contact",
|
||||||
"DELETE_DIALOG": {
|
"DELETE_DIALOG": {
|
||||||
"TITLE": "Confirm Deletion",
|
"TITLE": "Confirm Deletion",
|
||||||
"DESCRIPTION": "Are you sure you want to delete this contact?",
|
"DESCRIPTION": "Are you sure you want to delete this {contactName} contact?",
|
||||||
"CONFIRM": "Yes, Delete",
|
"CONFIRM": "Yes, Delete",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Contact deleted successfully",
|
"SUCCESS_MESSAGE": "Contact deleted successfully",
|
||||||
@@ -560,8 +555,7 @@
|
|||||||
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
||||||
"BUTTON_LABEL": "Add contact",
|
"BUTTON_LABEL": "Add contact",
|
||||||
"SEARCH_EMPTY_STATE_TITLE": "No contacts matches your search 🔍",
|
"SEARCH_EMPTY_STATE_TITLE": "No contacts matches your search 🔍",
|
||||||
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋",
|
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋"
|
||||||
"ACTIVE_EMPTY_STATE_TITLE": "No contacts are active at the moment 🌙"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"COMPOSE_NEW_CONVERSATION": {
|
"COMPOSE_NEW_CONVERSATION": {
|
||||||
|
|||||||
@@ -70,7 +70,6 @@
|
|||||||
"RESOLVE_ACTION": "Resolve",
|
"RESOLVE_ACTION": "Resolve",
|
||||||
"REOPEN_ACTION": "Reopen",
|
"REOPEN_ACTION": "Reopen",
|
||||||
"OPEN_ACTION": "Open",
|
"OPEN_ACTION": "Open",
|
||||||
"MORE_ACTIONS": "More actions",
|
|
||||||
"OPEN": "More",
|
"OPEN": "More",
|
||||||
"CLOSE": "Close",
|
"CLOSE": "Close",
|
||||||
"DETAILS": "details",
|
"DETAILS": "details",
|
||||||
@@ -118,11 +117,6 @@
|
|||||||
"FAILED": "Couldn't change priority. Please try again."
|
"FAILED": "Couldn't change priority. Please try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE_CONVERSATION": {
|
|
||||||
"TITLE": "Delete conversation #{conversationId}",
|
|
||||||
"DESCRIPTION": "Are you sure you want to delete this conversation?",
|
|
||||||
"CONFIRM": "Delete"
|
|
||||||
},
|
|
||||||
"CARD_CONTEXT_MENU": {
|
"CARD_CONTEXT_MENU": {
|
||||||
"PENDING": "Mark as pending",
|
"PENDING": "Mark as pending",
|
||||||
"RESOLVED": "Mark as resolved",
|
"RESOLVED": "Mark as resolved",
|
||||||
@@ -139,7 +133,6 @@
|
|||||||
"ASSIGN_LABEL": "Assign label",
|
"ASSIGN_LABEL": "Assign label",
|
||||||
"AGENTS_LOADING": "Loading agents...",
|
"AGENTS_LOADING": "Loading agents...",
|
||||||
"ASSIGN_TEAM": "Assign team",
|
"ASSIGN_TEAM": "Assign team",
|
||||||
"DELETE": "Delete conversation",
|
|
||||||
"API": {
|
"API": {
|
||||||
"AGENT_ASSIGNMENT": {
|
"AGENT_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
|
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
|
||||||
@@ -214,8 +207,6 @@
|
|||||||
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
|
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
|
||||||
"ASSIGN_LABEL_FAILED": "Label assignment failed",
|
"ASSIGN_LABEL_FAILED": "Label assignment failed",
|
||||||
"CHANGE_TEAM": "Conversation team changed",
|
"CHANGE_TEAM": "Conversation team changed",
|
||||||
"SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
|
|
||||||
"FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
|
|
||||||
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
|
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
|
||||||
"MESSAGE_ERROR": "Unable to send this message, please try again later",
|
"MESSAGE_ERROR": "Unable to send this message, please try again later",
|
||||||
"SENT_BY": "Sent by:",
|
"SENT_BY": "Sent by:",
|
||||||
@@ -308,7 +299,6 @@
|
|||||||
"CONTACT_ATTRIBUTES": "Contact Attributes",
|
"CONTACT_ATTRIBUTES": "Contact Attributes",
|
||||||
"PREVIOUS_CONVERSATION": "Previous Conversations",
|
"PREVIOUS_CONVERSATION": "Previous Conversations",
|
||||||
"MACROS": "Macros",
|
"MACROS": "Macros",
|
||||||
"LINEAR_ISSUES": "Linked Linear Issues",
|
|
||||||
"SHOPIFY_ORDERS": "Shopify Orders"
|
"SHOPIFY_ORDERS": "Shopify Orders"
|
||||||
},
|
},
|
||||||
"SHOPIFY": {
|
"SHOPIFY": {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
"PHONE_INPUT": {
|
"PHONE_INPUT": {
|
||||||
"PLACEHOLDER": "Search",
|
"PLACEHOLDER": "Search",
|
||||||
"EMPTY_STATE": "No results found"
|
"EMPTY_STATE": "No results found"
|
||||||
},
|
}
|
||||||
"CLOSE": "Close"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,31 +46,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE": {
|
"AUTO_RESOLVE": {
|
||||||
"TITLE": "Auto-resolve conversations",
|
"TITLE": "Auto-resolve conversations",
|
||||||
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period of inactivity.",
|
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period. Set the duration and customize the message to the user below."
|
||||||
"DURATION": {
|
|
||||||
"LABEL": "Inactivity duration",
|
|
||||||
"HELP": "Time period of inactivity after which conversation is auto-resolved",
|
|
||||||
"PLACEHOLDER": "30",
|
|
||||||
"ERROR": "Auto resolve duration should be between 10 minutes and 999 days",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Auto resolve settings updated successfully",
|
|
||||||
"ERROR": "Failed to update auto resolve settings"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"MESSAGE": {
|
|
||||||
"LABEL": "Custom auto-resolution message",
|
|
||||||
"PLACEHOLDER": "Conversation was marked resolved by system due to 15 days of inactivity",
|
|
||||||
"HELP": "Message sent to the customer after conversation is auto-resolved"
|
|
||||||
},
|
|
||||||
"PREFERENCES": "Preferences",
|
|
||||||
"LABEL": {
|
|
||||||
"LABEL": "Add label after auto-resolution",
|
|
||||||
"PLACEHOLDER": "Select a label"
|
|
||||||
},
|
|
||||||
"IGNORE_WAITING": {
|
|
||||||
"LABEL": "Skip conversations waiting for agent’s reply"
|
|
||||||
},
|
|
||||||
"UPDATE_BUTTON": "Save Changes"
|
|
||||||
},
|
},
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Account name",
|
"LABEL": "Account name",
|
||||||
@@ -94,15 +70,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE_IGNORE_WAITING": {
|
"AUTO_RESOLVE_IGNORE_WAITING": {
|
||||||
"LABEL": "Exclude unattended conversations",
|
"LABEL": "Exclude unattended conversations",
|
||||||
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent's reply."
|
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent’s reply."
|
||||||
},
|
|
||||||
"AUDIO_TRANSCRIPTION": {
|
|
||||||
"TITLE": "Transcribe Audio Messages",
|
|
||||||
"NOTE": "Automatically transcribe audio messages in conversations. Generate a text transcript whenever an audio message is sent or received, and display it alongside the message.",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Audio transcription setting updated successfully",
|
|
||||||
"ERROR": "Failed to update audio transcription setting"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"AUTO_RESOLVE_DURATION": {
|
"AUTO_RESOLVE_DURATION": {
|
||||||
"LABEL": "Inactivity duration for resolution",
|
"LABEL": "Inactivity duration for resolution",
|
||||||
|
|||||||
@@ -318,18 +318,11 @@
|
|||||||
"SUCCESS": "Issue unlinked successfully",
|
"SUCCESS": "Issue unlinked successfully",
|
||||||
"ERROR": "There was an error unlinking the issue, please try again"
|
"ERROR": "There was an error unlinking the issue, please try again"
|
||||||
},
|
},
|
||||||
"NO_LINKED_ISSUES": "No linked issues found",
|
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure you want to delete the integration?",
|
"TITLE": "Are you sure you want to delete the integration?",
|
||||||
"MESSAGE": "Are you sure you want to delete the integration?",
|
"MESSAGE": "Are you sure you want to delete the integration?",
|
||||||
"CONFIRM": "Yes, delete",
|
"CONFIRM": "Yes, delete",
|
||||||
"CANCEL": "Cancel"
|
"CANCEL": "Cancel"
|
||||||
},
|
|
||||||
"CTA": {
|
|
||||||
"TITLE": "Connect to Linear",
|
|
||||||
"AGENT_DESCRIPTION": "Linear workspace is not connected. Request your administrator to connect a workspace to use this integration.",
|
|
||||||
"DESCRIPTION": "Linear workspace is not connected. Click the button below to connect your workspace to use this integration.",
|
|
||||||
"BUTTON_TEXT": "Connect Linear workspace"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -337,17 +330,12 @@
|
|||||||
"NAME": "Captain",
|
"NAME": "Captain",
|
||||||
"HEADER_KNOW_MORE": "Know more",
|
"HEADER_KNOW_MORE": "Know more",
|
||||||
"COPILOT": {
|
"COPILOT": {
|
||||||
"TITLE": "Copilot",
|
|
||||||
"TRY_THESE_PROMPTS": "Try these prompts",
|
|
||||||
"PANEL_TITLE": "Get started with Copilot",
|
|
||||||
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
|
|
||||||
"SEND_MESSAGE": "Send message...",
|
"SEND_MESSAGE": "Send message...",
|
||||||
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset",
|
"RESET": "Reset",
|
||||||
"SHOW_STEPS": "Show steps",
|
|
||||||
"SELECT_ASSISTANT": "Select Assistant",
|
"SELECT_ASSISTANT": "Select Assistant",
|
||||||
"PROMPTS": {
|
"PROMPTS": {
|
||||||
"SUMMARIZE": {
|
"SUMMARIZE": {
|
||||||
@@ -361,14 +349,6 @@
|
|||||||
"RATE": {
|
"RATE": {
|
||||||
"LABEL": "Rate this conversation",
|
"LABEL": "Rate this conversation",
|
||||||
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
||||||
},
|
|
||||||
"HIGH_PRIORITY": {
|
|
||||||
"LABEL": "High priority conversations",
|
|
||||||
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
|
|
||||||
},
|
|
||||||
"LIST_CONTACTS": {
|
|
||||||
"LABEL": "List contacts",
|
|
||||||
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -388,6 +368,7 @@
|
|||||||
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
||||||
},
|
},
|
||||||
"ENTERPRISE_PAYWALL": {
|
"ENTERPRISE_PAYWALL": {
|
||||||
|
"AVAILABLE_ON": "Captain AI feature is only available in a paid plan.",
|
||||||
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
||||||
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
|
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
|
||||||
},
|
},
|
||||||
@@ -402,7 +383,6 @@
|
|||||||
},
|
},
|
||||||
"ASSISTANTS": {
|
"ASSISTANTS": {
|
||||||
"HEADER": "Assistants",
|
"HEADER": "Assistants",
|
||||||
"NO_ASSISTANTS_AVAILABLE": "There are no assistants available in your account.",
|
|
||||||
"ADD_NEW": "Create a new assistant",
|
"ADD_NEW": "Create a new assistant",
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure to delete the assistant?",
|
"TITLE": "Are you sure to delete the assistant?",
|
||||||
@@ -431,10 +411,6 @@
|
|||||||
"PLACEHOLDER": "Enter assistant name",
|
"PLACEHOLDER": "Enter assistant name",
|
||||||
"ERROR": "The name is required"
|
"ERROR": "The name is required"
|
||||||
},
|
},
|
||||||
"TEMPERATURE": {
|
|
||||||
"LABEL": "Response Temperature",
|
|
||||||
"DESCRIPTION": "Adjust how creative or restrictive the assistant's responses should be. Lower values produce more focused and deterministic responses, while higher values allow for more creative and varied outputs."
|
|
||||||
},
|
|
||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "Description",
|
"LABEL": "Description",
|
||||||
"PLACEHOLDER": "Enter assistant description",
|
"PLACEHOLDER": "Enter assistant description",
|
||||||
|
|||||||
@@ -193,7 +193,6 @@
|
|||||||
},
|
},
|
||||||
"LABEL_REPORTS": {
|
"LABEL_REPORTS": {
|
||||||
"HEADER": "Labels Overview",
|
"HEADER": "Labels Overview",
|
||||||
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
|
|
||||||
"LOADING_CHART": "Loading chart data...",
|
"LOADING_CHART": "Loading chart data...",
|
||||||
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
|
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
|
||||||
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
|
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
|
||||||
@@ -560,7 +559,6 @@
|
|||||||
"INBOX": "Inbox",
|
"INBOX": "Inbox",
|
||||||
"AGENT": "Agent",
|
"AGENT": "Agent",
|
||||||
"TEAM": "Team",
|
"TEAM": "Team",
|
||||||
"LABEL": "Label",
|
|
||||||
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
||||||
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
||||||
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
||||||
|
|||||||
@@ -4,14 +4,12 @@
|
|||||||
"ALL": "All",
|
"ALL": "All",
|
||||||
"CONTACTS": "Contacts",
|
"CONTACTS": "Contacts",
|
||||||
"CONVERSATIONS": "Conversations",
|
"CONVERSATIONS": "Conversations",
|
||||||
"MESSAGES": "Messages",
|
"MESSAGES": "Messages"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"SECTION": {
|
"SECTION": {
|
||||||
"CONTACTS": "Contacts",
|
"CONTACTS": "Contacts",
|
||||||
"CONVERSATIONS": "Conversations",
|
"CONVERSATIONS": "Conversations",
|
||||||
"MESSAGES": "Messages",
|
"MESSAGES": "Messages"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"VIEW_MORE": "View more",
|
"VIEW_MORE": "View more",
|
||||||
"LOAD_MORE": "Load more",
|
"LOAD_MORE": "Load more",
|
||||||
|
|||||||
@@ -76,12 +76,7 @@
|
|||||||
"ACCESS_TOKEN": {
|
"ACCESS_TOKEN": {
|
||||||
"TITLE": "Access Token",
|
"TITLE": "Access Token",
|
||||||
"NOTE": "This token can be used if you are building an API based integration",
|
"NOTE": "This token can be used if you are building an API based integration",
|
||||||
"COPY": "Copy",
|
"COPY": "Copy"
|
||||||
"RESET": "Reset",
|
|
||||||
"CONFIRM_RESET": "Are you sure?",
|
|
||||||
"CONFIRM_HINT": "Click again to confirm",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
},
|
||||||
"AUDIO_NOTIFICATIONS_SECTION": {
|
"AUDIO_NOTIFICATIONS_SECTION": {
|
||||||
"TITLE": "Audio Alerts",
|
"TITLE": "Audio Alerts",
|
||||||
@@ -190,8 +185,7 @@
|
|||||||
"OFFLINE": "Offline"
|
"OFFLINE": "Offline"
|
||||||
},
|
},
|
||||||
"SET_AVAILABILITY_SUCCESS": "Availability has been set successfully",
|
"SET_AVAILABILITY_SUCCESS": "Availability has been set successfully",
|
||||||
"SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again",
|
"SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again"
|
||||||
"IMPERSONATING_ERROR": "Cannot change availability while impersonating a user"
|
|
||||||
},
|
},
|
||||||
"EMAIL": {
|
"EMAIL": {
|
||||||
"LABEL": "Your email address",
|
"LABEL": "Your email address",
|
||||||
@@ -286,7 +280,6 @@
|
|||||||
"REPORTS": "Reports",
|
"REPORTS": "Reports",
|
||||||
"SETTINGS": "Settings",
|
"SETTINGS": "Settings",
|
||||||
"CONTACTS": "Contacts",
|
"CONTACTS": "Contacts",
|
||||||
"ACTIVE": "Active",
|
|
||||||
"CAPTAIN": "Captain",
|
"CAPTAIN": "Captain",
|
||||||
"CAPTAIN_ASSISTANTS": "Assistants",
|
"CAPTAIN_ASSISTANTS": "Assistants",
|
||||||
"CAPTAIN_DOCUMENTS": "Documents",
|
"CAPTAIN_DOCUMENTS": "Documents",
|
||||||
|
|||||||
@@ -59,13 +59,6 @@
|
|||||||
"ERROR_MESSAGE": "تعذر تحديث الروبوت. يرجى المحاولة مرة أخرى."
|
"ERROR_MESSAGE": "تعذر تحديث الروبوت. يرجى المحاولة مرة أخرى."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ACCESS_TOKEN": {
|
|
||||||
"TITLE": "رمز المصادقة",
|
|
||||||
"DESCRIPTION": "Copy the access token and save it securely",
|
|
||||||
"COPY_SUCCESSFUL": "Access token copied to clipboard",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"AVATAR": {
|
"AVATAR": {
|
||||||
"LABEL": "Bot avatar"
|
"LABEL": "Bot avatar"
|
||||||
|
|||||||
@@ -69,9 +69,6 @@
|
|||||||
},
|
},
|
||||||
"ACCOUNT": {
|
"ACCOUNT": {
|
||||||
"EDIT": "{agentName} قام بتحديث إعدادات الحساب (##{id})"
|
"EDIT": "{agentName} قام بتحديث إعدادات الحساب (##{id})"
|
||||||
},
|
|
||||||
"CONVERSATION": {
|
|
||||||
"DELETE": "{agentName} deleted conversation #{id}"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -285,7 +285,6 @@
|
|||||||
"HEADER": {
|
"HEADER": {
|
||||||
"TITLE": "جهات الاتصال",
|
"TITLE": "جهات الاتصال",
|
||||||
"SEARCH_TITLE": "Search contacts",
|
"SEARCH_TITLE": "Search contacts",
|
||||||
"ACTIVE_TITLE": "Active contacts",
|
|
||||||
"SEARCH_PLACEHOLDER": "Search...",
|
"SEARCH_PLACEHOLDER": "Search...",
|
||||||
"MESSAGE_BUTTON": "رسالة",
|
"MESSAGE_BUTTON": "رسالة",
|
||||||
"SEND_MESSAGE": "إرسال الرسالة",
|
"SEND_MESSAGE": "إرسال الرسالة",
|
||||||
@@ -458,10 +457,6 @@
|
|||||||
"PLACEHOLDER": "Add Twitter"
|
"PLACEHOLDER": "Add Twitter"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"DELETE_CONTACT": {
|
|
||||||
"MESSAGE": "This action is permanent and irreversible.",
|
|
||||||
"BUTTON": "Delete now"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DETAILS": {
|
"DETAILS": {
|
||||||
@@ -471,7 +466,7 @@
|
|||||||
"DELETE_CONTACT": "حذف جهة الاتصال",
|
"DELETE_CONTACT": "حذف جهة الاتصال",
|
||||||
"DELETE_DIALOG": {
|
"DELETE_DIALOG": {
|
||||||
"TITLE": "تأكيد الحذف",
|
"TITLE": "تأكيد الحذف",
|
||||||
"DESCRIPTION": "Are you sure you want to delete this contact?",
|
"DESCRIPTION": "Are you sure you want to delete this {contactName} contact?",
|
||||||
"CONFIRM": "نعم، احذف",
|
"CONFIRM": "نعم، احذف",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "تم حذف جهة الاتصال بنجاح",
|
"SUCCESS_MESSAGE": "تم حذف جهة الاتصال بنجاح",
|
||||||
@@ -560,8 +555,7 @@
|
|||||||
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
||||||
"BUTTON_LABEL": "Add contact",
|
"BUTTON_LABEL": "Add contact",
|
||||||
"SEARCH_EMPTY_STATE_TITLE": "لا توجد جهات اتصال تطابق بحثك 🔍",
|
"SEARCH_EMPTY_STATE_TITLE": "لا توجد جهات اتصال تطابق بحثك 🔍",
|
||||||
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋",
|
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋"
|
||||||
"ACTIVE_EMPTY_STATE_TITLE": "No contacts are active at the moment 🌙"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"COMPOSE_NEW_CONVERSATION": {
|
"COMPOSE_NEW_CONVERSATION": {
|
||||||
|
|||||||
@@ -70,7 +70,6 @@
|
|||||||
"RESOLVE_ACTION": "حل المحادثة",
|
"RESOLVE_ACTION": "حل المحادثة",
|
||||||
"REOPEN_ACTION": "إعادة فتح",
|
"REOPEN_ACTION": "إعادة فتح",
|
||||||
"OPEN_ACTION": "فتح",
|
"OPEN_ACTION": "فتح",
|
||||||
"MORE_ACTIONS": "More actions",
|
|
||||||
"OPEN": "المزيد",
|
"OPEN": "المزيد",
|
||||||
"CLOSE": "أغلق",
|
"CLOSE": "أغلق",
|
||||||
"DETAILS": "التفاصيل",
|
"DETAILS": "التفاصيل",
|
||||||
@@ -118,11 +117,6 @@
|
|||||||
"FAILED": "تعذر تغيير الأولوية، الرجاء المحاولة مرة أخرى."
|
"FAILED": "تعذر تغيير الأولوية، الرجاء المحاولة مرة أخرى."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE_CONVERSATION": {
|
|
||||||
"TITLE": "Delete conversation #{conversationId}",
|
|
||||||
"DESCRIPTION": "Are you sure you want to delete this conversation?",
|
|
||||||
"CONFIRM": "حذف"
|
|
||||||
},
|
|
||||||
"CARD_CONTEXT_MENU": {
|
"CARD_CONTEXT_MENU": {
|
||||||
"PENDING": "تحديد كمعلق",
|
"PENDING": "تحديد كمعلق",
|
||||||
"RESOLVED": "تحديد كمحلولة",
|
"RESOLVED": "تحديد كمحلولة",
|
||||||
@@ -139,7 +133,6 @@
|
|||||||
"ASSIGN_LABEL": "إضافة وسم",
|
"ASSIGN_LABEL": "إضافة وسم",
|
||||||
"AGENTS_LOADING": "جاري جلب الوكلاء...",
|
"AGENTS_LOADING": "جاري جلب الوكلاء...",
|
||||||
"ASSIGN_TEAM": "تعيين فريق",
|
"ASSIGN_TEAM": "تعيين فريق",
|
||||||
"DELETE": "Delete conversation",
|
|
||||||
"API": {
|
"API": {
|
||||||
"AGENT_ASSIGNMENT": {
|
"AGENT_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "معرف المحادثة {conversationId} تم تعيينه لـ \"{agentName}\"",
|
"SUCCESFUL": "معرف المحادثة {conversationId} تم تعيينه لـ \"{agentName}\"",
|
||||||
@@ -214,8 +207,6 @@
|
|||||||
"ASSIGN_LABEL_SUCCESFUL": "تم تعيين الوسم بنجاح",
|
"ASSIGN_LABEL_SUCCESFUL": "تم تعيين الوسم بنجاح",
|
||||||
"ASSIGN_LABEL_FAILED": "فشل تعيين الوسم",
|
"ASSIGN_LABEL_FAILED": "فشل تعيين الوسم",
|
||||||
"CHANGE_TEAM": "تم تغيير فريق المحادثة",
|
"CHANGE_TEAM": "تم تغيير فريق المحادثة",
|
||||||
"SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
|
|
||||||
"FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
|
|
||||||
"FILE_SIZE_LIMIT": "حجم الملف يتجاوز حد الاقصى وهو {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE}",
|
"FILE_SIZE_LIMIT": "حجم الملف يتجاوز حد الاقصى وهو {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE}",
|
||||||
"MESSAGE_ERROR": "غير قادر على إرسال هذه الرسالة، الرجاء المحاولة مرة أخرى لاحقاً",
|
"MESSAGE_ERROR": "غير قادر على إرسال هذه الرسالة، الرجاء المحاولة مرة أخرى لاحقاً",
|
||||||
"SENT_BY": "أرسلت بواسطة:",
|
"SENT_BY": "أرسلت بواسطة:",
|
||||||
@@ -308,7 +299,6 @@
|
|||||||
"CONTACT_ATTRIBUTES": "سمات جهة الاتصال",
|
"CONTACT_ATTRIBUTES": "سمات جهة الاتصال",
|
||||||
"PREVIOUS_CONVERSATION": "المحادثات السابقة",
|
"PREVIOUS_CONVERSATION": "المحادثات السابقة",
|
||||||
"MACROS": "ماكروس",
|
"MACROS": "ماكروس",
|
||||||
"LINEAR_ISSUES": "Linked Linear Issues",
|
|
||||||
"SHOPIFY_ORDERS": "Shopify Orders"
|
"SHOPIFY_ORDERS": "Shopify Orders"
|
||||||
},
|
},
|
||||||
"SHOPIFY": {
|
"SHOPIFY": {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
"PHONE_INPUT": {
|
"PHONE_INPUT": {
|
||||||
"PLACEHOLDER": "بحث",
|
"PLACEHOLDER": "بحث",
|
||||||
"EMPTY_STATE": "لم يتم العثور على النتائج"
|
"EMPTY_STATE": "لم يتم العثور على النتائج"
|
||||||
},
|
}
|
||||||
"CLOSE": "أغلق"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,31 +46,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE": {
|
"AUTO_RESOLVE": {
|
||||||
"TITLE": "Auto-resolve conversations",
|
"TITLE": "Auto-resolve conversations",
|
||||||
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period of inactivity.",
|
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period. Set the duration and customize the message to the user below."
|
||||||
"DURATION": {
|
|
||||||
"LABEL": "Inactivity duration",
|
|
||||||
"HELP": "Time period of inactivity after which conversation is auto-resolved",
|
|
||||||
"PLACEHOLDER": "30",
|
|
||||||
"ERROR": "Auto resolve duration should be between 10 minutes and 999 days",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Auto resolve settings updated successfully",
|
|
||||||
"ERROR": "Failed to update auto resolve settings"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"MESSAGE": {
|
|
||||||
"LABEL": "Custom auto-resolution message",
|
|
||||||
"PLACEHOLDER": "Conversation was marked resolved by system due to 15 days of inactivity",
|
|
||||||
"HELP": "Message sent to the customer after conversation is auto-resolved"
|
|
||||||
},
|
|
||||||
"PREFERENCES": "التفضيلات",
|
|
||||||
"LABEL": {
|
|
||||||
"LABEL": "Add label after auto-resolution",
|
|
||||||
"PLACEHOLDER": "Select a label"
|
|
||||||
},
|
|
||||||
"IGNORE_WAITING": {
|
|
||||||
"LABEL": "Skip conversations waiting for agent’s reply"
|
|
||||||
},
|
|
||||||
"UPDATE_BUTTON": "Save Changes"
|
|
||||||
},
|
},
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "اسم الحساب",
|
"LABEL": "اسم الحساب",
|
||||||
@@ -94,15 +70,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE_IGNORE_WAITING": {
|
"AUTO_RESOLVE_IGNORE_WAITING": {
|
||||||
"LABEL": "Exclude unattended conversations",
|
"LABEL": "Exclude unattended conversations",
|
||||||
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent's reply."
|
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent’s reply."
|
||||||
},
|
|
||||||
"AUDIO_TRANSCRIPTION": {
|
|
||||||
"TITLE": "Transcribe Audio Messages",
|
|
||||||
"NOTE": "Automatically transcribe audio messages in conversations. Generate a text transcript whenever an audio message is sent or received, and display it alongside the message.",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Audio transcription setting updated successfully",
|
|
||||||
"ERROR": "Failed to update audio transcription setting"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"AUTO_RESOLVE_DURATION": {
|
"AUTO_RESOLVE_DURATION": {
|
||||||
"LABEL": "Inactivity duration for resolution",
|
"LABEL": "Inactivity duration for resolution",
|
||||||
|
|||||||
@@ -318,18 +318,11 @@
|
|||||||
"SUCCESS": "تم إلغاء ربط المشكلة بنجاح",
|
"SUCCESS": "تم إلغاء ربط المشكلة بنجاح",
|
||||||
"ERROR": "حدث خطأ أثناء إلغاء ربط المشكلة، الرجاء المحاولة مرة أخرى"
|
"ERROR": "حدث خطأ أثناء إلغاء ربط المشكلة، الرجاء المحاولة مرة أخرى"
|
||||||
},
|
},
|
||||||
"NO_LINKED_ISSUES": "No linked issues found",
|
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure you want to delete the integration?",
|
"TITLE": "Are you sure you want to delete the integration?",
|
||||||
"MESSAGE": "Are you sure you want to delete the integration?",
|
"MESSAGE": "Are you sure you want to delete the integration?",
|
||||||
"CONFIRM": "نعم، احذف",
|
"CONFIRM": "نعم، احذف",
|
||||||
"CANCEL": "إلغاء"
|
"CANCEL": "إلغاء"
|
||||||
},
|
|
||||||
"CTA": {
|
|
||||||
"TITLE": "Connect to Linear",
|
|
||||||
"AGENT_DESCRIPTION": "Linear workspace is not connected. Request your administrator to connect a workspace to use this integration.",
|
|
||||||
"DESCRIPTION": "Linear workspace is not connected. Click the button below to connect your workspace to use this integration.",
|
|
||||||
"BUTTON_TEXT": "Connect Linear workspace"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -337,17 +330,12 @@
|
|||||||
"NAME": "قائد",
|
"NAME": "قائد",
|
||||||
"HEADER_KNOW_MORE": "Know more",
|
"HEADER_KNOW_MORE": "Know more",
|
||||||
"COPILOT": {
|
"COPILOT": {
|
||||||
"TITLE": "Copilot",
|
|
||||||
"TRY_THESE_PROMPTS": "Try these prompts",
|
|
||||||
"PANEL_TITLE": "Get started with Copilot",
|
|
||||||
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
|
|
||||||
"SEND_MESSAGE": "إرسال الرسالة...",
|
"SEND_MESSAGE": "إرسال الرسالة...",
|
||||||
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "أنت",
|
"YOU": "أنت",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset",
|
"RESET": "Reset",
|
||||||
"SHOW_STEPS": "Show steps",
|
|
||||||
"SELECT_ASSISTANT": "Select Assistant",
|
"SELECT_ASSISTANT": "Select Assistant",
|
||||||
"PROMPTS": {
|
"PROMPTS": {
|
||||||
"SUMMARIZE": {
|
"SUMMARIZE": {
|
||||||
@@ -361,14 +349,6 @@
|
|||||||
"RATE": {
|
"RATE": {
|
||||||
"LABEL": "Rate this conversation",
|
"LABEL": "Rate this conversation",
|
||||||
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
||||||
},
|
|
||||||
"HIGH_PRIORITY": {
|
|
||||||
"LABEL": "High priority conversations",
|
|
||||||
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
|
|
||||||
},
|
|
||||||
"LIST_CONTACTS": {
|
|
||||||
"LABEL": "List contacts",
|
|
||||||
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -388,6 +368,7 @@
|
|||||||
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
||||||
},
|
},
|
||||||
"ENTERPRISE_PAYWALL": {
|
"ENTERPRISE_PAYWALL": {
|
||||||
|
"AVAILABLE_ON": "Captain AI feature is only available in a paid plan.",
|
||||||
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
||||||
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
|
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
|
||||||
},
|
},
|
||||||
@@ -402,7 +383,6 @@
|
|||||||
},
|
},
|
||||||
"ASSISTANTS": {
|
"ASSISTANTS": {
|
||||||
"HEADER": "Assistants",
|
"HEADER": "Assistants",
|
||||||
"NO_ASSISTANTS_AVAILABLE": "There are no assistants available in your account.",
|
|
||||||
"ADD_NEW": "Create a new assistant",
|
"ADD_NEW": "Create a new assistant",
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure to delete the assistant?",
|
"TITLE": "Are you sure to delete the assistant?",
|
||||||
@@ -431,10 +411,6 @@
|
|||||||
"PLACEHOLDER": "Enter assistant name",
|
"PLACEHOLDER": "Enter assistant name",
|
||||||
"ERROR": "The name is required"
|
"ERROR": "The name is required"
|
||||||
},
|
},
|
||||||
"TEMPERATURE": {
|
|
||||||
"LABEL": "Response Temperature",
|
|
||||||
"DESCRIPTION": "Adjust how creative or restrictive the assistant's responses should be. Lower values produce more focused and deterministic responses, while higher values allow for more creative and varied outputs."
|
|
||||||
},
|
|
||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "الوصف",
|
"LABEL": "الوصف",
|
||||||
"PLACEHOLDER": "Enter assistant description",
|
"PLACEHOLDER": "Enter assistant description",
|
||||||
|
|||||||
@@ -193,7 +193,6 @@
|
|||||||
},
|
},
|
||||||
"LABEL_REPORTS": {
|
"LABEL_REPORTS": {
|
||||||
"HEADER": "نظرة عامة على التسميات",
|
"HEADER": "نظرة عامة على التسميات",
|
||||||
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
|
|
||||||
"LOADING_CHART": "تحميل بيانات الرسم البياني...",
|
"LOADING_CHART": "تحميل بيانات الرسم البياني...",
|
||||||
"NO_ENOUGH_DATA": "لم يتم جمع بيانات بقدر كافي لإنشاء التقرير، الرجاء المحاولة مرة أخرى لاحقاً.",
|
"NO_ENOUGH_DATA": "لم يتم جمع بيانات بقدر كافي لإنشاء التقرير، الرجاء المحاولة مرة أخرى لاحقاً.",
|
||||||
"DOWNLOAD_LABEL_REPORTS": "تحميل تقارير التسمية",
|
"DOWNLOAD_LABEL_REPORTS": "تحميل تقارير التسمية",
|
||||||
@@ -560,7 +559,6 @@
|
|||||||
"INBOX": "صندوق الوارد",
|
"INBOX": "صندوق الوارد",
|
||||||
"AGENT": "وكيل الدعم",
|
"AGENT": "وكيل الدعم",
|
||||||
"TEAM": "الفريق",
|
"TEAM": "الفريق",
|
||||||
"LABEL": "الوسم",
|
|
||||||
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
||||||
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
||||||
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
||||||
|
|||||||
@@ -4,14 +4,12 @@
|
|||||||
"ALL": "الكل",
|
"ALL": "الكل",
|
||||||
"CONTACTS": "جهات الاتصال",
|
"CONTACTS": "جهات الاتصال",
|
||||||
"CONVERSATIONS": "المحادثات",
|
"CONVERSATIONS": "المحادثات",
|
||||||
"MESSAGES": "الرسائل",
|
"MESSAGES": "الرسائل"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"SECTION": {
|
"SECTION": {
|
||||||
"CONTACTS": "جهات الاتصال",
|
"CONTACTS": "جهات الاتصال",
|
||||||
"CONVERSATIONS": "المحادثات",
|
"CONVERSATIONS": "المحادثات",
|
||||||
"MESSAGES": "الرسائل",
|
"MESSAGES": "الرسائل"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"VIEW_MORE": "View more",
|
"VIEW_MORE": "View more",
|
||||||
"LOAD_MORE": "Load more",
|
"LOAD_MORE": "Load more",
|
||||||
|
|||||||
@@ -76,12 +76,7 @@
|
|||||||
"ACCESS_TOKEN": {
|
"ACCESS_TOKEN": {
|
||||||
"TITLE": "رمز المصادقة",
|
"TITLE": "رمز المصادقة",
|
||||||
"NOTE": "يمكن استخدام هذا رمز المصادقة إذا كنت تبني تطبيقات API للتكامل مع Chatwoot",
|
"NOTE": "يمكن استخدام هذا رمز المصادقة إذا كنت تبني تطبيقات API للتكامل مع Chatwoot",
|
||||||
"COPY": "نسخ",
|
"COPY": "نسخ"
|
||||||
"RESET": "Reset",
|
|
||||||
"CONFIRM_RESET": "Are you sure?",
|
|
||||||
"CONFIRM_HINT": "Click again to confirm",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
},
|
||||||
"AUDIO_NOTIFICATIONS_SECTION": {
|
"AUDIO_NOTIFICATIONS_SECTION": {
|
||||||
"TITLE": "Audio Alerts",
|
"TITLE": "Audio Alerts",
|
||||||
@@ -190,8 +185,7 @@
|
|||||||
"OFFLINE": "غير متصل"
|
"OFFLINE": "غير متصل"
|
||||||
},
|
},
|
||||||
"SET_AVAILABILITY_SUCCESS": "تم تعيين التوافر بنجاح",
|
"SET_AVAILABILITY_SUCCESS": "تم تعيين التوافر بنجاح",
|
||||||
"SET_AVAILABILITY_ERROR": "تعذر تعيين التوافر، الرجاء المحاولة مرة أخرى",
|
"SET_AVAILABILITY_ERROR": "تعذر تعيين التوافر، الرجاء المحاولة مرة أخرى"
|
||||||
"IMPERSONATING_ERROR": "Cannot change availability while impersonating a user"
|
|
||||||
},
|
},
|
||||||
"EMAIL": {
|
"EMAIL": {
|
||||||
"LABEL": "عنوان البريد الإلكتروني الخاص بك",
|
"LABEL": "عنوان البريد الإلكتروني الخاص بك",
|
||||||
@@ -286,7 +280,6 @@
|
|||||||
"REPORTS": "التقارير",
|
"REPORTS": "التقارير",
|
||||||
"SETTINGS": "الإعدادات",
|
"SETTINGS": "الإعدادات",
|
||||||
"CONTACTS": "جهات الاتصال",
|
"CONTACTS": "جهات الاتصال",
|
||||||
"ACTIVE": "مفعل",
|
|
||||||
"CAPTAIN": "قائد",
|
"CAPTAIN": "قائد",
|
||||||
"CAPTAIN_ASSISTANTS": "Assistants",
|
"CAPTAIN_ASSISTANTS": "Assistants",
|
||||||
"CAPTAIN_DOCUMENTS": "Documents",
|
"CAPTAIN_DOCUMENTS": "Documents",
|
||||||
|
|||||||
@@ -59,13 +59,6 @@
|
|||||||
"ERROR_MESSAGE": "Could not update bot. Please try again."
|
"ERROR_MESSAGE": "Could not update bot. Please try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ACCESS_TOKEN": {
|
|
||||||
"TITLE": "Access Token",
|
|
||||||
"DESCRIPTION": "Copy the access token and save it securely",
|
|
||||||
"COPY_SUCCESSFUL": "Access token copied to clipboard",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"AVATAR": {
|
"AVATAR": {
|
||||||
"LABEL": "Bot avatar"
|
"LABEL": "Bot avatar"
|
||||||
|
|||||||
@@ -69,9 +69,6 @@
|
|||||||
},
|
},
|
||||||
"ACCOUNT": {
|
"ACCOUNT": {
|
||||||
"EDIT": "{agentName} updated the account configuration (#{id})"
|
"EDIT": "{agentName} updated the account configuration (#{id})"
|
||||||
},
|
|
||||||
"CONVERSATION": {
|
|
||||||
"DELETE": "{agentName} deleted conversation #{id}"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -285,7 +285,6 @@
|
|||||||
"HEADER": {
|
"HEADER": {
|
||||||
"TITLE": "Contacts",
|
"TITLE": "Contacts",
|
||||||
"SEARCH_TITLE": "Search contacts",
|
"SEARCH_TITLE": "Search contacts",
|
||||||
"ACTIVE_TITLE": "Active contacts",
|
|
||||||
"SEARCH_PLACEHOLDER": "Search...",
|
"SEARCH_PLACEHOLDER": "Search...",
|
||||||
"MESSAGE_BUTTON": "Message",
|
"MESSAGE_BUTTON": "Message",
|
||||||
"SEND_MESSAGE": "Send message",
|
"SEND_MESSAGE": "Send message",
|
||||||
@@ -458,10 +457,6 @@
|
|||||||
"PLACEHOLDER": "Add Twitter"
|
"PLACEHOLDER": "Add Twitter"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"DELETE_CONTACT": {
|
|
||||||
"MESSAGE": "This action is permanent and irreversible.",
|
|
||||||
"BUTTON": "Delete now"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DETAILS": {
|
"DETAILS": {
|
||||||
@@ -471,7 +466,7 @@
|
|||||||
"DELETE_CONTACT": "Delete contact",
|
"DELETE_CONTACT": "Delete contact",
|
||||||
"DELETE_DIALOG": {
|
"DELETE_DIALOG": {
|
||||||
"TITLE": "Confirm Deletion",
|
"TITLE": "Confirm Deletion",
|
||||||
"DESCRIPTION": "Are you sure you want to delete this contact?",
|
"DESCRIPTION": "Are you sure you want to delete this {contactName} contact?",
|
||||||
"CONFIRM": "Yes, Delete",
|
"CONFIRM": "Yes, Delete",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Contact deleted successfully",
|
"SUCCESS_MESSAGE": "Contact deleted successfully",
|
||||||
@@ -560,8 +555,7 @@
|
|||||||
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
||||||
"BUTTON_LABEL": "Add contact",
|
"BUTTON_LABEL": "Add contact",
|
||||||
"SEARCH_EMPTY_STATE_TITLE": "No contacts matches your search 🔍",
|
"SEARCH_EMPTY_STATE_TITLE": "No contacts matches your search 🔍",
|
||||||
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋",
|
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋"
|
||||||
"ACTIVE_EMPTY_STATE_TITLE": "No contacts are active at the moment 🌙"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"COMPOSE_NEW_CONVERSATION": {
|
"COMPOSE_NEW_CONVERSATION": {
|
||||||
|
|||||||
@@ -70,7 +70,6 @@
|
|||||||
"RESOLVE_ACTION": "Resolve",
|
"RESOLVE_ACTION": "Resolve",
|
||||||
"REOPEN_ACTION": "Reopen",
|
"REOPEN_ACTION": "Reopen",
|
||||||
"OPEN_ACTION": "Open",
|
"OPEN_ACTION": "Open",
|
||||||
"MORE_ACTIONS": "More actions",
|
|
||||||
"OPEN": "More",
|
"OPEN": "More",
|
||||||
"CLOSE": "Close",
|
"CLOSE": "Close",
|
||||||
"DETAILS": "details",
|
"DETAILS": "details",
|
||||||
@@ -118,11 +117,6 @@
|
|||||||
"FAILED": "Couldn't change priority. Please try again."
|
"FAILED": "Couldn't change priority. Please try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE_CONVERSATION": {
|
|
||||||
"TITLE": "Delete conversation #{conversationId}",
|
|
||||||
"DESCRIPTION": "Are you sure you want to delete this conversation?",
|
|
||||||
"CONFIRM": "Delete"
|
|
||||||
},
|
|
||||||
"CARD_CONTEXT_MENU": {
|
"CARD_CONTEXT_MENU": {
|
||||||
"PENDING": "Mark as pending",
|
"PENDING": "Mark as pending",
|
||||||
"RESOLVED": "Mark as resolved",
|
"RESOLVED": "Mark as resolved",
|
||||||
@@ -139,7 +133,6 @@
|
|||||||
"ASSIGN_LABEL": "Assign label",
|
"ASSIGN_LABEL": "Assign label",
|
||||||
"AGENTS_LOADING": "Loading agents...",
|
"AGENTS_LOADING": "Loading agents...",
|
||||||
"ASSIGN_TEAM": "Assign team",
|
"ASSIGN_TEAM": "Assign team",
|
||||||
"DELETE": "Delete conversation",
|
|
||||||
"API": {
|
"API": {
|
||||||
"AGENT_ASSIGNMENT": {
|
"AGENT_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
|
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
|
||||||
@@ -214,8 +207,6 @@
|
|||||||
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
|
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
|
||||||
"ASSIGN_LABEL_FAILED": "Label assignment failed",
|
"ASSIGN_LABEL_FAILED": "Label assignment failed",
|
||||||
"CHANGE_TEAM": "Conversation team changed",
|
"CHANGE_TEAM": "Conversation team changed",
|
||||||
"SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
|
|
||||||
"FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
|
|
||||||
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
|
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
|
||||||
"MESSAGE_ERROR": "Unable to send this message, please try again later",
|
"MESSAGE_ERROR": "Unable to send this message, please try again later",
|
||||||
"SENT_BY": "Sent by:",
|
"SENT_BY": "Sent by:",
|
||||||
@@ -308,7 +299,6 @@
|
|||||||
"CONTACT_ATTRIBUTES": "Contact Attributes",
|
"CONTACT_ATTRIBUTES": "Contact Attributes",
|
||||||
"PREVIOUS_CONVERSATION": "Previous Conversations",
|
"PREVIOUS_CONVERSATION": "Previous Conversations",
|
||||||
"MACROS": "Macros",
|
"MACROS": "Macros",
|
||||||
"LINEAR_ISSUES": "Linked Linear Issues",
|
|
||||||
"SHOPIFY_ORDERS": "Shopify Orders"
|
"SHOPIFY_ORDERS": "Shopify Orders"
|
||||||
},
|
},
|
||||||
"SHOPIFY": {
|
"SHOPIFY": {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
"PHONE_INPUT": {
|
"PHONE_INPUT": {
|
||||||
"PLACEHOLDER": "Search",
|
"PLACEHOLDER": "Search",
|
||||||
"EMPTY_STATE": "No results found"
|
"EMPTY_STATE": "No results found"
|
||||||
},
|
}
|
||||||
"CLOSE": "Close"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,31 +46,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE": {
|
"AUTO_RESOLVE": {
|
||||||
"TITLE": "Auto-resolve conversations",
|
"TITLE": "Auto-resolve conversations",
|
||||||
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period of inactivity.",
|
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period. Set the duration and customize the message to the user below."
|
||||||
"DURATION": {
|
|
||||||
"LABEL": "Inactivity duration",
|
|
||||||
"HELP": "Time period of inactivity after which conversation is auto-resolved",
|
|
||||||
"PLACEHOLDER": "30",
|
|
||||||
"ERROR": "Auto resolve duration should be between 10 minutes and 999 days",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Auto resolve settings updated successfully",
|
|
||||||
"ERROR": "Failed to update auto resolve settings"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"MESSAGE": {
|
|
||||||
"LABEL": "Custom auto-resolution message",
|
|
||||||
"PLACEHOLDER": "Conversation was marked resolved by system due to 15 days of inactivity",
|
|
||||||
"HELP": "Message sent to the customer after conversation is auto-resolved"
|
|
||||||
},
|
|
||||||
"PREFERENCES": "Preferences",
|
|
||||||
"LABEL": {
|
|
||||||
"LABEL": "Add label after auto-resolution",
|
|
||||||
"PLACEHOLDER": "Select a label"
|
|
||||||
},
|
|
||||||
"IGNORE_WAITING": {
|
|
||||||
"LABEL": "Skip conversations waiting for agent’s reply"
|
|
||||||
},
|
|
||||||
"UPDATE_BUTTON": "Save Changes"
|
|
||||||
},
|
},
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Account name",
|
"LABEL": "Account name",
|
||||||
@@ -94,15 +70,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE_IGNORE_WAITING": {
|
"AUTO_RESOLVE_IGNORE_WAITING": {
|
||||||
"LABEL": "Exclude unattended conversations",
|
"LABEL": "Exclude unattended conversations",
|
||||||
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent's reply."
|
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent’s reply."
|
||||||
},
|
|
||||||
"AUDIO_TRANSCRIPTION": {
|
|
||||||
"TITLE": "Transcribe Audio Messages",
|
|
||||||
"NOTE": "Automatically transcribe audio messages in conversations. Generate a text transcript whenever an audio message is sent or received, and display it alongside the message.",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Audio transcription setting updated successfully",
|
|
||||||
"ERROR": "Failed to update audio transcription setting"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"AUTO_RESOLVE_DURATION": {
|
"AUTO_RESOLVE_DURATION": {
|
||||||
"LABEL": "Inactivity duration for resolution",
|
"LABEL": "Inactivity duration for resolution",
|
||||||
|
|||||||
@@ -318,18 +318,11 @@
|
|||||||
"SUCCESS": "Issue unlinked successfully",
|
"SUCCESS": "Issue unlinked successfully",
|
||||||
"ERROR": "There was an error unlinking the issue, please try again"
|
"ERROR": "There was an error unlinking the issue, please try again"
|
||||||
},
|
},
|
||||||
"NO_LINKED_ISSUES": "No linked issues found",
|
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure you want to delete the integration?",
|
"TITLE": "Are you sure you want to delete the integration?",
|
||||||
"MESSAGE": "Are you sure you want to delete the integration?",
|
"MESSAGE": "Are you sure you want to delete the integration?",
|
||||||
"CONFIRM": "Yes, delete",
|
"CONFIRM": "Yes, delete",
|
||||||
"CANCEL": "Cancel"
|
"CANCEL": "Cancel"
|
||||||
},
|
|
||||||
"CTA": {
|
|
||||||
"TITLE": "Connect to Linear",
|
|
||||||
"AGENT_DESCRIPTION": "Linear workspace is not connected. Request your administrator to connect a workspace to use this integration.",
|
|
||||||
"DESCRIPTION": "Linear workspace is not connected. Click the button below to connect your workspace to use this integration.",
|
|
||||||
"BUTTON_TEXT": "Connect Linear workspace"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -337,17 +330,12 @@
|
|||||||
"NAME": "Captain",
|
"NAME": "Captain",
|
||||||
"HEADER_KNOW_MORE": "Know more",
|
"HEADER_KNOW_MORE": "Know more",
|
||||||
"COPILOT": {
|
"COPILOT": {
|
||||||
"TITLE": "Copilot",
|
|
||||||
"TRY_THESE_PROMPTS": "Try these prompts",
|
|
||||||
"PANEL_TITLE": "Get started with Copilot",
|
|
||||||
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
|
|
||||||
"SEND_MESSAGE": "Send message...",
|
"SEND_MESSAGE": "Send message...",
|
||||||
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset",
|
"RESET": "Reset",
|
||||||
"SHOW_STEPS": "Show steps",
|
|
||||||
"SELECT_ASSISTANT": "Select Assistant",
|
"SELECT_ASSISTANT": "Select Assistant",
|
||||||
"PROMPTS": {
|
"PROMPTS": {
|
||||||
"SUMMARIZE": {
|
"SUMMARIZE": {
|
||||||
@@ -361,14 +349,6 @@
|
|||||||
"RATE": {
|
"RATE": {
|
||||||
"LABEL": "Rate this conversation",
|
"LABEL": "Rate this conversation",
|
||||||
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
||||||
},
|
|
||||||
"HIGH_PRIORITY": {
|
|
||||||
"LABEL": "High priority conversations",
|
|
||||||
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
|
|
||||||
},
|
|
||||||
"LIST_CONTACTS": {
|
|
||||||
"LABEL": "List contacts",
|
|
||||||
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -388,6 +368,7 @@
|
|||||||
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
||||||
},
|
},
|
||||||
"ENTERPRISE_PAYWALL": {
|
"ENTERPRISE_PAYWALL": {
|
||||||
|
"AVAILABLE_ON": "Captain AI feature is only available in a paid plan.",
|
||||||
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
||||||
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
|
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
|
||||||
},
|
},
|
||||||
@@ -402,7 +383,6 @@
|
|||||||
},
|
},
|
||||||
"ASSISTANTS": {
|
"ASSISTANTS": {
|
||||||
"HEADER": "Assistants",
|
"HEADER": "Assistants",
|
||||||
"NO_ASSISTANTS_AVAILABLE": "There are no assistants available in your account.",
|
|
||||||
"ADD_NEW": "Create a new assistant",
|
"ADD_NEW": "Create a new assistant",
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure to delete the assistant?",
|
"TITLE": "Are you sure to delete the assistant?",
|
||||||
@@ -431,10 +411,6 @@
|
|||||||
"PLACEHOLDER": "Enter assistant name",
|
"PLACEHOLDER": "Enter assistant name",
|
||||||
"ERROR": "The name is required"
|
"ERROR": "The name is required"
|
||||||
},
|
},
|
||||||
"TEMPERATURE": {
|
|
||||||
"LABEL": "Response Temperature",
|
|
||||||
"DESCRIPTION": "Adjust how creative or restrictive the assistant's responses should be. Lower values produce more focused and deterministic responses, while higher values allow for more creative and varied outputs."
|
|
||||||
},
|
|
||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "Description",
|
"LABEL": "Description",
|
||||||
"PLACEHOLDER": "Enter assistant description",
|
"PLACEHOLDER": "Enter assistant description",
|
||||||
|
|||||||
@@ -193,7 +193,6 @@
|
|||||||
},
|
},
|
||||||
"LABEL_REPORTS": {
|
"LABEL_REPORTS": {
|
||||||
"HEADER": "Labels Overview",
|
"HEADER": "Labels Overview",
|
||||||
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
|
|
||||||
"LOADING_CHART": "Loading chart data...",
|
"LOADING_CHART": "Loading chart data...",
|
||||||
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
|
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
|
||||||
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
|
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
|
||||||
@@ -560,7 +559,6 @@
|
|||||||
"INBOX": "Inbox",
|
"INBOX": "Inbox",
|
||||||
"AGENT": "Agent",
|
"AGENT": "Agent",
|
||||||
"TEAM": "Team",
|
"TEAM": "Team",
|
||||||
"LABEL": "Label",
|
|
||||||
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
||||||
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
||||||
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
||||||
|
|||||||
@@ -4,14 +4,12 @@
|
|||||||
"ALL": "All",
|
"ALL": "All",
|
||||||
"CONTACTS": "Contacts",
|
"CONTACTS": "Contacts",
|
||||||
"CONVERSATIONS": "Conversations",
|
"CONVERSATIONS": "Conversations",
|
||||||
"MESSAGES": "Messages",
|
"MESSAGES": "Messages"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"SECTION": {
|
"SECTION": {
|
||||||
"CONTACTS": "Contacts",
|
"CONTACTS": "Contacts",
|
||||||
"CONVERSATIONS": "Conversations",
|
"CONVERSATIONS": "Conversations",
|
||||||
"MESSAGES": "Messages",
|
"MESSAGES": "Messages"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"VIEW_MORE": "View more",
|
"VIEW_MORE": "View more",
|
||||||
"LOAD_MORE": "Load more",
|
"LOAD_MORE": "Load more",
|
||||||
|
|||||||
@@ -76,12 +76,7 @@
|
|||||||
"ACCESS_TOKEN": {
|
"ACCESS_TOKEN": {
|
||||||
"TITLE": "Access Token",
|
"TITLE": "Access Token",
|
||||||
"NOTE": "This token can be used if you are building an API based integration",
|
"NOTE": "This token can be used if you are building an API based integration",
|
||||||
"COPY": "Copy",
|
"COPY": "Copy"
|
||||||
"RESET": "Reset",
|
|
||||||
"CONFIRM_RESET": "Are you sure?",
|
|
||||||
"CONFIRM_HINT": "Click again to confirm",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
},
|
||||||
"AUDIO_NOTIFICATIONS_SECTION": {
|
"AUDIO_NOTIFICATIONS_SECTION": {
|
||||||
"TITLE": "Audio Alerts",
|
"TITLE": "Audio Alerts",
|
||||||
@@ -190,8 +185,7 @@
|
|||||||
"OFFLINE": "Offline"
|
"OFFLINE": "Offline"
|
||||||
},
|
},
|
||||||
"SET_AVAILABILITY_SUCCESS": "Availability has been set successfully",
|
"SET_AVAILABILITY_SUCCESS": "Availability has been set successfully",
|
||||||
"SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again",
|
"SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again"
|
||||||
"IMPERSONATING_ERROR": "Cannot change availability while impersonating a user"
|
|
||||||
},
|
},
|
||||||
"EMAIL": {
|
"EMAIL": {
|
||||||
"LABEL": "Your email address",
|
"LABEL": "Your email address",
|
||||||
@@ -286,7 +280,6 @@
|
|||||||
"REPORTS": "Reports",
|
"REPORTS": "Reports",
|
||||||
"SETTINGS": "Settings",
|
"SETTINGS": "Settings",
|
||||||
"CONTACTS": "Contacts",
|
"CONTACTS": "Contacts",
|
||||||
"ACTIVE": "Active",
|
|
||||||
"CAPTAIN": "Captain",
|
"CAPTAIN": "Captain",
|
||||||
"CAPTAIN_ASSISTANTS": "Assistants",
|
"CAPTAIN_ASSISTANTS": "Assistants",
|
||||||
"CAPTAIN_DOCUMENTS": "Documents",
|
"CAPTAIN_DOCUMENTS": "Documents",
|
||||||
|
|||||||
@@ -59,13 +59,6 @@
|
|||||||
"ERROR_MESSAGE": "Could not update bot. Please try again."
|
"ERROR_MESSAGE": "Could not update bot. Please try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ACCESS_TOKEN": {
|
|
||||||
"TITLE": "Access Token",
|
|
||||||
"DESCRIPTION": "Copy the access token and save it securely",
|
|
||||||
"COPY_SUCCESSFUL": "Access token copied to clipboard",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"AVATAR": {
|
"AVATAR": {
|
||||||
"LABEL": "Bot avatar"
|
"LABEL": "Bot avatar"
|
||||||
|
|||||||
@@ -69,9 +69,6 @@
|
|||||||
},
|
},
|
||||||
"ACCOUNT": {
|
"ACCOUNT": {
|
||||||
"EDIT": "{agentName} updated the account configuration (#{id})"
|
"EDIT": "{agentName} updated the account configuration (#{id})"
|
||||||
},
|
|
||||||
"CONVERSATION": {
|
|
||||||
"DELETE": "{agentName} deleted conversation #{id}"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -285,7 +285,6 @@
|
|||||||
"HEADER": {
|
"HEADER": {
|
||||||
"TITLE": "Контакти",
|
"TITLE": "Контакти",
|
||||||
"SEARCH_TITLE": "Search contacts",
|
"SEARCH_TITLE": "Search contacts",
|
||||||
"ACTIVE_TITLE": "Active contacts",
|
|
||||||
"SEARCH_PLACEHOLDER": "Search...",
|
"SEARCH_PLACEHOLDER": "Search...",
|
||||||
"MESSAGE_BUTTON": "Съобщение",
|
"MESSAGE_BUTTON": "Съобщение",
|
||||||
"SEND_MESSAGE": "Изпрати съобщение",
|
"SEND_MESSAGE": "Изпрати съобщение",
|
||||||
@@ -458,10 +457,6 @@
|
|||||||
"PLACEHOLDER": "Add Twitter"
|
"PLACEHOLDER": "Add Twitter"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"DELETE_CONTACT": {
|
|
||||||
"MESSAGE": "This action is permanent and irreversible.",
|
|
||||||
"BUTTON": "Delete now"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DETAILS": {
|
"DETAILS": {
|
||||||
@@ -471,7 +466,7 @@
|
|||||||
"DELETE_CONTACT": "Изтриване на контакта",
|
"DELETE_CONTACT": "Изтриване на контакта",
|
||||||
"DELETE_DIALOG": {
|
"DELETE_DIALOG": {
|
||||||
"TITLE": "Потвърди изтриването",
|
"TITLE": "Потвърди изтриването",
|
||||||
"DESCRIPTION": "Are you sure you want to delete this contact?",
|
"DESCRIPTION": "Are you sure you want to delete this {contactName} contact?",
|
||||||
"CONFIRM": "Да, изтрий",
|
"CONFIRM": "Да, изтрий",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Контакта е изтрит успешно",
|
"SUCCESS_MESSAGE": "Контакта е изтрит успешно",
|
||||||
@@ -560,8 +555,7 @@
|
|||||||
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
||||||
"BUTTON_LABEL": "Add contact",
|
"BUTTON_LABEL": "Add contact",
|
||||||
"SEARCH_EMPTY_STATE_TITLE": "Няма контакти отговарящи на търсенети ви 🔍",
|
"SEARCH_EMPTY_STATE_TITLE": "Няма контакти отговарящи на търсенети ви 🔍",
|
||||||
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋",
|
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋"
|
||||||
"ACTIVE_EMPTY_STATE_TITLE": "No contacts are active at the moment 🌙"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"COMPOSE_NEW_CONVERSATION": {
|
"COMPOSE_NEW_CONVERSATION": {
|
||||||
|
|||||||
@@ -70,7 +70,6 @@
|
|||||||
"RESOLVE_ACTION": "Resolve",
|
"RESOLVE_ACTION": "Resolve",
|
||||||
"REOPEN_ACTION": "Reopen",
|
"REOPEN_ACTION": "Reopen",
|
||||||
"OPEN_ACTION": "Отворен",
|
"OPEN_ACTION": "Отворен",
|
||||||
"MORE_ACTIONS": "More actions",
|
|
||||||
"OPEN": "More",
|
"OPEN": "More",
|
||||||
"CLOSE": "Close",
|
"CLOSE": "Close",
|
||||||
"DETAILS": "details",
|
"DETAILS": "details",
|
||||||
@@ -118,11 +117,6 @@
|
|||||||
"FAILED": "Couldn't change priority. Please try again."
|
"FAILED": "Couldn't change priority. Please try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE_CONVERSATION": {
|
|
||||||
"TITLE": "Delete conversation #{conversationId}",
|
|
||||||
"DESCRIPTION": "Are you sure you want to delete this conversation?",
|
|
||||||
"CONFIRM": "Изтрий"
|
|
||||||
},
|
|
||||||
"CARD_CONTEXT_MENU": {
|
"CARD_CONTEXT_MENU": {
|
||||||
"PENDING": "Mark as pending",
|
"PENDING": "Mark as pending",
|
||||||
"RESOLVED": "Mark as resolved",
|
"RESOLVED": "Mark as resolved",
|
||||||
@@ -139,7 +133,6 @@
|
|||||||
"ASSIGN_LABEL": "Assign label",
|
"ASSIGN_LABEL": "Assign label",
|
||||||
"AGENTS_LOADING": "Loading agents...",
|
"AGENTS_LOADING": "Loading agents...",
|
||||||
"ASSIGN_TEAM": "Assign team",
|
"ASSIGN_TEAM": "Assign team",
|
||||||
"DELETE": "Delete conversation",
|
|
||||||
"API": {
|
"API": {
|
||||||
"AGENT_ASSIGNMENT": {
|
"AGENT_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
|
"SUCCESFUL": "Conversation id {conversationId} assigned to \"{agentName}\"",
|
||||||
@@ -214,8 +207,6 @@
|
|||||||
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
|
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
|
||||||
"ASSIGN_LABEL_FAILED": "Label assignment failed",
|
"ASSIGN_LABEL_FAILED": "Label assignment failed",
|
||||||
"CHANGE_TEAM": "Conversation team changed",
|
"CHANGE_TEAM": "Conversation team changed",
|
||||||
"SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
|
|
||||||
"FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
|
|
||||||
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
|
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
|
||||||
"MESSAGE_ERROR": "Unable to send this message, please try again later",
|
"MESSAGE_ERROR": "Unable to send this message, please try again later",
|
||||||
"SENT_BY": "Sent by:",
|
"SENT_BY": "Sent by:",
|
||||||
@@ -308,7 +299,6 @@
|
|||||||
"CONTACT_ATTRIBUTES": "Contact Attributes",
|
"CONTACT_ATTRIBUTES": "Contact Attributes",
|
||||||
"PREVIOUS_CONVERSATION": "Предишни разговори",
|
"PREVIOUS_CONVERSATION": "Предишни разговори",
|
||||||
"MACROS": "Macros",
|
"MACROS": "Macros",
|
||||||
"LINEAR_ISSUES": "Linked Linear Issues",
|
|
||||||
"SHOPIFY_ORDERS": "Shopify Orders"
|
"SHOPIFY_ORDERS": "Shopify Orders"
|
||||||
},
|
},
|
||||||
"SHOPIFY": {
|
"SHOPIFY": {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
"PHONE_INPUT": {
|
"PHONE_INPUT": {
|
||||||
"PLACEHOLDER": "Търсене",
|
"PLACEHOLDER": "Търсене",
|
||||||
"EMPTY_STATE": "Няма намерени резултати"
|
"EMPTY_STATE": "Няма намерени резултати"
|
||||||
},
|
}
|
||||||
"CLOSE": "Close"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,31 +46,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE": {
|
"AUTO_RESOLVE": {
|
||||||
"TITLE": "Auto-resolve conversations",
|
"TITLE": "Auto-resolve conversations",
|
||||||
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period of inactivity.",
|
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period. Set the duration and customize the message to the user below."
|
||||||
"DURATION": {
|
|
||||||
"LABEL": "Inactivity duration",
|
|
||||||
"HELP": "Time period of inactivity after which conversation is auto-resolved",
|
|
||||||
"PLACEHOLDER": "30",
|
|
||||||
"ERROR": "Auto resolve duration should be between 10 minutes and 999 days",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Auto resolve settings updated successfully",
|
|
||||||
"ERROR": "Failed to update auto resolve settings"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"MESSAGE": {
|
|
||||||
"LABEL": "Custom auto-resolution message",
|
|
||||||
"PLACEHOLDER": "Conversation was marked resolved by system due to 15 days of inactivity",
|
|
||||||
"HELP": "Message sent to the customer after conversation is auto-resolved"
|
|
||||||
},
|
|
||||||
"PREFERENCES": "Preferences",
|
|
||||||
"LABEL": {
|
|
||||||
"LABEL": "Add label after auto-resolution",
|
|
||||||
"PLACEHOLDER": "Select a label"
|
|
||||||
},
|
|
||||||
"IGNORE_WAITING": {
|
|
||||||
"LABEL": "Skip conversations waiting for agent’s reply"
|
|
||||||
},
|
|
||||||
"UPDATE_BUTTON": "Save Changes"
|
|
||||||
},
|
},
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Account name",
|
"LABEL": "Account name",
|
||||||
@@ -94,15 +70,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE_IGNORE_WAITING": {
|
"AUTO_RESOLVE_IGNORE_WAITING": {
|
||||||
"LABEL": "Exclude unattended conversations",
|
"LABEL": "Exclude unattended conversations",
|
||||||
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent's reply."
|
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent’s reply."
|
||||||
},
|
|
||||||
"AUDIO_TRANSCRIPTION": {
|
|
||||||
"TITLE": "Transcribe Audio Messages",
|
|
||||||
"NOTE": "Automatically transcribe audio messages in conversations. Generate a text transcript whenever an audio message is sent or received, and display it alongside the message.",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Audio transcription setting updated successfully",
|
|
||||||
"ERROR": "Failed to update audio transcription setting"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"AUTO_RESOLVE_DURATION": {
|
"AUTO_RESOLVE_DURATION": {
|
||||||
"LABEL": "Inactivity duration for resolution",
|
"LABEL": "Inactivity duration for resolution",
|
||||||
|
|||||||
@@ -318,18 +318,11 @@
|
|||||||
"SUCCESS": "Issue unlinked successfully",
|
"SUCCESS": "Issue unlinked successfully",
|
||||||
"ERROR": "There was an error unlinking the issue, please try again"
|
"ERROR": "There was an error unlinking the issue, please try again"
|
||||||
},
|
},
|
||||||
"NO_LINKED_ISSUES": "No linked issues found",
|
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure you want to delete the integration?",
|
"TITLE": "Are you sure you want to delete the integration?",
|
||||||
"MESSAGE": "Are you sure you want to delete the integration?",
|
"MESSAGE": "Are you sure you want to delete the integration?",
|
||||||
"CONFIRM": "Yes, delete",
|
"CONFIRM": "Yes, delete",
|
||||||
"CANCEL": "Отмени"
|
"CANCEL": "Отмени"
|
||||||
},
|
|
||||||
"CTA": {
|
|
||||||
"TITLE": "Connect to Linear",
|
|
||||||
"AGENT_DESCRIPTION": "Linear workspace is not connected. Request your administrator to connect a workspace to use this integration.",
|
|
||||||
"DESCRIPTION": "Linear workspace is not connected. Click the button below to connect your workspace to use this integration.",
|
|
||||||
"BUTTON_TEXT": "Connect Linear workspace"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -337,17 +330,12 @@
|
|||||||
"NAME": "Captain",
|
"NAME": "Captain",
|
||||||
"HEADER_KNOW_MORE": "Know more",
|
"HEADER_KNOW_MORE": "Know more",
|
||||||
"COPILOT": {
|
"COPILOT": {
|
||||||
"TITLE": "Copilot",
|
|
||||||
"TRY_THESE_PROMPTS": "Try these prompts",
|
|
||||||
"PANEL_TITLE": "Get started with Copilot",
|
|
||||||
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
|
|
||||||
"SEND_MESSAGE": "Изпрати съобщение...",
|
"SEND_MESSAGE": "Изпрати съобщение...",
|
||||||
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset",
|
"RESET": "Reset",
|
||||||
"SHOW_STEPS": "Show steps",
|
|
||||||
"SELECT_ASSISTANT": "Select Assistant",
|
"SELECT_ASSISTANT": "Select Assistant",
|
||||||
"PROMPTS": {
|
"PROMPTS": {
|
||||||
"SUMMARIZE": {
|
"SUMMARIZE": {
|
||||||
@@ -361,14 +349,6 @@
|
|||||||
"RATE": {
|
"RATE": {
|
||||||
"LABEL": "Rate this conversation",
|
"LABEL": "Rate this conversation",
|
||||||
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
||||||
},
|
|
||||||
"HIGH_PRIORITY": {
|
|
||||||
"LABEL": "High priority conversations",
|
|
||||||
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
|
|
||||||
},
|
|
||||||
"LIST_CONTACTS": {
|
|
||||||
"LABEL": "List contacts",
|
|
||||||
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -388,6 +368,7 @@
|
|||||||
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
||||||
},
|
},
|
||||||
"ENTERPRISE_PAYWALL": {
|
"ENTERPRISE_PAYWALL": {
|
||||||
|
"AVAILABLE_ON": "Captain AI feature is only available in a paid plan.",
|
||||||
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
||||||
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
|
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
|
||||||
},
|
},
|
||||||
@@ -402,7 +383,6 @@
|
|||||||
},
|
},
|
||||||
"ASSISTANTS": {
|
"ASSISTANTS": {
|
||||||
"HEADER": "Assistants",
|
"HEADER": "Assistants",
|
||||||
"NO_ASSISTANTS_AVAILABLE": "There are no assistants available in your account.",
|
|
||||||
"ADD_NEW": "Create a new assistant",
|
"ADD_NEW": "Create a new assistant",
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure to delete the assistant?",
|
"TITLE": "Are you sure to delete the assistant?",
|
||||||
@@ -431,10 +411,6 @@
|
|||||||
"PLACEHOLDER": "Enter assistant name",
|
"PLACEHOLDER": "Enter assistant name",
|
||||||
"ERROR": "The name is required"
|
"ERROR": "The name is required"
|
||||||
},
|
},
|
||||||
"TEMPERATURE": {
|
|
||||||
"LABEL": "Response Temperature",
|
|
||||||
"DESCRIPTION": "Adjust how creative or restrictive the assistant's responses should be. Lower values produce more focused and deterministic responses, while higher values allow for more creative and varied outputs."
|
|
||||||
},
|
|
||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "Описание",
|
"LABEL": "Описание",
|
||||||
"PLACEHOLDER": "Enter assistant description",
|
"PLACEHOLDER": "Enter assistant description",
|
||||||
|
|||||||
@@ -193,7 +193,6 @@
|
|||||||
},
|
},
|
||||||
"LABEL_REPORTS": {
|
"LABEL_REPORTS": {
|
||||||
"HEADER": "Labels Overview",
|
"HEADER": "Labels Overview",
|
||||||
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
|
|
||||||
"LOADING_CHART": "Loading chart data...",
|
"LOADING_CHART": "Loading chart data...",
|
||||||
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
|
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
|
||||||
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
|
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
|
||||||
@@ -560,7 +559,6 @@
|
|||||||
"INBOX": "Входяща кутия",
|
"INBOX": "Входяща кутия",
|
||||||
"AGENT": "Агент",
|
"AGENT": "Агент",
|
||||||
"TEAM": "Team",
|
"TEAM": "Team",
|
||||||
"LABEL": "Label",
|
|
||||||
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
||||||
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
||||||
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
||||||
|
|||||||
@@ -4,14 +4,12 @@
|
|||||||
"ALL": "Всички",
|
"ALL": "Всички",
|
||||||
"CONTACTS": "Контакти",
|
"CONTACTS": "Контакти",
|
||||||
"CONVERSATIONS": "Разговори",
|
"CONVERSATIONS": "Разговори",
|
||||||
"MESSAGES": "Messages",
|
"MESSAGES": "Messages"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"SECTION": {
|
"SECTION": {
|
||||||
"CONTACTS": "Контакти",
|
"CONTACTS": "Контакти",
|
||||||
"CONVERSATIONS": "Разговори",
|
"CONVERSATIONS": "Разговори",
|
||||||
"MESSAGES": "Messages",
|
"MESSAGES": "Messages"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"VIEW_MORE": "View more",
|
"VIEW_MORE": "View more",
|
||||||
"LOAD_MORE": "Load more",
|
"LOAD_MORE": "Load more",
|
||||||
|
|||||||
@@ -76,12 +76,7 @@
|
|||||||
"ACCESS_TOKEN": {
|
"ACCESS_TOKEN": {
|
||||||
"TITLE": "Access Token",
|
"TITLE": "Access Token",
|
||||||
"NOTE": "This token can be used if you are building an API based integration",
|
"NOTE": "This token can be used if you are building an API based integration",
|
||||||
"COPY": "Copy",
|
"COPY": "Copy"
|
||||||
"RESET": "Reset",
|
|
||||||
"CONFIRM_RESET": "Are you sure?",
|
|
||||||
"CONFIRM_HINT": "Click again to confirm",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
},
|
||||||
"AUDIO_NOTIFICATIONS_SECTION": {
|
"AUDIO_NOTIFICATIONS_SECTION": {
|
||||||
"TITLE": "Audio Alerts",
|
"TITLE": "Audio Alerts",
|
||||||
@@ -190,8 +185,7 @@
|
|||||||
"OFFLINE": "Offline"
|
"OFFLINE": "Offline"
|
||||||
},
|
},
|
||||||
"SET_AVAILABILITY_SUCCESS": "Availability has been set successfully",
|
"SET_AVAILABILITY_SUCCESS": "Availability has been set successfully",
|
||||||
"SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again",
|
"SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again"
|
||||||
"IMPERSONATING_ERROR": "Cannot change availability while impersonating a user"
|
|
||||||
},
|
},
|
||||||
"EMAIL": {
|
"EMAIL": {
|
||||||
"LABEL": "Your email address",
|
"LABEL": "Your email address",
|
||||||
@@ -286,7 +280,6 @@
|
|||||||
"REPORTS": "Reports",
|
"REPORTS": "Reports",
|
||||||
"SETTINGS": "Settings",
|
"SETTINGS": "Settings",
|
||||||
"CONTACTS": "Контакти",
|
"CONTACTS": "Контакти",
|
||||||
"ACTIVE": "Активен",
|
|
||||||
"CAPTAIN": "Captain",
|
"CAPTAIN": "Captain",
|
||||||
"CAPTAIN_ASSISTANTS": "Assistants",
|
"CAPTAIN_ASSISTANTS": "Assistants",
|
||||||
"CAPTAIN_DOCUMENTS": "Documents",
|
"CAPTAIN_DOCUMENTS": "Documents",
|
||||||
|
|||||||
@@ -59,13 +59,6 @@
|
|||||||
"ERROR_MESSAGE": "No s'ha pogut actualitzar el bot. Torneu-ho a provar."
|
"ERROR_MESSAGE": "No s'ha pogut actualitzar el bot. Torneu-ho a provar."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ACCESS_TOKEN": {
|
|
||||||
"TITLE": "Token d'accés",
|
|
||||||
"DESCRIPTION": "Copy the access token and save it securely",
|
|
||||||
"COPY_SUCCESSFUL": "Access token copied to clipboard",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"AVATAR": {
|
"AVATAR": {
|
||||||
"LABEL": "Bot avatar"
|
"LABEL": "Bot avatar"
|
||||||
|
|||||||
@@ -69,9 +69,6 @@
|
|||||||
},
|
},
|
||||||
"ACCOUNT": {
|
"ACCOUNT": {
|
||||||
"EDIT": "{agentName} updated the account configuration (#{id})"
|
"EDIT": "{agentName} updated the account configuration (#{id})"
|
||||||
},
|
|
||||||
"CONVERSATION": {
|
|
||||||
"DELETE": "{agentName} deleted conversation #{id}"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -285,7 +285,6 @@
|
|||||||
"HEADER": {
|
"HEADER": {
|
||||||
"TITLE": "Contactes",
|
"TITLE": "Contactes",
|
||||||
"SEARCH_TITLE": "Search contacts",
|
"SEARCH_TITLE": "Search contacts",
|
||||||
"ACTIVE_TITLE": "Active contacts",
|
|
||||||
"SEARCH_PLACEHOLDER": "Search...",
|
"SEARCH_PLACEHOLDER": "Search...",
|
||||||
"MESSAGE_BUTTON": "Missatge",
|
"MESSAGE_BUTTON": "Missatge",
|
||||||
"SEND_MESSAGE": "Envia missatge",
|
"SEND_MESSAGE": "Envia missatge",
|
||||||
@@ -458,10 +457,6 @@
|
|||||||
"PLACEHOLDER": "Add Twitter"
|
"PLACEHOLDER": "Add Twitter"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"DELETE_CONTACT": {
|
|
||||||
"MESSAGE": "This action is permanent and irreversible.",
|
|
||||||
"BUTTON": "Delete now"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DETAILS": {
|
"DETAILS": {
|
||||||
@@ -471,7 +466,7 @@
|
|||||||
"DELETE_CONTACT": "Contacte esborrat",
|
"DELETE_CONTACT": "Contacte esborrat",
|
||||||
"DELETE_DIALOG": {
|
"DELETE_DIALOG": {
|
||||||
"TITLE": "Confirma l'esborrat",
|
"TITLE": "Confirma l'esborrat",
|
||||||
"DESCRIPTION": "Are you sure you want to delete this contact?",
|
"DESCRIPTION": "Are you sure you want to delete this {contactName} contact?",
|
||||||
"CONFIRM": "Si, esborra",
|
"CONFIRM": "Si, esborra",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Contacte esborrat correctament",
|
"SUCCESS_MESSAGE": "Contacte esborrat correctament",
|
||||||
@@ -560,8 +555,7 @@
|
|||||||
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
||||||
"BUTTON_LABEL": "Add contact",
|
"BUTTON_LABEL": "Add contact",
|
||||||
"SEARCH_EMPTY_STATE_TITLE": "No hi ha cap contacte que coincideixi amb la vostra cerca 🔍",
|
"SEARCH_EMPTY_STATE_TITLE": "No hi ha cap contacte que coincideixi amb la vostra cerca 🔍",
|
||||||
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋",
|
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋"
|
||||||
"ACTIVE_EMPTY_STATE_TITLE": "No contacts are active at the moment 🌙"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"COMPOSE_NEW_CONVERSATION": {
|
"COMPOSE_NEW_CONVERSATION": {
|
||||||
|
|||||||
@@ -70,7 +70,6 @@
|
|||||||
"RESOLVE_ACTION": "Resoldre",
|
"RESOLVE_ACTION": "Resoldre",
|
||||||
"REOPEN_ACTION": "Tornar a obrir",
|
"REOPEN_ACTION": "Tornar a obrir",
|
||||||
"OPEN_ACTION": "Obrir",
|
"OPEN_ACTION": "Obrir",
|
||||||
"MORE_ACTIONS": "More actions",
|
|
||||||
"OPEN": "Més",
|
"OPEN": "Més",
|
||||||
"CLOSE": "Tanca",
|
"CLOSE": "Tanca",
|
||||||
"DETAILS": "detalls",
|
"DETAILS": "detalls",
|
||||||
@@ -118,11 +117,6 @@
|
|||||||
"FAILED": "No s'ha pogut canviar la prioritat. Si us plau, torna-ho a provar."
|
"FAILED": "No s'ha pogut canviar la prioritat. Si us plau, torna-ho a provar."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE_CONVERSATION": {
|
|
||||||
"TITLE": "Delete conversation #{conversationId}",
|
|
||||||
"DESCRIPTION": "Are you sure you want to delete this conversation?",
|
|
||||||
"CONFIRM": "Esborrar"
|
|
||||||
},
|
|
||||||
"CARD_CONTEXT_MENU": {
|
"CARD_CONTEXT_MENU": {
|
||||||
"PENDING": "Marca com a pendent",
|
"PENDING": "Marca com a pendent",
|
||||||
"RESOLVED": "Marca com a resolt",
|
"RESOLVED": "Marca com a resolt",
|
||||||
@@ -139,7 +133,6 @@
|
|||||||
"ASSIGN_LABEL": "Assigna etiqueta",
|
"ASSIGN_LABEL": "Assigna etiqueta",
|
||||||
"AGENTS_LOADING": "S'estan carregant els agents...",
|
"AGENTS_LOADING": "S'estan carregant els agents...",
|
||||||
"ASSIGN_TEAM": "Assigna un equip",
|
"ASSIGN_TEAM": "Assigna un equip",
|
||||||
"DELETE": "Delete conversation",
|
|
||||||
"API": {
|
"API": {
|
||||||
"AGENT_ASSIGNMENT": {
|
"AGENT_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "Id de conversa {conversationId} assignat a \"{agentName}\"",
|
"SUCCESFUL": "Id de conversa {conversationId} assignat a \"{agentName}\"",
|
||||||
@@ -214,8 +207,6 @@
|
|||||||
"ASSIGN_LABEL_SUCCESFUL": "L'etiqueta s'ha assignat correctament",
|
"ASSIGN_LABEL_SUCCESFUL": "L'etiqueta s'ha assignat correctament",
|
||||||
"ASSIGN_LABEL_FAILED": "L'assignació d'etiquetes ha fallat",
|
"ASSIGN_LABEL_FAILED": "L'assignació d'etiquetes ha fallat",
|
||||||
"CHANGE_TEAM": "L'equip de conversa ha canviat",
|
"CHANGE_TEAM": "L'equip de conversa ha canviat",
|
||||||
"SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
|
|
||||||
"FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
|
|
||||||
"FILE_SIZE_LIMIT": "El fitxer supera el límit de {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB fitxers adjunts",
|
"FILE_SIZE_LIMIT": "El fitxer supera el límit de {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB fitxers adjunts",
|
||||||
"MESSAGE_ERROR": "No es pot enviar aquest missatge, torna-ho a provar més tard",
|
"MESSAGE_ERROR": "No es pot enviar aquest missatge, torna-ho a provar més tard",
|
||||||
"SENT_BY": "Enviat per:",
|
"SENT_BY": "Enviat per:",
|
||||||
@@ -308,7 +299,6 @@
|
|||||||
"CONTACT_ATTRIBUTES": "Atributs de contacte",
|
"CONTACT_ATTRIBUTES": "Atributs de contacte",
|
||||||
"PREVIOUS_CONVERSATION": "Converses prèvies",
|
"PREVIOUS_CONVERSATION": "Converses prèvies",
|
||||||
"MACROS": "Macros",
|
"MACROS": "Macros",
|
||||||
"LINEAR_ISSUES": "Linked Linear Issues",
|
|
||||||
"SHOPIFY_ORDERS": "Shopify Orders"
|
"SHOPIFY_ORDERS": "Shopify Orders"
|
||||||
},
|
},
|
||||||
"SHOPIFY": {
|
"SHOPIFY": {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
"PHONE_INPUT": {
|
"PHONE_INPUT": {
|
||||||
"PLACEHOLDER": "Cercar",
|
"PLACEHOLDER": "Cercar",
|
||||||
"EMPTY_STATE": "No s'ha trobat agents"
|
"EMPTY_STATE": "No s'ha trobat agents"
|
||||||
},
|
}
|
||||||
"CLOSE": "Tanca"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,31 +46,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE": {
|
"AUTO_RESOLVE": {
|
||||||
"TITLE": "Auto-resolve conversations",
|
"TITLE": "Auto-resolve conversations",
|
||||||
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period of inactivity.",
|
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period. Set the duration and customize the message to the user below."
|
||||||
"DURATION": {
|
|
||||||
"LABEL": "Inactivity duration",
|
|
||||||
"HELP": "Time period of inactivity after which conversation is auto-resolved",
|
|
||||||
"PLACEHOLDER": "30",
|
|
||||||
"ERROR": "Auto resolve duration should be between 10 minutes and 999 days",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Auto resolve settings updated successfully",
|
|
||||||
"ERROR": "Failed to update auto resolve settings"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"MESSAGE": {
|
|
||||||
"LABEL": "Custom auto-resolution message",
|
|
||||||
"PLACEHOLDER": "Conversation was marked resolved by system due to 15 days of inactivity",
|
|
||||||
"HELP": "Message sent to the customer after conversation is auto-resolved"
|
|
||||||
},
|
|
||||||
"PREFERENCES": "Preferences",
|
|
||||||
"LABEL": {
|
|
||||||
"LABEL": "Add label after auto-resolution",
|
|
||||||
"PLACEHOLDER": "Select a label"
|
|
||||||
},
|
|
||||||
"IGNORE_WAITING": {
|
|
||||||
"LABEL": "Skip conversations waiting for agent’s reply"
|
|
||||||
},
|
|
||||||
"UPDATE_BUTTON": "Save Changes"
|
|
||||||
},
|
},
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Nom del compte",
|
"LABEL": "Nom del compte",
|
||||||
@@ -94,15 +70,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE_IGNORE_WAITING": {
|
"AUTO_RESOLVE_IGNORE_WAITING": {
|
||||||
"LABEL": "Exclude unattended conversations",
|
"LABEL": "Exclude unattended conversations",
|
||||||
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent's reply."
|
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent’s reply."
|
||||||
},
|
|
||||||
"AUDIO_TRANSCRIPTION": {
|
|
||||||
"TITLE": "Transcribe Audio Messages",
|
|
||||||
"NOTE": "Automatically transcribe audio messages in conversations. Generate a text transcript whenever an audio message is sent or received, and display it alongside the message.",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Audio transcription setting updated successfully",
|
|
||||||
"ERROR": "Failed to update audio transcription setting"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"AUTO_RESOLVE_DURATION": {
|
"AUTO_RESOLVE_DURATION": {
|
||||||
"LABEL": "Inactivity duration for resolution",
|
"LABEL": "Inactivity duration for resolution",
|
||||||
|
|||||||
@@ -318,18 +318,11 @@
|
|||||||
"SUCCESS": "S'ha desenllaçat la issue correctament",
|
"SUCCESS": "S'ha desenllaçat la issue correctament",
|
||||||
"ERROR": "S'ha produït un error en desenllaçar la issue, torna-ho a provar"
|
"ERROR": "S'ha produït un error en desenllaçar la issue, torna-ho a provar"
|
||||||
},
|
},
|
||||||
"NO_LINKED_ISSUES": "No linked issues found",
|
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure you want to delete the integration?",
|
"TITLE": "Are you sure you want to delete the integration?",
|
||||||
"MESSAGE": "Are you sure you want to delete the integration?",
|
"MESSAGE": "Are you sure you want to delete the integration?",
|
||||||
"CONFIRM": "Sí, esborra",
|
"CONFIRM": "Sí, esborra",
|
||||||
"CANCEL": "Cancel·la"
|
"CANCEL": "Cancel·la"
|
||||||
},
|
|
||||||
"CTA": {
|
|
||||||
"TITLE": "Connect to Linear",
|
|
||||||
"AGENT_DESCRIPTION": "Linear workspace is not connected. Request your administrator to connect a workspace to use this integration.",
|
|
||||||
"DESCRIPTION": "Linear workspace is not connected. Click the button below to connect your workspace to use this integration.",
|
|
||||||
"BUTTON_TEXT": "Connect Linear workspace"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -337,17 +330,12 @@
|
|||||||
"NAME": "Captain",
|
"NAME": "Captain",
|
||||||
"HEADER_KNOW_MORE": "Know more",
|
"HEADER_KNOW_MORE": "Know more",
|
||||||
"COPILOT": {
|
"COPILOT": {
|
||||||
"TITLE": "Copilot",
|
|
||||||
"TRY_THESE_PROMPTS": "Try these prompts",
|
|
||||||
"PANEL_TITLE": "Get started with Copilot",
|
|
||||||
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
|
|
||||||
"SEND_MESSAGE": "Envia missatge...",
|
"SEND_MESSAGE": "Envia missatge...",
|
||||||
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Tu",
|
"YOU": "Tu",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset",
|
"RESET": "Reset",
|
||||||
"SHOW_STEPS": "Show steps",
|
|
||||||
"SELECT_ASSISTANT": "Select Assistant",
|
"SELECT_ASSISTANT": "Select Assistant",
|
||||||
"PROMPTS": {
|
"PROMPTS": {
|
||||||
"SUMMARIZE": {
|
"SUMMARIZE": {
|
||||||
@@ -361,14 +349,6 @@
|
|||||||
"RATE": {
|
"RATE": {
|
||||||
"LABEL": "Rate this conversation",
|
"LABEL": "Rate this conversation",
|
||||||
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
||||||
},
|
|
||||||
"HIGH_PRIORITY": {
|
|
||||||
"LABEL": "High priority conversations",
|
|
||||||
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
|
|
||||||
},
|
|
||||||
"LIST_CONTACTS": {
|
|
||||||
"LABEL": "List contacts",
|
|
||||||
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -388,6 +368,7 @@
|
|||||||
"CANCEL_ANYTIME": "Pots canviar o cancel·lar el teu pla en qualsevol moment"
|
"CANCEL_ANYTIME": "Pots canviar o cancel·lar el teu pla en qualsevol moment"
|
||||||
},
|
},
|
||||||
"ENTERPRISE_PAYWALL": {
|
"ENTERPRISE_PAYWALL": {
|
||||||
|
"AVAILABLE_ON": "Captain AI feature is only available in a paid plan.",
|
||||||
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
||||||
"ASK_ADMIN": "Posa't en contacte amb el vostre administrador per obtenir l'actualització."
|
"ASK_ADMIN": "Posa't en contacte amb el vostre administrador per obtenir l'actualització."
|
||||||
},
|
},
|
||||||
@@ -402,7 +383,6 @@
|
|||||||
},
|
},
|
||||||
"ASSISTANTS": {
|
"ASSISTANTS": {
|
||||||
"HEADER": "Assistants",
|
"HEADER": "Assistants",
|
||||||
"NO_ASSISTANTS_AVAILABLE": "There are no assistants available in your account.",
|
|
||||||
"ADD_NEW": "Create a new assistant",
|
"ADD_NEW": "Create a new assistant",
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure to delete the assistant?",
|
"TITLE": "Are you sure to delete the assistant?",
|
||||||
@@ -431,10 +411,6 @@
|
|||||||
"PLACEHOLDER": "Enter assistant name",
|
"PLACEHOLDER": "Enter assistant name",
|
||||||
"ERROR": "The name is required"
|
"ERROR": "The name is required"
|
||||||
},
|
},
|
||||||
"TEMPERATURE": {
|
|
||||||
"LABEL": "Response Temperature",
|
|
||||||
"DESCRIPTION": "Adjust how creative or restrictive the assistant's responses should be. Lower values produce more focused and deterministic responses, while higher values allow for more creative and varied outputs."
|
|
||||||
},
|
|
||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "Descripció",
|
"LABEL": "Descripció",
|
||||||
"PLACEHOLDER": "Enter assistant description",
|
"PLACEHOLDER": "Enter assistant description",
|
||||||
|
|||||||
@@ -193,7 +193,6 @@
|
|||||||
},
|
},
|
||||||
"LABEL_REPORTS": {
|
"LABEL_REPORTS": {
|
||||||
"HEADER": "Visió general de les etiquetes",
|
"HEADER": "Visió general de les etiquetes",
|
||||||
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
|
|
||||||
"LOADING_CHART": "S'estan carregant dades del gràfic...",
|
"LOADING_CHART": "S'estan carregant dades del gràfic...",
|
||||||
"NO_ENOUGH_DATA": "No hem rebut suficients punts de dades per generar l'informe. Torneu-ho a provar més endavant.",
|
"NO_ENOUGH_DATA": "No hem rebut suficients punts de dades per generar l'informe. Torneu-ho a provar més endavant.",
|
||||||
"DOWNLOAD_LABEL_REPORTS": "Descarregar Informes d'etiquetes",
|
"DOWNLOAD_LABEL_REPORTS": "Descarregar Informes d'etiquetes",
|
||||||
@@ -560,7 +559,6 @@
|
|||||||
"INBOX": "Safata d'entrada",
|
"INBOX": "Safata d'entrada",
|
||||||
"AGENT": "Agent",
|
"AGENT": "Agent",
|
||||||
"TEAM": "Equip",
|
"TEAM": "Equip",
|
||||||
"LABEL": "Etiqueta",
|
|
||||||
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
||||||
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
||||||
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
||||||
|
|||||||
@@ -4,14 +4,12 @@
|
|||||||
"ALL": "Totes",
|
"ALL": "Totes",
|
||||||
"CONTACTS": "Contactes",
|
"CONTACTS": "Contactes",
|
||||||
"CONVERSATIONS": "Converses",
|
"CONVERSATIONS": "Converses",
|
||||||
"MESSAGES": "Missatges",
|
"MESSAGES": "Missatges"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"SECTION": {
|
"SECTION": {
|
||||||
"CONTACTS": "Contactes",
|
"CONTACTS": "Contactes",
|
||||||
"CONVERSATIONS": "Converses",
|
"CONVERSATIONS": "Converses",
|
||||||
"MESSAGES": "Missatges",
|
"MESSAGES": "Missatges"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"VIEW_MORE": "View more",
|
"VIEW_MORE": "View more",
|
||||||
"LOAD_MORE": "Load more",
|
"LOAD_MORE": "Load more",
|
||||||
|
|||||||
@@ -76,12 +76,7 @@
|
|||||||
"ACCESS_TOKEN": {
|
"ACCESS_TOKEN": {
|
||||||
"TITLE": "Token d'accés",
|
"TITLE": "Token d'accés",
|
||||||
"NOTE": "Aquest token es pot utilitzar si creeu una integració basada en l'API",
|
"NOTE": "Aquest token es pot utilitzar si creeu una integració basada en l'API",
|
||||||
"COPY": "Copia",
|
"COPY": "Copia"
|
||||||
"RESET": "Reset",
|
|
||||||
"CONFIRM_RESET": "Are you sure?",
|
|
||||||
"CONFIRM_HINT": "Click again to confirm",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
},
|
||||||
"AUDIO_NOTIFICATIONS_SECTION": {
|
"AUDIO_NOTIFICATIONS_SECTION": {
|
||||||
"TITLE": "Audio Alerts",
|
"TITLE": "Audio Alerts",
|
||||||
@@ -190,8 +185,7 @@
|
|||||||
"OFFLINE": "Fora de línia"
|
"OFFLINE": "Fora de línia"
|
||||||
},
|
},
|
||||||
"SET_AVAILABILITY_SUCCESS": "La disponibilitat s'ha establert correctament",
|
"SET_AVAILABILITY_SUCCESS": "La disponibilitat s'ha establert correctament",
|
||||||
"SET_AVAILABILITY_ERROR": "No s'ha pogut establir la disponibilitat, torna-ho a provar",
|
"SET_AVAILABILITY_ERROR": "No s'ha pogut establir la disponibilitat, torna-ho a provar"
|
||||||
"IMPERSONATING_ERROR": "Cannot change availability while impersonating a user"
|
|
||||||
},
|
},
|
||||||
"EMAIL": {
|
"EMAIL": {
|
||||||
"LABEL": "La teva adreça de correu electrònic",
|
"LABEL": "La teva adreça de correu electrònic",
|
||||||
@@ -286,7 +280,6 @@
|
|||||||
"REPORTS": "Informes",
|
"REPORTS": "Informes",
|
||||||
"SETTINGS": "Configuracions",
|
"SETTINGS": "Configuracions",
|
||||||
"CONTACTS": "Contactes",
|
"CONTACTS": "Contactes",
|
||||||
"ACTIVE": "Actiu",
|
|
||||||
"CAPTAIN": "Captain",
|
"CAPTAIN": "Captain",
|
||||||
"CAPTAIN_ASSISTANTS": "Assistants",
|
"CAPTAIN_ASSISTANTS": "Assistants",
|
||||||
"CAPTAIN_DOCUMENTS": "Documents",
|
"CAPTAIN_DOCUMENTS": "Documents",
|
||||||
|
|||||||
@@ -59,13 +59,6 @@
|
|||||||
"ERROR_MESSAGE": "Could not update bot. Please try again."
|
"ERROR_MESSAGE": "Could not update bot. Please try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ACCESS_TOKEN": {
|
|
||||||
"TITLE": "Přístupový token",
|
|
||||||
"DESCRIPTION": "Copy the access token and save it securely",
|
|
||||||
"COPY_SUCCESSFUL": "Access token copied to clipboard",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"AVATAR": {
|
"AVATAR": {
|
||||||
"LABEL": "Bot avatar"
|
"LABEL": "Bot avatar"
|
||||||
|
|||||||
@@ -69,9 +69,6 @@
|
|||||||
},
|
},
|
||||||
"ACCOUNT": {
|
"ACCOUNT": {
|
||||||
"EDIT": "{agentName} updated the account configuration (#{id})"
|
"EDIT": "{agentName} updated the account configuration (#{id})"
|
||||||
},
|
|
||||||
"CONVERSATION": {
|
|
||||||
"DELETE": "{agentName} deleted conversation #{id}"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -285,7 +285,6 @@
|
|||||||
"HEADER": {
|
"HEADER": {
|
||||||
"TITLE": "Kontakty",
|
"TITLE": "Kontakty",
|
||||||
"SEARCH_TITLE": "Search contacts",
|
"SEARCH_TITLE": "Search contacts",
|
||||||
"ACTIVE_TITLE": "Active contacts",
|
|
||||||
"SEARCH_PLACEHOLDER": "Search...",
|
"SEARCH_PLACEHOLDER": "Search...",
|
||||||
"MESSAGE_BUTTON": "Zpráva",
|
"MESSAGE_BUTTON": "Zpráva",
|
||||||
"SEND_MESSAGE": "Send message",
|
"SEND_MESSAGE": "Send message",
|
||||||
@@ -458,10 +457,6 @@
|
|||||||
"PLACEHOLDER": "Add Twitter"
|
"PLACEHOLDER": "Add Twitter"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"DELETE_CONTACT": {
|
|
||||||
"MESSAGE": "This action is permanent and irreversible.",
|
|
||||||
"BUTTON": "Delete now"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DETAILS": {
|
"DETAILS": {
|
||||||
@@ -471,7 +466,7 @@
|
|||||||
"DELETE_CONTACT": "Delete contact",
|
"DELETE_CONTACT": "Delete contact",
|
||||||
"DELETE_DIALOG": {
|
"DELETE_DIALOG": {
|
||||||
"TITLE": "Potvrdit odstranění",
|
"TITLE": "Potvrdit odstranění",
|
||||||
"DESCRIPTION": "Are you sure you want to delete this contact?",
|
"DESCRIPTION": "Are you sure you want to delete this {contactName} contact?",
|
||||||
"CONFIRM": "Ano, odstranit",
|
"CONFIRM": "Ano, odstranit",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Contact deleted successfully",
|
"SUCCESS_MESSAGE": "Contact deleted successfully",
|
||||||
@@ -560,8 +555,7 @@
|
|||||||
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
||||||
"BUTTON_LABEL": "Add contact",
|
"BUTTON_LABEL": "Add contact",
|
||||||
"SEARCH_EMPTY_STATE_TITLE": "Vašemu hledání neodpovídají žádné kontakty 🔍",
|
"SEARCH_EMPTY_STATE_TITLE": "Vašemu hledání neodpovídají žádné kontakty 🔍",
|
||||||
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋",
|
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋"
|
||||||
"ACTIVE_EMPTY_STATE_TITLE": "No contacts are active at the moment 🌙"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"COMPOSE_NEW_CONVERSATION": {
|
"COMPOSE_NEW_CONVERSATION": {
|
||||||
|
|||||||
@@ -70,7 +70,6 @@
|
|||||||
"RESOLVE_ACTION": "Vyřešit",
|
"RESOLVE_ACTION": "Vyřešit",
|
||||||
"REOPEN_ACTION": "Znovu otevřít",
|
"REOPEN_ACTION": "Znovu otevřít",
|
||||||
"OPEN_ACTION": "Otevřít",
|
"OPEN_ACTION": "Otevřít",
|
||||||
"MORE_ACTIONS": "More actions",
|
|
||||||
"OPEN": "Více",
|
"OPEN": "Více",
|
||||||
"CLOSE": "Zavřít",
|
"CLOSE": "Zavřít",
|
||||||
"DETAILS": "Podrobnosti",
|
"DETAILS": "Podrobnosti",
|
||||||
@@ -118,11 +117,6 @@
|
|||||||
"FAILED": "Couldn't change priority. Please try again."
|
"FAILED": "Couldn't change priority. Please try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE_CONVERSATION": {
|
|
||||||
"TITLE": "Delete conversation #{conversationId}",
|
|
||||||
"DESCRIPTION": "Are you sure you want to delete this conversation?",
|
|
||||||
"CONFIRM": "Vymazat"
|
|
||||||
},
|
|
||||||
"CARD_CONTEXT_MENU": {
|
"CARD_CONTEXT_MENU": {
|
||||||
"PENDING": "Označit jako nevyřízené",
|
"PENDING": "Označit jako nevyřízené",
|
||||||
"RESOLVED": "Označit jako vyřešené",
|
"RESOLVED": "Označit jako vyřešené",
|
||||||
@@ -139,7 +133,6 @@
|
|||||||
"ASSIGN_LABEL": "Přiřadit štítek",
|
"ASSIGN_LABEL": "Přiřadit štítek",
|
||||||
"AGENTS_LOADING": "Načítání agentů...",
|
"AGENTS_LOADING": "Načítání agentů...",
|
||||||
"ASSIGN_TEAM": "Přiřadit tým",
|
"ASSIGN_TEAM": "Přiřadit tým",
|
||||||
"DELETE": "Delete conversation",
|
|
||||||
"API": {
|
"API": {
|
||||||
"AGENT_ASSIGNMENT": {
|
"AGENT_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "Konverzace id {conversationId} přiřazena \"{agentName}\"",
|
"SUCCESFUL": "Konverzace id {conversationId} přiřazena \"{agentName}\"",
|
||||||
@@ -214,8 +207,6 @@
|
|||||||
"ASSIGN_LABEL_SUCCESFUL": "Štítek byl úspěšně přiřazen",
|
"ASSIGN_LABEL_SUCCESFUL": "Štítek byl úspěšně přiřazen",
|
||||||
"ASSIGN_LABEL_FAILED": "Přiřazení štítku se nezdařilo",
|
"ASSIGN_LABEL_FAILED": "Přiřazení štítku se nezdařilo",
|
||||||
"CHANGE_TEAM": "Tým konverzace se změnil",
|
"CHANGE_TEAM": "Tým konverzace se změnil",
|
||||||
"SUCCESS_DELETE_CONVERSATION": "Conversation deleted successfully",
|
|
||||||
"FAIL_DELETE_CONVERSATION": "Couldn't delete conversation! Try again",
|
|
||||||
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
|
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
|
||||||
"MESSAGE_ERROR": "Nepodařilo se odeslat tuto zprávu, zkuste to prosím později",
|
"MESSAGE_ERROR": "Nepodařilo se odeslat tuto zprávu, zkuste to prosím později",
|
||||||
"SENT_BY": "Odeslal:",
|
"SENT_BY": "Odeslal:",
|
||||||
@@ -308,7 +299,6 @@
|
|||||||
"CONTACT_ATTRIBUTES": "Atributy kontaktu",
|
"CONTACT_ATTRIBUTES": "Atributy kontaktu",
|
||||||
"PREVIOUS_CONVERSATION": "Předchozí konverzace",
|
"PREVIOUS_CONVERSATION": "Předchozí konverzace",
|
||||||
"MACROS": "Macros",
|
"MACROS": "Macros",
|
||||||
"LINEAR_ISSUES": "Linked Linear Issues",
|
|
||||||
"SHOPIFY_ORDERS": "Shopify Orders"
|
"SHOPIFY_ORDERS": "Shopify Orders"
|
||||||
},
|
},
|
||||||
"SHOPIFY": {
|
"SHOPIFY": {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
"PHONE_INPUT": {
|
"PHONE_INPUT": {
|
||||||
"PLACEHOLDER": "Hledat",
|
"PLACEHOLDER": "Hledat",
|
||||||
"EMPTY_STATE": "Žádné výsledky"
|
"EMPTY_STATE": "Žádné výsledky"
|
||||||
},
|
}
|
||||||
"CLOSE": "Zavřít"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,31 +46,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE": {
|
"AUTO_RESOLVE": {
|
||||||
"TITLE": "Auto-resolve conversations",
|
"TITLE": "Auto-resolve conversations",
|
||||||
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period of inactivity.",
|
"NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period. Set the duration and customize the message to the user below."
|
||||||
"DURATION": {
|
|
||||||
"LABEL": "Inactivity duration",
|
|
||||||
"HELP": "Time period of inactivity after which conversation is auto-resolved",
|
|
||||||
"PLACEHOLDER": "30",
|
|
||||||
"ERROR": "Auto resolve duration should be between 10 minutes and 999 days",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Auto resolve settings updated successfully",
|
|
||||||
"ERROR": "Failed to update auto resolve settings"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"MESSAGE": {
|
|
||||||
"LABEL": "Custom auto-resolution message",
|
|
||||||
"PLACEHOLDER": "Conversation was marked resolved by system due to 15 days of inactivity",
|
|
||||||
"HELP": "Message sent to the customer after conversation is auto-resolved"
|
|
||||||
},
|
|
||||||
"PREFERENCES": "Preferences",
|
|
||||||
"LABEL": {
|
|
||||||
"LABEL": "Add label after auto-resolution",
|
|
||||||
"PLACEHOLDER": "Select a label"
|
|
||||||
},
|
|
||||||
"IGNORE_WAITING": {
|
|
||||||
"LABEL": "Skip conversations waiting for agent’s reply"
|
|
||||||
},
|
|
||||||
"UPDATE_BUTTON": "Save Changes"
|
|
||||||
},
|
},
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Název účtu",
|
"LABEL": "Název účtu",
|
||||||
@@ -94,15 +70,7 @@
|
|||||||
},
|
},
|
||||||
"AUTO_RESOLVE_IGNORE_WAITING": {
|
"AUTO_RESOLVE_IGNORE_WAITING": {
|
||||||
"LABEL": "Exclude unattended conversations",
|
"LABEL": "Exclude unattended conversations",
|
||||||
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent's reply."
|
"HELP": "When enabled, the system will skip resolving conversations that are still waiting for an agent’s reply."
|
||||||
},
|
|
||||||
"AUDIO_TRANSCRIPTION": {
|
|
||||||
"TITLE": "Transcribe Audio Messages",
|
|
||||||
"NOTE": "Automatically transcribe audio messages in conversations. Generate a text transcript whenever an audio message is sent or received, and display it alongside the message.",
|
|
||||||
"API": {
|
|
||||||
"SUCCESS": "Audio transcription setting updated successfully",
|
|
||||||
"ERROR": "Failed to update audio transcription setting"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"AUTO_RESOLVE_DURATION": {
|
"AUTO_RESOLVE_DURATION": {
|
||||||
"LABEL": "Inactivity duration for resolution",
|
"LABEL": "Inactivity duration for resolution",
|
||||||
|
|||||||
@@ -318,18 +318,11 @@
|
|||||||
"SUCCESS": "Issue unlinked successfully",
|
"SUCCESS": "Issue unlinked successfully",
|
||||||
"ERROR": "There was an error unlinking the issue, please try again"
|
"ERROR": "There was an error unlinking the issue, please try again"
|
||||||
},
|
},
|
||||||
"NO_LINKED_ISSUES": "No linked issues found",
|
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure you want to delete the integration?",
|
"TITLE": "Are you sure you want to delete the integration?",
|
||||||
"MESSAGE": "Are you sure you want to delete the integration?",
|
"MESSAGE": "Are you sure you want to delete the integration?",
|
||||||
"CONFIRM": "Yes, delete",
|
"CONFIRM": "Yes, delete",
|
||||||
"CANCEL": "Zrušit"
|
"CANCEL": "Zrušit"
|
||||||
},
|
|
||||||
"CTA": {
|
|
||||||
"TITLE": "Connect to Linear",
|
|
||||||
"AGENT_DESCRIPTION": "Linear workspace is not connected. Request your administrator to connect a workspace to use this integration.",
|
|
||||||
"DESCRIPTION": "Linear workspace is not connected. Click the button below to connect your workspace to use this integration.",
|
|
||||||
"BUTTON_TEXT": "Connect Linear workspace"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -337,17 +330,12 @@
|
|||||||
"NAME": "Captain",
|
"NAME": "Captain",
|
||||||
"HEADER_KNOW_MORE": "Know more",
|
"HEADER_KNOW_MORE": "Know more",
|
||||||
"COPILOT": {
|
"COPILOT": {
|
||||||
"TITLE": "Copilot",
|
|
||||||
"TRY_THESE_PROMPTS": "Try these prompts",
|
|
||||||
"PANEL_TITLE": "Get started with Copilot",
|
|
||||||
"KICK_OFF_MESSAGE": "Need a quick summary, want to check past conversations, or draft a better reply? Copilot’s here to speed things up.",
|
|
||||||
"SEND_MESSAGE": "Send message...",
|
"SEND_MESSAGE": "Send message...",
|
||||||
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
"EMPTY_MESSAGE": "There was an error generating the response. Please try again.",
|
||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Vy",
|
"YOU": "Vy",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset",
|
"RESET": "Reset",
|
||||||
"SHOW_STEPS": "Show steps",
|
|
||||||
"SELECT_ASSISTANT": "Select Assistant",
|
"SELECT_ASSISTANT": "Select Assistant",
|
||||||
"PROMPTS": {
|
"PROMPTS": {
|
||||||
"SUMMARIZE": {
|
"SUMMARIZE": {
|
||||||
@@ -361,14 +349,6 @@
|
|||||||
"RATE": {
|
"RATE": {
|
||||||
"LABEL": "Rate this conversation",
|
"LABEL": "Rate this conversation",
|
||||||
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
"CONTENT": "Review the conversation to see how well it meets the customer's needs. Share a rating out of 5 based on tone, clarity, and effectiveness."
|
||||||
},
|
|
||||||
"HIGH_PRIORITY": {
|
|
||||||
"LABEL": "High priority conversations",
|
|
||||||
"CONTENT": "Give me a summary of all high priority open conversations. Include the conversation ID, customer name (if available), last message content, and assigned agent. Group by status if relevant."
|
|
||||||
},
|
|
||||||
"LIST_CONTACTS": {
|
|
||||||
"LABEL": "List contacts",
|
|
||||||
"CONTENT": "Show me the list of top 10 contacts. Include name, email or phone number (if available), last seen time, tags (if any)."
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -388,6 +368,7 @@
|
|||||||
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
||||||
},
|
},
|
||||||
"ENTERPRISE_PAYWALL": {
|
"ENTERPRISE_PAYWALL": {
|
||||||
|
"AVAILABLE_ON": "Captain AI feature is only available in a paid plan.",
|
||||||
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
"UPGRADE_PROMPT": "Upgrade your plan to get access to our assistants, copilot and more.",
|
||||||
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
|
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
|
||||||
},
|
},
|
||||||
@@ -402,7 +383,6 @@
|
|||||||
},
|
},
|
||||||
"ASSISTANTS": {
|
"ASSISTANTS": {
|
||||||
"HEADER": "Assistants",
|
"HEADER": "Assistants",
|
||||||
"NO_ASSISTANTS_AVAILABLE": "There are no assistants available in your account.",
|
|
||||||
"ADD_NEW": "Create a new assistant",
|
"ADD_NEW": "Create a new assistant",
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure to delete the assistant?",
|
"TITLE": "Are you sure to delete the assistant?",
|
||||||
@@ -431,10 +411,6 @@
|
|||||||
"PLACEHOLDER": "Enter assistant name",
|
"PLACEHOLDER": "Enter assistant name",
|
||||||
"ERROR": "The name is required"
|
"ERROR": "The name is required"
|
||||||
},
|
},
|
||||||
"TEMPERATURE": {
|
|
||||||
"LABEL": "Response Temperature",
|
|
||||||
"DESCRIPTION": "Adjust how creative or restrictive the assistant's responses should be. Lower values produce more focused and deterministic responses, while higher values allow for more creative and varied outputs."
|
|
||||||
},
|
|
||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "Description",
|
"LABEL": "Description",
|
||||||
"PLACEHOLDER": "Enter assistant description",
|
"PLACEHOLDER": "Enter assistant description",
|
||||||
|
|||||||
@@ -193,7 +193,6 @@
|
|||||||
},
|
},
|
||||||
"LABEL_REPORTS": {
|
"LABEL_REPORTS": {
|
||||||
"HEADER": "Labels Overview",
|
"HEADER": "Labels Overview",
|
||||||
"DESCRIPTION": "Track label performance with key metrics including conversations, response times, resolution times, and resolved cases. Click a label name for detailed insights.",
|
|
||||||
"LOADING_CHART": "Načítání dat mapy...",
|
"LOADING_CHART": "Načítání dat mapy...",
|
||||||
"NO_ENOUGH_DATA": "Pro vytvoření hlášení jsme neobdrželi dostatek dat, zkuste to prosím později.",
|
"NO_ENOUGH_DATA": "Pro vytvoření hlášení jsme neobdrželi dostatek dat, zkuste to prosím později.",
|
||||||
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
|
"DOWNLOAD_LABEL_REPORTS": "Download label reports",
|
||||||
@@ -560,7 +559,6 @@
|
|||||||
"INBOX": "Inbox",
|
"INBOX": "Inbox",
|
||||||
"AGENT": "Agent",
|
"AGENT": "Agent",
|
||||||
"TEAM": "Team",
|
"TEAM": "Team",
|
||||||
"LABEL": "Label",
|
|
||||||
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
"AVG_RESOLUTION_TIME": "Avg. Resolution Time",
|
||||||
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
"AVG_FIRST_RESPONSE_TIME": "Avg. First Response Time",
|
||||||
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
"AVG_REPLY_TIME": "Avg. Customer Waiting Time",
|
||||||
|
|||||||
@@ -4,14 +4,12 @@
|
|||||||
"ALL": "Vše",
|
"ALL": "Vše",
|
||||||
"CONTACTS": "Kontakty",
|
"CONTACTS": "Kontakty",
|
||||||
"CONVERSATIONS": "Konverzace",
|
"CONVERSATIONS": "Konverzace",
|
||||||
"MESSAGES": "Zprávy",
|
"MESSAGES": "Zprávy"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"SECTION": {
|
"SECTION": {
|
||||||
"CONTACTS": "Kontakty",
|
"CONTACTS": "Kontakty",
|
||||||
"CONVERSATIONS": "Konverzace",
|
"CONVERSATIONS": "Konverzace",
|
||||||
"MESSAGES": "Zprávy",
|
"MESSAGES": "Zprávy"
|
||||||
"ARTICLES": "Articles"
|
|
||||||
},
|
},
|
||||||
"VIEW_MORE": "View more",
|
"VIEW_MORE": "View more",
|
||||||
"LOAD_MORE": "Load more",
|
"LOAD_MORE": "Load more",
|
||||||
|
|||||||
@@ -76,12 +76,7 @@
|
|||||||
"ACCESS_TOKEN": {
|
"ACCESS_TOKEN": {
|
||||||
"TITLE": "Přístupový token",
|
"TITLE": "Přístupový token",
|
||||||
"NOTE": "Tento token může být použit při vytváření integrace založené na API",
|
"NOTE": "Tento token může být použit při vytváření integrace založené na API",
|
||||||
"COPY": "Kopírovat",
|
"COPY": "Kopírovat"
|
||||||
"RESET": "Reset",
|
|
||||||
"CONFIRM_RESET": "Are you sure?",
|
|
||||||
"CONFIRM_HINT": "Click again to confirm",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
},
|
||||||
"AUDIO_NOTIFICATIONS_SECTION": {
|
"AUDIO_NOTIFICATIONS_SECTION": {
|
||||||
"TITLE": "Audio Alerts",
|
"TITLE": "Audio Alerts",
|
||||||
@@ -190,8 +185,7 @@
|
|||||||
"OFFLINE": "Offline"
|
"OFFLINE": "Offline"
|
||||||
},
|
},
|
||||||
"SET_AVAILABILITY_SUCCESS": "Availability has been set successfully",
|
"SET_AVAILABILITY_SUCCESS": "Availability has been set successfully",
|
||||||
"SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again",
|
"SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again"
|
||||||
"IMPERSONATING_ERROR": "Cannot change availability while impersonating a user"
|
|
||||||
},
|
},
|
||||||
"EMAIL": {
|
"EMAIL": {
|
||||||
"LABEL": "Vaše e-mailová adresa",
|
"LABEL": "Vaše e-mailová adresa",
|
||||||
@@ -286,7 +280,6 @@
|
|||||||
"REPORTS": "Zprávy",
|
"REPORTS": "Zprávy",
|
||||||
"SETTINGS": "Nastavení",
|
"SETTINGS": "Nastavení",
|
||||||
"CONTACTS": "Kontakty",
|
"CONTACTS": "Kontakty",
|
||||||
"ACTIVE": "Active",
|
|
||||||
"CAPTAIN": "Captain",
|
"CAPTAIN": "Captain",
|
||||||
"CAPTAIN_ASSISTANTS": "Assistants",
|
"CAPTAIN_ASSISTANTS": "Assistants",
|
||||||
"CAPTAIN_DOCUMENTS": "Documents",
|
"CAPTAIN_DOCUMENTS": "Documents",
|
||||||
|
|||||||
@@ -59,13 +59,6 @@
|
|||||||
"ERROR_MESSAGE": "Could not update bot. Please try again."
|
"ERROR_MESSAGE": "Could not update bot. Please try again."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ACCESS_TOKEN": {
|
|
||||||
"TITLE": "Adgangs Token",
|
|
||||||
"DESCRIPTION": "Copy the access token and save it securely",
|
|
||||||
"COPY_SUCCESSFUL": "Access token copied to clipboard",
|
|
||||||
"RESET_SUCCESS": "Access token regenerated successfully",
|
|
||||||
"RESET_ERROR": "Unable to regenerate access token. Please try again"
|
|
||||||
},
|
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"AVATAR": {
|
"AVATAR": {
|
||||||
"LABEL": "Bot avatar"
|
"LABEL": "Bot avatar"
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user