From da466c88a6302e634a9f132ed5313f11761693e4 Mon Sep 17 00:00:00 2001 From: Gabriel Jablonski Date: Mon, 2 Feb 2026 19:50:17 -0300 Subject: [PATCH] feat(scheduled-messages): add WhatsApp templates (#205) * feat(scheduled-messages): add WhatsApp templates * fix: update inboxId prop type to accept both Number and String; localize template labels in conversation.json --- .../components/ScheduledMessageItem.vue | 16 ++++ .../whatsapp/WhatsAppTemplateParser.vue | 11 +++ .../conversation/WhatsappTemplates/Modal.vue | 14 +++- .../WhatsAppTemplateReply.vue | 15 +++- .../i18n/locale/en/conversation.json | 4 + .../i18n/locale/pt_BR/conversation.json | 6 +- .../ScheduledMessageModal.vue | 83 +++++++++++++++++-- 7 files changed, 138 insertions(+), 11 deletions(-) diff --git a/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/ScheduledMessageItem.vue b/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/ScheduledMessageItem.vue index 05e47f5cf..7cb071ba0 100644 --- a/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/ScheduledMessageItem.vue +++ b/app/javascript/dashboard/components-next/Contacts/ContactsSidebar/components/ScheduledMessageItem.vue @@ -109,6 +109,8 @@ const templateName = computed(() => { return templateParams.name || templateParams.id; }); +const hasTemplate = computed(() => Boolean(templateName.value)); + const attachment = computed(() => props.scheduledMessage?.attachment); const attachmentName = computed(() => attachment.value?.filename); const attachmentUrl = computed(() => attachment.value?.file_url); @@ -247,6 +249,20 @@ watch(previewContent, () => { +
+ + + {{ + t('SCHEDULED_MESSAGES.ITEM.TEMPLATE_LABEL', { + name: templateName, + }) + }} + +
+
{ + return ( + props.sendButtonLabel || t('WHATSAPP_TEMPLATES.PARSER.SEND_MESSAGE_LABEL') + ); +}); + const languageLabel = computed(() => { return `${t('WHATSAPP_TEMPLATES.PARSER.LANGUAGE')}: ${props.template.language || DEFAULT_LANGUAGE}`; }); @@ -305,6 +315,7 @@ defineExpose({ :go-back="goBack" :is-valid="!v$.$invalid" :disabled="isFormInvalid" + :send-button-text="sendButtonText" />
diff --git a/app/javascript/dashboard/components/widgets/conversation/WhatsappTemplates/Modal.vue b/app/javascript/dashboard/components/widgets/conversation/WhatsappTemplates/Modal.vue index ad3464854..7a2c47161 100644 --- a/app/javascript/dashboard/components/widgets/conversation/WhatsappTemplates/Modal.vue +++ b/app/javascript/dashboard/components/widgets/conversation/WhatsappTemplates/Modal.vue @@ -12,9 +12,13 @@ export default { default: false, }, inboxId: { - type: Number, + type: [Number, String], default: undefined, }, + sendButtonLabel: { + type: String, + default: '', + }, }, emits: ['onSend', 'cancel', 'update:show'], data() { @@ -39,6 +43,13 @@ export default { : this.$t('WHATSAPP_TEMPLATES.MODAL.SUBTITLE'); }, }, + watch: { + show(newVal) { + if (newVal) { + this.selectedWaTemplate = null; + } + }, + }, methods: { pickTemplate(template) { this.selectedWaTemplate = template; @@ -71,6 +82,7 @@ export default { diff --git a/app/javascript/dashboard/components/widgets/conversation/WhatsappTemplates/WhatsAppTemplateReply.vue b/app/javascript/dashboard/components/widgets/conversation/WhatsappTemplates/WhatsAppTemplateReply.vue index 76ebc267f..81d5f44d6 100644 --- a/app/javascript/dashboard/components/widgets/conversation/WhatsappTemplates/WhatsAppTemplateReply.vue +++ b/app/javascript/dashboard/components/widgets/conversation/WhatsappTemplates/WhatsAppTemplateReply.vue @@ -2,11 +2,15 @@ import WhatsAppTemplateParser from 'dashboard/components-next/whatsapp/WhatsAppTemplateParser.vue'; import NextButton from 'dashboard/components-next/button/Button.vue'; -defineProps({ +const props = defineProps({ template: { type: Object, default: () => ({}), }, + sendButtonLabel: { + type: String, + default: '', + }, }); const emit = defineEmits(['sendMessage', 'resetTemplate']); @@ -23,11 +27,14 @@ const handleResetTemplate = () => {