Skip to content

FAB tap/hold gesture, collapsible chore groups, and the "Eventually" schema fix - #125

Merged
mapgie merged 4 commits into
mainfrom
claude/task-app-ui-improvements-6v6en0
Sep 8, 2026
Merged

FAB tap/hold gesture, collapsible chore groups, and the "Eventually" schema fix#125
mapgie merged 4 commits into
mainfrom
claude/task-app-ui-improvements-6v6en0

Conversation

@mapgie

@mapgie mapgie commented Sep 8, 2026

Copy link
Copy Markdown
Owner

Follow-up to the UI batch shipped in v0.34.0 (PR #123). Branched fresh off main since #123 is already merged and released.

Changes

Add button gesture (correction)
The previous version opened the radial on a single tap. Restored the intended behaviour:

  • Tap adds a new item for the page you're on.
  • Short hold (250ms, well under the ~400ms platform default) opens the radial.
  • On Settings, which has no page type to add, a tap opens the radial (no long-press).

Implemented with a pointerInput gesture so the long-press timeout can be shortened (Compose's combinedClickable doesn't expose it), plus explicit onClick / onLongClick semantics actions so TalkBack keeps both actions and the a11y check passes.

Collapsible category headers on Chores
Tapping a category heading on the Chores list collapses/expands that group, mirroring Tasks.

Fix: "Eventually" due was rejected by the database
The Eventually option writes due_period = 'eventually', but todos_due_period_check only allowed today / this_week / this_month, so the insert failed with new row for relation "todos" violates check constraint. Widened the check in supabase/schema.sql and added the ALTER migration existing projects run once.

⚠️ Action needed on the live Supabase project: run the migration block at the bottom of supabase/schema.sql (the two ALTER TABLE todos ... statements) in the SQL Editor. Merging this PR fixes fresh installs and the checked-in schema, but the existing shared database keeps rejecting eventually until that ALTER is run.

Cross-app note: the todos table is shared with the taskDash web app. It will now accept and store eventually rows; confirm the web app renders that value sensibly before relying on it there.

Guard schema drift in CI (so this can't recur)
Two layers, single source of truth = supabase/schema.sql:

Tests / checks

  • a11y_check.py passes (124 files).
  • Changelog fragment fab-gesture-and-chore-collapse.json (minor); .sql/.yml/docs are not app code.
  • Not compiled locally (no Android SDK in this environment); CI is the build check.

🤖 Generated with Claude Code

https://claude.ai/code/session_01ArC3EFNefEqRZrYkm9WobY

…chore groups

Follow-up to the merged UI batch (v0.34.0), correcting the add button's
gesture and extending collapsible category headers to Chores.

- Add button: a tap adds a new item for the current page; a short hold
  (250ms, well under the platform default) opens the radial. On Settings,
  which has no page type, a tap opens the radial. Implemented with a
  pointerInput gesture plus explicit onClick/onLongClick semantics so
  TalkBack keeps both actions.
- Chores list: tapping a category heading collapses/expands that group,
  matching Tasks (chevron on the heading, per-visit state).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ArC3EFNefEqRZrYkm9WobY
The Eventually due option (v0.34.0) writes due_period = 'eventually', but the
todos_due_period_check constraint only allowed today/this_week/this_month, so
the insert was rejected by Supabase. Widen the check in schema.sql and add the
ALTER migration existing projects must run.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ArC3EFNefEqRZrYkm9WobY
Prevents the class of bug that broke the "Eventually" due (app sent a
due_period the Supabase CHECK constraint didn't allow):

- Make the emittable wire values first-class in data/model: DuePeriod.key and
  TaskPriority.wire, sourced by the Edit sheet instead of string literals.
- SchemaSyncTest (JVM, no secrets) asserts every DuePeriod/TaskPriority value
  appears in the matching CHECK in supabase/schema.sql, failing the PR that
  adds a value without widening the schema.
- schema-contract.yml + supabase/contract_check.py insert each allowed value
  against a throwaway project's REST API to prove the live database has the
  schema applied; dormant until SUPABASE_TEST_URL / SUPABASE_TEST_ANON_KEY
  secrets are set.
- supabase/README.md documents the source-of-truth model and both guards;
  LESSONS #53 records the drift lesson.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ArC3EFNefEqRZrYkm9WobY
…re change)

Supabase stops auto-exposing public tables to the Data API (new projects
2026-05-30, new tables in existing projects 2026-10-30). Existing tables keep
their grants, so the live project is unaffected, but a project created fresh
from schema.sql, or any table added later, would return "permission denied"
through the anon key. Add explicit GRANTs (anon/authenticated/service_role) for
every table, and a SchemaSyncTest that fails if a CREATE TABLE lacks a grant to
anon. Documented in supabase/README.md and LESSONS #54.

Ref: https://github.com/orgs/supabase/discussions/45329

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ArC3EFNefEqRZrYkm9WobY
@mapgie
mapgie marked this pull request as ready for review September 8, 2026 19:24
@mapgie
mapgie merged commit 6a3749b into main Sep 8, 2026
6 checks passed
@mapgie
mapgie deleted the claude/task-app-ui-improvements-6v6en0 branch September 8, 2026 20:12
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.

2 participants