Commit Graph

1667 Commits

Author SHA1 Message Date
Abhinav Raut 60ebefebdc fix edge cases in private note soft-delete 2026-07-08 01:00:24 +05:30
Abhinav Raut 43b43a82ef Merge branch 'main' into delete-private-notes 2026-07-08 00:47:28 +05:30
Abhinav Raut d696b53c80 soft-delete private notes with a tombstone instead of removing them 2026-07-08 00:43:29 +05:30
Abhinav Raut 5a826b9c14 Merge pull request #399 from abhinavxd/reply-box-per-type-drafts
Reply box per type drafts
2026-07-08 00:26:21 +05:30
Abhinav Raut adeb4eee27 swap private-note delete to a hover 3-dot menu with confirm dialog 2026-07-07 23:55:37 +05:30
Abhinav Raut 9e0c1f332d Merge branch 'main' into delete-private-notes 2026-07-07 23:37:05 +05:30
Abhinav Raut bde6f019dc Merge pull request #401 from abhinavxd/fix-dark-highlight-css-leak
fix dark-mode mention highlight leaking a yellow background
2026-07-07 23:34:51 +05:30
Abhinav Raut dc882e033a Merge pull request #260 from josephsellers/contact-name-upsert
Fix: update contact names on upsert instead of discarding them
2026-07-07 23:34:29 +05:30
Abhinav Raut 8268221ea2 fix dark-mode mention highlight leaking a yellow background onto every .dark element 2026-07-07 23:26:57 +05:30
Abhinav Raut 1d7bc67ebf stop sent drafts from coming back after a failed or reordered sync 2026-07-07 23:11:45 +05:30
Abhinav Raut 186502a4f8 open the reply/note tab matching the conversation's last-used draft 2026-07-07 22:57:50 +05:30
Abhinav Raut 0ae9232410 Merge pull request #400 from ahfoysal/fix-assignment-notification-read
Mark assignment notifications read on ticket action
2026-07-06 23:52:55 +05:30
ahfoysal 27e8efb27b fix: update assignment notification state in UI 2026-07-06 16:47:20 +06:00
ahfoysal f4f8db81d9 Mark assignment notifications read on action 2026-07-06 13:32:16 +06:00
Abhinav Raut 8a68ae34a9 fix flaky reply e2e and stop draft load from wiping in-progress input 2026-07-05 23:22:50 +05:30
Abhinav Raut 79b764944a fix attachments and macros leaking across reply and private note drafts 2026-07-05 20:26:58 +05:30
Abhinav Raut ee7b829ff2 Merge branch 'main' into reply-box-per-type-drafts 2026-07-05 20:12:44 +05:30
Abhinav Raut 3feecf4296 Merge pull request #394 from abhinavxd/minor-improvements
add livechat widget preview and misc improvements
2026-07-05 20:09:25 +05:30
Abhinav Raut 0949761d04 fix contrast threshold and cache invalidation order on login 2026-07-05 20:03:31 +05:30
Abhinav Raut 0660ae4e3c Merge pull request #396 from abhinavxd/dependabot/go_modules/golang.org/x/image-0.41.0
build(deps): bump golang.org/x/image from 0.38.0 to 0.41.0
2026-07-05 19:07:42 +05:30
Abhinav Raut 5166358301 move isValidDraftType to bottom of file 2026-07-05 18:42:33 +05:30
Abhinav Raut 18027bc0e3 fix draft races by making the store the single source of truth 2026-07-05 18:42:17 +05:30
dependabot[bot] 6eabd8aa1f build(deps): bump golang.org/x/image from 0.38.0 to 0.41.0
Bumps [golang.org/x/image](https://github.com/golang/image) from 0.38.0 to 0.41.0.
- [Commits](https://github.com/golang/image/compare/v0.38.0...v0.41.0)

---
updated-dependencies:
- dependency-name: golang.org/x/image
  dependency-version: 0.41.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-03 12:38:48 +00:00
Abhinav Raut 82d3ef756b Merge pull request #395 from abhinavxd/dependabot/go_modules/golang.org/x/net-0.55.0
build(deps): bump golang.org/x/net from 0.47.0 to 0.55.0
2026-07-03 18:06:53 +05:30
dependabot[bot] 57e15d32f4 build(deps): bump golang.org/x/net from 0.47.0 to 0.55.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.47.0 to 0.55.0.
- [Commits](https://github.com/golang/net/compare/v0.47.0...v0.55.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.55.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-03 12:31:35 +00:00
Abhinav Raut ec3938c365 save reply and private note drafts separately per type 2026-07-03 03:37:09 +05:30
Abhinav Raut 62a1fc836e add livechat widget preview and misc improvements
Livechat:
- Add a live widget preview that renders in the inbox settings help rail.
- Warn when the primary or header colors are too close to the background.
- Require gradient/image background values and notice banner text when enabled.
- Show a default launcher logo in the widget when none is set, matching the preview.
- Drop the Beta badge from the livechat channel.

General settings:
- Add "set agents away on login". Agents log in as away and must go online manually.
- Add "show subject in conversation list" toggle.

Other:
- Add a keyboard shortcuts dialog from the user menu.
- Show a "snoozed until" badge on snoozed conversations.
- Contact search now matches emails partially instead of exact.
- Give outgoing message bubbles a secondary background.
2026-07-03 02:34:42 +05:30
Abhinav Raut 42a3b3a4b5 Merge pull request #391 from abhinavxd/roles-learn-more-link
add learn more link to roles admin page
2026-07-01 03:16:08 +05:30
Abhinav Raut 725acf6707 Merge pull request #392 from abhinavxd/dependabot/npm_and_yarn/frontend/vite-6.4.3
build(deps-dev): bump vite from 6.4.2 to 6.4.3 in /frontend
2026-06-30 16:51:26 +05:30
dependabot[bot] a7bcd5e748 build(deps-dev): bump vite from 6.4.2 to 6.4.3 in /frontend
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.4.2 to 6.4.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.4.3/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.4.3/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.4.3
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-30 10:06:35 +00:00
Abhinav Raut 4280a216eb Update roadmap with new item and formatting changes 2026-06-30 12:03:31 +05:30
Abhinav Raut 3052e2a7ae Update ROADMAP.md 2026-06-30 12:02:48 +05:30
Abhinav Raut 8720e37bbf add learn more link to roles admin page 2026-06-25 09:52:07 +05:30
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 76d00c899e make the contact name upsert actually run for existing contacts 2026-06-19 04:01:56 +05:30
josephsellers 406a2941a1 Scope delete-private-message to its conversation (fix IDOR)
Address CodeRabbit review: the query deleted by message uuid alone, so an agent
with access to one conversation could delete a private note from another by
pairing an accessible cuuid with a foreign message uuid. The delete is now
scoped via conversation_id = (SELECT id FROM conversations WHERE uuid = $2), and
DeletePrivateMessage / the handler pass the conversation uuid alongside the
message uuid.

[Used Claude Code 🤖]
2026-06-18 12:07:31 +01:00
josephsellers da20825e2b Add context menu to delete private notes in conversation view
Right-clicking a private note shows a "Delete note" option that calls the
DELETE endpoint and removes the note from the UI. The context menu trigger is
disabled for non-private messages (browser default menu shown instead).

[Used Claude Code 🤖]
2026-06-18 11:33:19 +01:00
josephsellers b699cacd30 Add API endpoint to delete private notes
Adds DELETE /api/v1/conversations/{cuuid}/messages/{uuid} for removing private
notes via the API. Uses a dedicated `delete-private-message` query/stmt
(separate from the generic `delete-message` used internally by continuity) so
only messages with private=true can be deleted — sent/incoming messages are
protected. Returns 404 if the message doesn't exist or isn't private.

Useful for API consumers that create private notes programmatically and need to
clean them up (e.g. replacing an outdated note before adding a new one).

[Used Claude Code 🤖]
2026-06-18 11:33:19 +01:00
josephsellers 000326bbde Fix: update contact names on upsert instead of discarding them
Re-derived for the v2.x contact model. insert-contact-with-external-id
already updates names on conflict; this adds the same to
insert-contact-without-external-id, preserving existing non-empty names
via COALESCE(NULLIF(EXCLUDED.first_name, ''), users.first_name).

Without this, names from the email worker and Gravity Forms never update
existing contacts.

[Used Claude Code 🤖]
2026-06-18 11:23:42 +01:00
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