Calendar: Task checkboxes cannot be ticked from the Calendar (grid, all-day lane, +N popover, Agenda, preview) #657

Closed
opened 2026-10-02 04:23:39 +00:00 by kayg · 7 comments
Owner

Owner report (2026-10-02)

"I can't even tick the task items from the calendar! This is horrible."

Task items appear on the Calendar (all-day lane, the "+N" overflow popover, the grid, Agenda, hover preview), but their checkboxes cannot be toggled there.

Expected

A Task's checkbox works everywhere a Task appears. In the Calendar that means: the Week/Day grid, the all-day lane, the "+N" popover, Month, Agenda, the hover preview card, and search results.

  • Click/tap the checkbox: the Task is done at once (optimistic), with the shared check animation (spring, reduced-motion aware). A warm toast says "Completed " with Undo.
  • Keyboard: focus a Task item and press Space to toggle (Enter still opens it). The screen reader announces "
## Owner report (2026-10-02) "I can't even tick the task items from the calendar! This is horrible." Task items appear on the Calendar (all-day lane, the "+N" overflow popover, the grid, Agenda, hover preview), but their checkboxes cannot be toggled there. ## Expected A Task's checkbox works **everywhere a Task appears**. In the Calendar that means: the Week/Day grid, the all-day lane, the "+N" popover, Month, Agenda, the hover preview card, and search results. - Click/tap the checkbox: the Task is done at once (optimistic), with the shared check animation (spring, reduced-motion aware). A warm toast says "Completed <Task title>" with Undo. - Keyboard: focus a Task item and press Space to toggle (Enter still opens it). The screen reader announces "<title>, task, done/not done". - Touch: tapping the checkbox toggles it and never opens the item; there is a sufficient hit target (≥ 44 px). - The change writes the Task file (the Markdown checkbox / status frontmatter) through the one Tasks write path used by the editor and MCP. It syncs to Reminders over CalDAV and updates every open view (Calendar, Notes, the Today agenda) without a reload. - Done Tasks stay visible on their day, struck through and dimmed (not hidden), so Undo and review work. Uncomplete works the same way. - The same action is in the item's context menu / ⋯ menu ("Mark as done" / "Mark as not done") with the shortcut hint. ## Tests e2e like a User for each Calendar surface: tick, see it struck through, reload, still done, Undo restores it. A two-tab test checks that the other tab updates live. A CalDAV test checks that the Reminders projection shows the item completed.
Author
Owner

#659 found the existing server routes for and , but no shared web Tasks write helper. I am adding one under for Task Notes and completion. Please reuse it for Calendar ticking when your branch incorporates it.

#659 found the existing server routes for and , but no shared web Tasks write helper. I am adding one under for Task Notes and completion. Please reuse it for Calendar ticking when your branch incorporates it.
Author
Owner

Issue #659 found the existing server routes for POST /api/v1/notes/tasks/tick and PATCH /api/v1/notes/tasks/properties, but no shared web Tasks write helper. I am adding one under apps/web/src/lib/tasks/ for Task Notes and completion. Please reuse it for Calendar ticking when your branch incorporates it.

Issue #659 found the existing server routes for POST /api/v1/notes/tasks/tick and PATCH /api/v1/notes/tasks/properties, but no shared web Tasks write helper. I am adding one under apps/web/src/lib/tasks/ for Task Notes and completion. Please reuse it for Calendar ticking when your branch incorporates it.
Author
Owner

Starting #657 on branch job/taskday-655 from origin/dev at c4a61e8cf090170f35b1bed3350d9de20c83ecd5. The Notes server already has POST /api/v1/notes/tasks/tick; I am tracing all Calendar Task render surfaces and will route them through shared optimistic state, with Undo and the existing server write path.

Starting #657 on branch `job/taskday-655` from `origin/dev` at `c4a61e8cf090170f35b1bed3350d9de20c83ecd5`. The Notes server already has `POST /api/v1/notes/tasks/tick`; I am tracing all Calendar Task render surfaces and will route them through shared optimistic state, with Undo and the existing server write path.
Author
Owner

Completed — Forgejo #657

