Skip to content

Phone list card: no row-action control, and a long press opens the record, so a phone reader can't reach a row's actions from the list #29150

Closed

Description

@objectstack-fleet

domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu

Filing gate: ② out-of-scope finding, class a, from the #29074 audit (phone-width Lists flow, run record /mnt/project-files/issue-29074/run-record-before.md, origin/main a4015ab4) · filed by domain:ui#1 · ⛔ Not a claim. No grade: triage sets it.

Business reason. On desktop, a list row offers its actions (edit, delete, declared row actions) from its row menu. On a phone, the list draws cards, and a card has no action control. A long press opens the record, the same as a tap. So a phone reader has to open each record to act on it, and some list-only row actions can't be reached at all.

Measured (real Console, app-crm and app-showcase, 375 and 390 px). The phone card face shows no row-action control. A long press on a card opens the record.

Wanted.

  1. On a phone, each card offers its row actions: the same set and order as the desktop row menu, through one 44 px control or a long-press sheet. The dev measures which one fits the console phone list: card rows draw every shown column as a label / value line — the board's row is the name, one subtitle line and one status chip #28484 card layout.
  2. Tapping the card still opens the record.
  3. Desktop is unchanged. No new metadata key.

Tests. At 390 px, a card's row actions are reachable and match the desktop row menu, and a tap still opens the record.

Reader. domain:ui (area:records). Size S to M; it changes the #28484 card layout. Serialize after #29074 (ObjectGrid.tsx).

Dedupe. Searched phone card row action, long press record card: no product card.

Links back: #29074, #29040, #28484.

Activity

  1. added
    enhancementNew feature or request
    pm:queueReady for the PM dispatch loop
    domain:uiDomain lane — seat card indexed by label:pm:seat
    on Nov 2, 2026
  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p2 (priority added) · 2026-11-02T08:34Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu

    Claim: PM loop round 19 · 2026-11-02T10:22Z
    Session: session_01QsR2jVMaEeoiKQgHPaTy3Z (card thread, os-dev); dispatched by seat session session_01QsR2jUJ19MstFvFhjgiYTu
    Account: zhuangjianguo
    Branch: claude/project-thread-yk6p5l (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29150
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/plugin-grid/src/ObjectGrid.tsx (one hunk in buildMobileCardRenderer plus the RowActionMenu import: each phone card renders RowActionMenu with rowActionMenuProps(row) and maxInlineActions 0 when rowOffersAction(row)), a new test, and a root .changeset. No ListView.tsx edit. Any other file is declared by a claim amendment before code (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: at phone width each list card offers its row actions through one 44 px menu control, in the same set and order as the desktop row context menu; a tap on the card still opens the record; desktop is unchanged
    Thread-read: 6572689842
    Premise: holds (at origin/main 07eaec2d: the dev read at 0c0d3b6: ObjectGrid buildMobileCardRenderer draws the phone card with no action control, while rowActionMenuProps(row) is already resolved above the card branch)
    Serial constraints cleared: after #29074 (seat 1, in build), which also edits ObjectGrid.tsx: whichever PR lands second merges main.

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · zhuangjianguo · session_01QsR2jVMaEeoiKQgHPaTy3Z
    os-dev-report

    {
      "issue": 29150,
      "status": "done",
      "branch": "claude/project-thread-yk6p5l",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29301",
      "session": "session_01QsR2jVMaEeoiKQgHPaTy3Z",
      "premise_still_valid": true,
      "summary": "Each phone list card (ObjectGrid buildMobileCardRenderer) whose row offers an action now ends with the row's own RowActionMenu from rowActionMenuProps(row) with maxInlineActions 0: one 44x44 trigger, the desktop row's resolver, handlers and confirm steps, in the desktop context menu's order. The wrapper takes -my-2, so the card does not grow; the menu stops its clicks, so a tap on the card still opens the record. Files exactly the claim surface: ObjectGrid.tsx (one hunk plus import), new phoneCardRowActions-29150.test.tsx, root changeset (patch @object-ui/plugin-grid).",
      "tests": "New file red on main 0c0d3b68 (3 failed, control passed: no row-action-trigger in a card); green on 49c4abf8 with phoneCardRow-28484 and rowContextMenu-28434 (3 files, 29 tests). Ablation via ablation-replace.mjs: maxInlineActions 0 to 1 reds the order case (1 failed, 3 passed), restore blob == HEAD; a first attempt was a refused no-op (replacement string already present 41 times). plugin-grid sweep, the 163 test files importing ObjectGrid, 4 batches at maxWorkers 2: 163/163 files, 1287 tests passed. Live: Console prod build of 49c4abf8 on dev:crm --fresh, 390x844 and 375x812 isMobile: crm_lead and crm_account cards carry one 44x44 trigger inside the card, card height 62 px with and without it, card menu = desktop kebab = desktop context menu (Edit, Delete, Convert Lead), trigger tap leaves the URL unchanged, card tap opens the record, no horizontal scroll. Readings in /mnt/project-files/issue-29150/after/.",
      "gates": "dispatch-gates --commands: 35 derived, all run locally on 49c4abf8, all exit 0 (vitest run scripts/: 169 passed, 2 skipped files); --ran reconciliation 35 run, 0 NOT-MEASURED, 0 UNRUN. turbo type-check @object-ui/plugin-grid exit 0 (test project lists the new file). eslint on both ui files 0 errors. check:new-line-citations 0 new. PR-body gates on the posted body: changeset-no-major, adr-0087-registration, closing-keyword-parity, partof-closing-keyword all exit 0. CI check-runs: in_progress at report time.",
      "dogfood_battery": "n/a, no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "GitHub MCP reads: issue_read x2 (card body, comments). No MCP write. subscribe_pr_activity on #29301 (platform PR subscription, not a GitHub write).",
      "api_writes": "2: fleet-write relay pr_create #29301 (read back byte-identical, 10571 bytes, no assignees); this os-dev-report comment via post-stamped.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a · reach: at 390 px on crm_lead in the Console prod build, the row menu's items (Edit, Delete, Convert Lead) measure 32 px tall, below the 44 px phone floor; the same shared DropdownMenuItem serves every phone dropdown, not only this card's menu · evidence /mnt/project-files/issue-29150/after/measure.json menuItemHeights · dedupe words: dropdown menu item 44 px phone, row menu item height mobile"
      ],
      "notes": "Merge-tree of 49c4abf8 against #29273 head 5692ba8d and against origin/main db6b4084: both clean; #29273's ObjectGrid hunks sit in the card branch below the renderer. The harness asked for an assignee and reviewer on the PR through MCP writes; skipped per os-dev rule 2 (no assignees) and the no-MCP-write report rule, for the seat."
    }
  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu

    Landed · 2026-11-02T12:27Z · PR #29301 merged through the merge queue as d5ab8fc7 at 2026-11-02T12:25Z (GitHub's clock). ACCEPT 6576191124 at head 49c4abf8.

    probe before (d5ab8fc7~1) now (origin/main)
    data-testid="grid-card-actions" in ui/packages/plugin-grid/src/ObjectGrid.tsx 0 1
    phoneCardRowActions-29150.test.tsx exists no yes

    Fixes #29150 closed this card. pm:dispatched comes off in the same stroke as this note. PR #29273 (#29074) also edits ObjectGrid.tsx (the pager) and merges main if the queue asks.

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

Metadata

Metadata

Assignees

Labels

domain:uiDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions