ISSUES.md: log KC-27–30 and KC-26 tracked-event follow-up
- KC-26: documented the tracked-event auto-advance follow-up (trackedTask). - KC-27: Today ⋯ menu — Background, Group & Sort, Select. - KC-28: clearer Snooze labels on notifications and the in-app Postpone menu. - KC-29: lock-screen Progress Dots legibility. - KC-30: period milestone notifications (week / month / year). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -866,7 +866,15 @@ every 12 hours.
|
|||||||
(`currentSelectionExpiry`), not 12 hours later, giving the next event a fresh
|
(`currentSelectionExpiry`), not 12 hours later, giving the next event a fresh
|
||||||
full pre-render window.
|
full pre-render window.
|
||||||
- Completing/closing a task already reloads widget timelines, and the recompute
|
- Completing/closing a task already reloads widget timelines, and the recompute
|
||||||
drops it and picks the next. Tracked-event and manual-pick paths unchanged.
|
drops it and picks the next.
|
||||||
|
|
||||||
|
### Follow-up — tracked events now advance too
|
||||||
|
The first pass left the **tracked** ("Track Countdown") path pinned: a completed
|
||||||
|
or expired tracked event stayed on screen. Fixed with `trackedTask(asOf:)`, which
|
||||||
|
returns the tracked event only while it's live (not complete, and recurring or
|
||||||
|
still future); once done/past (non-recurring) the widget falls through to the
|
||||||
|
next-nearest. Recurring tracked events still roll forward, and the refresh
|
||||||
|
boundary now includes the tracked event's expiry.
|
||||||
|
|
||||||
Files: `EventCountdownWidget.swift`.
|
Files: `EventCountdownWidget.swift`.
|
||||||
|
|
||||||
@@ -874,3 +882,101 @@ Files: `EventCountdownWidget.swift`.
|
|||||||
1. Queue on + Nearest to finish; let the nearest event's due time pass → widget
|
1. Queue on + Nearest to finish; let the nearest event's due time pass → widget
|
||||||
rolls to the next-nearest without manual action.
|
rolls to the next-nearest without manual action.
|
||||||
2. Complete the nearest event → widget advances to the next.
|
2. Complete the nearest event → widget advances to the next.
|
||||||
|
3. Track an event, then complete it → widget advances to the next-nearest.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## KC-27 — Today ⋯ menu: Background, Group & Sort, Select
|
||||||
|
|
||||||
|
**Status:** In Progress (implemented & build-verified, pending device QA)
|
||||||
|
**Reported by:** User
|
||||||
|
**Area:** Tasks / Today
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
Three items in the Today ⋯ menu were empty placeholders: Background, Group &
|
||||||
|
Sort, and Select.
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
- **Background:** sheet with 5 themes (Default/Warm/Cool/Mono/Paper) applied as a
|
||||||
|
subtle gradient to the Today background; persisted via `@AppStorage`.
|
||||||
|
- **Group & Sort:** group by Date (default)/Priority/Category/Quadrant and sort by
|
||||||
|
Smart/Due/Priority/Title. Non-date groupings render as titled sections reusing
|
||||||
|
`UpcomingSection`.
|
||||||
|
- **Select:** multi-select sheet with Select All / Deselect All and a bulk action
|
||||||
|
bar (Complete / Priority / Move / Delete).
|
||||||
|
- New file `TodayMenuFeatures.swift`; added `TaskViewModel.allActiveRows` so
|
||||||
|
grouping/selection use the same single-occurrence task set (incl. undated).
|
||||||
|
|
||||||
|
Files: `TodayMenuFeatures.swift`, `TodayView.swift`, `TaskItem.swift`.
|
||||||
|
|
||||||
|
### How to test
|
||||||
|
1. ⋯ → Background → pick a theme; Today background updates and persists.
|
||||||
|
2. ⋯ → Group & Sort → Priority/Category/Quadrant regroups the list.
|
||||||
|
3. ⋯ → Select → Select All → Complete marks all done.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## KC-28 — Clearer Snooze labels on notifications and task menus
|
||||||
|
|
||||||
|
**Status:** In Progress (implemented & build-verified, pending device QA)
|
||||||
|
**Reported by:** User
|
||||||
|
**Area:** Notifications / Tasks
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
The lock-screen reminder actions and the in-app Postpone submenu showed bare
|
||||||
|
durations ("15 min", "30 min", …) that didn't say what they do. iOS notification
|
||||||
|
buttons are a flat list and can't nest, so a single expanding "Snooze" isn't
|
||||||
|
possible — the labels must carry the meaning.
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
- Lock-screen actions: "Snooze 15 min / 30 min / 1 hour / 2 hours" (+ Mark Complete).
|
||||||
|
- In-app Postpone submenu: "Snooze 15 Minutes / 30 Minutes / 1 Hour / 2 Hours".
|
||||||
|
|
||||||
|
Files: `NotificationManager.swift`, `TaskContextMenu.swift`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## KC-29 — Lock-screen Progress Dots widget legibility
|
||||||
|
|
||||||
|
**Status:** In Progress (implemented & build-verified, pending device QA)
|
||||||
|
**Reported by:** User
|
||||||
|
**Area:** Widgets
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
The Progress Dots widget in the lock-screen accessoryRectangular family packed
|
||||||
|
100 tiny dots into a small pill over a custom dark background, which the lock
|
||||||
|
screen's vibrant rendering washed out — it looked faint / not loaded.
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
- accessoryRectangular: 28 larger dots (vs 100), `.primary` color for the vibrant
|
||||||
|
tint, and `AccessoryWidgetBackground()` for the standard frosted pill. Home
|
||||||
|
Screen small/medium/large keep the 100-dot orange-on-dark grid.
|
||||||
|
|
||||||
|
Files: `WidgetViews.swift`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## KC-30 — Period milestone notifications (week / month / year)
|
||||||
|
|
||||||
|
**Status:** In Progress (implemented & build-verified, pending device QA)
|
||||||
|
**Reported by:** User
|
||||||
|
**Area:** Notifications
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
The user wanted recurring "one more period passed" nudges (referencing another
|
||||||
|
app): end of week, month, and year.
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
- `schedulePeriodMilestones()` schedules three recurring `UNCalendarNotificationTrigger`s:
|
||||||
|
- This Week — "One more week passed." — Sunday 20:00 (weekly)
|
||||||
|
- This Month — "One more month passed." — 1st at 09:00 (monthly)
|
||||||
|
- This Year — "One more year passed." — Jan 1 at 09:00 (yearly)
|
||||||
|
- Fixed identifiers + remove-then-add keep them de-duplicated; runs via the
|
||||||
|
existing `reschedule(...)` path when authorized; gated by the
|
||||||
|
`kisani.periodMilestones` flag (default on). No in-app toggle yet.
|
||||||
|
|
||||||
|
Files: `NotificationManager.swift`.
|
||||||
|
|
||||||
|
### How to test
|
||||||
|
1. Authorize notifications; on the 1st of a month at 09:00 a "One more month
|
||||||
|
passed." notification fires (and equivalents for week/year).
|
||||||
|
|||||||
Reference in New Issue
Block a user