From 2d4351d42b70c23979f7d410097017c9bd9a2bd3 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Sat, 14 Mar 2020 15:29:08 -0300 Subject: [PATCH 001/135] WhatsPro --- ui/package.json | 2 +- .../common/components/IntegrationIcon.tsx | 4 + ui/src/modules/common/styles/colors.ts | 2 + .../integrations/components/store/Entry.tsx | 16 ++++ .../components/whatspro/WhatsPro.tsx | 93 +++++++++++++++++++ .../settings/integrations/constants.ts | 14 ++- .../integrations/containers/StoreEntry.tsx | 1 + .../integrations/containers/whatspro/Form.tsx | 46 +++++++++ ui/src/modules/settings/integrations/types.ts | 4 +- 9 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 ui/src/modules/settings/integrations/components/whatspro/WhatsPro.tsx create mode 100644 ui/src/modules/settings/integrations/containers/whatspro/Form.tsx diff --git a/ui/package.json b/ui/package.json index 5ef8f6afa8c..4424d251ce5 100644 --- a/ui/package.json +++ b/ui/package.json @@ -145,6 +145,6 @@ ], "snyk": true, "engines": { - "node": "10.x.x" + "node": "12.x.x" } } \ No newline at end of file diff --git a/ui/src/modules/common/components/IntegrationIcon.tsx b/ui/src/modules/common/components/IntegrationIcon.tsx index 610111579aa..66bf0c04e0a 100644 --- a/ui/src/modules/common/components/IntegrationIcon.tsx +++ b/ui/src/modules/common/components/IntegrationIcon.tsx @@ -24,6 +24,7 @@ const RoundedBackground = styledTS<{ type: string; size?: number }>( (props.type === 'facebook-messenger' && colors.socialFacebookMessenger) || (props.type === 'gmail' && colors.socialGmail) || (props.type.includes('nylas') && colors.socialGmail) || + (props.type === 'whatspro' && colors.colorCoreLightGreen) || colors.colorCoreBlue}; i { @@ -80,6 +81,9 @@ class IntegrationIcon extends React.PureComponent { case 'chatfuel': icon = 'comment-dots'; break; + case 'whatspro': + icon = 'whatsapp'; + break; default: icon = 'doc-text-inv-1'; } diff --git a/ui/src/modules/common/styles/colors.ts b/ui/src/modules/common/styles/colors.ts index 6c78d13893d..b7d272a53d1 100644 --- a/ui/src/modules/common/styles/colors.ts +++ b/ui/src/modules/common/styles/colors.ts @@ -13,6 +13,7 @@ const colorCoreDarkBlue = '#0a1e41'; const colorCoreBlack = '#393C40'; const colorCoreGray = '#888'; const colorCoreLightGray = '#AAAEB3'; +const colorCoreLightGreen = '#25D366'; const colorLightGray = '#AAA'; const colorLightBlue = '#F8FBFF'; @@ -73,6 +74,7 @@ export default { colorLightBlue, colorCoreDarkGray, colorCoreDarkBlue, + colorCoreLightGreen, bgMain, bgDark, diff --git a/ui/src/modules/settings/integrations/components/store/Entry.tsx b/ui/src/modules/settings/integrations/components/store/Entry.tsx index 5cb039c5a48..ee0d8849047 100644 --- a/ui/src/modules/settings/integrations/components/store/Entry.tsx +++ b/ui/src/modules/settings/integrations/components/store/Entry.tsx @@ -13,6 +13,7 @@ import KnowledgeBase from '../../containers/knowledgebase/Form'; import Lead from '../../containers/lead/Form'; import Twitter from '../../containers/twitter/Twitter'; import Website from '../../containers/website/Form'; +import WhatsProForm from '../../containers/whatspro/Form'; import { Box, IntegrationItem, Ribbon, Type } from './styles'; type Props = { @@ -32,6 +33,7 @@ type Props = { office365: number; outlook: number; yahoo: number; + whatspro: number; }; }; @@ -229,6 +231,20 @@ class Entry extends React.Component { ); } + if (createModal === KIND_CHOICES.WHATSPRO) { + const trigger =
+ {__('Add')}
; + + const content = props => ; + + return ( + + ); + } + return + {__('Add')}; } diff --git a/ui/src/modules/settings/integrations/components/whatspro/WhatsPro.tsx b/ui/src/modules/settings/integrations/components/whatspro/WhatsPro.tsx new file mode 100644 index 00000000000..0911bdcf373 --- /dev/null +++ b/ui/src/modules/settings/integrations/components/whatspro/WhatsPro.tsx @@ -0,0 +1,93 @@ +import FormControl from 'modules/common/components/form/Control'; +import Form from 'modules/common/components/form/Form'; +import FormGroup from 'modules/common/components/form/Group'; +import ControlLabel from 'modules/common/components/form/Label'; +import Spinner from 'modules/common/components/Spinner'; +import { ModalFooter } from 'modules/common/styles/main'; +import { IButtonMutateProps, IFormProps } from 'modules/common/types'; +import React from 'react'; +import SelectBrand from '../../containers/SelectBrand'; + +type Props = { + renderButton: (props: IButtonMutateProps) => JSX.Element; + closeModal: () => void; +}; + +class WhatsPro extends React.Component { + constructor(props: Props) { + super(props); + + this.state = { + loading: false + }; + } + + generateDoc = (values: { + name: string; + instanceId: string; + token: string; + brandId: string; + }) => { + return { + name: values.name, + brandId: values.brandId, + kind: 'whatspro', + data: { + instanceId: values.instanceId, + token: values.token + } + }; + }; + + renderContent = (formProps: IFormProps) => { + const { renderButton } = this.props; + const { values, isSubmitted } = formProps; + + return ( + <> + {this.state.loading && } + + Name + + + + + WhatsPro Account id + + + + + WhatsPro token + + + + + + + {renderButton({ + name: 'integration', + values: this.generateDoc(values), + isSubmitted, + callback: this.props.closeModal + })} + + + ); + }; + + render() { + return
; + } +} + +export default WhatsPro; diff --git a/ui/src/modules/settings/integrations/constants.ts b/ui/src/modules/settings/integrations/constants.ts index a77b3cc4c46..0c662507d75 100755 --- a/ui/src/modules/settings/integrations/constants.ts +++ b/ui/src/modules/settings/integrations/constants.ts @@ -77,6 +77,7 @@ export const KIND_CHOICES = { CALLPRO: 'callpro', TWITTER_DM: 'twitter-dm', CHATFUEL: 'chatfuel', + WHATSPRO: 'whatspro', ALL_LIST: [ 'messenger', 'facebook-post', @@ -89,7 +90,8 @@ export const KIND_CHOICES = { 'nylas-gmail', 'nylas-imap', 'nylas-office365', - 'nylas-outlook' + 'nylas-outlook', + 'whatspro' ] }; @@ -315,6 +317,16 @@ export const INTEGRATIONS = [ createUrl: '/settings/integrations/website', category: 'All integrations, For support teams, Marketing automation' }, + { + name: 'WhatsPro', + description: 'Get a hold of your Whatsapp messages through your Team Inbox', + inMessenger: false, + isAvailable: true, + kind: 'whatspro', + logo: '/images/integrations/whatsapp.png', + createModal: 'whatspro', + category: 'All integrations, For support teams, Messaging, Conversation' + }, { name: 'Viber', description: `Soon you'll be able to connect Viber straight to your Team Inbox`, diff --git a/ui/src/modules/settings/integrations/containers/StoreEntry.tsx b/ui/src/modules/settings/integrations/containers/StoreEntry.tsx index b210a505e30..0f209c32944 100644 --- a/ui/src/modules/settings/integrations/containers/StoreEntry.tsx +++ b/ui/src/modules/settings/integrations/containers/StoreEntry.tsx @@ -25,6 +25,7 @@ type Props = { office365: number; outlook: number; yahoo: number; + whatspro: number; }; }; diff --git a/ui/src/modules/settings/integrations/containers/whatspro/Form.tsx b/ui/src/modules/settings/integrations/containers/whatspro/Form.tsx new file mode 100644 index 00000000000..2b4f503c031 --- /dev/null +++ b/ui/src/modules/settings/integrations/containers/whatspro/Form.tsx @@ -0,0 +1,46 @@ +import ButtonMutate from 'modules/common/components/ButtonMutate'; +import { IButtonMutateProps, IRouterProps } from 'modules/common/types'; +import WhatsPro from 'modules/settings/integrations/components/whatspro/WhatsPro'; +import { mutations } from 'modules/settings/integrations/graphql'; +import React from 'react'; +import { withRouter } from 'react-router'; + +type Props = { + type?: string; + closeModal: () => void; +}; + +type FinalProps = {} & IRouterProps & Props; + +class WhatsProContainer extends React.Component { + renderButton = ({ + name, + values, + isSubmitted, + callback + }: IButtonMutateProps) => { + return ( + + ); + }; + + render() { + const { closeModal } = this.props; + + const updatedProps = { + closeModal, + renderButton: this.renderButton + }; + + return ; + } +} + +export default withRouter(WhatsProContainer); diff --git a/ui/src/modules/settings/integrations/types.ts b/ui/src/modules/settings/integrations/types.ts index de5c783ed7a..1ac235219ee 100644 --- a/ui/src/modules/settings/integrations/types.ts +++ b/ui/src/modules/settings/integrations/types.ts @@ -117,7 +117,8 @@ export type IntegrationTypes = | 'nylas-office365' | 'nylas-outlook' | 'nylas-yahoo' - | 'twitter'; + | 'twitter' + | 'whatspro'; export type IntegrationsQueryResponse = { integrations: IIntegration[]; @@ -144,6 +145,7 @@ export type ByKindTotalCount = { office365: number; outlook: number; yahoo: number; + whatspro: number; }; type IntegrationsCount = { From b5fecac01c19513d2690587f72d41354dbaea070 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Sat, 21 Mar 2020 07:47:52 -0300 Subject: [PATCH 002/135] chat restrition --- ui/src/modules/settings/general/graphql/queries.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/modules/settings/general/graphql/queries.ts b/ui/src/modules/settings/general/graphql/queries.ts index f9372a2c649..c83c413f81f 100644 --- a/ui/src/modules/settings/general/graphql/queries.ts +++ b/ui/src/modules/settings/general/graphql/queries.ts @@ -12,6 +12,7 @@ const configsGetEnv = ` query configsGetEnv { configsGetEnv { USE_BRAND_RESTRICTIONS + USE_CHAT_RESTRICTIONS } } `; From 578712407083ce17938075edeb7e0be6d6240d7a Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Thu, 26 Mar 2020 22:17:10 -0300 Subject: [PATCH 003/135] fix query --- ui/src/modules/settings/general/graphql/queries.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/src/modules/settings/general/graphql/queries.ts b/ui/src/modules/settings/general/graphql/queries.ts index c83c413f81f..f9372a2c649 100644 --- a/ui/src/modules/settings/general/graphql/queries.ts +++ b/ui/src/modules/settings/general/graphql/queries.ts @@ -12,7 +12,6 @@ const configsGetEnv = ` query configsGetEnv { configsGetEnv { USE_BRAND_RESTRICTIONS - USE_CHAT_RESTRICTIONS } } `; From 7c6b84cc4804bf8c474ddf22018085e7c2874298 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Sat, 28 Mar 2020 16:18:54 -0300 Subject: [PATCH 004/135] log env --- ui/src/apolloClient.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui/src/apolloClient.ts b/ui/src/apolloClient.ts index 44e71b36df8..5c8141652e2 100644 --- a/ui/src/apolloClient.ts +++ b/ui/src/apolloClient.ts @@ -14,6 +14,10 @@ export const getEnv = () => { const getItem = name => wenv[name] || process.env[name]; + console.log(wenv); + console.log(process.env); + + return { REACT_APP_API_URL: getItem('REACT_APP_API_URL'), REACT_APP_API_SUBSCRIPTION_URL: getItem('REACT_APP_API_SUBSCRIPTION_URL'), From 46c0a28090e38283a57a18e882e17fcc1ba5c5bd Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Fri, 3 Apr 2020 20:03:35 -0300 Subject: [PATCH 005/135] remove logs --- ui/src/apolloClient.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ui/src/apolloClient.ts b/ui/src/apolloClient.ts index 5c8141652e2..44e71b36df8 100644 --- a/ui/src/apolloClient.ts +++ b/ui/src/apolloClient.ts @@ -14,10 +14,6 @@ export const getEnv = () => { const getItem = name => wenv[name] || process.env[name]; - console.log(wenv); - console.log(process.env); - - return { REACT_APP_API_URL: getItem('REACT_APP_API_URL'), REACT_APP_API_SUBSCRIPTION_URL: getItem('REACT_APP_API_SUBSCRIPTION_URL'), From 34b62abab1e8f5b1a9e0cab51c323b072f590493 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Fri, 3 Apr 2020 20:10:01 -0300 Subject: [PATCH 006/135] Implemented escape to dismiss response templates --- .../modules/common/components/editor/Editor.tsx | 3 +++ .../conversationDetail/workarea/Editor.tsx | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/ui/src/modules/common/components/editor/Editor.tsx b/ui/src/modules/common/components/editor/Editor.tsx index a797c284636..d7850805497 100755 --- a/ui/src/modules/common/components/editor/Editor.tsx +++ b/ui/src/modules/common/components/editor/Editor.tsx @@ -35,6 +35,7 @@ type ErxesEditorProps = { keyBindingFn?: (e: any) => any; onUpArrow?: (e: KeyboardEvent) => void; onDownArrow?: (e: KeyboardEvent) => void; + onEscape?: (e: KeyboardEvent) => void; handleFileInput?: (e: React.FormEvent) => void; placeholder?: string | React.ReactNode; }; @@ -128,6 +129,7 @@ export class ErxesEditor extends React.Component { controls, onUpArrow, onDownArrow, + onEscape, bordered, isTopPopup = false, plugins @@ -172,6 +174,7 @@ export class ErxesEditor extends React.Component { keyBindingFn={this.props.keyBindingFn} onUpArrow={onUpArrow} onDownArrow={onDownArrow} + onEscape={onEscape} ref={element => { this.editor = element; }} diff --git a/ui/src/modules/inbox/components/conversationDetail/workarea/Editor.tsx b/ui/src/modules/inbox/components/conversationDetail/workarea/Editor.tsx index add08f020ec..80e34f3cacd 100644 --- a/ui/src/modules/inbox/components/conversationDetail/workarea/Editor.tsx +++ b/ui/src/modules/inbox/components/conversationDetail/workarea/Editor.tsx @@ -38,6 +38,7 @@ type State = { collectedMentions: any; suggestions: any; templatesState: any; + hideTemplates: boolean; }; const MentionEntry = props => { @@ -91,7 +92,8 @@ export default class Editor extends React.Component { ), collectedMentions: [], suggestions: this.props.mentions.toArray(), - templatesState: null + templatesState: null, + hideTemplates: false }; this.mentionPlugin = createMentionPlugin({ @@ -126,7 +128,7 @@ export default class Editor extends React.Component { } onChange = editorState => { - this.setState({ editorState }); + this.setState({ editorState, hideTemplates: false }); this.props.onChange(this.getContent(editorState)); @@ -235,11 +237,15 @@ export default class Editor extends React.Component { this.onArrow(e, 1); }; + onEscape = () => { + this.setState({ hideTemplates: true }); + } + // Render response templates suggestions renderTemplates() { - const { templatesState } = this.state; + const { templatesState, hideTemplates } = this.state; - if (!templatesState) { + if (!templatesState || hideTemplates) { return null; } @@ -312,7 +318,7 @@ export default class Editor extends React.Component { // handle enter in editor if (e.key === 'Enter') { // select response template - if (this.state.templatesState) { + if (this.state.templatesState && !this.state.hideTemplates) { this.onSelectTemplate(); return null; @@ -359,6 +365,7 @@ export default class Editor extends React.Component { keyBindingFn: this.keyBindingFn, onUpArrow: this.onUpArrow, onDownArrow: this.onDownArrow, + onEscape: this.onEscape, handleFileInput: this.props.handleFileInput, isTopPopup: true, plugins, From e790917b6c197913f241e8dc37792221d6a7a0d3 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Sat, 4 Apr 2020 15:17:01 -0300 Subject: [PATCH 007/135] Update --- .../settings/integrations/components/store/Entry.tsx | 8 ++++---- ui/src/modules/settings/integrations/types.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/src/modules/settings/integrations/components/store/Entry.tsx b/ui/src/modules/settings/integrations/components/store/Entry.tsx index e4d38cfa3e8..1e25e2beea3 100644 --- a/ui/src/modules/settings/integrations/components/store/Entry.tsx +++ b/ui/src/modules/settings/integrations/components/store/Entry.tsx @@ -299,16 +299,16 @@ function renderCreate(createUrl, createModal) { ); } - if (createModal === INTEGRATION_KINDS.WHATSAPP) { + if (createModal === INTEGRATION_KINDS.WHATSPRO) { const trigger =
+ {__('Add')}
; - const content = props => ; + const content = props => ; return ( - + ); } - + return + {__('Add')}; } diff --git a/ui/src/modules/settings/integrations/types.ts b/ui/src/modules/settings/integrations/types.ts index d8870227fe6..ca7c791764f 100644 --- a/ui/src/modules/settings/integrations/types.ts +++ b/ui/src/modules/settings/integrations/types.ts @@ -121,7 +121,7 @@ export type IntegrationTypes = | 'smooch-telegram' | 'smooch-viber' | 'smooch-line' - | 'smooch-twilio'; + | 'smooch-twilio' | 'whatspro'; export type IntegrationsQueryResponse = { From 12a5a00733f62423288b639c669adb09b255b630 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Mon, 6 Apr 2020 07:03:27 -0300 Subject: [PATCH 008/135] remove USE_CHAT_RESTRICTIONS --- ui/src/modules/settings/general/graphql/queries.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/src/modules/settings/general/graphql/queries.ts b/ui/src/modules/settings/general/graphql/queries.ts index c83c413f81f..f9372a2c649 100644 --- a/ui/src/modules/settings/general/graphql/queries.ts +++ b/ui/src/modules/settings/general/graphql/queries.ts @@ -12,7 +12,6 @@ const configsGetEnv = ` query configsGetEnv { configsGetEnv { USE_BRAND_RESTRICTIONS - USE_CHAT_RESTRICTIONS } } `; From edc95b6a1caa7049e7ff416d482a7a765419f5b5 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Thu, 7 May 2020 09:40:11 -0300 Subject: [PATCH 009/135] removed USE_CHAT_RESTRICTIONS --- ui/src/modules/settings/general/graphql/queries.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/src/modules/settings/general/graphql/queries.ts b/ui/src/modules/settings/general/graphql/queries.ts index c83c413f81f..f9372a2c649 100644 --- a/ui/src/modules/settings/general/graphql/queries.ts +++ b/ui/src/modules/settings/general/graphql/queries.ts @@ -12,7 +12,6 @@ const configsGetEnv = ` query configsGetEnv { configsGetEnv { USE_BRAND_RESTRICTIONS - USE_CHAT_RESTRICTIONS } } `; From 81f817ebd392946496d7ca30d1ea86f00390c0b0 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Fri, 22 May 2020 20:49:02 -0300 Subject: [PATCH 010/135] Add status to message --- .../conversation/messages/SimpleMessage.tsx | 35 +++++++++++++++++++ ui/src/modules/inbox/graphql/messageFields.ts | 1 + ui/src/modules/inbox/types.ts | 1 + 3 files changed, 37 insertions(+) diff --git a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx index 15b4b55e735..282d077bff9 100644 --- a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx +++ b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx @@ -104,6 +104,40 @@ export default class SimpleMessage extends React.Component { ); } + renderStatus(status: string, isSameUser: boolean | undefined) { + if (!isSameUser) return null; + const styles = { + marginRight: -10 + }; + switch (status) { + case '1': + return ; + case '2': + return ( +
+ + +
+ ); + case '3': + return ( +
+ + +
+ ); + case '4': + return ( +
+ + +
+ ); + default: + return ; + } + } + renderContent(hasAttachment: boolean) { const { message, renderContent, isStaff } = this.props; @@ -156,6 +190,7 @@ export default class SimpleMessage extends React.Component { {this.renderContent(hasAttachment)} + {this.renderStatus(message.status, isSameUser)}
{dayjs(messageDate).format('LT')}
diff --git a/ui/src/modules/inbox/graphql/messageFields.ts b/ui/src/modules/inbox/graphql/messageFields.ts index 18058a3591e..e4d5d071feb 100755 --- a/ui/src/modules/inbox/graphql/messageFields.ts +++ b/ui/src/modules/inbox/graphql/messageFields.ts @@ -1,6 +1,7 @@ export default ` _id content + status attachments { url name diff --git a/ui/src/modules/inbox/types.ts b/ui/src/modules/inbox/types.ts index a6efa1c34ea..4fff08cf7ed 100644 --- a/ui/src/modules/inbox/types.ts +++ b/ui/src/modules/inbox/types.ts @@ -117,6 +117,7 @@ export interface IEngageData { export interface IMessage { content: string; + status: string; videoCallData?: IVideoCallData; attachments?: any; mentionedUserIds?: string[]; From 67cefe54d8e9facb35ce827d30dd5445d3ecc88f Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Fri, 26 Jun 2020 16:48:52 -0300 Subject: [PATCH 011/135] update message status --- .../conversationDetail/WorkArea.tsx | 54 +++++++++++++++++++ ui/src/modules/inbox/graphql/subscriptions.ts | 9 ++++ 2 files changed, 63 insertions(+) diff --git a/ui/src/modules/inbox/containers/conversationDetail/WorkArea.tsx b/ui/src/modules/inbox/containers/conversationDetail/WorkArea.tsx index 38ebd504937..a2a5f7c5d8d 100644 --- a/ui/src/modules/inbox/containers/conversationDetail/WorkArea.tsx +++ b/ui/src/modules/inbox/containers/conversationDetail/WorkArea.tsx @@ -131,6 +131,60 @@ class WorkArea extends React.Component { } }); + // Start update subscriptions ============= + this.prevMessageInsertedSubscription = messagesQuery.subscribeToMore({ + document: gql(subscriptions.conversationMessageUpdated), + variables: { _id: currentId }, + updateQuery: (prev, { subscriptionData }) => { + const message = subscriptionData.data.conversationMessageUpdated; + const kind = currentConversation.integration.kind; + + if (!prev) { + return; + } + + // Whenever mail thread receives a new message refetch for optimistic ui + if (kind === 'gmail' || kind.includes('nylas')) { + return messagesQuery.refetch(); + } + + // current user's message is being showed after insert message + // mutation. So to prevent from duplication we are ignoring current + // user's messages from subscription + const isMessenger = kind === 'messenger'; + + if (isMessenger && message.userId === currentUser._id) { + return; + } + + if (currentId !== this.props.currentId) { + return; + } + + const messages = prev.conversationMessages; + + // Sometimes it is becoming undefined because of left sidebar query + if (!messages) { + return; + } + + // check whether or not already inserted + const prevEntry = messages.find(m => m._id === message._id); + + if (prevEntry) { + return; + } + + // add new message to messages list + const next = { + ...prev, + conversationMessages: [...messages, message] + }; + + return next; + } + }); + this.prevTypingInfoSubscription = messagesQuery.subscribeToMore({ document: gql(subscriptions.conversationClientTypingStatusChanged), variables: { _id: currentId }, diff --git a/ui/src/modules/inbox/graphql/subscriptions.ts b/ui/src/modules/inbox/graphql/subscriptions.ts index 726fa1ce5d1..212a48fdd73 100755 --- a/ui/src/modules/inbox/graphql/subscriptions.ts +++ b/ui/src/modules/inbox/graphql/subscriptions.ts @@ -16,6 +16,14 @@ const conversationMessageInserted = ` } `; +const conversationMessageUpdated = ` + subscription conversationMessageUpdated($_id: String!) { + conversationMessageUpdated(_id: $_id) { + ${messageFields} + } + } +`; + const conversationClientMessageInserted = ` subscription conversationClientMessageInserted($userId: String!) { conversationClientMessageInserted(userId: $userId) { @@ -51,6 +59,7 @@ const customerConnectionChanged = ` export default { conversationChanged, conversationMessageInserted, + conversationMessageUpdated, conversationClientMessageInserted, conversationClientTypingStatusChanged, conversationExternalIntegrationMessageInserted, From bbfde118d67cc621f1e563e7cd6bf706fc9d18ee Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Fri, 26 Jun 2020 17:12:10 -0300 Subject: [PATCH 012/135] ajusted status --- .../conversation/messages/SimpleMessage.tsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx index 282d077bff9..aab83cd8adc 100644 --- a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx +++ b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx @@ -104,31 +104,37 @@ export default class SimpleMessage extends React.Component { ); } - renderStatus(status: string, isSameUser: boolean | undefined) { - if (!isSameUser) return null; + renderStatus(status: string, showStatus: boolean | undefined) { + if (!showStatus) return null; + + const containerStyles = { + display: 'flex' + }; + const styles = { marginRight: -10 }; + switch (status) { case '1': return ; case '2': return ( -
+
); case '3': return ( -
+
); case '4': return ( -
+
@@ -190,7 +196,7 @@ export default class SimpleMessage extends React.Component { {this.renderContent(hasAttachment)} - {this.renderStatus(message.status, isSameUser)} + {this.renderStatus(message.status, Boolean(message.userId))}
{dayjs(messageDate).format('LT')}
From df757d1b63514d0105fcbe0ab73392c521b55115 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Fri, 26 Jun 2020 17:12:23 -0300 Subject: [PATCH 013/135] format --- .../common/components/IntegrationIcon.tsx | 2 +- .../modules/segments/components/Sidebar.tsx | 9 +++++--- .../general/components/GeneralSettings.tsx | 21 ++++++++++++------- .../general/components/IntegrationConfigs.tsx | 8 +++++-- .../properties/components/GenerateField.tsx | 20 ++++++++++-------- 5 files changed, 37 insertions(+), 23 deletions(-) diff --git a/ui/src/modules/common/components/IntegrationIcon.tsx b/ui/src/modules/common/components/IntegrationIcon.tsx index 0fbb3a80646..8d6ffa04527 100644 --- a/ui/src/modules/common/components/IntegrationIcon.tsx +++ b/ui/src/modules/common/components/IntegrationIcon.tsx @@ -98,7 +98,7 @@ class IntegrationIcon extends React.PureComponent { case 'whatsapp': icon = 'whatsapp-fill'; break; - + case 'whatspro': icon = 'whatsapp'; break; diff --git a/ui/src/modules/segments/components/Sidebar.tsx b/ui/src/modules/segments/components/Sidebar.tsx index c9ad6b874ff..3ac5b3d7b77 100644 --- a/ui/src/modules/segments/components/Sidebar.tsx +++ b/ui/src/modules/segments/components/Sidebar.tsx @@ -37,10 +37,13 @@ function TagsSidebar() {
  • - - {('Learn how to create a segment')} + + {'Learn how to create a segment'} -
  • diff --git a/ui/src/modules/settings/general/components/GeneralSettings.tsx b/ui/src/modules/settings/general/components/GeneralSettings.tsx index 23819669f6c..a00b93061a4 100755 --- a/ui/src/modules/settings/general/components/GeneralSettings.tsx +++ b/ui/src/modules/settings/general/components/GeneralSettings.tsx @@ -233,7 +233,9 @@ class GeneralSettings extends React.Component { href="https://docs.erxes.io/administrator/system-config#google-cloud-storage" rel="noopener noreferrer" > - {__('Learn how to create or find your Google Cloud Storage bucket')} + {__( + 'Learn how to create or find your Google Cloud Storage bucket' + )} @@ -265,13 +267,17 @@ class GeneralSettings extends React.Component { -

    {__('In this field, the AWS SES configuration is dedicated to providing transaction emails.')}

    +

    + {__( + 'In this field, the AWS SES configuration is dedicated to providing transaction emails.' + )} +

    - {__("Learn how to set Amazon SES variables")} + {__('Learn how to set Amazon SES variables')}
    {this.renderItem('AWS_SES_ACCESS_KEY_ID')} @@ -281,13 +287,13 @@ class GeneralSettings extends React.Component {
    - + - {__("Learn how to set Google variables")} + > + {__('Learn how to set Google variables')} {this.renderItem('GOOGLE_PROJECT_ID')} @@ -317,14 +323,13 @@ class GeneralSettings extends React.Component { - {__('Learn the case of custom email service')} - {this.renderItem('MAIL_SERVICE')} {this.renderItem('MAIL_PORT')} diff --git a/ui/src/modules/settings/general/components/IntegrationConfigs.tsx b/ui/src/modules/settings/general/components/IntegrationConfigs.tsx index 724d6b9ffcf..d321f320e25 100644 --- a/ui/src/modules/settings/general/components/IntegrationConfigs.tsx +++ b/ui/src/modules/settings/general/components/IntegrationConfigs.tsx @@ -84,7 +84,11 @@ class IntegrationConfigs extends React.Component { - + {__('Learn how to set Facebook Integration Variables')} @@ -137,7 +141,7 @@ class IntegrationConfigs extends React.Component { - + { attrs.onChange = val => { this.setState({ value: val }); this.onChange(val, val); - } - - return + }; + + return ( + + ); } if (validation === 'number') { From 99f44aa9c1dde4c21c3d6148909215ef5e48fc31 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Fri, 26 Jun 2020 17:28:18 -0300 Subject: [PATCH 014/135] improves status just to whatspro --- ui/.prettierrc | 3 +++ .../workarea/conversation/Conversation.tsx | 11 ++++++++--- .../workarea/conversation/messages/Message.tsx | 4 +++- .../workarea/conversation/messages/SimpleMessage.tsx | 9 +++++---- 4 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 ui/.prettierrc diff --git a/ui/.prettierrc b/ui/.prettierrc new file mode 100644 index 00000000000..544138be456 --- /dev/null +++ b/ui/.prettierrc @@ -0,0 +1,3 @@ +{ + "singleQuote": true +} diff --git a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/Conversation.tsx b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/Conversation.tsx index b9b2f2b458f..6e9f0433625 100755 --- a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/Conversation.tsx +++ b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/Conversation.tsx @@ -27,7 +27,11 @@ const Wrapper = styled.div` `; class Conversation extends React.Component { - renderMessages(messages: IMessage[], conversationFirstMessage: IMessage) { + renderMessages( + messages: IMessage[], + conversationFirstMessage: IMessage, + kind: string + ) { const rows: React.ReactNode[] = []; let tempId; @@ -43,6 +47,7 @@ class Conversation extends React.Component { conversationFirstMessage={conversationFirstMessage} message={message} key={message._id} + kind={kind} /> ); @@ -82,12 +87,12 @@ class Conversation extends React.Component { return ( <> - {this.renderMessages(messages, firstMessage)} + {this.renderMessages(messages, firstMessage, kind)} ); } - return this.renderMessages(messages, firstMessage); + return this.renderMessages(messages, firstMessage, kind); } render() { diff --git a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/Message.tsx b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/Message.tsx index 02338a93107..0bf0236e0a5 100755 --- a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/Message.tsx +++ b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/Message.tsx @@ -8,10 +8,11 @@ type Props = { message: IMessage; isSameUser: boolean; conversationFirstMessage?: IMessage; + kind: string; }; function Message(props: Props) { - const { message, isSameUser } = props; + const { message, isSameUser, kind } = props; if (message.formWidgetData) { return ; @@ -26,6 +27,7 @@ function Message(props: Props) { message={message} isStaff={message.userId ? true : false} isSameUser={isSameUser} + kind={kind} /> ); } diff --git a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx index aab83cd8adc..38f11a7b0dd 100644 --- a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx +++ b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx @@ -26,6 +26,7 @@ type Props = { isStaff: boolean; isSameUser?: boolean; renderContent?: () => React.ReactNode; + kind: string; }; export default class SimpleMessage extends React.Component { @@ -104,8 +105,8 @@ export default class SimpleMessage extends React.Component { ); } - renderStatus(status: string, showStatus: boolean | undefined) { - if (!showStatus) return null; + renderStatus(status: string, showStatus: boolean | undefined, kind: string) { + if (!showStatus || kind !== 'whatspro') return null; const containerStyles = { display: 'flex' @@ -176,7 +177,7 @@ export default class SimpleMessage extends React.Component { } render() { - const { message, isStaff, isSameUser } = this.props; + const { message, isStaff, isSameUser, kind } = this.props; const messageDate = message.createdAt; const hasAttachment = message.attachments && message.attachments.length > 0; @@ -196,7 +197,7 @@ export default class SimpleMessage extends React.Component { {this.renderContent(hasAttachment)} - {this.renderStatus(message.status, Boolean(message.userId))} + {this.renderStatus(message.status, Boolean(message.userId), kind)}
    {dayjs(messageDate).format('LT')}
    From f49ca262fba713c095e642b8fc6d8077fea0a52e Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Sun, 28 Jun 2020 10:38:36 -0300 Subject: [PATCH 015/135] fix missing prop kind --- ui/src/modules/activityLogs/components/items/Conversation.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/modules/activityLogs/components/items/Conversation.tsx b/ui/src/modules/activityLogs/components/items/Conversation.tsx index 9c1d54fd04b..c2378e9b129 100644 --- a/ui/src/modules/activityLogs/components/items/Conversation.tsx +++ b/ui/src/modules/activityLogs/components/items/Conversation.tsx @@ -106,6 +106,7 @@ class Conversation extends React.Component { rows.push( Date: Sun, 28 Jun 2020 11:33:44 -0300 Subject: [PATCH 016/135] fix missing kind props --- .../workarea/facebook/FacebookConversation.tsx | 1 + .../conversationDetail/workarea/mail/MailConversation.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/ui/src/modules/inbox/components/conversationDetail/workarea/facebook/FacebookConversation.tsx b/ui/src/modules/inbox/components/conversationDetail/workarea/facebook/FacebookConversation.tsx index 593a123ab1a..1bf49ce1a54 100644 --- a/ui/src/modules/inbox/components/conversationDetail/workarea/facebook/FacebookConversation.tsx +++ b/ui/src/modules/inbox/components/conversationDetail/workarea/facebook/FacebookConversation.tsx @@ -97,6 +97,7 @@ export default class FacebookConversation extends React.Component { message={message} isStaff={!message.customerId} key={message._id} + kind={'facebook'} /> ); }); diff --git a/ui/src/modules/inbox/components/conversationDetail/workarea/mail/MailConversation.tsx b/ui/src/modules/inbox/components/conversationDetail/workarea/mail/MailConversation.tsx index 323e5d759c7..dddbd8b5551 100644 --- a/ui/src/modules/inbox/components/conversationDetail/workarea/mail/MailConversation.tsx +++ b/ui/src/modules/inbox/components/conversationDetail/workarea/mail/MailConversation.tsx @@ -29,6 +29,7 @@ class MailConversation extends React.Component { key={message._id} message={message} isStaff={!message.customerId} + kind={kind} /> ); } From 7c188ed25570bd94ce53563cab3a77df4fe47856 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Mon, 20 Jul 2020 20:39:12 -0300 Subject: [PATCH 017/135] add docker file --- ui/dockerfile | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 ui/dockerfile diff --git a/ui/dockerfile b/ui/dockerfile new file mode 100644 index 00000000000..e442d2534ab --- /dev/null +++ b/ui/dockerfile @@ -0,0 +1,30 @@ +FROM node:12.16.3-slim + +ARG DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && \ + apt-get install -y \ + git nano && \ + rm -rf /var/lib/apt/lists/* + +WORKDIR /erxes + +#RUN chown -R node:node /erxes + +COPY --chown=node:node . /erxes + +#USER node + +RUN yarn + +RUN yarn build + +RUN yarn global add serve + +RUN chown -R node:node /erxes + +USER node + +EXPOSE 3000 + +ENTRYPOINT [ "serve", "-s", "build", "-l", "3000" ] From bd2c02184ad52e627bb1c62e7990fd2cc60e1a90 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Wed, 22 Jul 2020 17:22:12 -0300 Subject: [PATCH 018/135] release --- ui/{dockerfile => Dockerfile} | 4 ---- widgets/Dockerfile | 29 ++++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 9 deletions(-) rename ui/{dockerfile => Dockerfile} (89%) diff --git a/ui/dockerfile b/ui/Dockerfile similarity index 89% rename from ui/dockerfile rename to ui/Dockerfile index e442d2534ab..53a58beaa03 100644 --- a/ui/dockerfile +++ b/ui/Dockerfile @@ -9,12 +9,8 @@ RUN apt-get update && \ WORKDIR /erxes -#RUN chown -R node:node /erxes - COPY --chown=node:node . /erxes -#USER node - RUN yarn RUN yarn build diff --git a/widgets/Dockerfile b/widgets/Dockerfile index a955606aee9..ef765a120e6 100644 --- a/widgets/Dockerfile +++ b/widgets/Dockerfile @@ -1,7 +1,26 @@ -FROM node:12.16-slim -WORKDIR /erxes-widgets/ -RUN chown -R node:node /erxes-widgets -COPY --chown=node:node . /erxes-widgets +FROM node:12.16.3-slim + +ARG DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && \ + apt-get install -y \ + git nano && \ + rm -rf /var/lib/apt/lists/* + +WORKDIR /erxes + +COPY --chown=node:node . /erxes + +RUN yarn + +RUN yarn build + +RUN yarn global add serve + +RUN chown -R node:node /erxes + USER node + EXPOSE 3200 -ENTRYPOINT [ "node", "--max_old_space_size=8192", "dist" ] + +ENTRYPOINT [ "node", "--max_old_space_size=8192", "dist" ] \ No newline at end of file From 6b5bc230203fff7b5837a35041ad47ab212058a3 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Wed, 22 Jul 2020 18:01:03 -0300 Subject: [PATCH 019/135] release --- widgets/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/widgets/Dockerfile b/widgets/Dockerfile index ef765a120e6..76282ada1b0 100644 --- a/widgets/Dockerfile +++ b/widgets/Dockerfile @@ -11,16 +11,16 @@ WORKDIR /erxes COPY --chown=node:node . /erxes +RUN chown -R node:node /erxes + +USER node + RUN yarn RUN yarn build RUN yarn global add serve -RUN chown -R node:node /erxes - -USER node - EXPOSE 3200 ENTRYPOINT [ "node", "--max_old_space_size=8192", "dist" ] \ No newline at end of file From 19c059121df77f35415fd9a3e7b236911e41c318 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Wed, 22 Jul 2020 18:49:06 -0300 Subject: [PATCH 020/135] release --- widgets/.dockerignore | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/widgets/.dockerignore b/widgets/.dockerignore index c34250a8565..33678540ca6 100644 --- a/widgets/.dockerignore +++ b/widgets/.dockerignore @@ -1,6 +1,3 @@ -client -scripts -server *.yml .env* .git* @@ -8,6 +5,4 @@ server .snyk Dockerfile* *.tar.gz -webpack*.js -package*.json -tsconfig*.json + From 0ec3288263e27d098ee08e15c99704131ed94c73 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Sun, 22 Nov 2020 10:18:13 -0300 Subject: [PATCH 021/135] fix generate version issue --- ui/Dockerfile => Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename ui/Dockerfile => Dockerfile (86%) diff --git a/ui/Dockerfile b/Dockerfile similarity index 86% rename from ui/Dockerfile rename to Dockerfile index 53a58beaa03..1b78a1f7dbd 100644 --- a/ui/Dockerfile +++ b/Dockerfile @@ -11,13 +11,15 @@ WORKDIR /erxes COPY --chown=node:node . /erxes +WORKDIR /erxes/ui + RUN yarn RUN yarn build RUN yarn global add serve -RUN chown -R node:node /erxes +RUN chown -R node:node /erxes/ui USER node From 34a4db9ef49ef3431b6e9196695219195e77d974 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Wed, 13 Jan 2021 21:11:37 -0300 Subject: [PATCH 022/135] locate improviment --- ui/src/locales/ar.json | 2 +- ui/src/locales/bn.json | 2 +- ui/src/locales/cs.json | 2 +- ui/src/locales/de.json | 2 +- ui/src/locales/es.json | 2 +- ui/src/locales/fa_IR.json | 2 +- ui/src/locales/fr.json | 2 +- ui/src/locales/hi.json | 2 +- ui/src/locales/id_ID.json | 2 +- ui/src/locales/it.json | 2 +- ui/src/locales/ja.json | 2 +- ui/src/locales/jv.json | 2 +- ui/src/locales/kk.json | 2 +- ui/src/locales/ko.json | 2 +- ui/src/locales/mn.json | 2 +- ui/src/locales/mr.json | 2 +- ui/src/locales/nl.json | 2 +- ui/src/locales/pa.json | 2 +- ui/src/locales/pl_PL.json | 2 +- ui/src/locales/pt-br.json | 39 +++++++++++-------- ui/src/locales/pt_BR.json | 2 +- ui/src/locales/ru.json | 2 +- ui/src/locales/sq.json | 2 +- ui/src/locales/ta.json | 2 +- ui/src/locales/te.json | 2 +- ui/src/locales/tr_TR.json | 2 +- ui/src/locales/uk_UA.json | 2 +- ui/src/locales/ur_PK.json | 2 +- ui/src/locales/vi.json | 2 +- ui/src/locales/yi.json | 2 +- ui/src/locales/zh-cn.json | 2 +- ui/src/locales/zh_CN.json | 2 +- ui/src/modules/inbox/components/Inbox.tsx | 10 ++--- .../inbox/components/leftSidebar/Sidebar.tsx | 2 +- 34 files changed, 59 insertions(+), 54 deletions(-) diff --git a/ui/src/locales/ar.json b/ui/src/locales/ar.json index 6e0c449f337..95519d8e909 100644 --- a/ui/src/locales/ar.json +++ b/ui/src/locales/ar.json @@ -287,7 +287,7 @@ "Sub segment of": "الجزء الفرعي من", "Color": "اللون", "Filters": "مرشحات", - "User(s) will recieve this message": "سوف يستلم المستخدم / المستخدمين هذه الرسالة", + "User(s) will receive this message": "سوف يستلم المستخدم / المستخدمين هذه الرسالة", "Color code": "رمز اللون", "Engage Message": "إشراك الرسالة", "Item counts": "التهم البند", diff --git a/ui/src/locales/bn.json b/ui/src/locales/bn.json index c62d097e63c..73eecb57f2f 100644 --- a/ui/src/locales/bn.json +++ b/ui/src/locales/bn.json @@ -287,7 +287,7 @@ "Sub segment of": "উপ বিভাগ", "Color": "রঙ", "Filters": "ফিল্টার", - "User(s) will recieve this message": "ব্যবহারকারী (গুলি) এই বার্তাটি গ্রহণ করবে", + "User(s) will receive this message": "ব্যবহারকারী (গুলি) এই বার্তাটি গ্রহণ করবে", "Color code": "রঙের কোড", "Engage Message": "বার্তা নিযুক্ত করুন", "Item counts": "আইটেম গণনা", diff --git a/ui/src/locales/cs.json b/ui/src/locales/cs.json index 13f49edd97d..23eacf457fe 100644 --- a/ui/src/locales/cs.json +++ b/ui/src/locales/cs.json @@ -287,7 +287,7 @@ "Sub segment of": "Dílčí segment", "Color": "Barva", "Filters": "Filtry", - "User(s) will recieve this message": "Uživatel (y) obdrží tuto zprávu", + "User(s) will receive this message": "Uživatel (y) obdrží tuto zprávu", "Color code": "Barevný kód", "Engage Message": "Zapojte zprávu", "Item counts": "Položka se počítá", diff --git a/ui/src/locales/de.json b/ui/src/locales/de.json index 48651035573..a66e17e2db3 100644 --- a/ui/src/locales/de.json +++ b/ui/src/locales/de.json @@ -278,7 +278,7 @@ "Sub segment of": "Untersegment von", "Color": "Farbe", "Filters": "Filter", - "User(s) will recieve this message": "Benutzer erhalten diese Nachricht", + "User(s) will receive this message": "Benutzer erhalten diese Nachricht", "Color code": "Farbcode", "Engage Message": "Nachricht einleiten", "Item counts": "Artikelanzahl", diff --git a/ui/src/locales/es.json b/ui/src/locales/es.json index 48f7bdd3d15..0fd24a061a0 100644 --- a/ui/src/locales/es.json +++ b/ui/src/locales/es.json @@ -46,7 +46,7 @@ "Sub segment of": "Sub segmento de", "Color": "Color", "Filters": "Filtros", - "User(s) will recieve this message": "El (Los) usuario(s) recibirán este mensaje", + "User(s) will receive this message": "El (Los) usuario(s) recibirán este mensaje", "Color code": "Código de color", "Engage Message": "Mensaje de compromiso", "Item counts": "Item counts", diff --git a/ui/src/locales/fa_IR.json b/ui/src/locales/fa_IR.json index 057ae4614b3..61cebab64d4 100644 --- a/ui/src/locales/fa_IR.json +++ b/ui/src/locales/fa_IR.json @@ -287,7 +287,7 @@ "Sub segment of": "زیر بخش از", "Color": "رنگ", "Filters": "فیلترها", - "User(s) will recieve this message": "کاربر (ها) این پیام را دریافت می کنند", + "User(s) will receive this message": "کاربر (ها) این پیام را دریافت می کنند", "Color code": "کد رنگ", "Engage Message": "پیام نامزدی", "Item counts": "تعداد موارد", diff --git a/ui/src/locales/fr.json b/ui/src/locales/fr.json index c56c9acc3fe..21d12cc4dc3 100644 --- a/ui/src/locales/fr.json +++ b/ui/src/locales/fr.json @@ -277,7 +277,7 @@ "Sub segment of": "Sous-segment de", "Color": "Couleur", "Filters": "Filtres", - "User(s) will recieve this message": "Les utilisateurs recevront ce message", + "User(s) will receive this message": "Les utilisateurs recevront ce message", "Color code": "Code couleur", "Engage Message": "Message d'engagement", "Item counts": "Nombre d'items", diff --git a/ui/src/locales/hi.json b/ui/src/locales/hi.json index 06534424e3e..4cf6033ad13 100644 --- a/ui/src/locales/hi.json +++ b/ui/src/locales/hi.json @@ -279,7 +279,7 @@ "Sub segment of": "उप खंड", "Color": "रंग", "Filters": "फिल्टर", - "User(s) will recieve this message": "उपयोगकर्ता (ओं) इस संदेश को प्राप्त होगा", + "User(s) will receive this message": "उपयोगकर्ता (ओं) इस संदेश को प्राप्त होगा", "Color code": "रंग संकेत", "Engage Message": "संदेश को शामिल", "Item counts": "आइटम गणना", diff --git a/ui/src/locales/id_ID.json b/ui/src/locales/id_ID.json index 80d9a3bfbf1..0667b15dba8 100644 --- a/ui/src/locales/id_ID.json +++ b/ui/src/locales/id_ID.json @@ -287,7 +287,7 @@ "Sub segment of": "Sub segmen", "Color": "Warna", "Filters": "Filter", - "User(s) will recieve this message": "Pengguna akan menerima pesan ini", + "User(s) will receive this message": "Pengguna akan menerima pesan ini", "Color code": "Kode warna", "Engage Message": "Libatkan Pesan", "Item counts": "Jumlah barang", diff --git a/ui/src/locales/it.json b/ui/src/locales/it.json index 6d9a9e2815b..7e994b3fd07 100644 --- a/ui/src/locales/it.json +++ b/ui/src/locales/it.json @@ -286,7 +286,7 @@ "Sub segment of": "Sub segmento di", "Color": "Colore", "Filters": "Filtri", - "User(s) will recieve this message": "User (s) riceverà questo messaggio", + "User(s) will receive this message": "User (s) riceverà questo messaggio", "Color code": "Colore del codice", "Engage Message": "Engage Messagge", "Item counts": "Conta voce", diff --git a/ui/src/locales/ja.json b/ui/src/locales/ja.json index 9a95b56af96..09b7ab71f79 100644 --- a/ui/src/locales/ja.json +++ b/ui/src/locales/ja.json @@ -278,7 +278,7 @@ "Sub segment of": "のサブセグメント", "Color": "色", "Filters": "フィルタ", - "User(s) will recieve this message": "ユーザー(複数可)は、このメッセージを受け取るします", + "User(s) will receive this message": "ユーザー(複数可)は、このメッセージを受け取るします", "Color code": "カラーコード", "Engage Message": "メッセージをエンゲージ", "Item counts": "アイテム数", diff --git a/ui/src/locales/jv.json b/ui/src/locales/jv.json index d0d9c55a59e..5db47cb09ce 100644 --- a/ui/src/locales/jv.json +++ b/ui/src/locales/jv.json @@ -287,7 +287,7 @@ "Sub segment of": "Sub bagean saka", "Color": "Werna", "Filters": "Saringan", - "User(s) will recieve this message": "Pangguna bakal nampa pesen iki", + "User(s) will receive this message": "Pangguna bakal nampa pesen iki", "Color code": "Kode warna", "Engage Message": "Nindakake pesen", "Item counts": "Item sing ngitung", diff --git a/ui/src/locales/kk.json b/ui/src/locales/kk.json index 5a34cb36faf..56248d74900 100644 --- a/ui/src/locales/kk.json +++ b/ui/src/locales/kk.json @@ -287,7 +287,7 @@ "Sub segment of": "Қосалқы сегмент", "Color": "Түсі", "Filters": "Сүзгілер", - "User(s) will recieve this message": "Пайдаланушы (лар) бұл хабарды алады", + "User(s) will receive this message": "Пайдаланушы (лар) бұл хабарды алады", "Color code": "Түс коды", "Engage Message": "Хабарламаны тарту", "Item counts": "Элемент есептеледі", diff --git a/ui/src/locales/ko.json b/ui/src/locales/ko.json index a79ab5a451f..9f206994423 100644 --- a/ui/src/locales/ko.json +++ b/ui/src/locales/ko.json @@ -278,7 +278,7 @@ "Sub segment of": "의 하위 세그먼트", "Color": "색깔", "Filters": "필터", - "User(s) will recieve this message": "사용자 (들)이 메시지를받을 것이다", + "User(s) will receive this message": "사용자 (들)이 메시지를받을 것이다", "Color code": "컬러 코드", "Engage Message": "메시지를 참여", "Item counts": "항목 수", diff --git a/ui/src/locales/mn.json b/ui/src/locales/mn.json index 8e8406652bd..3ba8944a3b3 100644 --- a/ui/src/locales/mn.json +++ b/ui/src/locales/mn.json @@ -286,7 +286,7 @@ "Sub segment of": "Дэд сегмент", "Color": "Өнгө", "Filters": "Шүүлтийн нөхцлүүд", - "User(s) will recieve this message": "Хэрэглэгч(д) энэхүү мессэжийг хүлээж авах болно", + "User(s) will receive this message": "Хэрэглэгч(д) энэхүү мессэжийг хүлээж авах болно", "Color code": "Өнгөний код", "Engage Message": "Маркетингийн зурвас", "Item counts": "Талбарын тоо", diff --git a/ui/src/locales/mr.json b/ui/src/locales/mr.json index 32d985870d2..23ff486dd02 100644 --- a/ui/src/locales/mr.json +++ b/ui/src/locales/mr.json @@ -287,7 +287,7 @@ "Sub segment of": "चा उपखंड", "Color": "रंग", "Filters": "फिल्टर", - "User(s) will recieve this message": "वापरकर्ता संदेश पाठवेल", + "User(s) will receive this message": "वापरकर्ता संदेश पाठवेल", "Color code": "रंग कोड", "Engage Message": "संदेश गुंतवा", "Item counts": "आयटम गणना", diff --git a/ui/src/locales/nl.json b/ui/src/locales/nl.json index 1e354caae8a..36f815ed7a1 100644 --- a/ui/src/locales/nl.json +++ b/ui/src/locales/nl.json @@ -287,7 +287,7 @@ "Sub segment of": "Subsegment van", "Color": "Kleur", "Filters": "Filters", - "User(s) will recieve this message": "Gebruiker (s) zullen dit bericht ontvangen", + "User(s) will receive this message": "Gebruiker (s) zullen dit bericht ontvangen", "Color code": "Kleurcode", "Engage Message": "Engage-bericht", "Item counts": "Item telt", diff --git a/ui/src/locales/pa.json b/ui/src/locales/pa.json index 80fe6b55e2c..0b57c02852b 100644 --- a/ui/src/locales/pa.json +++ b/ui/src/locales/pa.json @@ -287,7 +287,7 @@ "Sub segment of": "ਦਾ ਸਬ ਖੰਡ", "Color": "ਰੰਗ", "Filters": "ਫਿਲਟਰ", - "User(s) will recieve this message": "ਉਪਭੋਗਤਾ ਇਸ ਸੰਦੇਸ਼ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨਗੇ", + "User(s) will receive this message": "ਉਪਭੋਗਤਾ ਇਸ ਸੰਦੇਸ਼ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨਗੇ", "Color code": "ਰੰਗ ਕੋਡ", "Engage Message": "ਸੰਦੇਸ਼ ਸ਼ਾਮਲ ਕਰੋ", "Item counts": "ਆਈਟਮ ਦੀ ਗਿਣਤੀ", diff --git a/ui/src/locales/pl_PL.json b/ui/src/locales/pl_PL.json index ca4d0e17c27..f5c789b8ebb 100644 --- a/ui/src/locales/pl_PL.json +++ b/ui/src/locales/pl_PL.json @@ -287,7 +287,7 @@ "Sub segment of": "Podsegment", "Color": "Kolor", "Filters": "Filtry", - "User(s) will recieve this message": "Użytkownik (użytkownicy) otrzymają tę wiadomość", + "User(s) will receive this message": "Użytkownik (użytkownicy) otrzymają tę wiadomość", "Color code": "Kod koloru", "Engage Message": "Zaangażuj wiadomość", "Item counts": "Liczy się pozycja", diff --git a/ui/src/locales/pt-br.json b/ui/src/locales/pt-br.json index e18fc3e1049..1feb0e46314 100644 --- a/ui/src/locales/pt-br.json +++ b/ui/src/locales/pt-br.json @@ -30,7 +30,7 @@ "Customers": "Clientes", "Companies": "Empresas", "Engage": "Engajar", - "Insights": "Intuições", + "Insights": "Relatórios", "Knowledge Base": "Base de Conhecimento", "Settings": "Configurações", "Resolve": "Resolver", @@ -49,7 +49,7 @@ "Website": "Site", "Plan": "Plano", "About": "Sobre", - "Discard": "Discartar", + "Discard": "Descartar", "Save": "Salvar", "Create response template": "Criar padrão de resposta", "Associate": "Associado", @@ -167,7 +167,7 @@ "Visitor auto": "Visitante automático", "Manual": "Manual", "Delivered to a user s email inbox": "Entregue para o e-mail do usuário", - "Customize with your own templates": "Pesonalize com seus próprios modelos", + "Customize with your own templates": "Personalize com seus próprios modelos", "Delivered inside your app": "Entregue dentro do seu aplicativo", "Reach active users": "Alcançar usuários ativos", "Channel": "Canal", @@ -201,7 +201,6 @@ "Number": "Número", "Text:": "Texto:", "Description:": "Descrição:", - "This item is requried": "Esse item é obrigatório", "Preview": "Visualizar", "Column name": "Nome da coluna", "Visible": "Visível", @@ -253,7 +252,7 @@ "Add Category": "Adicionar Categoria", "Add Article": "Adicionar Artigo", "Customer engagement. REDEFINED.": "Envolvimento do cliente. REDEFINIDO.", - "erxes is an AI meets open source messaging platform for sales, marketing and support": "erxes é uma Inteligência Aritificial que atende a plataforma de mensagens de código aberto para vendas, marketing e suporte", + "erxes is an AI meets open source messaging platform for sales, marketing and support": "erxes é uma Inteligência Artificial que atende a plataforma de mensagens de código aberto para vendas, marketing e suporte", "404. This page is not found.": "404. Página não encontrada.", "erxes is an open-source messaging platform for customer success": "erxes é uma plataforma de mensagens de código aberto para o sucesso do cliente", "Notification settings": "Configuração de notificações", @@ -277,7 +276,7 @@ "Sub segment of": "Segmento secundário de", "Color": "Cor", "Filters": "Filtros", - "User(s) will recieve this message": "O(s) usuário(s) irão receber essa mensagem.", + "User(s) will receive this message": "O(s) usuário(s) irão receber essa mensagem.", "Color code": "Código de cor", "Engage Message": "Mensagem de engajamento", "Item counts": "Contador de itens", @@ -487,7 +486,7 @@ "Choose your tags": "Escolha suas marcações", "Manage tags": "Gerenciar marcações", "Edit Profile": "Editar perfil", - "Sign out": "Deslogar", + "Sign out": "Sair", "Last Updated By": "Última atualização por", "There is no channel": "Não há canal", "Facebook page": "Página do Facebook", @@ -610,7 +609,7 @@ "Choose a brand": "Escolha a marca", "Write a title": "Escreva o título", "Contact": "Contato", - "Created by": "Creado por", + "Created by": "Criado por", "Manage": "Administrar", "Dropdown": "Suspenso", "Slide-in Left": "Deslize para esquerda", @@ -638,7 +637,7 @@ "All customers imported successfully": "Todos os clientes foram importados com sucesso", "There aren't any imports": "Não há importações", "Successfully Removed all customers": "Todos os clientes removidos com sucesso", - "You can only import max 600 at a time": "Você pdoe importar no máximo 600 por vez", + "You can only import max 600 at a time": "Você pode importar no máximo 600 por vez", "Invalid import type": "Tipo de importação inválido", "Last updated": "Ultima atualização", "Filter by lead status": "Filtrar pelo status da Lead", @@ -754,14 +753,14 @@ "Oh dear! You have no imports": "Oh céus! Você não tem importações", "A strong customer engagement can help to further brand growth and loyalty": "Um forte envolvimento do cliente pode ajudar a aumentar o crescimento e a lealdade da marca", "Get started on your pipeline": "Comece seu pipeline", - "Connect to Facebook messages right from your Team Inbox": "Conecte-se às mensagens do Facebook diretamente da sua Caixa de entrada da equipe", - "Tweet back to your DMs right from your Team Inbox": "Tweet de volta para seus DMs diretamente da Caixa de entrada da equipe", + "Connect to Facebook messages right from your Team Inbox": "Conecte-se às mensagens do Facebook diretamente da sua Caixa de entrada", + "Tweet back to your DMs right from your Team Inbox": "Tweet de volta para seus DMs diretamente da Caixa de entrada", "Connect straight to your Gmail and get those emails going": "Conecte-se diretamente ao seu Gmail e receba esses e-mails", "Find your lead forms right here in your Widget": "Encontre seus formulários de lead aqui em ferramenta", "Get access to your Knowledge Base right in your Widget": "Tenha acesso à sua Base de Conhecimento diretamente em ferramenta", - "Soon you'll be able to connect Viber straight to your Team Inbox": "Em breve, você poderá conectar o Viber diretamente à sua caixa de entrada da equipe", - "Get a hold of your Whatsapp messages through your Team Inbox": "Receba suas mensagens do WhatsApp por meio da Caixa de entrada da equipe", - "Connect with Wechat and start messaging right from your Team Inbox": "Conecte-se ao Wechat e comece a enviar mensagens diretamente da sua caixa de entrada da equipe", + "Soon you'll be able to connect Viber straight to your Team Inbox": "Em breve, você poderá conectar o Viber diretamente à sua caixa de entrada", + "Get a hold of your Whatsapp messages through your Team Inbox": "Receba suas mensagens do WhatsApp por meio da Caixa de entrada", + "Connect with Wechat and start messaging right from your Team Inbox": "Conecte-se ao Wechat e comece a enviar mensagens diretamente da sua caixa de entrada", "Find feedback that has been gathered from various customer engagement channels.": "Encontre feedback que foi coletado de vários canais de envolvimento do cliente.", "A report on the total number of customer feedback responses given by team members.": "Um relatório sobre o número total de respostas de feedback do cliente fornecidas pelos membros da equipe.", "The average time a team member solved a problem based on customer feedback.": "O tempo médio que um membro da equipe resolveu um problema com base no feedback do cliente.", @@ -795,7 +794,7 @@ "Continue": "Continuar", "Create brand": "Criar marca", "Create your first live chat and in-app messaging Stay up to date with every single customer feedback for more meaningful interactions": "Crie seu primeiro bate-papo ao vivo e mensagens no aplicativo. Mantenha-se atualizado com todos os comentários dos clientes para interações mais significativas.", - "A channel gives a full view of all the brands and its applications all in one place You can see all in-coming messages in your team inbox": "Um canal oferece uma visão completa de todas as marcas e suas aplicações em um só lugar. Você pode ver todas as mensagens recebidas na caixa de entrada da equipe.", + "A channel gives a full view of all the brands and its applications all in one place You can see all in-coming messages in your team inbox": "Um canal oferece uma visão completa de todas as marcas e suas aplicações em um só lugar. Você pode ver todas as mensagens recebidas na caixa de entrada.", "Hooray and Congratulations! You've completed the initial setup!": "Viva e parabéns! Você concluiu a configuração inicial!", "Paste the code below before the body tag on every page you want erxes chat to appear": "Cole o código abaixo antes da marcação do corpo em todas as páginas que você deseja que o erxes chat apareça", "Choose messengers": "Escolha messengers", @@ -878,7 +877,7 @@ "Workflow": "Fluxo de trabalho", "Watch": "Assistir", "Watching": "Assistindo", - "Team Inbox": "Caixa de entrada da equipe", + "Team Inbox": "Caixa de entrada", "Public": "Público", "Private": "Privado", "default language": "idioma padrão", @@ -919,5 +918,11 @@ "There are": "Existem", "Paste the code below before the body tag on every page you want erxes lead to appear": "Cole o código abaixo antes da etiqueta do corpo em todas as páginas que você deseja que os erxes apareçam", "If your flow type is embedded paste the code below additionally that you want erxes lead to appear": "Se o seu tipo de fluxo estiver incorporado, cole o código abaixo adicionalmente, para que apareça o erxes", - "If your flow type is popup paste the code below additionally in your button": "Se o seu tipo de fluxo for pop-up, cole o código abaixo adicionalmente no seu botão" + "If your flow type is popup paste the code below additionally in your button": "Se o seu tipo de fluxo for pop-up, cole o código abaixo adicionalmente no seu botão", + "Send an Email": "Enviar um e-mail", + "Convert": "Converter", + "Convert to a deal": "Converter em acordo", + "Convert to a task": "Converter em tarefa", + "Convert to a ticket": "Converter em ticket", + "Resolve all": "Resolver todos" } diff --git a/ui/src/locales/pt_BR.json b/ui/src/locales/pt_BR.json index 7fad0c2deab..c051565d613 100644 --- a/ui/src/locales/pt_BR.json +++ b/ui/src/locales/pt_BR.json @@ -287,7 +287,7 @@ "Sub segment of": "Segmento secundário de", "Color": "Cor", "Filters": "Filtros", - "User(s) will recieve this message": "O(s) usuário(s) irão receber essa mensagem.", + "User(s) will receive this message": "O(s) usuário(s) irão receber essa mensagem.", "Color code": "Código de cor", "Engage Message": "Mensagem de engajamento", "Item counts": "Contador de itens", diff --git a/ui/src/locales/ru.json b/ui/src/locales/ru.json index d208023d10a..204cdb53971 100644 --- a/ui/src/locales/ru.json +++ b/ui/src/locales/ru.json @@ -278,7 +278,7 @@ "Sub segment of": "Суб сегмент", "Color": "цвет", "Filters": "фильтры", - "User(s) will recieve this message": "Пользователь (ы) Получать это сообщение", + "User(s) will receive this message": "Пользователь (ы) Получать это сообщение", "Color code": "Цветовой код", "Engage Message": "Engage сообщение", "Item counts": "количество элементов", diff --git a/ui/src/locales/sq.json b/ui/src/locales/sq.json index 3e91f8f7dcb..d190b3c2fdd 100644 --- a/ui/src/locales/sq.json +++ b/ui/src/locales/sq.json @@ -287,7 +287,7 @@ "Sub segment of": "Nënseksioni i", "Color": "Ngjyrë", "Filters": "Filters", - "User(s) will recieve this message": "Përdoruesi (et) do të marrin këtë mesazh", + "User(s) will receive this message": "Përdoruesi (et) do të marrin këtë mesazh", "Color code": "Kodi i ngjyrave", "Engage Message": "Angazhoni mesazhin", "Item counts": "Numrat e sendeve", diff --git a/ui/src/locales/ta.json b/ui/src/locales/ta.json index 4d4b3b2cad5..dc230b3b5a8 100644 --- a/ui/src/locales/ta.json +++ b/ui/src/locales/ta.json @@ -287,7 +287,7 @@ "Sub segment of": "இன் துணை பிரிவு", "Color": "நிறம்", "Filters": "வடிகட்டிகள்", - "User(s) will recieve this message": "பயனர் (கள்) இந்த செய்தியைப் பெறுவார்கள்", + "User(s) will receive this message": "பயனர் (கள்) இந்த செய்தியைப் பெறுவார்கள்", "Color code": "வண்ண குறியீடு", "Engage Message": "செய்தியில் ஈடுபடுங்கள்", "Item counts": "உருப்படி எண்ணிக்கை", diff --git a/ui/src/locales/te.json b/ui/src/locales/te.json index 0bda4c334ae..afdf1567cf3 100644 --- a/ui/src/locales/te.json +++ b/ui/src/locales/te.json @@ -287,7 +287,7 @@ "Sub segment of": "యొక్క ఉప విభాగం", "Color": "రంగు", "Filters": "వడపోతలు", - "User(s) will recieve this message": "వినియోగదారు (లు) ఈ సందేశాన్ని స్వీకరిస్తారు", + "User(s) will receive this message": "వినియోగదారు (లు) ఈ సందేశాన్ని స్వీకరిస్తారు", "Color code": "రంగు కోడ్", "Engage Message": "సందేశంలో పాల్గొనండి", "Item counts": "అంశం గణనలు", diff --git a/ui/src/locales/tr_TR.json b/ui/src/locales/tr_TR.json index f9a83b6eedf..2db8a7ef729 100644 --- a/ui/src/locales/tr_TR.json +++ b/ui/src/locales/tr_TR.json @@ -287,7 +287,7 @@ "Sub segment of": "Alt bölümü", "Color": "Renk", "Filters": "Filtreler", - "User(s) will recieve this message": "Kullanıcılar bu mesajı alacak", + "User(s) will receive this message": "Kullanıcılar bu mesajı alacak", "Color code": "Renk kodu", "Engage Message": "İletiyi meşgul et", "Item counts": "Ürün sayıları", diff --git a/ui/src/locales/uk_UA.json b/ui/src/locales/uk_UA.json index 2240a9c45f1..41ebde394ab 100644 --- a/ui/src/locales/uk_UA.json +++ b/ui/src/locales/uk_UA.json @@ -287,7 +287,7 @@ "Sub segment of": "Підсегмент", "Color": "Колір", "Filters": "Фільтри", - "User(s) will recieve this message": "Користувач (и) отримає це повідомлення", + "User(s) will receive this message": "Користувач (и) отримає це повідомлення", "Color code": "Код кольору", "Engage Message": "Залучити повідомлення", "Item counts": "Кількість елементів", diff --git a/ui/src/locales/ur_PK.json b/ui/src/locales/ur_PK.json index e661141352f..1c7a4c5d526 100644 --- a/ui/src/locales/ur_PK.json +++ b/ui/src/locales/ur_PK.json @@ -287,7 +287,7 @@ "Sub segment of": "کا ذیلی طبقہ", "Color": "رنگ", "Filters": "فلٹرز", - "User(s) will recieve this message": "صارف (پیغامات) اس پیغام کو حاصل کریں گے", + "User(s) will receive this message": "صارف (پیغامات) اس پیغام کو حاصل کریں گے", "Color code": "رنگین کوڈ", "Engage Message": "مشغول پیغام", "Item counts": "آئٹم گنتی", diff --git a/ui/src/locales/vi.json b/ui/src/locales/vi.json index 49da58ac5a3..4d09f2d97e7 100644 --- a/ui/src/locales/vi.json +++ b/ui/src/locales/vi.json @@ -279,7 +279,7 @@ "Sub segment of": "phân khúc sub của", "Color": "Màu", "Filters": "bộ lọc", - "User(s) will recieve this message": "Người dùng (s) sẽ nhận được thông điệp này", + "User(s) will receive this message": "Người dùng (s) sẽ nhận được thông điệp này", "Color code": "mã màu", "Engage Message": "tham gia nhắn", "Item counts": "số lượng mục", diff --git a/ui/src/locales/yi.json b/ui/src/locales/yi.json index 4bc843b69e3..51261a4ab2a 100644 --- a/ui/src/locales/yi.json +++ b/ui/src/locales/yi.json @@ -279,7 +279,7 @@ "Sub segment of": "Sub segmen", "Color": "Warna", "Filters": "filter", - "User(s) will recieve this message": "Pengguna (s) akan menerima pesan ini", + "User(s) will receive this message": "Pengguna (s) akan menerima pesan ini", "Color code": "Kode warna", "Engage Message": "terlibat Pesan", "Item counts": "jumlah item", diff --git a/ui/src/locales/zh-cn.json b/ui/src/locales/zh-cn.json index 0111e52d22f..2bf5b9cb1c1 100644 --- a/ui/src/locales/zh-cn.json +++ b/ui/src/locales/zh-cn.json @@ -278,7 +278,7 @@ "Sub segment of": "子段", "Color": "颜色", "Filters": "过滤器", - "User(s) will recieve this message": "(多个)用户将收到此消息", + "User(s) will receive this message": "(多个)用户将收到此消息", "Color code": "色标", "Engage Message": "从事信息", "Item counts": "项目计数", diff --git a/ui/src/locales/zh_CN.json b/ui/src/locales/zh_CN.json index 1355042494b..40810c4e36a 100644 --- a/ui/src/locales/zh_CN.json +++ b/ui/src/locales/zh_CN.json @@ -287,7 +287,7 @@ "Sub segment of": "子段", "Color": "颜色", "Filters": "过滤器", - "User(s) will recieve this message": "(多个)用户将收到此消息", + "User(s) will receive this message": "(多个)用户将收到此消息", "Color code": "色标", "Engage Message": "从事信息", "Item counts": "项目计数", diff --git a/ui/src/modules/inbox/components/Inbox.tsx b/ui/src/modules/inbox/components/Inbox.tsx index 2fbe16fcf61..b85a15057d4 100644 --- a/ui/src/modules/inbox/components/Inbox.tsx +++ b/ui/src/modules/inbox/components/Inbox.tsx @@ -1,7 +1,7 @@ import { IUser } from 'modules/auth/types'; import asyncComponent from 'modules/common/components/AsyncComponent'; import ModalTrigger from 'modules/common/components/ModalTrigger'; -import { can } from 'modules/common/utils'; +import { can, __ } from 'modules/common/utils'; import Header from 'modules/layout/components/Header'; import { Contents, HeightedWrapper } from 'modules/layout/styles'; import MailForm from 'modules/settings/integrations/containers/mail/MailForm'; @@ -34,12 +34,12 @@ function Inbox({ currentConversationId, queryParams, currentUser }: Props) { } const content = () => ; - + const sendEmail = ( Send an Email} + title={__('Send an Email')} + trigger={{__('Send an Email')}} size="lg" content={content} paddingContent="less-padding" @@ -50,7 +50,7 @@ function Inbox({ currentConversationId, queryParams, currentUser }: Props) { return (
    { btnStyle="simple" onClick={this.props.resolveAll} > - Resolve all + {__('Resolve all')} )} From ef561febe83532def202fb3d1d7dd27e6e9d3117 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Fri, 15 Jan 2021 20:40:58 -0300 Subject: [PATCH 023/135] add error status --- ui/src/locales/pt-br.json | 4 +++- .../workarea/conversation/messages/SimpleMessage.tsx | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ui/src/locales/pt-br.json b/ui/src/locales/pt-br.json index 1feb0e46314..d437a4a242c 100644 --- a/ui/src/locales/pt-br.json +++ b/ui/src/locales/pt-br.json @@ -924,5 +924,7 @@ "Convert to a deal": "Converter em acordo", "Convert to a task": "Converter em tarefa", "Convert to a ticket": "Converter em ticket", - "Resolve all": "Resolver todos" + "Resolve all": "Resolver todos", + "Error": "Erro", + "Invalid number": "Número inválido" } diff --git a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx index 192a9ec3f41..3bfeea4be90 100644 --- a/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx +++ b/ui/src/modules/inbox/components/conversationDetail/workarea/conversation/messages/SimpleMessage.tsx @@ -140,6 +140,10 @@ export default class SimpleMessage extends React.Component {
    ); + case '98': + return
    {__('Error')}
    ; + case '99': + return
    {__('Invalid number')}
    ; default: return ; } @@ -201,7 +205,8 @@ export default class SimpleMessage extends React.Component { {this.renderContent(hasAttachment)} - {this.renderStatus(message.status, Boolean(message.userId), kind)} + {!message.internal && + this.renderStatus(message.status, Boolean(message.userId), kind)}
    {dayjs(messageDate).format('LT')}
    From a1d520a611369bbef9f4f8bcde617db15c1a9e50 Mon Sep 17 00:00:00 2001 From: Gabriel-Tomaz Date: Tue, 14 Sep 2021 13:40:30 -0300 Subject: [PATCH 024/135] traduzindo itens do moudule activityLogs --- ui/src/locales/en.json | 6 +++++- ui/src/locales/pt-br.json | 5 ++++- .../activityLogs/containers/items/boardItems/Task.tsx | 7 ++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ui/src/locales/en.json b/ui/src/locales/en.json index 5e152f8ba42..a952332e2ca 100644 --- a/ui/src/locales/en.json +++ b/ui/src/locales/en.json @@ -1545,5 +1545,9 @@ "Social media": "Social media", "Surveys and Feedback": "Surveys and Feedback", "There aren’t any integrations at the moment": "There aren’t any integrations at the moment", - "Submit once": "Submit once" + "Submit once": "Submit once", + "You successfully updated a task.": "You successfully updated a task.", + "You successfully deleted a task.": "You successfully deleted a task.", + "You do not have permission to view this task": "You do not have permission to view this task" + } diff --git a/ui/src/locales/pt-br.json b/ui/src/locales/pt-br.json index d437a4a242c..a9d955ac792 100644 --- a/ui/src/locales/pt-br.json +++ b/ui/src/locales/pt-br.json @@ -926,5 +926,8 @@ "Convert to a ticket": "Converter em ticket", "Resolve all": "Resolver todos", "Error": "Erro", - "Invalid number": "Número inválido" + "Invalid number": "Número inválido", + "You successfully updated a task.": "Você atualizou uma tarefa com sucesso.", + "You successfully deleted a task.": "Você excluiu uma tarefa com sucesso.", + "You do not have permission to view this task": "Você não tem permissão para ver esta tarefa" } diff --git a/ui/src/modules/activityLogs/containers/items/boardItems/Task.tsx b/ui/src/modules/activityLogs/containers/items/boardItems/Task.tsx index f9c8d2e604e..46301705dbe 100644 --- a/ui/src/modules/activityLogs/containers/items/boardItems/Task.tsx +++ b/ui/src/modules/activityLogs/containers/items/boardItems/Task.tsx @@ -10,6 +10,7 @@ import { } from 'modules/tasks/types'; import React from 'react'; import { graphql } from 'react-apollo'; +import { __ } from 'modules/common/utils'; type Props = { taskId: string; @@ -32,13 +33,13 @@ class FormContainer extends React.Component { const task = taskDetailsQuery.taskDetail; if (!task) { - return You do not have permission to view this task; + return {__("You do not have permission to view this task")}; } const save = (variables, callback) => { editMutation({ variables }) .then(() => { - Alert.success('You successfully updated a task.'); + Alert.success(__('You successfully updated a task.')); if (callback) { callback(); @@ -53,7 +54,7 @@ class FormContainer extends React.Component { confirm().then(() => removeMutation({ variables: { _id: taskId } }) .then(() => { - Alert.success('You successfully deleted a task.'); + Alert.success(__('You successfully deleted a task.')); }) .catch(error => { Alert.error(error.message); From bb2e5ca864dac43658cea69791c2f538d068435b Mon Sep 17 00:00:00 2001 From: Gabriel-Tomaz Date: Tue, 14 Sep 2021 15:07:40 -0300 Subject: [PATCH 025/135] traduzindo componentes do moudule activityLogs --- ui/src/locales/en.json | 30 +++++++++++++++++-- ui/src/locales/pt-br.json | 27 ++++++++++++++++- .../activityLogs/components/ActivityLogs.tsx | 2 +- .../components/items/ConvertLog.tsx | 4 +-- .../components/items/InternalNote.tsx | 6 ++-- .../components/items/MergedLog.tsx | 4 +-- .../components/items/SegmentLog.tsx | 3 +- .../components/items/boardItems/Task.tsx | 16 +++++----- .../items/checklist/ChecklistItem.tsx | 4 +-- .../items/checklist/ChecklistLog.tsx | 6 ++-- .../items/create/BoardItemCreate.tsx | 4 +-- .../items/create/CustomerCreate.tsx | 8 ++--- .../components/items/email/Email.tsx | 7 +++-- .../components/items/email/EngageEmail.tsx | 5 ++-- 14 files changed, 89 insertions(+), 37 deletions(-) diff --git a/ui/src/locales/en.json b/ui/src/locales/en.json index a952332e2ca..bcab1af8fbd 100644 --- a/ui/src/locales/en.json +++ b/ui/src/locales/en.json @@ -36,6 +36,7 @@ "Watching": "Watching", "Team Inbox": "Team Inbox", "Customers": "Customers", + "customers": "customers", "Companies": "Companies", "Engage": "Engage", "Insights": "Insights", @@ -477,7 +478,7 @@ "Delivered to a user s email inbox Customize with your own templates": "Delivered to a user s email inbox Customize with your own templates", "email": "email", "Create segment": "Create segment", - "customers": "customers", + "companies": "companies", "has any value": "has any value", "is unknown": "is unknown", "is not": "is not", @@ -1245,6 +1246,7 @@ "Telnyx phone number": "Telnyx phone number", "Telnyx messaging profile id": "Telnyx messaging profile id", "To": "To", + "to": "to", "Write your content": "Write your content", "Your team members are the bolts and nuts of your business. Make sure all the parts are set and ready to go. Here you can see a list of all your team members, you can categorize them into groups, welcome new members and edit their info": "Your team members are the bolts and nuts of your business. Make sure all the parts are set and ready to go. Here you can see a list of all your team members, you can categorize them into groups, welcome new members and edit their info", "Invite team members": "Invite team members", @@ -1307,6 +1309,7 @@ "Call Pro": "Call Pro", "Connect your call pro phone number": "Connect your call pro phone number", "Chatfuel": "Chatfuel", + "chatfuel": "chatfuel", "Connect your chatfuel account": "Connect your chatfuel account", "Show your responsive website right in your Widget": "Show your responsive website right in your Widget", "WhatsApp": "WhatsApp", @@ -1548,6 +1551,27 @@ "Submit once": "Submit once", "You successfully updated a task.": "You successfully updated a task.", "You successfully deleted a task.": "You successfully deleted a task.", - "You do not have permission to view this task": "You do not have permission to view this task" - + "You do not have permission to view this task": "You do not have permission to view this task", + "Set reminder": "Set reminder", + "Due date": "Due date", + "Jump to task": "Jump to task", + "Undefined": "Undefined", + "deleted": "deleted", + "checked": "checked", + "created": "created", + "unchecked": "unchecked", + "show details": "show details", + "this customer": "this customer", + "This customer registered to erxes by": "This customer registered to erxes by", + "registered": "registered", + "This customer": "This customer", + "sent email": "sent email", + "Collapse": "Collapse", + "Expand": "Expand", + "Engage email": "Engage email", + "left a note": "left a note", + "System": "System", + "This": "This", + "joined a": "joined a", + "segment": "segment" } diff --git a/ui/src/locales/pt-br.json b/ui/src/locales/pt-br.json index a9d955ac792..38b544c0f9f 100644 --- a/ui/src/locales/pt-br.json +++ b/ui/src/locales/pt-br.json @@ -29,6 +29,7 @@ "Inbox": "Caixa de entrada", "Customers": "Clientes", "Companies": "Empresas", + "companies": "empresas", "Engage": "Engajar", "Insights": "Relatórios", "Knowledge Base": "Base de Conhecimento", @@ -187,6 +188,7 @@ "Delete": "Deletar", "Choose segment": "Selecione o segmento", "To:": "Para:", + "to": "para", "Messenger kind:": "Tipo de messenger:", "Title:": "Título", "Channel:": "Canal", @@ -929,5 +931,28 @@ "Invalid number": "Número inválido", "You successfully updated a task.": "Você atualizou uma tarefa com sucesso.", "You successfully deleted a task.": "Você excluiu uma tarefa com sucesso.", - "You do not have permission to view this task": "Você não tem permissão para ver esta tarefa" + "You do not have permission to view this task": "Você não tem permissão para ver esta tarefa", + "Set reminder": "Definir lembrete", + "Due date": "Data de Vencimento", + "Jump to task": "Pule para a tarefa", + "Undefined": "Indefinido", + "deleted": "apagado", + "checked": "verificado", + "unchecked": "não verificado", + "created": "criado", + "show details": "mostrar detalhes", + "this customer": "este cliente", + "This customer registered to erxes by": "Este cliente se cadastrou no erxes por", + "registered": "registrado", + "This customer": "Este cliente", + "Unknown": "Desconhecido", + "sent email": "e-mail enviado", + "Collapse": "Colapsar", + "Expand": "Expandir", + "Engage email": "Engajar e-mail", + "left a note": "deixou uma nota", + "System": "Sistema", + "This": "Esse", + "joined a": "juntou-se a um", + "segment": "segmento" } diff --git a/ui/src/modules/activityLogs/components/ActivityLogs.tsx b/ui/src/modules/activityLogs/components/ActivityLogs.tsx index e518da3a919..ecfbb51af4c 100644 --- a/ui/src/modules/activityLogs/components/ActivityLogs.tsx +++ b/ui/src/modules/activityLogs/components/ActivityLogs.tsx @@ -57,7 +57,7 @@ class ActivityLogs extends React.PureComponent { type={currentTab} /> } - emptyText="No Activities" + emptyText={__("No Activities")} emptyImage="/images/actions/19.svg" /> diff --git a/ui/src/modules/activityLogs/components/items/ConvertLog.tsx b/ui/src/modules/activityLogs/components/items/ConvertLog.tsx index 7b6a01527d9..71f9167e777 100644 --- a/ui/src/modules/activityLogs/components/items/ConvertLog.tsx +++ b/ui/src/modules/activityLogs/components/items/ConvertLog.tsx @@ -24,7 +24,7 @@ class ConvertLog extends React.Component { createdByDetail } = activity; - let userName = 'Unknown'; + let userName = __('Unknown'); if (createdByDetail && createdByDetail.type === 'user') { userName = renderUserFullName(createdByDetail.content); @@ -32,7 +32,7 @@ class ConvertLog extends React.Component { const conversation = ( - conversation + {__("conversation")} ); diff --git a/ui/src/modules/activityLogs/components/items/InternalNote.tsx b/ui/src/modules/activityLogs/components/items/InternalNote.tsx index d25c3576be2..d6c5d77a9b6 100644 --- a/ui/src/modules/activityLogs/components/items/InternalNote.tsx +++ b/ui/src/modules/activityLogs/components/items/InternalNote.tsx @@ -9,7 +9,7 @@ import { } from 'modules/activityLogs/styles'; import { IUser } from 'modules/auth/types'; import Tip from 'modules/common/components/Tip'; -import { renderUserFullName } from 'modules/common/utils'; +import { renderUserFullName, __ } from 'modules/common/utils'; import Form from 'modules/internalNotes/components/Form'; import { IInternalNote } from 'modules/internalNotes/types'; import React from 'react'; @@ -41,7 +41,7 @@ class InternalNote extends React.Component { const { internalNote } = this.props; const { createdUser } = internalNote; - let userName = 'Unknown'; + let userName = __('Unknown'); if (createdUser.details) { userName = renderUserFullName(createdUser); @@ -49,7 +49,7 @@ class InternalNote extends React.Component { return ( - {userName} left a note + {userName} {__("left a note")} ); }; diff --git a/ui/src/modules/activityLogs/components/items/MergedLog.tsx b/ui/src/modules/activityLogs/components/items/MergedLog.tsx index 96917d22563..059cb1c93a9 100644 --- a/ui/src/modules/activityLogs/components/items/MergedLog.tsx +++ b/ui/src/modules/activityLogs/components/items/MergedLog.tsx @@ -24,12 +24,12 @@ class MergedLog extends React.Component { return {userName}; } - return System; + return {__("System")}; }; renderContent = () => { const { contentType, contentDetail } = this.props.activity; - const type = contentType.includes('customer') ? 'customers' : 'companies'; + const type = contentType.includes('customer') ? __('customers') : __('companies'); return ( <> diff --git a/ui/src/modules/activityLogs/components/items/SegmentLog.tsx b/ui/src/modules/activityLogs/components/items/SegmentLog.tsx index 3b6d5991c6c..1c554955ae4 100644 --- a/ui/src/modules/activityLogs/components/items/SegmentLog.tsx +++ b/ui/src/modules/activityLogs/components/items/SegmentLog.tsx @@ -6,6 +6,7 @@ import { } from 'modules/activityLogs/styles'; import { IActivityLog } from 'modules/activityLogs/types'; import Tip from 'modules/common/components/Tip'; +import { __ } from 'modules/common/utils'; import React from 'react'; type Props = { @@ -19,7 +20,7 @@ class SegmentLog extends React.Component { return ( - This {contentType} joined a {content.content} segment + {__("This")} {contentType} {__("joined a")} {content.content} {__("segment")} ); }; diff --git a/ui/src/modules/activityLogs/components/items/boardItems/Task.tsx b/ui/src/modules/activityLogs/components/items/boardItems/Task.tsx index babda114ee9..9688141bfd3 100644 --- a/ui/src/modules/activityLogs/components/items/boardItems/Task.tsx +++ b/ui/src/modules/activityLogs/components/items/boardItems/Task.tsx @@ -113,7 +113,7 @@ class Task extends React.Component { size="small" onClick={this.onChange.bind(this, 'editing')} > - Cancel + {__("Cancel")} ); @@ -147,7 +147,7 @@ class Task extends React.Component { - Set reminder + {__("Set reminder")} { onSelect={onSelect} customOption={{ value: '', - label: 'Assigned to no one' + label: __('Assigned to no one') }} /> { onSelect={onSelect} filterParams={{ pipelineId: queryParams.pipelineId }} multi={true} - customOption={{ value: '', label: 'No label chosen' }} + customOption={{ value: '', label: __('No label chosen') }} /> {extraFilter} diff --git a/ui/src/modules/settings/team/containers/SelectTeamMembers.tsx b/ui/src/modules/settings/team/containers/SelectTeamMembers.tsx index aef6e33200e..8bf86b2c21d 100644 --- a/ui/src/modules/settings/team/containers/SelectTeamMembers.tsx +++ b/ui/src/modules/settings/team/containers/SelectTeamMembers.tsx @@ -3,6 +3,7 @@ import SelectWithSearch from 'modules/common/components/SelectWithSearch'; import { IOption, IQueryParams } from 'modules/common/types'; import React from 'react'; import { queries } from '../graphql'; +import { __ } from 'modules/common/utils'; // get user options for react-select-plus export function generateUserOptions(array: IUser[] = []): IOption[] { @@ -41,7 +42,7 @@ export default ({ return ( { const extraFilter = ( <> { {KEY_LABELS.WIDGETS_UPLOAD_FILE_TYPES} - {mimeTypeDesc &&

    {__(mimeTypeDesc)}

    } + {__(mimeTypeDesc) &&

    {mimeTypeDesc}

    } ({ value: hs, label: hs }))} name="hackStage" @@ -182,7 +182,7 @@ const GrowthHackMainActionBar = (props: IProps) => { {growthHackFilter} { + this.setState({ + recording: !this.state.recording + }); + }} + /> + + ); } + handleToggleRecording() { + this.setState({ recording: !this.state.recording }); + } + renderBody() { return ( <> {this.renderEditor()} {this.renderIndicator()} - {this.renderButtons()} + {this.state.recording ? ( + this.handleToggleRecording()} + send={(e) => this.handleFileInput(e)} + /> + ) : ( + this.renderButtons() + )} ); } diff --git a/ui/src/modules/inbox/styles.ts b/ui/src/modules/inbox/styles.ts index a9ce794401d..fd9827f1252 100644 --- a/ui/src/modules/inbox/styles.ts +++ b/ui/src/modules/inbox/styles.ts @@ -111,7 +111,7 @@ const EditorActions = styled.div` align-items: center; label { - margin: 0 10px 0 0; + margin: 0 5px 0 10px; display: block; &:hover { @@ -132,6 +132,73 @@ const EditorActions = styled.div` input[type='file'] { display: none; } + + input[type='checkbox'] { + display: none; + } +`; + +export const RecordActions = styled.div` + padding: 0 20px 10px 20px; + text-align: right; + position: relative; + color: ${colors.colorCoreGray}; + display: flex; + justify-content: flex-end; + align-items: center; + + i { + margin: 0; + + &:hover { + cursor: pointer; + color: ${darken(colors.colorCoreGray, 30)}; + } + } + + input[type='checkbox'] { + display: none; + } + + p { + font-size: 12px; + padding: 2px 12px 2px 12px; + border-radius: 30px; + margin: 0 5px 0 12px; + color: #fff; + background-color: ${colors.colorCoreRed}; + } + + audio { + margin: 0 10px 0 10px; + } +`; + +export const StopRecordButton = styled.button` + border-radius: 50px; + border: solid 2px ${colors.colorCoreRed}; + background-color: transparent; + display: flex; + justify-content: center; + align-items: center; + padding: 5px; + cursor: pointer; + margin-right: 8px; + transition: all 0.3s; + + div { + width: 8px; + height: 8px; + border-radius: 1px; + background-color: ${colors.colorCoreRed}; + } + + &:hover { + div { + transform: scale(1.1); + opacity: 0.9; + } + } `; const InlineHeader = styled.div` diff --git a/ui/yarn.lock b/ui/yarn.lock index c848e228667..ca2305acab9 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -996,50 +996,6 @@ resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-9.0.1.tgz#c27b391d8457d1e893f1eddeaf5e5412d12ffbb5" integrity sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA== -"@cypress/listr-verbose-renderer@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#a77492f4b11dcc7c446a34b3e28721afd33c642a" - integrity sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo= - dependencies: - chalk "^1.1.3" - cli-cursor "^1.0.2" - date-fns "^1.27.2" - figures "^1.7.0" - -"@cypress/request@^2.88.5": - version "2.88.5" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.5.tgz#8d7ecd17b53a849cfd5ab06d5abe7d84976375d7" - integrity sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -"@cypress/xvfb@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" - integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== - dependencies: - debug "^3.1.0" - lodash.once "^4.1.1" - "@daily-co/daily-js@^0.9.991": version "0.9.991" resolved "https://registry.yarnpkg.com/@daily-co/daily-js/-/daily-js-0.9.991.tgz#43580ae888aa40904e13184224e38b07b7c5ef25" @@ -1329,13 +1285,6 @@ resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.15.tgz#17cb37a272dfb9cbacf83614a5a7170e68f17d75" integrity sha512-rVNba1A2oMzKBg16fCrrHmCf4JjOzFhT9TWR8J+Y8iOcY4zffxtP3ke7mEsakvghHZT+9//uDOPSSeuBDW41GQ== -"@samverschueren/stream-to-observable@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301" - integrity sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ== - dependencies: - any-observable "^0.3.0" - "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" @@ -1493,6 +1442,11 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/dom-mediacapture-record@^1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@types/dom-mediacapture-record/-/dom-mediacapture-record-1.0.11.tgz#f61b17e6131d76629d4039b02634c7e786b82c3a" + integrity sha512-ODVOH95x08arZhbQOjH3no7Iye64akdO+55nM+IGtTzpu2ACKr9CQTrI//CCVieIjlI/eL+rK1hQjMycxIgylQ== + "@types/draft-js@^0.10.24": version "0.10.26" resolved "https://registry.yarnpkg.com/@types/draft-js/-/draft-js-0.10.26.tgz#0b02324b7981cbab32d23cd0a1d968bbf576757b" @@ -1604,16 +1558,6 @@ "@types/prop-types" "*" csstype "^2.2.0" -"@types/sinonjs__fake-timers@^6.0.1": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz#3a84cf5ec3249439015e14049bd3161419bf9eae" - integrity sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg== - -"@types/sizzle@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" - integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== - "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -1968,16 +1912,6 @@ ajv@^6.1.0, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.12.3: - version "6.12.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" - integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^6.5.5: version "6.6.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" @@ -2063,11 +1997,6 @@ any-observable@^0.2.0: resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242" integrity sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI= -any-observable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" - integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2191,11 +2120,6 @@ aproba@^1.0.3, aproba@^1.1.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -arch@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf" - integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ== - are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -2385,11 +2309,6 @@ async@^3.1.0: resolved "https://registry.yarnpkg.com/async/-/async-3.1.0.tgz#42b3b12ae1b74927b5217d8c0016baaf62463772" integrity sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ== -async@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" - integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2653,11 +2572,6 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" @@ -2833,11 +2747,6 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - buffer-from@1.x, buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -2925,11 +2834,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cachedir@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" @@ -3076,11 +2980,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -check-more-types@^2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" - integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= - cheerio@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" @@ -3201,7 +3100,7 @@ cli-cursor@^1.0.2: dependencies: restore-cursor "^1.0.1" -cli-cursor@^2.0.0, cli-cursor@^2.1.0: +cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= @@ -3213,16 +3112,6 @@ cli-spinners@^0.1.2: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" integrity sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw= -cli-table3@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" - integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== - dependencies: - object-assign "^4.1.0" - string-width "^2.1.1" - optionalDependencies: - colors "^1.1.2" - cli-truncate@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" @@ -3346,11 +3235,6 @@ color@^3.1.2: color-convert "^1.9.1" color-string "^1.5.2" -colors@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" @@ -3383,11 +3267,6 @@ commander@^2.15.1, commander@~2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -3428,7 +3307,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0, concat-stream@^1.6.2: +concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3924,49 +3803,6 @@ cypress-file-upload@^4.0.7: dependencies: mime "^2.4.4" -cypress@^4.9.0: - version "4.12.1" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.12.1.tgz#0ead1b9f4c0917d69d8b57f996b6e01fe693b6ec" - integrity sha512-9SGIPEmqU8vuRA6xst2CMTYd9sCFCxKSzrHt0wr+w2iAQMCIIsXsQ5Gplns1sT6LDbZcmLv6uehabAOl3fhc9Q== - dependencies: - "@cypress/listr-verbose-renderer" "^0.4.1" - "@cypress/request" "^2.88.5" - "@cypress/xvfb" "^1.2.4" - "@types/sinonjs__fake-timers" "^6.0.1" - "@types/sizzle" "^2.3.2" - arch "^2.1.2" - bluebird "^3.7.2" - cachedir "^2.3.0" - chalk "^2.4.2" - check-more-types "^2.24.0" - cli-table3 "~0.5.1" - commander "^4.1.1" - common-tags "^1.8.0" - debug "^4.1.1" - eventemitter2 "^6.4.2" - execa "^1.0.0" - executable "^4.1.1" - extract-zip "^1.7.0" - fs-extra "^8.1.0" - getos "^3.2.1" - is-ci "^2.0.0" - is-installed-globally "^0.3.2" - lazy-ass "^1.6.0" - listr "^0.14.3" - lodash "^4.17.19" - log-symbols "^3.0.0" - minimist "^1.2.5" - moment "^2.27.0" - ospath "^1.2.2" - pretty-bytes "^5.3.0" - ramda "~0.26.1" - request-progress "^3.0.0" - supports-color "^7.1.0" - tmp "~0.1.0" - untildify "^4.0.0" - url "^0.11.0" - yauzl "^2.10.0" - d3-array@^1.2.0: version "1.2.4" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" @@ -4100,7 +3936,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6. dependencies: ms "2.0.0" -debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: +debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -4968,11 +4804,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eventemitter2@^6.4.2: - version "6.4.3" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.3.tgz#35c563619b13f3681e7eb05cbdaf50f56ba58820" - integrity sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ== - eventemitter3@^3.0.0, eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" @@ -5034,13 +4865,6 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -executable@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" - integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== - dependencies: - pify "^2.2.0" - exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -5155,16 +4979,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" - integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== - dependencies: - concat-stream "^1.6.2" - debug "^2.6.9" - mkdirp "^0.5.4" - yauzl "^2.10.0" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -5180,11 +4994,6 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - fast-equals@^1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-1.6.3.tgz#84839a1ce20627c463e1892f2ae316380c81b459" @@ -5246,13 +5055,6 @@ fbjs@^0.8.0, fbjs@^0.8.1, fbjs@^0.8.15, fbjs@^0.8.16, fbjs@^0.8.5: setimmediate "^1.0.5" ua-parser-js "^0.7.18" -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -5495,15 +5297,6 @@ fs-extra@^4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-minipass@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" @@ -5615,13 +5408,6 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -getos@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" - integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== - dependencies: - async "^3.2.0" - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -5654,13 +5440,6 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" - integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== - dependencies: - ini "^1.3.5" - global-modules@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -5716,11 +5495,6 @@ graceful-fs@^4.1.15, graceful-fs@^4.1.6: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== -graceful-fs@^4.2.0: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - graphql-tag@^2.6.1: version "2.10.0" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.0.tgz#87da024be863e357551b2b8700e496ee2d4353ae" @@ -5780,14 +5554,6 @@ har-validator@~5.1.0: ajv "^6.5.5" har-schema "^2.0.0" -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - harmony-reflect@^1.4.6: version "1.6.1" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" @@ -6553,14 +6319,6 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz#b6e710d7d07bb66b98cb8cece5c9b4921deeb835" integrity sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A== -is-installed-globally@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== - dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" - is-number-object@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" @@ -6585,13 +6343,6 @@ is-observable@^0.2.0: dependencies: symbol-observable "^0.2.2" -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - dependencies: - symbol-observable "^1.1.0" - is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -6611,11 +6362,6 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== - is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -7484,11 +7230,6 @@ last-call-webpack-plugin@^3.0.0: lodash "^4.17.5" webpack-sources "^1.1.0" -lazy-ass@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" - integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= - lazy-cache@^0.2.3: version "0.2.7" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" @@ -7568,20 +7309,6 @@ listr-update-renderer@^0.4.0: log-update "^1.0.2" strip-ansi "^3.0.1" -listr-update-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" - integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^2.3.0" - strip-ansi "^3.0.1" - listr-verbose-renderer@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" @@ -7592,16 +7319,6 @@ listr-verbose-renderer@^0.4.0: date-fns "^1.27.2" figures "^1.7.0" -listr-verbose-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" - integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== - dependencies: - chalk "^2.4.1" - cli-cursor "^2.1.0" - date-fns "^1.27.2" - figures "^2.0.0" - listr@^0.13.0: version "0.13.0" resolved "https://registry.yarnpkg.com/listr/-/listr-0.13.0.tgz#20bb0ba30bae660ee84cc0503df4be3d5623887d" @@ -7625,21 +7342,6 @@ listr@^0.13.0: stream-to-observable "^0.2.0" strip-ansi "^3.0.1" -listr@^0.14.3: - version "0.14.3" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" - integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== - dependencies: - "@samverschueren/stream-to-observable" "^0.3.0" - is-observable "^1.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.5.0" - listr-verbose-renderer "^0.5.0" - p-map "^2.0.0" - rxjs "^6.3.3" - load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -7803,11 +7505,6 @@ lodash.mergewith@^4.6.1: resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== -lodash.once@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= - lodash.pick@^4.2.1: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" @@ -7873,11 +7570,6 @@ lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.17.19: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - lodash@^4.17.4: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" @@ -7897,13 +7589,6 @@ log-symbols@^2.0.0: dependencies: chalk "^2.0.1" -log-symbols@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - log-update@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" @@ -7912,15 +7597,6 @@ log-update@^1.0.2: ansi-escapes "^1.0.0" cli-cursor "^1.0.2" -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= - dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - loglevel@^1.4.1: version "1.6.3" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.3.tgz#77f2eb64be55a404c9fd04ad16d57c1d6d6b1280" @@ -8227,11 +7903,6 @@ minimist@^1.1.1, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" @@ -8291,18 +7962,6 @@ mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0. dependencies: minimist "0.0.8" -mkdirp@^0.5.4: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -moment@^2.27.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.0.tgz#fcbef955844d91deb55438613ddcec56e86a3425" - integrity sha512-z6IJ5HXYiuxvFTI6eiQ9dm77uE0gyy1yXNApVHqTcnIKfY9tIwEjlzsZ6u1LQXvVgKeTnv9Xm7NDvJ7lso3MtA== - moo@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" @@ -8846,11 +8505,6 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -ospath@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" - integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -8906,11 +8560,6 @@ p-map@^1.1.1: resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" @@ -9106,11 +8755,6 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" @@ -9121,7 +8765,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pify@^2.0.0, pify@^2.2.0: +pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -9899,11 +9543,6 @@ pretty-bytes@^5.1.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.2.0.tgz#96c92c6e95a0b35059253fb33c03e260d40f5a1f" integrity sha512-ujANBhiUsl9AhREUDUEY1GPOharMGm8x8juS7qOHybcLi7XsKfrYQ88hSly1l2i0klXHTDYrlL8ihMCG55Dc3w== -pretty-bytes@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.4.1.tgz#cd89f79bbcef21e3d21eb0da68ffe93f803e884b" - integrity sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA== - pretty-error@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" @@ -10164,11 +9803,6 @@ railroad-diagrams@^1.0.0: resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= -ramda@~0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" - integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== - randexp@0.4.6: version "0.4.6" resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" @@ -10908,13 +10542,6 @@ request-idle-callback@^1.0.2: resolved "https://registry.yarnpkg.com/request-idle-callback/-/request-idle-callback-1.0.2.tgz#9bb41771b746209de8be0b1c3cde2161e420edd2" integrity sha1-m7QXcbdGIJ3ovgscPN4hYeQg7dI= -request-progress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" - integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= - dependencies: - throttleit "^1.0.0" - request-promise-core@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" @@ -11142,13 +10769,6 @@ rxjs@^5.4.2: dependencies: symbol-observable "1.0.1" -rxjs@^6.3.3: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== - dependencies: - tslib "^1.9.0" - rxjs@^6.4.0: version "6.5.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" @@ -12001,7 +11621,7 @@ symbol-observable@^0.2.2: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" integrity sha1-lag9smGG1q9+ehjb2XYKL4bQj0A= -symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0: +symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== @@ -12107,11 +11727,6 @@ throat@^4.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= -throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" - integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= - through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -12169,13 +11784,6 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== - dependencies: - rimraf "^2.6.3" - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -12250,7 +11858,7 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5.0: +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -12631,11 +12239,6 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - upath@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" @@ -13247,14 +12850,6 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -13394,14 +12989,6 @@ yargs@^12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - zen-observable-ts@^0.8.11: version "0.8.11" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.11.tgz#d54a27cd17dc4b4bb6bd008e5c096af7fcb068a9" From ff64f4dc870cbd9e90ef7650b6b2a233a6b0dce5 Mon Sep 17 00:00:00 2001 From: Gabriel-Tomaz Date: Tue, 14 Dec 2021 15:02:25 -0300 Subject: [PATCH 112/135] reproduzindo os audios nas mensagens do chat --- ui/src/modules/common/components/Attachment.tsx | 15 ++++++++++++++- ui/src/modules/common/components/FilePreview.tsx | 14 ++++++++++++++ .../conversationDetail/workarea/RecorderAudio.tsx | 12 +++++++----- .../conversationDetail/workarea/RespondBox.tsx | 4 +--- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/ui/src/modules/common/components/Attachment.tsx b/ui/src/modules/common/components/Attachment.tsx index 0f44c25f4df..54a0a594c92 100644 --- a/ui/src/modules/common/components/Attachment.tsx +++ b/ui/src/modules/common/components/Attachment.tsx @@ -129,7 +129,7 @@ class Attachment extends React.Component { @@ -137,6 +137,16 @@ class Attachment extends React.Component { ); }; + renderAudiFile = attachment => { + return ( + + + + + ); + }; + onLoadImage = () => { const { scrollBottom } = this.props; @@ -193,6 +203,9 @@ class Attachment extends React.Component { case 'mp4': filePreview = this.renderVideoFile(attachment); break; + case 'ogg': + filePreview = this.renderAudiFile(attachment); + break; case 'zip': case 'csv': case 'doc': diff --git a/ui/src/modules/common/components/FilePreview.tsx b/ui/src/modules/common/components/FilePreview.tsx index d87b5c30a9c..70ef0da96f0 100644 --- a/ui/src/modules/common/components/FilePreview.tsx +++ b/ui/src/modules/common/components/FilePreview.tsx @@ -109,6 +109,16 @@ export default function FilePreview({ fileUrl, fileName }: Props) { ); }; + const renderAudiFile = () => { + return ( + + + + + ); + }; + const renderImagePreview = () => { return ( @@ -140,6 +150,9 @@ export default function FilePreview({ fileUrl, fileName }: Props) { case 'png': filePreview = renderImagePreview(); break; + case 'ogg': + filePreview = renderAudiFile(); + break; case 'zip': case 'csv': case 'doc': @@ -151,6 +164,7 @@ export default function FilePreview({ fileUrl, fileName }: Props) { case 'mp3': case 'pdf': case 'xls': + case 'ogg': filePreview = renderFile(fileExtension); break; default: diff --git a/ui/src/modules/inbox/components/conversationDetail/workarea/RecorderAudio.tsx b/ui/src/modules/inbox/components/conversationDetail/workarea/RecorderAudio.tsx index 86f94452d36..5fe3bc5391e 100644 --- a/ui/src/modules/inbox/components/conversationDetail/workarea/RecorderAudio.tsx +++ b/ui/src/modules/inbox/components/conversationDetail/workarea/RecorderAudio.tsx @@ -25,7 +25,7 @@ const initialState = { file: null }; -const RecorderAudio = ({ toggleRecording, handleToggle, send }) => { +const RecorderAudio = ({ toggleRecording, handleToggle, attach }) => { const [recorderState, setRecorderState] = useState(initialState); const startRecording = async () => { @@ -108,7 +108,7 @@ const RecorderAudio = ({ toggleRecording, handleToggle, send }) => { }; recorder.onstop = () => { - const fileName = `erxes_audio_${Number(dayjs())}`; + const fileName = `erxes_audio_${Number(dayjs())}.ogg`; const blob = new Blob(chunks, { type: 'audio/ogg; codecs=opus' }); chunks = []; @@ -128,10 +128,11 @@ const RecorderAudio = ({ toggleRecording, handleToggle, send }) => { } return () => { - if (recorder) + if (recorder) { recorder.stream .getAudioTracks() .forEach((track: any) => track.stop()); + } }; }, [recorderState.mediaRecorder] @@ -175,12 +176,13 @@ const RecorderAudio = ({ toggleRecording, handleToggle, send }) => { + ); + } + + renderButtons() { + const { kind } = this.state; + const { + responseTemplates: emailTemplates, + fetchMoreEmailTemplates + } = this.props; + + const inputProps = { + type: 'file', + multiple: true, + onChange: kind.includes('nylas') + ? this.onAttachment + : this.handleFileInput + }; + + return ( + + + + {this.renderIcon({ + text: 'Attach file', + icon: 'paperclip', + element: + })} + + + + {this.state.isUploading ? ( + + + Uploading... + + ) : ( +
    + {this.renderSubmit('Send', this.onSubmit, 'primary')} +
    + )} +
    +
    + ); + } + + renderBody() { + return ( + + + + ); + } + + renderLeftSide() { + return ( + + {this.renderFrom()} + {this.renderTo()} + + ); + } + + renderMeta = () => { + return ( + + + {this.renderLeftSide()} + + + ); + }; + + render() { + return ( + + {this.renderMeta()} + {this.renderBody()} + {this.renderAttachments()} + {this.renderButtons()} + + ); + } +} + +export default WhatsProForm; diff --git a/ui/src/modules/settings/integrations/components/whatspro/responseTemplate/ResponseTemplate.tsx b/ui/src/modules/settings/integrations/components/whatspro/responseTemplate/ResponseTemplate.tsx new file mode 100644 index 00000000000..17e80ddf1c8 --- /dev/null +++ b/ui/src/modules/settings/integrations/components/whatspro/responseTemplate/ResponseTemplate.tsx @@ -0,0 +1,95 @@ +import Button from 'modules/common/components/Button'; +import EmptyState from 'modules/common/components/EmptyState'; +import { + PopoverBody, + PopoverFooter, + PopoverList +} from 'modules/common/components/filterableList/styles'; +import Icon from 'modules/common/components/Icon'; +import Tip from 'modules/common/components/Tip'; +import { __ } from 'modules/common/utils'; +import { ResponseTemplateStyled as EmailTemplateStyled } from 'modules/inbox/styles'; +import React from 'react'; +import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; +import Popover from 'react-bootstrap/Popover'; + +type Props = { + fetchMoreEmailTemplates: () => void; + targets: Array<{ value: string; label: string }>; + onSelect: (id: string) => void; +}; + +class EmailTemplate extends React.Component { + private overlayRef; + + handleFetch = () => { + this.props.fetchMoreEmailTemplates(); + } + + handleClick(value: string) { + this.props.onSelect(value); + this.hidePopover(); + } + + hidePopover = () => { + this.overlayRef.hide(); + }; + + renderContent() { + const { targets = [] } = this.props; + + if (!targets || targets.length === 0) { + return ; + } + + targets.unshift({ value: '', label: 'Clear' }); + + return targets.map(item => { + const onClick = () => this.handleClick(item.value); + + return ( +
  • + {item.label} +
  • + ); + }); + } + + render() { + const popover = ( + + {__('Email Templates')} + + + {this.renderContent()} + + + + + + + ); + + return ( + + { + this.overlayRef = overlayTrigger; + }} + > + + + + ); + } +} + +export default EmailTemplate; diff --git a/ui/src/modules/settings/integrations/components/whatspro/styles.ts b/ui/src/modules/settings/integrations/components/whatspro/styles.ts new file mode 100644 index 00000000000..93de1dde8a5 --- /dev/null +++ b/ui/src/modules/settings/integrations/components/whatspro/styles.ts @@ -0,0 +1,199 @@ +import { SelectWrapper } from 'modules/common/components/form/styles'; +import { colors, dimensions } from 'modules/common/styles'; +import { Attachment } from 'modules/inbox/styles'; +import styled from 'styled-components'; +import styledTS from 'styled-components-ts'; + +const AttachmentContainer = styled(Attachment)` + padding: 3px 8px; + border-radius: 2px; + margin: 0 5px 5px 0; + color: ${colors.colorWhite}; + + i { + cursor: pointer; + opacity: 0.6; + transition: opacity ease 0.3s; + font-size: 12px; + + &:hover { + opacity: 1; + } + } +`; + +const FileSize = styled.div` + font-size: 90%; + opacity: 0.9; +`; + +const Uploading = styled.div` + display: flex; + align-items: baseline; + color: ${colors.colorCoreGray}; + font-size: 12px; +`; + +const ControlWrapper = styled.div` + position: relative; +`; + +const LeftSection = styled.div` + position: absolute; + top: 0; + right: 0; + margin: 5px 10px 0 0; +`; + +const MailEditorWrapper = styled.div` + position: relative; + background: ${colors.colorWhite}; + + .cke { + border: 0; + border-bottom: 1px solid ${colors.borderPrimary}; + } + + .cke_inner { + position: relative; + + .cke_resizer { + display: none; + } + + .cke_bottom { + background: ${colors.bgLight}; + padding-left: ${dimensions.coreSpacing}px; + padding-right: ${dimensions.coreSpacing}px; + border-top: 1px solid ${colors.borderPrimary}; + max-height: 60px; + overflow: hidden; + } + } + + .cke_toolgroup { + border: 0; + margin-left: ${dimensions.unitSpacing / 2}px; + } +`; + +const Resipients = styledTS<{ isActive?: boolean }>(styled.a)` + padding-left: ${dimensions.unitSpacing}px; + font-size: 12px; + color: ${colors.colorCoreLightGray}; + display: ${props => props.isActive && 'none'}; + font-weight: 500; + + &:hover { + cursor: pointer; + color: ${colors.colorCoreGray}; + } +`; + +const EditorFooter = styled.div` + padding: ${dimensions.unitSpacing}px ${dimensions.coreSpacing}px; +`; + +const Attachments = styled.div` + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding: 6px ${dimensions.coreSpacing}px 2px ${dimensions.coreSpacing}px + border-bottom: 1px solid ${colors.borderPrimary}; +`; + +const FlexRow = styled.div` + display: flex; + align-items: center; + + > label { + margin: 2px ${dimensions.unitSpacing}px 2px 0; + color: ${colors.colorCoreGray}; + align-self: baseline; + } +`; + +const ToolBar = styled.div` + i { + font-size: 18px; + color: ${colors.colorLightGray}; + } + + label { + color: ${colors.colorCoreGray}; + margin-right: 10px; + font-size: 14px; + margin-bottom: 0; + + &:hover { + cursor: pointer; + } + } + + input[type='file'] { + display: none; + } +`; + +const SpaceBetweenRow = styled.div` + display: flex; + flex: 1; + justify-content: space-between; + align-items: center; + + textarea, + input, + ${SelectWrapper} { + height: ${dimensions.coreSpacing}px; + border-bottom: 0; + padding: 0; + min-height: auto; + } + + ${SelectWrapper} { + width: auto; + display: inline-flex; + padding-right: 10px; + background: ${colors.bgActive}; + + &:after { + top: 5px; + } + + select { + height: ${dimensions.coreSpacing}px; + } + } +`; + +const Column = styled.div` + flex: 1; +`; + +const Subject = styledTS<{ noBorder?: boolean }>(styled.div)` + padding: ${dimensions.unitSpacing}px ${dimensions.coreSpacing}px; + border-bottom:${props => + !props.noBorder && `1px solid ${colors.borderPrimary}`}; + + input { + height: ${dimensions.coreSpacing}px; + border-bottom: 0; + } +`; + +export { + Attachments, + FlexRow, + Column, + Subject, + ToolBar, + MailEditorWrapper, + ControlWrapper, + LeftSection, + Resipients, + Uploading, + AttachmentContainer, + SpaceBetweenRow, + EditorFooter, + FileSize +}; diff --git a/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx b/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx new file mode 100644 index 00000000000..6eee87a5980 --- /dev/null +++ b/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx @@ -0,0 +1,257 @@ +import gql from 'graphql-tag'; +import * as compose from 'lodash.flowright'; +import debounce from 'lodash/debounce'; +import withCurrentUser from 'modules/auth/containers/withCurrentUser'; +import { IUser } from 'modules/auth/types'; +import Spinner from 'modules/common/components/Spinner'; +import { Alert, withProps } from 'modules/common/utils'; +import { queries as messageQueries } from 'modules/inbox/graphql'; +import { IMail } from 'modules/inbox/types'; +import { queries as templatesQuery } from 'modules/settings/responseTemplates/graphql'; +import { mutations, queries } from 'modules/settings/integrations/graphql'; +import * as React from 'react'; +import { graphql } from 'react-apollo'; +import WhatsProForm from '../../components/whatspro/WhatsProForm'; +import { IntegrationsQueryResponse } from '../../types'; +import { + defaultCustomerFields, + defaultMailFields, + defaultMessageFields +} from './constants'; + +import { __ } from 'modules/common/utils'; +import { ResponseTemplatesQueryResponse, ResponseTemplatesTotalCountQueryResponse } from 'modules/settings/responseTemplates/types'; + +type Props = { + clearOnSubmit?: boolean; + integrationId?: string; + brandId?: string; + conversationId?: string; + refetchQueries?: string[]; + toPhone?: string; + customerId?: string; + mailData?: IMail; + isReply?: boolean; + isForward?: boolean; + replyAll?: boolean; + createdAt?: Date; + toggleReply?: (toAll?: boolean) => void; + closeModal?: () => void; + closeReply?: () => void; + callback?: () => void; +}; + +type FinalProps = { + currentUser: IUser; + sendMailMutation: any; + responseTemplatesQuery: ResponseTemplatesQueryResponse; + responseTemplatesTotalCountQuery: ResponseTemplatesTotalCountQueryResponse; + integrationsQuery: IntegrationsQueryResponse; +} & Props; + +const WhatsProFormContainer = (props: FinalProps) => { + const { + mailData, + customerId, + conversationId, + integrationsQuery, + isReply, + closeModal, + closeReply, + responseTemplatesQuery, + responseTemplatesTotalCountQuery, + sendMailMutation, + currentUser + } = props; + + if (integrationsQuery.loading) { + return ; + } + + const fetchMoreEmailTemplates = () => { + const { fetchMore, responseTemplates } = responseTemplatesQuery; + const { responseTemplatesTotalCount } = responseTemplatesTotalCountQuery; + + if (responseTemplatesTotalCount === responseTemplates.length) { + return; + } + + return fetchMore({ + variables: { perPage: 200 }, + updateQuery: (prev, { fetchMoreResult }) => { + if (!fetchMoreResult) { + return prev; + } + + return Object.assign({}, prev, { + responseTemplates: [ + ...prev.responseTemplates, + ...fetchMoreResult.responseTemplates + ] + }); + } + }); + }; + + const integrations = integrationsQuery.integrations || []; + + const save = ({ + variables, + optimisticResponse, + update, + callback + }: { + variables: any; + optimisticResponse?: any; + callback?: () => void; + update?: any; + }) => { + return sendMailMutation({ + variables: { ...variables, customerId }, + optimisticResponse, + update + }) + .then(() => { + Alert.success('You have successfully sent a email'); + + if (isReply && variables.shouldResolve) { + debounce( + () => + Alert.info( + `${__( + 'This email conversation will be automatically moved to a resolved state' + )}.` + ), + 3300 + )(); + } + + if (closeModal) { + closeModal(); + } + + if (callback) { + callback(); + } + }) + .catch(e => { + Alert.error(e.message); + + if (closeModal) { + closeModal(); + } + }); + }; + + const sendMail = ({ + variables, + callback + }: { + variables: any; + callback: () => void; + }) => { + if (!isReply) { + return save({ variables, callback }); + } + + const email = mailData ? mailData.integrationEmail : ''; + + const integrationSendMail = { + _id: Math.round(Math.random() * -1000000), + ...defaultMessageFields, + conversationId, + videoCallData: null, + contentType: '', + content: variables.body, + customer: { + ...defaultCustomerFields, + firstName: email, + primaryEmail: email + }, + mailData: { + ...defaultMailFields, + bcc: [{ __typename: 'Email', email: variables.bcc }], + to: [{ __typename: 'Email', email: variables.to }], + from: [{ __typename: 'Email', email: variables.to }], + cc: [{ __typename: 'Email', email: variables.cc }], + body: variables.body, + subject: variables.subject, + attachments: variables.attachments, + integrationEmail: variables.from + } + }; + + const optimisticResponse = { __typename: 'Mutation', integrationSendMail }; + + const update = store => { + const selector = { + query: gql(messageQueries.conversationMessages), + variables: { conversationId, limit: 10, skip: 0 } + }; + + // Read the data from our cache for this query. + try { + const data = store.readQuery(selector); + const messages = data.conversationMessages || []; + + messages.push(integrationSendMail); + + // Write our data back to the cache. + store.writeQuery({ ...selector, data }); + + if (closeReply) { + closeReply(); + } + } catch (e) { + Alert.error(e); + return; + } + }; + + // Invoke mutation + return save({ variables, optimisticResponse, update }); + }; + + const updatedProps = { + ...props, + sendMail, + integrations, + currentUser, + fetchMoreEmailTemplates, + responseTemplates: responseTemplatesQuery.responseTemplates || [], + }; + + return ; +}; + +export default withProps( + compose( + graphql(gql(queries.integrations), { + name: 'integrationsQuery', + options: () => { + return { + variables: { kind: 'whatspro' }, + fetchPolicy: 'network-only' + }; + } + }), + graphql( + gql(templatesQuery.responseTemplates), + { + name: 'responseTemplatesQuery', + options: () => ({ + variables: { perPage: 200 } + }) + } + ), + graphql(gql(templatesQuery.responseTemplatesTotalCount), { + name: 'responseTemplatesTotalCountQuery' + }), + graphql(gql(mutations.integrationSendMail), { + name: 'sendMailMutation', + options: () => ({ + refetchQueries: ['activityLogs'] + }) + }) + )(withCurrentUser(WhatsProFormContainer)) +); diff --git a/ui/src/modules/settings/integrations/containers/whatspro/constants.ts b/ui/src/modules/settings/integrations/containers/whatspro/constants.ts new file mode 100644 index 00000000000..50beaaaf061 --- /dev/null +++ b/ui/src/modules/settings/integrations/containers/whatspro/constants.ts @@ -0,0 +1,52 @@ +/** + * Default field values for: Mail Optimistic UI + */ +const customerId = Math.round(Math.random() * -1000000); +const messageCustomerId = Math.round(Math.random() * -1000000); +const userId = Math.round(Math.random() * -1000000); +const messageId = Math.round(Math.random() * -1000000); +const createdAt = new Date(); + +const defaultMessageFields = { + __typename: 'ConversationMessage', + customerId: messageCustomerId, + userId, + createdAt, + internal: false, + fromBot: false, + mentionedUserIds: [], + attachments: null, + isCustomerRead: false, + botData: null, + messengerAppData: null, + formWidgetData: null, + user: null +}; + +const defaultCustomerFields = { + __typename: 'Customer', + _id: customerId, + avatar: null, + companies: null, + customFieldsData: null, + getTags: null, + state: 'visitor', + lastName: null, + primaryPhone: null, + tagIds: null +}; + +const defaultMailFields = { + __typename: 'MailData', + threadId: '', + messageId, + reply: null, + inReplyTo: null, + replyToMessageId: null, + replyTo: null, + references: null, + headerId: null, + accountId: Math.random() +}; + +export { defaultMessageFields, defaultCustomerFields, defaultMailFields }; From 7d64b713aa9ce56e01bc49f0b1d7b9cb05cbe331 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Wed, 18 May 2022 14:14:03 -0300 Subject: [PATCH 118/135] implemening send whatspro --- .dockerignore | 1 - .../components/whatspro/WhatsProForm.tsx | 153 ++++-------------- .../responseTemplate/ResponseTemplate.tsx | 95 ----------- .../components/whatspro/styles.ts | 31 +--- .../containers/whatspro/WhatsProForm.tsx | 140 +--------------- 5 files changed, 38 insertions(+), 382 deletions(-) delete mode 100644 ui/src/modules/settings/integrations/components/whatspro/responseTemplate/ResponseTemplate.tsx diff --git a/.dockerignore b/.dockerignore index 8d26959a828..ca81272681c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -12,7 +12,6 @@ src *.md Dockerfile* jest*.js -*.json yarn.lock docker-entrypoint.sh *.tar.gz diff --git a/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx b/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx index 7fc2e3ee968..289e3abd073 100644 --- a/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx +++ b/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx @@ -8,15 +8,12 @@ import EditorCK from 'modules/common/containers/EditorCK'; import { __, Alert, uploadHandler } from 'modules/common/utils'; import { Meta } from 'modules/inbox/components/conversationDetail/workarea/mail/style'; import { FileName } from 'modules/inbox/styles'; -import { IMail } from 'modules/inbox/types'; import { IIntegration } from 'modules/settings/integrations/types'; import React, { ReactNode } from 'react'; import { MAIL_TOOLBARS_CONFIG } from '../../constants'; -import { formatObj, formatStr } from '../../containers/utils'; +import { formatStr } from '../../containers/utils'; import { IUser } from 'modules/auth/types'; -import { generateEmailTemplateParams } from 'modules/engage/utils'; -import ResponseTemplate from './responseTemplate/ResponseTemplate'; import { AttachmentContainer, Attachments, @@ -24,7 +21,7 @@ import { ControlWrapper, EditorFooter, FileSize, - MailEditorWrapper, + EditorWrapper, SpaceBetweenRow, ToolBar, Uploading @@ -32,27 +29,24 @@ import { import { FlexRow } from './styles'; import WhatsProChooser from './WhatsProChooser'; import { IResponseTemplate } from 'modules/settings/responseTemplates/types'; +import { ResponseTemplate } from 'modules/inbox/containers/conversationDetail'; type Props = { - responseTemplates: IResponseTemplate[]; currentUser: IUser; integrationId?: string; integrations: IIntegration[]; toPhone?: string; - mailData?: IMail; clearOnSubmit?: boolean; brandId?: string; closeModal?: () => void; - fetchMoreEmailTemplates: () => void; createdAt?: Date; - sendMail: ( + sendMessage: ( { variables, callback }: { variables: any; callback: () => void } ) => void; }; type State = { status?: string; - templateId: string; to?: string; toPhone?: string; from?: string; @@ -70,10 +64,7 @@ class WhatsProForm extends React.Component { constructor(props: Props) { super(props); - const { mailData = {} as IMail } = props; - - const [from] = mailData.from || [{}]; - const sender = this.getPhoneSender(from.email || props.toPhone); + const sender = props.toPhone; const fromId = this.getIntegrationId( props.integrations, @@ -83,8 +74,6 @@ class WhatsProForm extends React.Component { this.state = { to: sender, - templateId: '', - isLoading: false, toPhone: sender, @@ -115,45 +104,27 @@ class WhatsProForm extends React.Component { }); }; - onSubmit = (e, shouldResolve = false) => { - const { - closeModal, - integrationId, - sendMail, - clearOnSubmit - } = this.props; - - const mailData = this.props.mailData || ({} as IMail); - const { - content, - from, - attachments, - to, - kind - } = this.state; + onSubmit = () => { + const { closeModal, integrationId, sendMessage, clearOnSubmit } = this.props; + + const { content, from, attachments, to, kind } = this.state; if (!to) { return Alert.error('This message must have at least one recipient.'); } - const { references, headerId, threadId } = mailData; - this.setState({ isLoading: true }); const variables = { - headerId, - references, - threadId, attachments, kind, body: content, erxesApiId: from, - shouldResolve, to: formatStr(to), from: integrationId ? integrationId : from }; - return sendMail({ + return sendMessage({ variables, callback: () => { this.setState({ isLoading: false }); @@ -162,7 +133,7 @@ class WhatsProForm extends React.Component { this.clearContent(); } - return closeModal && closeModal(); + return closeModal && closeModal(); } }); }; @@ -212,59 +183,15 @@ class WhatsProForm extends React.Component { }); }; - getPhoneSender = (toPhone?: string) => { - const mailData = this.props.mailData || ({} as IMail); - const { integrationEmail } = mailData; - - const to = formatObj(mailData.to) || ''; - - // new email - if ((!to || to.length === 0) && !integrationEmail) { - return toPhone; - } - - // reply - if (!integrationEmail && !toPhone) { - return ''; - } - - if (!integrationEmail && to !== toPhone) { - return toPhone; - } - - let receiver; - - // Prevent send email to itself - if (integrationEmail === toPhone) { - receiver = to; - } else { - let toEmails; - - // Exclude integration email from [to] - if (to.includes(integrationEmail)) { - toEmails = to.split(' ').filter(email => email !== integrationEmail); - } else { - toEmails = to; - } - - receiver = toEmails + ' ' + toPhone; - } - - return receiver; - }; - - findTemplate = id => { - const template = this.props.responseTemplates.find(t => t._id === id); - - if (template) { - return template.content; + onSelectTemplate = (responseTemplate?: IResponseTemplate) => { + if (!responseTemplate) { + return null; } - return ''; - }; - - templateChange = value => { - this.setState({ content: this.findTemplate(value), templateId: value }); + return this.setState({ + content: responseTemplate.content, + attachments: responseTemplate.files || [] + }); }; onAttachment = (e: React.FormEvent) => { @@ -471,10 +398,6 @@ class WhatsProForm extends React.Component { renderButtons() { const { kind } = this.state; - const { - responseTemplates: emailTemplates, - fetchMoreEmailTemplates - } = this.props; const inputProps = { type: 'file', @@ -484,8 +407,7 @@ class WhatsProForm extends React.Component { : this.handleFileInput }; - return ( - + return {this.renderIcon({ @@ -494,30 +416,21 @@ class WhatsProForm extends React.Component { element: })} - + - {this.state.isUploading ? ( - + {this.state.isUploading ? Uploading... - - ) : ( -
    + :
    {this.renderSubmit('Send', this.onSubmit, 'primary')} -
    - )} +
    }
    -
    - ); +
    ; } renderBody() { return ( - + { toolbarLocation="bottom" autoFocus={true} autoGrow={true} - autoGrowMinHeight={120} - name={`mail_${this.state.to || this.props.currentUser._id}`} + autoGrowMinHeight={280} + name={`whatspro_${this.state.to || this.props.currentUser._id}`} /> - + ); } @@ -543,13 +456,9 @@ class WhatsProForm extends React.Component { } renderMeta = () => { - return ( - - - {this.renderLeftSide()} - - - ); + return + {this.renderLeftSide()} + ; }; render() { diff --git a/ui/src/modules/settings/integrations/components/whatspro/responseTemplate/ResponseTemplate.tsx b/ui/src/modules/settings/integrations/components/whatspro/responseTemplate/ResponseTemplate.tsx deleted file mode 100644 index 17e80ddf1c8..00000000000 --- a/ui/src/modules/settings/integrations/components/whatspro/responseTemplate/ResponseTemplate.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import Button from 'modules/common/components/Button'; -import EmptyState from 'modules/common/components/EmptyState'; -import { - PopoverBody, - PopoverFooter, - PopoverList -} from 'modules/common/components/filterableList/styles'; -import Icon from 'modules/common/components/Icon'; -import Tip from 'modules/common/components/Tip'; -import { __ } from 'modules/common/utils'; -import { ResponseTemplateStyled as EmailTemplateStyled } from 'modules/inbox/styles'; -import React from 'react'; -import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; -import Popover from 'react-bootstrap/Popover'; - -type Props = { - fetchMoreEmailTemplates: () => void; - targets: Array<{ value: string; label: string }>; - onSelect: (id: string) => void; -}; - -class EmailTemplate extends React.Component { - private overlayRef; - - handleFetch = () => { - this.props.fetchMoreEmailTemplates(); - } - - handleClick(value: string) { - this.props.onSelect(value); - this.hidePopover(); - } - - hidePopover = () => { - this.overlayRef.hide(); - }; - - renderContent() { - const { targets = [] } = this.props; - - if (!targets || targets.length === 0) { - return ; - } - - targets.unshift({ value: '', label: 'Clear' }); - - return targets.map(item => { - const onClick = () => this.handleClick(item.value); - - return ( -
  • - {item.label} -
  • - ); - }); - } - - render() { - const popover = ( - - {__('Email Templates')} - - - {this.renderContent()} - - - - - - - ); - - return ( - - { - this.overlayRef = overlayTrigger; - }} - > - - - - ); - } -} - -export default EmailTemplate; diff --git a/ui/src/modules/settings/integrations/components/whatspro/styles.ts b/ui/src/modules/settings/integrations/components/whatspro/styles.ts index 93de1dde8a5..4701e676c7c 100644 --- a/ui/src/modules/settings/integrations/components/whatspro/styles.ts +++ b/ui/src/modules/settings/integrations/components/whatspro/styles.ts @@ -2,7 +2,6 @@ import { SelectWrapper } from 'modules/common/components/form/styles'; import { colors, dimensions } from 'modules/common/styles'; import { Attachment } from 'modules/inbox/styles'; import styled from 'styled-components'; -import styledTS from 'styled-components-ts'; const AttachmentContainer = styled(Attachment)` padding: 3px 8px; @@ -45,7 +44,7 @@ const LeftSection = styled.div` margin: 5px 10px 0 0; `; -const MailEditorWrapper = styled.div` +const EditorWrapper = styled.div` position: relative; background: ${colors.colorWhite}; @@ -77,19 +76,6 @@ const MailEditorWrapper = styled.div` } `; -const Resipients = styledTS<{ isActive?: boolean }>(styled.a)` - padding-left: ${dimensions.unitSpacing}px; - font-size: 12px; - color: ${colors.colorCoreLightGray}; - display: ${props => props.isActive && 'none'}; - font-weight: 500; - - &:hover { - cursor: pointer; - color: ${colors.colorCoreGray}; - } -`; - const EditorFooter = styled.div` padding: ${dimensions.unitSpacing}px ${dimensions.coreSpacing}px; `; @@ -170,27 +156,14 @@ const Column = styled.div` flex: 1; `; -const Subject = styledTS<{ noBorder?: boolean }>(styled.div)` - padding: ${dimensions.unitSpacing}px ${dimensions.coreSpacing}px; - border-bottom:${props => - !props.noBorder && `1px solid ${colors.borderPrimary}`}; - - input { - height: ${dimensions.coreSpacing}px; - border-bottom: 0; - } -`; - export { Attachments, FlexRow, Column, - Subject, ToolBar, - MailEditorWrapper, + EditorWrapper, ControlWrapper, LeftSection, - Resipients, Uploading, AttachmentContainer, SpaceBetweenRow, diff --git a/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx b/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx index 6eee87a5980..b7edaedfc0b 100644 --- a/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx +++ b/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx @@ -1,23 +1,14 @@ import gql from 'graphql-tag'; import * as compose from 'lodash.flowright'; -import debounce from 'lodash/debounce'; import withCurrentUser from 'modules/auth/containers/withCurrentUser'; import { IUser } from 'modules/auth/types'; import Spinner from 'modules/common/components/Spinner'; import { Alert, withProps } from 'modules/common/utils'; -import { queries as messageQueries } from 'modules/inbox/graphql'; -import { IMail } from 'modules/inbox/types'; -import { queries as templatesQuery } from 'modules/settings/responseTemplates/graphql'; import { mutations, queries } from 'modules/settings/integrations/graphql'; import * as React from 'react'; import { graphql } from 'react-apollo'; import WhatsProForm from '../../components/whatspro/WhatsProForm'; import { IntegrationsQueryResponse } from '../../types'; -import { - defaultCustomerFields, - defaultMailFields, - defaultMessageFields -} from './constants'; import { __ } from 'modules/common/utils'; import { ResponseTemplatesQueryResponse, ResponseTemplatesTotalCountQueryResponse } from 'modules/settings/responseTemplates/types'; @@ -26,14 +17,9 @@ type Props = { clearOnSubmit?: boolean; integrationId?: string; brandId?: string; - conversationId?: string; refetchQueries?: string[]; toPhone?: string; customerId?: string; - mailData?: IMail; - isReply?: boolean; - isForward?: boolean; - replyAll?: boolean; createdAt?: Date; toggleReply?: (toAll?: boolean) => void; closeModal?: () => void; @@ -51,15 +37,9 @@ type FinalProps = { const WhatsProFormContainer = (props: FinalProps) => { const { - mailData, customerId, - conversationId, integrationsQuery, - isReply, closeModal, - closeReply, - responseTemplatesQuery, - responseTemplatesTotalCountQuery, sendMailMutation, currentUser } = props; @@ -68,31 +48,6 @@ const WhatsProFormContainer = (props: FinalProps) => { return ; } - const fetchMoreEmailTemplates = () => { - const { fetchMore, responseTemplates } = responseTemplatesQuery; - const { responseTemplatesTotalCount } = responseTemplatesTotalCountQuery; - - if (responseTemplatesTotalCount === responseTemplates.length) { - return; - } - - return fetchMore({ - variables: { perPage: 200 }, - updateQuery: (prev, { fetchMoreResult }) => { - if (!fetchMoreResult) { - return prev; - } - - return Object.assign({}, prev, { - responseTemplates: [ - ...prev.responseTemplates, - ...fetchMoreResult.responseTemplates - ] - }); - } - }); - }; - const integrations = integrationsQuery.integrations || []; const save = ({ @@ -112,19 +67,7 @@ const WhatsProFormContainer = (props: FinalProps) => { update }) .then(() => { - Alert.success('You have successfully sent a email'); - - if (isReply && variables.shouldResolve) { - debounce( - () => - Alert.info( - `${__( - 'This email conversation will be automatically moved to a resolved state' - )}.` - ), - 3300 - )(); - } + Alert.success('You have successfully sent a message'); if (closeModal) { closeModal(); @@ -143,82 +86,21 @@ const WhatsProFormContainer = (props: FinalProps) => { }); }; - const sendMail = ({ + const sendMessage = ({ variables, callback }: { variables: any; callback: () => void; }) => { - if (!isReply) { - return save({ variables, callback }); - } - - const email = mailData ? mailData.integrationEmail : ''; - - const integrationSendMail = { - _id: Math.round(Math.random() * -1000000), - ...defaultMessageFields, - conversationId, - videoCallData: null, - contentType: '', - content: variables.body, - customer: { - ...defaultCustomerFields, - firstName: email, - primaryEmail: email - }, - mailData: { - ...defaultMailFields, - bcc: [{ __typename: 'Email', email: variables.bcc }], - to: [{ __typename: 'Email', email: variables.to }], - from: [{ __typename: 'Email', email: variables.to }], - cc: [{ __typename: 'Email', email: variables.cc }], - body: variables.body, - subject: variables.subject, - attachments: variables.attachments, - integrationEmail: variables.from - } - }; - - const optimisticResponse = { __typename: 'Mutation', integrationSendMail }; - - const update = store => { - const selector = { - query: gql(messageQueries.conversationMessages), - variables: { conversationId, limit: 10, skip: 0 } - }; - - // Read the data from our cache for this query. - try { - const data = store.readQuery(selector); - const messages = data.conversationMessages || []; - - messages.push(integrationSendMail); - - // Write our data back to the cache. - store.writeQuery({ ...selector, data }); - - if (closeReply) { - closeReply(); - } - } catch (e) { - Alert.error(e); - return; - } - }; - - // Invoke mutation - return save({ variables, optimisticResponse, update }); + return save({ variables, callback }); }; const updatedProps = { ...props, - sendMail, + sendMessage, integrations, - currentUser, - fetchMoreEmailTemplates, - responseTemplates: responseTemplatesQuery.responseTemplates || [], + currentUser }; return ; @@ -235,18 +117,6 @@ export default withProps( }; } }), - graphql( - gql(templatesQuery.responseTemplates), - { - name: 'responseTemplatesQuery', - options: () => ({ - variables: { perPage: 200 } - }) - } - ), - graphql(gql(templatesQuery.responseTemplatesTotalCount), { - name: 'responseTemplatesTotalCountQuery' - }), graphql(gql(mutations.integrationSendMail), { name: 'sendMailMutation', options: () => ({ From f60bcba637ee26028c1e6f99b89486565a6c14e5 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Thu, 26 May 2022 21:45:04 -0300 Subject: [PATCH 119/135] get last conversation for customer and integration --- .../components/detail/CustomerDetails.tsx | 1 + ui/src/modules/inbox/graphql/queries.ts | 4 + ui/src/modules/inbox/types.ts | 6 ++ .../containers/whatspro/WhatsProForm.tsx | 84 +++++++++++++------ 4 files changed, 69 insertions(+), 26 deletions(-) diff --git a/ui/src/modules/customers/components/detail/CustomerDetails.tsx b/ui/src/modules/customers/components/detail/CustomerDetails.tsx index 0bb3cc1405c..79ace3657e7 100755 --- a/ui/src/modules/customers/components/detail/CustomerDetails.tsx +++ b/ui/src/modules/customers/components/detail/CustomerDetails.tsx @@ -75,6 +75,7 @@ class CustomerDetails extends React.Component { const content = props => ( { currentUser } = props; + console.log(props); + if (integrationsQuery.loading) { return ; } @@ -61,28 +71,47 @@ const WhatsProFormContainer = (props: FinalProps) => { callback?: () => void; update?: any; }) => { - return sendMailMutation({ - variables: { ...variables, customerId }, - optimisticResponse, - update - }) - .then(() => { - Alert.success('You have successfully sent a message'); + return client + .query({ + query: gql(inboxQueries.lastConversation), + variables: { + customerId, + integrationId: variables.from, + status: 'open' + }, + fetchPolicy: 'network-only' + }) + .then(({ data }: any) => { + if (true) { + console.log(data); + } else { + return sendMailMutation({ + variables: { ...variables, customerId }, + optimisticResponse, + update + }) + .then(() => { + Alert.success('You have successfully sent a message'); - if (closeModal) { - closeModal(); - } + if (closeModal) { + closeModal(); + } - if (callback) { - callback(); + if (callback) { + callback(); + } + }) + .catch(e => { + Alert.error(e.message); + + if (closeModal) { + closeModal(); + } + }); } }) .catch(e => { Alert.error(e.message); - - if (closeModal) { - closeModal(); - } }); }; @@ -108,15 +137,18 @@ const WhatsProFormContainer = (props: FinalProps) => { export default withProps( compose( - graphql(gql(queries.integrations), { - name: 'integrationsQuery', - options: () => { - return { - variables: { kind: 'whatspro' }, - fetchPolicy: 'network-only' - }; + graphql( + gql(integrationQueries.integrations), + { + name: 'integrationsQuery', + options: () => { + return { + variables: { kind: 'whatspro' }, + fetchPolicy: 'network-only' + }; + } } - }), + ), graphql(gql(mutations.integrationSendMail), { name: 'sendMailMutation', options: () => ({ From 1aed350e41f027055004e9d8b4b52107c827c4fe Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Fri, 27 May 2022 20:39:39 -0300 Subject: [PATCH 120/135] implemented conversationAdd and send message and attachments --- ui/src/modules/inbox/graphql/mutations.ts | 17 +++ .../components/whatspro/WhatsProForm.tsx | 89 ++++++-------- .../containers/whatspro/WhatsProForm.tsx | 113 +++++++++++------- 3 files changed, 124 insertions(+), 95 deletions(-) diff --git a/ui/src/modules/inbox/graphql/mutations.ts b/ui/src/modules/inbox/graphql/mutations.ts index a31efd82d13..ae99af08d45 100644 --- a/ui/src/modules/inbox/graphql/mutations.ts +++ b/ui/src/modules/inbox/graphql/mutations.ts @@ -1,6 +1,22 @@ import messageFields from './messageFields'; import { paramsDef, paramsValue } from './queries'; +const conversationAdd = ` + mutation conversationAdd( + $customerId: String, + $content: String, + $integrationId: String, + ) { + conversationAdd( + customerId: $customerId, + integrationId: $integrationId, + content: $content, + ) { + _id + } + } +`; + const conversationMessageAdd = ` mutation conversationMessageAdd( $conversationId: String, @@ -120,6 +136,7 @@ const resolveAll = ` export default { conversationsReplyFacebookComment, + conversationAdd, conversationMessageAdd, conversationsChangeStatus, conversationsAssign, diff --git a/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx b/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx index 289e3abd073..3464329e66b 100644 --- a/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx +++ b/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx @@ -11,7 +11,6 @@ import { FileName } from 'modules/inbox/styles'; import { IIntegration } from 'modules/settings/integrations/types'; import React, { ReactNode } from 'react'; import { MAIL_TOOLBARS_CONFIG } from '../../constants'; -import { formatStr } from '../../containers/utils'; import { IUser } from 'modules/auth/types'; import { @@ -50,7 +49,6 @@ type State = { to?: string; toPhone?: string; from?: string; - kind: string; content: string; isLoading: boolean; integrations: IIntegration[]; @@ -73,29 +71,19 @@ class WhatsProForm extends React.Component { this.state = { to: sender, - isLoading: false, - toPhone: sender, from: fromId, - content: this.getContent(), - + content: '', status: 'draft', isUploading: false, - kind: this.getSelectedIntegration(fromId).kind || '', - attachments: [], fileIds: [], totalFileSize: 0, - integrations: props.integrations }; } - getContent() { - return `

     

     

    `; - } - clearContent = () => { this.setState({ to: '', @@ -105,9 +93,14 @@ class WhatsProForm extends React.Component { }; onSubmit = () => { - const { closeModal, integrationId, sendMessage, clearOnSubmit } = this.props; + const { + closeModal, + integrationId, + sendMessage, + clearOnSubmit + } = this.props; - const { content, from, attachments, to, kind } = this.state; + const { content, from, attachments, to } = this.state; if (!to) { return Alert.error('This message must have at least one recipient.'); @@ -117,10 +110,7 @@ class WhatsProForm extends React.Component { const variables = { attachments, - kind, - body: content, - erxesApiId: from, - to: formatStr(to), + content, from: integrationId ? integrationId : from }; @@ -138,14 +128,6 @@ class WhatsProForm extends React.Component { }); }; - getSelectedIntegration = (selectedId: string) => { - const integration = this.props.integrations.find( - obj => obj._id === selectedId - ); - - return integration || ({} as IIntegration); - }; - changeEditorContent = (content: string) => { this.setState({ content }); }; @@ -196,24 +178,20 @@ class WhatsProForm extends React.Component { onAttachment = (e: React.FormEvent) => { const files = e.currentTarget.files; - const { attachments, from } = this.state; + const { attachments } = this.state; uploadHandler({ - kind: 'nylas', files, - userId: this.props.currentUser._id, - extraFormData: [ - { key: 'erxesApiId', value: this.props.integrationId || from || '' } - ], beforeUpload: () => { this.setState({ isUploading: true }); }, - afterUpload: ({ response }) => { - const resObj = JSON.parse(response); - + afterUpload: ({ response, fileInfo }) => { this.setState({ isUploading: false, - attachments: [...attachments, { ...resObj }] + attachments: [ + ...attachments, + Object.assign({ url: response }, fileInfo) + ] }); } }); @@ -290,7 +268,7 @@ class WhatsProForm extends React.Component { } const onChangePhone = (from: string) => { - this.setState({ from, kind: this.getSelectedIntegration(from).kind }); + this.setState({ from }); }; return ( @@ -397,17 +375,14 @@ class WhatsProForm extends React.Component { } renderButtons() { - const { kind } = this.state; - const inputProps = { type: 'file', multiple: true, - onChange: kind.includes('nylas') - ? this.onAttachment - : this.handleFileInput + onChange: this.onAttachment }; - return + return ( + {this.renderIcon({ @@ -416,16 +391,24 @@ class WhatsProForm extends React.Component { element: })} - + - {this.state.isUploading ? + {this.state.isUploading ? ( + Uploading... - :
    - {this.renderSubmit('Send', this.onSubmit, 'primary')} -
    } +
    + ) : ( +
    {this.renderSubmit('Send', this.onSubmit, 'primary')}
    + )}
    -
    ; +
    + ); } renderBody() { @@ -456,9 +439,11 @@ class WhatsProForm extends React.Component { } renderMeta = () => { - return + return ( + {this.renderLeftSide()} - ; + + ); }; render() { diff --git a/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx b/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx index 1eea7561e53..728beed79bb 100644 --- a/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx +++ b/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx @@ -5,11 +5,11 @@ import withCurrentUser from 'modules/auth/containers/withCurrentUser'; import { IUser } from 'modules/auth/types'; import Spinner from 'modules/common/components/Spinner'; import { Alert, withProps } from 'modules/common/utils'; +import { queries as integrationQueries } from 'modules/settings/integrations/graphql'; import { - mutations, - queries as integrationQueries -} from 'modules/settings/integrations/graphql'; -import { queries as inboxQueries } from 'modules/inbox/graphql'; + mutations as inboxMutations, + queries as inboxQueries +} from 'modules/inbox/graphql'; import * as React from 'react'; import { graphql } from 'react-apollo'; import WhatsProForm from '../../components/whatspro/WhatsProForm'; @@ -20,6 +20,12 @@ import { ResponseTemplatesQueryResponse, ResponseTemplatesTotalCountQueryResponse } from 'modules/settings/responseTemplates/types'; +import { + AddMessageMutationResponse, + AddMessageMutationVariables +} from 'modules/inbox/types'; +import { withRouter } from 'react-router-dom'; +import { IRouterProps } from 'modules/common/types'; type Props = { clearOnSubmit?: boolean; @@ -37,18 +43,19 @@ type Props = { type FinalProps = { currentUser: IUser; - sendMailMutation: any; + addMessageMutation: any; responseTemplatesQuery: ResponseTemplatesQueryResponse; responseTemplatesTotalCountQuery: ResponseTemplatesTotalCountQueryResponse; integrationsQuery: IntegrationsQueryResponse; -} & Props; +} & Props & + IRouterProps; const WhatsProFormContainer = (props: FinalProps) => { const { customerId, integrationsQuery, closeModal, - sendMailMutation, + addMessageMutation, currentUser } = props; @@ -76,39 +83,56 @@ const WhatsProFormContainer = (props: FinalProps) => { query: gql(inboxQueries.lastConversation), variables: { customerId, - integrationId: variables.from, - status: 'open' + integrationId: variables.from + // status: ['open'] }, fetchPolicy: 'network-only' }) - .then(({ data }: any) => { - if (true) { - console.log(data); - } else { - return sendMailMutation({ - variables: { ...variables, customerId }, - optimisticResponse, - update - }) - .then(() => { - Alert.success('You have successfully sent a message'); - - if (closeModal) { - closeModal(); - } - - if (callback) { - callback(); - } - }) - .catch(e => { - Alert.error(e.message); - - if (closeModal) { - closeModal(); - } - }); + .then(async ({ data }: any) => { + if (!data.conversationsGetLast) { + const result = await client.mutate({ + mutation: gql(inboxMutations.conversationAdd), + variables: { + customerId, + integrationId: variables.from, + content: '' + } + }); + + data.conversationsGetLast = result.data.conversationAdd; } + + return addMessageMutation({ + variables: { + ...variables, + customerId, + conversationId: data.conversationsGetLast._id + }, + optimisticResponse, + update + }) + .then(() => { + Alert.success('You have successfully sent a message'); + + if (closeModal) { + closeModal(); + } + + if (callback) { + callback(); + } + + props.history.push( + `/inbox/index?_id=${data.conversationsGetLast._id}` + ); + }) + .catch(e => { + Alert.error(e.message); + + if (closeModal) { + closeModal(); + } + }); }) .catch(e => { Alert.error(e.message); @@ -149,11 +173,14 @@ export default withProps( } } ), - graphql(gql(mutations.integrationSendMail), { - name: 'sendMailMutation', - options: () => ({ - refetchQueries: ['activityLogs'] - }) - }) - )(withCurrentUser(WhatsProFormContainer)) + graphql( + gql(inboxMutations.conversationMessageAdd), + { + name: 'addMessageMutation', + options: () => ({ + refetchQueries: ['activityLogs'] + }) + } + ) + )(withCurrentUser(withRouter(WhatsProFormContainer))) ); From 3563cca6fa7dc121a0df240a8097c640f3b84e7c Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Thu, 15 Sep 2022 08:34:01 -0300 Subject: [PATCH 121/135] fix change customer status --- .../customers/components/common/ActionSection.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/src/modules/customers/components/common/ActionSection.tsx b/ui/src/modules/customers/components/common/ActionSection.tsx index a8ab7b97865..f61d1a8075b 100644 --- a/ui/src/modules/customers/components/common/ActionSection.tsx +++ b/ui/src/modules/customers/components/common/ActionSection.tsx @@ -161,7 +161,7 @@ class ActionSection extends React.Component { selected={this.state.customerState === type} onClick={onClick} > - {type} + {__(type)}

    {__(desc)}

    ); @@ -170,12 +170,12 @@ class ActionSection extends React.Component { renderChangeStateForm() { const options = [ { - value: __('lead'), - desc: __('A person who preparing to buy some service or product') + value: 'lead', + desc: 'A person who preparing to buy some service or product' }, { - value: __('customer'), - desc: __('A person who already bought some service or product') + value: 'customer', + desc: 'A person who already bought some service or product' } ]; From 96dde7dd5f14de79e667903c50c55cd726ebd492 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Mon, 31 Oct 2022 10:23:42 -0300 Subject: [PATCH 122/135] add clean text on send whatsapp message --- .../integrations/components/whatspro/WhatsProForm.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx b/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx index 3464329e66b..f936807be6e 100644 --- a/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx +++ b/ui/src/modules/settings/integrations/components/whatspro/WhatsProForm.tsx @@ -91,6 +91,10 @@ class WhatsProForm extends React.Component { attachments: [] }); }; + + cleanText(text: string) { + return text.replace(/ /g, ' '); + } onSubmit = () => { const { @@ -110,7 +114,7 @@ class WhatsProForm extends React.Component { const variables = { attachments, - content, + content: this.cleanText(content) || ' ', from: integrationId ? integrationId : from }; From eb16f75e135fa6e9dbc6eddedc0d05f30d6d4343 Mon Sep 17 00:00:00 2001 From: Andre Date: Thu, 19 Jan 2023 08:40:21 -0300 Subject: [PATCH 123/135] add customer --- ui/src/locales/pt-br.json | 127 ++--- ui/src/locales/pt_BR.json | 504 +++++++++--------- .../team/components/detail/UserDetailForm.tsx | 3 +- 3 files changed, 319 insertions(+), 315 deletions(-) diff --git a/ui/src/locales/pt-br.json b/ui/src/locales/pt-br.json index 303da31b8ac..97b2658af11 100644 --- a/ui/src/locales/pt-br.json +++ b/ui/src/locales/pt-br.json @@ -1,5 +1,5 @@ { - "Homepage link": "https://www.erxes.io", + "Homepage link": "Link da Página Inicial", "Are you sure?": "Você tem certeza?", "Yes, I am": "Sim, eu tenho", "No, Cancel": "Não, cancelar", @@ -96,7 +96,7 @@ "Last Name": "Sobrenome", "First name": "Nome", "Last name": "Sobrenome", - "Primary Email": "E-mail primário", + "Primary Email": "E-mail principal", "Phone": "Telefone", "Is user": "É usuário", "Save & New": "Salvar & Novo", @@ -110,7 +110,7 @@ "IP Address": "Endereço de IP", "Hostname": "Hostname", "Language": "Linguagem", - "User Agent": "User Agent", + "User Agent": "Agente", "Other properties": "Outras propriedades", "Facebook": "Facebook", "Facebook profile": "Perfil do Facebook", @@ -642,8 +642,8 @@ "You can only import max 600 at a time": "Você pode importar no máximo 600 por vez", "Invalid import type": "Tipo de importação inválido", "Last updated": "Ultima atualização", - "Filter by lead status": "Filtrar pelo status da Lead", - "No lead status chosen": "Status da Lead não escolhido", + "Filter by lead status": "Filtrar pelo status do Lead", + "No lead status chosen": "Status do Lead não escolhido", "Schedule:": "Cronograma:", "Every Day": "Todo dia", "Every Month": "Todo mês", @@ -657,7 +657,7 @@ "Every Sunday": "Todo domingo", "Choose a schedule day": "Selecione o tipo de agendamento", "Choose a schedule time": "Selecione o horário do agendamento", - "Won": "Ganhou", + "Won": "Ganho", "Lost": "Perdido", "In Progress": "Em progresso", "It`s size exceeds the limit 10mb": "O tamanho excede o limite de 10 mb", @@ -791,23 +791,23 @@ "Choose groups": "Escolha grupos", "Allow": "Permitir", "Invitation Status": "Status do convite", - "Permission": "Permitir", + "Permission": "Permissões", "Continue": "Continuar", "Create brand": "Criar marca", "Create your first live chat and in-app messaging Stay up to date with every single customer feedback for more meaningful interactions": "Crie seu primeiro bate-papo ao vivo e mensagens no aplicativo. Mantenha-se atualizado com todos os comentários dos clientes para interações mais significativas.", "A channel gives a full view of all the brands and its applications all in one place You can see all in-coming messages in your team inbox": "Um canal oferece uma visão completa de todas as marcas e suas aplicações em um só lugar. Você pode ver todas as mensagens recebidas na caixa de entrada.", - "Hooray and Congratulations! You've completed the initial setup!": "Viva e parabéns! Você concluiu a configuração inicial!", + "Hooray and Congratulations! You've completed the initial setup!": "Parabéns! Você concluiu a configuração inicial!", "Paste the code below before the body tag on every page you want erxes chat to appear": "Cole o código abaixo antes da marcação do corpo em todas as páginas que você deseja que o erxes chat apareça", - "Choose messengers": "Escolha messengers", - "erxes allows you to create multiple messengers": "erxes permite criar vários messengers", - "erxes allows you to create multiple brands": "erxes permite criar várias marcas", - "erxes allows you to create multiple channels": "erxes permite criar vários canais", + "Choose messengers": "Escolha o mensageiro", + "erxes allows you to create multiple messengers": "permite criar vários messengers", + "erxes allows you to create multiple brands": "permite criar várias marcas", + "erxes allows you to create multiple channels": "permite criar vários canais", "Contacts": "Contatos", "Create group": "Criar grupo", "Visitors": "Visitantes", - "Due in the next day": "Vencimento no dia seguinte", - "Due in the next week": "Vencimento na próxima semana", - "Due in the next month": "Vencimento no próximo mês", + "Due in the next day": "Prazo no dia seguinte", + "Due in the next week": "Prazo na próxima semana", + "Due in the next month": "Prazo no próximo mês", "Has no close date": "Não tem data de fechamento", "Over due": "Vencido", "Clear Filter": "Limpar filtro", @@ -819,10 +819,10 @@ "Choose team members": "Escolha membros da equipe", "erxes Inc": "erxes Inc", "Get": "Receber", - "Download ios app for free on the App Store": "Baixe o aplicativo ios gratuitamente na App Store.", + "Download ios app for free on the App Store": "Baixe o aplicativo iOS gratuitamente na App Store.", "Download android app for free on the Google play": "Baixe o aplicativo Android gratuitamente no Google play.", - "Please upgrade your browser to use erxes!": "Atualize seu navegador para usar Erxes!", - "Unfortunately, You are running on a browser that may not be fully compatible with erxes": "Infelizmente, você está executando em um navegador que pode não ser totalmente compatível com Erxes.", + "Please upgrade your browser to use erxes!": "Atualize seu navegador!", + "Unfortunately, You are running on a browser that may not be fully compatible with erxes": "Infelizmente, você está executando em um navegador que pode não ser totalmente compatível.", "Please use recommended version": "Por favor, use a versão recomendada", "Messenger data": "Dados do messenger", "Customer field data": "Dados campo do cliente", @@ -837,9 +837,9 @@ "Check if permission is allowed": "Verifique se a permissão é permitida", "Then": "Então", "Or": "Ou", - "Auto message description": "Envie email direcionado e converse com usuários logados com base em sua marca / marcação / segmento. Você pode definir seu horário para enviar um e-mail ou conversar com antecedência. O bate-papo pode ser um trecho, badge ou a mensagem inteira. Podendo enviar um texto ou vídeo.", - "Manual message description": "Envie email direcionado e converse com usuários logados com base em sua marca / marcação / segmento. Um e-mail ou chat será enviado imediatamente após você clicar no botão Salvar. O bate-papo pode ser um trecho, badge ou a mensagem inteira. Podendo enviar um texto ou vídeo.", - "Visitor auto message description": "Envie chats direcionados para visitantes desconectados no site, com base na página de visita, atividade, país de residência e cidade. O bate-papo pode ser um trecho, badge ou a mensagem inteira. Podendo enviar um texto ou vídeo.", + "Auto message description": "Descrição da mensagem automática", + "Manual message description": "Descrição da mensagem manual", + "Visitor auto message description": "Descrição da mensagem automática do visitante", "Required field": "Campo obrigatório!", "Invalid email format! Please enter a valid email address": "Formato de email inválido! Por favor insira um endereço de e-mail válido.", "Invalid link": "Link inválido!", @@ -847,8 +847,8 @@ "characters": "caracteres!", "Invalid number format! Please enter a valid number": "Formato de número inválido! por favor insira um número válido.", "Insert email template to content": "Inserir modelo de email no conteúdo", - "Logs": "Registros", - "There are no logs recorded": "Não há registros registrados", + "Logs": "Logs", + "There are no logs recorded": "Não há logs registrados", "Module": "Módulo", "Unchanged fields": "Campos inalterados", "Changed fields": "Campos alteráveis", @@ -872,7 +872,7 @@ "Invite to video call": "Convidar para videochamada", "Video call invitation sent": "Convite para videochamada enviado", "Conversion": "Conversão", - "Go to import": "Ir para importar", + "Go to import": "Importar", "Related": "Relacionado", "sec": "sec", "Workflow": "Fluxo de trabalho", @@ -902,7 +902,7 @@ "Low": "Baixa", "Attachments": "Anexos", "Source": "Origem", - "Select a source": "Selecione uma origem", + "Select a source": "Selecione uma fonte", "Upload an attachment": "Carregar um anexo", "Select a priority": "Selecione uma prioridade", "Edit task": "Editar tarefa", @@ -939,7 +939,7 @@ "created": "criado", "show details": "mostrar detalhes", "this customer": "este cliente", - "This customer registered to erxes by": "Este cliente se cadastrou no erxes por", + "This customer registered to erxes by": "Este cliente se cadastrou por", "registered": "registrado", "This customer": "Este cliente", "Unknown": "Desconhecido", @@ -954,7 +954,7 @@ "segment": "segmento", "removed assignee of": "atribuição removida de", "moved": "movido", - "Welcome to erxes video tutorial": "Bem-vindo ao tutorial em vídeo erxes", + "Welcome to erxes video tutorial": "Bem-vindo ao tutorial em vídeo", "Here is where you can check your performance and find some tips": "Aqui é onde você pode verificar seu desempenho e encontrar algumas dicas", "For further help, please consult the": "Para obter mais ajuda, consulte a", "documentation": "documentação", @@ -967,7 +967,7 @@ "Growth hacking template": "Modelo de growth hacking", "Task stage": "Estágio de tarefa", "Tickets stage": "Etapa de ingressos", - "Tags - inbox, customer, engage pop, up": "Tags - inbox, cliente, pop-up de engajamento", + "Tags - inbox, customer, engage pop, up": "Tags - caixa de entrada, cliente, pop-up de engajamento", "Segments - customer": "Segmentos - cliente", "Permission - user group": "Permissão - grupo de usuários", "Team members - invite": "Membros da equipe - convite", @@ -979,7 +979,7 @@ "Using stage": "Usando o palco", "8 steps": "8 passos", "About 20 minutes": "Cerca de 20 minutos", - "Team inbox": "Inbox da equipe", + "Team inbox": "Caixa de entrada da equipe", "Growth Hacking": "Hacking de crescimento", "Use Cases": "Casos de Uso", "Please refer to the following playlist on the most up to date use case video guides": "Consulte a lista de reprodução a seguir nos guias de vídeo de casos de uso mais atualizados", @@ -1173,7 +1173,7 @@ "You successfully verified": "Verificado com sucesso", "Congrats, Successfully updated": "Parabéns, atualizado com sucesso", "Successfully resent the invitation": "O convite foi reenviado com sucesso", - "Please enter a repeat password": "Please enter a repeat password", + "Please enter a repeat password": "Por favor repita a senha", "Password didn't match": "Senha não confere", "Your password has been changed and updated": "Sua senha foi alterada e atualizada", "No email address found!": "Nenhum endereço de e-mail encontrado!", @@ -1233,15 +1233,15 @@ "If you wish to segment by any properties that are not available on erxes, make sure you’ve already created them": "Se você deseja segmentar por quaisquer propriedades que não estão disponíveis no erxes, certifique-se de já as ter criado", "Make sure you’re on the right page and you want to segment by from the list on the left: Visitor, Lead, Customer, Company": "Certifique-se de que você está na página certa e deseja segmentar na lista à esquerda: Visitante, Lead, Cliente, Empresa", "Customer Segments": "Segmentos de clientes", - "Lead": "Liderar", + "Lead": "Lead", "Visitor": "Visitante", "Learn how to create a segment": "Aprenda a criar um segmento", - "Go to Properties": "Vá para Propriedades", + "Go to Properties": "Ir para Propriedades", "Install the Event Tracking script": "Instale o script de acompanhamento de eventos", "If you wish to segment by events, i.e actions that are triggered by something your Customer performs on your website or app.": "Se você deseja segmentar por eventos, ou seja, ações que são acionadas por algo que seu cliente realiza em seu site ou aplicativo.", "Select the property/event you want to filter by, select one of the operators and type in or select the value from the dropdown menu": "Selecione a propriedade / evento pelo qual deseja filtrar, selecione um dos operadores e digite ou selecione o valor no menu suspenso", "Add Properties": "Adicionar Propriedades", - "Add Events": "Adicionar eventos", + "Add Events": "Adicionar Eventos", "Create your Segment": "Crie o seu segmento", "Setup a new segment": "Configure um novo segmento", "There aren’t any filters at the moment. You can create a segment by Property and/or by Events": "Não há filtros no momento. Você pode criar um segmento por propriedade e / ou por eventos", @@ -1255,9 +1255,9 @@ "Tip: Filter": "Dica: Filtro", "Tip: This could be equivalent to your brands or you can organize by year/project/etc": "Dica: isso pode ser equivalente às suas marcas ou você pode organizar por ano / projeto / etc", "Click on “Show Menu” to filter tasks by assigned team members, customers, date, etc": "Clique em “Mostrar Menu” para filtrar tarefas por membros da equipe atribuídos, clientes, data, etc", - "Getting Started with Tasks": "Introdução ao Tarefas", + "Getting Started with Tasks": "Introdução a Tarefas", "Create a more collaborative, self-reliant and cross-linked team with our Kanban-style boards": "Crie uma equipe mais colaborativa, autossuficiente e interligada com nossos quadros de estilo Kanban", - "Go to Board & Pipeline": "Vá para Board & Pipeline", + "Go to Board & Pipeline": "Ir para Quadros & Pipeline", "Add New": "Adicionar novo", "Getting Started with Sales Pipeline": "Introdução ao funil de vendas", "Drive leads to a successful close with our Kanban-style boards": "O Drive leva a um fechamento bem-sucedido com nossas placas de estilo Kanban", @@ -1289,7 +1289,7 @@ "The order of the columns does not need to match": "A ordem das colunas não precisa corresponder", "You can export your data from the list on the left": "Você pode exportar seus dados da lista à esquerda", "If you wish to export your popup forms, go to Customer and click on “Export Popups Data”": "Se você deseja exportar seus formulários pop-up, vá para Cliente e clique em “Exportar dados de pop-ups”", - "Go to Customers": "Vá para os clientes", + "Go to Customers": "Ir para os clientes", "Export Pop-ups data": "Exportar dados de pop-ups", "brand": "marca", "channel": "canal", @@ -1323,7 +1323,7 @@ "Region": "Região", "Host name": "Nome do host", "Linguagem": "Linguagem", - "User agent": "Agente de usuário", + "User agent": "Agente", "Profile score": "Pontuação do perfil", "email deliveries": "entregas de e-mail", "There are no logs": "Não há registros", @@ -1456,7 +1456,7 @@ "Telnyx phone number": "Número de telefone da Telnyx", "Telnyx messaging profile id": "ID de perfil de mensagens Telnyx", "Add telnyx": "Adicionar telnyx", - "Example payload": "Examplo de payload", + "Example payload": "Exemplo de payload", "Make things easy for your team members and add in ready made response templates": "Facilite as coisas para os membros da sua equipe e adicione modelos de resposta prontos", "Manage and edit your response templates according to each situation and respond in a timely manner and without the hassle": "Gerencie e edite seus modelos de resposta de acordo com cada situação e responda em tempo hábil e sem complicações", "You successfully added a response template": "Você adicionou com sucesso um modelo de resposta", @@ -1496,7 +1496,7 @@ "campaign": "campanha", "Get started on your project": "Comece seu projeto", "New Campaign": "Nova campanha", - "You successfully added a board": "Você adicionou uma placa com sucesso", + "You successfully added a board": "Você adicionou um quadro com sucesso", "You successfully updated a board": "Você atualizou um quadro com sucesso", "This will permanently delete the current Board": "Isso excluirá permanentemente o quadro atual", "Are you absolutely sure?": "Você tem certeza absoluta?", @@ -1522,7 +1522,7 @@ "Visibility": "Visibilidade", "Choose template": "Escolha o modelo", "Manage your boards and pipelines so that its easy to manage incoming leads or requests that is adaptable to your team's needs": "Gerencie seus quadros e pipelines para que seja fácil gerenciar leads ou solicitações que se adaptem às necessidades de sua equipe", - "Go to Campaign": "Vá para a campanha", + "Go to Campaign": "Ir para a campanha", "New Growth Hacking Templates": "Novos modelos de Growth Hacking", "You successfully added a growth hack template": "Você adicionou com sucesso um template growth hack", "You successfully updated a growth hack template": "Você atualizou com sucesso um template de growth hack", @@ -1557,7 +1557,7 @@ "Sales Pipeline Settings": "Configurações de processamento de vendas", "Sales board & Pipelines": "Quadro de vendas e pipelines", "Show only the user's assigned(created)": "Mostrar apenas o usuário atribuído (criado)", - "deal": "lidar", + "deal": "acordo", "Users eligible to see all": "Usuários qualificados para ver todos", "This will permanently update are you absolutely sure?": "Isso será atualizado permanentemente. Você tem certeza?", "Board & Pipeline": "Quadro e Pipeline", @@ -1651,12 +1651,12 @@ "Sync email contacts": "Sincronizar contatos de e-mail", "Start capturing social media contacts": "Comece a capturar contatos de mídia social", "Generate contacts through Popups": "Gerar contatos por meio de pop-ups", - "Go to Customer Import": "Vá para Importação do Cliente", + "Go to Customer Import": "Ir para Importação Cliente", "Create Messenger": "Criar Mensageiro", "Visit AppStore": "Visite a AppStore", "Create a Popup": "Crie um Popup", "Use Import feature to bulk import all your previous Customers or Leads": "Use o recurso de importação para importar em massa todos os seus clientes ou leads anteriores", - "Create your erxes Messenger to start capturing Visitors": "Crie o seu erxes Messenger para começar a capturar visitantes", + "Create your erxes Messenger to start capturing Visitors": "Crie o seu Messenger para começar a capturar visitantes", "Integrate your email address to sync previous email Leads": "Integre seu endereço de e-mail para sincronizar leads de e-mail anteriores", "Integrate social media website to start capturing Leads": "Integre o site de mídia social para começar a capturar Leads", "Create your popups and start collecting Leads": "Crie seus pop-ups e comece a coletar leads", @@ -1674,7 +1674,7 @@ "Create Pop Ups": "Criar Pop Ups", "Instale o script": "Instale o script", "Copy the individual script or use Script Manager to avoid script duplication errors if you’re planning to display this popup along with any other erxes widgets": "Copie o script individual ou use o Gerenciador de scripts para evitar erros de duplicação de scripts se você estiver planejando exibir este pop-up junto com quaisquer outros widgets erxes", - "Go to Script Manager": "Vá para o Gerenciador de Script", + "Go to Script Manager": "Ir para o Gerenciador de Script", "Write title": "Escreva o título", "Rule": "Regra", "Getting Started with Engage": "Primeiros passos com o Engage", @@ -1704,7 +1704,7 @@ "There aren’t any filters at the moment": "Não há filtros no momento", "You can create a segment by Property and/or by Events": "Você pode criar um segmento por propriedade e / ou por eventos", "Creating customer segment": "Criação de segmento de cliente", - "Getting Started with erxes Knowledgebase": "Introdução à Base de Conhecimento erxes", + "Getting Started with erxes Knowledgebase": "Introdução à Base de Conhecimento", "Educate your customers and staff by creating help articles to reach higher levels of satisfaction": "Eduque seus clientes e funcionários criando artigos de ajuda para alcançar níveis mais altos de satisfação", "Create your knowledgebase": "Crie sua base de conhecimento", @@ -1829,7 +1829,7 @@ "Primary phone verification status": "Status de verificação de telefone principal", "Not known": "Não conhecido", "Male": "Masculino", - "Female": "Fêmea", + "Female": "Feminino", "Not applicable": "Não aplicável", "Valid": "Válido", "Invalid": "Inválido", @@ -1847,7 +1847,7 @@ "Change phone status": "Alterar o status do telefone", "Choose Properties/View": "Escolha Propriedades / Exibir", "Manage properties": "Gerenciar propriedades", - "Export this leads": "Exportar esses leads", + "Export this leads": "Exportar leads", "Verify phone numbers": "Verifique os números de telefone", "Verify emails": "Verificar e-mails", "Cannot read property 'sendMessage' of undefined": "Não é possível ler a propriedade 'sendMessage' de indefinido", @@ -2170,13 +2170,13 @@ "Basic JavaScript": "JavaScript básico", "Single page apps": "Aplicativos de página única", "Google tag manager": "Gerenciador de tags do Google", - "Paste the following code before the body tag on every page you want erxes widget to appear": "Cole o seguinte código antes da tag do corpo em cada página que você deseja que o widget erxes apareça", + "Paste the following code before the body tag on every page you want erxes widget to appear": "Cole o seguinte código antes da tag do corpo em cada página que você deseja que o widget apareça", "For web apps built with asynchronous JavaScript": "Para aplicativos da web desenvolvidos com JavaScript assíncrono", - "Paste the code below in main layout you want erxes chat to appear": "Cole o código abaixo no layout principal que você deseja que o chat do erxes apareça", + "Paste the code below in main layout you want erxes chat to appear": "Cole o código abaixo no layout principal que você deseja que o chat do apareça", "To connect Google Tag Manager to erxes, you must have an active Google Tag Manager account with a published container": "Para conectar o Gerenciador de tags do Google a erxes, você deve ter uma conta do Gerenciador de tags do Google ativa com um contêiner publicado", "IOS": "IOS", "Android": "Android", - "Add Erxes SDK to your iOS project in Xcode:": "Adicione o SDK do Erxes ao seu projeto iOS no Xcode:", + "Add Erxes SDK to your iOS project in Xcode:": "Adicione o SDK ao seu projeto iOS no Xcode:", "then run": "então rode", "in terminal": "no terminal", "Add a 'Privacy - Photo Library Usage Description' entry to your": "Adicione uma entrada 'Privacy - Photo Library Usage Description' ao seu", @@ -2242,7 +2242,7 @@ "Yes, I want in": "Sim eu quero entrar", "I know I can unsubscribe easily at any time": "Eu sei que posso cancelar a inscrição facilmente a qualquer momento", "Save and continue to login": "Salve e continue para fazer o login", - "Short name": "Nome abreviado", + "Short name": "Nome curto", "Phone (operator)": "Telefone (operadora)", "Send to board": "Enviar para o quadro", "Time": "Tempo", @@ -2255,7 +2255,7 @@ "You successfully deleted a stage": "Você excluiu um estágio com sucesso", "Track your entire sales pipeline from one dashboard": "Acompanhe todo o seu funil de vendas em um único painel", "You can also restrict access to your sales pipelines": "Você também pode restringir o acesso aos seus canais de vendas", - "Create Boards and Pipelines": "Crie borads e pipelines", + "Create Boards and Pipelines": "Crie quadros e pipelines", "Tip: Choose different views": "Dica: Escolha diferentes visualizações", "Click on “Boards, Calendar, Conversions” to filter deals": "Clique em “Quadros, Calendário, Conversões” para filtrar ofertas", "unassigned": "não atribuído", @@ -2286,21 +2286,21 @@ "Reactions": "Reações", "Sad": "Triste", "Neutral": "Neutro", - "Like": "Gosto", + "Like": "Gostei", "Happy": "Feliz", "Dislike": "Não gosto", "publish": "publicar", - "Chat": "Bate-papo", + "Chat": "Chat", "Please carefully select the brand, it will appear in the selected brand messenger": "Selecione cuidadosamente a marca, ela aparecerá no mensageiro da marca selecionada", "Message not found": "Mensagem não encontrada", "Already exist": "Já existe", "You just deleted an engagement message": "Você acabou de deletar uma mensagem de engajamento", - "Yay! Your engagement message is now live": "Yay! Sua mensagem de engajamento agora está ao vivo", + "Yay! Your engagement message is now live": "Uhul! Sua mensagem de engajamento agora está ao vivo", "Your engagement message is paused for now": "Sua mensagem de engajamento está pausada por enquanto", "You successfully updated a engagement message": "Você atualizou com sucesso uma mensagem de engajamento", "You successfully added a engagement message": "Você adicionou com sucesso uma mensagem de engajamento", "SMS integration is not configured": "A integração de SMS não está configurada", - "Go to Settings > System config > Integrations config and set Telnyx SMS API key": "Vá para Configurações> Configuração do sistema> Configuração de integração e defina a chave da API Telnyx SMS", + "Go to Settings > System config > Integrations config and set Telnyx SMS API key": "Ir para Configurações> Configuração do sistema> Configuração de integração e defina a chave da API Telnyx SMS", "Compose your SMS": "Componha o seu SMS", "Email verified": "Email verificado", "Email not verified": "Email não verificado", @@ -2336,7 +2336,7 @@ "Conversation details": "Detalhes da conversa", "You successfully deleted a file": "Você excluiu um arquivo com sucesso", "Create product board note": "Criar nota de quadro de produto", - "Go to product board": "Vá para o quadro do produto", + "Go to product board": "Ir para o quadro do produto", "response frequency averages": "médias de frequência de resposta", "If you remove a pop ups, then all related conversations, customers will also be removed": "Se você remover um pop-up, todas as conversas relacionadas e os clientes também serão removidos", "You successfully deleted a pop ups": "Você excluiu com sucesso um pop-ups", @@ -2421,12 +2421,12 @@ "Show checked items": "Mostrar itens marcados", "Hide completed items": "Ocultar itens concluídos", "You successfully deleted a company": "Você excluiu uma empresa com sucesso", - "You successfully merged companies": "You successfully merged companies", + "You successfully merged companies": "Você fundiu empresas com sucesso", "Related Associate": "Associado Relacionado", "Competitor": "Concorrente", "Investor": "Investidor", "Partner": "Parceiro", - "Press": "pressione", + "Press": "Pressione", "Prospect": "Prospect", "Reseller": "Revendedor", "You successfully changed the state": "Você mudou o estado com sucesso", @@ -2444,7 +2444,10 @@ "Customer or company does not have primary phone": "Cliente ou empresa não tem telefone principal", "SMS successfully sent": "SMS enviado com sucesso", "There is no linked accounts": "Não há contas vinculadas", - "Continue with Facebook": "Continue with Facebook", + "Continue with Facebook": "Continuar com Facebook", "You canceled importing action": "Você cancelou a ação de importação", - "You can track your recently imported customers or companies here": "Você pode rastrear seus clientes ou empresas importados recentemente aqui" -} + "You can track your recently imported customers or companies here": "Você pode rastrear seus clientes ou empresas importados recentemente aqui", + "Export this contacts": "Exportar contatos", + "Export this companies": "Exportar empresas", + "User name": "Usuário" +} \ No newline at end of file diff --git a/ui/src/locales/pt_BR.json b/ui/src/locales/pt_BR.json index 0f0e996aa34..c117bb7a3a2 100644 --- a/ui/src/locales/pt_BR.json +++ b/ui/src/locales/pt_BR.json @@ -2,7 +2,7 @@ "Are you sure?": "Você tem certeza?", "Yes, I am": "Sim, eu tenho", "No, Cancel": "Não, cancelar", - "Filter by tags": "Filter by tags", + "Filter by tags": "Filtrar por etiquetas", "There is no data": "Não há dados", "There is no data.": "Não há dados.", "Load more": "Carregar mais", @@ -16,13 +16,13 @@ "Photo": "Foto", "Name": "Nome", "Views": "Visualizações", - "Conversion": "Conversion", - "Go to import": "Go to import", + "Conversion": "Conversão", + "Go to import": "Importar", "Conversion rate": "Taxa de conversão", "Contacts gathered": "Contatos reunidos", "Create lead": "Criar lead", "Form title": "Título do formulário", - "Related": "Related", + "Related": "Relacionado", "Form description": "Descrição do formulário", "Position": "Cargo", "Username": "Usuário", @@ -31,9 +31,9 @@ "Twitter username": "Usuário do Twitter", "Inbox": "Caixa de entrada", "Workflow": "Workflow", - "Watch": "Watch", - "Watching": "Watching", - "Team Inbox": "Team Inbox", + "Watch": "Ver", + "Watching": "Vendo", + "Team Inbox": "Caixa de entrada da equipe", "Customers": "Clientes", "Companies": "Empresas", "Engage": "Engajar", @@ -87,8 +87,8 @@ "There is no lead.": "Não há leads.", "New response template": "Novo modelo de resposta", "Cancel": "Cancelar", - "Public": "Public", - "Private": "Private", + "Public": "Público", + "Private": "Privado", "New email template": "Novo modelo de e-mail", "Local publisher's email template": "Modelo de e-mail dos publicadores locais", "New user": "Novo usuário", @@ -118,7 +118,7 @@ "IP Address": "Endereço de IP", "Hostname": "Hostname", "Language": "Linguagem", - "User Agent": "User Agent", + "User Agent": "Agente", "Other properties": "Outras propriedades", "Facebook": "Facebook", "Facebook profile": "Perfil do Facebook", @@ -152,7 +152,7 @@ "simple": "simples", "custom": "customizado", "default": "padrão", - "default language": "default language", + "default language": "idioma padrão", "primary": "primário", "Content": "Conteúdo", "Save & draft": "Salvar & rascunho", @@ -214,7 +214,7 @@ "Preview": "Visualizar", "Column name": "Nome da coluna", "Visible": "Visível", - "Visibility": "Visibility", + "Visibility": "Visibilidade", "Choose person": "Escolher pessoa", "Conversation Details": "Detalhes da Conversa", "Opened": "Aberto", @@ -271,11 +271,11 @@ "Mark Page Read": "Marcar Página como Lida", "Mark All Read": "Marcar Todas como Lidas", "Coming soon": "Em breve", - "Looks like you are all caught up": "Looks like you are all caught up", + "Looks like you are all caught up": "Parece que você está preso", "AI": "IA", "See all": "Ver tudo", "Select a field": "Selecione um campo", - "Add condition": "Adicionar uma condição", + "Add condition": "Adicionar condição", "Parent segment conditions": "Condições do segmento pai", "Filter by segments": "Filtrar por segmentos", "New segment": "Novo segmento", @@ -287,7 +287,7 @@ "Sub segment of": "Segmento secundário de", "Color": "Cor", "Filters": "Filtros", - "User(s) will receive this message": "O(s) usuário(s) irão receber essa mensagem.", + "User(s) will receive this message": "O(s) usuário(s) irá(ão) receber essa mensagem.", "Color code": "Código de cor", "Engage Message": "Mensagem de engajamento", "Item counts": "Contador de itens", @@ -344,10 +344,10 @@ "Knowledge base": "Base de conhecimento", "Notification": "Notificação", "Notifications": "Notificações", - "Show unread": "Show unread", - "Unread": "Unread", - "Recent": "Recent", - "Mark all as read": "Mark all as read", + "Show unread": "Mostrar não lido", + "Unread": "Não lida", + "Recent": "Recente", + "Mark all as read": "Marcar tudo como lido", "Email Appearance": "Aparência do e-mail", "Team Members": "Membros do Time", "Account default": "Conta padrão", @@ -359,7 +359,7 @@ "Email Template": "Padrão de E-mail", "Response templates": "Padrão de resposta", "Email templates": "Padrão de e-mail", - "Brand Name": "Nome da Marcar", + "Brand Name": "Nome da Marca", "Current template": "Padrão escolhido", "Created at": "Criado às", "Manage Fields": "Gerenciar campos", @@ -415,7 +415,7 @@ "Edit response": "Editar resposta", "To send your message press Enter and Shift + Enter to add a new line": "Para enviar sua mensagem pressione Enter e Shift + Enter para adicionar uma nova linha", "To send your note press Enter and Shift + Enter to add a new line": "Para enviar sua nota pressione Enter e Shift + Enter para adicionar uma nova linha", - "Please enter an unit price. It should be a number": "Please enter an unit price. It should be a number", + "Please enter an unit price. It should be a number": "Insira um preço unitário. Deve ser um número", "Type to search": "Digite para procurar", "Members": "Membros", "Choose integrations": "Escolher integrações", @@ -548,7 +548,7 @@ "Discount": "Desconto", "Tax": "Imposto", "Ticket": "Ticket", - "Task": "Task", + "Task": "Tarega", "Select company": "Selecionar empresa", "Select customer": "Selecionar cliente", "Note": "Nota", @@ -570,8 +570,8 @@ "Manage Board & Pipeline": "Gerenciar Quadros & Pipelines", "Choose a stage": "Selecione um estágio", "Deal Settings": "Configurações de acordos", - "Ticket Settings": "Ticket Settings", - "Task Settings": "Task Settings", + "Ticket Settings": "Configurações de Ticket", + "Task Settings": "Configurações de Tarefa", "Boards & Pipelines": "Quadros & Pipelines", "Product & Service": "Produto & Serviço", "There is no pipeline in this board.": "Não há pipelines nesse quadro.", @@ -584,24 +584,24 @@ "Board": "Quadro", "Pipeline": "Pipeline", "Stage": "Estágio", - "Stage name": "Stage name", + "Stage name": "Nome do Estágio", "Add a deal": "Adicionar negócio", - "Add a task": "Add a task", - "Add a ticket": "Add a ticket", - "Priority": "Priority", - "Critical": "Critical", - "High": "High", + "Add a task": "Adicionar uma tarefa", + "Add a ticket": "Adionar um ticket", + "Priority": "Prioridade", + "Critical": "Critíco", + "High": "Alto", "Normal": "Normal", - "Low": "Low", - "Attachments": "Attachments", - "Source": "Source", - "Select a source": "Select a source", - "Upload an attachment": "Upload an attachment", + "Low": "Baixo", + "Attachments": "Anexos", + "Source": "Fonte", + "Select a source": "Selecione uma fonte", + "Upload an attachment": "Carregar um anexo", "Description": "Descrição", - "Select a priority": "Select a priority", + "Select a priority": "Selecione uma prioridade", "Edit deal": "Editar negócio", - "Edit task": "Edit task", - "Edit ticket": "Edit ticket", + "Edit task": "Editar tarefa", + "Edit ticket": "Editar ticket", "Add Product / Service": "Adicionar Produto / Serviço", "Reply tweet": "Responder tweet", "Tweet": "Tweet", @@ -630,8 +630,8 @@ "Currency": "Moeda", "Unit of measurement": "Unidade de medida", "Create another board": "Criar outro quadro", - "No pipeline": "No pipeline", - "No stage": "Sem palco", + "No pipeline": "Sem pipeline", + "No stage": "Sem estágio", "No deal": "Sem acordo", "Background": "Background", "Choose": "Escolha", @@ -671,11 +671,11 @@ "All customers imported successfully": "Todos os clientes foram importados com sucesso", "There aren't any imports": "Não há importações", "Successfully Removed all customers": "Todos os clientes removidos com sucesso", - "You can only import max 600 at a time": "Você pdoe importar no máximo 600 por vez", + "You can only import max 600 at a time": "Você pode importar no máximo 600 por vez", "Invalid import type": "Tipo de importação inválido", "Last updated": "Ultima atualização", - "Filter by lead status": "Filtrar pelo status da Lead", - "No lead status chosen": "Status da Lead não escolhido", + "Filter by lead status": "Filtrar pelo status do Lead", + "No lead status chosen": "Status do Lead não escolhido", "Schedule:": "Cronograma:", "Every Day": "Todo dia", "Every Month": "Todo mês", @@ -689,225 +689,225 @@ "Every Sunday": "Todo domingo", "Choose a schedule day": "Selecione o tipo de agendamento", "Choose a schedule time": "Selecione o horário do agendamento", - "Won": "Ganhou", + "Won": "Ganho", "Lost": "Perdido", "App store": "App store", "App store menu": "App store menu", "In Progress": "Em progresso", - "It`s size exceeds the limit 10mb": "It`s size exceeds the limit 10mb", - "Congrats! Your email sent successfully!": "Congrats! Your email sent successfully!", - "Works with messenger": "Works with messenger", - "Knowledge base topic": "Knowledge base topic", - "Package version": "Package version", + "It`s size exceeds the limit 10mb": "Seu tamanho excede o limite de 10mb", + "Congrats! Your email sent successfully!": "Parabéns! Seu e-mail enviado com sucesso!", + "Works with messenger": "Funciona com mensageiro", + "Knowledge base topic": "Tópico da base de conhecimento", + "Package version": "Versão do pacote", "Branch name": "Branch name", - "Abbreviated": "Abbreviated", - "User": "User", - "Recent conversations": "Recent conversations", - "Start new conversation": "Start new conversation", - "Talk with support staff": "Talk with support staff", - "Send a message": "Send a message", - "Volume Report By Customer": "Volume Report By Customer", - "Export Report": "Export Report", - "We`re ready to help you.": "We`re ready to help you.", - "Please choose a product": "Please choose a product", - "Please choose a currency": "Please choose a currency", + "Abbreviated": "Abreviado", + "User": "Usuário", + "Recent conversations": "Conversas recentes", + "Start new conversation": "Iniciar nova conversa", + "Talk with support staff": "Converse com a equipe de suporte", + "Send a message": "Enviar uma mensagem", + "Volume Report By Customer": "Relatório de volume por cliente", + "Export Report": "Exportar Relatório", + "We`re ready to help you.": "Estamos prontos para ajudá-lo.", + "Please choose a product": "Escolha um produto", + "Please choose a currency": "Escolha uma moeda", "No board": "No board", - "Empty": "Empty", - "There is no account.": "There is no account.", - "There is no tag.": "There is no tag.", - "Skip for now": "Skip for now", - "Go to Inbox": "Go to Inbox", - "Messenger Language": "Messenger Language", - "Messenger name": "Messenger name", - "Skip": "Skip", - "Finish": "Finish", - "Show": "Show", - "Hide": "Hide", - "Previous": "Previous", - "Users": "Users", - "users": "users", - "brands": "brands", + "Empty": "Vazio", + "There is no account.": "Não há conta.", + "There is no tag.": "Não há tag.", + "Skip for now": "Pular por enquanto", + "Go to Inbox": "Ir para a caixa de entrada", + "Messenger Language": "Idioma do Messenger", + "Messenger name": "Messenger nome", + "Skip": "Pular", + "Finish": "Terminar", + "Show": "Mostrar", + "Hide": "Ocultar", + "Previous": "Anterior", + "Users": "Usuários", + "users": "usuários", + "brands": "marcas", "messengers": "messengers", - "channels": "channels", + "channels": "canais", "Emails": "Emails", "Messengers": "Messengers", - "You already have": "You already have", - "There is another": "There is another", - "Let's create your brand": "Let's create your brand", - "Invite users": "Invite users", - "Let's grow your team": "Let's grow your team", - "Invite": "Invite", - "Let's start": "Let's start", - "Start messaging now!": "Start messaging now!", - "Create channel": "Create channel", - "Get started on your channel": "Get started on your channel", - "Create your first messenger": "Create your first messenger", - "Welcome": "Welcome", - "Nothing inserted": "Nothing inserted", - "Empty emails": "Empty emails", - "Initial setup": "Initial setup", - "Add another": "Add another", - "Don't show again": "Don't show again", - "No other pipeline": "No other pipeline", - "No other boards": "No other boards", - "I'm ready to get started": "I'm ready to get started", - "Welcome paragraph": "We're so happy to have you. Let's take a moment to get you set up", - "Get notified and notify others to keep everything up to date": "Get notified and notify others to keep everything up to date", - "If your team hasn't received messages that you sent on the site, we can send it to them via email": "If your team hasn't received messages that you sent on the site, we can send it to them via email", - "Send an email and notify members that they've been invited!": "Send an email and notify members that they've been invited!", - "January": "January", - "February": "February", - "March": "March", - "April": "April", - "May": "May", - "June": "June", - "July": "July", - "August": "August", - "September": "September", - "October": "October", - "November": "November", - "December": "December", - "Today": "Today", - "Sales": "Sales", - "Monthly view": "Monthly view", - "Filter by": "Filter by", - "Creating a brand and by adding channels, you are able to better analyze your customers needs and help solve their problems": "Creating a brand and by adding channels, you are able to better analyze your customers needs and help solve their problems", - "Grow and add users to your team! Assign, designate and let them do what they do best": "Grow and add users to your team! Assign, designate and let them do what they do best", - "Stay up to date with every single customer feedback and create more meaningful conversations": "Stay up to date with every single customer feedback and create more meaningful conversations", - "Create brand channels that are specifically categorized by type and activity": "Create brand channels that are specifically categorized by type and activity", - "Add a Lead here and see it on your Messenger Widget! In order to see Leads in your inbox, please make sure it is added in your channel.": "Add a Lead here and see it on your Messenger Widget! In order to see Leads in your inbox, please make sure it is added in your channel.", - "You can choose from our many messenger integrations and add to your knowledge base. The knowledge base will appear in the tab of your messenger widget. To do this, please create and add to your knowledge base.": "You can choose from our many messenger integrations and add to your knowledge base. The knowledge base will appear in the tab of your messenger widget. To do this, please create and add to your knowledge base.", - "An email signature is an opportunity to share information that helps build recognition and trust.": "An email signature is an opportunity to share information that helps build recognition and trust.", - "Let's start taking care of your customers": "Let's start taking care of your customers", - "Add in your first company!": "Add in your first company!", - "Choose from our many integrations and add to your channel": "Choose from our many integrations and add to your channel", - "Let's get you messaging away!": "Let's get you messaging away!", - "Whoops! No messages here but you can always start": "Whoops! No messages here but you can always start", - "Articles can address any number of issues your customers encounter. Types of knowledge articles can include solutions to common issues, product or feature documentation, FAQ's and much more.": "Articles can address any number of issues your customers encounter. Types of knowledge articles can include solutions to common issues, product or feature documentation, FAQ's and much more.", - "Oops! No data here": "Oops! No data here", - "Start adding integrations now!": "Start adding integrations now!", - "Add an integration in this Brand": "Add an integration in this Brand", - "Oh dear! You have no imports": "Oh dear! You have no imports", - "A strong customer engagement can help to further brand growth and loyalty": "A strong customer engagement can help to further brand growth and loyalty", - "Get started on your pipeline": "Get started on your pipeline", - "Connect to Facebook messages right from your Team Inbox": "Connect to Facebook messages right from your Team Inbox", - "Tweet back to your DMs right from your Team Inbox": "Tweet back to your DMs right from your Team Inbox", - "Connect straight to your Gmail and get those emails going": "Connect straight to your Gmail and get those emails going", - "Find your lead forms right here in your Widget": "Find your lead forms right here in your Widget", - "Get access to your Knowledge Base right in your Widget": "Get access to your Knowledge Base right in your Widget", - "Soon you'll be able to connect Viber straight to your Team Inbox": "Soon you'll be able to connect Viber straight to your Team Inbox", - "Get a hold of your Whatsapp messages through your Team Inbox": "Get a hold of your Whatsapp messages through your Team Inbox", - "Connect with Wechat and start messaging right from your Team Inbox": "Connect with Wechat and start messaging right from your Team Inbox", - "Find feedback that has been gathered from various customer engagement channels.": "Find feedback that has been gathered from various customer engagement channels.", - "A report on the total number of customer feedback responses given by team members.": "A report on the total number of customer feedback responses given by team members.", - "The average time a team member solved a problem based on customer feedback.": "The average time a team member solved a problem based on the customer feedback.", - "Oh boy, looks like you need to get a head start on your deals": "Oh boy, looks like you need to get a head start on your deals", - "Open segments and starting add details": "Open segments and starting add details", - "Now easier to find contacts according to your brand": "Now easier to find contacts according to your brand", - "Search and filter customers by form": "Search and filter customers by form", - "There is always a lead!": "There is always a lead!", - "Calendar": "Calendar", - "Columns": "Columns", - "columns": "columns", - "Linked Accounts": "Linked Accounts", - "Select account": "Select account", - "Select account ...": "Select account ...", - "Add Account": "Add Account", - "Remove Account": "Remove Account", - "You can upload only image file": "You can upload only .png or .jpg image file", - "Permissions": "Permissions", - "New permission": "New permission", - "New group": "New group", - "Users groups": "Users groups", - "Choose the module": "Choose the module", - "Choose the actions": "Choose the actions", - "Choose the users": "Choose the users", - "Choose the groups": "Choose the groups", - "Choose groups": "Choose groups", - "Allow": "Allow", - "Invitation Status": "Invitation Status", - "Permission": "Permission", - "data successfully imported": "data successfully imported", - "Show result": "Show result", - "Importing": "Importing", - "data": "data", - "errors acquired": "errors acquired", - "There are": "There are", - "Continue": "Continue", - "Create brand": "Create brand", - "Create your first live chat and in-app messaging Stay up to date with every single customer feedback for more meaningful interactions": "Create your first live chat and in-app messaging. Stay up to date with every single customer feedback for more meaningful interactions.", - "A channel gives a full view of all the brands and its applications all in one place You can see all in-coming messages in your team inbox": "A channel gives a full view of all the brands and its applications all in one place. You can see all in-coming messages in your team inbox.", - "Hooray and Congratulations! You've completed the initial setup!": "Hooray and Congratulations! You've completed the initial setup!", - "Paste the code below before the body tag on every page you want erxes chat to appear": "Paste the code below before the tag on every page you want erxes chat to appear.", - "Paste the code below before the body tag on every page you want erxes lead to appear": "Paste the code below before the body tag on every page you want erxes lead to appear", - "If your flow type is embedded paste the code below additionally that you want erxes lead to appear": "If your flow type is embedded paste the code below additionally that you want erxes lead to appear", - "If your flow type is popup paste the code below additionally in your button": "If your flow type is popup paste the code below additionally in your button", - "Choose messengers": "Choose messengers", - "erxes allows you to create multiple messengers": "erxes allows you to create multiple messengers", - "erxes allows you to create multiple brands": "erxes allows you to create multiple brands", - "erxes allows you to create multiple channels": "erxes allows you to create multiple channels", - "Contacts": "Contacts", - "Create group": "Create group", - "Visitors": "Visitors", - "Due in the next day": "Due in the next day", - "Due in the next week": "Due in the next week", - "Due in the next month": "Due in the next month", - "Has no close date": "Has no close date", - "Over due": "Over due", - "Clear Filter": "Clear Filter", - "Remove this filter": "Remove this filter", - "Filtering is on": "Filtering is on", - "Choose products": "Choose products", - "Choose companies": "Choose companies", - "Choose customers": "Choose customers", - "Choose team members": "Choose team members", + "You already have": "Você já tem", + "There is another": "Tem outro", + "Let's create your brand": "Vamos criar sua marca", + "Invite users": "Convidar usuários", + "Let's grow your team": "Vamos aumentar sua equipe", + "Invite": "Convidar", + "Let's start": "Vamos começar", + "Start messaging now!": "Comece a enviar mensagens agora!", + "Create channel": "Criar canal", + "Get started on your channel": "Comece no seu canal", + "Create your first messenger": "Crie seu primeiro mensageiro", + "Welcome": "Bem-vindo(a)", + "Nothing inserted": "Nada inserido", + "Empty emails": "E-mails vazios", + "Initial setup": "Setup inicial", + "Add another": "Adicionar outro", + "Don't show again": "Não mostrar novamente", + "No other pipeline": "Nenhum outro canal", + "No other boards": "Nenhum outro board", + "I'm ready to get started": "Estou pronto para começar", + "Welcome paragraph": "Estamos muito felizes em ter você. Vamos reservar um momento para você configurar", + "Get notified and notify others to keep everything up to date": "Seja notificado e notifique outras pessoas para manter tudo atualizado", + "If your team hasn't received messages that you sent on the site, we can send it to them via email": "Se sua equipe não recebeu as mensagens que você enviou no site, podemos enviá-las por e-mail", + "Send an email and notify members that they've been invited!": "Envie um e-mail e notifique os membros que eles foram convidados!", + "January": "Janeiro", + "February": "Fevereiro", + "March": "Março", + "April": "Abril", + "May": "Maio", + "June": "Junho", + "July": "Julho", + "August": "Agosto", + "September": "Setembro", + "October": "Outubro", + "November": "Novembro", + "December": "Dezembro", + "Today": "Hoje", + "Sales": "Vendas", + "Monthly view": "Visualização mensal", + "Filter by": "Filtrar por", + "Creating a brand and by adding channels, you are able to better analyze your customers needs and help solve their problems": "Criando uma marca e adicionando canais, você consegue analisar melhor as necessidades de seus clientes e ajudar a resolver seus problemas", + "Grow and add users to your team! Assign, designate and let them do what they do best": "Cresça e adicione usuários à sua equipe! Atribua, designe e deixe-os fazer o que fazem de melhor", + "Stay up to date with every single customer feedback and create more meaningful conversations": "Mantenha-se atualizado com cada feedback do cliente e crie conversas mais significativas", + "Create brand channels that are specifically categorized by type and activity": "Crie canais de marca especificamente categorizados por tipo e atividade", + "Add a Lead here and see it on your Messenger Widget! In order to see Leads in your inbox, please make sure it is added in your channel.": "Adicione um Lead aqui e veja-o no seu Messenger Widget! Para ver Leads em sua caixa de entrada, certifique-se de que ele foi adicionado ao seu canal.", + "You can choose from our many messenger integrations and add to your knowledge base. The knowledge base will appear in the tab of your messenger widget. To do this, please create and add to your knowledge base.": "Você pode escolher entre nossas muitas integrações de messenger e adicionar à sua base de conhecimento. A base de conhecimento aparecerá na guia do widget do messenger. Para fazer isso, crie e adicione à sua base de conhecimento.", + "An email signature is an opportunity to share information that helps build recognition and trust.": "Uma assinatura de e-mail é uma oportunidade de compartilhar informações que ajudam a criar reconhecimento e confiança.", + "Let's start taking care of your customers": "Vamos começar a cuidar dos seus clientes", + "Add in your first company!": "Adicione sua primeira empresa!", + "Choose from our many integrations and add to your channel": "Escolha entre nossas muitas integrações e adicione ao seu canal", + "Let's get you messaging away!": "Vamos tirar suas mensagens!", + "Whoops! No messages here but you can always start": "Opa! Nenhuma mensagem aqui, mas você sempre pode começar", + "Articles can address any number of issues your customers encounter. Types of knowledge articles can include solutions to common issues, product or feature documentation, FAQ's and much more.": "Os artigos podem abordar vários problemas que seus clientes encontram. Os tipos de artigos de conhecimento podem incluir soluções para problemas comuns, documentação de produtos ou recursos, perguntas frequentes e muito mais.", + "Oops! No data here": "Ops! Sem dados aqui", + "Start adding integrations now!": "Comece a adicionar integrações agora!", + "Add an integration in this Brand": "Adicionar uma integração nesta marca", + "Oh dear! You have no imports": "Opa! Você não tem importações", + "A strong customer engagement can help to further brand growth and loyalty": "Um forte envolvimento do cliente pode ajudar a promover o crescimento e a fidelidade da marca", + "Get started on your pipeline": "Comece seu pipeline", + "Connect to Facebook messages right from your Team Inbox": "Conecte-se às mensagens do Facebook diretamente da caixa de entrada da sua equipe", + "Tweet back to your DMs right from your Team Inbox": "Tweet de volta para seus DMs diretamente de sua caixa de entrada da equipe", + "Connect straight to your Gmail and get those emails going": "Conecte-se diretamente ao seu Gmail e envie seus e-mails", + "Find your lead forms right here in your Widget": "Encontre seus formulários de lead aqui mesmo no seu Widget", + "Get access to your Knowledge Base right in your Widget": "Obtenha acesso à sua Base de Conhecimento diretamente no seu Widget", + "Soon you'll be able to connect Viber straight to your Team Inbox": "Em breve você poderá conectar o Viber diretamente à sua caixa de entrada da equipe", + "Get a hold of your Whatsapp messages through your Team Inbox": "Receba suas mensagens do Whatsapp através de sua caixa de entrada da equipe", + "Connect with Wechat and start messaging right from your Team Inbox": "Conecte-se com o Wechat e comece a enviar mensagens diretamente da caixa de entrada da sua equipe", + "Find feedback that has been gathered from various customer engagement channels.": "Encontre o feedback coletado de vários canais de engajamento do cliente.", + "A report on the total number of customer feedback responses given by team members.": "Um relatório sobre o número total de respostas de feedback do cliente fornecidas pelos membros da equipe.", + "The average time a team member solved a problem based on customer feedback.": "O tempo médio que um membro da equipe resolveu um problema com base no feedback do cliente.", + "Oh boy, looks like you need to get a head start on your deals": "Opa, parece que você precisa ter uma vantagem inicial em seus negócios", + "Open segments and starting add details": "Abra segmentos e comece a adicionar detalhes", + "Now easier to find contacts according to your brand": "Agora ficou mais fácil encontrar contatos de acordo com a sua marca", + "Search and filter customers by form": "Pesquise e filtre clientes por formulário", + "There is always a lead!": "Há sempre um lead!", + "Calendar": "Calendário", + "Columns": "Colunas", + "columns": "colunas", + "Linked Accounts": "Contas ligadas", + "Select account": "Selecionar conta", + "Select account ...": "Selecionar conta...", + "Add Account": "Adicionar Conta", + "Remove Account": "Remover Conta", + "You can upload only image file": "Você pode enviar apenas arquivos de imagem .png ou .jpg", + "Permissions": "Permissões", + "New permission": "Nova permissão", + "New group": "Novo grupo", + "Users groups": "Grupos de usuários", + "Choose the module": "Escolha o módulo", + "Choose the actions": "Escolhe as ações", + "Choose the users": "Escolha os usuários", + "Choose the groups": "Escolha os grupos", + "Choose groups": "Escolha grupos", + "Allow": "Permitir", + "Invitation Status": "Status do convite", + "Permission": "Permissão", + "data successfully imported": "dados importados com sucesso", + "Show result": "Mostrar resultado", + "Importing": "Importando", + "data": "dados", + "errors acquired": "erros adquiridos", + "There are": "Há", + "Continue": "Continuar", + "Create brand": "Criar marca", + "Create your first live chat and in-app messaging Stay up to date with every single customer feedback for more meaningful interactions": "Crie seu primeiro bate-papo ao vivo e mensagens no aplicativo. Mantenha-se atualizado com cada feedback do cliente para interações mais significativas.", + "A channel gives a full view of all the brands and its applications all in one place You can see all in-coming messages in your team inbox": "Um canal oferece uma visão completa de todas as marcas e suas aplicações em um só lugar. Você pode ver todas as mensagens recebidas na caixa de entrada de sua equipe.", + "Hooray and Congratulations! You've completed the initial setup!": "Parabéns!!!!! Você concluiu a configuração inicial!", + "Paste the code below before the body tag on every page you want erxes chat to appear": "Cole o código abaixo antes da tag em todas as páginas que você deseja que o chat apareça.", + "Paste the code below before the body tag on every page you want erxes lead to appear": "Cole o código abaixo antes da tag body em todas as páginas que você deseja que o lead apareça", + "If your flow type is embedded paste the code below additionally that you want erxes lead to appear": "Se o seu tipo de fluxo estiver incorporado, cole o código abaixo adicionalmente que você deseja que o lead apareça", + "If your flow type is popup paste the code below additionally in your button": "Se o seu tipo de fluxo for pop-up, cole o código abaixo adicionalmente no seu botão", + "Choose messengers": "Escolha mensageiros", + "erxes allows you to create multiple messengers": "permite que você crie vários mensageiros", + "erxes allows you to create multiple brands": "permite criar várias marcas", + "erxes allows you to create multiple channels": "permite criar vários canais", + "Contacts": "Contatos", + "Create group": "Criar grupo", + "Visitors": "Visitantes", + "Due in the next day": "Prazo no dia seguinte", + "Due in the next week": "Prazo na próxima semana", + "Due in the next month": "Prazo no próximo mês", + "Has no close date": "Não tem data de fechamento", + "Over due": "Atrasado", + "Clear Filter": "Limpar Filtro", + "Remove this filter": "Remover este filtro", + "Filtering is on": "A filtragem está ativada", + "Choose products": "Escolha os produtos", + "Choose companies": "Escolha as empresas", + "Choose customers": "Escolha os clientes", + "Choose team members": "Escolha os membros da equipe", "erxes Inc": "erxes Inc", - "Get": "Get", - "Download ios app for free on the App Store": "Download ios app for free on the App Store.", - "Download android app for free on the Google play": "Download android app for free on the Google play.", - "Please upgrade your browser to use erxes!": "Please upgrade your browser to use erxes!", - "Unfortunately, You are running on a browser that may not be fully compatible with erxes": "Unfortunately, You are running on a browser that may not be fully compatible with erxes.", - "Please use recommended version": "Please use recommended version", - "Messenger data": "Messenger data", - "Customer field data": "Customer field data", - "Others": "Others", - "Select brand": "Select brand", - "There is no permissions in this group": "There is no permissions in this group.", - "There is no group": "There is no group.", - "User groups": "User groups", - "What action can do": "What action can do", - "Who can": "Who can", - "Grant permission": "Grant permission", - "Check if permission is allowed": "Check if permission is allowed", - "Then": "Then", - "Or": "Or", - "Auto message description": "Send targeted email and chat to logged-in users based on their brand/tag/segment. You can set your time to send an email or chat in advance. Chat design can be snipped, badge and full message and it can be a text or video.", - "Manual message description": "Send targeted email and chat to logged-in users based on their brand/tag/segment. An email or chat will be sent out immediately after you click save button. Chat design can be snipped, badge and full message and it can be a text or video.", - "Visitor auto message description": "Send targeted chats to logged-out visitors on website based on their visiting page, activity, their country of residence and city. Chat design can be snipped, badge and full message and it can be a text or video.", - "Required field": "Required field!", - "Invalid email format! Please enter a valid email address": "Invalid email format! Please enter a valid email address.", - "Invalid link": "Invalid link!", - "Maximum length is": "Maximum length is", - "characters": "characters!", - "Invalid number format! Please enter a valid number": "Invalid number format! Please enter a valid number.", - "Insert email template to content": "Insert email template to content", + "Get": "Obter", + "Download ios app for free on the App Store": "Baixe o aplicativo ios gratuitamente na App Store.", + "Download android app for free on the Google play": "Baixe o aplicativo Android gratuitamente no Google play.", + "Please upgrade your browser to use erxes!": "Atualize seu navegador", + "Unfortunately, You are running on a browser that may not be fully compatible with erxes": "Infelizmente, você está executando em um navegador que pode não ser totalmente compatível.", + "Please use recommended version": "Use a versão recomendada", + "Messenger data": "Dados do mensageiro", + "Customer field data": "Dados do campo do cliente", + "Others": "Outros", + "Select brand": "Selecionar marca", + "There is no permissions in this group": "Não há permissões neste grupo.", + "There is no group": "Não há grupo.", + "User groups": "Grupos de usuários", + "What action can do": "Que ação pode fazer", + "Who can": "Quem pode", + "Grant permission": "Conceder permissão", + "Check if permission is allowed": "Verifique se a permissão é permitida", + "Then": "Então", + "Or": "Ou", + "Auto message description": "Envie e-mail e bate-papo direcionados para usuários logados com base em sua marca/tag/segmento. Você pode definir seu horário para enviar um e-mail ou conversar com antecedência. O design do chat pode ser recorte, crachá e mensagem completa e pode ser um texto ou vídeo.", + "Manual message description": "Envie e-mail e bate-papo direcionados para usuários logados com base em sua marca/tag/segmento. Um e-mail ou bate-papo será enviado imediatamente após você clicar no botão Salvar. O design do chat pode ser recorte, crachá e mensagem completa e pode ser um texto ou vídeo.", + "Visitor auto message description": "Envie bate-papos direcionados para visitantes desconectados no site com base em sua página de visita, atividade, país de residência e cidade. O design do chat pode ser recorte, crachá e mensagem completa e pode ser um texto ou vídeo.", + "Required field": "Campo obrigatório!", + "Invalid email format! Please enter a valid email address": "Formato de email inválido! Por favor insira um endereço de e-mail válido.", + "Invalid link": "Link inválido!", + "Maximum length is": "O comprimento máximo é", + "characters": "caracteres", + "Invalid number format! Please enter a valid number": "Formato de número inválido! por favor insira um número válido.", + "Insert email template to content": "Inserir modelo de e-mail no conteúdo", "Logs": "Logs", - "There are no logs recorded": "There are no logs recorded", - "Module": "Module", - "Unchanged fields": "Unchanged fields", - "Changed fields": "Changed fields", - "Create": "Create", - "Update": "Update", - "Changes": "Changes", - "Choose start date": "Choose start date", - "Choose end date": "Choose end date", - "Permission denied": "Permission denied", - "Old data": "Old data", - "New data": "New data", - "Archive": "Archive", - "NetworkError": "Attempting to restore connection. Changes made now may not be saved.", - "Email add account description question": "Você está conectando uma conta de e-mail compartilhada?", - "Email add account description": "Quando você conecta um e-mail à sua caixa de entrada de conversas, você o conecta como uma conta compartilhada. As mensagens enviadas para contas compartilhadas podem ser vistas por todos que têm acesso à caixa de entrada de sua equipe.", + "There are no logs recorded": "Não há logs registrados", + "Module": "Módulo", + "Unchanged fields": "Campos inalterados", + "Changed fields": "Campos alterados", + "Create": "Criar", + "Update": "Atualizar", + "Changes": "Mudanças", + "Choose start date": "Escolha a data de início", + "Choose end date": "Escolha a data final", + "Permission denied": "Permissão negada", + "Old data": "Dados antigos", + "New data": "Novos dados", + "Archive": "Arquivo", + "NetworkError": "Erro de Conexão", + "Email add account description question": "E-mail adicionar pergunta de descrição da conta", + "Email add account description": "E-mail adicionar descrição da conta", "No connected email": "Nenhum email conectado", - "Your email will be sent with Erxes email template": "Seu e-mail será enviado com o modelo de e-mail Erxes" + "Your email will be sent with Erxes email template": "Seu e-mail será enviado com o modelo de e-mail padrão" } diff --git a/ui/src/modules/settings/team/components/detail/UserDetailForm.tsx b/ui/src/modules/settings/team/components/detail/UserDetailForm.tsx index ec4f6163f50..2aa60470e99 100644 --- a/ui/src/modules/settings/team/components/detail/UserDetailForm.tsx +++ b/ui/src/modules/settings/team/components/detail/UserDetailForm.tsx @@ -2,6 +2,7 @@ import ActivityInputs from 'modules/activityLogs/components/ActivityInputs'; import ActivityLogs from 'modules/activityLogs/containers/ActivityLogs'; import { IUser } from 'modules/auth/types'; import EmptyState from 'modules/common/components/EmptyState'; +import { __ } from 'modules/common/utils'; import Wrapper from 'modules/layout/components/Wrapper'; import { IChannel } from 'modules/settings/channels/types'; import React from 'react'; @@ -29,7 +30,7 @@ class UserDetails extends React.Component { const title = details.fullName || 'Unknown'; - const breadcrumb = [{ title: 'Users', link: '/settings/team' }, { title }]; + const breadcrumb = [{ title: __('Users'), link: '/settings/team' }, { title }]; if (!user._id) { return ( From 338acf3fb3cc6e4df0027c9080ed994ce9f3906b Mon Sep 17 00:00:00 2001 From: Andre Date: Thu, 19 Jan 2023 09:37:48 -0300 Subject: [PATCH 124/135] add customer translate --- ui/src/locales/pt-br.json | 3 ++- ui/src/modules/customers/components/list/CustomersList.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/src/locales/pt-br.json b/ui/src/locales/pt-br.json index 97b2658af11..5708741993a 100644 --- a/ui/src/locales/pt-br.json +++ b/ui/src/locales/pt-br.json @@ -2449,5 +2449,6 @@ "You can track your recently imported customers or companies here": "Você pode rastrear seus clientes ou empresas importados recentemente aqui", "Export this contacts": "Exportar contatos", "Export this companies": "Exportar empresas", - "User name": "Usuário" + "User name": "Usuário", + "Add lead": "Adicionar Lead" } \ No newline at end of file diff --git a/ui/src/modules/customers/components/list/CustomersList.tsx b/ui/src/modules/customers/components/list/CustomersList.tsx index 1edde7df7c6..b9b124481e4 100755 --- a/ui/src/modules/customers/components/list/CustomersList.tsx +++ b/ui/src/modules/customers/components/list/CustomersList.tsx @@ -243,7 +243,7 @@ class CustomersList extends React.Component { const addTrigger = ( ); From ff05f74ad8d5d00b6697f1e86cca4d5e85f2dc09 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Tue, 7 Feb 2023 21:18:39 -0300 Subject: [PATCH 125/135] Translate --- ui/src/locales/pt-br.json | 212 +++++++++--------- .../segments/components/SegmentsList.tsx | 4 +- 2 files changed, 109 insertions(+), 107 deletions(-) diff --git a/ui/src/locales/pt-br.json b/ui/src/locales/pt-br.json index 5708741993a..70b957d56aa 100644 --- a/ui/src/locales/pt-br.json +++ b/ui/src/locales/pt-br.json @@ -3,7 +3,7 @@ "Are you sure?": "Você tem certeza?", "Yes, I am": "Sim, eu tenho", "No, Cancel": "Não, cancelar", - "Filter by tags": "Filtrar por marcações", + "Filter by tags": "Filtrar por tags", "There is no data": "Não há dados", "There is no data.": "Não há dados.", "Load more": "Carregar mais", @@ -46,7 +46,7 @@ "Basic info": "Informações básicas", "Size": "Tamanho", "Other": "Outro", - "Industry": "Indústria", + "Industry": "Segmento", "Website": "Site", "Plan": "Plano", "About": "Sobre", @@ -54,7 +54,7 @@ "Save": "Salvar", "Create response template": "Criar padrão de resposta", "Associate": "Associado", - "No tags": "Sem marcações", + "No tags": "Sem tags", "Add customer": "Adicionar cliente", "No segments": "Sem segmentos", "Manage Columns": "Gerenciar colunas", @@ -104,12 +104,12 @@ "Close": "Fechar", "Customer properties": "Propriedades do cliente", "Device properties": "Propriedades do dispositivo", - "Location": "Localização", + "Location": "Fuso Horário", "Browser": "Navegador", "Platform": "Plataforma", "IP Address": "Endereço de IP", "Hostname": "Hostname", - "Language": "Linguagem", + "Language": "Idioma", "User Agent": "Agente", "Other properties": "Outras propriedades", "Facebook": "Facebook", @@ -213,7 +213,7 @@ "Conversations": "Conversas", "Channels": "Canais", "Select all": "Escolher todos", - "Filter by tag": "Filtrar por marcação", + "Filter by tag": "Filtrar por tag", "Filter by integrations": "Filtrar por integração", "Filter by brand": "Filtrar por marca", "Filter by channel": "Filtrar por canal", @@ -230,13 +230,13 @@ "Daily First Response Resolve Rate": "Taxa De Resolução Diária de Primeira Resposta", "Daily First Response Resolve Rate by Team Members": "Taxa De Resolução Diária De Primeira Resposta Por Membros Da Equipe", "Daily Response Close Resolve Rate by Team Members": "Taxa De Resolução Aproximada De Resposta Diária Por Membros Da Equipe", - "Volume Report": "Relatório de volume", + "Volume Report": "Relatório de Volume", "Feedbacks gathered through various customer engagement channels.": "Feedbacks reunidos através de vários canais de envolvimento do cliente.", - "Response Report": "Relatório de respostas", + "Response Report": "Relatório de Respostas", "Total number of response for customer feedbacks, by each staff.": "Número total de respostas para feedbacks de clientes, por cada equipe.", - "Response Close Report": "Relatório de resposta de perto", + "Response Close Report": "Relatório de Fechamento", "Average time of each staff solving problems that based on customer feedbacks.": "Tempo médio de cada equipe resolvendo problemas com base nos feedbacks dos clientes.", - "First Response Report": "Primeiro Relatório de Resposta", + "First Response Report": "Relatório de Primeira Resposta", "Responding time for a single feedback. Stats will define average response time by each staff.": "Tempo de resposta para um único feedback. As estatísticas definirão o tempo médio de resposta de cada equipe.", "Daily Response Close Resolve Rate": "Taxa De Resolução Aproximada De Resposta Diária", "Daily Response Close Resolve rate by Team Members": "Taxa De Resolução Aproximada De Resposta Diária Por Membros Da Equipe", @@ -244,7 +244,7 @@ "Response Trend": "Tendência de Resposta", "Punch card": "Cartão perfurado", "Response by team members": "Resposta por membros da equipe", - "Tag": "Marcação", + "Tag": "Tag", "Internal note": "Nota interna", "Manage templates": "Gerencie seus modelos", "Volume summary": "Resumo de Volume", @@ -373,7 +373,7 @@ "New Company": "Nova Empresa", "Edit name": "Editar nome", "Customer": "Cliente", - "Add tag": "Adicionar marcação", + "Add tag": "Adicionar tag", "Company": "Empresa", "New message ": "Nova mensagem ", "There aren’t any activities at the moment": "Não há atividades no momento", @@ -484,8 +484,8 @@ "Basic Info": "Informação básica", "Add Phone": "Adicionar Telefone", "Add Email": "Adicionar E-mail", - "Choose your tags": "Escolha suas marcações", - "Manage tags": "Gerenciar marcações", + "Choose your tags": "Escolha suas tags", + "Manage tags": "Gerenciar tags", "Edit Profile": "Editar perfil", "Sign out": "Sair", "Last Updated By": "Última atualização por", @@ -542,7 +542,7 @@ "Move": "Mover", "Move deal": "Mover acordo", "Copy": "Copiar", - "Close date": "Fechar data", + "Close date": "Data de Prazo", "Choose product & service": "Escolher produto & serviço", "Select product & service": "Por favor, selecione produto & serviço", "Please, select a close date": "Por favor, selecione uma data próxima", @@ -551,21 +551,21 @@ "SKU": "SKU", "Choose a company": "Selecionar uma empresa", "Choose a customer": "Selecionar um cliente", - "Choose a board": "Selecionar um quadro", + "Choose a board": "Selecionar um board", "Choose a pipeline": "Selecionar um pipeline", "Manage Board & Pipeline": "Gerenciar Quadros & Pipelines", "Choose a stage": "Selecione um estágio", "Deal Settings": "Configurações de acordos", "Boards & Pipelines": "Quadros & Pipelines", "Product & Service": "Produto & Serviço", - "There is no pipeline in this board.": "Não há pipelines nesse quadro.", + "There is no pipeline in this board.": "Não há pipelines nesse board.", "There is no board": "Não há quadros", - "New Board": "Novo quadro", + "New Board": "Novo board", "Add pipeline": "Adicionar pipeline", "Create one": "Criar um", "Edit pipeline": "Editar pipeline", "Add stage": "Adicionar estágio", - "Board": "Quadro", + "Board": "Board", "Pipeline": "Pipeline", "Stage": "Estágio", "Add a deal": "Adicionar negócio", @@ -597,7 +597,7 @@ "General": "Geral", "Currency": "Moeda", "Unit of measurement": "Unidade de medida", - "Create another board": "Criar outro quadro", + "Create another board": "Criar outro board", "No pipeline": "No pipeline", "No stage": "Sem palco", "No deal": "Sem acordo", @@ -677,10 +677,10 @@ "We`re ready to help you.": "Estamos prontos para ajudá-lo.", "Please choose a product": "Escolha um produto", "Please choose a currency": "Escolha uma moeda", - "No board": "Nenhum quadro", + "No board": "Nenhum board", "Empty": "Vazio", "There is no account.": "Conta inexistente.", - "There is no tag": "Sem marcações", + "There is no tag": "Sem tag", "Skip for now": "Ignorar por enquanto", "Go to Inbox": "Ir para a Caixa de entrada", "Messenger Language": "Idioma do Messenger", @@ -797,7 +797,7 @@ "Create your first live chat and in-app messaging Stay up to date with every single customer feedback for more meaningful interactions": "Crie seu primeiro bate-papo ao vivo e mensagens no aplicativo. Mantenha-se atualizado com todos os comentários dos clientes para interações mais significativas.", "A channel gives a full view of all the brands and its applications all in one place You can see all in-coming messages in your team inbox": "Um canal oferece uma visão completa de todas as marcas e suas aplicações em um só lugar. Você pode ver todas as mensagens recebidas na caixa de entrada.", "Hooray and Congratulations! You've completed the initial setup!": "Parabéns! Você concluiu a configuração inicial!", - "Paste the code below before the body tag on every page you want erxes chat to appear": "Cole o código abaixo antes da marcação do corpo em todas as páginas que você deseja que o erxes chat apareça", + "Paste the code below before the body tag on every page you want erxes chat to appear": "Cole o código abaixo antes da tag do corpo em todas as páginas que você deseja que o erxes apareça", "Choose messengers": "Escolha o mensageiro", "erxes allows you to create multiple messengers": "permite criar vários messengers", "erxes allows you to create multiple brands": "permite criar várias marcas", @@ -834,7 +834,7 @@ "What action can do": "Que ação pode ser feita", "Who can": "Quem pode", "Grant permission": "Conceder permissão", - "Check if permission is allowed": "Verifique se a permissão é permitida", + "Check if permission is allowed": "Confirme a permissão", "Then": "Então", "Or": "Ou", "Auto message description": "Descrição da mensagem automática", @@ -1023,8 +1023,8 @@ "Watch Tutorial": "Veja o tutorial", "Start Date": "Data de início", "End Date": "Data final", - "Oh boy, looks like you need to get a head start on your board": "Nossa, parece que você precisa começar o seu quadro", - "Choose board": "Escolha o quadro", + "Oh boy, looks like you need to get a head start on your board": "Nossa, parece que você precisa começar o seu board", + "Choose board": "Escolha o board", "Choose pipeline": "Escolha o pipeline", "Show Menu": "Mostrar Menu", "Hide Menu": "Esconder o Menu", @@ -1042,7 +1042,7 @@ "Switch To": "Troque para", "item": "item", "list": "lista", - "Response Frequency Report": "Relatório de frequência de resposta", + "Response Frequency Report": "Relatório de Frequência de Resposta", "There aren’t any archived": "Não há nenhum arquivado", "Total conversation's session count, made with customers through every integration": "Contagem total de sessões de conversa, feita com clientes em cada integração", "The general speed of the response report for customer request": "A velocidade geral do relatório de resposta para a solicitação do cliente", @@ -1053,7 +1053,7 @@ "Import & Export": "Importar & Exportar", "Email Deliveries": "Entregas de e-mail", "Outgoing webhooks": "Webhooks de saída", - "Set up your initial account settings so that things run smoothly in unison": "Defina as configurações iniciais da conta para que tudo corra bem em uníssono", + "Set up your initial account settings so that things run smoothly in unison": "Defina as configurações iniciais da conta para que tudo corra bem", "File upload": "Upload de arquivo", "Learn how to set file uploading": "Aprenda a configurar o upload de arquivos", "Upload File Types": "Carregar tipos de arquivo", @@ -1133,9 +1133,9 @@ "You successfully updated engages config": "Você atualizou com sucesso a configuração do engajamento", "Successfully sent verification email. Please check your inbox": "Email de verificação enviado com sucesso. Por favor, verifique sua caixa de entrada", "You are about to remove verified email. Are your sure?": "Você está prestes a remover o e-mail verificado. Você tem certeza?", - "Product Board": "Quadro de Produtos", - "Learn how to set Product Board Integration Variables": "Aprenda a definir as variáveis ​​de integração do quadro de produtos", - "Product Board Access token": "Token de acesso do quadro de produto", + "Product Board": "Board de Produtos", + "Learn how to set Product Board Integration Variables": "Aprenda a definir as variáveis ​​de integração do board de produtos", + "Product Board Access token": "Token de acesso do board de produto", "General system config": "Configuração geral do sistema", "General Settings": "Configurações gerais", "general settings": "configurações gerais", @@ -1157,7 +1157,7 @@ "AWS SES Config set": "Conjunto de configurações do AWS SES", "Unverified emails limit": "Limite de e-mails não verificados", "To": "Para", - "Your team members are the bolts and nuts of your business": "Os membros da sua equipe são os parafusos e as porcas do seu negócio", + "Your team members are the bolts and nuts of your business": "Os membros da sua equipe são os motores de propulsão do seu negócio", "Make sure all the parts are set and ready to go": "Certifique-se de que todas as peças estão definidas e prontas para uso", "Here you can see a list of all your team members, you can categorize them into groups, welcome new members and edit their info": "Aqui você pode ver uma lista de todos os membros da sua equipe, você pode categorizá-los em grupos, dar as boas-vindas aos novos membros e editar suas informações", "Invite team members": "Convide membros da equipe", @@ -1213,20 +1213,20 @@ "product properties": "propriedades do Produto", "You changed a property field visibility": "Você alterou a visibilidade de um campo de propriedade", "You changed a property group visibility": "Você alterou a visibilidade de um grupo de propriedades", - "engageMessage tags": "marcações de mensagens de engajamento", - "conversation tags": "marcações de conversa", - "customer tags": "marcações do cliente", - "company tags": "marcações da empresa", - "integration tags": "marcações de integração", - "product tags": "marcações de produto", - "Tags type": "Tipo de marcação", + "engageMessage tags": "tags para mensagens de engajamento", + "conversation tags": "tags para conversa", + "customer tags": "tags para cliente", + "company tags": "tags para empresas", + "integration tags": "tags para integração", + "product tags": "tags para produto e serviço", + "Tags type": "Tipo de tags", "You successfully added a tag": "Você adicionou uma tag com sucesso", "You successfully deleted a tag": "Você excluiu uma tag com sucesso", - "Edit tag": "Editar marcação", - "Tag duplicated": "Marcação duplicada", + "Edit tag": "Editar tag", + "Tag duplicated": "Tag duplicada", "General settings": "Configurações Gerais", "Getting Started with Segments": "Introdução aos segmentos", - "The Segments feature helps you to filter, target, and engage a certain group of contacts, The Segments are used in the Contacts and Engage features": "O recurso de segmentos ajuda você a filtrar, direcionar e envolver um determinado grupo de contatos, Os segmentos são usados ​​nos recursos de Contatos e Engage", + "The Segments feature helps you to filter, target, and engage a certain group of contacts, The Segments are used in the Contacts and Engage features": "O recurso de segmentos ajuda você a filtrar, direcionar e envolver um determinado grupo de contatos, os segmentos são usados ​​nos recursos de Contatos e Engage", "Create Custom Properties": "Crie propriedades personalizadas", "Watch our tutorial": "Veja nosso tutorial", "Choose the Contact Type": "Escolha o tipo de contato", @@ -1239,19 +1239,19 @@ "Go to Properties": "Ir para Propriedades", "Install the Event Tracking script": "Instale o script de acompanhamento de eventos", "If you wish to segment by events, i.e actions that are triggered by something your Customer performs on your website or app.": "Se você deseja segmentar por eventos, ou seja, ações que são acionadas por algo que seu cliente realiza em seu site ou aplicativo.", - "Select the property/event you want to filter by, select one of the operators and type in or select the value from the dropdown menu": "Selecione a propriedade / evento pelo qual deseja filtrar, selecione um dos operadores e digite ou selecione o valor no menu suspenso", + "Select the property/event you want to filter by, select one of the operators and type in or select the value from the dropdown menu": "Selecione a propriedade/evento pelo qual deseja filtrar, selecione um dos operadores e digite ou selecione o valor no menu suspenso", "Add Properties": "Adicionar Propriedades", "Add Events": "Adicionar Eventos", "Create your Segment": "Crie o seu segmento", "Setup a new segment": "Configure um novo segmento", - "There aren’t any filters at the moment. You can create a segment by Property and/or by Events": "Não há filtros no momento. Você pode criar um segmento por propriedade e / ou por eventos", + "There aren’t any filters at the moment. You can create a segment by Property and/or by Events": "Não há filtros no momento. Você pode criar um segmento por propriedade e/ou por eventos", "Segment Name": "Nome do Segmento", "Not selected": "Não selecionado", "Creating Customer Segment": "Criando Segmento de Cliente", "segments": "segmentos", - "There aren’t any filters at the moment, You can create a segment by Property and/or by Events": "Não há filtros no momento. Você pode criar um segmento por propriedade e / ou por eventos", + "There aren’t any filters at the moment, You can create a segment by Property and/or by Events": "Não há filtros no momento. Você pode criar um segmento por propriedade e/ou por eventos", "Show count": "Mostrar contagem", - "Create your first Task Board": "Crie o seu primeiro Quadro de Tarefas", + "Create your first Task Board": "Crie o seu primeiro Board de Tarefas", "Tip: Filter": "Dica: Filtro", "Tip: This could be equivalent to your brands or you can organize by year/project/etc": "Dica: isso pode ser equivalente às suas marcas ou você pode organizar por ano / projeto / etc", "Click on “Show Menu” to filter tasks by assigned team members, customers, date, etc": "Clique em “Mostrar Menu” para filtrar tarefas por membros da equipe atribuídos, clientes, data, etc", @@ -1261,13 +1261,13 @@ "Add New": "Adicionar novo", "Getting Started with Sales Pipeline": "Introdução ao funil de vendas", "Drive leads to a successful close with our Kanban-style boards": "O Drive leva a um fechamento bem-sucedido com nossas placas de estilo Kanban", - "Tip: This could be equivalent to your departments and/or you can organize by year/project/etc": "Dica: isso pode ser equivalente aos seus departamentos e / ou você pode organizar por ano / projeto / etc", - "Start adding Pipelines to the Board": "Comece a adicionar pipelines ao quadro", - "Tip: This could be a bit more granular than the Board and/or you can organize by period/project/etc": "Dica: Isso pode ser um pouco mais granular do que o Quadro e / ou você pode organizar por período / projeto / etc", - "Create a Board": "Criar um quadro", - "Create a Pipeline": "Crie um pipeline", - "Manage your boards and pipelines so that its easy to manage incoming pop ups or requests that is adaptable to your team's needs": "Gerencie suas placas e pipelines para que seja fácil gerenciar pop-ups ou solicitações que se adaptem às necessidades de sua equipe", - "Add in or delete boards and pipelines to keep business development on track and in check": "Adicionar ou excluir placas e pipelines para manter o desenvolvimento de negócios sob controle", + "Tip: This could be equivalent to your departments and/or you can organize by year/project/etc": "Dica: isso pode ser equivalente aos seus departamentos e/ou você pode organizar por ano / projeto / etc", + "Start adding Pipelines to the Board": "Comece a adicionar pipelines ao board", + "Tip: This could be a bit more granular than the Board and/or you can organize by period/project/etc": "Dica: Isso pode ser um pouco mais granular do que o Board e/ou você pode organizar por período / projeto / etc", + "Create a Board": "Criar um Board", + "Create a Pipeline": "Crie um Pipeline", + "Manage your boards and pipelines so that its easy to manage incoming pop ups or requests that is adaptable to your team's needs": "Gerencie seus pipelines para que seja fácil gerenciar pop-ups ou solicitações que se adaptem às necessidades de sua equipe", + "Add in or delete boards and pipelines to keep business development on track and in check": "Adicionar ou excluir pipelines para manter o desenvolvimento sob controle", "Here you can find data of all your previous imports of companies and customers": "Aqui você pode encontrar dados de todas as suas importações anteriores de empresas e clientes", "Find out when they joined and their current status": "Descubra quando eles entraram e seu status atual", "Nothing goes missing around here": "Não falta nada por aqui", @@ -1322,7 +1322,7 @@ "Remote address": "Endereço remoto", "Region": "Região", "Host name": "Nome do host", - "Linguagem": "Linguagem", + "Linguagem": "Idioma", "User agent": "Agente", "Profile score": "Pontuação do perfil", "email deliveries": "entregas de e-mail", @@ -1337,7 +1337,7 @@ "You successfully deleted a channel": "Você excluiu um canal com sucesso", "You successfully added a channel": "Você adicionou um canal com sucesso", "You successfully updated a channel": "Você atualizou um canal com sucesso", - "Add unlimited Brands with unlimited support to further your growth and accelerate your business": "Adicione marcas ilimitadas com suporte ilimitado para promover seu crescimento e acelerar seus negócios", + "Add unlimited Brands with unlimited support to further your growth and accelerate your business": "Adicione marcas ilimitadas com suporte ilimitado para promover seu crescimento", "Add New Brand": "Adicionar nova marca", "You successfully added a brand": "Você adicionou uma marca com sucesso", "You successfully deleted a brand": "Você excluiu uma marca com sucesso", @@ -1462,7 +1462,7 @@ "You successfully added a response template": "Você adicionou com sucesso um modelo de resposta", "You successfully updated a response template": "Você atualizou com sucesso um modelo de resposta", "You successfully deleted a response template": "Você excluiu com sucesso um modelo de resposta", - "It's all about thinking ahead for your customers": "É tudo uma questão de pensar no futuro para seus clientes", + "It's all about thinking ahead for your customers": "É tudo uma questão de pensar no futuro", "Team members will be able to choose from email templates and send out one message to multiple recipients": "Os membros da equipe poderão escolher entre modelos de e-mail e enviar uma mensagem para vários destinatários", "You can use the email templates to send out a Mass email for leads/customers or you can send to other team members": "Você pode usar os modelos de e-mail para enviar um e-mail em massa para leads / clientes ou pode enviar para outros membros da equipe", "You successfully added a email template": "Você adicionou com sucesso um modelo de e-mail", @@ -1475,10 +1475,10 @@ "Appearances matter, especially for your business": "As aparências são importantes, especialmente para sua empresa", "Edit and manage your email appearance so that your business can operate in one voice": "Edite e gerencie a aparência do seu e-mail para que sua empresa possa operar em uma só voz", "You successfully updated an email appearance": "Você atualizou com sucesso uma aparência de e-mail", - "Script manager allows erxes users to quickly and easily generate and update related scripts for any of their business websites": "O gerenciador de scripts permite que os usuários do erxes gerem e atualizem scripts relacionados para qualquer um de seus sites de negócios de forma rápida e fácil", - "Set up once and your team will be able to easily display multiple erxes widgets on any of their businesses websites": "Configure uma vez e sua equipe será capaz de exibir facilmente vários widgets erxes em qualquer um de seus sites de negócios", - "Getting Started with erxes Scripts": "Primeiros passos com scripts erxes", - "Avoid duplication of erxes widget scripts on your website, which might disable some of your erxes widgets (messenger, popups, etc)": "Evite a duplicação de scripts de widget erxes em seu site, o que pode desativar alguns de seus widgets erxes (messenger, pop-ups, etc)", + "Script manager allows erxes users to quickly and easily generate and update related scripts for any of their business websites": "O gerenciador de scripts permite que os usuários gerem e atualizem scripts relacionados para qualquer um de seus sites de negócios de forma rápida e fácil", + "Set up once and your team will be able to easily display multiple erxes widgets on any of their businesses websites": "Configure uma vez e sua equipe será capaz de exibir facilmente vários widgets em qualquer um de seus sites de negócios", + "Getting Started with erxes Scripts": "Primeiros passos com scripts", + "Avoid duplication of erxes widget scripts on your website, which might disable some of your erxes widgets (messenger, popups, etc)": "Evite a duplicação de scripts de widget em seu site, o que pode desativar alguns de seus widgets (messenger, pop-ups, etc)", "Generate the combination of scripts": "Gere a combinação de scripts", "Install the script": "Instale o script", "Click on “New Script” and choose which widgets you’re going to display in a single page": "Clique em “Novo Script” e escolha quais widgets você irá exibir em uma única página", @@ -1496,9 +1496,9 @@ "campaign": "campanha", "Get started on your project": "Comece seu projeto", "New Campaign": "Nova campanha", - "You successfully added a board": "Você adicionou um quadro com sucesso", - "You successfully updated a board": "Você atualizou um quadro com sucesso", - "This will permanently delete the current Board": "Isso excluirá permanentemente o quadro atual", + "You successfully added a board": "Você adicionou um board com sucesso", + "You successfully updated a board": "Você atualizou um board com sucesso", + "This will permanently delete the current Board": "Isso excluirá permanentemente o board atual", "Are you absolutely sure?": "Você tem certeza absoluta?", "Type delete in the filed below to confirm": "Digite delete no campo abaixo para confirmar", "Go to templates": "Ir para modelos", @@ -1507,15 +1507,15 @@ "You successfully updated a pipeline": "Você atualizou um pipeline com sucesso", "Add project": "Adicionar projeto", "Scoring type": "Tipo de pontuação", - "ice": "gelo", + "ice": "ICF", "Set the Impact, Confidence and Ease factors for your tasks": "Defina os fatores de impacto, confiança e facilidade para suas tarefas", "Final score is calculated by the formula:": "A pontuação final é calculada pela fórmula:", "Impact * Confidence * Ease": "Impacto * Confiança * Facilidade", "Set the Reach, Impact, Confidence and Effort factors for your tasks": "Defina os fatores de Alcance, Impacto, Confiança e Esforço para suas tarefas", - "rice": "arroz", + "rice": "Aice", "(Reach * Impact * Confidence) / Effort": "(Alcance * Impacto * Confiança) / Esforço", "Set the Potential, Importance and Ease factors for your tasks": "Defina os fatores de potencial, importância e facilidade para suas tarefas", - "pie": "torta", + "pie": "Pif", "(Potential + Importance + Ease) / 3": "(Potencial + Importância + Facilidade) / 3", "Metric": "Métrica", "Choose a metric": "Escolha uma métrica", @@ -1531,7 +1531,7 @@ "The previous projects using that template will not change": "Os projetos anteriores que usam esse modelo não serão alterados", "Only changes to the newly chosen projects": "Apenas mudanças nos projetos recém-escolhidos", "You successfully deleted a growth hack template": "Você excluiu com sucesso um template de growth hack", - "You successfully deleted a board": "Você excluiu um quadro com sucesso", + "You successfully deleted a board": "Você excluiu um board com sucesso", "This will permanently delete the current": "Isso excluirá permanentemente o atual", "Archive Items has been archived": "Os itens do arquivo foram arquivados", "Add input field": "Adicionar campo de entrada", @@ -1555,12 +1555,12 @@ "phone": "telefone", "You successfully added a form": "Você adicionou um formulário com sucesso", "Sales Pipeline Settings": "Configurações de processamento de vendas", - "Sales board & Pipelines": "Quadro de vendas e pipelines", + "Sales board & Pipelines": "Board de vendas e pipelines", "Show only the user's assigned(created)": "Mostrar apenas o usuário atribuído (criado)", "deal": "acordo", "Users eligible to see all": "Usuários qualificados para ver todos", "This will permanently update are you absolutely sure?": "Isso será atualizado permanentemente. Você tem certeza?", - "Board & Pipeline": "Quadro e Pipeline", + "Board & Pipeline": "Board & Pipeline", "There is no product & service category": "Não há categoria de produto e serviço", "Filter by type": "Filtrar por tipo", "Product": "Produtos", @@ -1578,7 +1578,7 @@ "You successfully deleted a note": "Você excluiu uma nota com sucesso", "You successfully updated a product and service": "Você atualizou com sucesso um produto e serviço", "There aren’t any data at the moment": "Não há dados no momento", - "Ticket board & Pipelines": "Quadro de Ticket e pipelines", + "Ticket board & Pipelines": "Board de Ticket e Pipelines", "This will permanently delete the current Pipeline": "Isso excluirá permanentemente o pipeline atual", "No stage in this pipeline": "Nenhum estágio neste pipeline", "In time range": "No intervalo de tempo", @@ -1588,14 +1588,14 @@ "Last month": "Mês passado", "Last week": "Semana Anterior", "Yesterday": "Ontem", - "Volume Report By Date": "Relatório de volume por data", - "Volume Report By Time": "Relatório de volume por tempo", + "Volume Report By Date": "Relatório de Volume por Data", + "Volume Report By Time": "Relatório de Volume por Tempo", "Operator Activity Report": "Relatório de atividade do operador", "Duration of First Response Report": "Duração do primeiro relatório de resposta", - "First Response Report by Operators": "Primeiro Relatório de Resposta dos Operadores", + "First Response Report by Operators": "Relatório de Primeira Resposta dos Operadores", "First Response Report by Operator": "Relatório de primeira resposta por operador", "Tag Report": "Relatório de tag", - "Export First Response Report": "Exportar primeiro relatório de resposta", + "Export First Response Report": "Exportar relatório de primeira resposta", "Export Tag Report": "Exportar relatório de tag", "Choose user": "Escolha o usuário", "Response time of the operator": "Tempo de resposta do operador", @@ -1667,13 +1667,13 @@ "Submit once": "Envie uma vez", "Turn on to receive a submission from the visitor only once": "Ative para receber um envio do visitante apenas uma vez", "Once a submission is received, the popup will not show": "Assim que o envio for recebido, o pop-up não aparecerá", - "Getting Started with erxes Popups": "Primeiros passos com pop-ups erxes", + "Getting Started with erxes Popups": "Primeiros passos com pop-ups", "Never miss a potential lead by capturing them with a customizable Popups & Forms": "Nunca perca uma oportunidade potencial ao capturá-la com pop-ups e formulários personalizáveis", "Create Popup": "Criar Popup", "Fill out the details and create your popup message or form": "Preencha os detalhes e crie sua mensagem ou formulário pop-up", "Create Pop Ups": "Criar Pop Ups", "Instale o script": "Instale o script", - "Copy the individual script or use Script Manager to avoid script duplication errors if you’re planning to display this popup along with any other erxes widgets": "Copie o script individual ou use o Gerenciador de scripts para evitar erros de duplicação de scripts se você estiver planejando exibir este pop-up junto com quaisquer outros widgets erxes", + "Copy the individual script or use Script Manager to avoid script duplication errors if you’re planning to display this popup along with any other erxes widgets": "Copie o script individual ou use o Gerenciador de scripts para evitar erros de duplicação de scripts se você estiver planejando exibir este pop-up junto com quaisquer outros widgets", "Go to Script Manager": "Ir para o Gerenciador de Script", "Write title": "Escreva o título", "Rule": "Regra", @@ -1702,7 +1702,7 @@ "actions that are triggered by something your": "ações que são desencadeadas por algo seu", "Customer performs on your website or app": "O cliente executa em seu site ou aplicativo", "There aren’t any filters at the moment": "Não há filtros no momento", - "You can create a segment by Property and/or by Events": "Você pode criar um segmento por propriedade e / ou por eventos", + "You can create a segment by Property and/or by Events": "Você pode criar um segmento por propriedade e/ou por eventos", "Creating customer segment": "Criação de segmento de cliente", "Getting Started with erxes Knowledgebase": "Introdução à Base de Conhecimento", "Educate your customers and staff by creating help articles to reach higher levels of satisfaction": "Eduque seus clientes e funcionários criando artigos de ajuda para alcançar níveis mais altos de satisfação", @@ -1715,7 +1715,7 @@ "Click on “Add Articles” to start adding help articles": "Clique em “Adicionar artigos” para começar a adicionar artigos de ajuda", "Copy the individual script by clicking on the Settings button": "Copie o script individual clicando no botão Configurações", "Use": "Usar", - "to avoid script duplication errors if you’re planning to display this popup along with any other erxes widgets": "para evitar erros de duplicação de script se você estiver planejando exibir este pop-up junto com quaisquer outros widgets erxes", + "to avoid script duplication errors if you’re planning to display this popup along with any other erxes widgets": "para evitar erros de duplicação de script se você estiver planejando exibir este pop-up junto com quaisquer outros widgets", "Add Knowledge Base": "Adicionar Base de Conhecimento", "There is no knowledge base": "Não há base de conhecimento", "article": "artigos", @@ -1728,7 +1728,7 @@ "You successfully updated a Knowledge Base": "Você atualizou com sucesso uma Base de Conhecimento", "You successfully deleted a knowledge base": "Você excluiu com sucesso uma base de conhecimento", "You successfully added a Knowledge Base": "Você adicionou com sucesso uma Base de Conhecimento", - "Paste the tag below where you want erxes knowledgebase to appear": "Cole a tag abaixo onde deseja que a base de conhecimento do erxes apareça", + "Paste the tag below where you want erxes knowledgebase to appear": "Cole a tag abaixo onde deseja que a base de conhecimento apareça", "Open Source Growth Marketing Platform": "Plataforma de marketing de crescimento de código aberto", "Marketing, sales, and customer service platform designed to help your business attract more engaged customers": "Plataforma de marketing, vendas e atendimento ao cliente projetada para ajudar sua empresa a atrair clientes mais engajados", "Replace Hubspot with the mission and community-driven ecosystem": "Substitua o Hubspot pela missão e pelo ecossistema voltado para a comunidade", @@ -1770,7 +1770,7 @@ "Then create a project": "Em seguida, crie um projeto", "Duplicate growth hacking templates": "Modelos de growth hacking duplicados", "Now add an experiments": "Agora adicione um experimento", - "Create a sales board": "Crie um quadro de vendas", + "Create a sales board": "Crie um board de vendas", "Create a sales pipeline": "Crie um pipeline de vendas", "Configure product & service": "Configurar produto e serviço", "Now add deals": "Agora adicione ofertas", @@ -1796,7 +1796,7 @@ "Create category": "Criar categoria", "Now write articles": "Agora escreva artigos", "Embed knowledgebase": "Base de conhecimento incorporada", - "Create a task board": "Crie um quadro de tarefas", + "Create a task board": "Crie um board de tarefas", "Create a task pipeline": "Crie um pipeline de tarefas", "Now add tasks": "Agora adicione tarefas", "Assign a team member": "Atribuir um membro da equipe", @@ -1919,8 +1919,8 @@ "redirect": "redirecionar", "onPage": "na página", "You successfully added a lead": "Você adicionou um lead com sucesso", - "Paste the code below before the body tag on every page you want erxes pop ups to appear": "Cole o código abaixo antes da tag do corpo em cada página em que deseja que os pop-ups erxes apareçam", - "If your flow type is embedded paste the code below additionally that you want erxes pop ups to appear": "Se o seu tipo de fluxo estiver incorporado, cole o código abaixo, além disso, você deseja que os pop-ups erxes apareçam", + "Paste the code below before the body tag on every page you want erxes pop ups to appear": "Cole o código abaixo antes da tag do corpo em cada página em que deseja que os pop-ups apareçam", + "If your flow type is embedded paste the code below additionally that you want erxes pop ups to appear": "Se o seu tipo de fluxo estiver incorporado, cole o código abaixo, além disso, você deseja que os pop-ups apareçam", "Install code of Teste": "Instale o código do Teste", "Great job! You just set up your email signature": "Bom trabalho! Você acabou de configurar sua assinatura de e-mail", "You successfully changed a notification setting": "Você alterou com sucesso uma configuração de notificação", @@ -1998,8 +1998,8 @@ "Remove customers": "Remover clientes", "Change customer state": "Alterar o estado do cliente", "Show deals": "Mostrar acordos", - "Add deal board": "Adicionar quadro de acordo", - "Remove deal board": "Remover quadro de acordo", + "Add deal board": "Adicionar board de acordo", + "Remove deal board": "Remover board de acordo", "Add deal pipeline": "Adicionar pipeline de acordo", "Edit deal pipeline": "Editar pipeline de acordo", "Remove deal pipeline": "Remover pipeline de acordo", @@ -2014,8 +2014,8 @@ "Archive all deals in a specific stage": "Arquive todas os acordos em um estágio específico ", "Export deals": "Acordos de exportação", "Show tickets": "Mostrar tickets", - "Add ticket board": "Adicionar quadro de ticket", - "Remove ticket board": "Remover quadro de ticket", + "Add ticket board": "Adicionar board de ticket", + "Remove ticket board": "Remover board de ticket", "Add ticket pipeline": "Adicionar pipeline de ticket", "Edit ticket pipeline": "Editar pipeline de ticket", "Remove ticket pipeline": "Remover pipeline de ticket", @@ -2029,8 +2029,8 @@ "Watch ticket": "Observar ticket", "Archive all tickets in a specific stage": "Arquive todos os tickets em um estágio específico", "Show growth hacks": "Mostrar hacks de crescimento", - "Add growth hacking board": "Adicionar quadro do hacks de crescimento", - "Remove growth hacking board": "Remover quadro do hacks de crescimento", + "Add growth hacking board": "Adicionar board do hacks de crescimento", + "Remove growth hacking board": "Remover board do hacks de crescimento", "Edit growth hacking pipeline": "Editar pipeline do hacks de crescimento", "Add growth hacking pipeline": "Adicionar pipeline do hacks de crescimento", "Remove growth hacking pipeline": "Remover o pipeline do hacks de crescimento", @@ -2049,8 +2049,8 @@ "Duplicate growth hacking template": "Duplicado modelo hacking de crescimento", "Show growth hacking template": "Mostrar modelo de hacking de crescimento", "Show tasks": "Mostrar tarefas", - "Add task board": "Adicionar quadro de tarefas", - "Remove task board": "Remover quadro de tarefas", + "Add task board": "Adicionar board de tarefas", + "Remove task board": "Remover board de tarefas", "Add task pipeline": "Adicionar pipeline de tarefa", "Edit task pipeline": "Editar pipeline de tarefas", "Remove task pipeline": "Remover pipeline de tarefas", @@ -2173,7 +2173,7 @@ "Paste the following code before the body tag on every page you want erxes widget to appear": "Cole o seguinte código antes da tag do corpo em cada página que você deseja que o widget apareça", "For web apps built with asynchronous JavaScript": "Para aplicativos da web desenvolvidos com JavaScript assíncrono", "Paste the code below in main layout you want erxes chat to appear": "Cole o código abaixo no layout principal que você deseja que o chat do apareça", - "To connect Google Tag Manager to erxes, you must have an active Google Tag Manager account with a published container": "Para conectar o Gerenciador de tags do Google a erxes, você deve ter uma conta do Gerenciador de tags do Google ativa com um contêiner publicado", + "To connect Google Tag Manager to erxes, you must have an active Google Tag Manager account with a published container": "Para conectar o Gerenciador de tags do Google, você deve ter uma conta do Gerenciador de tags do Google ativa com um contêiner publicado", "IOS": "IOS", "Android": "Android", "Add Erxes SDK to your iOS project in Xcode:": "Adicione o SDK ao seu projeto iOS no Xcode:", @@ -2189,7 +2189,7 @@ "With user data": "Com dados do usuário", "then paste the following code into": "em seguida, cole o seguinte código em", "into your class": "dentro da sua classe", - "and you can start Erxes with following options:": "e você pode começar o Erxes com as seguintes opções:", + "and you can start Erxes with following options:": "e você pode começar com as seguintes opções:", "Add the JitPack repository to your build file": "Adicione o repositório JitPack ao seu arquivo de construção", "Add it in your root build.gradle at the end of repositories:": "Adicione-o em seu build.gradle raiz no final dos repositórios:", "Add the dependency": "Adicione a dependência", @@ -2227,7 +2227,7 @@ "GROWTH MATRIX": "GROWTH MATRIX", "This will permanently delete the current Pipeline. Are you absolutely sure?": "Isso excluirá permanentemente o Pipeline atual. Você tem certeza absoluta?", "Successfully duplicated a template": "Modelo duplicado com sucesso", - "Task board & Pipelines": "Quadro de tarefas e pipelines", + "Task board & Pipelines": "Board de tarefas e pipelines", "Further instructions have been sent to your e-mail address": "Mais instruções foram enviadas para o seu endereço de e-mail", "You will configure several settings on this page": "Você definirá várias configurações nesta página", "You will be able to change these settings in the erxes settings tab": "Você poderá alterar essas configurações na guia de configurações do erxes", @@ -2243,15 +2243,15 @@ "I know I can unsubscribe easily at any time": "Eu sei que posso cancelar a inscrição facilmente a qualquer momento", "Save and continue to login": "Salve e continue para fazer o login", "Short name": "Nome curto", - "Phone (operator)": "Telefone (operadora)", - "Send to board": "Enviar para o quadro", - "Time": "Tempo", + "Phone (operator)": "Telefone", + "Send to board": "Enviar para o board", + "Time": "Horário", "This card is archived": "Este cartão está arquivado", "Select a color": "Selecione uma cor", "Create a new label": "Crie uma nova etiqueta", "Are you sure? This cannot be undone": "Tem certeza? Isto não pode ser desfeito", "You successfully deleted a label": "Você excluiu um rótulo com sucesso", - "You successfully sent to a board": "Você enviou com sucesso para um quadro", + "You successfully sent to a board": "Você enviou com sucesso para um board", "You successfully deleted a stage": "Você excluiu um estágio com sucesso", "Track your entire sales pipeline from one dashboard": "Acompanhe todo o seu funil de vendas em um único painel", "You can also restrict access to your sales pipelines": "Você também pode restringir o acesso aos seus canais de vendas", @@ -2326,8 +2326,8 @@ "Sort": "Ordenar", "Choose a growth funnel": "Escolha um funil de crescimento", "The conversation Assignee has been renewed": "A conversa do destinatário foi renovada", - "Already created product board": "Quadro de produto já criada", - "Created product board note": "Nota de quadro de produto criada", + "Already created product board": "Board de produto já criada", + "Created product board note": "Nota de board de produto criada", "You have a new email": "Você tem um novo e-mail", "You have a message from facebook": "Voce tem uma mensagem do facebook", "You have got a new lead": "Você tem uma nova pista", @@ -2335,8 +2335,8 @@ "Visitor contact info": "Informações de contato do visitante", "Conversation details": "Detalhes da conversa", "You successfully deleted a file": "Você excluiu um arquivo com sucesso", - "Create product board note": "Criar nota de quadro de produto", - "Go to product board": "Ir para o quadro do produto", + "Create product board note": "Criar nota de produto", + "Go to product board": "Ir para o board do produto", "response frequency averages": "médias de frequência de resposta", "If you remove a pop ups, then all related conversations, customers will also be removed": "Se você remover um pop-up, todas as conversas relacionadas e os clientes também serão removidos", "You successfully deleted a pop ups": "Você excluiu com sucesso um pop-ups", @@ -2386,8 +2386,8 @@ "You successfully updated a note": "Você atualizou uma nota com sucesso", "integrations": "integrações", "Archive List has been archived": "A lista de arquivos foi arquivada", - "This will remove list from the board": "Isso removerá a lista do quadro", - "To view archived list and bring them back to the board, click “Menu” > “Archived Items”": "Para visualizar a lista arquivada e trazê-la de volta ao quadro, clique em “Menu”> “Itens Arquivados”", + "This will remove list from the board": "Isso removerá a lista do board", + "To view archived list and bring them back to the board, click “Menu” > “Archived Items”": "Para visualizar a lista arquivada e trazê-la de volta ao board, clique em “Menu”> “Itens Arquivados”", "alarm": "alarme", "briefcase": "pasta", "earthgrid": "terra", @@ -2450,5 +2450,7 @@ "Export this contacts": "Exportar contatos", "Export this companies": "Exportar empresas", "User name": "Usuário", - "Add lead": "Adicionar Lead" + "Add lead": "Adicionar Lead", + "Reset Member Password": "Enviar alteração de senha", + "Resend": "Reenviar" } \ No newline at end of file diff --git a/ui/src/modules/segments/components/SegmentsList.tsx b/ui/src/modules/segments/components/SegmentsList.tsx index b16a59729ed..269bdccbed7 100755 --- a/ui/src/modules/segments/components/SegmentsList.tsx +++ b/ui/src/modules/segments/components/SegmentsList.tsx @@ -89,14 +89,14 @@ class SegmentsList extends React.Component { const title = ( - {contentType} {__('segments')} + {__(`${contentType} Segments`)} ); const actionBarRight = ( ); From 42f6fc29c522eee5dd643cc544f4f99dba1d3e2b Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Wed, 8 Feb 2023 08:48:15 -0300 Subject: [PATCH 126/135] api endpoints based on host --- ui/public/index.html | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/ui/public/index.html b/ui/public/index.html index 0fdb3b118ac..622e4ccd7af 100644 --- a/ui/public/index.html +++ b/ui/public/index.html @@ -46,15 +46,19 @@ }; window.envMaps = [ - { name: 'REACT_APP_API_URL', processValue: '%REACT_APP_API_URL%' }, + { name: 'REACT_APP_API_URL', processValue: '%REACT_APP_API_URL%', + endpoint: 'https://hostname/api' }, { name: 'REACT_APP_API_SUBSCRIPTION_URL', - processValue: '%REACT_APP_API_SUBSCRIPTION_URL%', + processValue: '%REACT_APP_API_SUBSCRIPTION_URL%', + endpoint: 'wss://hostname/subscriptions', }, - { name: 'REACT_APP_CDN_HOST', processValue: '%REACT_APP_CDN_HOST%' }, + { name: 'REACT_APP_CDN_HOST', processValue: '%REACT_APP_CDN_HOST%', + endpoint: 'https://hostname/widgets' }, { name: 'REACT_APP_DASHBOARD_URL', - processValue: '%REACT_APP_DASHBOARD_URL%', + processValue: '%REACT_APP_DASHBOARD_URL%', + endpoint: 'https://hostname/dash', }, ]; @@ -63,7 +67,8 @@ localStorage.setItem( `erxes_env_${envMap.name}`, - getEnv(envMap.name, envMap.processValue) + + envMap.processValue.replace(`%${envMap.name}%`, envMap.endpoint.replace('hostname', location.host)) ); } From b1719f593a855f42cab7f34fcf4cc7364cc98eca Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Wed, 8 Feb 2023 12:44:34 -0300 Subject: [PATCH 127/135] fix missing translate --- ui/src/locales/pt-br.json | 3 ++- ui/src/modules/inbox/containers/Resolver.tsx | 2 +- .../containers/conversationDetail/responseTemplate/Modal.tsx | 2 +- .../settings/integrations/containers/whatspro/WhatsProForm.tsx | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ui/src/locales/pt-br.json b/ui/src/locales/pt-br.json index 70b957d56aa..192de783bd9 100644 --- a/ui/src/locales/pt-br.json +++ b/ui/src/locales/pt-br.json @@ -2452,5 +2452,6 @@ "User name": "Usuário", "Add lead": "Adicionar Lead", "Reset Member Password": "Enviar alteração de senha", - "Resend": "Reenviar" + "Resend": "Reenviar", + "You have successfully sent a message": "Mensagem enviada com sucesso" } \ No newline at end of file diff --git a/ui/src/modules/inbox/containers/Resolver.tsx b/ui/src/modules/inbox/containers/Resolver.tsx index 74d2ff2fb53..b1b130fb411 100755 --- a/ui/src/modules/inbox/containers/Resolver.tsx +++ b/ui/src/modules/inbox/containers/Resolver.tsx @@ -34,7 +34,7 @@ const ResolverContainer = (props: FinalProps) => { } if (status === CONVERSATION_STATUSES.CLOSED) { - Alert.success('The conversation has been resolved!'); + Alert.success(__('The conversation has been resolved!')); // clear saved messages from storage conversationIds.forEach(c => { diff --git a/ui/src/modules/inbox/containers/conversationDetail/responseTemplate/Modal.tsx b/ui/src/modules/inbox/containers/conversationDetail/responseTemplate/Modal.tsx index 2214f55fdde..5b44a759782 100644 --- a/ui/src/modules/inbox/containers/conversationDetail/responseTemplate/Modal.tsx +++ b/ui/src/modules/inbox/containers/conversationDetail/responseTemplate/Modal.tsx @@ -32,7 +32,7 @@ const ModalContainer = (props: FinalProps) => { ) => { saveResponseTemplateMutation({ variables }) .then(() => { - Alert.success('You successfully saved a response template'); + Alert.success(__('You successfully saved a response template')); callback(); }) .catch(e => { diff --git a/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx b/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx index 728beed79bb..073960ce677 100644 --- a/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx +++ b/ui/src/modules/settings/integrations/containers/whatspro/WhatsProForm.tsx @@ -112,7 +112,7 @@ const WhatsProFormContainer = (props: FinalProps) => { update }) .then(() => { - Alert.success('You have successfully sent a message'); + Alert.success(__('You have successfully sent a message')); if (closeModal) { closeModal(); From 7e44c148c7d90ee09204d3e752035b939e304c66 Mon Sep 17 00:00:00 2001 From: Jonatan Rinckus Date: Wed, 8 Feb 2023 22:36:53 -0300 Subject: [PATCH 128/135] translate --- ui/public/index.html | 2 +- ui/src/appContext.tsx | 8 +- ui/src/locales/en.json | 2 +- ui/src/locales/pt-br.json | 78 ++++++++++++++----- .../components/items/Conversation.tsx | 12 ++- .../auth/components/UserCommonInfos.tsx | 2 +- ui/src/modules/boards/constants.ts | 4 +- .../components/AutoCompletionSelect.tsx | 2 +- .../common/components/ConfirmDialog.tsx | 14 ++-- .../segments/components/SegmentsList.tsx | 2 +- .../segments/components/common/Filter.tsx | 8 +- .../settings/boards/components/Boards.tsx | 2 +- .../settings/boards/components/Pipelines.tsx | 2 +- ui/src/modules/settings/constants.ts | 2 +- .../settings/email/components/List.tsx | 2 +- .../growthHacks/components/PipelineForm.tsx | 10 ++- .../modules/settings/growthHacks/constants.ts | 38 +++++---- .../permissions/components/PermissionList.tsx | 2 + .../permissions/components/PermissionRow.tsx | 2 +- .../components/NotificationSettings.tsx | 2 +- .../containers/NotificationSettings.tsx | 6 +- 21 files changed, 122 insertions(+), 80 deletions(-) diff --git a/ui/public/index.html b/ui/public/index.html index 622e4ccd7af..dcf9087ae4a 100644 --- a/ui/public/index.html +++ b/ui/public/index.html @@ -1,5 +1,5 @@ - + { console.log(currentLanguage); + document.documentElement.lang = currentLanguage; + if (currentLanguage !== 'mn') { import(`dayjs/locale/${currentLanguage}`) .then(() => dayjs.locale(currentLanguage)) - .catch(_ => dayjs.locale('en')); + .catch(_ => dayjs.locale('pt-br')); } import(`./locales/${currentLanguage}.json`) @@ -98,7 +100,7 @@ export class AppProvider extends React.Component< changeLanguage = (languageCode): void => { if (this.state.currentLanguage !== languageCode) { - localStorage.setItem('currentLanguage', languageCode || 'en'); + localStorage.setItem('currentLanguage', languageCode || 'pt-br'); window.location.reload(); } }; diff --git a/ui/src/locales/en.json b/ui/src/locales/en.json index 4db41176860..1f2f850088d 100644 --- a/ui/src/locales/en.json +++ b/ui/src/locales/en.json @@ -1901,7 +1901,7 @@ "You successfully updated a board": "You successfully updated a board", "This will permanently delete the current Board": "This will permanently delete the current Board", "Are you absolutely sure?": "Are you absolutely sure?", - "Type delete in the filed below to confirm": "Type delete in the filed below to confirm", + "in the filed below to confirm": "in the filed below to confirm", "You successfully added a pipeline": "You successfully added a pipeline", "You successfully updated a pipeline": "You successfully updated a pipeline", "Add project": "Add project", diff --git a/ui/src/locales/pt-br.json b/ui/src/locales/pt-br.json index 192de783bd9..7ad7dbae59a 100644 --- a/ui/src/locales/pt-br.json +++ b/ui/src/locales/pt-br.json @@ -495,6 +495,7 @@ "Edit segment": "Editar segmento", "New message": "Nova mensagem", "Message": "Mensagem", + "message": "mensagem", "Merge Customers": "Mesclar usuários", "Assign": "Atribuir", "There is no message.": "Não há mensagens.", @@ -553,13 +554,13 @@ "Choose a customer": "Selecionar um cliente", "Choose a board": "Selecionar um board", "Choose a pipeline": "Selecionar um pipeline", - "Manage Board & Pipeline": "Gerenciar Quadros & Pipelines", + "Manage Board & Pipeline": "Gerenciar Boards & Pipelines", "Choose a stage": "Selecione um estágio", "Deal Settings": "Configurações de acordos", - "Boards & Pipelines": "Quadros & Pipelines", + "Boards & Pipelines": "Boards & Pipelines", "Product & Service": "Produto & Serviço", "There is no pipeline in this board.": "Não há pipelines nesse board.", - "There is no board": "Não há quadros", + "There is no board": "Não há boards", "New Board": "Novo board", "Add pipeline": "Adicionar pipeline", "Create one": "Criar um", @@ -715,7 +716,7 @@ "Add another": "Adicionar outro", "Don't show again": "Não mostre novamente", "No other pipeline": "Nenhum outro pipeline", - "No other boards": "Não existem outros quadros", + "No other boards": "Não existem outros boards", "I'm ready to get started": "Estou pronto para começar", "Welcome paragraph": "Estamos muito felizes em ter você aqui. Vamos tirar um momento para você configurar", "Get notified and notify others to keep everything up to date": "Seja notificado e notifique outras pessoas para manter tudo atualizado", @@ -1247,7 +1248,7 @@ "There aren’t any filters at the moment. You can create a segment by Property and/or by Events": "Não há filtros no momento. Você pode criar um segmento por propriedade e/ou por eventos", "Segment Name": "Nome do Segmento", "Not selected": "Não selecionado", - "Creating Customer Segment": "Criando Segmento de Cliente", + "Creating Customer Segment": "Criar Segmento de Cliente", "segments": "segmentos", "There aren’t any filters at the moment, You can create a segment by Property and/or by Events": "Não há filtros no momento. Você pode criar um segmento por propriedade e/ou por eventos", "Show count": "Mostrar contagem", @@ -1256,8 +1257,8 @@ "Tip: This could be equivalent to your brands or you can organize by year/project/etc": "Dica: isso pode ser equivalente às suas marcas ou você pode organizar por ano / projeto / etc", "Click on “Show Menu” to filter tasks by assigned team members, customers, date, etc": "Clique em “Mostrar Menu” para filtrar tarefas por membros da equipe atribuídos, clientes, data, etc", "Getting Started with Tasks": "Introdução a Tarefas", - "Create a more collaborative, self-reliant and cross-linked team with our Kanban-style boards": "Crie uma equipe mais colaborativa, autossuficiente e interligada com nossos quadros de estilo Kanban", - "Go to Board & Pipeline": "Ir para Quadros & Pipeline", + "Create a more collaborative, self-reliant and cross-linked team with our Kanban-style boards": "Crie uma equipe mais colaborativa, autossuficiente e interligada com nossos boards de estilo Kanban", + "Go to Board & Pipeline": "Ir para Boards & Pipeline", "Add New": "Adicionar novo", "Getting Started with Sales Pipeline": "Introdução ao funil de vendas", "Drive leads to a successful close with our Kanban-style boards": "O Drive leva a um fechamento bem-sucedido com nossas placas de estilo Kanban", @@ -1500,7 +1501,7 @@ "You successfully updated a board": "Você atualizou um board com sucesso", "This will permanently delete the current Board": "Isso excluirá permanentemente o board atual", "Are you absolutely sure?": "Você tem certeza absoluta?", - "Type delete in the filed below to confirm": "Digite delete no campo abaixo para confirmar", + "in the filed below to confirm": "no campo abaixo para confirmar", "Go to templates": "Ir para modelos", "add ": "Adicionar", "You successfully added a pipeline": "Você adicionou um pipeline com sucesso", @@ -1521,7 +1522,7 @@ "Choose a metric": "Escolha uma métrica", "Visibility": "Visibilidade", "Choose template": "Escolha o modelo", - "Manage your boards and pipelines so that its easy to manage incoming leads or requests that is adaptable to your team's needs": "Gerencie seus quadros e pipelines para que seja fácil gerenciar leads ou solicitações que se adaptem às necessidades de sua equipe", + "Manage your boards and pipelines so that its easy to manage incoming leads or requests that is adaptable to your team's needs": "Gerencie seus boards e pipelines para que seja fácil gerenciar leads ou solicitações que se adaptem às necessidades de sua equipe", "Go to Campaign": "Ir para a campanha", "New Growth Hacking Templates": "Novos modelos de Growth Hacking", "You successfully added a growth hack template": "Você adicionou com sucesso um template growth hack", @@ -1645,7 +1646,7 @@ "Find feedback of lost deals that has been created by team members": "Encontre feedback de negócios perdidos que foram criados por membros da equipe", "Find feedback that has been created by team members": "Encontre feedback que foi criado por membros da equipe", "Sales pipeline": "Pipeline de vendas", - "Boards": "Quadros", + "Boards": "Boards", "Import your previous contacts": "Importar seus contatos anteriores", "Collect visitor information": "Colete informações do visitante", "Sync email contacts": "Sincronizar contatos de e-mail", @@ -1703,7 +1704,7 @@ "Customer performs on your website or app": "O cliente executa em seu site ou aplicativo", "There aren’t any filters at the moment": "Não há filtros no momento", "You can create a segment by Property and/or by Events": "Você pode criar um segmento por propriedade e/ou por eventos", - "Creating customer segment": "Criação de segmento de cliente", + "Creating customer segment": "Criar segmento de cliente", "Getting Started with erxes Knowledgebase": "Introdução à Base de Conhecimento", "Educate your customers and staff by creating help articles to reach higher levels of satisfaction": "Eduque seus clientes e funcionários criando artigos de ajuda para alcançar níveis mais altos de satisfação", "Create your knowledgebase": "Crie sua base de conhecimento", @@ -2149,9 +2150,9 @@ "Transaction": "Transação", "Checklists": "Lista de verificação", "Checklist items": "Itens da lista de verificação", - "Deal boards": "Quadros de acordos", + "Deal boards": "Boards de acordos", "Deal pipelines": "Pipelines de acordos", - "Growth hack boards": "Quadros do Hack de crescimento", + "Growth hack boards": "Boards do Hack de crescimento", "Growth hack pipelines": "Pipelines de hack de crescimento", "Growth hacks": "Hack de crescimento", "Internal notes": "Notas internas", @@ -2162,8 +2163,8 @@ "Pipeline templates": "Modelos de pipeline", "Product categories": "Categorias de Produtos", "Task pipelines": "Pipelines de tarefas", - "Ticket boards": "Quadros de Tickets", - "Task boards": "Quadros de tarefas", + "Ticket boards": "Boards de Tickets", + "Task boards": "Boards de tarefas", "Ticket pipelines": "Pipelines de Tickets", "Duplicated messenger for single brand": "Mensageiro duplicado para marca única", "You successfully chose a new brand": "Você escolheu com sucesso uma nova marca", @@ -2253,11 +2254,10 @@ "You successfully deleted a label": "Você excluiu um rótulo com sucesso", "You successfully sent to a board": "Você enviou com sucesso para um board", "You successfully deleted a stage": "Você excluiu um estágio com sucesso", - "Track your entire sales pipeline from one dashboard": "Acompanhe todo o seu funil de vendas em um único painel", - "You can also restrict access to your sales pipelines": "Você também pode restringir o acesso aos seus canais de vendas", - "Create Boards and Pipelines": "Crie quadros e pipelines", + "Track your entire sales pipeline from one dashboard. You can also restrict access to your sales pipelines": "Acompanhe todo o seu funil de vendas em um único painel. Você também pode restringir o acesso aos seus canais de vendas", + "Create Boards and Pipelines": "Crie boards e pipelines", "Tip: Choose different views": "Dica: Escolha diferentes visualizações", - "Click on “Boards, Calendar, Conversions” to filter deals": "Clique em “Quadros, Calendário, Conversões” para filtrar ofertas", + "Click on “Boards, Calendar, Conversions” to filter deals": "Clique em Boards, Calendário, Conversões” para filtrar ofertas", "unassigned": "não atribuído", "participating": "participando", "closed": "fechado", @@ -2453,5 +2453,43 @@ "Add lead": "Adicionar Lead", "Reset Member Password": "Enviar alteração de senha", "Resend": "Reenviar", - "You have successfully sent a message": "Mensagem enviada com sucesso" + "You have successfully sent a message": "Mensagem enviada com sucesso", + "Send WhatsPro": "Enviar WhatsApp", + "Website Activity": "Atividade do site", + "Tracked data": "Rastreamento", + "sent a": "enviou uma", + "See full conversation": "Ver a conversa inteira", + "Go to a ticket": "Ir para Ticket", + "Go to a task": "Ir para Tarefas", + "Go to a deal": "Ir para Acordo", + "Type ": "Digite ", + "converted": "Convertido", + "Create your first Sales Board": "Crie seu primeiro board de vendas", + "Tip: This could be equivalent to your brands and/or you can organize by year/project/etc": "Dica: Isso pode ser equivalente às suas marcas e/ou você pode organizar por ano / projeto / etc", + "Project": "Projeto", + "Edit project": "Editar projeto", + "email template:": "modelo de e-mail", + "Select operator": "Selecione um operador", + "Select property": "Selecione uma propriedade", + "Select event": "Selecione um evento", + "Select value": "Selecione uma opção", + "State": "State", + "Avatar": "Avatar", + "Email validation status": "Email validation status", + "Phone validation status": "Phone validation status", + "Country code": "Country code", + "general": "Geral", + "location": "Localização", + "visitorContactInfo": "Informações de Contato", + "customer segments": "Segmentos de clientes", + "lead segments": "Segmentos de leads", + "visitor segments": "Segmentos de visitantes", + "company segments": "Segmentos de empresas", + "Creating company segment": "Criar segmento de empresa", + "Creating lead segment": "Criar segmento de lead", + "Creating visitor segment": "Criar segmento de visitante", + "Looking good!": "Alteração realizada!", + "You've successfully updated this profile": "Atualizado com sucesso", + "Invalid password. Try again": "Senha incorreta. Tente novamente", + "No results found": "Nenhum item encontrado" } \ No newline at end of file diff --git a/ui/src/modules/activityLogs/components/items/Conversation.tsx b/ui/src/modules/activityLogs/components/items/Conversation.tsx index 40eb56ab9ff..fc1ada23046 100644 --- a/ui/src/modules/activityLogs/components/items/Conversation.tsx +++ b/ui/src/modules/activityLogs/components/items/Conversation.tsx @@ -188,15 +188,13 @@ class Conversation extends React.Component { customer = comments.length > 0 ? comments[0].customer : customer; } - return ( - - {renderFullName(customer)} {action}  + return + {renderFullName(customer)} {__(action)}  - {kind} + {__(kind)} -  {item} - - ); +  {__(item)} + ; } renderContent() { diff --git a/ui/src/modules/auth/components/UserCommonInfos.tsx b/ui/src/modules/auth/components/UserCommonInfos.tsx index 3952cbb1db9..cb98a99c4c7 100755 --- a/ui/src/modules/auth/components/UserCommonInfos.tsx +++ b/ui/src/modules/auth/components/UserCommonInfos.tsx @@ -41,7 +41,7 @@ class UserCommonInfos extends React.PureComponent { return ( <> diff --git a/ui/src/modules/boards/constants.ts b/ui/src/modules/boards/constants.ts index f34898df8a0..1b0d7ec641e 100644 --- a/ui/src/modules/boards/constants.ts +++ b/ui/src/modules/boards/constants.ts @@ -1,5 +1,3 @@ -import { __ } from "modules/common/utils"; - export const STORAGE_BOARD_KEY = 'erxesCurrentBoardId'; export const STORAGE_PIPELINE_KEY = 'erxesCurrentPipelineId'; @@ -55,7 +53,7 @@ export const EMPTY_CONTENT_DEAL = { steps: [ { title: "Create Boards and Pipelines", - description: `${__("Track your entire sales pipeline from one dashboard")}. ${__("You can also restrict access to your sales pipelines")}.`, + description: "Track your entire sales pipeline from one dashboard. You can also restrict access to your sales pipelines", url: "/settings/boards/deal", urlText: "Go to Board & Pipeline" }, diff --git a/ui/src/modules/common/components/AutoCompletionSelect.tsx b/ui/src/modules/common/components/AutoCompletionSelect.tsx index 3447d5cbbb5..fcce54572ad 100644 --- a/ui/src/modules/common/components/AutoCompletionSelect.tsx +++ b/ui/src/modules/common/components/AutoCompletionSelect.tsx @@ -336,7 +336,7 @@ function AutoCompletionSelect({ function renderNoResult() { if (searchValue.length === 0) { - return "Type to search"; + return __("Type to search"); } return ( diff --git a/ui/src/modules/common/components/ConfirmDialog.tsx b/ui/src/modules/common/components/ConfirmDialog.tsx index f6fe4c167f7..2ba79f200b7 100644 --- a/ui/src/modules/common/components/ConfirmDialog.tsx +++ b/ui/src/modules/common/components/ConfirmDialog.tsx @@ -157,15 +157,11 @@ class ConfirmDialog extends React.Component { return null; } - const label = hasDeleteConfirm ? ( - <> - Type delete in the filed below to confirm. - - ) : ( - <> - Type update in the filed below to confirm. - - ); + const label = hasDeleteConfirm ? <> + {__('Type')} delete {__('in the filed below to confirm')}. + : <> + {__('Type')} update {__('in the filed below to confirm')}. + ; return ( <> diff --git a/ui/src/modules/segments/components/SegmentsList.tsx b/ui/src/modules/segments/components/SegmentsList.tsx index 269bdccbed7..3c36c4770de 100755 --- a/ui/src/modules/segments/components/SegmentsList.tsx +++ b/ui/src/modules/segments/components/SegmentsList.tsx @@ -89,7 +89,7 @@ class SegmentsList extends React.Component { const title = ( - {__(`${contentType} Segments`)} + {__(`${contentType} segments`)} ); diff --git a/ui/src/modules/segments/components/common/Filter.tsx b/ui/src/modules/segments/components/common/Filter.tsx index 423d6de8e10..f066700d7ba 100644 --- a/ui/src/modules/segments/components/common/Filter.tsx +++ b/ui/src/modules/segments/components/common/Filter.tsx @@ -138,6 +138,8 @@ class Filter extends React.Component { if (!acc[key]) { acc[key] = []; } + + field.label = __(field.label); acc[key].push(field); @@ -159,7 +161,7 @@ class Filter extends React.Component { const array = [] as any; Object.keys(objects).map(key => { - const obj = { label: key, options: objects[key] }; + const obj = { label: __(key), options: objects[key] }; return array.push(obj); }); @@ -174,7 +176,7 @@ class Filter extends React.Component { ({...c, label: __(c.label)}))} isRequired={true} clearable={false} onChange={this.onChangeSelect} diff --git a/ui/src/modules/settings/boards/components/Boards.tsx b/ui/src/modules/settings/boards/components/Boards.tsx index 3fd540c7735..a0153613574 100644 --- a/ui/src/modules/settings/boards/components/Boards.tsx +++ b/ui/src/modules/settings/boards/components/Boards.tsx @@ -55,7 +55,7 @@ class Boards extends React.Component { uppercase={false} block={true} > - {__("Add New")} {boardName} + {__("Add New")} {__(boardName)} ); diff --git a/ui/src/modules/settings/boards/components/Pipelines.tsx b/ui/src/modules/settings/boards/components/Pipelines.tsx index c86c254031e..04bce419e69 100644 --- a/ui/src/modules/settings/boards/components/Pipelines.tsx +++ b/ui/src/modules/settings/boards/components/Pipelines.tsx @@ -180,7 +180,7 @@ class Pipelines extends React.Component { icon="plus-circle" onClick={this.addPipeline} > - Add {pipelineName} + {__('Add')} {__(pipelineName)} ); diff --git a/ui/src/modules/settings/constants.ts b/ui/src/modules/settings/constants.ts index 8ef88d188f9..a5e6190bf33 100644 --- a/ui/src/modules/settings/constants.ts +++ b/ui/src/modules/settings/constants.ts @@ -323,7 +323,7 @@ export const EMPTY_CONTENT_DEAL_PIPELINE = { { title: 'Create your first Sales Board', description: - 'Tip: This could be equivalent to your brands and/or you can organize by year/project/etc.', + 'Tip: This could be equivalent to your brands and/or you can organize by year/project/etc', url: '/settings/boards/deal#showBoardModal=true', urlText: 'Create a Board' }, diff --git a/ui/src/modules/settings/email/components/List.tsx b/ui/src/modules/settings/email/components/List.tsx index 8a0ceb73726..3671e67e876 100755 --- a/ui/src/modules/settings/email/components/List.tsx +++ b/ui/src/modules/settings/email/components/List.tsx @@ -31,7 +31,7 @@ class List extends React.Component { ); - const title = `${name}'s email template`; + const title = `${name}'s ${__('email template')}`; const content = props => ( diff --git a/ui/src/modules/settings/growthHacks/components/PipelineForm.tsx b/ui/src/modules/settings/growthHacks/components/PipelineForm.tsx index 5b7c1c110eb..c8bc01e0aca 100755 --- a/ui/src/modules/settings/growthHacks/components/PipelineForm.tsx +++ b/ui/src/modules/settings/growthHacks/components/PipelineForm.tsx @@ -339,7 +339,15 @@ class PipelineForm extends React.Component { {