Skip to content

The three task actions from #4 do not render anywhere in the UI — one-click completion has no button #60

Description

@os-warren

Found by booting the app and driving it in a real browser. First browser verification of this project; this is what it produced.

duly_task_complete, duly_task_undo and duly_task_skip (merged in #41) are unreachable from the UI. #4's 35 tests pass — they assert metadata shape, handler registration under the dispatch key, and engine-level dispatch. None of that says a human can click the thing.

Measured, on main at 7c30a39, Chromium 1194

Declared location Surface What actually renders
list_toolbar (bulk, declarative bulkActionDefs) list, rows selected Complete · Skip — works end to end
list_item grid row ⋯ menu Edit, Delete only
record_header detail header Edit + ⋯ only
record_more detail ⋯ overflow Share, Delete only

All three locations are valid members of ACTION_LOCATIONS in @objectstack/spec 17.2.0, and the predicates match the records under test (an open task; visible is status == "open" || status == "in_progress").

Zero console errors, zero page errors, zero 4xx across every screen.

One earlier probe of mine was a false positive and is retracted: a substring search found "Skip" on the detail page, but that was "Skipped" in the built-in status pipeline, not the action. Opening the overflow menu properly is what settled it.

What does work

  • The declarative bulk path, verified end to end in the browser: select two rows → Complete → confirm → the row leaves My week (6 rows → 5) → the server shows status: done with completed_at stamped by the Task lifecycle hook — completed_at and last_update_at stamping #3 hook. No errors.
  • The built-in status pipeline on the record detail page (Open / In progress / Done / Skipped / Cancelled) — a platform affordance that comes free with a trackHistory select, not one of our actions.

So the product is not unusable. But the interaction the product is designed around — a one-click tick on the row, with undo — is not there.

The uncomfortable part

#4's dev had to hand-write these three handlers because the platform has no declarative row-level field write (objectstack#14092). The half they were able to build as pure metadata renders and works; the half they had to write by hand does not render at all.

That is the metadata-first rule earning its keep in a way none of us predicted: it did not merely produce less code, it produced the half that survives contact with the UI.

Scope

  1. Root-cause why an object-bound type: 'script' action with locations: ['list_item'] is not picked up by the grid renderer. objectui honours list_item in RelatedList.tsx (child rows on a detail page) and record_header/record_more in containers.tsx / DetailView.tsx, so the code paths exist — something about these declarations is not reaching them. Establish that before changing anything.
  2. If the cause is ours, fix it. If it is a platform gap, file it upstream and say so on this card — do not work around it with a second implementation.
  3. Add a check that fails when a declared action is not reachable. Every existing assertion is satisfied by an action nobody can click, which is exactly how this shipped green.

Note for #16 (mobile)

Swipe-to-complete was going to reuse these actions. Whatever the answer here is, it decides that too.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions