diff options
Diffstat (limited to '.rules/plan/calendar-phase-4.md')
| -rw-r--r-- | .rules/plan/calendar-phase-4.md | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/.rules/plan/calendar-phase-4.md b/.rules/plan/calendar-phase-4.md new file mode 100644 index 0000000..c7b2c86 --- /dev/null +++ b/.rules/plan/calendar-phase-4.md @@ -0,0 +1,84 @@ +# Phase 4: Calendar View (`src/calendar/calendar-view.ts`) + +**Status:** Not started +**Depends on:** Phase 1 (daily-notes.ts), Phase 2 (calendar-state.ts), Phase 3 (calendar-renderer.ts) +**Output file:** `src/calendar/calendar-view.ts` + +--- + +## Overview + +The `ItemView` subclass — wires everything together. Creates the state and renderer, registers vault/workspace events, and implements all callback handlers for user interactions. + +--- + +## Design + +``` +VIEW_TYPE_CALENDAR = "ai-pulse-calendar" + +class CalendarView extends ItemView: + - state: CalendarState + - renderer: CalendarRenderer + + getViewType(): "ai-pulse-calendar" + getDisplayText(): "Calendar" + getIcon(): "calendar" + + onOpen(): + - Initialize state (today, reindex notes) + - Create renderer with callbacks + - Register vault events (create, delete, modify, rename) → reindex + re-render + - Register workspace events (file-open) → update active file highlight + - Start 60s heartbeat for day rollover + - Initial render + + onClose(): + - renderer.destroy() + - Clear intervals + + Callbacks: + onClickDay(date, event): + - If note exists → open it (respecting Ctrl+Click behavior setting — from fork) + - If not → create (with optional confirmation modal) then open + + onClickWeek(date, event): + - If weekly note exists → open it (future expansion) + - Same Ctrl+Click behavior setting (from fork) + + onClickMonth(date, event): // from fork + - If monthly note exists → open it + - If not → create then open (future expansion) + + onClickYear(date, event): // from fork + - If yearly note exists → open it + - If not → create then open (future expansion) + + onClickQuarter(date, event): // from fork + - If quarterly note exists → open it + - If not → create then open (future expansion) + + onContextMenuDay(date, event): + - Show file menu (delete, open in new tab, etc.) if note exists + + onContextMenuWeek/Month/Year/Quarter(date, event): // from fork + - Show file menu if note exists for that period + + onHoverDay/Week/Month/Year/Quarter(date, targetEl, isMetaPressed): // from fork + - Trigger link-hover for page preview when Ctrl/Cmd held + + revealActiveNote(): + - If active file is a daily note, set displayedMonth to that date + - Also check weekly, monthly, quarterly, and yearly note formats (from fork) +``` + +--- + +## Notes + +- Vault events to listen for: `create`, `delete`, `modify`, `rename` — all trigger `state.reindex()` + `renderer.render()`. +- The `file-open` workspace event updates `state.setActiveFile()`. +- Ctrl+Click behavior is controlled by the `calendarCtrlClickOpensInNewTab` setting (Phase 5). +- The confirmation modal before creating a note is controlled by `calendarConfirmBeforeCreate` (Phase 5). +- Week/month/year/quarter click handlers are initially no-ops (future expansion) except for daily notes. +- Hover preview uses Obsidian's `link-hover` workspace trigger. |
