feat(todo): tasks chosen together, quick add reading what is typed (ADR 0033, D14, D15)

- A section's heading stays atop a project's list while its tasks
  scroll beneath it (slivers, PinnedHeaderSliver).
- Upcoming's month unfolds in place beneath its strip, from its name
  or its handle; a button beside the month goes back to today.
- Tasks are chosen together: a row swiped right or held, or Select
  tasks in Today's, Upcoming's and a project's menu; a bar of date,
  move, labels, priority and more (complete, duplicate, deadline,
  delete) takes the navigation bar's place. A row swiped left asks
  for its date.
- TaskRepository.move moves tasks with their sub-tasks.
- parseQuickAdd reads #project, @label (an unknown one made),
  {deadline}, !!1 and p1 to p4, !30m, dates, times and recurrences
  (tomorrow 9am, Mon 18:00, ev Tue 7pm, every 2 days, every weekday),
  from a table of words per language: English, and German beside it.
- Each token is highlighted and shown on its chip; a tap keeps it as
  text, and a chip picked takes it out of the title.
- Quick add shows its title alone at first, its chips once typing
  starts, and the description and deadline behind its + (the
  description also from the down arrow).

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 16:53:59 +01:00
commit 4960234a63
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -185,8 +185,21 @@ alternative was put to them, the choice is theirs.
out by D5). The description's icon stays by its first line.
- **D14 Rows and menus**: a row shows its project and section ("Inbox / Errands" with the
project's icon) at the end of the line of its date, not beside the whole row; every
menu entry has its icon, a destructive one in the error colour (`MenuEntry`).
- **D15 Typed tokens in quick add** (amends D7's later step; recommended, the developer
menu entry has its icon, a destructive one in the error colour (`MenuEntry`). A
section's heading stays atop the list while its tasks scroll beneath it, until the
next pushes it away (`PinnedHeaderSliver`). Upcoming's month unfolds in place beneath
its strip, from its name or its handle dragged down, the arrows then going by month,
the handle dragged up folding it; a button beside the month goes back to today once
another week shows. Tasks are chosen to act on together, as Todoist's: a row swiped
right or held, or *Select tasks* in Today's, Upcoming's and a project's ⋮, a tap then
choosing or letting go; the app bar counts them, with an arrow (or back) ending it,
and a bar takes the navigation bar's place: date, move, labels (those all have
ticked; a tick added to each, one unticked taken off each), priority, and ⋮ with
complete (undone together), duplicate, deadline and delete (asked first). *Assign*
waits for shared projects and *View activity* for a history, neither of which Todo
has. A row swiped left asks for its date. Neither swipe removes the row; a sheet's
sub-tasks and search's results aren't chosen (`TaskSelection`, one for the frame).
- **D15 Typed tokens in quick add** (amends D7's later step; the developer's, 1 Nov, after
asking whether the keyboard's language could choose): `#project`, `@label`,
`{deadline}`, `!!1` and `p1` to `p4`, `!30m`, dates and times (`9am`, `Mon 18:00`,
`ev Tue 7pm`) and recurrences (`every day`, `every 2 days`, `every second day`), each
@ -195,16 +208,23 @@ alternative was put to them, the choice is theirs.
language and English, so a new app language adds a table, not a parser. Not the
keyboard's language: Flutter tells nothing of it, Android doesn't reliably, and it
changes as the person switches keyboards while typing. Symbols hold in every language.
- **To come, in this order**: section headings that stay atop the list as it scrolls;
Upcoming's month opening inline beneath its strip (a handle dragged down, or the
month's name) with a way back to today beside it once another week shows, and its ⋮
with *Select tasks*; a row swiped left picks its date, swiped right selects it, a tap
then selecting more, with a bar of date, move, labels, priority and ⋮ (delete,
duplicate, complete, deadline); rows dragged into another order, and a little to the
As built (`parseQuickAdd`, `QuickAddWords.en` and `.de`): a `#` naming no project
stays text, an `@` naming no label makes one as the task is added; only the first of
each kind counts, the rest stays in the title; a time alone is its next to come
(tomorrow once it has passed today), a weekday alone the coming one (today too),
`next` one after today; a month needs its day (`may` alone is a word), a number alone
is none; a recurrence starts on its first day from today (`every weekday` on a Sunday:
Monday). `!30m` makes a task without a time due 30 minutes from now, reminded then,
and one with a time reminded 30 minutes before it; with a day but no time it is
text. German's weekdays only by their whole names, its short forms (`so`, `do`,
`die`, `mit`) being everyday words. Quick add shows its title alone at first, its
chips once typing starts, a chip picked taking its token out of the title, and the
description and the deadline behind its + (the description also from the down
arrow).
- **To come, in this order**: rows dragged into another order, and a little to the
right to become the sub-task of the row above, with Undo; the add button dragged onto
the list to add a task there, dropped back on its place (an ×) to give up, wherever
it shows; and quick add showing its fields as typing starts, its + opening the rest
(D15 with it).
it shows; suggestions of projects and labels as `#` and `@` are typed.
## Steps