summaryrefslogtreecommitdiffhomepage
path: root/.rules/plan/calendar-phase-4.md
blob: c7b2c8697faf77bc0476747673897e97c3106b3d (plain)
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.