1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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.
|