Use 24-hour window instead of UTC date for today's changelog count
The server runs in UTC, so at night in US timezones toISOString() returns tomorrow's date and no commits match. Using a 24h rolling window instead.
Force-dynamic on changelog API routes to prevent stale date caching
Next.js was statically caching these GET route handlers at build time, freezing new Date() to the build date so today's changelog count never updated.
Use systemDocsOnly flag for System Docs tab, show all docs in Original Docs
Original Docs tab now shows all docs for this org/assocType without filtering by assocObjectId. System Docs tab sends systemDocsOnly: true to only get docs with...
Use esign_templates.current_design_version for hasDesignVersion, add systemDocsOnly filter
hasDesignVersion now checks if an esign template exists with current_design_version > 0, instead of using isSigTemplate which is true for all uploads through th...
Default assocObjectId to current member ID for proper doc tab filtering
When no oid URL param is provided, Original Docs and Modified Docs tabs now query by the current member's ID, while System Docs queries with blank assocObjectId...
Add @JsonIgnoreProperties to UploadTemplateRequest to prevent hash null on unknown fields
The frontend sends accessLevel, description, folderId, docTypeId in the metadata JSON. Jackson was failing to parse the entire metadata object when encountering...
Rewrite MultiFileUploader with queue-based upload and per-file settings
Separate data fetching for Original/Modified/System doc tabs
Add isConverted, hasDesignVersion, isHidden to DocumentMetadata response
The /api/docs/imaging/list endpoint now returns conversion status from ImgDat and design version status (isSigTemplate) so the frontend can enable/disable the E...
Restructure DocManager tabs, add Edit icon, embed editor and multi-file uploader
Create MultiFileUploader component with per-file conversion pipeline
Create DocumentEditor component for inline editing in DocManager
Remove /doc/sign/create and /doc/sign/edit routes
Editor is now embedded inline in the doc manager page.
Remove scope/assocType from SettingsSignersTab, rename to Doc Description, add Active Member signer
Remove background document conversion and thumbnail generation jobs
Raise annotation toolbar z-index to 1000 so it always renders above page elements
Fix watermark above-layer z-index, add page right-click menu, add page above/below, improve drag indicator
- ModifierLayer: 'above' pass now uses zIndex 20 so watermarks render on top of fields and annotations - PdfCanvas: right-click context menu with rotate, delete...
Place dropped field at ghost's exact visual position
Use active.rect.current.translated (the DragOverlay ghost's client rect) instead matches the translated rect, so the field now lands precisely where the user re...
Remap field signerUids when backend returns new signer UIDs after save
Drag-and-drop field placement, floating annotation toolbar, and PDF page spacing
- Replace click-to-place with @dnd-kit drag-and-drop for all signature, identity, and input field tools; drag ghost matches the exact visual appearance of the...
Preserve signer UID on save to keep field associations intact
Remove incorrectly added esig gateway route
Route all esig API calls directly to ESigService via K8s DNS
Use environment variables for Redis, datasource config
Route all esig API calls through forwardToApi() to fix save failures
All 10 esig route handlers were pointing to ESIG_SERVICE_URL which resolves to a non-existent kamowsesig-service proxy. Replace every handler with forwardToApi(...
Replace upsertSigners with full delete+insert to handle frontend temp UUIDs
The frontend assigns temporary crypto.randomUUID() values to newly-added signers before any backend call. The previous upsert-by-uid logic would throw 404 for t...
Add /api/esig/** gateway routing to ESigService
Route all /api/esig/** requests through the existing API gateway to the dedicated ESigService (kamowsesig-service) instead of the non-existent proxy target. Add...
Add layer position option to Watermark modifier (behind / above content)
- WatermarkModifier gains a 'layer' field: 'behind' | 'above' (defaults to 'behind') - ModifierLayer now takes a 'pass' prop ('below' | 'above'): - below pass...
Add Watermark modifier to esign toolbox
- WatermarkModifier type: logoType (full/simple), startPage, endPage, rotation (−180–180), size (10–90% of page width), opacity (2–60%), solidColor toggle, colo...
Only show page number format token hint when Custom is selected
Extend Label modifier to full 8-position grid with LM/RM rotation
- LabelModifier.position now uses ModifierPosition8 (same 8-position grid as Page Numbers) - LM (Middle Left): each line rendered as a vertical pill with writin...
Add Tools/Modifiers tabs to esign Toolbox with live canvas overlays
- Split Toolbox left sidebar into Tools and Modifiers tabs - Modifiers tab: split list + settings panel (Option B) - Page Numbers modifier: start/end page, 8-...
Switch preview-banner-text to inline flow so changelog link sits on the same line
Force changelog link inline so it flows with banner text
Correct rotated thumbnail positioning and restore rotation transform
Two bugs in ThumbnailCanvas: 1. Replaced `height: \`${displayAspect * 100}%\`` (percentage height on abs- positioned element — unreliable when containing bl...
Show today's changelog count in preview banner with link to /changelog
Fix floating zoom control visibility and polish thumbnail placeholders
- Move floating zoom controls outside the scroll container and use position:absolute so they remain visible at all times regardless of scroll position; offs...
Page selection with animated glow border synced between canvas and thumbnail sidebar
- DesignTab holds selectedPageIndex as the single source of truth - Clicking any page in the main canvas selects it (onPageSelect) - Clicking a thumbnail select...
Move scroll ownership from PdfCanvas to canvasContainerRef
PdfCanvas root Box previously had overflow-auto + h-full, making it its own scroll container. This meant: - scrollbarGutter: stable on canvasContainerRef had no...
Fit to Width calculates actual container width instead of resetting to zoom 1
Reads canvasContainerRef.current.clientWidth (which accounts for the stable scrollbar gutter) and the page's natural width via pdfCanvasRef.getPageDimension(0),...
Replace all hardcoded purple with var(--color-primary) on Settings & Signers page
Signers icon, icon background, count badge, Add Signer buttons, Add First Signer button, empty-state illustration tint, add-another hover, and the ALL_OF_TYPE s...
Auto-select first signer, fix zoom control scrollbar gap, animate properties panel
- Toolbox auto-selects the first signer's UID when signers go from 0→1 - Canvas container uses scrollbar-gutter: stable so the sticky zoom/undo control mainta...
Reorder tabs, gate field tools by signer, redesign Settings & Signers tab
- Design is now the first tab; Settings & Signers is second - Toolbox shows "Add Signer" CTA (navigates to Settings) when no signers exist - Signature Tools, Id...
Render field controls as actual-looking form elements with signer color tinting
Each field type now renders a visual representation of the real control (text input, checkbox, toggle, dropdown, radio group, date picker, etc.) tinted with the...
Remove fixed height and scroll bars from field properties panel
The panel had two vertical scrollbars: 1. DesignTab wrapper had height: 200 + overflowY: auto 2. FieldPropertiesPanel root had height: 200 + overflow: hidden, ...
Defer setTotalPages until after PDF dim loop to prevent PDF.js worker saturation
On a 50-page PDF, calling setTotalPages before the getPage() dimension loop mounts all 50 ThumbnailCanvas components immediately. Each falls back to PDF.js (ser...
Expand component scan and add full datasource/JPA/Redis/MinIO config
ConversionServiceApplication was only scanning com.kamo.ConversionService, missing all shared library beans (ImageService, MinIOStorageService, MemberRepository...
Add kamo-shared-library build stage to resolve missing dependency
The Dockerfile was trying to fetch kamo-shared-library from Maven Central, which doesn't exist there. Mirror the SecurityService pattern: clone the shared libra...
Migrate all imaging API routes from SecurityService to ConversionService/DocsService
Upload routes now call ConversionService directly via CONVERSION_SERVICE_URL: - POST /api/imaging/upload → /api/conversion/imaging/upload - POST /api/imaging/te...
Remove ImagingController and beans/imaging — moved to ConversionService and DocsService
Upload endpoints now live in ConversionService at /api/conversion/imaging/*. All management and download endpoints now live in DocsService at /api/docs/imaging/...