Skip to content

Record header: one primary action, the rest secondary; a declared record_header action (Convert Lead) is missing from the header and the ⋯ menu #12617

Closed

Description

@objectstack-fleet

Source

Walked on objectui main 8415d9f11 with HotCRM 63db83e2, the lead record /apps/app.objectstack.hotcrm/crm_lead/record/lZxZJxDxLzE08lyU and the opportunity record /crm_opportunity/record/maC9HZ_MynW5tj40 at 1024 px.

  1. The lead header renders three filled primary buttons "Log a Call · Log a Meeting · Schedule a Meeting" (the package's activity actions), then Edit as an icon button, ⋯ and Refresh; the opportunity header renders "Generate Quote · Clone Opportunity · Log a Call" the same way. Every header action is drawn with the primary style, so nothing is primary. The spec says otherwise: packages/spec/src/ui/action.zod.ts gives actions variant: 'primary' | 'secondary' | 'danger' | 'ghost' | 'link' and order, and documents that "in record_header the first visible action becomes the primary button" and that renderers may prefer variant: 'primary'.
  2. HotCRM declares convert_lead ("Convert Lead", locations: ['record_header', 'list_item'], src/sales/actions/lead.actions.ts) and schedule_followup with the same locations. Neither is in the lead header nor in its ⋯ menu, which holds only Edit · Add to favorites · Share · Delete. The lead's most important action is unreachable from the record page; the list row's ⋯ was not checked.

Target

  1. The header draws one filled primary button: the first visible record_header action by order (or the one with variant: 'primary'); the next two as outline buttons; the rest in the ⋯ menu above Share / Delete. Edit stays a labelled outline button, never only an icon, since it is the record's base action.
  2. Every action declared for record_header whose visibleWhen / permission passes is rendered somewhere in the header group; the card finds why convert_lead is dropped (registration, condition, capability or a cap on the count) and fixes that path, with a test that a declared action with a passing condition is present.
  3. The list row's ⋯ menu renders list_item actions the same way; the card verifies it on the lead list.

File surface

packages/plugin-detail/src/DetailView.tsx (header actions), the record-header action resolver in packages/app-shell/src/ (where declared actions are read and filtered), packages/plugin-list row menu, tests beside each.

Acceptance

  1. Tests: three record_header actions render as one primary + two outline; a fourth goes to ⋯; a declared action with a true condition is present; variant: 'primary' wins over order.
  2. Screenshots of the lead and opportunity headers at 1280 px, light and dark.
  3. pnpm --filter @object-ui/plugin-detail test, pnpm --filter @object-ui/app-shell test green.

Constraints

  • objectui#12303: a disabled or hidden-by-condition action explains itself through the tooltip wrapper when it is drawn disabled; one that fails its condition is absent.
  • No change to HotCRM's declarations; if the drop is caused by the app's visibleWhen, the card says so and files the app card on objectstack-ai/hotcrm.

Evidence

Screenshots on the temporary branch claude/console-home-login-design-20261016 of objectstack-ai/objectui (commit b72c97985, never merged): hotcrm-lead-record-header-and-stage.jpg · hotcrm-lead-more-menu-no-convert.jpg · hotcrm-opportunity-record.jpg.

Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-16 walk of HotCRM's core pages as a user: objectui main 8415d9f11, HotCRM 63db83e2, the vite console on :5180 against objectstack serve --dev on :4001, the maintainer's browser pane at 1024 × 768 (en). The maintainer asked for the findings to be filed on the repository each belongs to, verbatim: 「相关问题也在对应的项目上创建任务」.

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    and removed on Oct 16, 2026
  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2
    Session: session_01XVp19E1MYUTFM3dnkwz8gB
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12617-record-header-actions
    Worktree: objectui-issue-12617
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: packages/plugin-detail/src/DetailView.tsx (header actions); the record-header action resolver in packages/app-shell/src/ (where declared actions are read and filtered); the page:header action banding in packages/components/src/renderers/layout/containers.tsx only if the record header draws through it; the plugin-list row menu for target 3; the tests beside each; and one .changeset/12617-*.md (stop on breach; explain in the report). ⛔ No change to HotCRM's declarations.
    Container & model: M, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate)
    Clause-②: no
    Responsibility: objectui: the record header draws every action with the primary style and drops a declared record_header action (convert_lead) | the spec's action variant and order, and the documented first-visible-is-primary rule | every console user on a record page whose app declares record_header actions; measured on the HotCRM lead and opportunity records
    Thread-read: none
    Serial constraints cleared: no open PR touches DetailView.tsx, the action resolver or containers.tsx. The PR #12545 (objectui#12529) header bands landed earlier and are the base this card builds on.
    Claimed at: 2026-10-16T06:15Z

  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-16T10:02Z

    PR #12635 merged through the merge queue as ef71a09, which is on main. Verified by content:

    What landed:

    • The record header draws one filled primary: variant: 'primary' if an action declares it, else the first by order. The other inline actions are outline buttons, and the overflow goes to the ⋯.
    • Edit stays a labelled outline button in the row.
    • A host Delete always folds into the ⋯.

    Convert Lead: its absence on the walk came from HotCRM's own visible predicate, evaluated against the record the header held. objectui drops nothing. If it recurs with a loaded is_converted: false lead, reopen this card.

    Owed by the maintainer: the browser reading at 1280 px, light and dark.

    pm:dispatched leaves with this note, and the card closed completed on merge.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions