# Certificate Preview Review ## Summary ปรับปรุงการแสดงตัวอย่างใบรับรองในโมดูล Training Records ให้รองรับ fallback ที่ชัดเจนขึ้น: - ไฟล์รูปภาพ `JPG`, `JPEG`, `PNG`, `GIF`, `WEBP` แสดง preview ได้ - หากรูปเสีย, โหลดไม่ได้, URL ไม่ถูกต้อง, หรือเป็นไฟล์ที่ไม่ใช่รูปภาพ จะไม่แสดง broken image - ใช้ placeholder แบบเดียวกันในตารางประวัติอบรม, หน้ารายละเอียด, และรายการเอกสารแนบ - การเปิดไฟล์/ดาวน์โหลดไฟล์ยังทำงานเหมือนเดิม ## Files Changed - `src/components/icons.tsx` - `src/features/training-records/components/certificate-preview-utils.tsx` - `src/features/training-records/components/training-record-certificate-manager.tsx` - `src/features/training-records/components/training-record-tables/columns.tsx` - `src/features/training-records/components/training-record-tables/training-record-image-preview.tsx` - `src/features/training-records/server/training-record-data.ts` ## Preview Logic 1. ดึง certificate ล่าสุดของแต่ละ training record เหมือนเดิม 2. ถ้า `fileType` เป็นรูปภาพที่รองรับ จะส่ง preview URL กลับมาให้ UI 3. ถ้า `fileType` ไม่ใช่รูปภาพ จะไม่ส่ง preview URL แต่ยังส่งชนิดไฟล์กลับมาเพื่อใช้แสดง placeholder 4. ฝั่ง UI ตรวจสอบอีกชั้นว่า: - ถ้าเป็นรูปและโหลดได้ ให้แสดงรูป - ถ้าเป็นรูปแต่โหลดไม่ได้ ให้ fallback เป็น placeholder - ถ้าไม่ใช่รูป ให้แสดง placeholder ทันที 5. ถ้าไม่มีไฟล์แนบเลย จะแสดง `-` ## Placeholder Design Placeholder ใช้ไอคอน `Award` จากชุดไอคอนของโปรเจกต์ และมีองค์ประกอบดังนี้: - ไอคอนใบรับรอง - ข้อความ `เกียรติบัตร` - ชนิดไฟล์แบบ optional เช่น `PDF`, `DOCX`, `ZIP` ดีไซน์ใช้กรอบ `border-dashed`, พื้นหลัง muted, และจัดวางกึ่งกลางเพื่อให้ดูสอดคล้องกับ UI เดิมของระบบ ## Supported File Types Preview รูปภาพ: - `image/jpeg` - `image/jpg` - `image/png` - `image/gif` - `image/webp` Fallback placeholder: - `application/pdf` - `application/vnd.openxmlformats-officedocument.wordprocessingml.document` - `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` - `application/vnd.openxmlformats-officedocument.presentationml.presentation` - `application/zip` - `application/x-rar-compressed` - และไฟล์ชนิดอื่นที่ไม่ใช่รูปภาพ ## Manual Test Checklist - อัปโหลดไฟล์ `JPG` แล้วตรวจสอบว่า preview แสดงถูกต้อง - อัปโหลดไฟล์ `PNG` แล้วตรวจสอบว่า preview แสดงถูกต้อง - ตรวจสอบ record ที่มี `GIF` หรือ `WEBP` ว่า preview แสดงถูกต้อง - ทำให้ URL รูปภาพไม่ถูกต้อง แล้วตรวจสอบว่าแสดง placeholder แทน broken image - ตรวจสอบไฟล์ `PDF` ว่าแสดง placeholder พร้อมชนิดไฟล์ - ตรวจสอบไฟล์ที่ไม่ใช่รูปภาพอื่น เช่น `DOCX`, `XLSX`, `PPTX`, `ZIP`, `RAR` ว่าแสดง placeholder - กดปุ่มเปิดไฟล์จากรายการเอกสารแนบ และตรวจสอบว่าเปิดไฟล์ได้ - ตรวจสอบหน้าตาราง Training Records - ตรวจสอบหน้ารายละเอียด Training Record - ตรวจสอบรายการเอกสารแนบใน Certificate Manager ## Known Limitations - UI สำหรับอัปโหลดไฟล์ยังคงจำกัดชนิดไฟล์ตาม validation เดิมของระบบ; งานนี้โฟกัสที่ preview/fallback behavior เป็นหลัก - Placeholder แสดงชนิดไฟล์จาก MIME type ที่ระบบมีอยู่ ถ้าแหล่งข้อมูลส่ง MIME type แปลกหรือไม่ครบ อาจแสดง label ได้ไม่สมบูรณ์