Files
jobtrackingapp/docs/redesign/phase-5/NAVIGATION_MIGRATION.md

96 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Navigation migration
P5-07 successor: `/analytics` is now the authenticated **Insights → Analytics** destination with the retained existing reports. The 31 original patterns below remain, plus this one addition (32 total). Dashboard stays `/dashboard`; its old Analytics breadcrumb is corrected to Home → Dashboard. Analytics uses Home → Insights → Analytics, with the supported 6/12/24-month selection in `?months=`. [Implementation/evidence](p5-07/README.md). No Documents/Admin destination or expanded command catalogue is implied; earlier planning text below remains historical.
Source: current [App](../../../job-tracker-ui/src/App.tsx), [AppShell](../../../job-tracker-ui/src/layout/AppShell.tsx), [Phase 3 route contract](../phase-3/ROUTE_PLAN.md). P5-01 changes navigation presentation; it does not replace the router, providers or page owners.
## P5-01 visible shell contract
Use the existing 254px expanded / 84px collapsed sidebar and <768px modal drawer as starting dimensions. Use MUI semantic navigation/surface/action/focus tokens and P4 typography/gutters. Existing provisional indigo, Archivo/system type, name and mark remain substitutable; no final branding decision. Calm neutral surfaces, restrained borders/depth, compact labelled groups and useful content width; no gradient/glass treatment, new card grid or giant heading.
Desktop: sidebar identity, Dashboard, Job search, Career, Account, authorized Admin; utility bar contains command trigger, bell and account access. Insights is inserted only when P5-07 supplies real content. One contextual title below utilities, no repeated page/job/CV header. Keep existing width opt-ins (Settings reading; other pages unchanged until migrated). No second theme/preferences store.
Expanded primary rows: icon + name + selected indicator; selected and keyboard focus remain distinct. Group labels are quiet but readable, not color-only. Child destinations use an indented, labelled secondary list under their owner. Retain reminder count. Collapsed rail keeps accessible names and readable tooltips; Jobs/Settings/Admin secondary destinations remain reachable via a keyboard-operable labelled menu, not hover-only. Selecting a child marks its parent current while identifying the actual child. Career Profile and CVs require explicit matching so `/career/builder/:id` never highlights Career Profile.
Mobile: full visible labels regardless of desktop collapse, one modal drawer with all groups/children in scrollable flow; no app-bar overlay on first focus, no nested traps. Global search/bell/account remain reachable; long version/name moves into the account disclosure when necessary, with the same authorized information. Closing returns focus; successful navigation focuses the destination heading; cancelled dirty navigation preserves draft/focus. Skip-to-main and navigation landmarks must be real. No bottom navigation added.
Keep existing children visible in shell secondary navigation until their workspace offers a proven replacement. A move is atomic: new reachable destination and tests land before removal of its old entry. P5-03 may introduce a Jobs secondary row, without duplicating those as new **primary** destinations. Narrow secondary rows use the existing labelled-selector pattern. Job detail gets Jobs/Back context, not two stacked navigation bars plus its tabs.
## Every current menu and utility entry
| Current entry | P5-01 home / initial behavior | Later disposition / condition | PRES |
|---|---|---|---|
| Dashboard | Ungrouped Home primary, `/dashboard` | Same route, P5-06 content | E07, S01, S02 |
| Job applications | Job search → Jobs primary, `/jobs` | Tracked Table default; P5-03 | J03–J06 |
| Discover jobs | Jobs secondary, `/discover` | Jobs secondary row; discovery owner unchanged | J01, J02 |
| Reminders + count | Jobs secondary, label Follow-ups, `/reminders` | Retain count and all reasons, not just overdue rows | W11 |
| Kanban board | Jobs view switch, `/jobs?view=board`; `/kanban` retained | P5-04b integrates after proven parity; alias replaces history and preserves query/hash/state | J07 |
| Companies | Jobs secondary, `/companies` | Preserve `?edit=id`, contacts/history | J08 |
| Offer comparison | Jobs secondary, `/offers` | Retain recorded offer comparison, no new salary model | J09 |
| Job email / Correspondence | Job search → Correspondence **primary**, `/correspondence` | Inbox, Drafts, Review remain independent; not hidden in Documents | M01–M06 |
| Career workspace | Career → Career Profile, `/career` | Canonical facts; page remains Phase 7 | C01–C04 |
| CV Builder | Career → CVs, `/career/builder` | Library retained, editor P5-09+ gated | C05–C12 |
| Trash | Jobs secondary utility, `/trash` | Explicit reachable label; P5-03 table reuse; no permanent delete | J06 |
| Audit log | Authorized Admin → Audit, `/admin/audit` | No empty `/admin` landing or aggregate user scraping | A02 |
| Users | Authorized Admin → Users, `/admin/users` | Admin group trigger may open children, not an invented dashboard | A01 |
| System | Authorized Admin → System, `/admin/system` | Retain operational tools, not personal analytics | A03 |
| Profile | Settings secondary + account menu → Account & security, `/profile` | Remove duplicate primary only with both accessible links present; no form relocation | E04–E06 |
| Settings | Account → Settings primary, `/settings` | Existing tabs and mobile selector retained | S03–S05, J10 |
| Account-menu profile/settings/sign out | Account menu, same callbacks | Appearance/language shortcuts reuse current handlers; no new auth/session owner | E05–E09 |
| Current language/theme controls | Remain reachable in shell/account area | Existing preferences; UI locale distinct from CV document locale | E08, S03 |
| Quick search; six commands; job/company results | Same trigger + Ctrl/Cmd+K in P5-01 | P5-02 presentation/keyboard/error improvements; no missing future commands | E07, J03, J08 |
| Bell / unread count | Same NotificationsPopover and store | P5-02 recent-list presentation, no new producer | S02, W11, W12 |
| Operations from notifications/workflow | Utility in notification/account activity access, `/operations` | Keep progress/retry/cancel reachable; no admin conflation | W12 |
| Connected accounts from Settings | Settings secondary/account connection link, `/settings/connected-accounts` | Mail/calendar grants remain distinct from sign-in linking | M06, E03 |
| Add job on Jobs + command Add + capture links | Retain existing AddJobModal/open callbacks and query review | No automatic creation by route mounting or palette activation | J03, J04 |
| Admin version/commit metadata | Admin-only account/header disclosure, responsive | Keep both values available; no public operational metadata expansion | A03, E07 |
Proposed but absent: **Documents** waits for bounded owner-scoped cross-job metadata reads and package proof (Phase 7/NEW-11); **Analytics** becomes meaningful in P5-07; expanded **Notifications** route is deferred; aggregate **Admin dashboard** needs NEW-08/OD-09. Do not show dead/disabled placeholders or claim a complete Documents index. Existing job Documents/CV links stay reachable. Contextual AI stays in its real domain; no global AI page/panel is added by this shell plan.
## All 31 original patterns retained; one Analytics addition
No compatibility removal date is approved. Each row retains refresh, direct entry, authorization and safe error behavior. Wildcard/fallback infrastructure and inner root redirect also remain but are not counted as pages. The P5-07 `/analytics` addition makes **32** patterns; `/kanban` remains counted even if later an alias.
| Current pattern | P5 destination / compatibility decision | Owner slice | PRES |
|---|---|---|---|
| `/` | Public landing / existing authenticated redirect unchanged | 01 regression only | E01 |
| `/login` | Existing auth/challenge entry | 01 regression only | E02–E04 |
| `/register` | Existing configured registration | 01 regression only | E02 |
| `/forgot-password` | Existing reset request | 01 regression only | E02 |
| `/reset-password` | Existing token query | 01 regression only | E02 |
| `/verify-email` | Existing token query | 01 regression only | E02 |
| `/confirm-email-change` | Existing pending identity confirmation | 01 regression only | E06 |
| `/microsoft-legacy-relink` | Existing recovery/relink | 01 regression only | E03 |
| `/cv/:slug` | Published-only public page/PDF, never numeric redirect | 09–14 regression | C05, C12 |
| `/dashboard` | Home | 06, 07 | S01, S02 |
| `/analytics` (P5-07 addition) | Insights → existing personal reports | 07 | S01, S02, E07–E09, J05/J09 |
| `/discover` | Jobs → Discover | 01, 03 link only | J01, J02 |
| `/jobs` | Jobs → Tracked; Table default | 03, 04b | J03–J07 |
| `/jobs/:id` | Dedicated job workspace | 08a, 08b | W01–W12, M01, M02 |
| `/reminders` | Jobs → Follow-ups | 01 link only | W11 |
| `/operations` | Notification/account activity utility | 01, 02 link only | W12 |
| `/kanban` | P5-04b direct replace to `/jobs?view=board`, retaining other query/hash/state | 04a, 04b | J07 |
| `/companies` | Jobs → Companies, preserve `?edit=id` | 01, 02 link only | J08 |
| `/offers` | Jobs → Offers | 01 link only | J09 |
| `/correspondence` | Correspondence primary; inbox/drafts/review | 01 link only | M01–M06 |
| `/correspondence/review` | Keep current alias to `/correspondence?view=review` | 01 regression only | M05 |
| `/profile` | Settings → Account/security; same page | 01 link only | E04–E06 |
| `/applications/:id` | Keep alias to `/jobs/:id` with search/state | 01, 08b | W01 |
| `/career` | Career Profile, current section queries | 01 link only | C01–C04 |
| `/career/builder` | CVs library unchanged | 01 link only | C05 |
| `/career/builder/:id` | Identified CV editor, gated redesign | 09–14 | C06–C12 |
| `/admin/audit` | Authorized Admin → Audit | 01 link only | A02 |
| `/admin/users` | Authorized Admin → Users | 01 link only | A01 |
| `/admin/system` | Authorized Admin → System | 01 link only | A03 |
| `/trash` | Jobs utility; deleted-only restore/edit | 01, 03 | J06 |
| `/settings` | Account → Settings; tabs unchanged | 01, 02 integration only | S03–S05, J10 |
| `/settings/connected-accounts` | Settings → Connections | 01 link only | M06, E03 |
## Query and lifetime acceptance
Use the complete [Phase 3 query/section tables](../phase-3/ROUTE_PLAN.md#query-state-and-compatibility-contract), including `q`, `status`, `companyId`, `location`, `needsFollowUp`, `readiness`, `includeDeleted`, `sortBy`, `sortDir`, `page`, capture `add`/`addtext`, `from`/`focusJobId`, `section`, `followMode`, company edit and correspondence review. Preserve unrelated safe query metadata when a view/section changes; do not carry sensitive tokens into titles/history. Unknown keys select a safe view without writes. Keep current numeric tab adapters and aliases before adding new canonical sections in P5-08b.
Current React Routes mount page owners; do not assume the Jobs component stays mounted behind a job detail. URL restores filter/page context and return state restores row focus; local selection/density lifetime must be characterized in real App, separately from a mounted component fixture. New view switching must make clearing/retaining page-scoped selection explicit. Never silently persist private list/draft state to solve navigation.
Keep `App` session-invalidated unmount outside `Application`; Toast → Theme → I18n → Confirm → Prompt → ThemeControls → Router and private AccountPlan ownership unchanged. Keep the existing router authority and auth resolution, callback origin/state handling and safe denied admin API result. Theme change must not remount dirty forms. For each migrated route test direct URL, refresh, Back/Forward, legacy query, missing/foreign object, permissions, dirty Cancel/Discard and account switch before claiming parity.