docs(16-02): complete PreparePanel signer list plan
This commit is contained in:
55
.planning/phases/16-multi-signer-ui/16-02-SUMMARY.md
Normal file
55
.planning/phases/16-multi-signer-ui/16-02-SUMMARY.md
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
phase: 16-multi-signer-ui
|
||||
plan: "02"
|
||||
subsystem: ui
|
||||
tags: [react, typescript, preparepanel, signer-list, send-block-validation]
|
||||
|
||||
# Dependency graph
|
||||
requires:
|
||||
- phase: 16-multi-signer-ui
|
||||
plan: "01"
|
||||
provides: signers prop, onSignersChange, onUnassignedFieldIdsChange threaded from DocumentPageClient
|
||||
provides:
|
||||
- SIGNER_COLORS palette constant ['#6366f1', '#f43f5e', '#10b981', '#f59e0b']
|
||||
- Signer list UI in PreparePanel (email input + "Add Signer" button + colored dot rows + aria-labeled × remove)
|
||||
- handleAddSigner / handleRemoveSigner with duplicate/format validation
|
||||
- Send-block validation: fetch fields → check no-signers guard → check unassigned isClientVisibleField fields
|
||||
- Inline error messages: "Add at least one signer..." and "{N} field(s) need a signer assigned..."
|
||||
- signers persisted to documents.signers via prepare POST body
|
||||
|
||||
affects: [16-04-dashboard-badge]
|
||||
|
||||
---
|
||||
|
||||
# Phase 16 Plan 02: PreparePanel Signer List UI Summary
|
||||
|
||||
## What Was Built
|
||||
|
||||
Modified `PreparePanel.tsx` (+104 lines) and `prepare/route.ts` (+5 lines):
|
||||
|
||||
**PreparePanel.tsx:**
|
||||
- `SIGNER_COLORS = ['#6366f1', '#f43f5e', '#10b981', '#f59e0b']` — auto-assigned by index
|
||||
- Props destructured: `signers`, `onSignersChange`, `onUnassignedFieldIdsChange`
|
||||
- `handleAddSigner` — validates email format + duplicate, assigns next color from palette, calls `onSignersChange`
|
||||
- `handleRemoveSigner` — filters signer from list, clears `unassignedFieldIds`
|
||||
- Signer list UI section (Draft-only, inserted above Prepare and Send):
|
||||
- Email `<input>` + "Add Signer" `<button>` (height 32px)
|
||||
- Per-signer row: 8×8px colored dot (`w-2 h-2 rounded-full`) + email text + `×` remove button with `aria-label="Remove signer {email}"` (32×32px touch target)
|
||||
- Empty state: "No signers added yet."
|
||||
- Duplicate email warning: "That email is already in the signer list."
|
||||
- `handlePrepare` extended: fetches current fields via `/api/documents/{id}/fields`, checks unassigned `isClientVisibleField` fields, sets `unassignedFieldIds` and shows inline error if found
|
||||
- `signers` included in prepare POST body so `documents.signers` is persisted before send route reads it
|
||||
|
||||
**prepare/route.ts:**
|
||||
- Body type extended with `signers?: DocumentSigner[]`
|
||||
- DB update spreads `{ signers: body.signers }` when provided
|
||||
|
||||
# Tech tracking
|
||||
tech-stack:
|
||||
added: []
|
||||
removed: []
|
||||
changed: []
|
||||
|
||||
# Metrics
|
||||
duration: 4min
|
||||
commit: 1c8551c
|
||||
Reference in New Issue
Block a user