Skip to content

List grid Actions column: a visible low-emphasis ⋯ on every row at rest, instead of a header over a column that looks empty until the pointer hovers a row #28871

Closed

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

Filed by the record-page epic seat, part of epic #26676. The seat walked the console on main c064d3a246, with examples/app-crm as the backend, at 1440 / 1100 / 375 px, light and dark. An independent review pass then checked each finding against the code. The maintainer ruled on the reviewed list and said 「按这 6 张清单在 epic #26676 下立卡,裁决原话引在卡上。」 and 「还有刚才立的卡可以交给ui车道处理吗?」 (2026-11-02). So this card goes to the domain:ui lane queue. Priority and area:* are left to triage. Code readings below are on main 3b920f6dd0.

Observed

On the lead and opportunity lists at 1440 px, the last column is headed 操作, and the cells under it are empty until the pointer is over a row. A reader takes the column for "no actions available".

Reading

  • The header is always drawn: ui/packages/plugin-grid/src/objectGridActionsColumn.tsx:181, t('grid.actions').
  • The trigger is hidden at rest on a fine pointer: ui/packages/plugin-grid/src/components/RowActionMenu.tsx:731, opacity-0 … group-hover/row:opacity-100.
  • On touch (pointer-coarse:opacity-100) it is already visible. This card is about desktop.

Target

Acceptance

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 · domain:ui · 2026-11-02T02:59Z

    ⛔ 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 12 · 2026-11-02T03:34Z
    Session: session_01QsR2jSUCWFfGqhaRR97caT (card thread, os-dev); dispatched by seat session session_01QsR2jUJ19MstFvFhjgiYTu
    Account: zhuangjianguo
    Branch: claude/project-thread-i24ri9 (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-28871
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/plugin-grid/src/components/RowActionMenu.tsx (the at-rest opacity of the row trigger), ui/packages/plugin-grid/src/objectGridActionsColumn.tsx only if the header needs to change, their tests, and a root .changeset; server and packages/spec read only (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6567976964
    Premise: holds (at origin/main b15b634c: RowActionMenu.tsx:731 draws the trigger opacity-0 at rest on a fine pointer; objectGridActionsColumn.tsx:181 always draws the grid.actions header)
    Serial constraints cleared: none known (#28865, seat 4, inherits this later and is not touched here).

  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_01QsR2jSUCWFfGqhaRR97caT
    os-dev-report

    {
      "issue": 28871,
      "status": "done",
      "branch": "claude/project-thread-i24ri9",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28922",
      "session": "session_01QsR2jSUCWFfGqhaRR97caT",
      "premise_still_valid": true,
      "summary": "RowActionMenu's row trigger (data-testid row-action-trigger, drawn per row by the list grid's _actions column) is now drawn at rest on every row and every pointer type in text-muted-foreground, and turns text-foreground on group-hover/row, group-focus-within/row, group-data-[state=selected]/row, data-[state=open], focus-visible and pointer-coarse (seat order: coarse pointer keeps full strength). opacity-0 / transition-opacity are gone; the tone is a text colour so the resting glyph keeps muted-foreground contrast. Menu set, gates and order (useRowActionPlan, #28434), inline primaries, empty-menu guard, 44 px target and accessible name unchanged; objectGridActionsColumn.tsx not touched. New pin RowActionMenu.atRest-28871.test.tsx (4 cases). Premise held at origin/main b15b634c. File surface: RowActionMenu.tsx, its new test, .changeset/28871-row-action-trigger-at-rest.md (patch, Clause-②: no, Metadata-protocol: none) -- no breach.",
      "tests": "At 7d467519 under os-verify-lock after turbo build plugin-grid^... + formula/sdui-parser/lint/client (49 tasks, exit 0): ui vitest packages/plugin-grid/ --maxWorkers=2 -> Test Files 271 passed (271), Tests 2353 passed (2353); RowActionMenu* 5 files 81 passed. pnpm --filter @object-ui/plugin-grid run type-check (tsc + tsconfig.test.json) exit 0. ESLint on 2 changed tsx exit 0. Ablation via scripts/ablation-replace.mjs (source-resolved, no dist): opacity-0 back at rest -> 1 failed / 3 passed ('is drawn at rest: nothing hides it before the pointer reaches the row'); pointer-coarse:text-foreground -> pointer-coarse:opacity-100 -> 1 failed / 3 passed; both restored, blob adea0869 == HEAD, git diff HEAD empty. Not run locally: plugin-view / plugin-designer / app-shell tests that click row-action-trigger by test id (they read no classes); CI Test UI.",
      "gates": "dispatch-gates --commands at 7d467519: 34 derived, 34 run, each exit 0 (check:type-check-debt and pnpm --dir ui exec vitest run scripts/ under the lock, the latter 169 passed / 2 skipped); PR-body gates re-run on the final body as GITHUB_EVENT_PATH (changeset-no-major, adr-0087-registration, closing-keyword-parity, empty-changeset) exit 0; check-partof-closing-keyword with PR_BODY exit 0; ui check:new-line-citations 0 new. --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. CI at pr_create: 17 in_progress, 3 skipped, 0 failed.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "5 — issue_read x2 (get, get_comments), pull_request_read x1 (get_check_runs), ToolSearch loads x2; no write tool",
      "api_writes": "3 — git push (branch), fleet-write pr_create (POST /repos/objectstack-ai/objectstack/dispatches -> relay run 41387897655, PR #28922, body read back 6263/6263 identical, no assignees), this os-dev-report comment via post-stamped",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: none (consistency note, not filed) · carrier: seat · ui/packages/components data-table.tsx draws its own row-actions trigger (data-testid data-table-row-actions, generic data-table schema rowActions) with the old opacity-0 hover-reveal set, pinned by data-table-leadingCell-12423.test.tsx; app-shell objectViewOpenAsPage.tsx has a hover-revealed control in the same style. Outside this card's file surface; noted in the PR's Acceptance notes. dedupe words: data-table-row-actions, opacity-0 hover reveal, row actions at rest"
      ]
    }
  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu

    Landed · 2026-11-02T04:52Z · PR #28922 merged through the merge queue as ff881050 at 2026-11-02T04:52Z (GitHub's clock). ACCEPT 6569159443 at head 7d467519.

    probe before (ff881050~1) now (origin/main)
    row trigger class starting sm:min-w-0 opacity-0 in plugin-grid/src/components/RowActionMenu.tsx 1 0
    row trigger class starting sm:min-w-0 text-muted-foreground in the same file 0 1
    RowActionMenu.atRest-28871.test.tsx exists no yes

    Fixes #28871 closed this card. pm:dispatched comes off in the same stroke as this note. The data-table renderer's twin is #28923.

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