@dev.smartpricing/message-composer-layer 4.3.2-fix.1 → 4.5.1-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +228 -46
  2. package/app/api/brands.ts +20 -13
  3. package/app/api/client.ts +15 -6
  4. package/app/api/compilation.ts +13 -3
  5. package/app/api/dynamicValues.ts +6 -2
  6. package/app/api/media.ts +6 -3
  7. package/app/api/messageGroups.ts +29 -14
  8. package/app/api/meta.ts +26 -4
  9. package/app/api/organization.ts +10 -1
  10. package/app/api/tracking.ts +2 -2
  11. package/app/components/Common/AppContextErrors.vue +30 -0
  12. package/app/components/Common/HtmlPreviewIframe.vue +17 -3
  13. package/app/components/Common/MessageGroupSelect.vue +164 -26
  14. package/app/components/Common/MessagePreviewSlideover.vue +3 -0
  15. package/app/components/Common/OrganizationGate.vue +51 -0
  16. package/app/components/Common/OrganizationSelect.vue +27 -0
  17. package/app/components/Common/WhatsappNotConfigured.vue +20 -0
  18. package/app/components/Composer/EmailComposer.vue +4 -0
  19. package/app/components/Composer/MessageLibrary.vue +17 -7
  20. package/app/components/Composer/WabaSelectModal.vue +75 -0
  21. package/app/components/Composer/WhatsappComposer.vue +78 -3
  22. package/app/components/MessageSendFlow/EmailPreview.vue +81 -0
  23. package/app/components/MessageSendFlow/LanguageSelect.vue +39 -0
  24. package/app/components/MessageSendFlow/MessageSendFlow.vue +265 -0
  25. package/app/components/MessageSendFlow/ParametersForm.vue +51 -0
  26. package/app/components/TemplateList/BaseTable.vue +156 -108
  27. package/app/components/Whatsapp/Preview.vue +12 -4
  28. package/app/components/Whatsapp/PreviewPanel.vue +7 -1
  29. package/app/composables/composerContext.ts +9 -7
  30. package/app/composables/useEffectiveOrganization.ts +34 -0
  31. package/app/composables/useMessageGroupList.ts +186 -0
  32. package/app/composables/useMessageGroupWaba.ts +73 -0
  33. package/app/composables/useMessageSendFlow.ts +284 -0
  34. package/app/composables/usePagedMessageGroups.ts +78 -0
  35. package/app/composables/useTemplateOperations.ts +23 -4
  36. package/app/composables/useTracking.ts +14 -5
  37. package/app/composables/useWhatsappConfiguration.ts +32 -0
  38. package/app/layouts/default.vue +5 -1
  39. package/app/pages/brands.vue +1 -0
  40. package/app/pages/images.vue +4 -0
  41. package/app/pages/index.vue +1 -0
  42. package/app/pages/preview/[id].vue +2 -0
  43. package/app/pages/template/whatsapp/[id].vue +1 -0
  44. package/app/queries/brands.ts +27 -7
  45. package/app/queries/compilation.ts +16 -3
  46. package/app/queries/dynamicValues.ts +19 -2
  47. package/app/queries/media.ts +8 -3
  48. package/app/queries/messageGroups.ts +56 -17
  49. package/app/queries/meta.ts +13 -8
  50. package/app/stores/appContext.ts +18 -48
  51. package/app/stores/effectiveOrganization.ts +128 -0
  52. package/app/stores/emailEditor.ts +5 -1
  53. package/app/stores/metaSubmission.ts +7 -17
  54. package/app/types/tracking.ts +17 -0
  55. package/app/utils/testIds.const.ts +29 -0
  56. package/i18n/locales/de.ts +84 -2
  57. package/i18n/locales/en.ts +80 -2
  58. package/i18n/locales/es.ts +81 -2
  59. package/i18n/locales/fr.ts +81 -2
  60. package/i18n/locales/it.ts +82 -2
  61. package/package.json +2 -2
