From 7fd381a242f68b7c6f10db4e3ae0bb3d06e36a16 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Thu, 22 Jan 2026 10:09:07 -1000 Subject: Fix background image CORS issue Switch from Unsplash Source API to Lorem Picsum which has proper CORS headers for cross-origin image loading. Co-Authored-By: Claude Opus 4.5 --- issues/011-add-timeline-view.md | 86 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 issues/011-add-timeline-view.md (limited to 'issues/011-add-timeline-view.md') diff --git a/issues/011-add-timeline-view.md b/issues/011-add-timeline-view.md new file mode 100644 index 0000000..49e744a --- /dev/null +++ b/issues/011-add-timeline-view.md @@ -0,0 +1,86 @@ +# [FEATURE] Add timeline view + +## Description +Add timeline view. + +## User Story +As a user, I want a timeline/agenda view so I can see my day's schedule visually. + +## Technical Context +- New view aggregating multiple data sources by time +- Requires merging tasks + meals + (future) calendar events +- New tab or view mode in existing UI + +## Test Strategy + +### Unit Test (Red) +**File:** `internal/handlers/handlers_test.go` + +```go +func TestBuildTimeline(t *testing.T) { + tasks := []Task{{Name: "Task 1", DueDate: todayAt(10, 0)}} + meals := []Meal{{Name: "Lunch", Date: today, Type: "lunch"}} // lunch = 12:00 + + timeline := BuildTimeline(tasks, meals) + + assert.Len(t, timeline, 2) + assert.Equal(t, "Task 1", timeline[0].Title) + assert.Equal(t, "Lunch", timeline[1].Title) +} + +func TestTimelineItemsSortedByTime(t *testing.T) { + // Items from different sources + // Assert sorted by timestamp regardless of source +} +``` + +### E2E Test (Red) +Timeline renders with correct order and time markers. + +## Proposed Approach + +1. **Data Structure:** + ```go + type TimelineItem struct { + Time time.Time + Title string + Source string // "task", "meal", "calendar" + Type string // source-specific type + URL string + Metadata map[string]any + } + ``` + +2. **Handler:** + - New endpoint `GET /timeline` or extend tab handler + - Aggregate items from tasks, meals, (future) calendar + - Sort by time ascending + - Group by hour or time block + +3. **UI:** + - Vertical timeline with time gutter on left + - Color-coded by source + - Expandable items for details + +4. **Meal time mapping:** + - breakfast: 08:00 + - lunch: 12:00 + - dinner: 18:00 + - snack: configurable or omit from timeline + +## Affected Components +- `internal/handlers/handlers.go` or `internal/handlers/timeline.go` (new) +- `internal/handlers/handlers_test.go` +- `internal/models/types.go` (TimelineItem struct) +- `web/templates/partials/timeline-tab.html` (new) +- `web/templates/index.html` (add tab) + +## Definition of Done +- [ ] Timeline view accessible from UI +- [ ] Tasks with times appear at correct position +- [ ] Meals appear at appropriate meal times +- [ ] Items sorted chronologically +- [ ] Visual time markers/gutter +- [ ] Color coding by source +- [ ] Unit tests for timeline building +- [ ] E2E test for rendering -- cgit v1.2.3