Show actionable error when SIP credentials fail (missing VoipCalling permission)
Handle RC webhook validation token; make body optional for verification requests
Only show connection error after failed registration attempt; use overlay to avoid layout shift
Explicitly stringify Long IDs in SmsController responses
**************** Long-as-string approach was not taking effect. Directly call .toString() on all Long IDs in the controller flat-map responses to guarantee no J...
Use string conversationId throughout SMS tool to handle 64-bit IDs
Backend now serializes Long as string; update all conversationId types from number to string to match. Also enable send button when an attachment is present wit...
Serialize Long IDs as strings to prevent JS precision loss
CockroachDB unique_rowid() generates 64-bit integers larger than Number.MAX_SAFE_INTEGER (2^53-1). JS JSON.parse silently rounds them, causing conversation ID m...
Remove duplicate Back button from RingCentralConfig
Parent PhoneProviderSetup already renders an IconButton with ArrowLeft in the config view header, making the Back button inside RingCentralConfig a duplicate.
Return flat map from send endpoint to prevent LazyInitializationException
VoipMessage.conversation is FetchType.LAZY; after @Transactional commits, Jackson serializing the entity would throw LazyInitializationException causing a 500, ...
Fall back to org mainPhoneNumber when member has no VOIP config
Members without an individual MemberVoipConfig (or no fromPhoneNumber set) now use the org's mainPhoneNumber from VoipProviderConfig as the outbound number, ins...
Remove getJwtKey() from WebhookController after OAuth migration
Signature validation used jwtKey as HMAC secret which no longer exists on VoipProviderConfig. Skip validation for now consistent with ****************
Use plain img tags for local SVG provider logos
next/image does not reliably serve local SVGs without unoptimized flag. Plain img tags load /public assets directly with no issues.
Use correct session key casing for orgID and memberID
KSessionService stores keys as orgID and memberID (capital D). Both controllers were calling .get("orgId") and .get("memberId") which always returns null, causi...
Always show softphone and SMS buttons in NavTop
Removed isVoip gate so the buttons are always visible regardless of feature flag state.
Use feature type name as key before numeric id in org feature preprocessing
Java returns features with `type: "VOIP"` and a numeric `id`. The preprocessing chain had `obj.id` before `obj.type`, causing all features to get numeric string...
将voip. > 添加到 NATS 流主题中, 并在 VoipStompRelay 控制器中处理非法状态例外
NATS 流只覆盖了聊天. > 因此订阅了voip. " 丢弃 非法状态例外([SUB-90007]) 没有匹配的流). 已添加发音。 " 将两个学科都包括在内,并扩大 抓取块以包含非法状态排除,防止启动失败 如果该流没有可用.
Add security-service.*** to K8s ConfigMap
KamoJwtService requires this property for Bearer token validation in DavAuthFilter, but the K8s ConfigMap overrides application.yml and was missing it — causing...
Show Phone System(s) settings unconditionally so orgs can configure VOIP before enabling it
- Remove isVoip gate from phone section on /settings page — Provider Setup card has no condition so it always appears; Agents and Dial Plans still gated by isVo...
Guard against non-array API responses in useContacts hook
setBooks, fetchContacts, and searchContacts now safely handle error objects and Spring paginated wrappers instead of crashing with 'e.map is not a function'.
Inject helpTips into SettingsView help panel override in PhoneProviderSetup
Use outer SettingsView help panel on email provider config page
Push provider-specific help to HelpTipsOverrideContext so the config view uses the same Help & Tips panel layout as the list view, instead of rendering its own ...
Rename email nav sub-item from General to Provider Setup
Uses namespaced key Email - Provider Setup to avoid collision with the existing AI Provider Setup route entry.
Remove duplicate JPA repo scan — use parent package only
com.kamo.z.shared.email covers metadata.repos, scanning both caused BeanDefinitionOverrideException on messageLabelRepository.
Reorder source dropdown, default to user, use team member label
- Default scope changed from "company" to "user" - Dropdown order reversed: Team Members first, Department, then org - "Individual User" renamed to the parent o...
Remove placeholder text from preview, allow sending without subject
- Empty email body in preview no longer shows "Start typing your email..." - Subject is no longer required to send — Send button is enabled with just a recipi...
模板降下填充所剩宽度, 其他控件右对齐
模板源下放现在有弹性:1来填充所剩全部 空间。 编辑/预览切换、附加按钮、草稿并发送按钮 以弹性缩写 : 0 对齐 .
Wrap email body in template HTML when sending
The send handler was sending raw editor content without the template. Now wraps the body in the full template layout (far bg, margin, near bg, padding, header, ...
Remove horizontal scrollbar and extend preview to full height
- Use padding on the outer far-bg div instead of margin on the inner near-bg div to prevent width:100% + margin overflow - Set overflowX:hidden on the preview...
Repopulate member/org data when switching source scope
The sync ref was set once and never reset, so switching scope left the new scope's config with empty content fields (empty names, email, company, etc.) causing ...
Move template dropdown, preview toggle, and attach to footer row
Move template scope dropdown, Editor/Preview toggle, and attachment button from the subject row to the bottom footer bar, aligned left. Draft and Send buttons s...
Fetch member/org data directly instead of through hooks
Removed useUserInfo, useSignatureData, and useImageResolver hooks which each had independent async fetch cycles causing race conditions where memberId/orgId wer...
Use example data in email preview when member/org data not loaded
The preview was rendering empty signatures because member/org data from useSignatureData returns empty strings while loading (or when memberId/orgId are 0). Now...