Save copy to Sent folder after sending email
Transport.send() only sends via SMTP without saving to IMAP. Added saveToSent() to append the message to the Sent folder with the SEEN flag set. Applies to send...
Integrate New Message composer into tool window system
Replace the standalone fullscreen/mini composer windowing with the shared tool window infrastructure (minimize, maximize, hexheads). MessageSystem.openNewMessag...
Disable STARTTLS and auth for port 25 internal SMTP
Port 25 on internal Postfix doesn't support STARTTLS and allows relay from cluster IPs via mynetworks. Only enable auth and STARTTLS when using port 587 (submis...
Move useState hook before early returns to fix React error #300
useState(syncing) was declared after conditional early returns, violating React's rules of hooks.
Use SMTP port 25 instead of 587 for internal Postfix
Postfix only listens on port 25 inside the cluster. Port 587 (submission) is not enabled in the container.
Quick reply send button - remove client OTK, add credentials and feedback
The quick reply was sending a client-generated OTK header that the proxy doesn't use (proxy generates its own). Removed the unnecessary OTK call, added credenti...
LabelPicker now fetches and displays current message labels
- Added getMessageLabels API call to emailApi - LabelPicker fetches applied labels on mount via GET endpoint - Toggle updates local state immediately for respon...
Add GET endpoint for message labels
GET **************** returns label IDs applied to a specific message.
Wire up remaining unwired UI elements in messages page
- FolderSidebar: folder options button now opens rename/delete menu - FolderSidebar: Folder Settings button renamed to Manage Folders, toggles create folder - F...
Remove theme query param — Docs derives it from WOPISrc
Docs now has its own getThemePath() logic ported from kamo-internal's Theme.tsx, so DocsService no longer needs to pass the theme URL.
Pass org theme URL to Docs for per-org logo and favicon
Construct theme path from X-Forwarded-Host (e.g., internal.kamocrm.com -> **************** and append as &theme= query param in the Docs URL. Docs reads this to...
Wire up quick reply Send Reply and Cancel buttons
The quick reply textarea and buttons were static with no state or onClick handlers. Now properly sends replies via the email API and clears the textarea on canc...
Add sync conversations button for backfilling from IMAP
Shows a "Sync Conversations" button when no conversations are found, triggering bulk indexing of existing IMAP messages into conversation view.
Add bulk index endpoint to backfill conversations from IMAP
POST **************** indexes existing IMAP messages into conversations and search index tables.
Add /wopi/** route forwarding to DocsService
Docs needs to reach WOPI endpoints via api.kamocrm.com.
Use docs-api.* for WOPISrc URL instead of api.*
The WOPI endpoints (/wopi/files/**) live on DocsService, which is exposed at docs-api.kamocrm.com — not api.kamocrm.com (APIService). Docs makes server-side WOP...
Set aliasgroup to api.kamocrm.com and force https WOPISrc
- Docs aliasgroup1 must match the WOPI host (api.kamocrm.com) - WOPISrc URL defaulted to http:// inside K8s; force https and construct api.* hostname from for...
Fix kubectl not found in pod, add docs alias, proactive SUBDOMAINS
- Mount /usr/local/bin/kubectl from host via hostPath instead of failing apt-get install (kubectl not in default Debian repos) - Add "docs" to SUBDOMAINS list...
Set MinIO bucket to 'internal' and upload blank templates
The default bucket placeholder was never configured. Use 'internal' bucket which has the blank document templates uploaded.
Open doc editor tab synchronously to avoid popup blocker
window.open() after an async fetch is blocked by browsers because it's no longer in the user-gesture context. Open a blank tab immediately on click, then naviga...
Add DOCS_EDITOR to fallback org features in layout and API route
The layout's server-side org fetch often uses the fallback org (no auth context during SSR), which was missing DOCS_EDITOR. This prevented the New Document butt...
Remove COPY .mvn/ from Dockerfile to fix CI build
The .mvn directory was empty and untracked, causing builds to fail. Maven is already provided by the base image.
Enable Hibernate schema auto-creation for email_metadata
Add **************** property so Hibernate creates missing PostgreSQL schemas before creating tables.
Add OTK auth, org-branded WOPI, cached MinIO client
- WopiController: look up org title from JWT orgId claim for dynamic BrandName ("{orgTitle} Docs") in CheckFileInfo response - DocumentController: require OTK...
Change ddl-auto from none to update for auto schema management
Hibernate was not creating the email_metadata schema and conversations table because ddl-auto was set to none in the k8s configmap.
Add New Document button to NavTop with DocsService integration
Adds DOCS_EDITOR app type (ID 16), NewDocumentButton component with document type picker popover, API proxy route for DocsService, and NavTop integration gated ...
Review fixes - dialect, error handling, CI/CD manifests
- Fix Hibernate dialect to CockroachDialect (matching K8s configmap) - Separate token validation from business logic in checkFileInfo - Add Docs and ingress man...
Add wopi-*** for DocsService
Adds WOPI JWT signing secret used by DocsService for Docs access tokens. Deployed to both K1M1 and K2M1 clusters.