# Training Hours TimePicker Review ## 1. Summary เปลี่ยนช่อง `submitted hours` ในฟอร์ม Create/Edit Training Record จาก `number input` เป็น `TimePicker-style input` โดยใช้ `Input type="time"` ที่มีอยู่แล้วในระบบ เพื่อหลีกเลี่ยงการเพิ่มโครงสร้างใหม่และลดผลกระทบกับโมดูลเดิม ค่าที่ผู้ใช้เลือกใน UI จะถูกแปลงเป็น `decimal hours` ก่อน submit และยังคงบันทึกลงฐานข้อมูลในฟิลด์ `hours` แบบเดิม ไม่มีการแก้ schema หรือ API contract ## 2. Files Changed - `src/features/training-records/components/training-record-form.tsx` - `src/features/training-records/schemas/training-record.ts` - `src/features/training-records/utils/time-utils.ts` ## 3. UI Changes - เปลี่ยนช่องกรอกชั่วโมงอบรมเป็นตัวเลือกเวลาแบบ `HH:mm` - เปลี่ยน label เป็น `จำนวนชั่วโมงอบรม *` - เพิ่ม helper text: - `เลือกระยะเวลาอบรม เช่น 01:30 = 1.5 ชั่วโมง` - เพิ่มข้อความสรุปค่าที่คำนวณแล้วใต้ input: - `รวม X ชั่วโมง` ## 4. TimePicker Behavior - ใช้ `Input type="time"` เพื่อให้ได้พฤติกรรม TimePicker ตาม browser/device มาตรฐาน - กำหนด `step={900}` เพื่อรองรับการเลือกทีละ 15 นาที - ตัวอย่าง: - `00:30 -> 0.5` - `01:00 -> 1` - `01:30 -> 1.5` - `02:15 -> 2.25` - `07:30 -> 7.5` ## 5. Decimal Conversion Logic เพิ่ม helper ที่ `src/features/training-records/utils/time-utils.ts` - `decimalHoursToDate(hours: number): Date` - `dateToDecimalHours(date: Date): number` - `timeInputValueToDate(value: string): Date | undefined` - `dateToTimeInputValue(date?: Date): string` - `formatDecimalHours(hours?: number): string` หลักการ: - ใช้ base date คงที่ `1970-01-01` - UI ใช้ `Date` ชั่วคราวเฉพาะในฟอร์ม - ก่อน submit แปลงเป็น `hours + minutes / 60` - ตอน edit แปลงค่าจาก decimal กลับเป็น `HH:mm` ## 6. Validation Rules ปรับ validation ให้ชัดเจนทั้งใน schema และ field-level validator - required - มากกว่า `0` - ไม่เกิน `24` ข้อความ validation: - `กรุณาระบุจำนวนชั่วโมงอบรม` - `จำนวนชั่วโมงอบรมต้องมากกว่า 0` - `จำนวนชั่วโมงอบรมต้องไม่เกิน 24 ชั่วโมง` ## 7. Edit Mode Behavior - ถ้าเปิดฟอร์มแก้ไขและมีค่าเดิม เช่น `1.5` - ระบบจะแปลงกลับเป็น `01:30` ในช่องเวลาอัตโนมัติ - ถ้าเลือกหลักสูตรที่มี `standard_hours` ระบบจะเติมค่าเวลาให้ฟอร์มอัตโนมัติด้วย ## 8. Dashboard/Report Impact ไม่มีผลกระทบกับ dashboard, review flow หรือ report calculation เพราะระบบ backend ยังรับและเก็บ `hours` เป็นเลข decimal เหมือนเดิม ## 9. Manual Test Checklist - [ ] Create form shows TimePicker for training hours - [ ] Selecting `01:30` saves `1.5` hours - [ ] Selecting `02:00` saves `2` hours - [ ] Selecting `02:15` saves `2.25` hours - [ ] Empty value is blocked - [ ] `00:00` is blocked - [ ] Value above `24` hours is blocked - [ ] Edit form converts `1.5` back to `01:30` - [ ] Dashboard still calculates approved hours correctly - [ ] Reports still export decimal hours correctly - [ ] Mobile layout works ## 10. Known Limitations - Native `time` input แสดงผลต่างกันเล็กน้อยตาม browser และ OS - `placeholder` ไม่ใช่พฤติกรรมหลักของ `input[type="time"]` ในหลาย browser จึงใช้ helper text ใต้ช่องแทน - เวลาที่ใช้ในฟอร์มเป็น UI-only state และไม่ได้ถูกเก็บเป็น `Date` ลงฐานข้อมูล