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

Every screen the Academics module needs, mapped to its exact endpoint source. All endpoints from src/modules/academics/controllers/*. Read/write split per 02_User_Personas.md matrix (intended, RBAC (planned) — OQ-1).


1. Academic Year List

Route/academics/years
EndpointGET /academic-years (paginated) — academic-year.controller.ts:27-29
PurposeAll years, newest first (default sort=createdAt:-1, academic-year.service.ts:47); status badges; current-year flag
ActionsAdd year (FAB), set current (row menu), edit, delete (soft)
EmptyAppEmptyState: "No academic years yet — add your first"
RolesAdmin/coordinator full; teacher/student read

2. Academic Year Detail

Route/academics/years/:id
EndpointGET /academic-years/:id (academic-year.controller.ts:30-32); classes feed GET /classes/by-year/:academicYearId (class.controller.ts:30-35)
PurposeDates, status, isCurrent; inline list of the year's classes
Actionsset-current, edit dates/status, delete

3. Grades List

Route/academics/grades
EndpointGET /grades (paginated) — grade.controller.ts:27-29; default displayOrder:1 (grade.service.ts:39)
PurposeThe tenant's ladder (Grade 1…12) in defined order; optional code (G1), per-grade status (free string, grade.schema.ts:21-22)
ActionsAdd grade, edit, delete, reorder via displayOrder

4. Grade Detail (with sections)

Route/academics/grades/:id
EndpointGET /grades/:id (grade.controller.ts:30-32); sections GET /sections/by-grade/:gradeId (section.controller.ts:30-35)
PurposeGrade metadata + its sections (chips) + classes linking it (client-joined)
ActionsEdit grade; add section; jump to classes of grade

5. Classes List

Route/academics/classes (optional year filter via year switcher)
EndpointGET /classes (class.controller.ts:27-29) or GET /classes/by-year/:academicYearId (class.controller.ts:30-35)
PurposeAll classes; each row shows joined grade + section chips, capacity, status
ActionsAdd class (cascading pickers), edit, delete

6. Class Detail — MASTER screen

Route/academics/classes/:id
EndpointGET /classes/:id (class.controller.ts:36-38); roster GET /subject-assignments/by-class/:classId?academicYearId= (subject-assignment.controller.ts:24-29)
TabsOverview (meta + chips) · Subjects & teachers (assignment matrix rows) · Students (link to Students module, (planned) read-only count)
ActionsEdit class; add subject+teacher; replace/remove assignment; jump to timetable/attendance (consumers)

7. Section Detail

Route/academics/sections/:id
EndpointGET /sections/:id (section.controller.ts:36-38); classes of section = client-joined from GET /classes
PurposeSection meta (capacity, classTeacher, room) + classes using it
ActionsEdit section; delete

8. Sections List

Route/academics/sections
EndpointGET /sections (section.controller.ts:27-29) or by-grade
PurposeAll sections (or of one grade) with grade label

9. Subjects List

Route/academics/subjects
EndpointGET /subjects (subject.controller.ts:27-29); insertion order (subject.service.ts:35-47)
PurposeCatalog: code (unique), name, shortName, marks config preview, status
ActionsAdd subject, edit, delete

10. Subject Detail

Route/academics/subjects/:id
EndpointGET /subjects/:id (subject.controller.ts:30-32)
PurposeFull marks configuration (max/passing/theory/practical) + usage hint (classes assigning it — client-joined from rosters)
ActionsEdit (note: theory/practical not updatable — update-subject.dto.ts:4-42, OQ-5)

11. Subject Assignment Matrix

Route/academics/classes/:id/assign
Endpointroster by-class; create POST /subject-assignments (subject-assignment.controller.ts:21-23); delete DELETE /subject-assignments/:id (:36-38)
PurposeFull-screen matrix: rows = assigned (subject, teacher); add = subject picker → teacher picker
NotesNo update endpoint → "Replace" = delete+create; duplicates possible server-side (OQ-4)

12. Hierarchy Explorer

Route/academics/explore
Endpointcomposition of GET /academic-years, /grades, /sections/by-grade, /classes/by-year (client-side tree join; no tree endpoint exists)
PurposeOne-screen tree: Year → Grade → Section → Class, with subject count badges; used by coordinators for gap spotting
RolesAll (read); admin/coordinator get inline quick-actions

13. Teacher Roster (by-teacher)

Route/academics/teachers/:teacherId
EndpointGET /subject-assignments/by-teacher/:teacherId?academicYearId= (subject-assignment.controller.ts:30-35)
PurposeTeacher's teaching load per year: class + subject rows; conflict spotter (same subject in 2 classes)
RolesTeacher (own, year-scoped), coordinator (any)

14. Create/Edit forms (full-screen)

Routes /…/new and /…/:id/edit for year, grade, section, class, subject — one screen per entity, field specs in 08_Form_Specifications.md.


Screen → endpoint matrix

ScreenReadsWrites
Year list / detailGET /academic-years(,/:id)POST, PATCH /:id, PATCH /:id/set-current, DELETE /:id
Grades list / detailGET /grades(,/:id), GET /sections/by-grade/:gradeIdPOST /grades, PATCH /grades/:id, DELETE /grades/:id
Sections list / detailGET /sections(,/:id)POST /sections, PATCH /sections/:id, DELETE /sections/:id
Classes list / detailGET /classes, GET /classes/by-year/:y, GET /classes/:idPOST /classes, PATCH /classes/:id, DELETE /classes/:id
Subjects list / detailGET /subjects(,/:id)POST /subjects, PATCH /subjects/:id, DELETE /subjects/:id
Assignment matrix / rosterGET /subject-assignments/by-class/:c?academicYearId=, by-teacher/:t?academicYearId=POST /subject-assignments, DELETE /subject-assignments/:id
Explorercomposition above