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.
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.
- 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
- 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
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>
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
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.
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.
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.
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.