Compliance wizard from security model policies
- Branch types API maps alcohol/tobacco/firearms policies into wizard state - Dynamic Compliance step: omit from nav when model fixes all ATF and ages - Age and...
Ensure JSON Content-Type when proxying to SecurityService
Organization creation returned 415 Unsupported Media Type because upstream Spring expects application/json for @RequestBody. Node fetch could omit or default Co...
Compare member IDs as strings for self-check and redirect
User-info API returns memberID as string to preserve int64 precision. isSelf used Number() and strict equality with mixed types, so viewing your own /settings/m...
Repair TicketChat real-time updates after load race
Defer STOMP subscription until initial message fetch finishes so setMessages from the API cannot wipe messages delivered during load. Clear messages when sessio...
Hide deprecated play (and app/media) with case-insensitive matching
- Lowercase statusMap keys and lookups so verification aligns with API casing - Treat hidden infra labels case-insensitively - Strip deprecated labels from effe...
Security role save for locked roles and clearer API errors
- When isAllowEditSecurity is false, omit rights and securityModelIds from the PUT body so SecurityService accepts metadata-only updates (session timeout, d...
Proxy PATCH membership-type to SecurityService
The member profile UI called **************** but no App Router handler existed, so Next returned HTML 404 and the client showed Unknown error after failed JSON...
Add Platform Administration settings — org plan grants, events, plan catalog
- New pages under /settings/platform (guarded by hasPlatformAdminAccess): - /organizations — list every org, grant/modify/revoke COMP plans with reasons - /...
Stop overwriting member avatar with logged-in user's avatar on profile view
fetchAvatars fetched /api/security/avatars (no memberID scope — always returns the logged-in user's avatars) and called setActiveAvatar, clobbering the correct ...
Add missing sync-rights proxy route
POST /api/security/roles/sync-rights was missing a Next.js proxy handler, causing the Sync Rights button in Security Roles settings to always fail.
Member-requestor support rights gating and dual-mode ticket view
- NavTop: show SupportButton for any support right (agent or member) - SupportButton: gate each dropdown item by right — Create/View Tickets, Request Webinar,...
Add Sync Rights button to SecurityRoleManager for top-level orgs
Button is only visible when organization.hasParent is false. Calls POST /api/security/roles/sync-rights then reloads the roles table.
Gate Support/Settings by rights, fix Network copy, loading on tab switch, nav divider
- Network card: updated description to use dynamic branch title label - Support card: fixed 404 by changing href /help → /support; gated by isSupport + VIEW_SUP...
Add membership type chip and promote/demote to Membership Status card, remove session timeout field
Support chat UX — name updates, titles, notification count, datagrid
- TicketChat fires onVisitorNameChanged when NAME_CHANGED WS event arrives - SupportTicketWindow dispatches tool:title with requestorName on load and on name ...
Show AG Grid loading overlay instead of empty state on leads page
Initialize loading state to true so the grid shows "Loading leads..." until the first fetch completes, preventing a flash of "No leads found".
Show city and subdivision in ticket visitor geo row
Display as "City, Region, Country (IP)" — nulls are filtered so it degrades gracefully when only country data is available
Add tab URL params to /account page for deep linking and refresh persistence
Tab state is now synced to **************** so links to specific tabs work and the correct tab stays selected on page refresh.
Correct message sides in history and handle visitor name change events
- Use messageType=VISITOR_MESSAGE from API to determine left/right in history load - Add NAME_CHANGED system event rendering in SystemMessage and TicketChat
Show visitor flag, country, and IP in ticket header
- Add visitorIpAddress, visitorCountryCode, visitorCountryName to SupportTicketDTO type - Render flag emoji + country name + IP address row in TicketHeader for ...
Treat VISITOR_MESSAGE type as always-from-them in TicketChat
Visitor messages published via PublicChatService carry messageType=VISITOR_MESSAGE. Explicitly mark these as author='them' regardless of memberId so they always...
Auto-open support ticket popup on NEW_TICKET NATS notification
When a new support ticket arrives, the backend now sends a NEW_TICKET STOMP message in addition to PENDING_COUNT. The SupportCountContext handles it by dispatch...
Always trigger provision-theme on branding save; let backend resolve domain server-side
Separate ticket number/badges row from title in TicketHeader
Title was sharing a nowrap flex row with the ticket number and two badges, causing it to be cut off. Now ticket number and badges occupy their own compact row, ...
Handle tickets key in support ticket list response
MediaService returns { tickets: [...], totalElements } but the frontend only checked for data.content, causing the list to always render empty.
Use PATCH /org/{id}/colors for branding save to avoid nullable boolean constraint failure
Add org settings section (timezone, age req, content flags, description, alias); remove Preview/AddDomain buttons
Redesign LabelManager — inline section editing, fix broken save, read-only default
Rewrites LabelManager.tsx with per-section read/edit pattern. Fixes the broken save button (validateForm blocked saves because contact/company fields were never...
Enforce KamoMail domain restriction on mailbox, alias, and shared mailbox creation
When KamoMail is the email provider, members can only create mailboxes, aliases, and shared mailboxes using the org's verified default domain. Enforcement at th...
Org theme provisioning — WebSocket hook, provision panel, LabelManager wiring, DNS trigger, bg resize, ThemeConfig context
Hide security model sentence for Members, fix badge overlap on branch type cards
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.