feat(calendar): the event card is the editor #263

Merged
nalum merged 2 commits from feat/calendar-event-editor into main 2026-08-26 18:38:14 +00:00
Owner

Implements #193 on both surfaces, plus the web/Compose halves of #195 (the event repeat sheet) and #196 (scope, the rule-change confirm, cancel and delete) — the sheet is not shippable without them.

  • No Edit button, no separate edit screen. The event sheet is FieldRow rows committing on blur; a chevron predicts picker-versus-in-place. Name, note and Where edit in place; Kind, When, Who's going, Remind and Repeats open real pickers over the sheet. The subtitle states the series and the position (· 4 of 12, or the past-tense split line); Kind seeds the When row and never locks it; the Remind picker explains itself only on Deadline and Birthday.
  • Authority is the OWNER ref (ADR-0036, #257): owners — or an admin on an ownerless household date — get chevrons and ⋯; attendees and non-members see every field, no chevrons, no ⋯, one action (I'm going / Leave this one, absent on Birthday and Holiday); the last person on an event has no Leave, with the footnote naming delete or who to ask. Pinned by web/tests/event-sheet.test.tsx (8 cases).
  • Scope is asked once, after the change, naming it (§5.2) — on per-field commits, joins and leaves alike, and never on a split child. Join/leave-one ride #209's JoinOccurrence/LeaveOccurrence on both surfaces, replacing the Split-then-AddUser chain (queue registry rows added).
  • The rule-change confirm (§5.3) fires only when hand-edited occurrences would be lost; the web counts and names them (tombstones separately); the phone warns in the rule's own words — a recorded divergence until the cache can enumerate children. ⋯ holds Cancel this one, Stop it repeating, and the only coloured Delete, behind the curly-quoted confirm.
  • The Who picker makes the last attendee unremovable at the control with the reason on the row (#257). Attendee refs now carry their relation through the Android cache (additive JSON field; absent reads as owner, the server's own stored-row rule).
  • Today's event sheet is the same component on both surfaces — the old EventDetail body and the four-button edit flow are gone.
  • Known gaps, noted honestly: no cross-surface render fixture for the sheet yet (the web RTL suite is the reference; the fixture family + goldens are the next golden pass), and the event repeat-label wording keeps its pinned conformance copy rather than the demo's ("Tuesdays and Thursdays") — that rewording rides the #256-style copy sweep, it touches repeat.json and both label implementations.

Stacked on #262. Design: calendar handoff §0.1 + §5, calendar-demo.dc.html.

🤖 Generated with Claude Code

Implements #193 on both surfaces, plus the web/Compose halves of #195 (the event repeat sheet) and #196 (scope, the rule-change confirm, cancel and delete) — the sheet is not shippable without them. - **No Edit button, no separate edit screen.** The event sheet is FieldRow rows committing on blur; a chevron predicts picker-versus-in-place. Name, note and Where edit in place; Kind, When, Who's going, Remind and Repeats open real pickers over the sheet. The subtitle states the series and the position (`· 4 of 12`, or the past-tense split line); Kind seeds the When row and never locks it; the Remind picker explains itself only on Deadline and Birthday. - **Authority is the OWNER ref** (ADR-0036, #257): owners — or an admin on an ownerless household date — get chevrons and `⋯`; attendees and non-members see every field, no chevrons, no `⋯`, one action (`I'm going` / `Leave this one`, absent on Birthday and Holiday); the last person on an event has no Leave, with the footnote naming delete or who to ask. Pinned by `web/tests/event-sheet.test.tsx` (8 cases). - **Scope is asked once, after the change, naming it** (§5.2) — on per-field commits, joins and leaves alike, and never on a split child. Join/leave-one ride #209's `JoinOccurrence`/`LeaveOccurrence` on both surfaces, replacing the Split-then-AddUser chain (queue registry rows added). - **The rule-change confirm** (§5.3) fires only when hand-edited occurrences would be lost; the web counts and names them (tombstones separately); the phone warns in the rule's own words — a recorded divergence until the cache can enumerate children. `⋯` holds Cancel this one, Stop it repeating, and the only coloured Delete, behind the curly-quoted confirm. - The Who picker makes the last attendee unremovable **at the control** with the reason on the row (#257). Attendee refs now carry their relation through the Android cache (additive JSON field; absent reads as owner, the server's own stored-row rule). - Today's event sheet is the same component on both surfaces — the old EventDetail body and the four-button edit flow are gone. - Known gaps, noted honestly: no cross-surface render fixture for the sheet yet (the web RTL suite is the reference; the fixture family + goldens are the next golden pass), and the event repeat-label wording keeps its pinned conformance copy rather than the demo's ("Tuesdays and Thursdays") — that rewording rides the #256-style copy sweep, it touches repeat.json and both label implementations. Stacked on #262. Design: calendar handoff §0.1 + §5, calendar-demo.dc.html. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
test(ui): re-record the calendar page goldens for the week toggle
Some checks failed
check / commits (pull_request) Successful in 13s
check / go (pull_request) Successful in 3m0s
check / report (pull_request) Successful in 4s
android / build (pull_request) Failing after 4m44s
android / report (pull_request) Successful in 5s
check / web (pull_request) Failing after 3m43s
9a467a7e0b
Every calendar page's toolbar gained the Week switch, and the agenda
pages moved to the §2.5 rail — re-recorded on their own so the code
commits' diffs stay code. The six new week/dots page cases ride with
the web commit that added them.
No Edit button and no separate edit screen (#193, jobs law 1): the
event sheet becomes rows that commit on blur through the FieldRow
grammar, a chevron predicting picker-versus-in-place. Name, the note
and Where edit in place; Kind, When, Who's going, Remind and Repeats
open real pickers over the sheet. The subtitle states the series and
the position — 'Tuesdays and Thursdays · 4 of 12', 'the 9th since
3 August' on an endless rule, 'Was part of …' in the past tense once
split. Kind seeds the When row and never locks it. The Remind picker
names Deadline's second ring and Birthday's broadcast, on those kinds
alone.

Authority is the OWNER ref (ADR-0036, #257): an owner or an admin on an
ownerless event gets the chevrons and the '⋯'; an attendee or a
non-member sees every field with no chevrons and one action — I'm going
(not on Birthday or Holiday, where attendance is meaningless) or Leave
this one — and the last person on an event has no Leave at all, with
the footnote naming delete or who to ask. Per-occurrence join and
leave ride #209's JoinOccurrence/LeaveOccurrence, one transaction each,
replacing the Split-then-AddUser chain; both ask scope on a repeating
event (#196), as does every per-field commit, once, after the change,
naming it. Changing the rule confirms only when hand-edited occurrences
would be lost, counting and naming them, tombstones included. Cancel
this one, Stop it repeating and Delete the series live in '⋯' — delete
the only coloured entry.

Design: calendar handoff §0.1, §5, calendar-demo.dc.html.
feat(calendar): the event card is the editor, compose twin
Some checks failed
check / commits (pull_request) Successful in 18s
check / go (pull_request) Successful in 2m54s
check / report (pull_request) Successful in 4s
check / web (pull_request) Failing after 3m37s
android / build (pull_request) Failing after 4m44s
android / report (pull_request) Successful in 4s
43b3ae354a
The Android half of #193/#195/#196: the event sheet becomes the
card-as-editor — FieldRow rows committing on blur, real pickers for
Kind, When, Who's going, Remind and the repeat rule, the OWNER-ref
authority gate (ADR-0036, #257) with the read-only shapes for
attendees, non-members and household dates, I'm going and Leave this
one riding JoinOccurrence/LeaveOccurrence, the §5.2 scope dialog after
every change on a derived slot, the §5.3 rule-change confirm counting
splits and tombstones, and '⋯' holding cancel-this-one, stop-repeating
and the coloured delete. Attendee refs carry their relation type
through the cache so the phone can gate the editor offline.

Design: calendar handoff §0.1 and §5, calendar-demo.dc.html.

Test report

Suite Tests Result Skipped
Unit 1440 ✅ pass 1
Integration 133 ✅ pass —

Coverage: 27.0%

Updated by the check workflow · commit 5fe847bfab

<!-- ci-test-report --> ## Test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit | 1440 | ✅ pass | 1 | | Integration | 133 | ✅ pass | — | **Coverage:** 27.0% <sub>Updated by the check workflow · commit 5fe847bfabaa9c25ea5560528b9480c279acfebc</sub>

Android test report

Suite Tests Result Skipped
Unit (debug) 193 ✅ pass 0

Coverage: 8.9% of lines

Updated by the android workflow · commit 5fe847bfab

<!-- android-test-report --> ## Android test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit (debug) | 193 | ✅ pass | 0 | **Coverage:** 8.9% of lines <sub>Updated by the android workflow · commit 5fe847bfabaa9c25ea5560528b9480c279acfebc</sub>
nalum force-pushed feat/calendar-event-editor from 43b3ae354a
Some checks failed
check / commits (pull_request) Successful in 18s
check / go (pull_request) Successful in 2m54s
check / report (pull_request) Successful in 4s
check / web (pull_request) Failing after 3m37s
android / build (pull_request) Failing after 4m44s
android / report (pull_request) Successful in 4s
to 97554d98ba
Some checks failed
check / commits (pull_request) Successful in 15s
check / go (pull_request) Successful in 2m47s
check / web (pull_request) Failing after 4m0s
android / build (pull_request) Successful in 7m37s
check / report (pull_request) Successful in 13s
android / report (pull_request) Successful in 11s
2026-08-26 03:45:48 +00:00
Compare
nalum force-pushed feat/calendar-event-editor from 97554d98ba
Some checks failed
check / commits (pull_request) Successful in 15s
check / go (pull_request) Successful in 2m47s
check / web (pull_request) Failing after 4m0s
android / build (pull_request) Successful in 7m37s
check / report (pull_request) Successful in 13s
android / report (pull_request) Successful in 11s
to 0513c03f60
Some checks failed
android / report (pull_request) Has been cancelled
check / commits (pull_request) Has been cancelled
check / go (pull_request) Has been cancelled
check / report (pull_request) Has been cancelled
check / web (pull_request) Has been cancelled
android / build (pull_request) Has been cancelled
2026-08-26 04:32:43 +00:00
Compare
nalum force-pushed feat/calendar-event-editor from 0513c03f60
Some checks failed
android / report (pull_request) Has been cancelled
check / commits (pull_request) Has been cancelled
check / go (pull_request) Has been cancelled
check / report (pull_request) Has been cancelled
check / web (pull_request) Has been cancelled
android / build (pull_request) Has been cancelled
to 27f54f069e
All checks were successful
check / commits (pull_request) Successful in 15s
android / build (pull_request) Successful in 7m32s
check / go (pull_request) Successful in 4m13s
check / web (pull_request) Successful in 5m39s
android / report (pull_request) Successful in 4s
check / report (pull_request) Successful in 4s
2026-08-26 04:56:46 +00:00
Compare
nalum force-pushed feat/calendar-event-editor from 27f54f069e
All checks were successful
check / commits (pull_request) Successful in 15s
android / build (pull_request) Successful in 7m32s
check / go (pull_request) Successful in 4m13s
check / web (pull_request) Successful in 5m39s
android / report (pull_request) Successful in 4s
check / report (pull_request) Successful in 4s
to ba6e9335e4
Some checks failed
check / commits (pull_request) Successful in 16s
check / go (pull_request) Failing after 2m35s
check / web (pull_request) Successful in 4m35s
android / build (pull_request) Successful in 6m59s
android / report (pull_request) Has been cancelled
check / report (pull_request) Has been cancelled
2026-08-26 05:41:11 +00:00
Compare
nalum force-pushed feat/calendar-event-editor from ba6e9335e4
Some checks failed
check / commits (pull_request) Successful in 16s
check / go (pull_request) Failing after 2m35s
check / web (pull_request) Successful in 4m35s
android / build (pull_request) Successful in 6m59s
android / report (pull_request) Has been cancelled
check / report (pull_request) Has been cancelled
to 339cf3e14d
All checks were successful
check / commits (pull_request) Successful in 15s
check / go (pull_request) Successful in 2m53s
android / build (pull_request) Successful in 6m53s
check / web (pull_request) Successful in 6m19s
check / report (pull_request) Successful in 3s
android / report (pull_request) Successful in 7s
2026-08-26 06:16:41 +00:00
Compare
nalum force-pushed feat/calendar-event-editor from 339cf3e14d
All checks were successful
check / commits (pull_request) Successful in 15s
check / go (pull_request) Successful in 2m53s
android / build (pull_request) Successful in 6m53s
check / web (pull_request) Successful in 6m19s
check / report (pull_request) Successful in 3s
android / report (pull_request) Successful in 7s
to 5fe847bfab
Some checks failed
check / commits (pull_request) Successful in 21s
check / go (pull_request) Successful in 2m54s
android / build (pull_request) Successful in 7m20s
check / web (pull_request) Successful in 4m25s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 4s
android / build (push) Has been cancelled
android / report (push) Has been cancelled
check / commits (push) Has been cancelled
check / go (push) Has been cancelled
check / report (push) Has been cancelled
check / web (push) Has been cancelled
tag / tag (push) Has been cancelled
2026-08-26 07:03:23 +00:00
Compare
nalum changed target branch from feat/calendar-agenda-week to main 2026-08-26 18:38:10 +00:00
nalum merged commit 5fe847bfab into main 2026-08-26 18:38:14 +00:00
nalum deleted branch feat/calendar-event-editor 2026-08-26 18:38:15 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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
eagraiclainne/app!263
No description provided.