Files
alla-tms/docs/training-type-review.md
2026-07-16 09:53:14 +07:00

1.8 KiB

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.