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

Every screen of the Homework module, its intent, route, composition, states, permissions, platform behavior, and events. Authoritative components in 00-shared/03; module components in 07_Component_Library.md. Analytics events follow {module}.{screen}.{action} (proposed).


Legend

States = idle / loading / success / empty / error(offline, 404, 409, network) / disabled / permission. Role gating is client-side UI policy (server has no homework RBAC — OQ-9).


1. Homework List (teacher: class-filtered) /homework

FieldDetail
PurposeBrowse homework of one class, sorted by due date desc (homework.repository.ts:20)
EntryHomework tab; role-default class preselected; returns to after detail/edit
Exit→ detail; → create; → edit; class switch
InputsClass filter AppDropdown (from Academics module), AppSearchBar (client-side filter; no q param on API)
CompositionClass selector header + AppSectionHeader ("Due soon" / "Past due" client groups) + homework cards + AppFAB "New homework" (teacher)
Statesloading AppSkeleton(list); empty AppEmptyState ("No homework for this class"); error AppErrorState (404 class invalid → "Class not found"); offline cached + banner
SourceGET /api/v1/homework/class/:classIdarray (non-paginated; no meta — client renders all)
Row actionsAppMenu: Edit, Delete (teacher/admin); student: none
Analyticshomework.list.open, homework.list.filter_class, homework.list.search
Adaptivephone full-width cards; tablet/desktop 2-col grid + master-detail detail pane
a11yrow semantics button, card label = title + subject + due; FAB labeled "New homework"

2. Homework List (student: my class) /homework

FieldDetail
PurposePending/assigned homework for the student's class
EntryHomework tab (student)
Differences from #1Class fixed = student profile classId (Students module); no FAB; no edit/delete; card shows my submission state chip (none/submitted/graded+marks)
My-state sourceGET /homework/:id/submissions filtered client-side by my studentId — per-card fetch only for visible cards (proposed: server flag); OQ-6
Statesas #1; plus "Submitted" chip state
Analyticshomework.list.open, homework.student.view

3. Homework Detail /homework/:id

FieldDetail
PurposeFull homework: title, subject, class, description, attachments, due date, status, assigned date; role-shaped actions
SourceGET /homework/:id → 404 RESOURCE_NOT_FOUND "Homework not found." (homework.service.ts:47)
CompositionHeader (title + subject chip + status badge), meta block (class, teacher, assignedDate, dueDate via AppInfoRow), AppMarkdownViewer description, AppAttachmentList (download/preview), role-actions: teacher → Edit/Delete menu + "Submissions (N)"; student → Submit CTA or submission/grade block; parent → read-only
Student blockif no submission: AppButton "Submit"; if submitted: status chip + submittedAt; if graded: marks + remarks + gradedAt
Statesloading skeleton; 404 empty state ("This homework was removed"); offline banner
Analyticshomework.detail.open
Adaptivemaster-detail right pane ≥ 840 dp

4. Create / Edit Homework Form /homework/new, /homework/:id/edit

FieldDetail
PurposeCreate (POST /homework) or edit (PATCH /homework/:id)
Fieldstitle (req), description (opt), class (req, create only — immutable after), subject (req, create only), dueDate (req), attachments (opt), status (edit only: active/closed) — exact fields CreateHomeworkDto / UpdateHomeworkDto (homework.dto.ts:4-58)
Exitsuccess → detail; back → draft prompt (create)
Statesvalidation per 08_Form_Specifications.md; 400 field errors; 5xx kept-form
Analyticshomework.create.submit, homework.create.success, homework.edit.submit

5. Submission Form /homework/:id/submit (or sheet)

FieldDetail
PurposeOne-time student submission: remarks + optional attachments
SourcePOST /homework/:id/submit (SubmitHomeworkDtosubmission.dto.ts:4-17)
Preconditionno existing submission for (studentId, homeworkId) — server 409 guard (homework.service.ts:88-92)
Compositionremarks AppTextField (multiline), AppAttachmentUploader (file.upload), Submit button
Statesuploading (progress per file), submitting (button spinner), success → detail "Submitted"; 409 → "Already submitted" info state (navigates to detail); 404 → removed
Analyticshomework.submit.start, homework.submit.success, homework.submit.duplicate

6. Submissions List (teacher) /homework/:id/submissions

FieldDetail
PurposeAll submissions of one homework for grading
SourceGET /homework/:id/submissions → array (non-paginated)
CompositionAppSectionHeader "N submitted"; rows: student name, submittedAt, status chip (submitted/graded), marks badge if graded, attachment icons, late badge (client-computed)
Row actiontap → grading sheet (graded rows open read-only w/ regrade path)
Statesloading; empty (AppEmptyState "No submissions yet"); 404
Analyticshomework.submissions.open, homework.submissions.grade_open

7. Grading Sheet /homework/:id/submissions/:submissionId

FieldDetail
PurposeGrade one submission: marks + remarks
SourcePATCH /homework/:id/submissions/:submissionId/grade (GradeSubmissionDtosubmission.dto.ts:19-26)
Compositionstudent header, submittedAt, attachment previews, marks AppTextField (numeric, client-validated ≥ 0 — OQ-4), remarks field, "Grade" button; regrade mode shows existing grade + overwrite warning
Statesgrading (button spinner); 404 "Submission not found."; 400 (client validation); success → row updated + snackbar
Analyticshomework.grade.submit, homework.grade.regrade

8. Grade Feedback View (student) — within /homework/:id

FieldDetail
PurposeShow marks + teacher remarks to the student
Sourcefrom GET /homework/:id/submissions (own row) or the submit response
Compositionsuccess-mark card (marks, tabular figures), AppMarkdownViewer remarks, gradedAt/submittedAt, attachments
Analyticshomework.feedback.view

9. Attachment Preview / Download (shared surface)

FieldDetail
PurposePreview or download homework/submission attachments
SourceGET /files/:id/download → stream with Content-Disposition (files.controller.ts:55-64); requires file.read
BehaviorPDF/image → in-app viewer; other types → share sheet/external app; long-press menu (Save, Share)
Statesdownloading (progress), error (404 file removed)

Shared components used

AppListTile, AppCard, AppButton, AppTextField, AppDropdown, AppDatePicker, AppMarkdownViewer, AppAttachmentTile, AppBadge, AppChips, AppMenu, AppDialog, AppBottomSheet, AppSkeleton, AppEmptyState, AppErrorState, AppOfflineBanner, AppFAB, AppSnackbar, AppSectionHeader, AppInfoRow. Module-specific: HomeworkCard, SubmissionRow, LateBadge, AttachmentUploader, GradeSheetBody, SubmissionStatusChip — defined in 07_Component_Library.md.

Analytics events (proposed, 00-shared/10 §8)

homework.list.{open,filter_class,search}, homework.create.{submit,success,failed}, homework.detail.open, homework.edit.{submit,success}, homework.delete.{confirm,success}, homework.submit.{start,success,duplicate,failed}, homework.grade.{open,submit,regrade}, homework.feedback.view, homework.attachment.{preview,download,failed}.

Keyboard, landscape, tablet, desktop

  • Forms: keyboard-avoidance + scroll; Enter submits single-field steps.
  • Grade sheet on desktop: full-width split — submissions list left, grade form right.
  • List: 2-column at ≥ 600 dp; 3-column ≥ 1200 dp.