feat(web): edit non-recurring events from the detail sheet #71

Merged
nalum merged 1 commit from feat/web-event-edit into main 2026-08-14 16:56:10 +00:00
Owner

Second part of #61: events become editable in the web UI.

EventService.Update existed but no client called it, so an event was create-only — a member could not fix its name, time, guests or description afterward. This adds an Edit action to the event detail sheet that reopens the create form prefilled and saves through events.update.

  • The form (NewEventForm) now takes an optional edit event: eventToForm reverses an event back into the form fields (the inverse of submit's encoding), and submit branches to events.update when editing.
  • The Edit affordance is gated on can("EventService", "Update") — the matrix source from #70 — so it appears for exactly the permitted roles (including a child, who may edit events).
  • mutate.events.update added to the offline queue layer.

Scope — non-recurring events only. Editing a recurring series or a single occurrence needs the split-then-update dance and is deferred, the same way repeat-rule editing already is; UpdateEventRequest carries no repeat field, and the caller withholds the Edit affordance for series parents and projected occurrences. The repeat control is hidden in edit mode.

Remaining in #61: the occurrence-vs-series edit flow, and the Android consumer + Android event edit.

Verified: make check passes (tsc, web build, Go tests, and the web + Android i18n catalogs synced for the new strings).

Part of #61.

🤖 Generated with Claude Code

Second part of #61: events become editable in the web UI. `EventService.Update` existed but no client called it, so an event was create-only — a member could not fix its name, time, guests or description afterward. This adds an **Edit** action to the event detail sheet that reopens the create form prefilled and saves through `events.update`. - The form (`NewEventForm`) now takes an optional `edit` event: `eventToForm` reverses an event back into the form fields (the inverse of submit's encoding), and submit branches to `events.update` when editing. - The Edit affordance is gated on `can("EventService", "Update")` — the matrix source from #70 — so it appears for exactly the permitted roles (including a child, who may edit events). - `mutate.events.update` added to the offline queue layer. **Scope — non-recurring events only.** Editing a recurring series or a single occurrence needs the split-then-update dance and is deferred, the same way repeat-rule editing already is; `UpdateEventRequest` carries no repeat field, and the caller withholds the Edit affordance for series parents and projected occurrences. The repeat control is hidden in edit mode. Remaining in #61: the occurrence-vs-series edit flow, and the Android consumer + Android event edit. Verified: `make check` passes (tsc, web build, Go tests, and the web + Android i18n catalogs synced for the new strings). Part of #61. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(web): edit non-recurring events from the detail sheet
All checks were successful
check / commits (pull_request) Successful in 7s
check / web (pull_request) Successful in 1m31s
check / go (pull_request) Successful in 2m32s
check / report (pull_request) Successful in 4s
ac016427df
Events were create-only in the UI — EventService.Update existed but no
client called it, so a member could not fix an event's name, time or
guests after creating it. Add an Edit affordance to the event detail
sheet that reopens the create form prefilled and saves through
events.update. Gated on can(EventService, Update), so it appears for
exactly the roles the matrix permits. Scoped to non-recurring events:
editing a recurring series or one occurrence needs the split-then-update
dance and is deferred to a follow-up, the same way repeat-rule editing
already is. Part of #61.

Test report

Suite Tests Result Skipped
Unit 1330 ✅ pass 1
Integration 83 ✅ pass —

Coverage: 27.7%

Updated by the check workflow · commit 82549918d5

<!-- ci-test-report --> ## Test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit | 1330 | ✅ pass | 1 | | Integration | 83 | ✅ pass | — | **Coverage:** 27.7% <sub>Updated by the check workflow · commit 82549918d54b5487000d8206f19aae40b097c847</sub>
nalum force-pushed feat/web-event-edit from ac016427df
All checks were successful
check / commits (pull_request) Successful in 7s
check / web (pull_request) Successful in 1m31s
check / go (pull_request) Successful in 2m32s
check / report (pull_request) Successful in 4s
to 82549918d5
Some checks failed
check / commits (pull_request) Successful in 5s
check / web (pull_request) Successful in 1m45s
check / go (pull_request) Successful in 2m36s
android / build (pull_request) Successful in 5m46s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 4s
android / report (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
android / build (push) Has been cancelled
check / commits (push) Has been cancelled
2026-08-14 16:03:16 +00:00
Compare

Android test report

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

Updated by the android workflow · commit 82549918d5

<!-- android-test-report --> ## Android test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit (debug) | 31 | ✅ pass | 0 | <sub>Updated by the android workflow · commit 82549918d54b5487000d8206f19aae40b097c847</sub>
nalum changed target branch from feat/web-affordances-from-matrix to main 2026-08-14 16:56:04 +00:00
nalum merged commit 82549918d5 into main 2026-08-14 16:56:10 +00:00
nalum deleted branch feat/web-event-edit 2026-08-14 16:56:10 +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!71
No description provided.