288 Commits

Author SHA1 Message Date
Abhinav Raut a110d38dd8 adjusts padding in filter group builder
adds comments with sample payloads to make the filter format easier to understand
2026-06-17 15:35:05 +05:30
Abhinav Raut 85a200247b keeps filter builder Add group button visible and tidies group controls 2026-06-16 23:25:50 +05:30
Abhinav Raut 54e30e2e71 feat: disable 'Add group' in filter builder at the backend group cap 2026-06-16 16:14:12 +05:30
Abhinav Raut 20b3aec44e fix: restrict contains operator to trigram-indexed fields in view filters
contains on users.external_user_id has no trigram index and would full-scan;
only users.email keeps partial matching.
2026-06-16 16:14:12 +05:30
Abhinav Raut 95f829b37c fix: stop filter builder from mutating form state; emit immutable tree updates
Fixes typing in a filter value overwriting the whole filters object
(vee-validate listeners falling through to the builder root), the form
going stale after save/reset, and Create reusing a cancelled edit's data.
2026-06-16 16:14:12 +05:30
Abhinav Raut 6a24612412 fix: drop icon from 'Remove group' button so it doesn't draw focus 2026-06-16 16:14:12 +05:30
Abhinav Raut 496264d590 fix: separate group-remove from per-condition remove in filter builder
The group remove button sat inline with the first condition's close button (8px apart, easy to misclick). Move it to a labeled 'Remove group' header button (trash icon) so it's clearly distinct from the per-condition X.
2026-06-16 16:14:12 +05:30
Abhinav Raut 9b31e282c8 fix: reject empty filter values in query builder; tighten filter tree handling
- builder: error on value-requiring operators with empty value and on empty 'in' arrays instead of emitting invalid SQL (field IN ())
- filterTree: coerce array IDs to strings in toStringIdArray
- useConversationFilters: external_user_id uses TEXT operators (was SELECT)
- FilterGroupBuilder: strict two-level guard verifies group children are leaves
- drop orphaned partiallyFilled i18n key
- tests for empty 'in' and empty value rejection
2026-06-16 16:14:12 +05:30
Abhinav Raut 3247a3aa58 feat: support nested AND/OR filter groups and new fields in views 2026-06-16 16:14:12 +05:30
Abhinav Raut 14a812d023 Merge pull request #371 from abhinavxd/update-font
update font family to Instrument Sans
2026-06-10 23:43:08 +05:30
Abhinav Raut d300ce26e6 feat: show day separators in conversation message list
closes https://github.com/abhinavxd/libredesk/issues/376
2026-06-10 21:20:07 +05:30
Abhinav Raut edbc026a24 Merge pull request #359 from abhinavxd/transcript
feat: add conversation transcript download and CSAT in sidebar
2026-06-07 15:29:20 +05:30
Abhinav Raut 2d81703ae2 fix: address review nits on transcript download
- sanitize Content-Disposition filename via stringutil.SanitizeFilename to neutralize header injection
- use i18n.Tc for count-aware singular/plural attachment label
- append download anchor to DOM and defer URL.revokeObjectURL for cross-browser reliability
2026-06-07 15:17:03 +05:30
Abhinav Raut 1ce638e9d7 refactor: extract AssignSelfNudge component, let store own local assignee state 2026-06-07 15:01:29 +05:30
Abhinav Raut f9e044676a feat: nudge agent to self-assign after replying to an unassigned conversation 2026-06-07 14:51:03 +05:30
Abhinav Raut 1fccfceb4c feat: add customisable From display name template for outgoing emails
Adds a from_name_template field to email inboxes. When set and the sender is an agent, the template renders with agent and inbox variables and becomes the From display name; the inbox email address is unchanged. Any render failure, or a system-user sender, falls back to the plain inbox From so a misconfigured template never blocks delivery.

Variables: .Agent.FirstName, .Agent.LastName, .Agent.FullName, .Inbox.Name (the inbox name). Based on #249.

Co-authored-by: josephsellers <6892567+josephsellers@users.noreply.github.com>
2026-06-07 14:20:56 +05:30
Abhinav Raut ed95b9104f refactor tidy reply box send button imports and dead code 2026-06-07 12:28:12 +05:30
Abhinav Raut 90ceece01b fix apply status update after send confirmation dialogs. 2026-06-07 12:17:29 +05:30
Abhinav Raut bf22811337 fix chevron color 2026-06-07 11:56:15 +05:30
aditya2r b679fc2158 feat: add "Send and set status" split button to reply box.
Add a dropdown next to the Send button that allows agents to send a
reply and update the conversation status in a single action.