Calendar Tasks can now be completed and reopened from timed rows, all-day rows, the +N All-day items popover, Month, Agenda, Calendar previews, and Search Task previews. A shared checkbox path writes through the Notes API, updates mounted occurrences, preserves newer status across stale Calendar range responses, and uses the shared Undo stack. It supports pointer, touch and keyboard input, has a 44 px target and accessible name/state, and shows the shortcut tooltip. On coarse-pointer Month views, extra Tasks go under “More” to preserve target size.

The production e2e covers pointer and keyboard changes, Undo, Search, Week, Month, Agenda, overflow, reload and cross-tab refresh. Screenshots cover 390, 820 and 1440 px in light and dark; the full set of 30 screenshots is attached to #655: https://git.kayg.org/repo/kayg/calternal/issues/655.

Commit: 9968f4d3f46fd2851f6ece928737238ec28574fa (Make Calendar Task checkboxes work everywhere). git fetch origin && git merge origin/dev completed with origin/dev already up to date. No push or deploy.

bun run check passed with svelte-check found 0 errors and 0 warnings. bun run test passed: Test Files 153 passed (153) and Tests 1062 passed (1062). The Notes crate clippy gate passed; its full test gate ended with 167 passed and two failures under host load: an existing daily/composer assertion returned 404 instead of 200, and the Journal PATCH storm timed out. The complete gate output and other crate results are in the #655 report.

UX gaps closed

  • Task state changes work at every covered Calendar/Search surface and propagate to mounted occurrences and peer Calendar tabs; destructive/state changes have Undo.
  • Touch, pointer, keyboard and screen-reader checkbox paths are covered, including 44 px targets and Space activation.
  • The +N overflow rows center checkbox, icon and title within 1 CSS px of the row center and keep a heading-to-list gap.

UX gaps left: none known on the covered surfaces.

Decisions not stated in DESIGN

  • Month shows one Task per day on coarse pointers and puts the rest under “More” to preserve 44 px action targets.
  • Search places its checkbox in the Task preview rather than inside the result listbox option, preserving listbox keyboard semantics.
## Completed — Forgejo #657 Calendar Tasks can now be completed and reopened from timed rows, all-day rows, the +N All-day items popover, Month, Agenda, Calendar previews, and Search Task previews. A shared checkbox path writes through the Notes API, updates mounted occurrences, preserves newer status across stale Calendar range responses, and uses the shared Undo stack. It supports pointer, touch and keyboard input, has a 44 px target and accessible name/state, and shows the shortcut tooltip. On coarse-pointer Month views, extra Tasks go under “More” to preserve target size. The production e2e covers pointer and keyboard changes, Undo, Search, Week, Month, Agenda, overflow, reload and cross-tab refresh. Screenshots cover 390, 820 and 1440 px in light and dark; the full set of 30 screenshots is attached to #655: https://git.kayg.org/repo/kayg/calternal/issues/655. Commit: `9968f4d3f46fd2851f6ece928737238ec28574fa` (`Make Calendar Task checkboxes work everywhere`). `git fetch origin && git merge origin/dev` completed with origin/dev already up to date. No push or deploy. `bun run check` passed with `svelte-check found 0 errors and 0 warnings`. `bun run test` passed: `Test Files 153 passed (153)` and `Tests 1062 passed (1062)`. The Notes crate clippy gate passed; its full test gate ended with 167 passed and two failures under host load: an existing daily/composer assertion returned 404 instead of 200, and the Journal PATCH storm timed out. The complete gate output and other crate results are in the #655 report. ### UX gaps closed - Task state changes work at every covered Calendar/Search surface and propagate to mounted occurrences and peer Calendar tabs; destructive/state changes have Undo. - Touch, pointer, keyboard and screen-reader checkbox paths are covered, including 44 px targets and Space activation. - The +N overflow rows center checkbox, icon and title within 1 CSS px of the row center and keep a heading-to-list gap. UX gaps left: none known on the covered surfaces. ### Decisions not stated in DESIGN - Month shows one Task per day on coarse pointers and puts the rest under “More” to preserve 44 px action targets. - Search places its checkbox in the Task preview rather than inside the result listbox option, preserving listbox keyboard semantics.
Author
Owner

Continuing round 2 on job/taskday-655 from base c4a61e8cf0 (HEAD 9968f4d3f). Existing checkbox work and in-progress e2e edits are preserved while I verify the real Calendar surfaces.

Continuing round 2 on job/taskday-655 from base c4a61e8cf090170f35b1bed3350d9de20c83ecd5 (HEAD 9968f4d3f). Existing checkbox work and in-progress e2e edits are preserved while I verify the real Calendar surfaces.
Author
Owner

