4.8 KiB
4.8 KiB
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.tsxsrc/features/training-records/schemas/training-record.tssrc/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.501:00 -> 101:30 -> 1.502:15 -> 2.2507:30 -> 7.5
5. Decimal Conversion Logic
เพิ่ม helper ที่ src/features/training-records/utils/time-utils.ts
decimalHoursToDate(hours: number): DatedateToDecimalHours(date: Date): numbertimeInputValueToDate(value: string): Date | undefineddateToTimeInputValue(date?: Date): stringformatDecimalHours(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:30saves1.5hours - Selecting
02:00saves2hours - Selecting
02:15saves2.25hours - Empty value is blocked
00:00is blocked- Value above
24hours is blocked - Edit form converts
1.5back to01:30 - Dashboard still calculates approved hours correctly
- Reports still export decimal hours correctly
- Mobile layout works
10. Known Limitations
- Native
timeinput แสดงผลต่างกันเล็กน้อยตาม browser และ OS placeholderไม่ใช่พฤติกรรมหลักของinput[type="time"]ในหลาย browser จึงใช้ helper text ใต้ช่องแทน- เวลาที่ใช้ในฟอร์มเป็น UI-only state และไม่ได้ถูกเก็บเป็น
Dateลงฐานข้อมูล