feat: shoots and frames, offline (sub-project 4) #3

Merged
eliott merged 3 commits from feat/shoots-frames into main 2026-10-15 22:56:56 +02:00
Owner

Sub-project 4 of the native roadmap: shoots and frames, offline, on the theme's UI kit.

What changes

  • Shoots list: collapsible folder sections (colour dot, count; empty folders shown), then unfiled shoots, pinned first then newest; search by name or film; cards with date, done mark, film, ISO/format, frame count and a pin toggle.
  • Shoot form (create/edit/delete): name, film, ISO, camera, format, folder pickers and notes. Picking a film fills its ISO when none is set.
  • Shoot page: summary with Pin/Done chips and Frames/Format/ISO/Logged stats; frames with Add frame, duplicate and Clear all. A done shoot takes no new frames, as on the API.
  • Frame form: one screen, prefilled from the shoot's last frame; aperture and shutter strips in the web rings' 1/3 stops; Bulb, Flash, lens, filter, weather, notes; GPS taken on its own for a new frame, with a label and Open in Maps.
  • Frame detail: exposure stats, weather, notes, location; edit, duplicate, delete.
  • Data: ShootQueries (read model straight from SQLite) and ShootActions (writes through the repositories, so everything is queued for push); FrameRepository gains nextNumber, duplicate (with location) and clearShoot, matching the API's rules; LocalChanges re-runs screen queries after local writes and pulls.
  • UI kit: app-select, app-stop-strip, app-switch-row, app-search-field, app-toggle-chip, app-stat; multiline app-text-field; app-screen now uses the screen-aware safe area so long pages scroll clear of the tab bar.

Fix: frame locations were never synced

The API's SyncFrameLocationDto has no createdAt (unlike every other sync DTO), so each pushed location was refused and parked in sync_error. The app now leaves it out. Worth aligning the DTO in rollnote-api#68 for consistency.

Verified

  • pnpm test (185), typecheck, lint, format:check.
  • Emulator against the sync-support API: create a shoot, log frames with GPS, duplicate, done lock, dark mode; acceptance: in airplane mode duplicate + add frames (4 pending), back online and all frames with locations land on the server.
  • Not checked by hand: a web edit pulled onto the device (covered by the sync engine tests).

Version 0.4.0.

Sub-project 4 of the native roadmap: shoots and frames, offline, on the theme's UI kit. ## What changes - **Shoots list**: collapsible folder sections (colour dot, count; empty folders shown), then unfiled shoots, pinned first then newest; search by name or film; cards with date, done mark, film, ISO/format, frame count and a pin toggle. - **Shoot form** (create/edit/delete): name, film, ISO, camera, format, folder pickers and notes. Picking a film fills its ISO when none is set. - **Shoot page**: summary with Pin/Done chips and Frames/Format/ISO/Logged stats; frames with Add frame, duplicate and Clear all. A done shoot takes no new frames, as on the API. - **Frame form**: one screen, prefilled from the shoot's last frame; aperture and shutter strips in the web rings' 1/3 stops; Bulb, Flash, lens, filter, weather, notes; GPS taken on its own for a new frame, with a label and Open in Maps. - **Frame detail**: exposure stats, weather, notes, location; edit, duplicate, delete. - **Data**: `ShootQueries` (read model straight from SQLite) and `ShootActions` (writes through the repositories, so everything is queued for push); `FrameRepository` gains `nextNumber`, `duplicate` (with location) and `clearShoot`, matching the API's rules; `LocalChanges` re-runs screen queries after local writes and pulls. - **UI kit**: `app-select`, `app-stop-strip`, `app-switch-row`, `app-search-field`, `app-toggle-chip`, `app-stat`; multiline `app-text-field`; `app-screen` now uses the screen-aware safe area so long pages scroll clear of the tab bar. ## Fix: frame locations were never synced The API's `SyncFrameLocationDto` has no `createdAt` (unlike every other sync DTO), so each pushed location was refused and parked in `sync_error`. The app now leaves it out. Worth aligning the DTO in rollnote-api#68 for consistency. ## Verified - `pnpm test` (185), `typecheck`, `lint`, `format:check`. - Emulator against the sync-support API: create a shoot, log frames with GPS, duplicate, done lock, dark mode; acceptance: in airplane mode duplicate + add frames (4 pending), back online and all frames with locations land on the server. - Not checked by hand: a web edit pulled onto the device (covered by the sync engine tests). Version 0.4.0.
The API's SyncFrameLocationDto, unlike the other sync DTOs, has no
createdAt, so every pushed location was refused ("property createdAt
should not exist") and parked in sync_error. Leave it out of the pushed
data; capturedAt already records when the fix was taken.
Add the controls the shoots feature needs: app-select (a field opening a
searchable sheet, the native entity select), app-stop-strip (aperture and
shutter in the web rings' 1/3 stops, opening on the value or an everyday
stop), app-switch-row, app-search-field, app-toggle-chip and app-stat.
app-text-field gains multiline. app-screen now uses the screen-aware safe
area, so long pages scroll clear of the native tab bar. Exposure, date and
maps helpers in lib/utils.
feat(shoots): shoots and frames, offline
All checks were successful
tests / test (pull_request) Successful in 1m24s
9487d4d86f
The Shoots tab: a list in collapsible folder sections, pinned first then
newest, with search; shoot create/edit/delete with gear pickers; a shoot
page with Pin/Done, stats and its frames (add, duplicate, clear all); a
one-screen frame form prefilled from the shoot's last frame, with GPS
taken on its own, a label and Open in Maps; and a frame detail with edit,
duplicate and delete. Everything reads SQLite and writes through the
repositories, so it works offline and syncs; a done shoot takes no new
frames, as on the API. Bump to 0.4.0.
eliott merged commit 1c0adbe0e7 into main 2026-10-15 22:56:56 +02:00
eliott deleted branch feat/shoots-frames 2026-10-15 22:56:56 +02:00
Sign in to join this conversation.
No reviewers
No labels
run-ci
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
RollNote/rollnote-app!3
No description provided.