docs: log KC-32–37 (calendar views, grid alignment, future-task confirm, visual cleanup, dynamic version, everyday recurrence)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1019,3 +1019,147 @@ Files: `NotificationManager.swift`, `TaskItem.swift`.
|
|||||||
customization. **Pending.**
|
customization. **Pending.**
|
||||||
- **Note (#1) — Matrix "Move" lists only the other 3 quadrants.** This is the
|
- **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.
|
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.**
|
||||||
|
|||||||
Reference in New Issue
Block a user