Commit Graph
4685 Commits
Author SHA1 Message Date
Captain fd6ad2b1e1 New translations conversation.json (Tagalog)
[ci skip]
[ci skip]
2026-06-03 02:45:04 -07:00
Captain 04d5279411 New translations conversation.json (Malay)
[ci skip]
[ci skip]
2026-06-03 02:45:02 -07:00
Captain f7058a8af4 New translations conversation.json (Hindi)
[ci skip]
[ci skip]
2026-06-03 02:45:00 -07:00
Captain eecfd8132b New translations conversation.json (Azerbaijani)
[ci skip]
[ci skip]
2026-06-03 02:44:58 -07:00
Captain 70ed790098 New translations conversation.json (Latvian)
[ci skip]
[ci skip]
2026-06-03 02:44:57 -07:00
Captain 6c3e667fac New translations conversation.json (Estonian)
[ci skip]
[ci skip]
2026-06-03 02:44:55 -07:00
Captain 7494baef3c New translations conversation.json (Croatian)
[ci skip]
[ci skip]
2026-06-03 02:44:53 -07:00
Captain f2034c752f New translations conversation.json (Thai)
[ci skip]
[ci skip]
2026-06-03 02:44:51 -07:00
Captain 2d489c1c0a New translations conversation.json (Bengali)
[ci skip]
[ci skip]
2026-06-03 02:44:50 -07:00
Captain 53ede69a73 New translations conversation.json (Tamil)
[ci skip]
[ci skip]
2026-06-03 02:44:48 -07:00
Captain c2e2b320ef New translations conversation.json (Persian)
[ci skip]
[ci skip]
2026-06-03 02:44:46 -07:00
Captain cb05a318a7 New translations conversation.json (Indonesian)
[ci skip]
[ci skip]
2026-06-03 02:44:44 -07:00
Captain fd9beedb68 New translations conversation.json (Portuguese, Brazilian)
[ci skip]
[ci skip]
2026-06-03 02:44:42 -07:00
Captain e2061fb624 New translations conversation.json (Icelandic)
[ci skip]
[ci skip]
2026-06-03 02:44:40 -07:00
Captain ce5803d312 New translations conversation.json (Vietnamese)
[ci skip]
[ci skip]
2026-06-03 02:44:39 -07:00
Captain cba2647b5e New translations conversation.json (Urdu (Pakistan))
[ci skip]
[ci skip]
2026-06-03 02:44:37 -07:00
Captain c3e438b365 New translations conversation.json (Chinese Traditional)
[ci skip]
[ci skip]
2026-06-03 02:44:35 -07:00
Captain a48fea0a7f New translations conversation.json (Chinese Simplified)
[ci skip]
[ci skip]
2026-06-03 02:44:33 -07:00
Captain 80daea6054 New translations conversation.json (Ukrainian)
[ci skip]
[ci skip]
2026-06-03 02:44:32 -07:00
Captain cd93459320 New translations conversation.json (Turkish)
[ci skip]
[ci skip]
2026-06-03 02:44:30 -07:00
Captain 9801137296 New translations conversation.json (Swedish)
[ci skip]
[ci skip]
2026-06-03 02:44:28 -07:00
Captain d4890a6e52 New translations conversation.json (Albanian)
[ci skip]
[ci skip]
2026-06-03 02:44:27 -07:00
Captain 79c8df7c4f New translations conversation.json (Slovenian)
[ci skip]
[ci skip]
2026-06-03 02:44:25 -07:00
Captain e204ed95ce New translations conversation.json (Slovak)
[ci skip]
[ci skip]
2026-06-03 02:44:23 -07:00
Captain 34a3da97b2 New translations conversation.json (Russian)
[ci skip]
[ci skip]
2026-06-03 02:44:21 -07:00
Captain 5da34f916e New translations conversation.json (Portuguese)
[ci skip]
[ci skip]
2026-06-03 02:44:19 -07:00
Captain 4a31dd2120 New translations conversation.json (Polish)
[ci skip]
[ci skip]
2026-06-03 02:44:17 -07:00
Captain 6ca32faeab New translations conversation.json (Norwegian)
[ci skip]
[ci skip]
2026-06-03 02:44:15 -07:00
Captain 186d8c9462 New translations conversation.json (Dutch)
[ci skip]
[ci skip]
2026-06-03 02:44:14 -07:00
Captain 50a46d123a New translations conversation.json (Lithuanian)
[ci skip]
[ci skip]
2026-06-03 02:44:12 -07:00
Captain ec5dee5c46 New translations conversation.json (Korean)
[ci skip]
[ci skip]
2026-06-03 02:44:10 -07:00
Captain 93cc1f339a New translations conversation.json (Georgian)
[ci skip]
[ci skip]
2026-06-03 02:44:08 -07:00
Captain 3468ca48c3 New translations conversation.json (Japanese)
[ci skip]
[ci skip]
2026-06-03 02:44:06 -07:00
Captain 47e2e4371f New translations conversation.json (Italian)
[ci skip]
[ci skip]
2026-06-03 02:44:04 -07:00
Captain 9f3d2d545b New translations conversation.json (Armenian)
[ci skip]
[ci skip]
2026-06-03 02:44:01 -07:00
Captain 4e04fd3d08 New translations conversation.json (Hungarian)
[ci skip]
[ci skip]
2026-06-03 02:44:00 -07:00
Captain e064899267 New translations conversation.json (Hebrew)
[ci skip]
[ci skip]
2026-06-03 02:43:58 -07:00
Captain 3594ce9bb5 New translations conversation.json (Finnish)
[ci skip]
[ci skip]
2026-06-03 02:43:56 -07:00
Captain 03777d7cc1 New translations conversation.json (Greek)
[ci skip]
[ci skip]
2026-06-03 02:43:54 -07:00
Captain e3e238bce8 New translations conversation.json (German)
[ci skip]
[ci skip]
2026-06-03 02:43:52 -07:00
Captain e0e8a70720 New translations conversation.json (Danish)
[ci skip]
[ci skip]
2026-06-03 02:43:50 -07:00
Captain e2d1ce7554 New translations conversation.json (Czech)
[ci skip]
[ci skip]
2026-06-03 02:43:48 -07:00
Captain 1dd5eb64cf New translations conversation.json (Catalan)
[ci skip]
[ci skip]
2026-06-03 02:43:46 -07:00
Captain 0c6d2cc0b7 New translations conversation.json (Bulgarian)
[ci skip]
[ci skip]
2026-06-03 02:43:45 -07:00
Captain b6ff4f54be New translations conversation.json (Arabic)
[ci skip]
[ci skip]
2026-06-03 02:43:43 -07:00
Captain 07c92c6097 New translations conversation.json (Spanish)
[ci skip]
[ci skip]
2026-06-03 02:43:41 -07:00
Captain cafa486c18 New translations conversation.json (French)
[ci skip]
[ci skip]
2026-06-03 02:43:40 -07:00
Captain baea194f6b New translations conversation.json (Romanian)
[ci skip]
[ci skip]
2026-06-03 02:43:38 -07:00
Captain 23cad33d96 New translations conversation.json (Portuguese, Brazilian)
[ci skip]
[ci skip]
2026-06-02 11:13:36 -07:00
36a05097fa fix(webhooks): strip trailing newlines from webhook message content (#14272)
The TipTap/ProseMirror editor stores agent messages with trailing
paragraph nodes that produce trailing newlines (e.g. \`\n\n\n\`) in the
\`content\` field. While Chatwoot's native channel delivery already
handles this, webhook payloads and API responses were returning raw
content with trailing whitespace — causing visible blank space below
messages in every external integration that consumes Chatwoot webhooks
(WhatsApp via Evolution API, Telegram bots, custom webhook consumers).

Closes #13459

## Root cause

\`Messages::WebhookContentNormalizer\` already strips CommonMark hard
line breaks (\`\\\` + newline) for webhook consumers, but it did not
strip trailing whitespace. All webhook and API responses flow through
this normaliser, so it is the single correct place to apply the fix
without touching stored data.

## What changed

Added \`.rstrip\` to \`Messages::WebhookContentNormalizer.normalize\`:

\`\`\`ruby
# before
text.gsub(/\\\r?\n/, "\n")

# after
text.gsub(/\\\r?\n/, "\n").rstrip
\`\`\`

## Trade-offs considered

| Option | Decision |
|---|---|
| \`before_save\` on \`Message\` model | Would clean stored data but is
a broader change affecting all message creation paths and would require
a data migration for existing records. Out of scope for this bug. |
| Trim in each channel's send path | DRY violation — many channels, each
would need the same patch. |
| Fix at normaliser level (chosen) | Single location, only affects
webhook/API output, zero risk to stored data or native channel delivery.
|

**Known limitation:** existing messages in the database still have
trailing newlines in storage. They will be delivered correctly through
webhooks after this fix, but a follow-up migration could clean stored
content if needed.

## How to reproduce

1. Send an agent reply from the Chatwoot UI
2. Inspect the \`content\` field of the outgoing \`message_created\`
webhook payload
3. Observe trailing \`\n\n\n\` after the message text

After this fix, the \`content\` field is trimmed before delivery.

---------

Co-authored-by: Ramalau Debeila <rdebeila@datacentrix.co.za>
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
2026-06-02 23:28:13 +05:30