Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

02 — User Personas (Dashboard Module)

Role-aware dashboard personas. Access derived from default role permissions (role.schema.ts:8-65) and dashboard permissions (permissions.constants.ts:37-38). Views marked (planned) are not implemented server-side. Personas marked (proposed) are analytics-relevant only.


P1 — Anjali, Organization Admin (org_admin) — primary persona

FieldDetail
ContextRuns the school; sets policy, reviews ops daily. org_admin holds all permissions including dashboard.read and dashboard.widget.manage (role.schema.ts:23; permissions.constants.ts:37-38)
Access todayFull overview — active students, teachers, staff, today's attendance rate, pending invoices, total dues (dashboard.service.ts:50-70)
Job to be done"What happened today, and what needs my attention, in 30 seconds"
BehaviourOpens dashboard on login; reads KPI row left-to-right; taps a KPI card to drill into Students/Fees/Attendance screens; pulls-to-refresh when she hears a class was noisy; re-checks dues at month-end
Pain pointsNumbers must be current within 60 s (cache TTL Dashboard.md:41); stale data without an indicator erodes trust; no trend column today — "up or down vs yesterday?" is answered by memory
Want (not yet)Widget layout customization (planned)dashboard.widget.manage exists (permissions.constants.ts:38) but no server API; coaching KPIs (planned) (IMPLEMENTATION_PLAN.md:645)
Analyticsdashboard.overview.open, dashboard.kpi.tap (proposed)

P2 — Ravi, Accountant (accountant)

FieldDetail
ContextOwns fee collection and reconciliation. Default role permissions: fees.collect, student.read (role.schema.ts:47) — no dashboard.read
Access todayNo dashboard — permission check fails. Under (planned) role-specific views (IMPLEMENTATION_PLAN.md:232), the finance card is the target surface
Job to be done"How much is outstanding today, and which invoices are stuck?"
Derived needFinance widget: pendingInvoices count + totalDueAmount (dashboard.service.ts:66-69); drill to Fees module
Notedashboard.read must be added to a role the tenant assigns, or the server must allow partial widget visibility per role (blueprint Dashboard.md:52) — design the UI to render a finance-only layout for this persona (planned)

P3 — Meera, Teacher (teacher)

FieldDetail
ContextTeaches classes; marks attendance. Default permissions: student.read, attendance.mark, attendance.edit (role.schema.ts:31) — no dashboard permission
Access todayNo dashboard. Teacher view (planned) (IMPLEMENTATION_PLAN.md:232)
Derived needPersonal day: my classes today, my attendance summary, timetable link. None of the current aggregates (dashboard.service.ts:50-70) are teacher-scoped — requires a (planned) GET /dashboard/attendance scope by teacher
BehaviourWould check attendance % at end of each class; wants it to reflect AttendanceMarked immediately (event Dashboard.md:34)

P4 — Suresh, Parent (parent) and Priya, Student (student)

FieldDetail
ContextTrack child's attendance/dues. Parent: student.read (role.schema.ts:55); student: no permissions (role.schema.ts:63)
Access todayNo dashboard
Derived needChild-scoped attendance %, fee balance, notices. (planned) per IMPLEMENTATION_PLAN.md:232; child-scoping has no server support today — flag in QA (unknown ownership)
NoteStudent-visible fees would need fees-related read permission; none exists for the student role (role.schema.ts:63) — (planned) gap

P5 — Platform Admin (platform_admin)

FieldDetail
ContextCross-tenant super admin (role.schema.ts:10-16)
Access todayNot a per-tenant dashboard user; permissions list is empty :15 — platform-level rollups (planned), not defined in blueprint
NoteOut of client scope for Phase 1

Permission → widget matrix (derived)

WidgetData source (service)Needed permissionDefault roles with it
Students/Teachers/Staff countsdashboard.service.ts:31-33dashboard.read (permissions.constants.ts:37)org_admin only (role.schema.ts:23)
Attendance today:34,:54-65dashboard.readorg_admin only
Finance: pending invoices + dues:35-37,:45-48,:66-69dashboard.read + fees.collect-class read (planned)org_admin; accountant has fees.collect but not dashboard.read (role.schema.ts:47)
Widget customizationdashboard.widget.manage (permissions.constants.ts:38)org_admin only

Unknowns: per-role widget filtering rules and the finance-read permission are not defined in code(planned); the client must render by what permissions it has and hide what it doesn't (00-shared/06 §5 403 → hide).