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 (Academics Module)

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/** and 03-Database/RELATIONSHIPS.md:50-61.


1. Place in the global shell

Top-level destination (per 00-shared/05 §2):

DestinationRoute prefixRoles (default)
Academics/academicsadmin, 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.academicYearId optional — 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 hereToVia
Class detailTimetable of classGET /timetable?classId= (timetable.controller.ts:22-29)
Class detailAttendance of classattendance module (classId filter)
Class detailStudents in classStudents module (class_enrollments, RELATIONSHIPS.md:63-65)
Teacher rosterTeacher timetableGET /timetable?teacherId= (timetable.controller.ts:24-27)
Subject detailHomework / ExamsHomework + Exams modules (subjectId refs, 04-Modules/Exams.md:51)

5. Information grouping rules

  1. Year-first browsing: all admin reads default to the current year (isCurrent:true resolved from the years list, academic-year.service.ts:69-83); a global year switcher (AppBar chip) re-scopes every list that supports academicYearId.
  2. 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.
  3. 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.
  4. 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).