feat(calendar): add Agenda view (chronological list of events + tasks)#200
feat(calendar): add Agenda view (chronological list of events + tasks)#200eibrahim wants to merge 5 commits into
Conversation
Adds an "Agenda" calendar view - a date-grouped, chronological list of upcoming events and scheduled tasks, rendered with FullCalendar's listWeek view and selectable alongside Day/Week/Month/Year (issue #88). - New `AgendaView` component reuses `getAllCalendarItems`, enabled-feed filtering, click-to-quick-view, and user time-format settings, mirroring the existing view components. - New pure helper `src/lib/calendar-agenda.ts` (`formatAgendaItems`) holds the item-shaping/filtering/sort logic so it is unit-testable without rendering FullCalendar; covered by `calendar-agenda.test.ts`. - Wires the already-declared `"agenda"` CalendarView value through `Calendar.tsx` (Agenda button + render branch); week-based prev/next nav. - Adds `@fullcalendar/list@^6.1.15` (pinned to 6.1.15 to match the other FullCalendar packages) to package.json + lockfile. Closes #88 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016mqdsn2va7teLRuNPdyeZy
…le series Codex adversarial review flagged that the agenda quick-view delete copied the `isRecurring ? "series" : "single"` shortcut used elsewhere, which escalates deleting a single expanded recurring occurrence into a whole-series delete. Adds `resolveEventDeleteMode` (TDD): an expanded recurring instance deletes as `single`; only the recurring master (`isMaster`) deletes as `series`. Wires it into AgendaView's delete handler. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016mqdsn2va7teLRuNPdyeZy
…ommand Codex review: the global `calendar.new-event` command/shortcut opens events via `useEventModalStore`, which every other view wires into its EventModal. The agenda only used local state, so the create-event command silently did nothing while the agenda was active. Wire the shared store (open + defaultDate/ defaultEndDate, cleared on close) to match Day/Week/Month/Year. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016mqdsn2va7teLRuNPdyeZy
Moves the completed OpenSpec change into the archive and folds the calendar-agenda-view spec delta into openspec/specs/. Markdown only; no code change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016mqdsn2va7teLRuNPdyeZy
Claude
|
Summary
Adds an Agenda view to the calendar (issue #88): a date-grouped, chronological list of upcoming events and scheduled tasks, rendered with FullCalendar's
listWeekview and selectable alongside Day / Week / Month / Year. The Motion-style reference in the issue is exactly this - a scrollable list to scan what's coming up.The
"agenda"value was already declared in theCalendarViewtype union but no view rendered it (it silently fell through to the Year view); this wires it up.What changed
AgendaView(src/components/calendar/AgendaView.tsx): uses@fullcalendar/list(listWeek), reuses the sharedgetAllCalendarItems()data source, enabled-feed filtering, click-to-quick-view, user time-format settings, and an empty-state message - mirroring the existing view components.src/lib/calendar-agenda.ts):formatAgendaItemsholds the item-shaping / feed-filtering / sort logic so it is unit-testable without rendering FullCalendar;resolveEventDeleteModemakes the agenda's quick-view delete strictly safer (only the recurring master deletes asseries; an expanded occurrence deletes assingle).src/components/calendar/Calendar.tsx): adds the Agenda button and a render branch forview === "agenda"; prev/next navigation steps by week (consistent with Week view).@fullcalendar/list@^6.1.15(pinned to 6.1.15 to match the other@fullcalendar/*packages) topackage.json+ lockfile.issue-88-agenda-viewcreated, validated, and archived toopenspec/changes/archive/2026-06-22-issue-88-agenda-view/(spec folded intoopenspec/specs/calendar-agenda-view/).[unreleased].Test plan
npm run test:unit- newsrc/__tests__/calendar-agenda.test.ts(12 tests) passes: feed filtering (tasks always included, disabled/missing feeds excluded), color resolution + fallbacks,extendedPropspreservation, class names, chronological sort, andresolveEventDeleteMode(non-recurring -> single, occurrence -> single, master -> series). (The 2 pre-existinggoogle-*timezone suites fail identically onorigin/mainand are unrelated.)npm run type-check- clean.npm run lint- clean (zero warnings).Codex review
Codex
adversarial-reviewwas run in a loop. Two findings were fixed in-scope (recurring-occurrence delete no longer escalates to whole-series for the direct delete path; the global new-event command now works while the agenda is active).The final verdict is needs-attention solely due to two PRE-EXISTING bugs in shared code that are not introduced by this diff and affect all five calendar views (not just the agenda) - they are out of scope for this additive feature and are tracked separately:
EventModal.tsx:211//todoforceseditMode = "series"; reached via Edit -> Delete in every view).deleteGoogleEventusestimeMin: now/maxResults: 1instead of the clicked instance; also reached viatask-block-push.ts).This PR is strictly safer than the status quo for the surface it adds. Per maintainer direction, it is opened without a clean Codex
approvebecause the only blocking findings are these pre-existing, out-of-scope shared bugs.Closes #88
🤖 Generated with Claude Code
https://claude.ai/code/session_016mqdsn2va7teLRuNPdyeZy