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

Every screen of the Transport module, its intent, route, composition, states and permissions. Authoritative components in 00-shared/03; this file enumerates which ones each screen uses with module specifics. Format mirrors auth/05.


Legend

States = idle / loading / success / empty / error(offline, 409 conflict, 404, 401) / disabled / permission. Analytics events follow {module}.{screen}.{action} (proposed; SDK open - 00-shared/10 §8).


1. Transport Overview (/transport)

FieldDetail
PurposeHub: counts + quick entry to vehicles, drivers, routes, assignment
SourceGET /transport/vehicles, GET /transport/routes, GET /transport/drivers (page=1, limit=1 cheapest) - transport.controller.ts:36-40, 66-70, 96-100; totals from meta.totalItems (transport.service.ts:75, 146, 215)
Widgets3 AppCard stat tiles (vehicles / routes / drivers) + AppListTile shortcuts + FAB "Assign student"
Statesper-tile skeleton -> counts; error -> AppErrorState per tile
Permissionstransport.vehicle.read + transport.route.read + transport.driver.read; tile hidden when permission missing (permissions.constants.ts:62-74)
Analyticstransport.overview.open (proposed)

2. Vehicles - List (/transport/vehicles)

FieldDetail
SourceGET /transport/vehicles?page&limit (defaults 1, 20), sorted by plateNumber asc (transport.controller.ts:36-40, transport.service.ts:61-76)
WidgetsAppListTile per vehicle (plateNumber, model, capacity, status AppBadge), pagination footer, FAB "New vehicle"
Row actiontap -> detail; AppMenu -> Edit / Delete (confirm)
Empty"No vehicles yet" + CTA create
Permissionslist = transport.vehicle.read; FAB/menu = .create / .update / .delete
Analyticstransport.vehicles.list (proposed)

3. Vehicles - Detail (/transport/vehicles/:id)

FieldDetail
SourceGET /transport/vehicles/:id (transport.controller.ts:42-46); 404 -> AppErrorState
ContentplateNumber, model, capacity, type (bus/van/car), status, year, color, insuranceExpiry, notes - vehicle.schema.ts:21-46
ActionsEdit (.update), Delete with dependency guard (.delete); if route references vehicle -> 409 message + navigate to routes (transport.service.ts:94-99)

4. Drivers - List (/transport/drivers)

FieldDetail
SourceGET /transport/drivers?page&limit, sorted by firstName (transport.controller.ts:96-100, transport.service.ts:201-216)
WidgetsAppListTile (full name, licenseNumber, phone, status badge: active/inactive/on_leave), pagination, FAB "New driver"
Row actiondetail; menu -> Edit / Delete
Empty"No drivers yet"
Permissionstransport.driver.* (permissions.constants.ts:70-73)

5. Drivers - Detail (/transport/drivers/:id)

FieldDetail
SourceGET /transport/drivers/:id (transport.controller.ts:102-106)
ContentfirstName, lastName, licenseNumber, phone, email, status, licenseExpiry, address, emergencyContact, joinedAt, notes - driver.schema.ts:15-46
Delete guard409 when route references driver (transport.service.ts:241-246)

6. Routes - List (/transport/routes)

FieldDetail
SourceGET /transport/routes?page&limit, sorted by name (transport.controller.ts:66-70, transport.service.ts:132-147)
WidgetsAppListTile (name, startPoint -> endPoint, stop count, status badge), pagination, FAB "New route"
Row actiondetail; menu -> Edit / Delete
Empty"No routes yet"
Permissionstransport.route.* (permissions.constants.ts:66-69)

7. Routes - Detail (/transport/routes/:id)

FieldDetail
SourceGET /transport/routes/:id (transport.controller.ts:72-76)
Contentname, startPoint, endPoint, ordered stops list, vehicle + driver refs (names when resolved; ids are raw ObjectIds in payload - route.schema.ts:26-30), status, estimatedDuration, notes
ActionsEdit (route editor), Delete (409 if assignments exist, transport.service.ts:168-171), "Assign students" shortcut

8. Route Editor w/ stops (/transport/routes/:id/edit, /transport/routes/new)

FieldDetail
PurposeCreate/update route incl. ordered stop list
Formname*, startPoint*, endPoint*, stops (reorderable {name, order} list), vehicleId picker, driverId picker, estimatedDuration, notes - create-route.dto.ts:21-60
StopsReorderableListView; order field is client-set, sent as array of {name, order} (route.schema.ts:23-24)
Conflicts409 duplicate name on create (transport.service.ts:113-116); on update name change to existing -> 409 (unique index route.schema.ts:44)
Permissionscreate = .route.create, update = .route.update

9. Assign Student to Route (/transport/assign, bottom sheet)

FieldDetail
PurposeCreate a route assignment for one student
SourcePOST /transport/assign (transport.controller.ts:120-124) with AssignRouteDto (assign-route.dto.ts:4-26)
Formroute picker, student picker, shift (morning/evening/both), optional stopName, notes
Conflicts409 "Student already assigned to this route" (transport.service.ts:252-258) - inline, offer "view existing"
Notestudent picker filtered to transportRequired students when available (student.schema.ts:53-54)

10. Student Route Assignments (/transport/students/:studentId/transport)

FieldDetail
SourceGET /transport/assignments/:studentId - assignments with populated route (transport.controller.ts:126-130, route-assignment.repository.ts:20-24)
WidgetsAppListTile per assignment (route name, shift badge, stopName, status), delete via DELETE /transport/assignments/:id (transport.controller.ts:132-136)
Empty"No route assigned" + CTA assign
Permissionstransport.assign (read context) or transport.route.read

11. Live Tracking (/transport/live) (planned)

Map of vehicles with routes + live positions. No backend surface (IMPLEMENTATION_PLAN.md:229).

12. Bus Attendance (/transport/attendance) (planned)

Boarding list per route/shift with QR scan (forward-looking).

13. Transport Fees (/transport/fees) (planned)

Fee calculation per route/student (IMPLEMENTATION_PLAN.md:229).


Shared components used

AppTextField, AppButton, AppSnackbar, AppCard, AppListTile, AppBottomSheet, AppDialog, AppMenu, AppSkeleton, AppEmptyState, AppOfflineBanner, AppFAB, AppChips, AppBadge, AppAvatar, AppErrorState, AppPagination. Module-specific: RouteStopEditor (reorderable stops), AssignmentShiftPicker, StatTile - defined in 07_Component_Library.md.

Analytics events (proposed)

transport.overview.open, transport.vehicles.{list,open,create,update,delete}, transport.drivers.{list,open,create,update,delete}, transport.routes.{list,open,create,update,delete}, transport.assign.{submit,duplicate,success}, transport.assignments.{list,remove} (all proposed).

Keyboard, landscape, tablet, desktop

  • Forms: keyboard-avoidance + scroll; tablet/desktop constrained width (00-shared/05 §2).
  • Route stop editor: full-width on phone; two-column stop list + preview on tablet.
  • Lists: master-detail on tablet; desktop hover row highlights.