3.6 KiB
3.6 KiB
Certificate Dialog Review
Summary
ปรับปรุงหน้าต่างแสดงตัวอย่างเกียรติบัตรให้ปุ่มปิดอยู่ในตำแหน่งที่เหมาะสมภายใน dialog และทำให้การแสดงผลรูปภาพมีขนาดที่พอดีกับทั้ง desktop และ mobile โดยไม่กระทบพฤติกรรม preview/fallback และการเปิดไฟล์เดิม
Files Changed
src/components/ui/dialog.tsxsrc/features/training-records/components/training-record-tables/training-record-image-preview.tsx
UI Changes
- เพิ่มความสามารถ
hideCloseButtonให้DialogContentเพื่อซ่อนปุ่มปิดแบบ default ในกรณีที่ต้องการจัด header เอง - เพิ่ม header แบบมองเห็นได้ใน dialog preview
- ซ้าย: หัวข้อ
ตัวอย่างเกียรติบัตร - ขวา: ปุ่มปิดแบบ
DialogClose+Button
- ซ้าย: หัวข้อ
- เพิ่มเส้นแบ่ง (
border-b) ระหว่าง header และเนื้อหา preview
Dialog Behavior
- ปุ่มปิดอยู่ภายในกรอบ dialog เสมอ
- ปุ่มปิดไม่ลอยทับรูปภาพ
- ปุ่มปิดใช้
DialogClose asChildตาม pattern ของ shadcn/ui - dialog ยังคงเปิดจาก thumbnail เดิม และยังรองรับ fallback placeholder เหมือนเดิม
Image Sizing
- เปลี่ยนพื้นที่ preview หลักให้ใช้
object-contain - จำกัดขนาดรูปด้วย
max-h-[70vh] - ให้รูปใช้
w-fullภายใน dialog โดยไม่ล้นกรอบ - dialog ใช้ขนาด
w-[calc(100vw-2rem)]และmax-w-3xlเพื่อให้พอดีกับหน้าจอ
Mobile/Responsive Notes
- dialog ใช้ความกว้างแบบ responsive เพื่อไม่ชนขอบจอมือถือ
- header ใช้งานง่ายบนหน้าจอเล็ก เพราะปุ่มปิดอยู่ในแถวเดียวกับหัวข้อ
- เนื้อหาใช้
overflow-y-autoเพื่อรองรับกรณีความสูงไม่พอ - placeholder non-image และ broken-image ยังแสดงได้เต็มพื้นที่โดยไม่แตก layout
Manual Test Checklist
- Certificate preview dialog opens correctly.
- Close button stays inside dialog.
- Close button does not overlap image.
- Close button works on desktop.
- Close button works on mobile.
- Large landscape certificate fits inside dialog.
- Portrait certificate fits inside dialog.
- Image does not overflow screen.
- PDF or unsupported file shows certificate placeholder icon.
- Broken image shows certificate placeholder icon.
- Download/open certificate still works.
Known Limitations
- งานนี้ปรับเฉพาะ dialog ของ certificate preview component ที่ใช้งานอยู่ในโมดูล training records
- ถ้าภายหลังมี preview dialog แบบใหม่ที่ไม่ใช้ component เดียวกัน จะต้องนำ pattern นี้ไปใช้เพิ่มแยกจุด