Skip to content

Add search to the Starred and Today's 5 tabs - #80

Merged
sohamM97 merged 2 commits into
mainfrom
feature/search-in-all-tabs
Jul 26, 2026
Merged

Add search to the Starred and Today's 5 tabs#80
sohamM97 merged 2 commits into
mainfrom
feature/search-in-all-tabs

Conversation

@sohamM97

Copy link
Copy Markdown
Owner

Search was only reachable from All Tasks, so finding a task from either of the other two tabs meant switching tabs first — friction for what is a global action. All three tabs now open the same picker, and All Tasks was refactored onto the shared helper rather than left as a second implementation that could drift.

Behavior

  • Search icon added to the Starred and Today's 5 app bars, in the same slot as All Tasks (right after the profile icon).
  • Selecting a result opens the task in All Tasks — in place when already there, otherwise drilling in and sliding to that tab, reusing the onNavigateToTask callback both tabs already had for "Go to task".
  • Create-from-empty-search files at root with the Inbox toggle on, deliberately not auto-starring from Starred (unlike that tab's + FAB) nor auto-pinning from Today's 5 (unlike its FAB create flow). Search spans everything, so it makes no assumption about where the result belongs.
  • Duplicate match offers Open rather than creating a duplicate.
  • Today's 5 search is the global picker — it includes non-leaf parents, unlike the leaves-only "Pin a task to Today's 5" browse picker on the + FAB.

Responsive app bar title

Manual testing surfaced a second problem: the 4th action icon left the 30px "Task Roulette" line ellipsised to "Task Rou…" at phone width. Both tabs built that two-line title independently, so it moved into a shared TabAppBarTitle that steps down to 22px below 420dp, keeping ellipsis as a last-resort fallback. All Tasks is untouched — its title is already 22px and single-line.

Testing

  • flutter analyze clean; 1559 tests pass (1 pre-existing skip).
  • +14 tests across starred_screen_test.dart, todays_five_screen_test.dart, task_list_screen_test.dart — covering that the pool is global (an unstarred / non-leaf result navigates), that Today's 5 search opens rather than pins, the pin-toggle gate at max pins, and that created tasks land at root un-starred / un-pinned.
  • One test intentionally stops at Cancel instead of committing an add: under FakeAsync + databaseFactoryFfiNoIsolate, the reload a full Today's 5 triggers holds sqflite's lock while waiting on timers pumpAsync never advances, so tearDown's db.reset() blocks forever. The same flow completes in ~2s against the real factory, and create-at-root is covered by the neighbouring test.
  • Manual testing: 4 sections / 22 steps all passing on the Linux dev build — Starred search, Today's 5 search, All Tasks regression (the refactor risk), and app bar layout at desktop + narrow width. Not verified on-device; the responsive title renders at 22px on phone, un-truncated but not visually reviewed there.

Docs

  • UI_VIEWS.md — search entry rewritten for all three tabs, responsive title documented, plus the All Tasks breadcrumb bar, which was missing entirely (the back arrow pops one level; the breadcrumb's "Task Roulette" crumb is the actual jump-to-root control).
  • TEST_COVERAGE.md updated.

Second commit (unrelated to the feature)

c1c0dae tightens two skills from feedback during this round: /manual-test gains four wording rules (no imperative-voice summaries, negative outcomes must include the navigation to verify them, "go to root" is the breadcrumb not the back arrow, and always ask before recommending a /cleardb), and /cleardb gains a worktree pre-flight — every checkout shares one DB, and the app running during this round belonged to a different worktree, so killing it would have hit another session's data.

🤖 Generated with Claude Code

Soham Marik and others added 2 commits July 26, 2026 13:50
Search was only reachable from All Tasks, so finding a task from either of the
other two tabs meant switching tabs first — friction for what is a global
action. All three tabs now open the same picker, and All Tasks was refactored
onto the shared helper rather than left as a second implementation that could
drift.

Selecting a result opens the task in All Tasks: in place when already there,
otherwise drilling in and sliding to that tab, reusing the onNavigateToTask
callback the tabs already had for "Go to task". Create-from-empty-search files
at root with the Inbox toggle on, deliberately NOT auto-starring from Starred
(unlike that tab's + FAB) nor auto-pinning from Today's 5 (unlike its FAB
create flow) — search spans everything, so it makes no assumption about where
the result belongs.

Manual testing surfaced a second problem: the 4th action icon left the 30px
"Task Roulette" line ellipsised to "Task Rou..." at phone width. Both tabs
built that two-line title independently, so it moved into a shared
TabAppBarTitle that steps down to 22px below 420dp, keeping ellipsis as a
last-resort fallback. (All Tasks is untouched — its title is already 22px and
single-line.)

One test intentionally stops at Cancel instead of committing an add: under
FakeAsync + databaseFactoryFfiNoIsolate, the reload a full Today's 5 triggers
holds sqflite's lock while waiting on timers pumpAsync never advances, so
tearDown's db.reset() blocks forever. The same flow completes in ~2s against
the real factory, and create-at-root is covered by the neighbouring test.

Also documents the All Tasks breadcrumb bar in UI_VIEWS.md, which was missing
entirely — the back arrow pops one level while the breadcrumb's "Task Roulette"
crumb is the actual jump-to-root control.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Four phrasing failures from an actual manual-test round, each of which cost a
round-trip with the user:

- A step opening "Fill Today's 5, then check the Pin chip disappears" reads as
  an order with no method attached — anything in imperative voice IS an order,
  so purpose lines must be marked as labels or dropped.
- "No duplicate was created" was asserted without saying where to go look; the
  user was parked on a leaf detail view where neither the root list nor the
  Inbox was visible. Absence is only checkable somewhere specific.
- "Back arrow to root" is wrong: the back arrow pops one level, while the
  breadcrumb's "Task Roulette" crumb is the jump-to-root control. It only
  appears correct one level deep.
- A /cleardb was presented as a done deal rather than asked about. The local DB
  is often the only copy of real data, so that is the user's call — now required
  via AskUserQuestion, offering keep/clear/back-up-only.

/cleardb also gains a pre-flight check: every checkout shares one DB (the path
is keyed to the app ID), and the app running during this round belonged to a
different worktree entirely. Killing it and wiping the DB would have hit another
session's data, so the skill now requires reading the process path and
confirming before touching anything.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@sohamM97
sohamM97 merged commit 0a514bf into main Jul 26, 2026
1 check passed
@sohamM97
sohamM97 deleted the feature/search-in-all-tabs branch July 26, 2026 08:56
sohamM97 pushed a commit that referenced this pull request Jul 26, 2026
While merging #80 the skill's Codex guidance led to a wrong conclusion. It says
to poll the issue/PR comment endpoints for the Codex bot and, after ~5 minutes
of silence, report that no review comments arrived — which was then read as "no
automated review at all". Codex had in fact reviewed and found no issues; it
just posts to Codex Cloud (chatgpt.com/codex), never to the GitHub API.

Verified on #80 and the previously merged #79: issues/{n}/comments,
pulls/{n}/comments, pulls/{n}/reviews, the issue timeline, check-runs and commit
statuses are ALL empty even after Codex has finished reviewing. So emptiness
there carries no information about Codex, and the P2s handled on #77/#78 only
reached the repo because the user relayed them from Codex Cloud.

The skill now says to ask the user to check Codex Cloud rather than inferring
from GitHub silence, and to keep polling the endpoints only as a cheap catch for
other reviewers (a human, or claude[bot] if it is ever re-enabled).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant