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

10 — Interaction Specification (Rooms Module)

Concrete interactions per screen: gestures, focus, feedback, dialogs, motion, loading, and offline behaviour. Motion tokens per 00-shared/08, interaction baseline per 00-shared/10. All client design is (proposed) unless marked.


1. S1 — Room List

InteractionSpec
Row tappush S2 (phone); select in master-detail pane (≥ 840 dp) without pushing; hover highlight on desktop
Pull-to-refreshRefreshIndicator; bypasses cache; resets to page 1; error → snackbar with Retry
Infinite scrolltrigger at 80% viewport; fetch page+1 when hasNext; bottom spinner; dedupe by _id; failure → inline retry row (keep loaded items)
Searchdebounce 300 ms; client filter (proposed); clears on X; no results → empty state with "Clear filters"
Filter chipsmulti-select type chips; building chips derived; chip tap toggles (not navigate); selected chips show removal ×
FAB"New room" — visible only with rooms.create; tap → push /rooms/new
Row menu (proposed)delete shortcut (gated rooms.delete) → S4 dialog
Loading6 skeleton RoomCards, staggered m-fast fade-in
Feedbackmutations from S2/S4 reflected: row removed + count badge decrement; snackbar shown by originating screen

Motion: card entrance fade/slide 8 dp m-fast; refresh spinner standard; empty-state m-base fade (00-shared/08).

2. S2 — Room Detail

InteractionSpec
Backpop to S1 (list state preserved incl. filters)
Editgated rooms.update; push /rooms/:id/edit prefilled
Deletegated rooms.delete; opens S4 dialog (never inline)
Menu → "Copy code" (clipboard + snackbar "Code copied"); future "QR code" (forward-looking)
Facilitiesfirst 2 chips + "+n" button; tap → expand full list (AnimatedSize, m-fast); collapse back
Stale detailif list refresh shows the room was deleted (404) → pop + snackbar "Room no longer exists"
Offlinecached doc + banner; actions (edit/delete) disabled until online
Availability (planned)section with skeleton; empty state "No upcoming bookings"; row tap → booking detail (planned)

3. S3 — Room Editor

InteractionSpec
Save (AppBar action)validates → submit; spinner in place of icon; disabled while submitting
KeyboardEnter advances field; F3 numeric; save action (proposed) from keyboard on F6
Code fielduppercase transform + trim on input; async uniqueness check (300 ms debounce) → ✓/✗; on create only (edit: warning (proposed), server check (planned))
Type dropdownmodal/AppDropdown; selection closes and applies immediately; default classroom
Facilities chip inputtype + Enter/, → chip; backspace on empty → remove last chip; × removes; duplicates ignored; max 12 then input disabled with hint
Discarddirty + back → dialog [Keep editing][Discard]; discard pops without saving
Submit results201/200 → pop + snackbar; 409 → inline error + scroll-to-field; 400 → field errors + focus first invalid; offline → block + banner (draft kept)
Concurrent edit (proposed)server version bump (base.repository.ts:57-66); client conflict dialog on stale-base submit (planned)

Motion: field error → m-fast shake on the offending field; snackbar m-base slide.

4. S4 — Delete Dialog

InteractionSpec
Openfrom S2 menu or S1 row menu (gated rooms.delete)
Confirmtext field must equal room.name (case-sensitive) to enable Delete; mismatch → button disabled; match → enabled
Submitbutton spinner; fields disabled; no dismiss on tap-out while submitting
Successdialog closes; if on S2 → pop to S1; row removed; snackbar "Room deleted"
404dialog closes; snackbar "Room not found — it may already be deleted"
Network faildialog stays; snackbar "Couldn't delete — Retry"
Cancel / tap-outcloses; analytics rooms.delete.cancel
In-use warning (proposed)copy "This room may be referenced by timetables or bookings" — server in-use guard (planned) (OQ-4)

5. Loading & feedback matrix

ActionOptimistic?Loading UISuccessFailure
List load / load-morenoskeletons / bottom rowcardsretry row / snackbar
Detail loadnoskeletonprofileerror state + Retry
Create / updateno (server authoritative)button spinnerpop + snackbarinline errors / snackbar
Deletenodialog spinnerpop + snackbarsnackbar
Copy codeyes (clipboard)snackbar "Copied"

6. Offline & connectivity

  • Reads: last-good cache + AppOfflineBanner (no module offline queue — reference data).
  • Writes: blocked with inline banner "You're offline"; draft preserved in cubit memory.
  • Reconnect: banner clears; user re-triggers (pull-to-refresh / re-submit).

7. Motion budget

MotionTokenUse
Entrancem-fastcards, detail fade, chips
Feedbackm-fastpress states, error shake
Transitionsm-baseroute push/pop, snackbar
Expansionm-basefacilities expand/collapse (AnimatedSize)