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

05 — Screen Inventory (Teachers Module)

All screens are client-side compositions over the implemented API (teacher.controller.ts:24-38, subject-assignment.controller.ts:21-38, timetable.controller.ts:21-27). (planned) = needs backend/roadmap work.


Screen index

#ScreenRouteTypeAccess
S1Teachers List (filters + pagination)/staff/teachersListadmin, HR (staff.read client-gated)
S2Teacher Detail — Profile tab/staff/teachers/:idDetail (tabs)admin, HR; own-record (planned) for teacher
S3Teacher Detail — Assignments tab/staff/teachers/:id (tab 2)Detail (tabs)admin, HR, coordinator
S4Teacher Detail — Schedule tab/staff/teachers/:id (tab 3)Detail (tabs)admin, HR, teacher self
S5Create Teacher form/staff/teachers/newForm (full page)admin, HR
S6Edit Teacher form/staff/teachers/:id/editForm (full page)admin, HR
S7Subject Assignment Editorsheet/dialog on S3Editoradmin, coordinator
S8Deactivate confirmationdialog on S2Dialog (destructive)admin, HR
S9My Teaching (teacher self)/my/teaching (planned)Dashboard-ish summaryteacher
S10My Schedule (teacher self)/my/teaching/schedule (planned)List/gridteacher

Supporting pickers reused from other modules (not screens of this module): users picker (S5), departments/designations pickers (S5/S6), subjects picker (S5/S7), classes picker (S5/S7), academic-year picker (S7).


S1 — Teachers List

  • Purpose: browse, search, filter, paginate the teacher roster.
  • Elements: AppSearchBar (q), filter chips (employment status × 4, teacher.schema.ts:7-12; department; designation), AppListTile rows (avatar/initials, display name, employeeNumber, status chip, department), pagination via PaginatedListMixin (infinite scroll, 06_State_Management.md §3.2), FAB "Add teacher".
  • Data: GET /teachers?page=&limit=&sort=&q= (teacher.controller.ts:27-29). Caveat: sort/q not applied server-side (teacher.service.ts:66-78) → client re-sorts cached page; server search (planned) (OQ-3).
  • States: skeleton → content | empty | error (retry). Filter change = refetch page 1.

S2 — Teacher Detail · Profile tab

  • Purpose: read-only profile; entry point for edit/deactivate.
  • Elements: header card (avatar initials, name, employeeNumber, status chip), info rows (department, designation, joining date, qualification, experienceYears, teacher.schema.ts:16-51), subjects badges (subjects[]), class-teacher badges (classTeacherFor[]), metadata section when present, AppBar actions: Edit, overflow menu (Deactivate).
  • Data: GET /teachers/:id (teacher.controller.ts:30-32). 404 → treat as removed (empty state + back).
  • Enrichment: department/designation/subject/class names resolved client-side from reference catalogs (04 §6); server returns raw ObjectIds only.

S3 — Teacher Detail · Assignments tab

  • Purpose: per-academic-year teaching matrix for this teacher.
  • Elements: AppDropdown academic-year (default isCurrent, academic-year.schema.ts:31-32), list of SubjectAssignment rows (subject name, class name, year), "Add assignment" button → S7, row overflow: Remove (confirm dialog).
  • Data: GET /subject-assignments/by-teacher/:teacherId?academicYearId= (subject-assignment.controller.ts:30-35). Empty result when academicYearId omitted (subject-assignment.service.ts:26-31) → picker always set.
  • States: year with none → AppEmptyState + CTA; loading skeleton rows.

S4 — Teacher Detail · Schedule tab

  • Purpose: weekly teaching timetable for this teacher.
  • Elements: week grid (Mon–Sun × time slots), cards per period (subject/class/ startTime–endTime), empty state.
  • Data: GET /timetable?teacherId=<id> (timetable.controller.ts:21-27, timetable.service.ts:55-60, sorted dayOfWeek, startTime).
  • Caveat: teacherId=me magic value from END_TO_END_USER_FLOWS.md:266 is not implemented — always send the real id (OQ-2).

S5 — Create Teacher form (full page)

  • Purpose: create a teacher profile; must reference an existing User.
  • Fields (server contract, create-teacher.dto.ts:4-52): userId* (user picker), employeeNumber*, departmentId, designationId, joiningDate, employmentStatus (default active), qualification, experienceYears, subjects[] (multi), classTeacherFor[] (multi).
  • Submit: POST /teachers → 200 data = created teacher (teacher.controller.ts:24-26).
  • Errors: 409 duplicate user/employeeNumber (teacher.service.ts:27-38) shown inline; 400 field errors mapped (00-shared/07 §3).

S6 — Edit Teacher form (full page)

  • Same field set as S5 minus userId, plus optional metadata object (update-teacher.dto.ts:4-53). Prefilled from GET /teachers/:id.
  • Submit: PATCH /teachers/:id → 200 updated doc (teacher.controller.ts:33-35).
  • Identity link immutable (userId absent from DTO).

S7 — Subject Assignment Editor (bottom sheet / dialog)

  • Purpose: create one SubjectAssignment (teacher × subject × class × year).
  • Fields (create-subject-assignment.dto.ts:4-19): teacherId (prefilled from detail), subjectId* (picker), classId* (picker, year-scoped), academicYearId* (picker, default current).
  • Submit: POST /subject-assignments → 200 doc (subject-assignment.controller.ts:21-23).
  • Client-side duplicate guard: block if (teacher, subject, class, year) already in matrix — server has no check (subject-assignment.service.ts:13-17) (OQ-2).

S8 — Deactivate confirmation dialog

  • Purpose: confirm irreversible soft-delete.
  • Content: title "Deactivate teacher?", body: name + employeeNumber; warning copy: hidden from all lists; historical records (assignments, audit) retained; no reactivation via API (OQ-5).
  • Action: DELETE /teachers/:id (teacher.controller.ts:36-38) → 200 void → snackbar, navigate back. 404 → "Already deactivated" → back.

S9/S10 — My Teaching / My Schedule (teacher self, (planned))

  • Composition over existing endpoints: GET /subject-assignments/by-teacher/:id (assignments), GET /timetable?teacherId= (schedule), GET /teachers/:id (profile).
  • Requires resolution of "my teacher id" — no /teachers/me endpoint (teacher.controller.ts:24-38 has none) (OQ-2).