05 — Screen Inventory (Teachers Module)
- Screen index
- S1 — Teachers List
- S2 — Teacher Detail · Profile tab
- S3 — Teacher Detail · Assignments tab
- S4 — Teacher Detail · Schedule tab
- S5 — Create Teacher form (full page)
- S6 — Edit Teacher form (full page)
- S7 — Subject Assignment Editor (bottom sheet / dialog)
- S8 — Deactivate confirmation dialog
- S9/S10 — My Teaching / My Schedule (teacher self,
(planned))
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
| # | Screen | Route | Type | Access |
|---|---|---|---|---|
| S1 | Teachers List (filters + pagination) | /staff/teachers | List | admin, HR (staff.read client-gated) |
| S2 | Teacher Detail — Profile tab | /staff/teachers/:id | Detail (tabs) | admin, HR; own-record (planned) for teacher |
| S3 | Teacher Detail — Assignments tab | /staff/teachers/:id (tab 2) | Detail (tabs) | admin, HR, coordinator |
| S4 | Teacher Detail — Schedule tab | /staff/teachers/:id (tab 3) | Detail (tabs) | admin, HR, teacher self |
| S5 | Create Teacher form | /staff/teachers/new | Form (full page) | admin, HR |
| S6 | Edit Teacher form | /staff/teachers/:id/edit | Form (full page) | admin, HR |
| S7 | Subject Assignment Editor | sheet/dialog on S3 | Editor | admin, coordinator |
| S8 | Deactivate confirmation | dialog on S2 | Dialog (destructive) | admin, HR |
| S9 | My Teaching (teacher self) | /my/teaching (planned) | Dashboard-ish summary | teacher |
| S10 | My Schedule (teacher self) | /my/teaching/schedule (planned) | List/grid | teacher |
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),AppListTilerows (avatar/initials, display name, employeeNumber, status chip, department), pagination viaPaginatedListMixin(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/qnot 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:
AppDropdownacademic-year (defaultisCurrent,academic-year.schema.ts:31-32), list ofSubjectAssignmentrows (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 whenacademicYearIdomitted (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, sorteddayOfWeek, startTime). - Caveat:
teacherId=memagic value fromEND_TO_END_USER_FLOWS.md:266is 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 (defaultactive), 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
metadataobject (update-teacher.dto.ts:4-53). Prefilled fromGET /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/meendpoint (teacher.controller.ts:24-38has none) (OQ-2).