fix(19): revise plan 02 — remove client-text contradiction in handlePersist

This commit is contained in:
Chandler Copeland
2026-04-06 12:52:01 -06:00
parent c03bff8736
commit 8bc3b2dfbe

View File

@@ -336,11 +336,11 @@ const [name, setName] = useState(templateName);
Callbacks: Callbacks:
`handlePersist` — the `onPersist` callback passed to PdfViewerWrapper (per D-01). Before saving, merge `textFillData` values into `field.hint` for client-text fields (per Research Pitfall 6): `handlePersist` — the `onPersist` callback passed to PdfViewerWrapper (per D-01). Before saving, merge `textFillData` values into `field.hint` for text fields (per Research Pitfall 6). IMPORTANT: The schema type value is `'text'` (from `SignatureFieldType`), NOT `'client-text'`. Use `f.type === 'text'` exactly:
```typescript ```typescript
const handlePersist = useCallback(async (rawFields: SignatureFieldData[]) => { const handlePersist = useCallback(async (rawFields: SignatureFieldData[]) => {
const fieldsWithHints = rawFields.map(f => const fieldsWithHints = rawFields.map(f =>
f.type === 'client-text' && textFillData[f.id] f.type === 'text' && textFillData[f.id]
? { ...f, hint: textFillData[f.id] } ? { ...f, hint: textFillData[f.id] }
: f : f
); );
@@ -352,11 +352,6 @@ const handlePersist = useCallback(async (rawFields: SignatureFieldData[]) => {
}, [templateId, textFillData]); }, [templateId, textFillData]);
``` ```
Note: the `type` check uses `'client-text'` — however the actual schema type value for text fields is just `'text'`. Read the FieldPlacer palette token IDs to confirm the exact string. The existing codebase uses `type: 'text'` in SignatureFieldType. So the check should be:
```typescript
f.type === 'text' && textFillData[f.id]
```
`handleFieldValueChange`: `handleFieldValueChange`:
```typescript ```typescript
const handleFieldValueChange = useCallback((fieldId: string, value: string) => { const handleFieldValueChange = useCallback((fieldId: string, value: string) => {
@@ -576,12 +571,13 @@ Import `ConfirmDialog` from `@/app/portal/_components/ConfirmDialog` for role re
- TemplatePageClient.tsx contains `fieldsUrl={\`/api/templates/${templateId}/fields\`}` - TemplatePageClient.tsx contains `fieldsUrl={\`/api/templates/${templateId}/fields\`}`
- TemplatePageClient.tsx contains `fileUrl={\`/api/templates/${templateId}/file\`}` - TemplatePageClient.tsx contains `fileUrl={\`/api/templates/${templateId}/file\`}`
- TemplatePageClient.tsx contains `deriveRolesFromFields` function - TemplatePageClient.tsx contains `deriveRolesFromFields` function
- TemplatePageClient.tsx contains `f.type === 'text'` (NOT `'client-text'`) in the hint-merge branch of handlePersist
- TemplatePageClient.tsx contains `f.hint` or `hint:` for the hint merge in handlePersist - TemplatePageClient.tsx contains `f.hint` or `hint:` for the hint merge in handlePersist
- TemplatePanel.tsx contains `"Signers / Roles"` section heading - TemplatePanel.tsx contains `"Signers / Roles"` section heading
- TemplatePanel.tsx contains `"AI Auto-place Fields"` button text - TemplatePanel.tsx contains `"AI Auto-place Fields"` button text
- TemplatePanel.tsx contains `"Save Template"` button text - TemplatePanel.tsx contains `"Save Template"` button text
- TemplatePanel.tsx contains `#C9A84C` (gold) and `#1B2B4B` (navy) colors - TemplatePanel.tsx contains `#C9A84C` (gold) and `#1B2B4B` (navy) colors
- TemplatePanel.tsx contains `"Placing..."` or `"Placing"` loading text - TemplatePanel.tsx contains `"Placing..."` or `"Placing..."` loading text
- TemplatePanel.tsx contains `"Saved"` success text - TemplatePanel.tsx contains `"Saved"` success text
- TemplatePanel.tsx contains `ConfirmDialog` import for role removal - TemplatePanel.tsx contains `ConfirmDialog` import for role removal
- `npx tsc --noEmit` exits 0 - `npx tsc --noEmit` exits 0
@@ -610,7 +606,7 @@ Import `ConfirmDialog` from `@/app/portal/_components/ConfirmDialog` for role re
- Template editor is accessible at /portal/templates/[id] - Template editor is accessible at /portal/templates/[id]
- FieldPlacer operates in template mode (onPersist saves to /api/templates/[id], fields load from /api/templates/[id]/fields, PDF loads from /api/templates/[id]/file) - FieldPlacer operates in template mode (onPersist saves to /api/templates/[id], fields load from /api/templates/[id]/fields, PDF loads from /api/templates/[id]/file)
- Role labels (not emails) are used in the template editor - Role labels (not emails) are used in the template editor
- Text hints on client-text fields are merged into field.hint before persisting - Text hints on text fields (f.type === 'text') are merged into field.hint before persisting
- AI Auto-place triggers POST /api/templates/[id]/ai-prepare - AI Auto-place triggers POST /api/templates/[id]/ai-prepare
- Save persists via PATCH /api/templates/[id] - Save persists via PATCH /api/templates/[id]
</success_criteria> </success_criteria>