| 11-agent-saved-signature-and-signing-workflow |
01 |
ui, api, database |
| signature_pad |
| drizzle |
| postgres |
| nextjs |
| react |
| canvas |
|
| phase |
provides |
| 08-type-discriminant-and-signing-boundary |
agent-signature SignatureFieldType already in schema; isClientVisibleField() filter |
|
| phase |
provides |
| 10-expanded-field-types-end-to-end |
FieldPlacer PALETTE_TOKENS pattern; SignatureFieldType validTypes set |
|
|
| agentSignatureData TEXT column on users table (migration 0008_windy_cloak.sql) |
| GET/PUT /api/agent/signature endpoints — read/write agent signature dataURL |
| AgentSignaturePanel component — draw/save/update canvas flow with thumbnail |
| /portal/profile page — server component rendering AgentSignaturePanel |
| PortalNav Profile link — /portal/profile nav entry |
| FieldPlacer agent-signature palette token — red draggable 'Agent Signature' token |
|
| 11-02-agent-signing-workflow |
| 12-document-preview |
|
| added |
patterns |
|
|
| Server component fetches agentSignatureData from DB, passes as initialData prop to client component |
| AgentSignaturePanel: isDrawing state gates canvas mount; savedData state shows thumbnail |
| signature_pad DPR initialization pattern from SignatureModal.tsx reused for canvas setup |
| PUT /api/agent/signature validates data:image/png;base64, prefix and 50KB size limit |
|
|
| created |
modified |
| teressa-copeland-homes/src/lib/db/schema.ts (agentSignatureData column added) |
| teressa-copeland-homes/drizzle/0008_windy_cloak.sql |
| teressa-copeland-homes/src/app/api/agent/signature/route.ts |
| teressa-copeland-homes/src/app/portal/_components/AgentSignaturePanel.tsx |
| teressa-copeland-homes/src/app/portal/(protected)/profile/page.tsx |
|
| teressa-copeland-homes/src/app/portal/_components/PortalNav.tsx |
| teressa-copeland-homes/src/app/portal/(protected)/documents/[docId]/_components/FieldPlacer.tsx |
|
|
| Migration file generated as 0008_windy_cloak.sql (drizzle auto-names files) — content is correct: ALTER TABLE users ADD COLUMN agent_signature_data text |
| AgentSignaturePanel is fully self-contained — no external state management; fetch/save within component |
| Profile page uses redirect('/agent/login') (consistent with portal auth pattern) if session missing |
| Agent Signature palette token is red #dc2626 to distinguish from client-facing field types |
|
| Profile page pattern: server fetch agentSignatureData, pass to client panel as initialData prop |
| Canvas signature panel: useEffect gates on isDrawing, cleans up SignaturePad on unmount/toggle |
|
| AGENT-01 |
| AGENT-02 |
| AGENT-03 |
|
8min |
2026-03-21 |