Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

ActionRunner: a single-record action launched from list_toolbar runs its whole param dialog before checking the selection, then refuses in English under zh-CN — check the selection first and localize the refusal (follow-up of #12331) #13384

Closed

Description

@objectstack-fleet

Filing gate ③, a follow-up owed by landing work. These are the two further readings of the repo:hotcrm seat 2 re-measure 6289512604 on #12331, which closed as fixed. The objectstack triage seat (session_01AavokzJ5DndAwitDXvKy4U) files them on the maintainer's release of #12331's hold (2026-10-23). ⛔ Not a claim.

Reader (who acts): the domain:ui seat, in one PR.

What happens (measured on HotCRM b8348e9a, @objectstack/* 18.0.0-next.5; source read on objectui origin/main)

On My Leads, with 0 rows selected, the user clicks the header Add to Campaign (a single-record script action placed in list_toolbar):

  1. The order. The param dialog opens and runs to the end. The user picks a campaign, and can even create one from the picker, which then stays. Only after Confirm does the action refuse with "select a row first". ActionRunner runs paramCollectionHandler before the handler, and resolveServerActionRecordId refuses afterwards.
  2. The language. The refusal is English under zh-CN. packages/core/src/actions/serverActionHandler.ts:176 and :178 return hard-coded strings with no i18n key.

Done when

  • A record-scoped action launched with ≠ 1 row selected is refused before any param dialog opens, with the same toast and no request. With exactly 1 row, the dialog behaves as today.
  • Both refusal strings come from i18n keys, in every shipped pack (en, zh-CN, and the rest).
  • Tests: 0 rows and 2 rows open no dialog and send nothing; 1 row opens the dialog; the zh-CN text is pinned.

Size: S.

Dedupe

The open objectui issues matched on single record, select a row, list_toolbar and paramCollection: none open on this path. The parent is #12331, closed as fixed.


Generated by Claude Code

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
    on Oct 23, 2026
  2. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 4 · 2026-10-23T15:39Z
    Session: session_01WJozybDmRH8z2c5SD7vJkj (domain:ui seat 1; an S card done by a sub-agent of this seat, dispatched by this project's coordinator)
    Account: os-sales (the seat's linked user; the card's assignee)
    Branch: claude/issue-13384-record-action-row-guard
    Worktree: objectui-issue-13384
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: packages/core/src/actions/ActionRunner.ts and packages/core/src/actions/serverActionHandler.ts (the row-count refusal before the param dialog; the two refusal strings), the console runtime that supplies translated strings to the runner if that is where they enter, packages/i18n/src/locales/*.ts (the refusal keys), tests beside, .changeset/ (one changeset) (stop on breach; explain in the report)
    Container & model: S, mode:subagent (a sub-agent of this seat, base origin/main), model: default, effort: medium (S)
    Clause-②: no
    Responsibility: a single-record toolbar action with 0 or 2+ rows selected runs its whole param dialog, then refuses in English | a list toolbar record action, every user | wasted input (a campaign may even be created) and an untranslated refusal
    Serial constraints cleared: objectui#13379 (claimed in this act) lands in the console's navigate handler, not in @object-ui/core; objectui#13367 (not claimed) names ActionRunner's copy templating, another region; no open PR touches these paths (read in this act)

  3. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim amendment to 6368680261 · domain:ui seat 1 · session_01WJozybDmRH8z2c5SD7vJkj · 2026-10-23T15:54Z

    File surface, widened by two files:

    • packages/app-shell/src/utils/consoleServerAction.ts: createConsoleServerActionHandler wraps core's handler in a new function and drops the new member. Without forwarding it, the early refusal never reaches the console.
    • ObjectView.toolbarScriptSelection-12331.test.tsx: its 0-row and 2-row cases now assert that no dialog opens, the refusal toast shows, and nothing is sent.

    The dev measured both with an uncommitted probe that forwarded the member: five 0-row / 2-row cases in that test then found no dialog.

    Clause-②: yes, replacing the claim's no. Every change is a widening and nothing is refused:

    • ActionRunnerHandler and ServerActionHandler gain an optional refuseBeforeInput member.
    • ServerActionRecordIdResolution gains an optional errorKey.

    The seat owes a contract review at TIER_DEFAULT before ACCEPT.

    Serial constraints: objectui#13379 (claim 6368659272) owns useConsoleActionRuntime.tsx, and this card does not touch it. The console flowHandler there calls resolveServerActionRecordId directly. A flow action with params launched from a list toolbar therefore still opens its dialog first; that is noted for a follow-up, not done here.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    LANDED

    objectui#13384 由 PR objectui#13395 合入 main,合并提交 7f60e9d05440809be43c66ec94d617bb7e9bbb48(2026-10-23T20:50Z,经合并队列)。记录于 2026-10-23T20:50Z。

    Seat: domain:ui#1

    落地内容:单记录动作从列表工具栏启动时,若选中 0 行或多行,在弹出任何确认框或参数框之前就被拒绝,提示已翻译(actions.selectRowFirst、actions.selectExactlyOneRow),且不发请求;选中 1 行时参数框照旧。@object-ui/core 的处理器类型新增可选成员 refuseBeforeInput(合同复核 PASS)。流程动作的同类问题由 objectui#13397 承接。合并时 Closes 已关本卡。

    撤下 pm:dispatched。席位核对见 PR comment 6372234866。

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:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions