full translate of settings tab

This commit is contained in:
Gabriel Pastori 2023-12-14 15:48:10 -03:00
parent b75a794ec3
commit 19aff45664
10 changed files with 269 additions and 107 deletions

View File

@ -36,9 +36,9 @@
class="mb-3"
:rules="[
(url) => {
if (!url) return 'URL é obrigatório';
if (!url) return this.$t('required', { field: 'URL' });
if (!url.startsWith('http'))
return 'URL deve começar com http ou https';
return this.$t('httpHttps', { field: 'URL' });
return true;
},
]"
@ -48,7 +48,7 @@
<div class="flex-grow-1">
<v-text-field
v-model="chatwootData.account_id"
label="ID da conta"
:label="$t('chatwoot.account_id')"
:disabled="loading"
outlined
dense
@ -56,7 +56,10 @@
class="mb-3"
:rules="[
(account_id) => {
if (!account_id) return 'ID da conta é obrigatório';
if (!account_id)
return this.$t('required', {
field: this.$t('chatwoot.account_id'),
});
return true;
},
]"
@ -65,7 +68,7 @@
<div class="flex-grow-1">
<v-text-field
v-model="chatwootData.token"
label="Token da conta"
:label="$t('chatwoot.token')"
:disabled="loading"
outlined
dense
@ -73,7 +76,10 @@
class="mb-3"
:rules="[
(token) => {
if (!token) return 'Token é obrigatório';
if (!token)
return this.$t('required', {
field: this.$t('chatwoot.token'),
});
return true;
},
]"
@ -90,27 +96,23 @@
density="compact"
>
<template v-slot:label>
<span>Assinar mensagens</span>
<HelpTooltip>
Adiciona o nome do atendente na primeira linha da mensagem
</HelpTooltip>
<span>{{ $t("chatwoot.signMsg") }}</span>
<HelpTooltip> {{ $t("chatwoot.signMsgHelp") }} </HelpTooltip>
</template>
</v-checkbox>
</div>
<div>
<v-checkbox
v-model="chatwootData.reopen_conversation"
label="Reabrir conversa"
:disabled="loading"
hide-details
class="mb-3"
density="compact"
>
<template v-slot:label>
<span>Reabrir conversa</span>
<span>{{ $t("chatwoot.reopenConversation") }}</span>
<HelpTooltip>
Reabre a conversa do cliente quando ele inicia uma nova
conversa em vez de criar uma nova conversa
{{ $t("chatwoot.reopenConversationHelp") }}
</HelpTooltip>
</template>
</v-checkbox>
@ -119,16 +121,15 @@
<div>
<v-checkbox
v-model="chatwootData.conversation_pending"
label="Conversa pendente"
:disabled="loading"
hide-details
class="mb-3"
density="compact"
>
<template v-slot:label>
<span>Iniciar conversas como pendente</span>
<span>{{ $t("chatwoot.conversationPending") }}</span>
<HelpTooltip>
Inicia a conversa como pendente ao invés de aberta
{{ $t("chatwoot.conversationPendingHelp") }}
</HelpTooltip>
</template>
</v-checkbox>
@ -137,11 +138,10 @@
<div>
<v-checkbox
v-model="chatwootData.auto_create"
label="Conversa pendente"
:disabled="loading || !AppStore.versionSatisfies('>=1.6.0')"
:hint="
!AppStore.versionSatisfies('>=1.6.0')
? 'Disponível a partir da versão 1.6.0'
? $t('version.availableFrom', { version: '1.6.0' })
: undefined
"
:persistent-hint="!AppStore.versionSatisfies('>=1.6.0')"
@ -150,10 +150,8 @@
density="compact"
>
<template v-slot:label>
<span>Criar Caixa de Entrada</span>
<HelpTooltip>
Cria automaticamente a caixa de entrada no Chatwoot
</HelpTooltip>
<span>{{ $t("chatwoot.autoCreate") }}</span>
<HelpTooltip>{{ $t("chatwoot.autoCreateHelp") }}</HelpTooltip>
</template>
</v-checkbox>
</div>

View File

@ -1,8 +1,13 @@
<template>
<v-card variant="outlined" :loading="loading">
<v-card-title class="d-flex align-center" @click="toggleExpanded" style="cursor: pointer" v-ripple>
<v-card-title
class="d-flex align-center"
@click="toggleExpanded"
style="cursor: pointer"
v-ripple
>
<v-icon start>mdi-cellphone-cog</v-icon>
Comportamento
{{ $t("options.title") }}
<v-spacer></v-spacer>
<v-btn
@ -27,7 +32,7 @@
class="flex-grow-0 flex-shrink-0"
v-model="optionsData.reject_call"
:disabled="loading"
label="Rejeitar chamadas"
:label="$t('options.rejectCall')"
hide-details
density="compact"
></v-checkbox>
@ -35,7 +40,7 @@
class="flex-grow-1 flex-shrink-0"
v-model="optionsData.msg_call"
:disabled="loading || !optionsData.reject_call"
label="Mensagem de rejeição"
:label="$t('options.msgCall')"
hide-details
style="min-width: 200px"
></v-text-field>
@ -45,7 +50,7 @@
class="flex-grow-0"
v-model="optionsData.groups_ignore"
:disabled="loading"
label="Ignorar grupos"
:label="$t('options.groupsIgnore')"
hide-details
density="compact"
></v-checkbox>
@ -54,7 +59,7 @@
class="flex-grow-0"
v-model="optionsData.always_online"
:disabled="loading"
label="Sempre online"
:label="$t('options.alwaysOnline')"
hide-details
density="compact"
></v-checkbox>
@ -63,7 +68,7 @@
class="flex-grow-0"
v-model="optionsData.read_messages"
:disabled="loading"
label="Marcar mensagens como lidas"
:label="$t('options.readMessages')"
hide-details
density="compact"
></v-checkbox>
@ -72,7 +77,7 @@
class="flex-grow-0"
v-model="optionsData.read_status"
:disabled="loading"
label="Marcar status como visto"
:label="$t('options.readStatus')"
hide-details
density="compact"
></v-checkbox>
@ -91,7 +96,7 @@
@click="saveOptions"
variant="tonal"
>
Salvar
{{ $t("save") }}
</v-btn>
</v-card-actions>
</v-card>
@ -101,14 +106,13 @@
import instanceController from "@/services/instanceController";
const defaultOptions = () => ({
reject_call: false,
msg_call: "",
groups_ignore: false,
always_online: false,
read_messages: false,
read_status: false,
})
reject_call: false,
msg_call: "",
groups_ignore: false,
always_online: false,
read_messages: false,
read_status: false,
});
export default {
name: "InstanceOptions",
@ -154,7 +158,10 @@ export default {
this.instance.instance.instanceName,
this.optionsData
);
this.defaultOptionsData = Object.assign(defaultOptions(), this.optionsData);
this.defaultOptionsData = Object.assign(
defaultOptions(),
this.optionsData
);
} catch (e) {
this.error = e.message?.message || e.message || e;
} finally {

View File

@ -1,6 +1,11 @@
<template>
<v-card variant="outlined" :loading="loading">
<v-card-title class="d-flex align-center" @click="toggleExpanded" style="cursor: pointer" v-ripple>
<v-card-title
class="d-flex align-center"
@click="toggleExpanded"
style="cursor: pointer"
v-ripple
>
<v-icon start>mdi-rabbit</v-icon>
RabbitMQ
@ -22,8 +27,7 @@
</v-alert>
<v-alert type="info" class="mb-3">
O RabbitMQ é utilizado pela API para o enfileiramento das notificações.
Ele NÃO é utilizado para o envio de mensagens.
{{ $t("rabbitmq.info") }}
</v-alert>
<v-form v-model="valid">
@ -31,7 +35,7 @@
:items="rabbitmqEventsType"
v-model="rabbitmqData.events"
:disabled="loading"
label="Eventos"
:label="$t('events')"
hide-details
class="mb-3"
multiple
@ -44,7 +48,7 @@
<v-card-actions v-if="expanded">
<v-switch
v-model="rabbitmqData.enabled"
label="Habilitado"
:label="$t('enabled')"
color="primary"
:disabled="loading"
hide-details
@ -60,8 +64,8 @@
@click="saveRabbitmq"
variant="tonal"
>
Salvar
</v-btn>
{{ $t("save") }}
</v-btn>
</v-card-actions>
</v-card>
</template>

View File

@ -36,9 +36,9 @@
class="mb-3"
:rules="[
(url) => {
if (!url) return 'URL é obrigatório';
if (!url) return $t('required', { field: 'URL' });
if (!url.startsWith('http'))
return 'URL deve começar com http ou https';
return $t('httpHttps', { field: 'URL' });
return true;
},
]"
@ -48,16 +48,17 @@
<div class="flex-grow-1">
<v-text-field
v-model="typebotData.typebot"
label="Nome do fluxo do Typebot"
:label="$t('typebot.typebot')"
:disabled="loading"
outlined
dense
hide-details="auto"
class="mb-3"
hint="O nome do fluxo do Typebot que será utilizado"
:hint="$t('typebot.typebotHelp')"
:rules="[
(account_id) => {
if (!account_id) return 'Typebot é obrigatório';
if (!account_id)
return $t('required', { field: $t('typebot.typebot') });
return true;
},
]"
@ -66,18 +67,20 @@
<div class="flex-grow-1">
<v-text-field
v-model="typebotData.keyword_finish"
label="Palavra-chave de finalização"
:label="$t('typebot.keywordFinish')"
placeholder="#SAIR"
:disabled="loading"
outlined
dense
hide-details="auto"
class="mb-3"
hint="Palavra-chave para finalizar o fluxo"
:hint="$t('typebot.keywordFinishHelp')"
:rules="[
(token) => {
if (!token)
return 'Palavra-chave de finalização é obrigatório';
return $t('required', {
field: $t('typebot.keywordFinish'),
});
return true;
},
]"
@ -89,19 +92,19 @@
<div class="flex-grow-1">
<v-text-field
v-model="typebotData.expire"
label="Tempo de expiração (em minutos)"
:label="$t('typebot.expire')"
:disabled="loading"
type="number"
min="0"
outlined
dense
hide-details="auto"
hint="Tempo para encerrar a sessão caso não haja interação"
:hint="$t('typebot.expireHelp')"
class="mb-3"
:rules="[
(v) => {
if (v === '' || v === undefined)
return 'Tempo de expiração é obrigatório';
return $t('required', { field: $t('typebot.expire') });
return true;
},
]"
@ -110,10 +113,12 @@
<div class="flex-grow-1">
<v-text-field
v-model="typebotData.delay_message"
label="Tempo de atraso da mensagem (em milisegundos)"
:label="`${$t('typebot.delayMessage')} (${$t(
'typebot.delayMessageUnit'
)})`"
type="number"
min="0"
:hint="`Tempo de simulação de digitação - ${
:hint="`${$t('typebot.delayMessageHelp')} - ${
typebotData.delay_message
}ms = ${(typebotData.delay_message / 1000)
.toFixed(1)
@ -126,7 +131,9 @@
:rules="[
(token) => {
if (token == null || token < 0)
return 'Palavra-chave de finalização é obrigatório';
return $t('required', {
field: $t('typebot.delayMessage'),
});
return true;
},
]"
@ -136,7 +143,7 @@
<v-text-field
v-model="typebotData.unknown_message"
label="Mensagem de desconhecido"
:label="$t('typebot.unknownMessage')"
:disabled="loading"
outlined
dense
@ -144,7 +151,8 @@
class="mb-3"
:rules="[
(token) => {
if (!token) return 'Mensagem de desconhecido é obrigatório';
if (!token)
return $t('required', { field: $t('typebot.unknownMessage') });
return true;
},
]"
@ -154,13 +162,12 @@
<v-checkbox
class="flex-shrink-1"
v-model="typebotData.listening_from_me"
label="Ouvir mensagens enviadas por mim"
:disabled="loading"
>
<template v-slot:label>
<span>Ouvir mensagens enviadas por mim</span>
<span>{{ $t("typebot.listeningFromMe") }}</span>
<HelpTooltip>
Envia as mensagens enviadas por você para o fluxo do Typebot
{{ $t("typebot.listeningFromMeHelp") }}
</HelpTooltip>
</template>
</v-checkbox>
@ -170,7 +177,7 @@
<v-card-actions v-if="expanded">
<v-switch
v-model="typebotData.enabled"
label="Habilitado"
:label="$t('enabled')"
color="primary"
:disabled="loading"
hide-details
@ -182,9 +189,7 @@
@click="openTypebotSessions"
size="small"
>
ver {{ typebotData.sessions.length }} sess{{
typebotData.sessions.length != 1 ? "ões" : "ão"
}}
{{ $t("typebot.session.btn", { count: typebotData.sessions.length }) }}
</v-btn>
<v-spacer></v-spacer>
@ -199,7 +204,7 @@
@click="saveTypebot"
variant="tonal"
>
Salvar
{{ $t("save") }}
</v-btn>
</v-card-actions>
</v-card>

View File

@ -36,9 +36,9 @@
class="mb-3"
:rules="[
(url) => {
if (!url) return 'URL é obrigatório';
if (!url) return this.$t('required', { field: 'URL' });
if (!url.startsWith('http'))
return 'URL deve começar com http ou https';
return this.$t('httpHttps', { field: 'URL' });
return true;
},
]"
@ -48,7 +48,7 @@
:items="webhookEventsType"
v-model="webhookData.events"
:disabled="loading"
label="Eventos"
:label="$t('events')"
hide-details
class="mb-3"
multiple
@ -72,11 +72,17 @@
<v-checkbox
v-model="webhookData.webhook_by_events"
:disabled="loading"
label="Webhook por eventos"
hide-details
class="mb-3"
density="compact"
/>
>
<template v-slot:label>
<span>{{ $t("webhook.byEvents") }}</span>
<HelpTooltip>
{{ $t("webhook.byEventsHelp") }}
</HelpTooltip>
</template>
</v-checkbox>
</div>
</div>
</v-form>
@ -84,7 +90,7 @@
<v-card-actions v-if="expanded">
<v-switch
v-model="webhookData.enabled"
label="Habilitado"
:label="$t('enabled')"
color="primary"
:disabled="loading"
hide-details
@ -100,7 +106,7 @@
@click="saveWebhook"
variant="tonal"
>
Salvar
{{ $t("save") }}
</v-btn>
</v-card-actions>
</v-card>
@ -165,7 +171,7 @@ export default {
toggleExpanded() {
if (this.loading) return;
this.expanded = !this.expanded;
},
},
async saveWebhook() {
try {
this.loading = true;

View File

@ -30,7 +30,7 @@
:items="websocketEventsType"
v-model="websocketData.events"
:disabled="loading"
label="Eventos"
:label="$t('events')"
hide-details
class="mb-3"
multiple
@ -43,7 +43,7 @@
<v-card-actions v-if="expanded">
<v-switch
v-model="websocketData.enabled"
label="Habilitado"
:label="$t('enabled')"
color="primary"
:disabled="loading"
hide-details
@ -59,7 +59,7 @@
@click="saveWebsocket"
variant="tonal"
>
Salvar
{{ $t("save") }}
</v-btn>
</v-card-actions>
</v-card>

View File

@ -98,9 +98,9 @@
@click="save(conect)"
>
<v-list-item-content>
<v-list-item-title>{{
conect.host.replace(/https?:\/\//, "")
}}</v-list-item-title>
<v-list-item-title>
{{ conect.host.replace(/https?:\/\//, "") }}
</v-list-item-title>
<!-- <v-list-item-subtitle>
{{ connection.globalApiKey.slice(0, 10) }}...
@ -216,10 +216,7 @@ export default {
(v) =>
new RegExp(`^(${!this.isHttps ? "http|" : ""}https)://`, "i").test(
v
) ||
(this.isHttps
? "URL inválida, ela deve começar com https"
: "URL inválida, ela deve começar com http ou https"),
) || this.$t(this.isHttps ? "https" : "httpHttps", { field: "URL" }),
];
},
},

View File

@ -3,7 +3,7 @@
<v-dialog v-model="dialog" max-width="850px" scrollable>
<v-card>
<v-card-title class="d-flex align-center">
Sessões do Typebot
{{ $t("typebot.session.title") }}
<v-spacer />
<h3>{{ sessions.length }}</h3>
<v-btn
@ -21,7 +21,7 @@
:headers="headers"
:items="sessions"
:no-data-text="
loading ? 'Carregando...' : 'Nenhuma sessão encontrada'
loading ? `${$t('loading')}...` : $t('typebot.session.noData')
"
:rows-per-page-items="[10, 25, 50, 100]"
>
@ -33,7 +33,7 @@
<template v-slot:item.status="{ item }">
<v-chip :color="item.status.color" label size="small">
<v-icon start>{{ item.status.icon }}</v-icon>
{{ item.status.text }}
{{ $t(`typebot.status.${item.status.id}`) }}
</v-chip>
</template>
<template v-slot:item.variables="{ item }">
@ -114,7 +114,7 @@
<v-card-actions>
<v-spacer></v-spacer>
<v-btn text @click="dialog = false" :disabled="loading || loadingInner">
Fechar
{{ $t("close") }}
</v-btn>
<v-spacer></v-spacer>
</v-card-actions>
@ -127,19 +127,30 @@ import typebotStatus from "@/helpers/mappers/typebotStatus";
import instanceController from "@/services/instanceController";
export default {
name: "SettingsModal",
data: () => ({
dialog: false,
typebotStatus,
headers: [
{ title: "Número", value: "remoteJid" },
{ title: "Status", value: "status" },
{ title: "Variáveis", value: "variables" },
{ title: "Iniciada em", value: "createdAt" },
{ title: "Última mensagem", value: "updateAt" },
{ title: "", value: "actions" },
],
loadingInner: false,
}),
data() {
return {
dialog: false,
typebotStatus,
headers: [
{ title: "Whatsapp", value: "remoteJid" },
{ title: "Status", value: "status" },
{
title: this.$t("typebot.session.headers.variables"),
value: "variables",
},
{
title: this.$t("typebot.session.headers.createdAt"),
value: "createdAt",
},
{
title: this.$t("typebot.session.headers.updateAt"),
value: "updateAt",
},
{ title: "", value: "actions" },
],
loadingInner: false,
};
},
methods: {
open() {
this.dialog = true;

View File

@ -11,11 +11,20 @@ export default {
refresh: "Refresh",
disconnect: "Disconnect",
sure: "Sure?",
save: "Save",
instance: "Instance | Instances",
search: "Search",
loading: "Loading",
noInstances: "No instances found",
unknown: "Unknown",
required: "{field} is required",
https: "{field} must start with https://",
httpHttps: "{field} must start with http:// or https://",
enabled: "Enabled",
events: "Events",
version: {
availableFrom: "Available from version {version}",
},
status: {
close: "Disconnected",
connecting: "Connecting",
@ -43,5 +52,63 @@ export default {
connectPhone: {
title: "Phone not connected",
apiGenericError: "Could not load QR Code, if the error persists, restart the API and try again."
},
options: {
title: "Behavior",
rejectCall: "Reject call",
msgCall: "Rejection message",
groupsIgnore: "Ignore groups",
alwaysOnline: "Always online",
readMessages: "Mark messages as read",
readStatus: "Mark status as seen",
},
webhook: {
byEvents: "Webhook by events",
byEventsHelp: "Adds the event name at the end of the URL (ex: /webhook/event_name )",
},
rabbitmq: {
info: "RabbitMQ is used by the API to queue notifications. It is NOT used to send messages."
},
chatwoot: {
account_id: "Account ID",
token: "Account Token",
signMsg: "Sign messages",
signMsgHelp: "Adds the agent name at the first line of the message",
reopenConversation: "Reopen conversation",
reopenConversationHelp: "Reopens the customer's conversation when he starts a new conversation instead of creating a new conversation",
conversationPending: "Start conversation as pending",
conversationPendingHelp: "Starts the conversation as pending instead of open",
autoCreate: "Create Inbox",
autoCreateHelp: "Creates the inbox in Chatwoot if it doesn't exist",
},
typebot: {
typebot: "Typebot flow name",
typebotHelp: "The name of the Typebot flow to be used",
keywordFinish: "Finish keyword",
keywordFinishHelp: "Keyword to finish the flow",
expire: "Expiration time (in minutes)",
expireHelp: "Time to end the session if there is no interaction",
delayMessage: "Message typing time",
delayMessageUnit: "in milliseconds",
delayMessageHelp: "Typing simulation time",
unknownMessage: "Unknown message format",
unknownMessageHelp: "Message sent when the message format is not recognized",
listeningFromMe: "Listen to messages sent by me",
listeningFromMeHelp: "Sends the messages sent by you to the Typebot flow",
session: {
title: "Typebot sessions",
btn: "See 0 sessions | See one session | See {count} sessions",
noData: "No sessions found",
headers: {
variable: "Variables",
createdAt: "Started at",
updatedAt: "Last message",
}
},
status: {
opened: "Open",
paused: "Paused",
closed: "Closed",
}
}
}

View File

@ -11,11 +11,20 @@ export default {
refresh: "Atualizar",
disconnect: "Desconectar",
sure: "Tem certeza?",
save: "Salvar",
instance: "Instância | Instâncias",
search: "Pesquisar",
loading: "Carregando",
noInstances: "Nenhuma instância encontrada",
unknown: "Desconhecido",
required: "{field} é obrigatório",
https: "{field} deve começar com https://",
httpHttps: "{field} deve começar com http:// ou https://",
enabled: "Habilitado",
events: "Eventos",
version: {
availableFrom: "Disponível a partir da versão {version}",
},
status: {
close: "Desconectado",
connecting: "Conectando",
@ -43,5 +52,63 @@ export default {
connectPhone: {
title: "Telefone não conectado",
apiGenericError: "Não foi possível carregar o QR Code, se o erro persistir, reinicie a API e tente novamente."
},
options: {
title: "Comportamento",
rejectCall: "Rejeitar chamada",
msgCall: "Mensagem de rejeição",
groupsIgnore: "Ignorar grupos",
alwaysOnline: "Sempre online",
readMessages: "Marcar mensagens como lidas",
readStatus: "Marcar status como visto",
},
webhook: {
byEvents: "Webhook por eventos",
byEventsHelp: "Adiciona o nome do evento no final da URL (ex: /webhook/event_name )",
},
rabbitmq: {
info: "O RabbitMQ é utilizado pela API para o enfileiramento das notificações. Ele NÃO é utilizado para o envio de mensagens."
},
chatwoot: {
account_id: "ID da conta",
token: "Token da conta",
signMsg: "Assinar mensagens",
signMsgHelp: "Adiciona o nome do atendente na primeira linha da mensagem",
reopenConversation: "Reabrir conversa",
reopenConversationHelp: "Reabre a conversa do cliente quando ele inicia uma nova conversa em vez de criar uma nova conversa",
conversationPending: "Iniciar conversa como pendente",
conversationPendingHelp: "Inicia a conversa como pendente ao invés de aberta",
autoCreate: "Criar Caixa de Entrada",
autoCreateHelp: "Cria a caixa de entrada no Chatwoot caso ela não exista",
},
typebot: {
typebot: "Nome do fluxo do Typebot",
typebotHelp: "O nome do fluxo do Typebot que será utilizado",
keywordFinish: "Palavra-chave de finalização",
keywordFinishHelp: "Palavra-chave para finalizar o fluxo",
expire: "Tempo de expiração (em minutos)",
expireHelp: "Tempo para encerrar a sessão caso não haja interação",
delayMessage: "Tempo de digitação da mensagem",
delayMessageUnit: "em milisegundos",
delayMessageHelp: "Tempo de simulação de digitação",
unknownMessage: "Mensagem formato desconhecido",
unknownMessageHelp: "Mensagem enviada quando o formato da mensagem não é reconhecido",
listeningFromMe: "Ouvir mensagens enviadas por mim",
listeningFromMeHelp: "Envia as mensagens enviadas por você para o fluxo do Typebot",
session: {
title: "Sessões do Typebot",
btn: "Ver 0 sessões | Ver uma sessão | Ver {count} sessões",
noData: "Nenhuma sessão encontrada",
headers: {
variables: "Variáveis",
createdAt: "Iniciada em",
updatedAt: "Última mensagem",
}
},
status: {
opened: "Aberto",
paused: "Pausado",
closed: "Fechado",
}
}
}