fix(ui): layout fixes
This commit is contained in:
101
docs/summaries/handoff-2026-03-15-build-fixes.md
Normal file
101
docs/summaries/handoff-2026-03-15-build-fixes.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# Session Handoff: Build Fixes & Dev Environment
|
||||
**Date:** 2026-03-15
|
||||
**Session Duration:** ~2 hours
|
||||
**Session Focus:** Resolve all TypeScript/ESLint build errors from dependency updates; fix dev server startup
|
||||
**Context Usage at Handoff:** Medium
|
||||
|
||||
## What Was Accomplished
|
||||
|
||||
1. Fixed 30 TypeScript errors (14 files) → build now passes with 0 errors
|
||||
2. Fixed 12 ESLint problems (6 errors, 6 warnings) → 0 remaining
|
||||
3. Fixed `quasar dev` startup error (`FlatESLint is not a constructor`) → downgraded ESLint v10→v9
|
||||
4. Fixed missing Appwrite env vars in `.env.local` → app connects to backend on dev
|
||||
|
||||
## Exact State of Work in Progress
|
||||
|
||||
- **Build**: CLEAN — `yarn quasar build` exits 0, no TS or ESLint errors
|
||||
- **Dev server**: FUNCTIONAL — `quasar dev` starts without errors; ESLint inline checking via `vite-plugin-checker` is restored
|
||||
- **Runtime**: UNTESTED this session — app has not been manually tested against the dev Appwrite backend
|
||||
|
||||
## Decisions Made This Session
|
||||
|
||||
- **`as unknown as Type` for all Appwrite store casts** — CONFIRMED: Appwrite v23 made `DefaultDocument` strict; it no longer overlaps domain types, so the double-cast is required. Applied to: `boat.ts`, `interval.ts`, `intervalTemplate.ts`, `reservation.ts`, `task.ts`
|
||||
- **ESLint downgraded v10.0.3 → v9.39.4** — CONFIRMED: `vite-plugin-checker` v0.12.0 calls `FlatESLint` which was merged back into `ESLint` in v10; v9 preserves the API. Also downgraded `@eslint/js` (v10→v9) and `eslint-plugin-vue` (v10→v9)
|
||||
- **`getWeekdaySkips` removed** — CONFIRMED: removed from `@quasar/quasar-ui-qcalendar` API; `createDayList` now takes `weekdays` array directly as 4th param (previously took `weekdaySkips` computed value)
|
||||
- **`subtasks` removed from TaskCardComponent template** — ASSUMED SAFE: `Task` type has no `subtasks` field; template refs were dead code. See open question.
|
||||
- **`no-debugger: 'off'`** — CONFIRMED: hardcoded because `process` is not available in ESLint globals when linting `.js` files (config file context)
|
||||
- **`.env.local` variable names corrected** — CONFIRMED: file had `VITE_APPWRITE_ENDPOINT` / `VITE_APPWRITE_PROJECT`; `appwrite.ts` reads `VITE_APPWRITE_API_ENDPOINT` / `VITE_APPWRITE_API_PROJECT`
|
||||
|
||||
## Key Numbers Generated or Discovered This Session
|
||||
|
||||
- TypeScript errors at session start: 30 (across 14 files)
|
||||
- ESLint problems at session start: 12 (6 errors, 6 warnings)
|
||||
- TypeScript errors at session end: 0
|
||||
- ESLint problems at session end: 0
|
||||
- ESLint: v10.0.3 → v9.39.4
|
||||
- `@eslint/js`: v10 → v9
|
||||
- `eslint-plugin-vue`: v10 → v9
|
||||
- `register-service-worker`: newly added (was missing from package.json)
|
||||
|
||||
## Conditional Logic Established
|
||||
|
||||
- IF Appwrite SDK returns `DefaultDocument` THEN cast via `as unknown as DomainType` BECAUSE v23 `DefaultDocument` is strict and no longer assignable to domain types that extend `Partial<Models.Document>`
|
||||
- IF `vite-plugin-checker` is v0.12.x THEN ESLint must be v9.x BECAUSE v0.12.x uses `FlatESLint` constructor removed in ESLint v10
|
||||
- IF `createDayList` is called from qcalendar THEN pass `weekdays` array as 4th arg directly BECAUSE `getWeekdaySkips` was removed from the qcalendar public API
|
||||
- IF `.env.local` is updated THEN variable names must match `import.meta.env.VITE_APPWRITE_API_ENDPOINT` / `VITE_APPWRITE_API_PROJECT` as read in `src/boot/appwrite.ts`
|
||||
|
||||
## Files Created or Modified
|
||||
|
||||
| File Path | Action | Description |
|
||||
|-----------|--------|-------------|
|
||||
| `src/stores/boat.ts` | Modified | `as unknown as Boat[]` |
|
||||
| `src/stores/interval.ts` | Modified | `as unknown as Interval` (3 places) |
|
||||
| `src/stores/intervalTemplate.ts` | Modified | Map callback cast + `as unknown as IntervalTemplate` (3 places); `timeTuple` cast |
|
||||
| `src/stores/reservation.ts` | Modified | `as unknown as Reservation` (5 places) |
|
||||
| `src/stores/task.ts` | Modified | `as unknown as Task[]`, `TaskTag[]`, `SkillTag[]`, `Task` (5 places) |
|
||||
| `src/stores/sampledata/schedule.ts` | Modified | `id`→`$id`, `blocks`→`timeTuples`, removed `reservationDate` |
|
||||
| `src/components/boat/BoatPreviewComponent.vue` | Modified | `boat.id` → `boat.$id` |
|
||||
| `src/components/scheduling/boat/BoatScheduleTableComponent.vue` | Modified | `block.id`→`block.$id`; `NodeJS.Timeout`→`ReturnType<typeof setInterval>`; ternary→if/else |
|
||||
| `src/components/scheduling/boat/CalendarHeaderComponent.vue` | Modified | Removed `getWeekdaySkips` import+computed; `createDayList` now passes `weekdays` directly |
|
||||
| `src/components/task/TaskCardComponent.vue` | Modified | Removed `defineProps` explicit import; removed `subtasks` template refs |
|
||||
| `src/components/task/TaskListComponent.vue` | Modified | `task.id` → `task.$id` |
|
||||
| `src/components/task/TaskTableComponent.vue` | Modified | Removed `defineProps` from explicit import |
|
||||
| `src/components/ResourceScheduleViewerComponent.vue` | Modified | Removed `|| undefined`; `catch { }`; removed stale eslint-disable comments |
|
||||
| `src/pages/LoginPage.vue` | Modified | `catch { }` |
|
||||
| `src/pages/schedule/ManageCalendar.vue` | Modified | `block.id` → `block.$id` |
|
||||
| `src/boot/appwrite.ts` | Modified | Removed stale `console.log(API_ENDPOINT)` |
|
||||
| `eslint.config.js` | Modified | `no-debugger` hardcoded to `'off'` |
|
||||
| `quasar.config.ts` | Modified | ESLint checker restored (had been temporarily removed) |
|
||||
| `package.json` / `yarn.lock` | Modified | ESLint v10→v9; `@eslint/js` v10→v9; `eslint-plugin-vue` v10→v9; added `register-service-worker` |
|
||||
| `.env.local` | Modified | Variable names corrected: `VITE_APPWRITE_ENDPOINT`→`VITE_APPWRITE_API_ENDPOINT`, `VITE_APPWRITE_PROJECT`→`VITE_APPWRITE_API_PROJECT`; endpoint URL updated to include `/v1` |
|
||||
| `docs/summaries/handoff-2026-03-15-build-fixes.md` | Created | This file |
|
||||
| `docs/archive/handoffs/handoff-2026-03-15-dependency-updates.md` | Archived | Superseded by this handoff |
|
||||
|
||||
## What the NEXT Session Should Do
|
||||
|
||||
1. **First**: Run `quasar dev` and manually test the login flow against the dev Appwrite backend to validate v23 API calls work at runtime
|
||||
2. **Validate**: Boat listing, reservation creation/cancellation, interval loading — confirm no runtime errors from the v23 positional-param deprecations
|
||||
3. **Commit**: Stage all modified files and commit as `"fix: Resolve build errors from dependency updates"` (single clean commit covering all TS/ESLint/qcalendar/env fixes)
|
||||
4. **Optional**: Migrate Appwrite calls from deprecated positional-param style to object-param style (affects all stores — low priority, they still work)
|
||||
5. **Optional**: Add `subtasks?: Task[]` to `Task` interface in `src/stores/task.ts` if that feature is planned
|
||||
|
||||
## Open Questions Requiring User Input
|
||||
|
||||
- [ ] `task.subtasks` removed from `TaskCardComponent` template — should `subtasks?: Task[]` be added to the `Task` interface for future use, or is subtask support not planned?
|
||||
- [ ] Appwrite v23 deprecated positional-param overloads (hints in every store call). Migrate now or leave for later?
|
||||
|
||||
## Assumptions That Need Validation
|
||||
|
||||
- ASSUMED: Appwrite v23 positional-param API calls behave identically at runtime to v14 — validate by doing a full login + reservation flow against the dev backend
|
||||
- ASSUMED: `subtasks` in `TaskCardComponent` was dead/future code — no user confirmed this
|
||||
|
||||
## What NOT to Re-Read
|
||||
|
||||
- `docs/archive/handoffs/handoff-2026-03-15-dependency-updates.md` — archived; superseded by this file
|
||||
- `docs/archive/handoffs/handoff-2026-03-15-auth-magic-link.md` — archived; auth work complete
|
||||
|
||||
## Files to Load Next Session
|
||||
|
||||
- `src/stores/task.ts` — if adding `subtasks` to Task interface
|
||||
- `src/boot/appwrite.ts` — if migrating to Appwrite v23 object-param style
|
||||
- Any store file (`boat.ts`, `interval.ts`, `reservation.ts`, etc.) — if migrating Appwrite calls
|
||||
@@ -78,7 +78,7 @@ import { APP_VERSION } from 'src/version';
|
||||
function showAbout() {
|
||||
Dialog.create({
|
||||
title: 'OYS Borrow a Boat',
|
||||
message: `Version ${APP_VERSION}<br>Manage a Borrow a Boat program for a Yacht Club.<br><br>© Ottawa Yacht Squadron`,
|
||||
message: `Version ${APP_VERSION}<br>Manage a Borrow a Boat program for a Yacht Club.<br><br>© Oakville Yacht Squadron`,
|
||||
html: true,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -7,28 +7,20 @@
|
||||
round
|
||||
icon="menu"
|
||||
aria-label="Menu"
|
||||
@click="toggleLeftDrawer" />
|
||||
@click="$emit('drawer-toggle')" />
|
||||
|
||||
<q-toolbar-title>{{ pageTitle }}</q-toolbar-title>
|
||||
<q-space />
|
||||
<div>v{{ APP_VERSION }}</div>
|
||||
</q-toolbar>
|
||||
</q-header>
|
||||
<LeftDrawer
|
||||
:drawer="leftDrawerOpen"
|
||||
@drawer-toggle="toggleLeftDrawer" />
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue';
|
||||
import LeftDrawer from 'components/LeftDrawer.vue';
|
||||
import { APP_VERSION } from 'src/version';
|
||||
|
||||
const leftDrawerOpen = ref(false);
|
||||
function toggleLeftDrawer() {
|
||||
leftDrawerOpen.value = !leftDrawerOpen.value;
|
||||
}
|
||||
defineProps({
|
||||
pageTitle: String,
|
||||
});
|
||||
defineEmits(['drawer-toggle']);
|
||||
</script>
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
<template>
|
||||
<q-layout view="hHh Lpr fFf">
|
||||
<ToolbarComponent :pageTitle="route.meta.title as string" />
|
||||
<ToolbarComponent
|
||||
:pageTitle="route.meta.title as string"
|
||||
@drawer-toggle="toggleLeftDrawer" />
|
||||
<LeftDrawer
|
||||
:drawer="leftDrawerOpen"
|
||||
@drawer-toggle="toggleLeftDrawer" />
|
||||
<q-page-container>
|
||||
<router-view />
|
||||
</q-page-container>
|
||||
@@ -11,13 +16,19 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue';
|
||||
import { useQuasar } from 'quasar';
|
||||
import { useRoute } from 'vue-router';
|
||||
import BottomNavComponent from 'src/components/BottomNavComponent.vue';
|
||||
import ToolbarComponent from 'src/components/ToolbarComponent.vue';
|
||||
import LeftDrawer from 'src/components/LeftDrawer.vue';
|
||||
|
||||
const q = useQuasar();
|
||||
const route = useRoute();
|
||||
const leftDrawerOpen = ref(false);
|
||||
function toggleLeftDrawer() {
|
||||
leftDrawerOpen.value = !leftDrawerOpen.value;
|
||||
}
|
||||
// q.fullscreen.request();
|
||||
q.addressbarColor.set('#14539a');
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user