Skip to content

Fix/web app tasks UI - #12248

Open
Yny4ii wants to merge 3 commits into
BasedHardware:mainfrom
Yny4ii:fix/web-app-tasks-ui
Open

Fix/web app tasks UI#12248
Yny4ii wants to merge 3 commits into
BasedHardware:mainfrom
Yny4ii:fix/web-app-tasks-ui

Conversation

@Yny4ii

@Yny4ii Yny4ii commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

What changed and why

Three Tasks UI bugs on web/app /tasks: the due-date popover was clipped by overflow-hidden, a double-click on +1d entered row selection because click stopPropagation does not stop dblclick, and deleting a task unmounted the whole list because cache-invalidation refetch flipped loading to true.

Product invariants affected

none

How it was verified

  • cd web/app && bun run typecheck — pass
  • bunx vitest run --config vitest.config.mts src/components/tasks/__tests__/TaskRow.test.tsx src/hooks/__tests__/useActionItems.test.tsx — 2 files, pass
  • NODE_OPTIONS=--no-experimental-webstorage bun run check — typecheck + 328 tests pass (local Node 25 needs that flag; CI Bun 1.3.14 is the suite authority)
  • bun run build — pass (firebase SW generated, 26 routes)
  • Pre-push scripts/pre-push — pass; pushed fix/web-app-tasks-ui

Manual: exercised the list-view date picker (popover no longer clipped), double-click on +1d (snooze without selection mode), and delete (remaining rows stay on screen). Could not sign in against production Firebase from a contributor env; those checks were on the local Tasks UI with loaded tasks.

Tests

  • Date picker clip: no test — CSS overflow-hidden on the pending-list wrapper; clipping only shows in layout. Asserting a class string would be a static tripwire.
  • Double-click +1d: web/app/src/components/tasks/__tests__/TaskRow.test.tsx — dblclick snooze does not call onEnterSelectionMode.
  • Delete unmount: web/app/src/hooks/__tests__/useActionItems.test.tsx — cache-invalidation refetch keeps loading === false and existing items mounted.

Failure class (fixes)

Failure-Class: none

Review in cubic

Yny4ii and others added 3 commits August 26, 2026 11:17
The pending list used overflow-hidden, which cropped the absolutely positioned due-date popover.

Co-authored-by: Cursor <cursoragent@cursor.com>
Click stopPropagation does not stop dblclick, so a fast +1d press bubbled to the row handler.

Co-authored-by: Cursor <cursoragent@cursor.com>
Cache invalidation after delete flipped loading true and TaskHub unmounted every row until the GET returned.

Co-authored-by: Cursor <cursoragent@cursor.com>
@Git-on-my-level

Copy link
Copy Markdown
Collaborator

Thanks @Yny4ii — nicely scoped set of fixes, and the verification section of the description is exactly what makes this fast to review.

I traced all three fixes through the code and ran the full web/app vitest suite against this head (60 files / 328 tests, all green, including the two new test files — useful since CI here only ran the AI reviewer).

Per-file notes:

  • web/app/src/hooks/useActionItems.ts — the hasLoadedRef guard is the right fix for the delete-unmounts-list bug. The chain checks out: deleteActionItem invalidates the action-items cache (lib/api.ts) → the onCacheInvalidation subscription refetches → the old setLoading(true) unmounted the populated list in TaskHub, whose render gate is !loading && items.length > 0. Keeping loading as first-paint-only is correct stale-while-revalidate behavior, and the error path now preserving stale items instead of setItems([]) is a real improvement. I compared the rest of the file (snooze / setDueDate / updateDescription / removeItem / bulk*) line-by-line — it's Prettier reformatting only, no behavior change. useActionItems has a single consumer (TaskHub), so the loading-semantics change is fully contained.
  • web/app/src/components/tasks/TaskRow.tsxonDoubleClick={(e) => e.stopPropagation()} on the hover-actions wrapper is the correct layer for this: click-level stopPropagation doesn't stop the separate dblclick event from reaching the row's handleRowDoubleClick, and putting it on the wrapper covers every hover button, not just +1d.
  • web/app/src/components/tasks/TaskListView.tsx — dropping overflow-hidden un-clips the absolutely-positioned date popover (top-full right-0 z-50). One small thing to keep an eye on: the wrapper still has rounded-lg and rows animate height: 0 on exit — if exiting-row content is ever visible past the rounded corners during the animation, a clip on the row itself would restore it without re-clipping the popover. Cosmetic at most; not a blocker.
  • web/app/src/components/tasks/__tests__/TaskRow.test.tsx and web/app/src/hooks/__tests__/useActionItems.test.tsx — both assert the user-visible regression (dblclick snooze doesn't enter selection mode; invalidation refetch keeps loading === false with items mounted) rather than implementation details, which is exactly what these tests should do. Skipping a layout test for the CSS clip, with the rationale in the description, is a reasonable call.

No blockers from my side — leaving the merge sign-off to a maintainer.


by AI on behalf of David — if you need David’s attention urgently, please @Git-on-my-level and escalate with need human response.

@Git-on-my-level Git-on-my-level added positive-signal Good PR — positive signal, not a formal approval web labels Aug 26, 2026

@kodjima33 kodjima33 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Three real, well-scoped UI bug fixes (date-popover clip, dblclick selection, delete-unmount) with tests for 2 of 3. Confidence gate score ~2/5 (no linked issue, diff over 300-line threshold) — approving only per policy, not merging.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

positive-signal Good PR — positive signal, not a formal approval web

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants