This commit is contained in:
2026-07-16 09:53:14 +07:00
parent 0fc112a2e8
commit 29cec708a3
1236 changed files with 212848 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
# Training Type Review
## Root Cause
- The form uses TanStack Form, not React Hook Form.
- `trainingType` in create mode was initialized as `undefined`.
- The field-level blur validator had already been improved, but the submit-level Zod schema still used `z.enum(...)`.
- When submit validation ran with an unset value, Zod could still produce a raw type error path like `expected string, received undefined` instead of the intended Thai message.
## Files Changed
- `src/features/training-records/schemas/training-record.ts`
- `src/features/training-records/components/training-record-form.tsx`
## Fixed Code Summary
- Changed `trainingType` form default from `undefined` to `""` in create mode.
- Kept edit mode bound to the stored UI value.
- Updated the `Select` binding to pass `undefined` to Radix only for display when the current form value is empty.
- Replaced submit-level `z.enum(...)` validation with string-based validation plus whitelist refinement so the message always stays:
- `กรุณาเลือกประเภทการอบรม`
- Kept the current app enum contract intact:
- `INTERNAL_TRAINING`
- `EXTERNAL_TRAINING`
- `ONLINE_COURSE`
- `OJT`
## Regression Checklist
- Create mode: open new training record form and submit without selecting training type.
- Create mode: select each training type option and verify no raw Zod error appears.
- Edit mode: open an existing record and confirm the saved type renders correctly in the select.
- Edit mode: change the type and submit successfully.
- Validation after submit: confirm the Thai message appears instead of `Invalid input` or `expected string, received undefined`.
- Table/listing: verify training type badges still render correctly in Training Records and review pages.
- Server normalization: verify create/update payloads still map correctly to legacy DB values.