diff --git a/KisaniCal/ISSUES.md b/KisaniCal/ISSUES.md index f89663d..083a835 100644 --- a/KisaniCal/ISSUES.md +++ b/KisaniCal/ISSUES.md @@ -1019,3 +1019,147 @@ Files: `NotificationManager.swift`, `TaskItem.swift`. customization. **Pending.** - **Note (#1) — Matrix "Move" lists only the other 3 quadrants.** This is the intended KC-25 behavior, not a defect; left as-is unless reversed. + +--- + +## KC-32 — Calendar Day / 3-Day / Week / List views not showing tasks & events + +**Status:** Fixed (build + unit-test verified) +**Reported by:** User +**Area:** Calendar + +### Description +Tasks/events only appeared in the Month view. Day and 3-Day showed an empty +timeline; Week showed abstract colored bars with no titles; the List/task-list +views missed recurring tasks. + +### Root cause +- `cvTimeItems(date)` iterated raw `taskVM.tasks` (no recurrence) and dropped any + untimed task via `guard h != 0 || m != 0` (midnight = "no time" → discarded). +- Week rendered `eventDots` (colors only); List and the task-list toggle used raw + `tasks` instead of `occurrences(on:)`. + +### Fix +- `cvTimeItems` now uses `occurrences(on:)` + the real `hasTime` flag; added an + all-day band (`cvAllDayBand` / `cvAllDayItems`) for untimed tasks, all-day + events, and the day's workout. +- Week lists real titles (up to 4/day + "N more") via shared `cvAgendaItems`. +- List view and `calDayTaskListView` switched to `occurrences(on:)`. + +Files: `CalendarView.swift`. + +--- + +## KC-33 — Calendar month grid: weekday header & week numbers misaligned to firstWeekday + +**Status:** Fixed (17 unit tests, UI-verified) +**Reported by:** User (release-blocking, data integrity) +**Area:** Calendar + +### Description +Dates appeared under the wrong weekday labels (e.g. June 1 2026 — a Monday — +shown under "S"). A data-integrity bug, not visual. + +### Root cause +The grid is built from `.weekOfMonth` (respects `Calendar.current.firstWeekday`), +but the weekday header was hardcoded Sunday-first (`["S","M","T","W","T","F","S"]`) +and the week-number label was gated on `isSunday` (weekday == 1). On any +non-Sunday-first locale / "Start Week On = Monday", every column was mislabeled by +one and the W-number landed on the wrong column. + +### Fix +- Extracted pure, testable date math into `CalendarGrid` (`monthGrid` + + `weekdaySymbols`); `gridDays()` and the year-view mini-month dedupe to it. +- Header now derived from `firstWeekday`, so it always matches the grid. +- Week-number label gated on `isWeekStart` (weekday == firstWeekday). Documented + that week numbers are locale `weekOfYear` (consistent with layout), not ISO. + +Files: `CalendarGrid.swift` (new), `CalendarView.swift`, `ContentView.swift` +(DEBUG-only `KISANI_INITIAL_TAB` launch hook, compiled out of Release). + +### Verification +New `KisaniCalTests` target — 17 tests passing on simulator: exact Sunday-first +June 2026 grid, header↔grid alignment for firstWeekday 1–7, cell identity, month +navigation (May/Jul/Feb 2026 + Feb 2028 leap + Dec 2026→Jan 2027), event-day +bucketing (all-day / late-night / midnight-crossing) across 4 timezones, and +recurring-task occurrence expansion. Verified in the running app. + +--- + +## KC-34 — Confirm before completing a future-dated task + +**Status:** Fixed (build-verified) +**Reported by:** User +**Area:** Tasks + +### Description +Tapping the circle on a task in "Next 7 Days" / "Later" silently completed it — +easy to do by accident. + +### Fix +`TaskRowView` now shows a confirmation dialog before completing a task whose due +date is after today (`isFutureTask`). Today/overdue tasks still toggle instantly, +and un-completing never prompts. Applies everywhere `TaskRowView` is used. + +Files: `TodayView.swift`. + +--- + +## KC-35 — Visual cleanup: slimmer checkbox + remove decorative emoji + +**Status:** Fixed (build-verified) +**Area:** Today / Widget / Settings / Notifications + +### Fix +- Task checkbox: 22pt filled donut → 18pt open ring (1.5pt), no fill — quieter, + matches the restrained brand. Tap target kept at 36×44. +- Removed decorative emoji: 🎉 (My Tasks widget empty state), `𝕏 👾 📸` + (Settings → Follow Us), `✓` (notification action title + "Done" body). + +Files: `TodayView.swift`, `MyTasksWidget.swift`, `SettingsView.swift`, +`NotificationManager.swift`. + +--- + +## KC-36 — Version display reads from the bundle (no hardcoded "v1.0.0") + +**Status:** Fixed (build-verified) +**Area:** Settings / Build + +### Description +About row and About sheet hardcoded "v1.0.0" while the app was 2.0 — drift. + +### Fix +Added a `Bundle` extension (`marketingVersion` / `buildNumber` / `versionDisplay`); +both spots now read from the bundle (driven by `project.yml`). Build set to +**2.0 (9)**. + +Files: `SettingsView.swift`, `project.yml`. + +--- + +## KC-37 — Quick-add recurrence: detect "everyday" and "every weekday" + +**Status:** Fixed (6 parser tests) +**Reported by:** User +**Area:** Tasks / Natural-language parsing + +### Description +Typing "remind me to pray everyday" didn't set a Daily recurrence. + +### Root cause +`parseRecurrence` required a space (`\bevery\s+day\b`), so "everyday" (one word) +was missed; "every weekday" wasn't handled. + +### Fix +`\bevery\s*day\b` now matches both "every day" and "everyday"; added "each day", +and "Every Weekday" detection ("every weekday" / "weekdays") ahead of the broader +weekly/daily patterns. Sub-day cadence ("every hour" / "hourly") is intentionally +**not** matched — the occurrence engine is day-granular, so it stays a one-off +rather than being mislabeled. + +Files: `TodayView.swift` (`NLTaskParser`). 6 parser tests added. + +### Pending (follow-up) +- **Hourly / sub-day recurrence** is unsupported by the day-granular occurrence + engine. Would need an engine + repeating-notification extension. **Pending.**