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:
kutesir
2026-06-24 21:05:33 +03:00
parent 8370125ec0
commit e8c2c5c8ea

View File

@@ -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 17, 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.**