04 — Information Architecture (Academics Module)
- 1. Place in the global shell
- 2. Content model (exact, from schemas)
- 3. Navigation tree (forward-looking routes)
- 4. Sibling relationships (cross-module)
- 5. Information grouping rules
Where Academics lives in the app shell (00-shared/05) and how its screens nest. Routes are forward-looking (no client exists); the data model below is exact from
src/modules/academics/**and03-Database/RELATIONSHIPS.md:50-61.
1. Place in the global shell
Top-level destination (per 00-shared/05 §2):
| Destination | Route prefix | Roles (default) |
|---|---|---|
| Academics | /academics | admin, teacher (read) — coordinator added to roles once RBAC lands (OQ-1) |
Shell: phone bottom-nav + drawer; tablet/desktop NavigationRail; master-detail at
≥ 840 dp (00-shared/04 §6).
2. Content model (exact, from schemas)
Academic Year (academic_years) name, startDate, endDate,
status: upcoming|active|archived, isCurrent: bool
└─ Grade (grades) [optional year binding] name, code?, displayOrder, status
└─ Section (sections) name, capacity=40, classTeacherId?, roomId?, status
└─ Class (classes) academicYearId*, gradeId*, sectionId*,
name, capacity=40, campusId?, classTeacherId?,
roomId?, status
Subject (subjects) — flat catalog code*, name, shortName?, credits=0,
maximumMarks=100, passingMarks=33,
theoryMarks=80, practicalMarks=20, status
Subject Assignment (subject_assignments) teacherId*, subjectId*, classId*, academicYearId*
- Hierarchy is NOT denormalized: a Class references year+grade+section IDs; the
client must join to render "Grade 10 · Section A" labels (
class.schema.ts:9-19). - Grades may float outside any year (
grade.academicYearIdoptional —grade.schema.ts:9-10); classes may not (class.schema.ts:9-10). - Subjects and assignments are year-agnostic catalogs except that assignments
carry
academicYearId(subject-assignment.schema.ts:18-19).
3. Navigation tree (forward-looking routes)
/academics Academics hub (admin/coordinator/read)
├── /academics/years Academic Year list
│ ├── /academics/years/new Create year (full-screen form)
│ └── /academics/years/:id Year detail (dates, status, classes of year)
│ └── /academics/years/:id/classes Classes of this year (by-year feed)
├── /academics/grades Grades list (displayOrder ladder)
│ ├── /academics/grades/new Create grade
│ └── /academics/grades/:id Grade detail → sections of grade
│ └── /academics/grades/:id/sections Sections list (by-grade feed)
├── /academics/classes Classes list (all)
│ ├── /academics/classes/:id Class detail — MASTER screen
│ │ ├── tabs: Overview | Subjects & teachers | Students(link)
│ │ └── /academics/classes/:id/assign Assignment matrix (add/replace/remove)
│ └── /academics/classes/new Create class (cascading pickers)
├── /academics/sections Sections list (all)
│ └── /academics/sections/:id Section detail (chips of classes)
├── /academics/subjects Subject catalog
│ ├── /academics/subjects/new Create subject (marks form)
│ └── /academics/subjects/:id Subject detail (marks config, usage)
├── /academics/explore Hierarchy explorer (tree view)
└── /academics/teachers/:teacherId Teacher roster (by-teacher assignments)
Route guards: authGuard + permissionGuard('academics.read') — the permission
string is (planned) (OQ-1); until the backend exposes it, the guard reads the
tenant role set (00-shared/05 §9).
4. Sibling relationships (cross-module)
| From here | To | Via |
|---|---|---|
| Class detail | Timetable of class | GET /timetable?classId= (timetable.controller.ts:22-29) |
| Class detail | Attendance of class | attendance module (classId filter) |
| Class detail | Students in class | Students module (class_enrollments, RELATIONSHIPS.md:63-65) |
| Teacher roster | Teacher timetable | GET /timetable?teacherId= (timetable.controller.ts:24-27) |
| Subject detail | Homework / Exams | Homework + Exams modules (subjectId refs, 04-Modules/Exams.md:51) |
5. Information grouping rules
- Year-first browsing: all admin reads default to the current year
(
isCurrent:trueresolved from the years list,academic-year.service.ts:69-83); a global year switcher (AppBar chip) re-scopes every list that supportsacademicYearId. - Flat catalogs, joined display: subjects/grades/classes list pages render joined labels (grade name, section name) computed client-side from the loaded reference cache — never from a server-side projection.
- Read vs admin surfaces: structure browse for students/parents reuses the same
pages with all CTAs hidden (permission-driven), per
02_User_Personas.md P4. - Master-detail: class detail is the hub for the assignment matrix and
downstream links (timetable/attendance/students); on tablet+ it opens in the
right pane at ≥ 840 dp (
00-shared/04 §6).