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

04 — Information Architecture (Teachers Module)

Fits the shared shell (00-shared/05_Global_Information_Architecture.md). Teachers is a Staff-adjacent, Academics-linked module: routes live under a People/Staff destination, while assignment data lives in the Academics domain.


1. Placement in the app shell

  • Primary home: Staff destination (/staff, role-gated admin/HR per 05_Global_Information_Architecture.md:39) — teachers and staff share the "people/employment" cluster (same user+department+designation model).
  • Teacher self surface: (planned) dedicated "My Teaching" entry for the teacher role — today the client composes it from timetable + assignments (03 §5). Not a top-level destination in the shared IA (Teachers isn't listed there at all — derivation: only Staff exists).
  • Cross-links: Academics (subjects/classes/years), Timetable (schedule), Users (identity), Notifications (teacher-created), Dashboard (count KPI).

2. Sitemap (client, this module)

Staff (People)
└── Teachers
    ├── Teachers List                      /staff/teachers
    │   ├── Teacher Detail                 /staff/teachers/:id
    │   │   ├── Tab: Profile               (default)
    │   │   ├── Tab: Assignments           (per academic year)
    │   │   └── Tab: Schedule              (timetable by teacherId)
    │   ├── Create Teacher                 /staff/teachers/new
    │   └── Edit Teacher                   /staff/teachers/:id/edit
    └── Assignment Editor (sheet/dialog)   reachable from Detail·Assignments
Teacher (self, planned)
└── My Teaching                            /my/teaching
    ├── My Profile (read-only)
    ├── My Assignments
    └── My Schedule

3. Screen relationships

  • List → Detail (push on phone; master-detail right-pane ≥ 840 dp, 05_Global_Information_Architecture.md:58).
  • Detail → Edit form (returns → detail refresh).
  • Detail → Assignment editor (bottom sheet on phone, dialog on desktop, 03_Component_Library.md AppBottomSheet).
  • Detail → Schedule tab (client-side tab within detail; data from Timetable module).
  • Deactivate is a dialog on the detail screen (destructive, AppDialog), not a page.

4. Navigation details

AspectRule
Route params:id = teacher _id (Mongo ObjectId, teacher.schema.ts)
Tab stateStatefulShellBranch keeps tab index across navigation (05 §3)
Deep linkstudylyon://teachers/:id (teacher detail); studylyon://teachers/:id/assignments(planned), no backend constraint
Breadcrumbsdesktop detail screens: Staff › Teachers › {name} (05 §3)
FABList screen only: "Add teacher" (05 §7); hidden on scroll-down
Context menuRow long-press / right-click: Edit, Deactivate (03_Component_Library.md AppMenu)
Keyboard+/N = new teacher on list (desktop, 05 §7)

5. Role → surface gating (client-side; server enforces JWT only — 01 §5)

Surfaceorg_adminHR/custom (staff.read+)teacher (self)staff read-only
Teachers listfullfullread ((proposed)staff.read exists at permissions.constants.ts:19)
Teacher detailfullfullown only (planned)read
Create / edit / deactivatefullfull
Assignments (by teacher / by class)fullfullown (read)read
My Teachingfull

Server reality: no endpoint carries role metadata (rbac.guard.ts:29 passes metadata-less routes) → the client is the only gate. Cross-tenant access is still structurally blocked server-side via scopedFilter (base.repository.ts:20-30).

6. Information units (primary entities)

EntityCollectionKey fieldsClient model
Teacherteachers (COLLECTIONS.md:1418)userId, employeeNumber, departmentId, designationId, joiningDate, employmentStatus, qualification, experienceYears, subjects[], classTeacherFor[], metadataTeacher
SubjectAssignmentsubject_assignments (COLLECTIONS.md:1644)teacherId, subjectId, classId, academicYearIdSubjectAssignment
Department / Designationdepartments / designations (Staff-owned)name, code, level, statusDepartment, Designation (reference)
Subjectsubjects (COLLECTIONS.md:1598)code, name, shortName, credits, marksSubject (reference)
Classclasses (COLLECTIONS.md)academicYearId, gradeId, sectionId, name, classTeacherIdClass (reference)
AcademicYearacademic_years (COLLECTIONS.md)name, startDate, endDate, status, isCurrentAcademicYear (reference)

7. Empty-state strategy

  • List with zero teachers → AppEmptyState "No teachers yet — add your first teacher".
  • Detail with zero assignments → inline empty per tab, CTA "Add assignment".
  • Schedule tab with zero timetable entries → "No classes scheduled".
  • List with filters returning zero → "No teachers match filters" + clear-filters action.