บันทึกคะแนน
หน้านี้คือ หัวใจของระบบ — ตารางกริดที่ rows คือนักเรียนและ cols คือ หัวข้อประเมิน ครูกรอกคะแนนตรงๆ ใน input แต่ละช่อง ระบบมี keyboard navigation เต็มรูปแบบ, ตรวจคะแนนเกินอัตโนมัติ, และให้แนบหมายเหตุต่อช่องได้ ข้อสำคัญ: ต้องกด บันทึก เองหลังกรอก ระบบไม่ auto-save
ก่อนเปิดหน้านี้ — ต้องมีนักเรียน + วิชา
ถ้าขาดอย่างใดอย่างหนึ่ง ระบบจะขึ้น StepEmptyState แทนตาราง
หน้าตา Empty State
ถ้าห้องที่เปิดยัง ไม่มีนักเรียน หรือ ไม่มีวิชา — ระบบจะขึ้น StepEmptyState 2 ขั้น บอกครูว่าต้องไปทำอะไรก่อน:
- ขั้น 1 (sky) — เพิ่มนักเรียน
- ขั้น 2 (peach) — เพิ่มหัวข้อประเมิน
ตารางคะแนน (Score Grid)
โครงสร้างกริด + sticky headers + แถวรวม / คอลัมน์รวม
โครงสร้างของตาราง
- คอลัมน์ซ้ายสุด — เลขที่ + ชื่อนักเรียน (sticky — คงเห็นตอน scroll ขวา)
- คอลัมน์กลาง — หัวข้อประเมินแต่ละหัวข้อ (เรียงตามที่ตั้งไว้ในหน้า subjects) — header มี 2 บรรทัด: ชื่อหัวข้อ และ "เต็ม [maxScore]"
- คอลัมน์ขวาสุด — รวมคะแนนของนักเรียนคนนั้น
X / totalMax(sticky) - แถวล่างสุด — ค่าเฉลี่ย/รวมของแต่ละหัวข้อ
หน้าจอมือถือ — สลับเป็นการ์ดต่อนักเรียน
บนหน้าจอ ≤720px ตารางจะ switch อัตโนมัติ เป็น MobileScoreView: การ์ด 1 ใบต่อนักเรียน 1 คน scroll แนวตั้ง ภายในการ์ดมี input คะแนนของทุกหัวข้อ
ฟีเจอร์ทุกอย่างยังครบ (input, note, overflow detection) — แค่ layout เปลี่ยน
กรอกคะแนน — Input + Keyboard Navigation
ทำได้เร็วมากด้วย arrow keys + Tab + Esc โดยไม่ต้องสลับมาใช้ mouse
คลิกที่ cell แล้วพิมพ์คะแนน
คลิก/แตะ cell เลือกได้ทันที — เมื่อ focus ระบบ select all ตัวเลขเดิม (ถ้ามี) ทำให้พิมพ์ทับได้เลยโดยไม่ต้องลบเก่าก่อน
Input ยอมเฉพาะตัวเลข ≥ 0 ถึง maxScore ของหัวข้อนั้น (step=1 — แต่ใส่ทศนิยมได้ ถ้าจำเป็น)
Keyboard Navigation ภายในกริด
- ↑ / ↓ — ขึ้น/ลงระหว่างนักเรียน (คอลัมน์เดียวกัน)
- ← / → — ซ้าย/ขวาระหว่างหัวข้อ (นักเรียนเดียวกัน)
- Tab — ไปช่องถัดไป (จาก ซ้าย→ขวา, ลงแถวใหม่)
- Shift+Tab — ย้อนกลับช่องก่อน
- Esc — รีเซ็ตค่าใน cell กลับเป็นค่าเริ่มต้น (ก่อนแก้)
- Enter — submit form (ถ้ามี dirty changes) — เหมือนกดปุ่ม "บันทึก"
สถานะของ Cell (สีและขอบ)
ระบบใช้ visual cue เพื่อบอกว่า cell ไหนแก้แล้ว/เกินคะแนน/มีหมายเหตุ
Dirty — ขอบหนาเข้ม
Cell ที่ครูเพิ่งแก้ค่า (และยังไม่บันทึก) จะมี ขอบหนา + ดำเข้ม เพื่อให้เห็นชัดว่าตรงไหนเป็นการเปลี่ยนแปลงที่ยัง pending
หลังกด "บันทึกคะแนน" สำเร็จ ขอบจะกลับเป็นปกติ
Overflow — พื้นชมพู (เกินคะแนนเต็ม)
ถ้าใส่ค่า > maxScore — cell จะ กลายเป็นพื้นชมพู ทันที (ตรวจตอน blur ไม่ใช่ real-time ตอนพิมพ์)
ระบบ ห้ามบันทึก ตราบใดที่ยังมี cell ที่ overflow อยู่ — กดปุ่มบันทึกจะได้ Toast แดง: "คะแนนเกินคะแนนเต็ม แก้ไขช่องที่เป็นสีชมพูก่อน"
Deleted — ล้างค่าด้วย Esc หรือลบเลขให้ว่าง
ถ้าครูล้างค่าใน cell ที่เคยมีคะแนน (กด Esc หรือลบเลขจนช่องว่าง) ระบบจะ track ว่า "จะลบ" ค่านี้ตอน submit — cell จะมี style ขีดทับเล็กๆ
หลังบันทึก ค่าใน DB ของ cell นั้นจะกลายเป็น null (ไม่มีคะแนน — ต่างกับ 0)
หมายเหตุต่อช่อง (Cell Notes)
แนบข้อความสั้นต่อแต่ละ cell — เก็บความเห็นครู/บริบทของคะแนนนั้น
คลิกไอคอน bookmark ใน cell
เมื่อ cell มีคะแนนแล้ว (≥0, ไม่ใช่ deleted) จะมีไอคอน bookmark เล็กๆ ปรากฏที่มุม cell — สีตัน = มีหมายเหตุแล้ว, ขอบเปล่า = ยังไม่มี
คลิกเพื่อเปิด NoteDialog
กรอก/แก้/ลบหมายเหตุ
Dialog แสดงหัวเรื่อง: "หมายเหตุ: [ชื่อนักเรียน] — [หัวข้อ] ([คะแนน]/[เต็ม])"
มี textarea เปล่า (ถ้าใหม่) หรือมีค่าเดิม (ถ้าแก้) + 3 ปุ่ม:
- บันทึก — เก็บข้อความ + ปิด dialog
- ลบหมายเหตุ — เคลียร์ + ปิด
- ยกเลิก — ไม่แก้, ปิด
SaveBar — สรุปการเปลี่ยนแปลง + ปุ่มบันทึก
แถบเหลืองติดล่างหน้าจอ ขึ้นเมื่อมีการแก้ — โชว์จำนวนต่อประเภท
3 chip นับแยก
SaveBar นับการเปลี่ยนแปลงเป็น 3 ประเภท:
- 🟡 เปลี่ยน N รายการ — cell ที่ค่าเปลี่ยน (รวมที่แก้จาก null → ตัวเลข)
- 💬 เพิ่ม M หมายเหตุ — หมายเหตุที่เพิ่ม/แก้/ลบ ไม่ได้แตะคะแนน
- 🗑️ ลบ L รายการ — cell ที่เปลี่ยนจากตัวเลข → null
ปุ่ม บันทึกคะแนน สีเข้มอยู่ทางขวาของแถบ
กดบันทึก — รวบทุกการแก้ส่งครั้งเดียว
ระบบส่ง batch ขึ้น backend ในรอบเดียว — ไม่ใช่ส่งทีละ cell
Toast เขียวสำเร็จ: "บันทึกคะแนนแล้ว · อัปเดต X · ลบ Y" (ส่วน X/Y มีเฉพาะถ้ามีจริง)
Toast แดงผิดพลาด: "บันทึกไม่สำเร็จ" + รายละเอียด — UI ยังคงค่า dirty ไว้ ให้ครูแก้และลองใหม่
สรุป Cheat Sheet
- Tab ช่องถัดไป
- ↑↓←→ ทิศทาง
- Enter = บันทึก
- Esc รีเซ็ต cell
- ขอบหนา = dirty
- พื้นชมพู = เกินคะแนน
- ขีดทับ = จะลบ
- ไอคอน 📑 = มีหมายเหตุ
- ตรวจ SaveBar ขึ้นไหม
- กด บันทึก
- รอ toast เขียว
- ค่อยปิดได้