Replace editor/preview toggle with inline template editor
New TemplateInlineEditor component renders the full template (header, backgrounds, margins, signature) with a borderless Quill editor embedded in the body area....
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 ...
Add "No Template" option to template scope dropdown
Adds a "No Template" option at the top of the template dropdown list. When selected, skips the backend fetch and renders plain email body without any header, si...
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...
Always render template preview even without saved backend template
When no template is saved in the backend (404), fall back to DEFAULT_CONFIG instead of showing plain unformatted content. The preview now always renders with at...
Re-render templates client-side with real data in email preview
The preview was showing placeholder text ({{member.firstName}} etc.) because it used the pre-rendered placeholder HTML from the backend. Now the MessageTool: -...
Add template scope dropdown and preview tab to tool window email composer
Add to the MessageTool (tool window email composer, not the standalone MessageComposer): - Template scope dropdown in the subject row: Individual (default), D...
Add template scope selector and preview tab to email composer
- Add template scope dropdown (Organization / Department / Individual User) to the toolbar row, defaulting to Individual User - Fetch the saved template from ...
Add rspamd config to K8s ConfigMap and set ddl-auto to none
The rspamd.base-url property was missing from the production ConfigMap, causing CrashLoopBackOff on deploy. Also corrects dev ddl-auto to none.
Wire signature templates to backend for persistent save/load
- Add backendAdapter.ts with bidirectional mapping between frontend SignatureConfig and backend flat entity format - Generate pre-rendered HTML with placehold...
Add email signature template CRUD endpoints
REST controller at /api/email/signature-templates with: - GET /{scope} — retrieve template by org+scope - PUT /{scope} — create or update template (upsert) - DE...
添加电子邮件签名模板实体和寄存器
用于持续电子邮件头/签名/页脚模板的 JPA 实体 每个组织范围的配置。 存储所有设计设置, 模板选择、图像来源和法律页脚配置为 已正常列。 还包括非正态化的 HTML 列 (标题、签名、法律、脚印、完整包装) 占位符像 QQ 成员. firstName , QQ Organization.name 等. 用于快速电子...
Derive signature content from backend, add social links management
- Remove manual Personal Information, Company Information, and Social Links sections from the signature Content tab — data is now pulled automatically from ...
Add website and social links to member profile GET/PUT endpoints
GET /api/security/members/{id} now returns website and socialLinks fields. PUT /api/security/members/{id} accepts website (string) and socialLinks (map of platf...
向本组织和成员添加网站和社会链接字段
添加可嵌入字段的 EmbSocialLinks 为 LinkedIn, Twitter, Facebook, Instagram, YouTube, TikTok, 和 GitHub URLs. 互联网档案馆的存檔,存档日期2013-12-21. 向两个组织添加网站(VARCHAR 500)和嵌入式社会链接 和具有列...
Simplify source selector, add dirty tracking and unsaved changes dialog
- Remove department/user sub-type selectors — templates are org-level for the organization, all departments, and all users - Remove the avatar icon to the lef...
Move Live Preview label into email header bar, remove Copy HTML button
Live Preview title and icon now sit right-aligned inside the To/Subject header bar. Removed the Copy HTML button and all clipboard logic.
Move source selector into builder header, 2-col templates, wider preview
- Move Source dropdown from top card into the builder panel header bar (matching the Live Preview title position) - Remove Undo and Reset buttons entirely - C...
Add near/far background colors, margin/padding sliders, center email option
Design tab additions: - Near Background color (content area background, default white) - Far Background color (outer email area background, default white) - Mar...
Add image scale sliders, signature image type, and footer alignment
- Add three image source selectors: Header Image, Signature Image, Footer Image (each with None / Member Avatar / Logo Simple / Logo Full options) - Add scale...
Replace photo upload with Header/Footer image source selectors
Replace the drag-and-drop photo upload with two dropdown selectors: - Header Image: None | Member Avatar | Logo Simple | Logo Full - Footer Image: same options ...
Add Header tab with 29 header templates and rename UI labels
- Add "Header" tab with 29 email header templates (banner, accent, branded, decorative categories) plus "No Header" option - Rename "Template" tab to "Signatu...
Prevent live preview panel from overflowing right edge
Change builder and preview panels from fixed flex-basis (55%/45%) to shrinkable flex so the gap between them is properly accounted for.
Add 21 additional email signature templates
Add elegant-border, two-column-grid, banner-top, gradient-accent, card-style, left-aligned-clean, right-photo, centered-minimal, executive, creative-blocks, tec...
Use richTextExtension.configure() instead of RichTextExtension class
RichTextExtension class is not exported from the published @lexkit/editor package. Use the exported richTextExtension instance with .configure().
Remove duplicate ContentEditable — use RichTextExtension's plugin
The richTextExtension already renders its own ContentEditable via RichTextPlugin. Having a second manual ContentEditable created two editable areas. Remove the ...
Rebuild email signature manager with template-based visual builder
Replace the basic Quill rich text editor with a structured, form-driven signature builder featuring 8 professional templates, design customization controls (col...
修改 KB 编辑器和文章页面布局
固定编辑器组件 : - 在弹性列容器中包装,使工具栏保持固定和内容 区域滚动独立 - 使用位置:在内容包装器上的占位位置 正确而不创建空格 - 使用平面“ span” 来代替 MUI 框来避免 提出问题 - 删除已固定的 minH8: 400px, 取而代之使用 200px 最小值 修复新/编辑文章页 : - 使用填...
Add unpublish and delete buttons to KB article view
Add Unpublish button (visible on PUBLISHED articles) that reverts to DRAFT and removes from AI chat. Add Delete button with confirmation dialog. Add proxy route...
Handle unpublished events by removing vectors from Qdrant
When an article is unpublished, delete its vectors from Qdrant so the AI chat no longer references it.
Add unpublish endpoint for KB articles
Add POST /articles/{guid}/unpublish that sets status back to DRAFT and publishes a kb.article.unpublished NATS event so RAGService can remove the article from t...
Add search request/response logging to RagSearchController
Log orgId, query, result count, and full stack traces on error to diagnose 500 responses seen from AIService.
Add response body and request logging to RagClient for debugging
Log the RAG search request URL, orgId, query, and response body on error to diagnose 500 responses from RAGService.
Enable auto-truncate on embedding model to prevent 413 errors
Add --auto-truncate flag so inputs exceeding the 256 token limit are silently truncated instead of rejected with a validation error.
Reduce chunk size to fit all-MiniLM-L6-v2 token limit (256 max)
Chunk target was 2000 chars (~512 tokens) but the embedding model only accepts 256 tokens, causing 413 validation errors. Reduce to 800 chars (~200 tokens) with...
Load embedding model from local hostPath to prevent HuggingFace download failures
The embedding-model pod was in CrashLoopBackOff because it couldn't download the model from HuggingFace on startup (network/DNS issue). Mount the model from a h...
Use integer match filter for Qdrant searches instead of matchKeyword
The orgId and articleId payload fields are stored as integers via value(Long), but search and delete filters used matchKeyword() which only matches string/keywo...
Index KB articles for RAG on creation, not just when published
Previously the RAG pipeline only indexed PUBLISHED articles, requiring the full review/approval cycle before the AI chat could reference them. Now indexes all a...
Update reviews page to match enriched backend response fields
Use uid as key, articleGuid for navigation, articleTitle for display, and dateSubmitted for date. Matches the new backend response format that includes article ...
