Dashboard
Welcome back, {{ user.name || user.username }}
{{ s.value }}
{{ s.label }}
Recent Orders
| Title | Category | Status | Priority | Created |
|---|---|---|---|---|
| No order data yet | ||||
| {{ o.title }} | {{ o.deviceCategory }} | {{ statusLabel(o.status) }} | {{ o.priority || '-' }} | {{ fmtDate(o.createdAt) }} |
Devices
Manage all registered medical equipment
Device List ({{ loading.devices ? '...' : devices.length }})
| Device Name | Model | Manufacturer | Reg. No. | Serial No. | Status | Actions | |
|---|---|---|---|---|---|---|---|
| No devices yet. Click "Add Device" above. | |||||||
| {{ d.name }} | {{ d.model }} | {{ d.manufacturer || '-' }} | {{ d.registrationNo || '-' }} | {{ d.serialNumber || '-' }} | {{ d.status==='active'?'Active':'Inactive' }} | {{ d.installDate ? fmtDate(d.installDate) : '-' }} |
|
Work Orders
Manage maintenance and tech support orders
Work Orders ({{ loading.orders ? '...' : filteredOrders.length }})
| Title | Category | Device Model | Status | Priority | Scheduled | Created | Actions |
|---|---|---|---|---|---|---|---|
| No orders yet | |||||||
| {{ o.title }} | {{ o.deviceCategory }} | {{ o.deviceModel || '-' }} | {{ statusLabel(o.status) }} | {{ o.priority || '-' }} | {{ o.scheduledAt ? fmtDate(o.scheduledAt) : '-' }} | {{ fmtDate(o.createdAt) }} |
|
Remote Sessions
TRTC audio/video calls & collaboration
Sessions ({{ loading.sessions ? '...' : sessions.length }})
| Order ID | TRTC Room | Manufacturer | Engineer | Status | Duration | Started | Actions |
|---|---|---|---|---|---|---|---|
| No sessions yet | |||||||
| {{ (s.orderId||'').slice(0,8) }}... | {{ s.trtcRoomId || '-' }} | {{ s.manufacturerUserId }} | {{ s.engineerUserId }} | {{ s.startedAt&&!s.endedAt?'Active':s.endedAt?'Ended':'Not Started' }} | {{ fmtDuration(s.durationSeconds) }} | {{ s.startedAt ? fmtDate(s.startedAt) : '-' }} |
|
🔴 Active Call — Room: {{ trtcRoomId }}
Certification
Ophthalmic engineer knowledge learning & exam
{{ categoryLabel(learnCard.category) }} / {{ learnCard.subCategory }}
{{ difficultyLabel(learnCard.difficulty) }}
{{ learnCard.id }}
{{ learnCard.question }}
💡 Explanation: {{ learnCard.explanation || 'No explanation available' }}
{{ categoryLabel(q.category) }}
{{ q.question.slice(0,50) }}...
{{ difficultyLabel(q.difficulty) }}
Ophthalmic Engineer Certification Exam
Randomly selected from 500-question bank {{ examQCount }} questions
Pass score: 90 pts | No time limit
Question {{ examCurrentIdx+1 }} / {{ examQuestions.length }}
{{ categoryLabel(examQuestions[examCurrentIdx].category) }}
{{ difficultyLabel(examQuestions[examCurrentIdx].difficulty) }}
{{ examQuestions[examCurrentIdx].question }}
{{ i+1 }}
{{ examResult.score }} pts
{{ examResult.score>=examResult.passScore?'🎉 Congratulations, you passed!':'😔 Failed. Keep studying!' }}
Pass line: {{ examResult.passScore }} pts
Correct: {{ examResult.details?.filter(d=>d.isCorrect).length }}
Wrong: {{ examResult.details?.filter(d=>!d.isCorrect).length }}
{{ d.isCorrect?'✓':'✗' }} {{ d.question }}
Your answer: {{ d.userAnswer || '(no answer)' }} | Correct answer: {{ d.correctAnswer }}
💡 {{ d.explanation }}
Exam History ({{ examHistory.length }})
| Date | Questions | Score | Result | Duration |
|---|---|---|---|---|
| No exam records | ||||
| {{ fmtDate(e.createdAt) }} | {{ e.questionCount }} | {{ e.score }} pts | {{ e.score>=e.passScore?'Pass':'Fail' }} | {{ e.submittedAt ? fmtDuration(Math.floor((new Date(e.submittedAt)-new Date(e.createdAt))/1000)) : '-' }} |
Users
Manage all user accounts
User List ({{ loading.users ? '...' : users.length }})
| Username | Name | Role | Company | Phone | Status | Registered | Actions | |
|---|---|---|---|---|---|---|---|---|
| No users yet | ||||||||
| {{ u.username }} | {{ u.name || '-' }} | {{ roleLabel(u.role) }} | {{ u.company || '-' }} | {{ u.phone || '-' }} | {{ u.email || '-' }} | {{ u.active?'Active':'Disabled' }} | {{ fmtDate(u.createdAt) }} |
|