6.0 KiB
6.0 KiB
Session Handoff: Nuxt Migration — Phases 3–5 Complete
Date: 2026-03-19 Session Focus: Auth, all stores, all pages, all layouts, all components Context at Handoff: High — recommend fresh session for Phase 6+
What Was Accomplished
- Phase 3 — Auth (stores/auth.ts, middleware, callback page, plugin)
- Phase 4 — All 7 non-task stores
- Phase 5 — All pages, layouts, and non-task components
Exact State of bab-app-nuxt
Layouts
app/layouts/default.vue— MainLayout port; readsroute.meta.titlefor header titleapp/layouts/admin.vue— AdminLayout port; tabs updated to/admin/userand/admin/boatapp/app.vue— Updated to<NuxtLayout><NuxtPage /></NuxtLayout>
Pages (all created)
| Nuxt Path | Old Path | Notes |
|---|---|---|
pages/index.vue |
IndexPage.vue |
Uses useNavLinks() composable |
pages/login.vue |
LoginPage.vue |
layout: false; magic link onMounted removed (→ auth/callback.vue) |
pages/auth/callback.vue |
(new) | Handles ?userId=&secret= from magic link |
pages/boat.vue |
BoatPage.vue |
|
pages/profile.vue |
ProfilePage.vue |
|
pages/certification.vue |
CertificationPage.vue |
|
pages/checklist.vue |
ChecklistPage.vue |
|
pages/schedule.vue |
SchedulePageView.vue |
Parent wrapper; <NuxtPage /> |
pages/schedule/index.vue |
ScheduleIndexPage.vue |
|
pages/schedule/book.vue |
BoatReservationPage.vue |
|
pages/schedule/view.vue |
BoatScheduleView.vue |
|
pages/schedule/list.vue |
ListReservationsPage.vue |
|
pages/schedule/edit/[id].vue |
ModifyBoatReservation.vue |
|
pages/schedule/manage.vue |
ManageCalendar.vue |
requiredRoles: ['Schedule Admins'] |
pages/reference.vue |
ReferencePage.vue |
Parent wrapper |
pages/reference/index.vue |
ReferenceIndexPage.vue |
|
pages/reference/reference/[id]/view.vue |
ReferenceItemPage.vue |
Double reference path preserved from old routes |
pages/admin/user.vue |
UserAdminPage.vue |
layout: 'admin', requiredRoles: ['admin'] |
pages/admin/boat.vue |
BoatAdminPage.vue |
layout: 'admin', requiredRoles: ['admin'] |
pages/signup.vue |
SignupPage.vue |
STUB — password auth removed; shows "contact admin" |
pages/pwreset.vue |
ResetPassword.vue |
STUB — password auth removed |
pages/terms-of-service.vue |
TermsOfServicePage.vue |
layout: false |
pages/privacy-policy.vue |
PrivacyPolicyPage.vue |
layout: false |
pages/[...slug].vue |
ErrorNotFound.vue |
Catch-all 404 |
Components (all created under app/components/)
boat/BoatComponent.vue— stubboat/BoatPickerComponent.vueboat/BoatPreviewComponent.vueCertificationComponent.vueReferencePreviewComponent.vueBoatReservationComponent.vueResourceScheduleViewerComponent.vue— abandoned/retained for referencescheduling/NavigationBar.vuescheduling/ReservationCardComponent.vue— named route updated to/schedule/edit/${id}scheduling/BoatSelection.vue— empty stubscheduling/IntervalTemplateComponent.vuescheduling/boat/BoatScheduleTableComponent.vuescheduling/boat/CalendarHeaderComponent.vueLeftDrawer.vue— usesuseNavLinks()composable; logout viaauthStore.logout()BottomNavComponent.vue
Utils added
app/utils/navlinks.ts—useNavLinks()composable (replaces module-levelenabledLinks)app/utils/version.ts—APP_VERSION = '0.0.0'app/assets/— All assets copied from old project
Skipped (task feature parked)
task/TaskEditPage.vue,task/TaskPage.vue,admin/TaskAdminPage.vuetask/TaskEditComponent.vue,task/TaskListComponent.vue,task/TaskCardComponent.vue,task/TaskTableComponent.vueNewPasswordComponent.vue(password auth removed)
Key Decisions Made This Session
- ToolbarComponent dropped — layout
default.vuehandles title viaroute.meta.title. Pages usedefinePageMeta({ title: '...' })instead. - Public pages pattern —
definePageMeta({ public: true, layout: false })for all auth-less full-layout pages - Magic link redirect —
/auth/callback(not/login) — matches Phase 3 decision - signup.vue / pwreset.vue as stubs — password auth removed; stubs show redirect message. CONFIRMED.
- navlinks.ts → composable — original had module-level
useAuthStore()which would break in Nuxt; converted touseNavLinks()composable - Nuxt named routes not used — all navigation uses explicit paths (
/schedule/edit/${id}not{ name: 'edit-reservation' }) to avoid Nuxt route name collisions
Open Questions
- OPEN:
task/taskTags/skillTagscollections — will they ever be created inbab_prod? - RESOLVED:
signup.vue— admin-only invite is permanent.signup.vuestub is the final state; self-service registration will not be built.
What NEXT Session Should Do
- Phase 6 — Build & Test
- Run
yarn devinbab-app-nuxt/— verify dev server starts clean - Navigate to
/login— verify page renders - Test login flow (magic link or OTP)
- Navigate through key pages post-login
- Fix any TypeScript or import errors that surface
- Run
- Phase 7 — nuxt.config.ts QCalendar registration
@quasar/quasar-ui-qcalendaris imported directly in components — verify this works in Nuxt (no plugin registration needed if imported directly)- If calendar components don't render, add CSS import to
nuxt.config.ts
- Phase 8 — Deploy (if Phase 6 passes)
yarn generate→ verify.output/public/built correctly- Update Ansible deploy playbook if needed (path may differ from old
dist/)
Files to Load Next Session
bab-app-nuxt/nuxt.config.ts— check QCalendar CSS import, verify PWA configbab-app-nuxt/package.json— verify no missing deps- Any error output from
yarn dev
What NOT to Re-Read
- All files in
bab-app-nuxt/app/— just created; content known - All files in
bab-app/src/— fully migrated; do not re-read