- Add split button with dropdown to  ReplyBoxMenuBar
- Extract email validation into reusable validateBeforeSend helper
- Guard for status update on successful message send
- Exclude Snoozed from status options
2026-06-06 16:14:07 -04:00
Abhinav Raut 4f4bbbef5f Fix macro context lost via Ctrl+K and stale macro filter after new conversation 2026-06-06 21:02:25 +05:30
Abhinav Raut cb081b4b38 update font family to Instrument Sans 2026-06-06 19:58:07 +05:30
Vanboom 168add044b Address issue #363, implement CTRL+M hotkey to access the macro dialog
directly
2026-06-03 14:28:38 -05:00
Abhinav Raut eb6a195aaf feat: add conversation transcript download and CSAT in sidebar
Agents can download a full conversation as a .txt file from the
header menu. The conversation sidebar now shows the CSAT rating and
feedback once the customer responds.
2026-06-02 16:25:33 +05:30
Abhinav Raut 5c5c73b5b7 soft-refresh conversation list on inbox re-entry instead of refetching 2026-06-01 13:17:26 +05:30
Abhinav Raut 97df3ba7a6 fix: remove inbox keep-alive that caused duplicate admin requests 2026-06-01 13:06:52 +05:30
Abhinav Raut 870f66c229 fix: sanitize invalid UTF-8 in incoming email, fix widget scroll flicker 2026-05-29 21:00:48 +05:30
Abhinav Raut 67ecf3a3a6 fix: keep the mentioned message in view when long messages collapse
Tall message bubbles above the target collapse to a max height right after they render. That shrank the space above and pushed the mentioned message off screen. We now re-pin the message until the layout stops moving.
2026-05-29 16:07:53 +05:30
Abhinav Raut f331b3cd8e Merge pull request #342 from jleroy/i18n/update-2026-05-26
Update translations [2025-05-26]
2026-05-29 01:13:23 +05:30
Abhinav Raut c8a5717b43 fix: filter search results by conversation read permission
Auto focus on search input
Trim search responses to 200 chars as more's not needed.
2026-05-28 21:38:57 +05:30
Jonathan Leroy a318b52b5c Update translations [2025-05-26] 2026-05-28 17:47:44 +02:00
Abhinav Raut 5594cce021 Merge pull request #341 from abhinavxd/widget-ws-improvements
fix: reliably sync widget missed messages on reconnect
2026-05-28 20:48:30 +05:30
Abhinav Raut 9159c26d5f fix: clean up widget ws state on close and announce banner to screen readers 2026-05-28 20:40:54 +05:30
Abhinav Raut bba99d45e5 fix: show typing indicator on scroll, hide view transition abort errors 2026-05-28 20:29:14 +05:30
Abhinav Raut 29881f2f82 fix: close ws stale-perm gaps and resub on reconnect
Reject disabled agents in FilterAuthorizedListUUIDs, kick role members on
permission removal or role delete, and re-sub the list and open conv on
ws reconnect using local state. Also plug the app logger into the ws
package so kicks no longer log when no connections exist.
2026-05-28 20:07:19 +05:30
Abhinav Raut 74e2213e75 fix: auto-resub list when conv uuids change 2026-05-28 19:30:01 +05:30
Abhinav Raut 743b00ee22 fix: address PR review across stores, ws broadcast, and sticky scroll 2026-05-28 18:32:16 +05:30
Abhinav Raut 5dfefabe52 fix: guard previous_conversations loop against nullish current 2026-05-28 17:39:16 +05:30
Abhinav Raut a0851bc709 fix: show typing indicator on scroll, hide view transition abort errors 2026-05-28 17:18:39 +05:30
Abhinav Raut 8faf06ed99 fix: reliably sync widget missed messages on reconnect
Update connection status banner to show more intermediate connection statuses like connecting.. and connected.
2026-05-27 19:05:01 +05:30
Abhinav Raut b65d9679ae fix: scroll to target message on scrollTo deep-link instead of bottom 2026-05-27 02:14:23 +05:30
Abhinav Raut f58149291d refactor: dedupe overview report fetch/handler boilerplate 2026-05-26 12:52:07 +05:30
Abhinav Raut 214cc60374 fix: derive conversation list link context from route params, not name substring
route.name.includes('view') also matched 'overview', causing vue-router to
throw "Missing required param viewID" when the kept-alive conversation
list recomputed its links from /reports/overview. Switch to checking
route.params.teamID / route.params.viewID directly.
2026-05-26 12:07:34 +05:30
Abhinav Raut eb4e49adf0 fix: gate mark-as-read by route, clear stale lastInboxPath on load 2026-05-26 03:31:49 +05:30
Abhinav Raut 9f09d8c521 fix: dedupe parallel custom-attribute fetch, cache AI prompts in store 2026-05-26 03:06:35 +05:30
Abhinav Raut cd8eb5ee26 perf: keep-alive inbox layout to skip refetch on admin round-trip 2026-05-26 03:00:02 +05:30
Abhinav Raut e5ffe11394 Fix edge cases in auto scrolling behavior.
Extract sticky scroller to a composable for main & widget apps.
2026-05-26 02:18:48 +05:30
Abhinav Raut 92fe4f4539 tweak: scope conv list refresh interval to InboxView, bump to 2m 2026-05-25 23:18:34 +05:30
Abhinav Raut ad089fc79f fix: hide conv list items while skeleton is visible 2026-05-22 22:37:29 +05:30
Abhinav Raut e4fae78c2b tweak: bump skeleton minVisibleMs 300 -> 500ms 2026-05-22 22:23:38 +05:30