1629 Commits

Author SHA1 Message Date
Abhinav Raut addd44fae4 Merge pull request #369 from abhinavxd/improved-views
feat: support nested AND/OR filter groups and new fields in views
v2.4.0
2026-06-19 04:18:48 +05:30
Abhinav Raut a629beaf0b resolve sql builder date filters in the app timezone instead of UTC 2026-06-18 11:56:43 +05:30
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 4eb1f8eca1 Add 2FA for password login to roadmap 2026-06-17 11:28:06 +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 ed0d359c2f feat: cap total filter conditions and 'in' values in query builder 2026-06-16 16:14:12 +05:30
Abhinav Raut b296b57248 feat: cap filter groups and surface a specific error when exceeded
- builder: hardcoded MaxFilterGroups (10) enforced in buildNode (validate + build paths); returns ErrTooManyGroups sentinel
- ValidateListFilters: map ErrTooManyGroups to a specific, actionable message (includes the limit); keep the generic 'Invalid filters.' for everything else so DB/internal details stay hidden
- add conversation.filters.tooManyGroups i18n key + test
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 36c962af7d Merge pull request #385 from abhinavxd/fix-autoassigner-assignment-race
fixes autoassigner overriding a manual assignment
2026-06-16 16:12:58 +05:30
Abhinav Raut 15e5c35d37 renames conversation assignment funcs for clearer intent 2026-06-16 16:04:24 +05:30
Abhinav Raut 18ae7b95d6 make updateAssignee private so user assignment can't skip hooks 2026-06-16 15:58:42 +05:30
Abhinav Raut 1b87433de4 fixes autoassigner overriding a manual assignment
The autoassigner fetched the unassigned list once, then looped and
assigned each one. If the conversation was reassigned while that slow
batch was still running, the autoassigner's write still landed and
overrode it, because the UPDATE had no guard.

Adds an atomic claim that only assigns when the conversation is still
unassigned AND still in the team the user was picked from. A manual
user assignment or a team change between the list read and the claim
now makes the claim a no-op, and the side-effects (webhook, automation,
notification) are skipped. Manual assignment keeps its unconditional
override path.
2026-06-16 12:55:09 +05:30
Abhinav Raut ef1ef15adf Update roadmap with new features and remove WIP items 2026-06-13 04:42:18 +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 ae328d3c51 Update ROADMAP.md 2026-06-09 01:12:09 +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 f70e488662 refactor: sanitize only the reference number for transcript filename 2026-06-07 15:22:52 +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 b75f138de1 Merge pull request #375 from abhinavxd/feat/self-assign-nudge-on-reply
feat: nudge agent to self-assign after replying to an unassigned conversation
2026-06-07 15:08:07 +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 b7564b5da4 Merge pull request #374 from abhinavxd/feat/from-name-template
feat: add customisable From display name template for outgoing emails
2026-06-07 14:51:08 +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 f987224cee perf: avoid DB lookups when building email From name 2026-06-07 14:45:51 +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 cfed3cfc28 test: add e2e tests for inbox, team, agent and conversation flows 2026-06-07 14:06:40 +05:30
Abhinav Raut 2836ad2f71 Merge pull request #373 from aditya2r/feat/unified-send-and-close-ticket-action
feat: add "Send and set status" split button to reply box.
2026-06-07 12:35:39 +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 49b42976f3 update remaining static templates to Instrument Sans
The font swap missed static surfaces outside frontend/. The CSAT widget,
the public page style.css, and the email base template still loaded Plus
Jakarta Sans. Update them so all surfaces use the same font.
2026-06-06 21:16:11 +05:30
Abhinav Raut 073d6a517d Merge pull request #365 from vanboom/363-macro-hotkey
Resolves #363, implement CTRL+M hotkey to access the macro dialog
2026-06-06 21:08:04 +05:30
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 5e9d964aed Merge pull request #361 from abhinavxd/revert-349-codex/document-widget-api
Revert "docs: document widget API endpoints"
2026-06-02 23:53:56 +05:30
Abhinav Raut da1cf5dba1 Revert "docs: document widget API endpoints" 2026-06-02 18:18:35 +05:30
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 84c0c97f68 Merge pull request #349 from alan747271363-art/codex/document-widget-api
docs: document widget API endpoints
2026-06-02 15:30:29 +05:30
Abhinav Raut 9e247c574c Merge pull request #356 from abhinavxd/dependabot/npm_and_yarn/frontend/vitest-4.1.0
build(deps-dev): bump vitest from 3.2.2 to 4.1.0 in /frontend
2026-06-02 12:34:28 +05:30
Abhinav Raut c8413356ec Update ROADMAP.md 2026-06-02 12:06:38 +05:30
dependabot[bot] 3f065439ff build(deps-dev): bump vitest from 3.2.2 to 4.1.0 in /frontend
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 3.2.2 to 4.1.0.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.0/packages/vitest)

---
updated-dependencies:
- dependency-name: vitest
  dependency-version: 4.1.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-01 21:34:46 +00:00
Abhinav Raut 5cd691f77b Merge pull request #353 from abhinavxd/fix/duplicate-admin-api-requests
fix: remove inbox keep-alive that caused duplicate admin requests
v2.3.1
2026-06-01 13:27:36 +05:30