Commit Graph
3195 Commits
Author SHA1 Message Date
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
0a181b0cea chore: Update translations (#14498)
Updates dashboard, widget, and backend locale files with the latest
translation sync from Crowdin.

## Closes

N/A

## What changed

- Refreshes translated dashboard JSON locale files across supported
languages.
- Adds the latest backend Help Center/public portal locale strings.
- Keeps the branch current with `develop` and resolves the `ar`, `fr`,
and `pt_BR` locale conflicts.

## Validation

- Parsed all changed JSON and YAML locale files successfully.
- Checked for leftover merge conflict markers.
- Ran `git diff --check`.

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-06-02 21:21:50 +05:30
Sony MathewandGitHub 87df43bdd0 revert: restore conversation unread count feature flag (#14623)
This reverts #14610 so conversation unread counts are again controlled
by the `conversation_unread_counts` feature flag across the API,
ActionCable broadcasts, notifier/listener paths, and dashboard sidebar
fetching.

## Closes
- None

## What changed
- Restores feature-flag checks for conversation unread count reads and
broadcasts.
- Restores the dashboard feature flag constant and sidebar/store
behavior for disabled unread counts.
- Restores the specs that cover disabled-feature behavior.

## How to test
- In an account with `conversation_unread_counts` enabled, verify
sidebar unread counts are fetched and updated in real time.
- Disable `conversation_unread_counts` for the account and verify unread
count requests/broadcasts are skipped.
2026-06-02 21:11:48 +05:30
28f87d2fca fix(widget): translate zh_CN availability keys (#14288)
Translate missing Simplified Chinese live-chat widget availability and
reply-time strings so visitors using `zh_CN` no longer see English
fallbacks in offline and pre-chat states.

## Closes

N/A

## How to test

- Open the widget with `Widget Locale = 中文 (zh_CN)` and set the team
offline. The availability card should stay in Chinese.
- Configure working hours so the widget shows minute, hour, tomorrow,
and day-specific return states. The `{time}`, `{n}`, and `{day}`
placeholders should render correctly.

## What changed

- Translated missing `THUMBNAIL.AUTHOR.NOT_AVAILABLE`,
`TEAM_AVAILABILITY.BACK_AS_SOON_AS_POSSIBLE`, and `REPLY_TIME.*` strings
in `app/javascript/widget/i18n/locale/zh_CN.json`.
- Kept the scope limited to Simplified Chinese.

Co-authored-by: Sojan Jose <sojan@pepalo.com>
2026-06-02 21:10:44 +05:30
37eed5de1e feat(whatsapp): Add support for voice messages (#14606)
> Reopened from #13613, now from a personal fork
(`gabrieljablonski/chatwoot`) so maintainers can push edits —
organization-owned forks don't support "Allow edits from maintainers".
The previous PR is closed in favor of this one; same commits, same diff.

## Description

This PR adds support for sending voice messages (voice notes) through
the WhatsApp Cloud API. When agents record audio in Chatwoot, it is now
transcoded in the browser from WebM/Opus to OGG/Opus and sent with the
`voice: true` flag, so it appears as a native voice note bubble on
WhatsApp — not as a file/document attachment.

Closes #13283

**Key Changes:**
- Added `webmOpusToOgg.js` — a pure JS EBML parser + OGG page builder
that remuxes browser-recorded WebM/Opus audio into OGG/Opus entirely
client-side, with no server-side dependencies.
- Updated `AudioRecorder.vue` to use an explicit `mimeType` hint, proper
resource cleanup, and an `AUDIO_EXTENSION_MAP` for correct file
extensions.
- Renamed `mp3ConversionUtils.js` → `audioConversionUtils.js` and added
OGG conversion support via the new remuxer.
- Updated `ReplyBox.vue` to request OGG format for WhatsApp channels,
pass `isVoiceMessage` per-attachment, and handle recording errors with a
user-facing alert.
- Updated `MessageBuilder` to read the `is_voice_message` param and
persist it in attachment metadata.
- Updated `WhatsappCloudService` to:
- Normalize `audio/opus` → `audio/ogg` content type on ActiveStorage
blobs (works around Marcel gem re-detection).
- Send the `voice: true` flag when the attachment is a voice message
with `audio/ogg` content type.
  - Use WhatsApp Cloud API `v24.0` for the attachment endpoint.
- Added `AUDIO_CONVERSION_FAILED` i18n key.

**How it works:**
1. The browser records audio as WebM/Opus (Chrome/Firefox default).
2. `audioConversionUtils.js` remuxes it to OGG/Opus using the pure-JS
`webmOpusToOgg` remuxer — no server transcoding needed.
3. The OGG file is uploaded with `is_voice_message: true` in the form
payload.
4. `MessageBuilder` persists `is_voice_message` in the attachment's
`meta` hash.
5. `WhatsappCloudService` normalizes the blob content type if needed,
then sends the attachment with `voice: true` so WhatsApp renders it as a
voice note.

## Type of change

- [X] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

1. Record a voice message in a WhatsApp Cloud conversation.
2. Verify the audio is transcoded to OGG (check file extension in the
attachment preview).
3. Verify the message arrives on WhatsApp as a voice note bubble (not a
document/file).
4. Send an image or document attachment and verify it still works as
before (no `voice` flag).
5. Send a regular (non-voice) audio file and verify it arrives without
the voice flag.

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 15:33:32 +04:00
170b64d1f1 chore: upgrade to vite 6 (#14363)
Upgrades the frontend toolchain to Vite 6 and tidies up the build config
along the way. Behavior is unchanged for end users; this is dev/build
infra.

## What changed
- `vite` 5.4 → 6.4, `@vitejs/plugin-vue` → 5.2, `vite-plugin-ruby` → 5.2
(with matching `vite_rails`/`vite_ruby` gem bumps).
- Dropped the `vite-node` 2.0.1 pnpm override — no longer needed now
that vitest 3 runs on Vite 6 directly.
- Split the single `vite.config.ts` into:
- `vite.config.ts` (app), `vite.lib.config.ts` (SDK), `vite.shared.ts`
(aliases / Vue options), `vitest.config.ts` (tests).
- `pnpm build:sdk` now selects the SDK config explicitly instead of
branching on `BUILD_MODE=library`. SDK output path is unchanged
(`public/packs/js/sdk.js`).

No changes needed to Docker images, deployment scripts, or CI — Node 24
and pnpm 10 are already past Vite 6's floor, and the rake
`assets:precompile` hook still drives the SDK build via `pnpm`.

## How to test
- `pnpm dev` and verify the dashboard, widget, and survey routes load
and HMR works.
- Load a Chatwoot site widget on a test page and confirm `sdk.js` is
served and the widget mounts.
- `RAILS_ENV=production bundle exec rake assets:precompile` and confirm
`public/packs/js/sdk.js` plus the rest of the manifest are produced.
- `pnpm test` for the JS suite.

---------

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: Sony Mathew <2040199+sony-mathew@users.noreply.github.com>
2026-06-02 17:01:37 +05:30
ecd9c26c8c feat: Implemented search results page functionality (#11086)
# Pull Request Template

## Description
Implemented search results page functionality. Now you can press "Enter"
to search by term and display results in a results page. Also now you
can link to /hc/{account}/en/search?query=XXXXXX to view search results
for XXXXXX query.

fixes: https://github.com/chatwoot/chatwoot/issues/10945

## Screenshots

Classic layout search results:
<img width="3840" height="2160" alt="classic-results"
src="https://github.com/user-attachments/assets/3bbb3272-33ca-4eb4-b80a-76ed77442088"
/>

Classic layout pagination:
<img width="3840" height="2160" alt="classic-page-two"
src="https://github.com/user-attachments/assets/062b09d3-7c58-4d3b-8611-b94375e7db51"
/>

Classic layout empty search:
<img width="3840" height="2160" alt="no-results"
src="https://github.com/user-attachments/assets/c5e3f47a-cd9a-4e14-ae92-ccba00c89e98"
/>

Documentation layout search results:
<img width="3840" height="2160" alt="documentation-results"
src="https://github.com/user-attachments/assets/9e45d8d9-c975-4589-b6c6-3bc7bb3c588e"
/>

Documentation layout dark theme:
<img width="3840" height="2160" alt="documentation-dark"
src="https://github.com/user-attachments/assets/cdb6ed63-4241-4b32-9f79-7d92ed479fc8"
/>

Plain embedded dark layout:
<img width="3840" height="2160" alt="plain-embedded-dark"
src="https://github.com/user-attachments/assets/7deb02b9-9f24-48fb-8979-a2ecd7002c05"
/>

---------

Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>
Co-authored-by: Pranav <pranav@chatwoot.com>
Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com>
2026-06-02 15:19:23 +05:30
Sony MathewandGitHub 88e2661ca6 feat(conversations): remove unread count feature flag (CW-7237) (#14610)
## Description

Make conversation unread counts always available at runtime by removing
account feature checks from the API endpoint, unread-count listener,
notifier, and ActionCable broadcast path.

Update the dashboard to fetch sidebar unread counts for the active
account without checking FEATURE_FLAGS.CONVERSATION_UNREAD_COUNTS, and
remove the now-unused store clear action that only supported the
disabled state.

Keep the feature entry in config/features.yml to preserve flag bit
order, but mark it enabled and deprecated so fresh installs default to
the always-on behavior while feature-management UI hides it.

Leave existing installation default rows untouched; no migration is
included, so upgraded installs may still store the old flag value but
runtime behavior no longer depends on it.

Update specs around the new always-on contract and remove obsolete
disabled-feature assertions.

Fixes # CW-7237

## Type of change

Please delete options that are not relevant.

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality not to work as expected)
- [ ] This change requires a documentation update

## How Has This Been Tested?

Update specs around the new always-on contract and remove obsolete
disabled-feature assertions. Ran specs locally for the changes.


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
2026-06-02 14:35:37 +05:30