feat(todo): a project's Calendar, Upcoming's Display and its 3-day grid (ADR 0033, D17)

A project's Display gains the Calendar layout: Upcoming's week strip
and agenda, now shared as DayAgenda, over the project's tasks it keeps,
with No date beside the month and Future occurrences, each repeating
task also on the days it will come back (calendarOf on Repeat.next),
muted, neither ticked off nor dragged.

Upcoming gets a Display of its own, the same sheet over another target
(DisplayTarget): Agenda or 3-day, done tasks, future occurrences,
sorting, the filters by deadline, priority and label, and in the grid
Colouring by priority, label or project. It is kept in the person's
settings, one sealed row under an ID keyed by the account in the new
synced table todo_settings (migration settings: the table, its index
on spaceId and its foreign key to the space, cascading on delete).

The 3-day grid shows today and the two days after, stepped or swiped
three at a time: tasks without a time all day, timed ones as blocks as
long as they last, overlapping ones side by side (layOutDay). A long
press on a half hour adds a task there for half an hour; Overdue opens
the overdue tasks with Reschedule.

The board's separator builder names its BuildContext, as the root's
analyzer plugin asks (never_discard_build_context).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-01 20:01:00 +01:00
commit 2939437c74
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -258,9 +258,9 @@ alternative was put to them, the choice is theirs.
project alike (`ProjectView`, the payload's `view`, written only once set; values a
version doesn't know read as at first). The schema stays 1: an older version reads
such a project, and renaming it there drops its Display, which beats a newer schema
it couldn't read at all. Today's and Upcoming's Display come with Upcoming's 3-day
grid, in a sealed person-settings row (`todo_settings`, one migration), which also
holds D4's settings. **The Board** (as built, 1 Nov), the Display's Layout (List,
it couldn't read at all. Upcoming's Display (Today has none, as in Todoist) is in
a sealed person-settings row (`todo_settings`, below), which is also to hold D4's
settings. **The Board** (as built, 1 Nov), the Display's Layout (List,
Board): a column for the tasks in no section, *(No section)*, always first, then one
a section with its menu, each heading counting its open tasks, each task a card,
each column ending with Add task, a last column adding a section; grouped otherwise,
@ -269,9 +269,35 @@ alternative was put to them, the choice is theirs.
peeking in, settling on the nearest when let go, dots below saying where; from it on,
columns 320 wide side by side, scrolled across. Cards are dragged as rows (D16),
within and between columns, every scrollable they are in scrolling at its edges; a
column takes a card or the add button dropped below its cards, last in it. **To come,
in this order**: Calendar for projects (the week strip and agenda; the Layout's third
choice, until then shown as a list), Upcoming's 3-day grid.
column takes a card or the add button dropped below its cards, last in it. **The
Calendar** (as built, 1 Nov, the developer's choices): Upcoming's week strip and agenda,
shared (`DayAgenda`), over the project's tasks its Display keeps, sub-tasks too, a
day's tasks by time or, sorted otherwise, in that order; *No date* beside the month
opens those without one. Grouping is left out of its Display, and *Future
occurrences* (off at first, kept with the rest) shows each repeating task not done on
the days it will come back, the first as if done today (`Repeat.next`), until its
recurrence ends, 400 at most: muted rows with the recurrence's mark in place of the
check, opening the task, neither ticked off nor dragged (`calendarOf`). The agenda on
every width: a month grid on wide windows can come with Upcoming's 3-day grid, which
needs a grid of days anyway. **Upcoming's Display** (as built, 1 Nov, the developer's
"as much as possible without my input"): the same sheet over another target
(`DisplayTarget`: `projectDisplay`, `upcomingDisplay`), its layout Agenda or 3-day,
done tasks, future occurrences, sorting (Smart, by time then priority, as Todoist
calls it; name, deadline, added date, priority) and the filters by deadline, priority
and label; no grouping nor date filter, Upcoming being days already. In the 3-day
grid, Colouring: by priority, by the first label with a colour, or by project. It is
kept in **`todo_settings`**, a synced table of the same shape as `label` (one row a
person, under an ID keyed by the account as the Inbox's, `todo/settings`, sealed for
its table and row; `SettingsRepository`), the migration `settings` creating the table,
its index on `spaceId` and its foreign key to the space, cascading on delete, so a
person's deletion takes it with their space. None kept, or one that doesn't open, reads
as at first. **The 3-day grid** (`ThreeDayGrid`): today and the two days after (never
before today), stepped or swiped three days at a time; tasks without a time *All day*
above, timed ones as blocks as long as they last (half an hour at least, to midnight
at most), overlapping ones side by side in lanes (`layOutDay`); a long press on a free
half hour marks it and opens quick add there for half an hour; a block opens its task;
*Overdue* opens a sheet of the overdue tasks with Reschedule. **To come**: blocks
dragged to another time or day, a month grid on wide windows.
## Steps