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

09 — User Behaviour (Organizations Module)

Expected behaviours, mistakes, fast paths, persona-class needs, interrupted sessions, retries, abandonment, frustrations + UX solutions. Derived from code semantics.


1. Behavioural expectations

ContextExpected behaviourWhy (source)
Save profile → overviewOverview reflects change instantlyPATCH returns updated doc (organizations.service.ts:124-126); client reconciles
Toggle a feature flagImmediate flip, rollback on failurefull-replace map API (organizations.service.ts:144-154) → optimistic per 00-shared/06 §3.5
Change working daysAffects future attendance counts only; no retro warningsettings replace semantics (:129-137)
Delete tenantRow gone immediately; understood as reversible 30 dayssoft delete (organizations.repository.ts:60-66) + purge worker (tenant-purge.worker.ts:32-42)
Create tenant with name "St. Mary's School"Slug auto = st-marys-schoolslugify (organizations.service.ts:161-169) — user expects predictability; show preview (F1 SlugPreview)
Change plan/statusBanner/status updates everywherePATCH $set (:124)

2. Common mistakes + corrections

MistakeUX solution
Mistyped slug/domain → 409Inline field error + suggested alternatives (name-derived slug via SlugPreview)
Editing slug late (admins already registered with it)Pre-submit confirm dialog: "Existing admins keep working; new registrations must use the new slug"
Saving one settings tab → siblings wipedFull-object save model (S4); dirty-dot per tab; "Save all" only; never per-tab save
Toggling flags fast (double-tap)Anti-double-submit on toggle; final state from server reconcile
Register with wrong tenant slug(forward-looking) pre-submit hint + "tenant not found" guidance on login failure; server validation (planned) OQ-2
Deleting the wrong tenantTyped confirm (type org name) — 00-shared/05 §5
Setting timezone/currency via free textSearchable picker sheets; free text still allowed server-side (@IsString) but discouraged
Half-day threshold < late thresholdCross-field validation hint (proposed)

3. Fast paths

  • Desktop: N new tenant (S7); Ctrl+K global search; Enter submits forms (M §2).
  • Overview → any edit surface in 1 tap (toolbar actions); settings deep link from onboarding banner.
  • Toggle rows don't require save (flags are immediate); settings require explicit "Save all" (destructive-ish).
  • Tenants list keeps sort/search while paging (debounced q, pagination-query.dto.ts:21-29).

4. Power users

Platform Super Admins batch-provision: support multi-select on list (proposed) and keyboard-driven status change; expect meta.totalItems accuracy after each delete (refetch meta).

5. New users

  • First-run: onboarding banner drives them to S4 (academic year + attendance) before other modules.
  • Invited admin: registration pre-fill from invite context (forward-looking); slug handoff copy in S8 create success.

6. Expert users

  • Keyboard-only desktop flows; expect status change without dialog navigation friction (menu → confirm → done ≤3 steps).
  • Expect full settings object integrity — Surface "last saved {time}" per tab.

7. A11y users

  • VoiceOver/TalkBack: badge states, toggle results, error focus (A §5, §10); color picker hex fallback; never color-only status.
  • Keyboard: focus order = toolbar → search → filters → list; ESC closes menus/sheets; typed confirm dialog traps focus (A §6).

8. Interrupted sessions & retries

InterruptionBehaviour
App kill mid-formForm drafts lost (in-memory only) — guidance: save early; (proposed) autosave to prefs
Network loss mid-savePending spinner → error snackbar "Couldn't save — retry" (idempotent PATCH; safe to retry)
401 mid-saveSilent refresh → replay; refresh failure → session-expiry overlay, draft preserved (00-shared/06 §3.6)
Rate limited (429)"Too many requests — retry in Ns", backoff, no auto-retry (07_API_Conventions.md §4)
5xxGeneric + requestId; retry offered (never surface internals — http-exception.filter.ts:60-64)

9. Abandonment

  • Cancel edit → unsaved-guard dialog (Keep editing / Discard); discard = back, no server call (nothing sent until submit).
  • Tenants list pagination resets on filter change — fine (page 1); note: page beyond totalPages returns empty list (meta still says hasNext:falsepagination-query.dto.ts:46-53) → show "End of results".

10. Frustrations + UX solutions

FrustrationRoot causeSolution
"Why is my org missing?"OQ-1 — no self-org endpoint(planned) /organizations/me; stopgap lookup documented; never guess
"My settings disappeared"full-replace $set {settings} (organizations.service.ts:134)full-object save model + wipe-prevention QA (S4)
"Which settings apply?"dual surfaces: embedded vs settings collection (OQ-6)visual separation + copy on reference tabs
"I see other schools!"unscoped list + unguarded controller (OQ-4)platform-only gating client-side; server scope (planned)
"Flag toggle didn't stick"full-map replace races (last-write-wins)optimistic + reconcile + pull-to-refresh; WS push (forward-looking)
"Delete isn't permanent?"30-day purge retentionexplicit snackbar/copy "purged after 30 days"; no restore endpoint (ops-only)