Compare commits

...

11 commits

Author SHA1 Message Date
Sivin Varghese
98c289dc3e
chore: Fixes issue showing the CSAT error message (#6136)
Approved by Muhsin
2022-12-28 12:49:11 +05:30
Nithin David Thomas
3e91765472
fix: Expand title height of textarea on load (#6103) 2022-12-22 14:14:30 -08:00
Sojan Jose
1bf23055df
chore: Update translations (#6113) 2022-12-22 14:08:08 -08:00
Sivin Varghese
2af337be10
feat: Add the ability to toggle the secondary sidebar in all display breakpoints (#6118)
Co-authored-by: Nithin David <1277421+nithindavid@users.noreply.github.com>
Co-authored-by: Pranav Raj S <pranav@chatwoot.com>
2022-12-22 14:07:11 -08:00
Muhsin Keloth
dbb6c0a074
chore: Increase the max concurrent number of devices (#6121) 2022-12-22 19:13:54 +05:30
Sivin Varghese
8c88344170
chore: Helpcenter improvements (#6098) 2022-12-22 18:51:24 +05:30
giquieu
6a78254701
feat: Send audio longer than 10 seconds and Add Prop audio-record-format (#6108)
Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
2022-12-22 13:36:03 +05:30
Pranav Raj S
26ada8b342
fix: Update the logic to show read status for web (#6107) 2022-12-21 09:58:56 -08:00
Sivin Varghese
3c6bd2c8fd
fix: Use canned response menu from the editor in contact messages (#6109) 2022-12-21 16:01:50 +05:30
Sivin Varghese
2c2c47d7fd
chore: Hide inbox name only has one inbox (#6115) 2022-12-21 13:31:53 +05:30
Sojan
34f7405689 Merge branch 'release/2.12.0' into develop 2022-12-19 22:48:01 +05:30
75 changed files with 361 additions and 293 deletions

View file

@ -59,12 +59,8 @@
.hamburger--menu { .hamburger--menu {
cursor: pointer; cursor: pointer;
display: none;
margin-right: $space-normal;
@media screen and (max-width: 1200px) {
display: block; display: block;
} margin-right: $space-normal;
} }
.header--icon { .header--icon {

View file

@ -1,7 +1,12 @@
<template> <template>
<button @click="onMenuItemClick"> <woot-button
<fluent-icon class="hamburger--menu" icon="list" /> size="small"
</button> variant="clear"
color-scheme="secondary"
icon="list"
class="toggle-sidebar"
@click="onMenuItemClick"
/>
</template> </template>
<script> <script>
@ -16,13 +21,8 @@ export default {
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.hamburger--menu { .toggle-sidebar {
cursor: pointer; margin-right: var(--space-small);
display: none; margin-left: var(--space-minus-small);
margin-right: var(--space-normal);
@media screen and (max-width: 1200px) {
display: block;
}
} }
</style> </style>

View file

@ -261,14 +261,7 @@ export default {
width: 20rem; width: 20rem;
flex-shrink: 0; flex-shrink: 0;
overflow-y: hidden; overflow-y: hidden;
@include breakpoint(xlarge down) {
position: absolute;
}
@include breakpoint(xlarge up) {
position: unset; position: unset;
}
&:hover { &:hover {
overflow-y: hidden; overflow-y: hidden;

View file

@ -1,10 +1,11 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP // Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`SidemenuIcon matches snapshot 1`] = ` exports[`SidemenuIcon matches snapshot 1`] = `
<button> <woot-button
<fluent-icon class="toggle-sidebar"
class="hamburger--menu" color-scheme="secondary"
icon="list" icon="list"
size="small"
variant="clear"
/> />
</button>
`; `;

View file

@ -10,11 +10,11 @@ import 'videojs-record/dist/css/videojs.record.css';
import videojs from 'video.js'; import videojs from 'video.js';
import inboxMixin from '../../../../shared/mixins/inboxMixin';
import alertMixin from '../../../../shared/mixins/alertMixin'; import alertMixin from '../../../../shared/mixins/alertMixin';
import Recorder from 'opus-recorder'; import Recorder from 'opus-recorder';
import encoderWorker from 'opus-recorder/dist/encoderWorker.min'; import encoderWorker from 'opus-recorder/dist/encoderWorker.min';
import waveWorker from 'opus-recorder/dist/waveWorker.min';
import WaveSurfer from 'wavesurfer.js'; import WaveSurfer from 'wavesurfer.js';
import MicrophonePlugin from 'wavesurfer.js/dist/plugin/wavesurfer.microphone.js'; import MicrophonePlugin from 'wavesurfer.js/dist/plugin/wavesurfer.microphone.js';
@ -29,14 +29,19 @@ WaveSurfer.microphone = MicrophonePlugin;
export default { export default {
name: 'WootAudioRecorder', name: 'WootAudioRecorder',
mixins: [inboxMixin, alertMixin], mixins: [alertMixin],
props: {
audioRecordFormat: {
type: String,
default: AUDIO_FORMATS.WEBM,
},
},
data() { data() {
return { return {
player: false, player: false,
recordingDateStarted: new Date(0), recordingDateStarted: new Date(0),
initialTimeDuration: '00:00', initialTimeDuration: '00:00',
recorderOptions: { recorderOptions: {
debug: true,
controls: true, controls: true,
bigPlayButton: false, bigPlayButton: false,
fluid: false, fluid: false,
@ -71,6 +76,9 @@ export default {
record: { record: {
audio: true, audio: true,
video: false, video: false,
maxLength: 900,
timeSlice: 1000,
maxFileSize: 15 * 1024 * 1024,
...(this.audioRecordFormat === AUDIO_FORMATS.WEBM && { ...(this.audioRecordFormat === AUDIO_FORMATS.WEBM && {
monitorGain: 0, monitorGain: 0,
recordingGain: 1, recordingGain: 1,
@ -80,11 +88,10 @@ export default {
streamPages: true, streamPages: true,
maxFramesPerPage: 1, maxFramesPerPage: 1,
encoderFrameSize: 1, encoderFrameSize: 1,
encoderPath: 'opus-recorder/dist/waveWorker.min.js', encoderPath: waveWorker,
}), }),
...(this.audioRecordFormat === AUDIO_FORMATS.OGG && { ...(this.audioRecordFormat === AUDIO_FORMATS.OGG && {
displayMilliseconds: false, displayMilliseconds: false,
maxLength: 300,
audioEngine: 'opus-recorder', audioEngine: 'opus-recorder',
audioWorkerURL: encoderWorker, audioWorkerURL: encoderWorker,
audioChannels: 1, audioChannels: 1,
@ -100,12 +107,6 @@ export default {
isRecording() { isRecording() {
return this.player && this.player.record().isRecording(); return this.player && this.player.record().isRecording();
}, },
audioRecordFormat() {
if (this.isAWebWidgetInbox) {
return AUDIO_FORMATS.WEBM;
}
return AUDIO_FORMATS.OGG;
},
}, },
mounted() { mounted() {
window.Recorder = Recorder; window.Recorder = Recorder;

View file

@ -21,7 +21,11 @@
/> />
</h3> </h3>
<div class="conversation--header--actions"> <div class="conversation--header--actions">
<inbox-name :inbox="inbox" class="margin-right-small" /> <inbox-name
v-if="hasMultipleInboxes"
:inbox="inbox"
class="margin-right-small"
/>
<span <span
v-if="isSnoozed" v-if="isSnoozed"
class="snoozed--display-text margin-right-small" class="snoozed--display-text margin-right-small"
@ -145,6 +149,9 @@ export default {
const { inbox_id: inboxId } = this.chat; const { inbox_id: inboxId } = this.chat;
return this.$store.getters['inboxes/getInbox'](inboxId); return this.$store.getters['inboxes/getInbox'](inboxId);
}, },
hasMultipleInboxes() {
return this.$store.getters['inboxes/getInboxes'].length > 1;
},
}, },
methods: { methods: {

View file

@ -15,7 +15,6 @@
v-if="data.content" v-if="data.content"
:message="message" :message="message"
:is-email="isEmailContentType" :is-email="isEmailContentType"
:readable-time="readableTime"
:display-quoted-button="displayQuotedButton" :display-quoted-button="displayQuotedButton"
/> />
<span <span
@ -29,7 +28,6 @@
<bubble-image <bubble-image
v-if="attachment.file_type === 'image' && !hasImageError" v-if="attachment.file_type === 'image' && !hasImageError"
:url="attachment.data_url" :url="attachment.data_url"
:readable-time="readableTime"
@error="onImageLoadError" @error="onImageLoadError"
/> />
<audio v-else-if="attachment.file_type === 'audio'" controls> <audio v-else-if="attachment.file_type === 'audio'" controls>
@ -38,7 +36,6 @@
<bubble-video <bubble-video
v-else-if="attachment.file_type === 'video'" v-else-if="attachment.file_type === 'video'"
:url="attachment.data_url" :url="attachment.data_url"
:readable-time="readableTime"
/> />
<bubble-location <bubble-location
v-else-if="attachment.file_type === 'location'" v-else-if="attachment.file_type === 'location'"
@ -46,11 +43,7 @@
:longitude="attachment.coordinates_long" :longitude="attachment.coordinates_long"
:name="attachment.fallback_title" :name="attachment.fallback_title"
/> />
<bubble-file <bubble-file v-else :url="attachment.data_url" />
v-else
:url="attachment.data_url"
:readable-time="readableTime"
/>
</div> </div>
</div> </div>
<bubble-actions <bubble-actions
@ -65,10 +58,9 @@
:is-private="data.private" :is-private="data.private"
:message-type="data.message_type" :message-type="data.message_type"
:message-status="status" :message-status="status"
:readable-time="readableTime"
:source-id="data.source_id" :source-id="data.source_id"
:inbox-id="data.inbox_id" :inbox-id="data.inbox_id"
:message-read="showReadTicks" :created-at="createdAt"
/> />
</div> </div>
<spinner v-if="isPending" size="tiny" /> <spinner v-if="isPending" size="tiny" />
@ -119,8 +111,6 @@
</template> </template>
<script> <script>
import messageFormatterMixin from 'shared/mixins/messageFormatterMixin'; import messageFormatterMixin from 'shared/mixins/messageFormatterMixin';
import timeMixin from '../../../mixins/time';
import BubbleMailHead from './bubble/MailHead'; import BubbleMailHead from './bubble/MailHead';
import BubbleText from './bubble/Text'; import BubbleText from './bubble/Text';
import BubbleImage from './bubble/Image'; import BubbleImage from './bubble/Image';
@ -149,7 +139,7 @@ export default {
ContextMenu, ContextMenu,
Spinner, Spinner,
}, },
mixins: [alertMixin, timeMixin, messageFormatterMixin, contentTypeMixin], mixins: [alertMixin, messageFormatterMixin, contentTypeMixin],
props: { props: {
data: { data: {
type: Object, type: Object,
@ -167,10 +157,6 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
hasUserReadMessage: {
type: Boolean,
default: false,
},
isWebWidgetInbox: { isWebWidgetInbox: {
type: Boolean, type: Boolean,
default: false, default: false,
@ -273,11 +259,8 @@ export default {
'has-tweet-menu': this.isATweet, 'has-tweet-menu': this.isATweet,
}; };
}, },
readableTime() { createdAt() {
return this.messageStamp( return this.contentAttributes.external_created_at || this.data.created_at;
this.contentAttributes.external_created_at || this.data.created_at,
'LLL d, h:mm a'
);
}, },
isBubble() { isBubble() {
return [0, 1, 3].includes(this.data.message_type); return [0, 1, 3].includes(this.data.message_type);
@ -288,14 +271,6 @@ export default {
isOutgoing() { isOutgoing() {
return this.data.message_type === MESSAGE_TYPE.OUTGOING; return this.data.message_type === MESSAGE_TYPE.OUTGOING;
}, },
showReadTicks() {
return (
(this.isOutgoing || this.isTemplate) &&
this.hasUserReadMessage &&
this.isWebWidgetInbox &&
!this.data.private
);
},
isTemplate() { isTemplate() {
return this.data.message_type === MESSAGE_TYPE.TEMPLATE; return this.data.message_type === MESSAGE_TYPE.TEMPLATE;
}, },

View file

@ -40,9 +40,6 @@
:is-a-tweet="isATweet" :is-a-tweet="isATweet"
:is-a-whatsapp-channel="isAWhatsAppChannel" :is-a-whatsapp-channel="isAWhatsAppChannel"
:has-instagram-story="hasInstagramStory" :has-instagram-story="hasInstagramStory"
:has-user-read-message="
hasUserReadMessage(message.created_at, getLastSeenAt)
"
:is-web-widget-inbox="isAWebWidgetInbox" :is-web-widget-inbox="isAWebWidgetInbox"
/> />
<li v-show="unreadMessageCount != 0" class="unread--toast"> <li v-show="unreadMessageCount != 0" class="unread--toast">
@ -63,9 +60,6 @@
:is-a-tweet="isATweet" :is-a-tweet="isATweet"
:is-a-whatsapp-channel="isAWhatsAppChannel" :is-a-whatsapp-channel="isAWhatsAppChannel"
:has-instagram-story="hasInstagramStory" :has-instagram-story="hasInstagramStory"
:has-user-read-message="
hasUserReadMessage(message.created_at, getLastSeenAt)
"
:is-web-widget-inbox="isAWebWidgetInbox" :is-web-widget-inbox="isAWebWidgetInbox"
/> />
</ul> </ul>

View file

@ -37,6 +37,7 @@
<woot-audio-recorder <woot-audio-recorder
v-if="showAudioRecorderEditor" v-if="showAudioRecorderEditor"
ref="audioRecorderInput" ref="audioRecorderInput"
:audio-record-format="audioRecordFormat"
@state-recorder-progress-changed="onStateProgressRecorderChanged" @state-recorder-progress-changed="onStateProgressRecorderChanged"
@state-recorder-changed="onStateRecorderChanged" @state-recorder-changed="onStateRecorderChanged"
@finish-record="onFinishRecorder" @finish-record="onFinishRecorder"
@ -147,6 +148,7 @@ import { checkFileSizeLimit } from 'shared/helpers/FileHelper';
import { import {
MAXIMUM_FILE_UPLOAD_SIZE, MAXIMUM_FILE_UPLOAD_SIZE,
MAXIMUM_FILE_UPLOAD_SIZE_TWILIO_SMS_CHANNEL, MAXIMUM_FILE_UPLOAD_SIZE_TWILIO_SMS_CHANNEL,
AUDIO_FORMATS,
} from 'shared/constants/messages'; } from 'shared/constants/messages';
import { BUS_EVENTS } from 'shared/constants/busEvents'; import { BUS_EVENTS } from 'shared/constants/busEvents';
@ -462,6 +464,12 @@ export default {
editorStateId() { editorStateId() {
return `draft-${this.conversationIdByRoute}-${this.replyType}`; return `draft-${this.conversationIdByRoute}-${this.replyType}`;
}, },
audioRecordFormat() {
if (this.isAWebWidgetInbox) {
return AUDIO_FORMATS.WEBM;
}
return AUDIO_FORMATS.OGG;
},
}, },
watch: { watch: {
currentChat(conversation) { currentChat(conversation) {

View file

@ -1,8 +1,14 @@
<template> <template>
<div class="message-text--metadata"> <div class="message-text--metadata">
<span class="time" :class="{ delivered: messageRead }">{{ <span
readableTime class="time"
}}</span> :class="{
'has-status-icon':
showSentIndicator || showDeliveredIndicator || showReadIndicator,
}"
>
{{ readableTime }}
</span>
<span v-if="showReadIndicator" class="read-indicator-wrap"> <span v-if="showReadIndicator" class="read-indicator-wrap">
<fluent-icon <fluent-icon
v-tooltip.top-start="$t('CHAT_LIST.MESSAGE_READ')" v-tooltip.top-start="$t('CHAT_LIST.MESSAGE_READ')"
@ -11,7 +17,7 @@
size="14" size="14"
/> />
</span> </span>
<span v-if="showDeliveredIndicator" class="read-indicator-wrap"> <span v-else-if="showDeliveredIndicator" class="read-indicator-wrap">
<fluent-icon <fluent-icon
v-tooltip.top-start="$t('CHAT_LIST.DELIVERED')" v-tooltip.top-start="$t('CHAT_LIST.DELIVERED')"
icon="checkmark-double" icon="checkmark-double"
@ -19,7 +25,7 @@
size="14" size="14"
/> />
</span> </span>
<span v-if="showSentIndicator" class="read-indicator-wrap"> <span v-else-if="showSentIndicator" class="read-indicator-wrap">
<fluent-icon <fluent-icon
v-tooltip.top-start="$t('CHAT_LIST.SENT')" v-tooltip.top-start="$t('CHAT_LIST.SENT')"
icon="checkmark" icon="checkmark"
@ -74,17 +80,19 @@
import { MESSAGE_TYPE, MESSAGE_STATUS } from 'shared/constants/messages'; import { MESSAGE_TYPE, MESSAGE_STATUS } from 'shared/constants/messages';
import { BUS_EVENTS } from 'shared/constants/busEvents'; import { BUS_EVENTS } from 'shared/constants/busEvents';
import inboxMixin from 'shared/mixins/inboxMixin'; import inboxMixin from 'shared/mixins/inboxMixin';
import { mapGetters } from 'vuex';
import timeMixin from '../../../../mixins/time';
export default { export default {
mixins: [inboxMixin], mixins: [inboxMixin, timeMixin],
props: { props: {
sender: { sender: {
type: Object, type: Object,
default: () => ({}), default: () => ({}),
}, },
readableTime: { createdAt: {
type: String, type: Number,
default: '', default: 0,
}, },
storySender: { storySender: {
type: String, type: String,
@ -130,12 +138,9 @@ export default {
type: [String, Number], type: [String, Number],
default: 0, default: 0,
}, },
messageRead: {
type: Boolean,
default: false,
},
}, },
computed: { computed: {
...mapGetters({ currentChat: 'getSelectedChat' }),
inbox() { inbox() {
return this.$store.getters['inboxes/getInbox'](this.inboxId); return this.$store.getters['inboxes/getInbox'](this.inboxId);
}, },
@ -145,6 +150,9 @@ export default {
isOutgoing() { isOutgoing() {
return MESSAGE_TYPE.OUTGOING === this.messageType; return MESSAGE_TYPE.OUTGOING === this.messageType;
}, },
isTemplate() {
return MESSAGE_TYPE.TEMPLATE === this.messageType;
},
isDelivered() { isDelivered() {
return MESSAGE_STATUS.DELIVERED === this.messageStatus; return MESSAGE_STATUS.DELIVERED === this.messageStatus;
}, },
@ -154,6 +162,9 @@ export default {
isSent() { isSent() {
return MESSAGE_STATUS.SENT === this.messageStatus; return MESSAGE_STATUS.SENT === this.messageStatus;
}, },
readableTime() {
return this.messageStamp(this.createdAt, 'LLL d, h:mm a');
},
screenName() { screenName() {
const { additional_attributes: additionalAttributes = {} } = const { additional_attributes: additionalAttributes = {} } =
this.sender || {}; this.sender || {};
@ -174,28 +185,52 @@ export default {
const { storySender, storyId } = this; const { storySender, storyId } = this;
return `https://www.instagram.com/stories/${storySender}/${storyId}`; return `https://www.instagram.com/stories/${storySender}/${storyId}`;
}, },
showStatusIndicators() {
if ((this.isOutgoing || this.isTemplate) && !this.private) {
return true;
}
return false;
},
showSentIndicator() { showSentIndicator() {
return ( if (!this.showStatusIndicators) {
this.isOutgoing && return false;
this.sourceId && }
(this.isAnEmailChannel || (this.isAWhatsAppChannel && this.isSent))
); if (this.isAnEmailChannel) {
return !!this.sourceId;
}
if (this.isAWhatsAppChannel) {
return this.sourceId && this.isSent;
}
return false;
}, },
showDeliveredIndicator() { showDeliveredIndicator() {
return ( if (!this.showStatusIndicators) {
this.isOutgoing && return false;
this.sourceId && }
this.isAWhatsAppChannel &&
this.isDelivered if (this.isAWhatsAppChannel) {
); return this.sourceId && this.isDelivered;
}
return false;
}, },
showReadIndicator() { showReadIndicator() {
return ( if (!this.showStatusIndicators) {
this.isOutgoing && return false;
this.sourceId && }
this.isAWhatsAppChannel &&
this.isRead if (this.isAWebWidgetInbox) {
); const { contact_last_seen_at: contactLastSeenAt } = this.currentChat;
return contactLastSeenAt >= this.createdAt;
}
if (this.isAWhatsAppChannel) {
return this.sourceId && this.isRead;
}
return false;
}, },
}, },
methods: { methods: {
@ -218,12 +253,13 @@ export default {
.action--icon { .action--icon {
color: var(--white); color: var(--white);
&.read-tick { &.read-tick {
color: var(--v-100); color: var(--v-100);
} }
&.read-indicator { &.read-indicator {
color: var(--g-300); color: var(--g-200);
} }
} }
@ -288,8 +324,9 @@ export default {
position: absolute; position: absolute;
right: var(--space-small); right: var(--space-small);
white-space: nowrap; white-space: nowrap;
&.delivered {
right: var(--space-medium); &.has-status-icon {
right: var(--space-large);
line-height: 2; line-height: 2;
} }
} }

View file

@ -35,10 +35,6 @@ export default {
type: String, type: String,
default: '', default: '',
}, },
readableTime: {
type: String,
default: '',
},
isEmail: { isEmail: {
type: Boolean, type: Boolean,
default: true, default: true,

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "اختر حساباً من القائمة التالية", "SELECTOR_SUBTITLE": "اختر حساباً من القائمة التالية",
"PROFILE_SETTINGS": "إعدادات الملف الشخصي", "PROFILE_SETTINGS": "إعدادات الملف الشخصي",
"KEYBOARD_SHORTCUTS": "اختصارات لوحة المفاتيح", "KEYBOARD_SHORTCUTS": "اختصارات لوحة المفاتيح",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "تسجيل الخروج" "LOGOUT": "تسجيل الخروج"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Select an account from the following list", "SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings", "PROFILE_SETTINGS": "Profile Settings",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logout" "LOGOUT": "Logout"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Selecciona un compte de la llista següent", "SELECTOR_SUBTITLE": "Selecciona un compte de la llista següent",
"PROFILE_SETTINGS": "Configuració del Perfil", "PROFILE_SETTINGS": "Configuració del Perfil",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Sortir" "LOGOUT": "Sortir"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Vyberte účet z následujícího seznamu", "SELECTOR_SUBTITLE": "Vyberte účet z následujícího seznamu",
"PROFILE_SETTINGS": "Nastavení profilu", "PROFILE_SETTINGS": "Nastavení profilu",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Odhlásit se" "LOGOUT": "Odhlásit se"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Vælg en konto fra følgende liste", "SELECTOR_SUBTITLE": "Vælg en konto fra følgende liste",
"PROFILE_SETTINGS": "Profilindstillinger", "PROFILE_SETTINGS": "Profilindstillinger",
"KEYBOARD_SHORTCUTS": "Tastaturgenveje", "KEYBOARD_SHORTCUTS": "Tastaturgenveje",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Log Ud" "LOGOUT": "Log Ud"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Wählen Sie ein Benutzerkonto aus der folgenden Liste", "SELECTOR_SUBTITLE": "Wählen Sie ein Benutzerkonto aus der folgenden Liste",
"PROFILE_SETTINGS": "Profileinstellungen", "PROFILE_SETTINGS": "Profileinstellungen",
"KEYBOARD_SHORTCUTS": "Tastenkombinationen", "KEYBOARD_SHORTCUTS": "Tastenkombinationen",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Ausloggen" "LOGOUT": "Ausloggen"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Επιλέξτε ένα λογαριασμό από την Λίστα", "SELECTOR_SUBTITLE": "Επιλέξτε ένα λογαριασμό από την Λίστα",
"PROFILE_SETTINGS": "Ρυθμίσεις Προφίλ", "PROFILE_SETTINGS": "Ρυθμίσεις Προφίλ",
"KEYBOARD_SHORTCUTS": "Συντομεύσεις Πληκτρολογίου", "KEYBOARD_SHORTCUTS": "Συντομεύσεις Πληκτρολογίου",
"SUPER_ADMIN_CONSOLE": "Super Admin Κονσόλα",
"LOGOUT": "Έξοδος (Logout)" "LOGOUT": "Έξοδος (Logout)"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Seleccione una cuenta de la siguiente lista", "SELECTOR_SUBTITLE": "Seleccione una cuenta de la siguiente lista",
"PROFILE_SETTINGS": "Ajustes del perfil", "PROFILE_SETTINGS": "Ajustes del perfil",
"KEYBOARD_SHORTCUTS": "Atajos de teclado", "KEYBOARD_SHORTCUTS": "Atajos de teclado",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Cerrar sesión" "LOGOUT": "Cerrar sesión"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "از لیست یکی از حساب‌ها را انتخاب کنید", "SELECTOR_SUBTITLE": "از لیست یکی از حساب‌ها را انتخاب کنید",
"PROFILE_SETTINGS": "تنظیمات پروفایل", "PROFILE_SETTINGS": "تنظیمات پروفایل",
"KEYBOARD_SHORTCUTS": "میانبرهای صفحه‌کلید", "KEYBOARD_SHORTCUTS": "میانبرهای صفحه‌کلید",
"SUPER_ADMIN_CONSOLE": "کنسول سوپر مدیر",
"LOGOUT": "خروج از حساب‌کاربری" "LOGOUT": "خروج از حساب‌کاربری"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Valitse tili tästä luettelosta", "SELECTOR_SUBTITLE": "Valitse tili tästä luettelosta",
"PROFILE_SETTINGS": "Profiilin asetukset", "PROFILE_SETTINGS": "Profiilin asetukset",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Kirjaudu ulos" "LOGOUT": "Kirjaudu ulos"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -1,28 +1,28 @@
{ {
"FILTER": { "FILTER": {
"TITLE": "Filtrer les conversations", "TITLE": "Filtrer les conversations",
"SUBTITLE": "Add filters below and hit 'Apply filters' to filter conversations.", "SUBTITLE": "Ajoutez des filtres ci-dessous et appuyez sur 'Appliquer des filtres' pour filtrer les conversations.",
"ADD_NEW_FILTER": "Ajouter un filtre", "ADD_NEW_FILTER": "Ajouter un filtre",
"FILTER_DELETE_ERROR": "Vous devriez avoir au moins un filtre afin d'enregistrer", "FILTER_DELETE_ERROR": "Vous devriez avoir au moins un filtre afin d'enregistrer",
"SUBMIT_BUTTON_LABEL": "Appliquer les filtres", "SUBMIT_BUTTON_LABEL": "Appliquer les filtres",
"CANCEL_BUTTON_LABEL": "Annuler", "CANCEL_BUTTON_LABEL": "Annuler",
"CLEAR_BUTTON_LABEL": "Clear Filters", "CLEAR_BUTTON_LABEL": "Effacer les filtres",
"EMPTY_VALUE_ERROR": "Value is required", "EMPTY_VALUE_ERROR": "Value is required",
"TOOLTIP_LABEL": "Filter conversations", "TOOLTIP_LABEL": "Filtrer les conversations",
"QUERY_DROPDOWN_LABELS": { "QUERY_DROPDOWN_LABELS": {
"AND": "ET", "AND": "ET",
"OR": "OU" "OR": "OU"
}, },
"OPERATOR_LABELS": { "OPERATOR_LABELS": {
"equal_to": "Equal to", "equal_to": "Égal à",
"not_equal_to": "Not equal to", "not_equal_to": "Pas égal à",
"contains": "Contains", "contains": "Contient",
"does_not_contain": "Does not contain", "does_not_contain": "Ne contient pas",
"is_present": "Is present", "is_present": "Est présent",
"is_not_present": "Is not present", "is_not_present": "N'est pas présent",
"is_greater_than": "Is greater than", "is_greater_than": "Est plus grand que",
"is_less_than": "Is lesser than", "is_less_than": "Est inférieur à",
"days_before": "Is x days before" "days_before": "Est x jours avant"
}, },
"ATTRIBUTE_LABELS": { "ATTRIBUTE_LABELS": {
"TRUE": "Vrai", "TRUE": "Vrai",
@ -32,19 +32,19 @@
"STATUS": "État", "STATUS": "État",
"ASSIGNEE_NAME": "Assignee Name", "ASSIGNEE_NAME": "Assignee Name",
"INBOX_NAME": "Nom de la boîte de réception", "INBOX_NAME": "Nom de la boîte de réception",
"TEAM_NAME": "Team Name", "TEAM_NAME": "Nom de l'équipe",
"CONVERSATION_IDENTIFIER": "Conversation Identifier", "CONVERSATION_IDENTIFIER": "Conversation Identifier",
"CAMPAIGN_NAME": "Campaign Name", "CAMPAIGN_NAME": "Campaign Name",
"LABELS": "Étiquettes", "LABELS": "Étiquettes",
"BROWSER_LANGUAGE": "Browser Language", "BROWSER_LANGUAGE": "Langue du navigateur",
"COUNTRY_NAME": "Country Name", "COUNTRY_NAME": "Nom du pays",
"REFERER_LINK": "Referer link", "REFERER_LINK": "Referer link",
"CUSTOM_ATTRIBUTE_LIST": "List", "CUSTOM_ATTRIBUTE_LIST": "Liste",
"CUSTOM_ATTRIBUTE_TEXT": "Text", "CUSTOM_ATTRIBUTE_TEXT": "Texte",
"CUSTOM_ATTRIBUTE_NUMBER": "Number", "CUSTOM_ATTRIBUTE_NUMBER": "Nombre",
"CUSTOM_ATTRIBUTE_LINK": "Link", "CUSTOM_ATTRIBUTE_LINK": "Lien",
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox", "CUSTOM_ATTRIBUTE_CHECKBOX": "Case à cocher",
"CREATED_AT": "Created At", "CREATED_AT": "Créé le",
"LAST_ACTIVITY": "Dernière activité" "LAST_ACTIVITY": "Dernière activité"
}, },
"GROUPS": { "GROUPS": {
@ -70,7 +70,7 @@
} }
}, },
"DELETE": { "DELETE": {
"DELETE_BUTTON": "Delete filter", "DELETE_BUTTON": "Supprimer le filtre",
"MODAL": { "MODAL": {
"CONFIRM": { "CONFIRM": {
"TITLE": "Confirmer la suppression", "TITLE": "Confirmer la suppression",

View file

@ -8,7 +8,7 @@
}, },
"TAB_HEADING": "Conversations", "TAB_HEADING": "Conversations",
"MENTION_HEADING": "Mentions", "MENTION_HEADING": "Mentions",
"UNATTENDED_HEADING": "Unattended", "UNATTENDED_HEADING": "Sans suivi",
"SEARCH": { "SEARCH": {
"INPUT": "Rechercher des personnes, des conversations, des réponses standardisées ..." "INPUT": "Rechercher des personnes, des conversations, des réponses standardisées ..."
}, },
@ -57,12 +57,12 @@
"REPLY_TO_TWEET": "Répondre à ce tweet", "REPLY_TO_TWEET": "Répondre à ce tweet",
"LINK_TO_STORY": "Aller à l'histoire instagram", "LINK_TO_STORY": "Aller à l'histoire instagram",
"SENT": "Envoyé avec succès", "SENT": "Envoyé avec succès",
"READ": "Read successfully", "READ": "Lu",
"DELIVERED": "Delivered successfully", "DELIVERED": "Reçu",
"NO_MESSAGES": "Pas de messages", "NO_MESSAGES": "Pas de messages",
"NO_CONTENT": "Aucun contenu disponible", "NO_CONTENT": "Aucun contenu disponible",
"HIDE_QUOTED_TEXT": "Masquer le texte cité", "HIDE_QUOTED_TEXT": "Masquer le texte cité",
"SHOW_QUOTED_TEXT": "Afficher le texte cité", "SHOW_QUOTED_TEXT": "Afficher le texte cité",
"MESSAGE_READ": "Read" "MESSAGE_READ": "Lu"
} }
} }

View file

@ -7,7 +7,7 @@
"COPY_SUCCESSFUL": "Copié dans le presse-papiers avec succès", "COPY_SUCCESSFUL": "Copié dans le presse-papiers avec succès",
"COMPANY": "Société", "COMPANY": "Société",
"LOCATION": "Localisation", "LOCATION": "Localisation",
"BROWSER_LANGUAGE": "Browser Language", "BROWSER_LANGUAGE": "Langue du navigateur",
"CONVERSATION_TITLE": "Détails de la conversation", "CONVERSATION_TITLE": "Détails de la conversation",
"VIEW_PROFILE": "Voir le profil", "VIEW_PROFILE": "Voir le profil",
"BROWSER": "Navigateur", "BROWSER": "Navigateur",

View file

@ -7,7 +7,7 @@
"FILTER_DELETE_ERROR": "Vous devriez avoir au moins un filtre afin d'enregistrer", "FILTER_DELETE_ERROR": "Vous devriez avoir au moins un filtre afin d'enregistrer",
"SUBMIT_BUTTON_LABEL": "Envoyer", "SUBMIT_BUTTON_LABEL": "Envoyer",
"CANCEL_BUTTON_LABEL": "Annuler", "CANCEL_BUTTON_LABEL": "Annuler",
"CLEAR_BUTTON_LABEL": "Clear Filters", "CLEAR_BUTTON_LABEL": "Effacer les filtres",
"EMPTY_VALUE_ERROR": "Value is required", "EMPTY_VALUE_ERROR": "Value is required",
"TOOLTIP_LABEL": "Filter contacts", "TOOLTIP_LABEL": "Filter contacts",
"QUERY_DROPDOWN_LABELS": { "QUERY_DROPDOWN_LABELS": {
@ -15,15 +15,15 @@
"OR": "OU" "OR": "OU"
}, },
"OPERATOR_LABELS": { "OPERATOR_LABELS": {
"equal_to": "Equal to", "equal_to": "Égal à",
"not_equal_to": "Not equal to", "not_equal_to": "Pas égal à",
"contains": "Contains", "contains": "Contient",
"does_not_contain": "Does not contain", "does_not_contain": "Ne contient pas",
"is_present": "Is present", "is_present": "Est présent",
"is_not_present": "Is not present", "is_not_present": "N'est pas présent",
"is_greater_than": "Is greater than", "is_greater_than": "Est plus grand que",
"is_lesser_than": "Is lesser than", "is_lesser_than": "Is lesser than",
"days_before": "Is x days before" "days_before": "Est x jours avant"
}, },
"ATTRIBUTES": { "ATTRIBUTES": {
"NAME": "Nom", "NAME": "Nom",
@ -32,12 +32,12 @@
"IDENTIFIER": "Identifier", "IDENTIFIER": "Identifier",
"CITY": "Ville", "CITY": "Ville",
"COUNTRY": "Pays", "COUNTRY": "Pays",
"CUSTOM_ATTRIBUTE_LIST": "List", "CUSTOM_ATTRIBUTE_LIST": "Liste",
"CUSTOM_ATTRIBUTE_TEXT": "Text", "CUSTOM_ATTRIBUTE_TEXT": "Texte",
"CUSTOM_ATTRIBUTE_NUMBER": "Number", "CUSTOM_ATTRIBUTE_NUMBER": "Nombre",
"CUSTOM_ATTRIBUTE_LINK": "Link", "CUSTOM_ATTRIBUTE_LINK": "Lien",
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox", "CUSTOM_ATTRIBUTE_CHECKBOX": "Case à cocher",
"CREATED_AT": "Created At", "CREATED_AT": "Créé le",
"LAST_ACTIVITY": "Dernière activité", "LAST_ACTIVITY": "Dernière activité",
"REFERER_LINK": "Referrer link" "REFERER_LINK": "Referrer link"
}, },

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Sélectionnez un compte dans la liste suivante", "SELECTOR_SUBTITLE": "Sélectionnez un compte dans la liste suivante",
"PROFILE_SETTINGS": "Paramètres de profil", "PROFILE_SETTINGS": "Paramètres de profil",
"KEYBOARD_SHORTCUTS": "Raccourcis clavier", "KEYBOARD_SHORTCUTS": "Raccourcis clavier",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Se déconnecter" "LOGOUT": "Se déconnecter"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -2,13 +2,13 @@
"REGISTER": { "REGISTER": {
"TRY_WOOT": "Créer un compte", "TRY_WOOT": "Créer un compte",
"TITLE": "Inscription", "TITLE": "Inscription",
"TESTIMONIAL_HEADER": "All it takes is one step to move forward", "TESTIMONIAL_HEADER": "Il suffit d'une étape pour avancer",
"TESTIMONIAL_CONTENT": "You're one step away from engaging your customers, retaining them and finding new ones.", "TESTIMONIAL_CONTENT": "Vous n'êtes plus qu'à un pas d'engager vos clients, de les fidéliser et d'en trouver de nouveaux.",
"TERMS_ACCEPT": "En vous inscrivant, vous acceptez nos <a href=\"https://www.chatwoot.com/terms\">CGU</a> et notre <a href=\"https://www.chatwoot.com/privacy-policy\">politique de confidentialité</a>", "TERMS_ACCEPT": "En vous inscrivant, vous acceptez nos <a href=\"https://www.chatwoot.com/terms\">CGU</a> et notre <a href=\"https://www.chatwoot.com/privacy-policy\">politique de confidentialité</a>",
"COMPANY_NAME": { "COMPANY_NAME": {
"LABEL": "Company name", "LABEL": "Nom de la société",
"PLACEHOLDER": "Enter your company name. eg: Wayne Enterprises", "PLACEHOLDER": "Entrez le nom de votre entreprise. Ex : Wayne Enterprises",
"ERROR": "Company name is too short" "ERROR": "Le nom de la société est trop court"
}, },
"FULL_NAME": { "FULL_NAME": {
"LABEL": "Nom complet", "LABEL": "Nom complet",
@ -18,13 +18,13 @@
"EMAIL": { "EMAIL": {
"LABEL": "E-mail professionnel", "LABEL": "E-mail professionnel",
"PLACEHOLDER": "Entrez votre adresse e-mail professionnelle. Ex. : bruce@wayne.enterprises", "PLACEHOLDER": "Entrez votre adresse e-mail professionnelle. Ex. : bruce@wayne.enterprises",
"ERROR": "Please enter a valid work email address" "ERROR": "Veuillez entrer une adresse e-mail professionnelle valide"
}, },
"PASSWORD": { "PASSWORD": {
"LABEL": "Mot de passe", "LABEL": "Mot de passe",
"PLACEHOLDER": "Mot de passe", "PLACEHOLDER": "Mot de passe",
"ERROR": "Le mot de passe est trop court", "ERROR": "Le mot de passe est trop court",
"IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character" "IS_INVALID_PASSWORD": "Le mot de passe doit contenir au moins 1 lettre majuscule, 1 lettre minuscule, 1 chiffre et 1 caractère spécial"
}, },
"CONFIRM_PASSWORD": { "CONFIRM_PASSWORD": {
"LABEL": "Confirmer le mot de passe", "LABEL": "Confirmer le mot de passe",

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Select an account from the following list", "SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings", "PROFILE_SETTINGS": "Profile Settings",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "התנתק" "LOGOUT": "התנתק"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Select an account from the following list", "SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings", "PROFILE_SETTINGS": "Profile Settings",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logout" "LOGOUT": "Logout"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Fiók kiválasztása az alábbi listából", "SELECTOR_SUBTITLE": "Fiók kiválasztása az alábbi listából",
"PROFILE_SETTINGS": "Profilbeállítások", "PROFILE_SETTINGS": "Profilbeállítások",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Kilépés" "LOGOUT": "Kilépés"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Pilih akun dari daftar berikut", "SELECTOR_SUBTITLE": "Pilih akun dari daftar berikut",
"PROFILE_SETTINGS": "Pengaturan Profil", "PROFILE_SETTINGS": "Pengaturan Profil",
"KEYBOARD_SHORTCUTS": "Shortcut Keyboard", "KEYBOARD_SHORTCUTS": "Shortcut Keyboard",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Keluar" "LOGOUT": "Keluar"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Veldu reikning úr eftirfarandi lista", "SELECTOR_SUBTITLE": "Veldu reikning úr eftirfarandi lista",
"PROFILE_SETTINGS": "Profile Settings", "PROFILE_SETTINGS": "Profile Settings",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logout" "LOGOUT": "Logout"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Seleziona un account dal seguente elenco", "SELECTOR_SUBTITLE": "Seleziona un account dal seguente elenco",
"PROFILE_SETTINGS": "Impostazioni profilo", "PROFILE_SETTINGS": "Impostazioni profilo",
"KEYBOARD_SHORTCUTS": "Scorciatoie da tastiera", "KEYBOARD_SHORTCUTS": "Scorciatoie da tastiera",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Disconnettiti" "LOGOUT": "Disconnettiti"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "次のリストからアカウントを選択してください", "SELECTOR_SUBTITLE": "次のリストからアカウントを選択してください",
"PROFILE_SETTINGS": "プロフィール設定", "PROFILE_SETTINGS": "プロフィール設定",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "ログアウト" "LOGOUT": "ログアウト"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Select an account from the following list", "SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings", "PROFILE_SETTINGS": "Profile Settings",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logout" "LOGOUT": "Logout"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "다음 목록에서 계정 선택", "SELECTOR_SUBTITLE": "다음 목록에서 계정 선택",
"PROFILE_SETTINGS": "프로필 설정", "PROFILE_SETTINGS": "프로필 설정",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "로그아웃" "LOGOUT": "로그아웃"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Select an account from the following list", "SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings", "PROFILE_SETTINGS": "Profile Settings",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logout" "LOGOUT": "Logout"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -42,8 +42,8 @@
"RATING_TITLE": "Vērtējums", "RATING_TITLE": "Vērtējums",
"FEEDBACK_TITLE": "Atsauksmes", "FEEDBACK_TITLE": "Atsauksmes",
"CARD": { "CARD": {
"SHOW_LABELS": "Show labels", "SHOW_LABELS": "Rādīt etiķetes",
"HIDE_LABELS": "Hide labels" "HIDE_LABELS": "Slēpt etiķetes"
}, },
"HEADER": { "HEADER": {
"RESOLVE_ACTION": "Atrisināt", "RESOLVE_ACTION": "Atrisināt",

View file

@ -104,8 +104,8 @@
"Aizņemts", "Aizņemts",
"Bezsaistē" "Bezsaistē"
], ],
"SET_AVAILABILITY_SUCCESS": "Availability has been set successfully", "SET_AVAILABILITY_SUCCESS": "Pieejamība ir veiksmīgi iestatīta",
"SET_AVAILABILITY_ERROR": "Couldn't set availability, please try again" "SET_AVAILABILITY_ERROR": "Nevarēja iestatīt pieejamību. Lūdzu, mēģiniet vēlreiz"
}, },
"EMAIL": { "EMAIL": {
"LABEL": "Jūsu e-pasta adrese", "LABEL": "Jūsu e-pasta adrese",
@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Izvēlieties kontu no šī saraksta", "SELECTOR_SUBTITLE": "Izvēlieties kontu no šī saraksta",
"PROFILE_SETTINGS": "Profila Iestatījumi", "PROFILE_SETTINGS": "Profila Iestatījumi",
"KEYBOARD_SHORTCUTS": "Tastatūras Īsinājumtaustiņi", "KEYBOARD_SHORTCUTS": "Tastatūras Īsinājumtaustiņi",
"SUPER_ADMIN_CONSOLE": "Superadministratora Konsole",
"LOGOUT": "Izrakstīties" "LOGOUT": "Izrakstīties"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {
@ -229,8 +230,8 @@
"CATEGORY_EMPTY_MESSAGE": "Kategorijas nav atrastas" "CATEGORY_EMPTY_MESSAGE": "Kategorijas nav atrastas"
}, },
"SET_AUTO_OFFLINE": { "SET_AUTO_OFFLINE": {
"TEXT": "Mark offline automatically", "TEXT": "Automātiski atzīmēt bezsaistē",
"INFO_TEXT": "Let the system automatically mark you offline when you aren't using the app or dashboard." "INFO_TEXT": "Ļaut sistēmai, kad neizmantojat lietotni vai informācijas paneli, automātiski atzīmēt Jūs bezsaistē."
}, },
"DOCS": "Lasīt dokumentus" "DOCS": "Lasīt dokumentus"
}, },

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "ഇനിപ്പറയുന്ന ലിസ്റ്റിൽ നിന്ന് ഒരു അക്കൗണ്ട് തിരഞ്ഞെടുക്കുക", "SELECTOR_SUBTITLE": "ഇനിപ്പറയുന്ന ലിസ്റ്റിൽ നിന്ന് ഒരു അക്കൗണ്ട് തിരഞ്ഞെടുക്കുക",
"PROFILE_SETTINGS": "പ്രൊഫൈൽ ക്രമീകരണങ്ങൾ", "PROFILE_SETTINGS": "പ്രൊഫൈൽ ക്രമീകരണങ്ങൾ",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "ലോഗൗട്ട്" "LOGOUT": "ലോഗൗട്ട്"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Select an account from the following list", "SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings", "PROFILE_SETTINGS": "Profile Settings",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logout" "LOGOUT": "Logout"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Select an account from the following list", "SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings", "PROFILE_SETTINGS": "Profile Settings",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logout" "LOGOUT": "Logout"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Select an account from the following list", "SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profiel instellingen", "PROFILE_SETTINGS": "Profiel instellingen",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Afmelden" "LOGOUT": "Afmelden"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Velg en konto fra følgende liste", "SELECTOR_SUBTITLE": "Velg en konto fra følgende liste",
"PROFILE_SETTINGS": "Brukerinnstillinger", "PROFILE_SETTINGS": "Brukerinnstillinger",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logg ut" "LOGOUT": "Logg ut"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Select an account from the following list", "SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Ustawienia profilu", "PROFILE_SETTINGS": "Ustawienia profilu",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Wyloguj się" "LOGOUT": "Wyloguj się"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Escolha uma conta da lista a seguir", "SELECTOR_SUBTITLE": "Escolha uma conta da lista a seguir",
"PROFILE_SETTINGS": "Configurações do perfil", "PROFILE_SETTINGS": "Configurações do perfil",
"KEYBOARD_SHORTCUTS": "Atalhos do teclado", "KEYBOARD_SHORTCUTS": "Atalhos do teclado",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Desconectar" "LOGOUT": "Desconectar"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Selecione uma conta da lista a seguir", "SELECTOR_SUBTITLE": "Selecione uma conta da lista a seguir",
"PROFILE_SETTINGS": "Configurações do Perfil", "PROFILE_SETTINGS": "Configurações do Perfil",
"KEYBOARD_SHORTCUTS": "Atalhos do teclado", "KEYBOARD_SHORTCUTS": "Atalhos do teclado",
"SUPER_ADMIN_CONSOLE": "Console de Super Admin",
"LOGOUT": "Sair" "LOGOUT": "Sair"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Selectaţi un cont din următoarea listă", "SELECTOR_SUBTITLE": "Selectaţi un cont din următoarea listă",
"PROFILE_SETTINGS": "Setări profil", "PROFILE_SETTINGS": "Setări profil",
"KEYBOARD_SHORTCUTS": "Scurtături Tastatură", "KEYBOARD_SHORTCUTS": "Scurtături Tastatură",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Deconectare" "LOGOUT": "Deconectare"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Выберите аккаунт из списка", "SELECTOR_SUBTITLE": "Выберите аккаунт из списка",
"PROFILE_SETTINGS": "Настройки профиля", "PROFILE_SETTINGS": "Настройки профиля",
"KEYBOARD_SHORTCUTS": "Клавиши быстрого доступа", "KEYBOARD_SHORTCUTS": "Клавиши быстрого доступа",
"SUPER_ADMIN_CONSOLE": "Консоль супер администратора",
"LOGOUT": "Выйти" "LOGOUT": "Выйти"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Vyberte účet z nasledujúceho zoznamu", "SELECTOR_SUBTITLE": "Vyberte účet z nasledujúceho zoznamu",
"PROFILE_SETTINGS": "Nastavenia profilu", "PROFILE_SETTINGS": "Nastavenia profilu",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logout" "LOGOUT": "Logout"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Izaberite nalog iz sledećeg spiska", "SELECTOR_SUBTITLE": "Izaberite nalog iz sledećeg spiska",
"PROFILE_SETTINGS": "Podešavanja profila", "PROFILE_SETTINGS": "Podešavanja profila",
"KEYBOARD_SHORTCUTS": "Prečice tastature", "KEYBOARD_SHORTCUTS": "Prečice tastature",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Odjavi se" "LOGOUT": "Odjavi se"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Välj ett konto från följande lista", "SELECTOR_SUBTITLE": "Välj ett konto från följande lista",
"PROFILE_SETTINGS": "Profilinställningar", "PROFILE_SETTINGS": "Profilinställningar",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logga ut" "LOGOUT": "Logga ut"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "பின்வரும் பட்டியலிலிருந்து ஒரு கணக்கைத் தேர்ந்தெடுக்கவும்", "SELECTOR_SUBTITLE": "பின்வரும் பட்டியலிலிருந்து ஒரு கணக்கைத் தேர்ந்தெடுக்கவும்",
"PROFILE_SETTINGS": "சுயவிவர அமைப்புகள்", "PROFILE_SETTINGS": "சுயவிவர அமைப்புகள்",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "வெளியேறு" "LOGOUT": "வெளியேறு"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "เลือกบัญชีจากรายชื่อต่อไปนี้", "SELECTOR_SUBTITLE": "เลือกบัญชีจากรายชื่อต่อไปนี้",
"PROFILE_SETTINGS": "ตั้งค่าข้อมูลส่วนตัว", "PROFILE_SETTINGS": "ตั้งค่าข้อมูลส่วนตัว",
"KEYBOARD_SHORTCUTS": "คีย์ลัด", "KEYBOARD_SHORTCUTS": "คีย์ลัด",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "ออกจากระบบ" "LOGOUT": "ออกจากระบบ"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Aşağıdaki listeden bir hesap seçin", "SELECTOR_SUBTITLE": "Aşağıdaki listeden bir hesap seçin",
"PROFILE_SETTINGS": "Profil ayarları", "PROFILE_SETTINGS": "Profil ayarları",
"KEYBOARD_SHORTCUTS": "Klavye Kısayolları", "KEYBOARD_SHORTCUTS": "Klavye Kısayolları",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": ıkış Yap" "LOGOUT": ıkış Yap"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Виберіть обліковий запис із наступного списку", "SELECTOR_SUBTITLE": "Виберіть обліковий запис із наступного списку",
"PROFILE_SETTINGS": "Налаштування облікового запису", "PROFILE_SETTINGS": "Налаштування облікового запису",
"KEYBOARD_SHORTCUTS": "Комбінації клавіш", "KEYBOARD_SHORTCUTS": "Комбінації клавіш",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Вийти" "LOGOUT": "Вийти"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Select an account from the following list", "SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings", "PROFILE_SETTINGS": "Profile Settings",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logout" "LOGOUT": "Logout"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Select an account from the following list", "SELECTOR_SUBTITLE": "Select an account from the following list",
"PROFILE_SETTINGS": "Profile Settings", "PROFILE_SETTINGS": "Profile Settings",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Logout" "LOGOUT": "Logout"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "Chọn một tài khoản từ danh sách sau", "SELECTOR_SUBTITLE": "Chọn một tài khoản từ danh sách sau",
"PROFILE_SETTINGS": "Cài Đặt Hồ Sơ Cá Nhân", "PROFILE_SETTINGS": "Cài Đặt Hồ Sơ Cá Nhân",
"KEYBOARD_SHORTCUTS": "Phím tắt", "KEYBOARD_SHORTCUTS": "Phím tắt",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "Đăng xuất" "LOGOUT": "Đăng xuất"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "从以下列表中选择一个账户", "SELECTOR_SUBTITLE": "从以下列表中选择一个账户",
"PROFILE_SETTINGS": "个人资料设置", "PROFILE_SETTINGS": "个人资料设置",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "退出登录" "LOGOUT": "退出登录"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -136,6 +136,7 @@
"SELECTOR_SUBTITLE": "從以下列表中選擇一個帳戶", "SELECTOR_SUBTITLE": "從以下列表中選擇一個帳戶",
"PROFILE_SETTINGS": "個人資料設定", "PROFILE_SETTINGS": "個人資料設定",
"KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts",
"SUPER_ADMIN_CONSOLE": "Super Admin Console",
"LOGOUT": "退出登入" "LOGOUT": "退出登入"
}, },
"APP_GLOBAL": { "APP_GLOBAL": {

View file

@ -34,9 +34,6 @@ export default {
lastNonActivityMessageFromAPI lastNonActivityMessageFromAPI
); );
}, },
hasUserReadMessage(createdAt, contactLastSeen) {
return !(contactLastSeen - createdAt < 0);
},
readMessages(m) { readMessages(m) {
return m.messages.filter( return m.messages.filter(
chat => chat.created_at * 1000 <= m.agent_last_seen_at * 1000 chat => chat.created_at * 1000 <= m.agent_last_seen_at * 1000

View file

@ -2,14 +2,14 @@
<div class="row app-wrapper"> <div class="row app-wrapper">
<sidebar <sidebar
:route="currentRoute" :route="currentRoute"
:sidebar-class-name="sidebarClassName" :show-secondary-sidebar="isSidebarOpen"
@open-notification-panel="openNotificationPanel" @open-notification-panel="openNotificationPanel"
@toggle-account-modal="toggleAccountModal" @toggle-account-modal="toggleAccountModal"
@open-key-shortcut-modal="toggleKeyShortcutModal" @open-key-shortcut-modal="toggleKeyShortcutModal"
@close-key-shortcut-modal="closeKeyShortcutModal" @close-key-shortcut-modal="closeKeyShortcutModal"
@show-add-label-popup="showAddLabelPopup" @show-add-label-popup="showAddLabelPopup"
/> />
<section class="app-content columns" :class="contentClassName"> <section class="app-content columns">
<router-view /> <router-view />
<command-bar /> <command-bar />
<account-selector <account-selector
@ -46,6 +46,7 @@ import AddAccountModal from 'dashboard/components/layout/sidebarComponents/AddAc
import AccountSelector from 'dashboard/components/layout/sidebarComponents/AccountSelector'; import AccountSelector from 'dashboard/components/layout/sidebarComponents/AccountSelector';
import AddLabelModal from 'dashboard/routes/dashboard/settings/labels/AddLabel'; import AddLabelModal from 'dashboard/routes/dashboard/settings/labels/AddLabel';
import NotificationPanel from 'dashboard/routes/dashboard/notifications/components/NotificationPanel'; import NotificationPanel from 'dashboard/routes/dashboard/notifications/components/NotificationPanel';
import uiSettingsMixin from 'dashboard/mixins/uiSettings';
export default { export default {
components: { components: {
@ -57,9 +58,9 @@ export default {
AddLabelModal, AddLabelModal,
NotificationPanel, NotificationPanel,
}, },
mixins: [uiSettingsMixin],
data() { data() {
return { return {
isSidebarOpen: false,
isOnDesktop: true, isOnDesktop: true,
showAccountModal: false, showAccountModal: false,
showCreateAccountModal: false, showCreateAccountModal: false,
@ -72,44 +73,22 @@ export default {
currentRoute() { currentRoute() {
return ' '; return ' ';
}, },
sidebarClassName() { isSidebarOpen() {
if (this.isOnDesktop) { const { show_secondary_sidebar: showSecondarySidebar } = this.uiSettings;
return ''; return showSecondarySidebar;
}
if (this.isSidebarOpen) {
return 'off-canvas is-open';
}
return 'off-canvas is-transition-push is-closed';
},
contentClassName() {
if (this.isOnDesktop) {
return '';
}
if (this.isSidebarOpen) {
return 'off-canvas-content is-open-left has-transition-push';
}
return 'off-canvas-content has-transition-push';
}, },
}, },
mounted() { mounted() {
window.addEventListener('resize', this.handleResize);
this.handleResize();
bus.$on(BUS_EVENTS.TOGGLE_SIDEMENU, this.toggleSidebar); bus.$on(BUS_EVENTS.TOGGLE_SIDEMENU, this.toggleSidebar);
}, },
beforeDestroy() { beforeDestroy() {
bus.$off(BUS_EVENTS.TOGGLE_SIDEMENU, this.toggleSidebar); bus.$off(BUS_EVENTS.TOGGLE_SIDEMENU, this.toggleSidebar);
window.removeEventListener('resize', this.handleResize);
}, },
methods: { methods: {
handleResize() {
if (window.innerWidth >= 1200) {
this.isOnDesktop = true;
} else {
this.isOnDesktop = false;
}
},
toggleSidebar() { toggleSidebar() {
this.isSidebarOpen = !this.isSidebarOpen; this.updateUISettings({
show_secondary_sidebar: !this.isSidebarOpen,
});
}, },
openCreateAccountModal() { openCreateAccountModal() {
this.showAccountModal = false; this.showAccountModal = false;
@ -142,8 +121,3 @@ export default {
}, },
}; };
</script> </script>
<style lang="scss" scoped>
.off-canvas-content.is-open-left {
transform: translateX(20rem);
}
</style>

View file

@ -66,7 +66,7 @@
@click="replaceTextWithCannedResponse" @click="replaceTextWithCannedResponse"
/> />
</div> </div>
<div v-if="isAnEmailInbox || isAnWebWidgetInbox"> <div v-if="isEmailOrWebWidgetInbox">
<label> <label>
{{ $t('NEW_CONVERSATION.FORM.MESSAGE.LABEL') }} {{ $t('NEW_CONVERSATION.FORM.MESSAGE.LABEL') }}
<reply-email-head <reply-email-head
@ -80,6 +80,7 @@
class="message-editor" class="message-editor"
:class="{ editor_warning: $v.message.$error }" :class="{ editor_warning: $v.message.$error }"
:placeholder="$t('NEW_CONVERSATION.FORM.MESSAGE.PLACEHOLDER')" :placeholder="$t('NEW_CONVERSATION.FORM.MESSAGE.PLACEHOLDER')"
@toggle-canned-menu="toggleCannedMenu"
@blur="$v.message.$touch" @blur="$v.message.$touch"
/> />
<span v-if="$v.message.$error" class="editor-warning__message"> <span v-if="$v.message.$error" class="editor-warning__message">
@ -229,13 +230,16 @@ export default {
this.selectedInbox.inbox.channel_type === INBOX_TYPES.WEB this.selectedInbox.inbox.channel_type === INBOX_TYPES.WEB
); );
}, },
isEmailOrWebWidgetInbox() {
return this.isAnEmailInbox || this.isAnWebWidgetInbox;
},
hasWhatsappTemplates() { hasWhatsappTemplates() {
return !!this.selectedInbox.inbox?.message_templates; return !!this.selectedInbox.inbox?.message_templates;
}, },
}, },
watch: { watch: {
message(value) { message(value) {
this.hasSlashCommand = value[0] === '/'; this.hasSlashCommand = value[0] === '/' && !this.isEmailOrWebWidgetInbox;
const hasNextWord = value.includes(' '); const hasNextWord = value.includes(' ');
const isShortCodeActive = this.hasSlashCommand && !hasNextWord; const isShortCodeActive = this.hasSlashCommand && !hasNextWord;
if (isShortCodeActive) { if (isShortCodeActive) {
@ -259,6 +263,9 @@ export default {
this.message = message; this.message = message;
}, 50); }, 50);
}, },
toggleCannedMenu(value) {
this.showCannedMenu = value;
},
prepareWhatsAppMessagePayload({ message: content, templateParams }) { prepareWhatsAppMessagePayload({ message: content, templateParams }) {
const payload = { const payload = {
inboxId: this.targetInbox.inbox.id, inboxId: this.targetInbox.inbox.id,
@ -315,12 +322,10 @@ export default {
} }
.canned-response { .canned-response {
position: relative;
top: var(--space-medium);
::v-deep .mention--box { ::v-deep .mention--box {
border-left: 1px solid var(--color-border); border-left: 1px solid var(--color-border);
border-right: 1px solid var(--color-border); border-right: 1px solid var(--color-border);
top: var(--space-jumbo) !important;
} }
} }
@ -355,4 +360,14 @@ export default {
.row.gutter-small { .row.gutter-small {
gap: var(--space-small); gap: var(--space-small);
} }
::v-deep .mention--box {
border-left: 1px solid var(--color-border);
border-right: 1px solid var(--color-border);
left: 0;
margin: auto;
right: 0;
top: 18rem !important;
width: 90%;
}
</style> </style>

View file

@ -1,7 +1,8 @@
<template> <template>
<div v-on-clickaway="closeSearch" class="search-wrap"> <div v-on-clickaway="closeSearch" class="search-wrap">
<div class="search-header--wrap">
<woot-sidemenu-icon v-if="!showSearchBox" />
<div class="search" :class="{ 'is-active': showSearchBox }"> <div class="search" :class="{ 'is-active': showSearchBox }">
<woot-sidemenu-icon />
<div class="icon"> <div class="icon">
<fluent-icon icon="search" class="search--icon" size="28" /> <fluent-icon icon="search" class="search--icon" size="28" />
</div> </div>
@ -16,6 +17,7 @@
@toggle="$emit('toggle-conversation-layout')" @toggle="$emit('toggle-conversation-layout')"
/> />
</div> </div>
</div>
<div v-if="showSearchBox" class="results-wrap"> <div v-if="showSearchBox" class="results-wrap">
<div class="show-results"> <div class="show-results">
<div> <div>
@ -153,14 +155,21 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.search-wrap { .search-wrap {
position: relative; position: relative;
padding: var(--space-one) var(--space-normal) var(--space-smaller)
var(--space-normal);
}
.search-header--wrap {
display: flex;
justify-content: space-between;
min-height: var(--space-large);
} }
.search { .search {
display: flex; display: flex;
flex: 1;
padding: 0; padding: 0;
border-bottom: 1px solid transparent; border-bottom: 1px solid transparent;
padding: var(--space-one) var(--space-normal) var(--space-smaller)
var(--space-normal);
&:hover { &:hover {
.search--icon { .search--icon {
@ -205,6 +214,7 @@ input::placeholder {
width: 100%; width: 100%;
max-height: 70vh; max-height: 70vh;
overflow: auto; overflow: auto;
left: 0;
} }
.show-results { .show-results {

View file

@ -8,8 +8,7 @@
@close-key-shortcut-modal="closeKeyShortcutModal" @close-key-shortcut-modal="closeKeyShortcutModal"
/> />
<help-center-sidebar <help-center-sidebar
v-if="portals.length" v-if="showHelpCenterSidebar"
:class="sidebarClassName"
:header-title="headerTitle" :header-title="headerTitle"
:portal-slug="selectedPortalSlug" :portal-slug="selectedPortalSlug"
:locale-slug="selectedLocaleInPortal" :locale-slug="selectedLocaleInPortal"
@ -19,7 +18,7 @@
@open-popover="openPortalPopover" @open-popover="openPortalPopover"
@open-modal="onClickOpenAddCategoryModal" @open-modal="onClickOpenAddCategoryModal"
/> />
<section class="app-content columns" :class="contentClassName"> <section class="app-content columns">
<router-view /> <router-view />
<command-bar /> <command-bar />
<account-selector <account-selector
@ -84,7 +83,6 @@ export default {
mixins: [portalMixin, uiSettingsMixin], mixins: [portalMixin, uiSettingsMixin],
data() { data() {
return { return {
isSidebarOpen: false,
isOnDesktop: true, isOnDesktop: true,
showShortcutModal: false, showShortcutModal: false,
showNotificationPanel: false, showNotificationPanel: false,
@ -103,6 +101,15 @@ export default {
meta: 'portals/getMeta', meta: 'portals/getMeta',
isFetching: 'portals/isFetchingPortals', isFetching: 'portals/isFetchingPortals',
}), }),
isSidebarOpen() {
const {
show_help_center_secondary_sidebar: showSecondarySidebar,
} = this.uiSettings;
return showSecondarySidebar;
},
showHelpCenterSidebar() {
return this.portals.length === 0 ? false : this.isSidebarOpen;
},
selectedPortal() { selectedPortal() {
const slug = this.$route.params.portalSlug || this.lastActivePortalSlug; const slug = this.$route.params.portalSlug || this.lastActivePortalSlug;
if (slug) return this.$store.getters['portals/portalBySlug'](slug); if (slug) return this.$store.getters['portals/portalBySlug'](slug);
@ -112,24 +119,6 @@ export default {
selectedLocaleInPortal() { selectedLocaleInPortal() {
return this.$route.params.locale || this.defaultPortalLocale; return this.$route.params.locale || this.defaultPortalLocale;
}, },
sidebarClassName() {
if (this.isOnDesktop) {
return '';
}
if (this.isSidebarOpen) {
return 'off-canvas is-open';
}
return 'off-canvas is-transition-push is-closed';
},
contentClassName() {
if (this.isOnDesktop) {
return '';
}
if (this.isSidebarOpen) {
return 'off-canvas-content is-open-left has-transition-push';
}
return 'off-canvas-content has-transition-push';
},
selectedPortalName() { selectedPortalName() {
return this.selectedPortal ? this.selectedPortal.name : ''; return this.selectedPortal ? this.selectedPortal.name : '';
}, },
@ -227,9 +216,27 @@ export default {
}, },
}, },
watch: {
'$route.name'() {
const routeName = this.$route?.name;
const routeParams = this.$route?.params;
const updateMetaInAllPortals = routeName === 'list_all_portals';
const updateMetaInEditArticle =
routeName === 'edit_article' && routeParams?.recentlyCreated;
const updateMetaInLocaleArticles =
routeName === 'list_all_locale_articles' &&
routeParams?.recentlyDeleted;
if (
updateMetaInAllPortals ||
updateMetaInEditArticle ||
updateMetaInLocaleArticles
) {
this.fetchPortalAndItsCategories();
}
},
},
mounted() { mounted() {
window.addEventListener('resize', this.handleResize);
this.handleResize();
bus.$on(BUS_EVENTS.TOGGLE_SIDEMENU, this.toggleSidebar); bus.$on(BUS_EVENTS.TOGGLE_SIDEMENU, this.toggleSidebar);
const slug = this.$route.params.portalSlug; const slug = this.$route.params.portalSlug;
@ -239,7 +246,6 @@ export default {
}, },
beforeDestroy() { beforeDestroy() {
bus.$off(BUS_EVENTS.TOGGLE_SIDEMENU, this.toggleSidebar); bus.$off(BUS_EVENTS.TOGGLE_SIDEMENU, this.toggleSidebar);
window.removeEventListener('resize', this.handleResize);
}, },
updated() { updated() {
const slug = this.$route.params.portalSlug; const slug = this.$route.params.portalSlug;
@ -252,15 +258,12 @@ export default {
} }
}, },
methods: { methods: {
handleResize() {
if (window.innerWidth > 1200) {
this.isOnDesktop = true;
} else {
this.isOnDesktop = false;
}
},
toggleSidebar() { toggleSidebar() {
this.isSidebarOpen = !this.isSidebarOpen; if (this.portals.length > 0) {
this.updateUISettings({
show_help_center_secondary_sidebar: !this.isSidebarOpen,
});
}
}, },
async fetchPortalAndItsCategories() { async fetchPortalAndItsCategories() {
await this.$store.dispatch('portals/index'); await this.$store.dispatch('portals/index');
@ -302,8 +305,3 @@ export default {
}, },
}; };
</script> </script>
<style lang="scss" scoped>
.off-canvas-content.is-open-left.has-transition-push {
transform: translateX(var(--space-giga));
}
</style>

View file

@ -236,8 +236,10 @@ export default {
}); });
}, },
articleCount() { articleCount() {
const { all_articles_count: count } = this.portal.meta; const { allowed_locales: allowedLocales } = this.portal.config;
return count; return allowedLocales.reduce((acc, locale) => {
return acc + locale.articles_count;
}, 0);
}, },
}, },
methods: { methods: {

View file

@ -105,7 +105,10 @@ export default {
return this.portal?.config?.allowed_locales; return this.portal?.config?.allowed_locales;
}, },
articlesCount() { articlesCount() {
return this.portal?.meta?.all_articles_count; const { allowed_locales: allowedLocales } = this.portal.config;
return allowedLocales.reduce((acc, locale) => {
return acc + locale.articles_count;
}, 0);
}, },
}, },
mounted() { mounted() {

View file

@ -151,6 +151,7 @@ export default {
params: { params: {
portalSlug: this.selectedPortalSlug, portalSlug: this.selectedPortalSlug,
locale: this.locale, locale: this.locale,
recentlyDeleted: true,
}, },
}); });
} catch (error) { } catch (error) {

View file

@ -87,6 +87,7 @@ export default {
articleSlug: articleId, articleSlug: articleId,
portalSlug: this.selectedPortalSlug, portalSlug: this.selectedPortalSlug,
locale: this.locale, locale: this.locale,
recentlyCreated: true,
}, },
}); });
} catch (error) { } catch (error) {

View file

@ -37,6 +37,13 @@ export default {
this.resizeTextarea(); this.resizeTextarea();
}, },
}, },
mounted() {
this.$nextTick(() => {
if (this.value) {
this.resizeTextarea();
}
});
},
methods: { methods: {
resizeTextarea() { resizeTextarea() {
if (!this.value) { if (!this.value) {

View file

@ -174,7 +174,7 @@ export default {
feedback_message: this.feedbackMessage, feedback_message: this.feedbackMessage,
}; };
} catch (error) { } catch (error) {
const errorMessage = error?.response?.data?.message; const errorMessage = error?.response?.data?.error;
this.errorMessage = errorMessage || this.$t('SURVEY.API.ERROR_MESSAGE'); this.errorMessage = errorMessage || this.$t('SURVEY.API.ERROR_MESSAGE');
} finally { } finally {
this.isUpdating = false; this.isUpdating = false;

View file

@ -15,7 +15,7 @@ DeviseTokenAuth.setup do |config|
# Sets the max number of concurrent devices per user, which is 10 by default. # Sets the max number of concurrent devices per user, which is 10 by default.
# After this limit is reached, the oldest tokens will be removed. # After this limit is reached, the oldest tokens will be removed.
# config.max_number_of_devices = 10 config.max_number_of_devices = 25
# Sometimes it's necessary to make several requests to the API at the same # Sometimes it's necessary to make several requests to the API at the same
# time. In this case, each request in the batch will need to share the same # time. In this case, each request in the batch will need to share the same

View file

@ -48,11 +48,11 @@ fr:
imap: imap:
socket_error: Veuillez vérifier la connexion, l'adresse IMAP et réessayez. socket_error: Veuillez vérifier la connexion, l'adresse IMAP et réessayez.
no_response_error: Veuillez vérifier les identifiants IMAP et réessayez. no_response_error: Veuillez vérifier les identifiants IMAP et réessayez.
host_unreachable_error: Host unreachable, Please check the IMAP address, IMAP port and try again. host_unreachable_error: Hôte injoignable, veuillez vérifier l'adresse IMAP, le port IMAP et réessayer.
connection_timed_out_error: Connection timed out for %{address}:%{port} connection_timed_out_error: La connexion a expiré pour %{address}:%{port}
connection_closed_error: Connection closed. connection_closed_error: Connexion fermée.
validations: validations:
name: should not start or end with symbols, and it should not have < > / \ @ characters. name: 'ne doit pas commencer ou se terminer par des symboles, et ne doit pas comporter les caractères suivants : "< > / \ @".'
reports: reports:
period: Période de rapport %{since} à %{until} period: Période de rapport %{since} à %{until}
agent_csv: agent_csv:
@ -61,14 +61,14 @@ fr:
avg_first_response_time: Temps de réponse moyen (Minutes) avg_first_response_time: Temps de réponse moyen (Minutes)
avg_resolution_time: Temps moyen de résolution (Minutes) avg_resolution_time: Temps moyen de résolution (Minutes)
inbox_csv: inbox_csv:
inbox_name: Inbox name inbox_name: Nom de la boîte de réception
inbox_type: Inbox type inbox_type: Type de boîte de réception
conversations_count: No. of conversations conversations_count: Nbre de conversations
avg_first_response_time: Temps de réponse moyen (Minutes) avg_first_response_time: Temps de réponse moyen (Minutes)
avg_resolution_time: Temps moyen de résolution (Minutes) avg_resolution_time: Temps moyen de résolution (Minutes)
label_csv: label_csv:
label_title: Label label_title: Libellé
conversations_count: No. of conversations conversations_count: Nbre de conversations
avg_first_response_time: Temps de réponse moyen (Minutes) avg_first_response_time: Temps de réponse moyen (Minutes)
avg_resolution_time: Temps moyen de résolution (Minutes) avg_resolution_time: Temps moyen de résolution (Minutes)
team_csv: team_csv:
@ -79,13 +79,13 @@ fr:
default_group_by: jour default_group_by: jour
csat: csat:
headers: headers:
contact_name: Contact Name contact_name: Nom du contact
contact_email_address: Contact Email Address contact_email_address: Adresse e-mail du contact
contact_phone_number: Contact Phone Number contact_phone_number: Numéro de téléphone du contact
link_to_the_conversation: Link to the conversation link_to_the_conversation: Lier à la conversation
agent_name: Nom de l'agent agent_name: Nom de l'agent
rating: Note rating: Note
feedback: Feedback Comment feedback: Commentaire
recorded_at: Recorded date recorded_at: Recorded date
notifications: notifications:
notification_title: notification_title:
@ -96,7 +96,7 @@ fr:
conversations: conversations:
messages: messages:
instagram_story_content: "%{story_sender} vous a mentionné dans l'histoire: " instagram_story_content: "%{story_sender} vous a mentionné dans l'histoire: "
instagram_deleted_story_content: This story is no longer available. instagram_deleted_story_content: Cette Story n'est plus disponible.
deleted: Ce message a été supprimé deleted: Ce message a été supprimé
activity: activity:
status: status:
@ -151,9 +151,9 @@ fr:
description: "L'intégration FullContact permet d'enrichir les profils de visiteurs. Identifiez les utilisateurs dès qu'ils partagent leur adresse de courriel et offrez-leur un service client sur mesure. Connectez FullContact à votre compte en partageant la clé API FullContact." description: "L'intégration FullContact permet d'enrichir les profils de visiteurs. Identifiez les utilisateurs dès qu'ils partagent leur adresse de courriel et offrez-leur un service client sur mesure. Connectez FullContact à votre compte en partageant la clé API FullContact."
public_portal: public_portal:
search: search:
search_placeholder: Search for article by title or body... search_placeholder: Rechercher un article par titre ou contenu...
empty_placeholder: Aucun résultat trouvé. empty_placeholder: Aucun résultat trouvé.
loading_placeholder: Searching... loading_placeholder: Recherche en cours...
results_title: Search results results_title: Résultats de recherche
hero: hero:
sub_title: Search for the articles here or browse the categories below. sub_title: Recherchez les articles ici ou parcourez les catégories ci-dessous.

View file

@ -6,7 +6,7 @@ const vue = require('./loaders/vue');
environment.plugins.prepend('VueLoaderPlugin', new VueLoaderPlugin()); environment.plugins.prepend('VueLoaderPlugin', new VueLoaderPlugin());
environment.loaders.prepend('vue', vue); environment.loaders.prepend('vue', vue);
environment.loaders.append('opus', { environment.loaders.append('opus-ogg', {
test: /encoderWorker\.min\.js$/, test: /encoderWorker\.min\.js$/,
loader: 'file-loader', loader: 'file-loader',
options: { options: {
@ -14,6 +14,14 @@ environment.loaders.append('opus', {
}, },
}); });
environment.loaders.append('opus-wav', {
test: /waveWorker\.min\.js$/,
loader: 'file-loader',
options: {
name: '[name].[ext]',
},
});
environment.loaders.append('audio', { environment.loaders.append('audio', {
test: /\.(mp3)(\?.*)?$/, test: /\.(mp3)(\?.*)?$/,
loader: 'url-loader', loader: 'url-loader',