Round 2 report — #657

Branch: job/taskday-655
Head: b45b1f1d7fc8ebef50511a91d6759d6ccd27ebba

Calendar Task completion uses the shared writer and Undo history across surfaces. The E2E now exercises touch completion, cross-view state, and the macOS ⌘Z Undo path by stable Task identity. The code and test commits are 9968f4d3f, dd82530e2, and b45b1f1d7 (with placement and Activity fixes in the same branch).

Gates: cargo fmt --check exited 0 with no output. Calendar tests: test result: ok. 84 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.28s. Server tests: test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 60.86s. Web checks: svelte-check found 0 errors and 0 warnings; Test Files 153 passed (153); Tests 1062 passed (1062).

The full browser matrix did not finish within the four-hour job limit. A prior attempt timed out in the all-day Space-key check; the test was adjusted, but its last run was stopped before completion. No fresh successful screenshots were produced. The benchmark profile was added but not run. The Mac VM remains offline, so live Mac review is pending. See #655 for the per-crate gate output, the unrelated Notes test failure, fixture explanation and all remaining gaps.

Cleanup: cargo clean printed Removed 19187 files, 11.4GiB total; apps/web/build was removed. Issue remains open.

## Round 2 report — #657 Branch: `job/taskday-655` Head: `b45b1f1d7fc8ebef50511a91d6759d6ccd27ebba` Calendar Task completion uses the shared writer and Undo history across surfaces. The E2E now exercises touch completion, cross-view state, and the macOS `⌘Z` Undo path by stable Task identity. The code and test commits are `9968f4d3f`, `dd82530e2`, and `b45b1f1d7` (with placement and Activity fixes in the same branch). Gates: `cargo fmt --check` exited 0 with no output. Calendar tests: `test result: ok. 84 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.28s`. Server tests: `test result: ok. 107 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 60.86s`. Web checks: `svelte-check found 0 errors and 0 warnings`; `Test Files 153 passed (153)`; `Tests 1062 passed (1062)`. The full browser matrix did not finish within the four-hour job limit. A prior attempt timed out in the all-day Space-key check; the test was adjusted, but its last run was stopped before completion. No fresh successful screenshots were produced. The benchmark profile was added but not run. The Mac VM remains offline, so live Mac review is pending. See #655 for the per-crate gate output, the unrelated Notes test failure, fixture explanation and all remaining gaps. Cleanup: `cargo clean` printed `Removed 19187 files, 11.4GiB total`; `apps/web/build` was removed. Issue remains open.
Author
Owner

Independent review of b45b1f1d7 found two completion edge cases.

  1. apps/web/src/routes/calendar/[view]/[date]/+page.svelte:608-625: Undo stores only a done/not-done value and calls the Boolean tick route. Completing a doing, blocked or waiting Task and then using Undo writes todo; reopening a cancelled Task and using Undo writes done. Preserve and restore the exact prior status. Add coverage for these statuses.
  2. apps/web/src/lib/calendar/edits.ts:59-79: a range request that starts after beginTask but before the tick is committed captures the same version. If the response with the old status arrives before the tick response, the merge accepts it and unchecks the optimistic control. Include pending Task writes in the merge or otherwise fence reads started during the write. Add a deferred-response test for this ordering.

The current Calendar e2e covers only todo → done → todo; it does not cover these cases.

Independent review of `b45b1f1d7` found two completion edge cases. 1. `apps/web/src/routes/calendar/[view]/[date]/+page.svelte:608-625`: Undo stores only a done/not-done value and calls the Boolean tick route. Completing a `doing`, `blocked` or `waiting` Task and then using Undo writes `todo`; reopening a `cancelled` Task and using Undo writes `done`. Preserve and restore the exact prior status. Add coverage for these statuses. 2. `apps/web/src/lib/calendar/edits.ts:59-79`: a range request that starts after `beginTask` but before the tick is committed captures the same version. If the response with the old status arrives before the tick response, the merge accepts it and unchecks the optimistic control. Include pending Task writes in the merge or otherwise fence reads started during the write. Add a deferred-response test for this ordering. The current Calendar e2e covers only `todo` → `done` → `todo`; it does not cover these cases.
kayg closed this issue 2026-10-04 18:55:27 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#657
No description provided.