super-productivity/src
John Costa d2015beb44
fix(task): schedule overdue tasks for today via Shift+T and guard stale task focus (#8867)
* fix(task): schedule overdue tasks for today via Shift+T and guard stale task focus (#8851)

* fix(planner): only bind data-task-id on planner-task when focusable

The unconditional data-task-id host binding broke the e2e done-confirmation
strategy in e2e/pages/task.page.ts, which selects its wait branch based on
the attribute's presence. Boards render planner-task cards without an inner
<task> element, so the id-based wait could never resolve (#8851).

* refactor(tasks): share overdue predicate across selector and util

The rebase onto #8858 re-inlined the overdue comparison into
selectOverdueTaskIds and dropped the delegation to isTaskOverdue, so the
two overdue definitions (the overdue list vs. the Shift+T "Add to Today"
path) were duplicated and free to drift — the exact footgun #8851 set out
to avoid, and the util's JSDoc still claimed the selector delegated to it.

Extract isTaskOverdueByThreshold as the single source of truth for the
comparison and getLogicalTodayStartMs for the boundary. isTaskOverdue and
selectOverdueTaskIds both route through it, so they cannot drift. The
selector still computes the threshold once per recompute (no per-task date
parsing), preserving #8858's perf posture. No behavior change.

* test(e2e): base markTaskAsDone strategy on <task> host, not attr

planner-task now carries data-task-id in the Planner overdue list (#8851),
so keying the done-confirmation strategy off data-task-id presence would send
a wrapper down the <task> path — document.querySelectorAll('task') finds no
match and the wait hangs 10s. Key it off the element actually being a <task>
instead. No behavior change for real <task> rows; every wrapper keeps the
300ms wrapper path. Verified: worklog-basic (real task) and boards #7498
(planner-task wrapper) both pass.

---------

Co-authored-by: Johannes Millan <johannes.millan@gmail.com>
2026-07-10 12:07:19 +02:00
..
app fix(task): schedule overdue tasks for today via Shift+T and guard stale task focus (#8867) 2026-07-10 12:07:19 +02:00
assets fix(a11y): name icon-only buttons, add keyboard access, fix task tabindex (#8885) 2026-07-10 11:38:38 +02:00
environments 18.13.1 2026-07-02 16:41:38 +02:00
static
styles fix(android): reserve full system-bar inset for the mobile bottom nav (#8792) (#8799) 2026-07-06 18:34:24 +02:00
test-helpers
typings
_common.scss
favicon.ico
hammer-config.class.ts
index.html fix(security): stored XSS → RCE chain — note image, plugin nodeExecution, CSP (GHSA-78rv-m663-4fph) (#8178) 2026-06-08 20:20:17 +02:00
karma.conf.js chore(task-repeat): revert RRULE Phase 1 from master (#7948) Develop the full RFC-5545 RRULE epic on the long-running feat/rrule-epic branch and merge once complete and testable in final form, rather than landing 13 phases into master one half-state at a time. Work preserved on feat/rrule-epic. Not yet shipped (post-v18.9.1), so no user impact. 2026-06-09 13:56:38 +02:00
main.ts fix(android): suspend idle AudioContext in background to stop battery drain (#8243) (#8280) 2026-06-12 14:55:24 +02:00
manifest.json
polyfills.ts
styles.scss fix(android): reserve full system-bar inset for the mobile bottom nav (#8792) (#8799) 2026-07-06 18:34:24 +02:00
test.ts chore: remove unused eslint-disable directives 2026-06-10 17:35:37 +02:00
tsconfig.app.json
tsconfig.spec.json fix(keyboard): resolve macOS global shortcut layout mismatch (#8378) (#8381) 2026-06-17 12:57:47 +02:00
tsconfig.worker.json