@@ -199,7 +199,11 @@ export const useEmailEditorStore = defineStore('emailEditor', () => {
199
199
  sort_by?: 'created_at' | 'name'
200
200
  direction?: 'asc' | 'desc'
201
201
  }) {
202
- brands.value = await brandsApi.getAll(options)
202
+ // The Brands of the Effective Organization: the edited Message Group's.
203
+ brands.value = await brandsApi.getAll({
204
+ ...options,
205
+ organization_id: useEffectiveOrganizationStore().requireOrganizationId(),
206
+ })
203
207
  return brands.value
204
208
  }
205
209
 
@@ -1,7 +1,6 @@
1
1
  import type { SubmissionJob } from '@dev.smartpricing/message-composer-utils/types'
2
2
  import { metaApi } from '~/api/meta'
3
3
  import { useQueryCache } from '@pinia/colada'
4
- import { useAppContextStore } from './appContext'
5
4
 
6
5
  interface ActiveJob {
7
6
  jobId: string
@@ -12,21 +11,17 @@ interface ActiveJob {
12
11
  export const useMetaSubmissionStore = () => {
13
12
  const toast = useToast()
14
13
  const queryCache = useQueryCache()
15
- const appContext = useAppContextStore()
16
14
  const { t } = useI18n()
17
15
 
18
16
  const activeJobs = useState<Map<string, ActiveJob>>('meta-submission-jobs', () => new Map())
19
17
  const pollingInterval = useState<NodeJS.Timeout | null>('meta-polling-interval', () => null)
20
18
 
21
- const isConfigured = computed(() => !!appContext.metaWabaId)
22
-
23
- const submitToMeta = async (messageGroupId: string) => {
24
- if (!isConfigured.value) {
25
- throw new Error('Meta configuration not available')
26
- }
27
-
19
+ // `wabaId` is the WABA the user picked for a first submission, if any.
20
+ const submitToMeta = async (messageGroupId: string, wabaId?: string) => {
28
21
  try {
29
- const response = await metaApi.submitGroup(messageGroupId)
22
+ const response = await metaApi.submitGroup(messageGroupId, wabaId)
23
+ // The Message Group is on its WABA from now on: read it again.
24
+ queryCache.invalidateQueries({ key: ['message-groups', messageGroupId] })
30
25
  startBackgroundPolling(response.jobId, messageGroupId)
31
26
  return response
32
27
  } catch (error) {
@@ -38,13 +33,9 @@ export const useMetaSubmissionStore = () => {
38
33
  // Submit a single message (one language) for Meta review. Synchronous:
39
34
  // the endpoint submits inline and flips the message to `pending`, so there
40
35
  // is no job to poll — unlike the group flow.
41
- const submitMessageToMeta = async (messageId: string) => {
42
- if (!isConfigured.value) {
43
- throw new Error('Meta configuration not available')
44
- }
45
-
36
+ const submitMessageToMeta = async (messageId: string, wabaId?: string) => {
46
37
  try {
47
- const response = await metaApi.submitMessage(messageId)
38
+ const response = await metaApi.submitMessage(messageId, wabaId)
48
39
  toast.add({
49
40
  color: 'success',
50
41
  title: t('meta_submission.message_success'),
@@ -133,7 +124,6 @@ export const useMetaSubmissionStore = () => {
133
124
  return {
134
125
  activeJobs,
135
126
  hasActiveJobs,
136
- isConfigured,
137
127
  submitToMeta,
138
128
  submitMessageToMeta,
139
129
  startBackgroundPolling,
@@ -1,5 +1,10 @@
1
+ import type { MessageGroupProduct } from '@dev.smartpricing/message-composer-utils/types'
2
+
1
3
  export type MessagesKind = 'email' | 'whatsapp'
2
4
 
5
+ /** The step an operator was on when leaving the Message Send Flow. */
6
+ export type MessageSendFlowStep = 'message' | 'parameters'
7
+
3
8
  export interface MessageActionProperties {
4
9
  message_name: string
5
10
  languages: string[]
@@ -83,6 +88,8 @@ export interface TrackingEventMap {
83
88
  search_term: string
84
89
  category: string
85
90
  status: string
91
+ /** The Product filter; `all` when not narrowed. */
92
+ product: MessageGroupProduct | 'all'
86
93
  messages_kind: MessagesKind
87
94
  }
88
95
  change_tab: { messages_kind: MessagesKind }
@@ -160,4 +167,14 @@ export interface TrackingEventMap {
160
167
  to_recipients: number
161
168
  language: string
162
169
  }
170
+
171
+ // === Message Send Flow (spec #67) ===
172
+ 'send_flow.confirm': {
173
+ message_name: string
174
+ message_category: string
175
+ language: string
176
+ parameters_count: number
177
+ }
178
+ 'send_flow.cancel': { step: MessageSendFlowStep }
179
+ 'send_flow.error': { code: string }
163
180
  }
@@ -513,11 +513,16 @@ export const templateListTableTestIds = {
513
513
  searchInput: 'template-list-table-search-input',
514
514
  categorySelect: 'template-list-table-category-select',
515
515
  statusSelect: 'template-list-table-status-select',
516
+ productSelect: 'template-list-table-product-select',
517
+ visibilitySelect: 'template-list-table-visibility-select',
518
+ pagination: 'template-list-table-pagination',
519
+ paginationSummary: 'template-list-table-pagination-summary',
516
520
  card: 'template-list-table-card',
517
521
  table: 'template-list-table-table',
518
522
  rowName: 'template-list-table-row-name',
519
523
  rowInternalBadge: 'template-list-table-row-internal-badge',
520
524
  rowCategoryBadge: 'template-list-table-row-category-badge',
525
+ rowProductBadge: 'template-list-table-row-product-badge',
521
526
  rowPreview: 'template-list-table-row-preview',
522
527
  rowActions: 'template-list-table-row-actions',
523
528
  rowEditAction: 'template-list-table-row-edit',
@@ -751,7 +756,31 @@ export const previewByIdTestIds = {
751
756
 
752
757
  export const messageGroupSelectTestIds = {
753
758
  root: 'message-group-select-root',
759
+ loadMore: 'message-group-select-load-more',
754
760
  } as const
755
761
 
756
762
  /** @deprecated Use `messageGroupSelectTestIds` instead */
757
763
  export const templateSelectTestIds = messageGroupSelectTestIds
764
+
765
+ export const messageSendFlowTestIds = {
766
+ root: 'message-send-flow-root',
767
+ stepper: 'message-send-flow-stepper',
768
+ alert: 'message-send-flow-alert',
769
+ picker: 'message-send-flow-picker',
770
+ languageGroup: 'message-send-flow-language-group',
771
+ parametersForm: 'message-send-flow-parameters-form',
772
+ /** One per visible key; the key is on `data-parameter`. */
773
+ parameterInput: 'message-send-flow-parameter-input',
774
+ noParameters: 'message-send-flow-no-parameters',
775
+ /** Right panel, present on every step, holding the channel preview. */
776
+ previewPanel: 'message-send-flow-preview-panel',
777
+ preview: 'message-send-flow-preview',
778
+ /** The compiled email of the Preview step (`render_type` email_v1). */
779
+ emailPreview: 'message-send-flow-email-preview',
780
+ /** The Cancel/Back/Next/Confirm bar, inline or teleported to `actionsTo`. */
781
+ actions: 'message-send-flow-actions',
782
+ back: 'message-send-flow-back',
783
+ next: 'message-send-flow-next',
784
+ cancel: 'message-send-flow-cancel',
785
+ confirm: 'message-send-flow-confirm',
786
+ } as const
@@ -18,6 +18,7 @@ export default {
18
18
  all: 'Alle',
19
19
  copy: 'Kopieren',
20
20
  copy_of: 'Kopie von {name}',
21
+ context_error_title: 'Konfigurationsfehler des Composers',
21
22
  desktop: 'Desktop',
22
23
  error: 'Fehler',
23
24
  errore: 'Fehler',
@@ -50,6 +51,17 @@ export default {
50
51
  },
51
52
  internal: 'Intern',
52
53
  mobile: 'Mobil',
54
+ organization: {
55
+ label: 'Organisation',
56
+ lookup_failed_description:
57
+ 'Beim Laden der Organisationen, auf die Sie Zugriff haben, ist ein Fehler aufgetreten. Versuchen Sie es erneut.',
58
+ lookup_failed_title: 'Ihre Organisationen konnten nicht geladen werden',
59
+ none_description: 'Ihr Benutzer hat auf keine Organisation Zugriff.',
60
+ none_title: 'Keine Organisation verfügbar',
61
+ resolving: 'Ihre Organisationen werden geladen...',
62
+ retry: 'Erneut versuchen',
63
+ search_placeholder: 'Organisationen suchen...',
64
+ },
53
65
  preview: 'Vorschau',
54
66
  search: 'Suchen...',
55
67
  success: 'Erfolg',
@@ -57,10 +69,21 @@ export default {
57
69
  messageGroupSelect: {
58
70
  inactive_tooltip:
59
71
  'Diese Nachrichtengruppe enthält nicht genehmigte oder fehlende Nachrichten',
72
+ not_sendable_tooltip: 'Diese Nachrichtengruppe enthält keine genehmigten Nachrichten',
60
73
  hide_inactive: 'Inaktive ausblenden',
74
+ hide_not_sendable: 'Nicht sendbare ausblenden',
75
+ load_more: 'Mehr laden',
61
76
  },
62
77
  view_less: 'Weniger anzeigen',
63
78
  view_more: 'Mehr anzeigen',
79
+ whatsapp_not_configured_description:
80
+ 'Diese Organisation hat kein WhatsApp-Business-Konto. WhatsApp-Nachrichten können als Entwurf gespeichert, aber nicht zur Genehmigung eingereicht werden.',
81
+ whatsapp_not_configured_title: 'WhatsApp ist nicht konfiguriert',
82
+ whatsapp_waba_detached_description:
83
+ 'Sie kann nicht mehr zur Genehmigung eingereicht werden. Dupliziere sie, um die Kopie bei einem anderen WhatsApp Business-Konto einzureichen.',
84
+ whatsapp_waba_detached_title:
85
+ 'Diese Nachricht gehört zu einem WhatsApp Business-Konto, das nicht mehr verbunden ist',
86
+ whatsapp_waba_label: 'WhatsApp Business-Konto:',
64
87
  },
65
88
  dialogs: {
66
89
  delete_message: {
@@ -107,6 +130,13 @@ export default {
107
130
  'Die {language}-Übersetzung zur Überprüfung einreichen? Sie können sie nicht bearbeiten, solange sie auf Genehmigung wartet.',
108
131
  title: 'Überprüfung anfordern',
109
132
  },
133
+ select_waba: {
134
+ confirm: 'Genehmigung anfordern',
135
+ description:
136
+ 'Diese Organisation hat mehr als ein WhatsApp Business-Konto. Wähle das Konto, bei dem diese Nachricht eingereicht wird: Es kann danach nicht mehr geändert werden.',
137
+ no_numbers: 'Keine verbundene Nummer',
138
+ title: 'WhatsApp Business-Konto auswählen',
139
+ },
110
140
  unpublish_message_group: {
111
141
  message:
112
142
  'Veröffentlichung von „{name}“ aufheben? Es ist dann nicht mehr für Kundinnen und Kunden sichtbar.',
@@ -783,20 +813,28 @@ export default {
783
813
  },
784
814
  message_library: {
785
815
  add_message_group: 'Neue Nachricht',
816
+ all_products: 'Alle Produkte',
786
817
  category_placeholder: 'Kategorie auswählen',
787
818
  headers: {
788
819
  category: 'Kategorie',
789
820
  name: 'Name',
790
821
  preview: 'Vorschau',
822
+ product: 'Produkt',
791
823
  status: 'Status',
792
- tags: 'Tags',
793
824
  updated_at: 'Aktualisiert am',
794
825
  },
826
+ pagination_summary: '{from}–{to} von {total}',
827
+ product_placeholder: 'Produkt auswählen',
795
828
  render_type_placeholder: 'Render-Typ auswählen',
796
829
  search_placeholder: 'Suchen',
797
830
  status_placeholder: 'Status auswählen',
798
- tags_placeholder: 'Nach Tags filtern',
799
831
  title: 'Nachrichtenbibliothek',
832
+ visibility: {
833
+ all: 'Alle',
834
+ internal: 'Intern',
835
+ public: 'Öffentlich',
836
+ },
837
+ visibility_placeholder: 'Sichtbarkeit auswählen',
800
838
  },
801
839
  whatsapp: {
802
840
  create_message_group: {
@@ -829,6 +867,12 @@ export default {
829
867
  },
830
868
  },
831
869
  },
870
+ products: {
871
+ chat: 'Smartchat',
872
+ connect: 'Smartconnect',
873
+ pms: 'Smartpms',
874
+ pricing: 'Smartpricing',
875
+ },
832
876
  public: {
833
877
  select_message: {
834
878
  choose_language: 'Sprache auswählen...',
@@ -838,6 +882,44 @@ export default {
838
882
  send_message: 'Nachricht senden',
839
883
  },
840
884
  },
885
+ send_flow: {
886
+ actions: {
887
+ back: 'Zurück',
888
+ cancel: 'Abbrechen',
889
+ confirm: 'Bestätigen',
890
+ next: 'Weiter',
891
+ },
892
+ errors: {
893
+ COMPILE_FAILED:
894
+ 'Die Nachricht konnte nicht vorbereitet werden. Bitte versuchen Sie es erneut.',
895
+ MISSING_PARAMETERS: 'Füllen Sie alle Parameter aus, bevor Sie bestätigen.',
896
+ NOT_OFFERED:
897
+ '„{name}“ kann von hier aus nicht gesendet werden. Wählen Sie eine andere Nachrichtengruppe.',
898
+ NOT_SENDABLE:
899
+ '„{name}“ hat keine genehmigte Nachricht und kann nicht gesendet werden. Wählen Sie eine andere Nachrichtengruppe.',
900
+ TEMPLATE_NOT_APPROVED:
901
+ 'Diese Nachricht wurde von Meta nicht genehmigt und kann nicht gesendet werden.',
902
+ TEMPLATE_NOT_SUBMITTED:
903
+ 'Diese Nachricht wurde nicht bei Meta eingereicht und kann nicht gesendet werden.',
904
+ },
905
+ language: {
906
+ approved: 'Genehmigt',
907
+ approved_count: 'Genehmigte Sprachen für {name}: {count}',
908
+ not_sendable: 'Nicht sendbar ({status})',
909
+ },
910
+ no_parameters: 'Diese Nachricht hat keine auszufüllenden Parameter.',
911
+ not_sendable_hint: 'Ausgegraute Nachrichtengruppen haben keine genehmigte Nachricht.',
912
+ questions: {
913
+ language: 'In welcher Sprache?',
914
+ message: 'Welche Nachricht möchten Sie senden?',
915
+ parameters: 'Parameter ausfüllen',
916
+ preview: 'Das erhält der Gast',
917
+ },
918
+ steps: {
919
+ message: { description: 'Sendbare Nachrichtengruppe auswählen', title: 'Nachricht' },
920
+ parameters: { description: 'Felder ausfüllen', title: 'Parameter' },
921
+ },
922
+ },
841
923
  status: {
842
924
  approved: 'Genehmigt',
843
925
  draft: 'Entwurf',
@@ -18,6 +18,7 @@ export default {
18
18
  all: 'All',
19
19
  copy: 'Copy',
20
20
  copy_of: 'Copy of {name}',
21
+ context_error_title: 'Composer configuration error',
21
22
  desktop: 'Desktop',
22
23
  error: 'Error',
23
24
  errore: 'Error',
@@ -49,16 +50,38 @@ export default {
49
50
  },
50
51
  internal: 'Internal',
51
52
  mobile: 'Mobile',
53
+ organization: {
54
+ label: 'Organization',
55
+ lookup_failed_description:
56
+ 'Something went wrong while loading the organizations you can access. Try again.',
57
+ lookup_failed_title: 'Your organizations could not be loaded',
58
+ none_description: 'Your user has no access to any organization.',
59
+ none_title: 'No organization available',
60
+ resolving: 'Loading your organizations...',
61
+ retry: 'Try again',
62
+ search_placeholder: 'Search organizations...',
63
+ },
52
64
  preview: 'Preview',
53
65
  search: 'Search...',
54
66
  success: 'Success',
55
67
  translation_failed: 'Translation failed',
56
68
  messageGroupSelect: {
57
69
  inactive_tooltip: 'This message group has unapproved or missing messages',
70
+ not_sendable_tooltip: 'This message group has no approved messages',
58
71
  hide_inactive: 'Hide inactive',
72
+ hide_not_sendable: 'Hide not sendable',
73
+ load_more: 'Load more',
59
74
  },
60
75
  view_less: 'View less',
61
76
  view_more: 'View more',
77
+ whatsapp_not_configured_description:
78
+ 'This organization has no WhatsApp Business Account. WhatsApp messages can be saved as drafts, but not submitted for approval.',
79
+ whatsapp_not_configured_title: 'WhatsApp is not configured',
80
+ whatsapp_waba_detached_description:
81
+ 'It can no longer be submitted for approval. Duplicate it to submit the copy to another WhatsApp Business Account.',
82
+ whatsapp_waba_detached_title:
83
+ 'This message is on a WhatsApp Business Account that is no longer connected',
84
+ whatsapp_waba_label: 'WhatsApp Business Account:',
62
85
  },
63
86
  dialogs: {
64
87
  delete_message: {
@@ -103,6 +126,13 @@ export default {
103
126
  "Submit the {language} translation for review? You won't be able to edit it while it's pending approval.",
104
127
  title: 'Request review',
105
128
  },
129
+ select_waba: {
130
+ confirm: 'Request approval',
131
+ description:
132
+ 'This organization has more than one WhatsApp Business Account. Choose the one this message is submitted to: it cannot be changed afterwards.',
133
+ no_numbers: 'No connected number',
134
+ title: 'Choose the WhatsApp Business Account',
135
+ },
106
136
  unpublish_message_group: {
107
137
  message: 'Unpublish "{name}"? It will no longer be visible to clients.',
108
138
  success: '"{name}" has been unpublished.',
@@ -772,20 +802,28 @@ export default {
772
802
  },
773
803
  message_library: {
774
804
  add_message_group: 'New message',
805
+ all_products: 'All products',
775
806
  category_placeholder: 'Select category',
776
807
  headers: {
777
808
  category: 'Category',
778
809
  name: 'Name',
779
810
  preview: 'Preview',
811
+ product: 'Product',
780
812
  status: 'Status',
781
- tags: 'Tags',
782
813
  updated_at: 'Updated at',
783
814
  },
815
+ pagination_summary: '{from}–{to} of {total}',
816
+ product_placeholder: 'Select product',
784
817
  render_type_placeholder: 'Select render type',
785
818
  search_placeholder: 'Search',
786
819
  status_placeholder: 'Select status',
787
- tags_placeholder: 'Filter by tags',
788
820
  title: 'Messages',
821
+ visibility: {
822
+ all: 'All',
823
+ internal: 'Internal',
824
+ public: 'Public',
825
+ },
826
+ visibility_placeholder: 'Select visibility',
789
827
  },
790
828
  whatsapp: {
791
829
  create_message_group: {
@@ -818,6 +856,12 @@ export default {
818
856
  },
819
857
  },
820
858
  },
859
+ products: {
860
+ chat: 'Smartchat',
861
+ connect: 'Smartconnect',
862
+ pms: 'Smartpms',
863
+ pricing: 'Smartpricing',
864
+ },
821
865
  public: {
822
866
  select_message: {
823
867
  choose_language: 'Choose a language...',
@@ -827,6 +871,40 @@ export default {
827
871
  send_message: 'Send message',
828
872
  },
829
873
  },
874
+ send_flow: {
875
+ actions: {
876
+ back: 'Back',
877
+ cancel: 'Cancel',
878
+ confirm: 'Confirm',
879
+ next: 'Next',
880
+ },
881
+ errors: {
882
+ COMPILE_FAILED: 'The message could not be prepared. Please try again.',
883
+ MISSING_PARAMETERS: 'Fill in every parameter before confirming.',
884
+ NOT_OFFERED: '"{name}" cannot be sent from here. Pick another message group.',
885
+ NOT_SENDABLE:
886
+ '"{name}" has no approved message and cannot be sent. Pick another message group.',
887
+ TEMPLATE_NOT_APPROVED: 'This message has not been approved by Meta and cannot be sent.',
888
+ TEMPLATE_NOT_SUBMITTED: 'This message has not been submitted to Meta and cannot be sent.',
889
+ },
890
+ language: {
891
+ approved: 'Approved',
892
+ approved_count: 'Approved languages for {name}: {count}',
893
+ not_sendable: 'Not sendable ({status})',
894
+ },
895
+ no_parameters: 'This message has no parameters to fill in.',
896
+ not_sendable_hint: 'Greyed-out message groups have no approved message.',
897
+ questions: {
898
+ language: 'In which language?',
899
+ message: 'Which message do you want to send?',
900
+ parameters: 'Fill in the parameters',
901
+ preview: 'This is what the guest will receive',
902
+ },
903
+ steps: {
904
+ message: { description: 'Pick a sendable message group', title: 'Message' },
905
+ parameters: { description: 'Fill in the blanks', title: 'Parameters' },
906
+ },
907
+ },
830
908
  status: {
831
909
  approved: 'Approved',
832
910
  draft: 'Draft',
@@ -18,6 +18,7 @@ export default {
18
18
  all: 'Todos',
19
19
  copy: 'Copiar',
20
20
  copy_of: 'Copia de {name}',
21
+ context_error_title: 'Error de configuración del composer',
21
22
  desktop: 'Escritorio',
22
23
  error: 'Error',
23
24
  errore: 'Error',
@@ -50,16 +51,38 @@ export default {
50
51
  },
51
52
  internal: 'Interno',
52
53
  mobile: 'Móvil',
54
+ organization: {
55
+ label: 'Organización',
56
+ lookup_failed_description:
57
+ 'Se produjo un error al cargar las organizaciones a las que tienes acceso. Inténtalo de nuevo.',
58
+ lookup_failed_title: 'No se pudieron cargar tus organizaciones',
59
+ none_description: 'Tu usuario no tiene acceso a ninguna organización.',
60
+ none_title: 'Ninguna organización disponible',
61
+ resolving: 'Cargando tus organizaciones...',
62
+ retry: 'Reintentar',
63
+ search_placeholder: 'Buscar organizaciones...',
64
+ },
53
65
  preview: 'Vista previa',
54
66
  search: 'Buscar...',
55
67
  success: 'Éxito',
56
68
  translation_failed: 'La traducción ha fallado',
57
69
  messageGroupSelect: {
58
70
  inactive_tooltip: 'Este grupo de mensajes tiene mensajes no aprobados o faltantes',
71
+ not_sendable_tooltip: 'Este grupo de mensajes no tiene mensajes aprobados',
59
72
  hide_inactive: 'Ocultar inactivos',
73
+ hide_not_sendable: 'Ocultar no enviables',
74
+ load_more: 'Cargar más',
60
75
  },
61
76
  view_less: 'Ver menos',
62
77
  view_more: 'Ver más',
78
+ whatsapp_not_configured_description:
79
+ 'Esta organización no tiene una cuenta de WhatsApp Business. Los mensajes de WhatsApp se pueden guardar como borradores, pero no enviar para su aprobación.',
80
+ whatsapp_not_configured_title: 'WhatsApp no está configurado',
81
+ whatsapp_waba_detached_description:
82
+ 'Ya no se puede enviar para su aprobación. Duplícalo para enviar la copia a otra cuenta de WhatsApp Business.',
83
+ whatsapp_waba_detached_title:
84
+ 'Este mensaje está en una cuenta de WhatsApp Business que ya no está conectada',
85
+ whatsapp_waba_label: 'Cuenta de WhatsApp Business:',
63
86
  },
64
87
  dialogs: {
65
88
  delete_message: {
@@ -104,6 +127,13 @@ export default {
104
127
  '¿Enviar la traducción en {language} para revisión? No podrá editarla mientras esté pendiente de aprobación.',
105
128
  title: 'Solicitar revisión',
106
129
  },
130
+ select_waba: {
131
+ confirm: 'Solicitar aprobación',
132
+ description:
133
+ 'Esta organización tiene más de una cuenta de WhatsApp Business. Elige a cuál se envía este mensaje: no se podrá cambiar después.',
134
+ no_numbers: 'Ningún número conectado',
135
+ title: 'Elige la cuenta de WhatsApp Business',
136
+ },
107
137
  unpublish_message_group: {
108
138
  message: '¿Despublicar "{name}"? Ya no será visible para los clientes.',
109
139
  success: '"{name}" se ha despublicado.',
@@ -781,20 +811,28 @@ export default {
781
811
  },
782
812
  message_library: {
783
813
  add_message_group: 'Nuevo mensaje',
814
+ all_products: 'Todos los productos',
784
815
  category_placeholder: 'Seleccionar categoría',
785
816
  headers: {
786
817
  category: 'Categoría',
787
818
  name: 'Nombre',
788
819
  preview: 'Vista previa',
820
+ product: 'Producto',
789
821
  status: 'Estado',
790
- tags: 'Etiquetas',
791
822
  updated_at: 'Actualizado el',
792
823
  },
824
+ pagination_summary: '{from}–{to} de {total}',
825
+ product_placeholder: 'Seleccionar producto',
793
826
  render_type_placeholder: 'Seleccionar tipo de renderizado',
794
827
  search_placeholder: 'Buscar',
795
828
  status_placeholder: 'Seleccionar estado',
796
- tags_placeholder: 'Filtrar por etiquetas',
797
829
  title: 'Libreria de mensajes',
830
+ visibility: {
831
+ all: 'Todas',
832
+ internal: 'Internas',
833
+ public: 'Públicas',
834
+ },
835
+ visibility_placeholder: 'Seleccionar visibilidad',
798
836
  },
799
837
  whatsapp: {
800
838
  create_message_group: {
@@ -827,6 +865,12 @@ export default {
827
865
  },
828
866
  },
829
867
  },
868
+ products: {
869
+ chat: 'Smartchat',
870
+ connect: 'Smartconnect',
871
+ pms: 'Smartpms',
872
+ pricing: 'Smartpricing',
873
+ },
830
874
  public: {
831
875
  select_message: {
832
876
  choose_language: 'Elige un idioma...',
@@ -836,6 +880,41 @@ export default {
836
880
  send_message: 'Enviar mensaje',
837
881
  },
838
882
  },
883
+ send_flow: {
884
+ actions: {
885
+ back: 'Atrás',
886
+ cancel: 'Cancelar',
887
+ confirm: 'Confirmar',
888
+ next: 'Siguiente',
889
+ },
890
+ errors: {
891
+ COMPILE_FAILED: 'No se ha podido preparar el mensaje. Inténtelo de nuevo.',
892
+ MISSING_PARAMETERS: 'Rellene todos los parámetros antes de confirmar.',
893
+ NOT_OFFERED: '"{name}" no se puede enviar desde aquí. Elija otro grupo de mensajes.',
894
+ NOT_SENDABLE:
895
+ '"{name}" no tiene ningún mensaje aprobado y no se puede enviar. Elija otro grupo de mensajes.',
896
+ TEMPLATE_NOT_APPROVED: 'Meta no ha aprobado este mensaje y no se puede enviar.',
897
+ TEMPLATE_NOT_SUBMITTED:
898
+ 'Este mensaje no se ha enviado a Meta para su aprobación y no se puede enviar.',
899
+ },
900
+ language: {
901
+ approved: 'Aprobado',
902
+ approved_count: 'Idiomas aprobados para {name}: {count}',
903
+ not_sendable: 'No se puede enviar ({status})',
904
+ },
905
+ no_parameters: 'Este mensaje no tiene parámetros que rellenar.',
906
+ not_sendable_hint: 'Los grupos de mensajes en gris no tienen ningún mensaje aprobado.',
907
+ questions: {
908
+ language: '¿En qué idioma?',
909
+ message: '¿Qué mensaje quiere enviar?',
910
+ parameters: 'Rellenar los parámetros',
911
+ preview: 'Esto es lo que recibirá el huésped',
912
+ },
913
+ steps: {
914
+ message: { description: 'Elegir un grupo de mensajes que se pueda enviar', title: 'Mensaje' },
915
+ parameters: { description: 'Rellenar los campos', title: 'Parámetros' },
916
+ },
917
+ },
839
918
  status: {
840
919
  approved: 'Aprobado',
841
920
  draft: 'Borrador',