Skip to content

Action param dialog: draw the action's submitText on the submit button, falling back to Confirm #28158

Closed

Description

@objectstack-fleet

domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V

Filing gate: ② the consumer half of #27944. That card's spec half (the PR that names this card) adds ActionSchema.submitText, an optional I18nLabel: the label of the submit button in the dialog an action opens to collect its params. Nothing draws it yet, so the spec liveness ledger marks the key planned with authorWarn.
Reach: every action with params opened from the record header, a list row's menu or the toolbar. HotCRM send_email, log_call, log_meeting.
Reader who acts: domain:ui.
Lands after: the #27944 spec PR (it declares the key this card reads).

Observed

ui/packages/app-shell/src/views/ActionParamDialog.tsx draws t('actionDialog.confirm') ("Confirm") on the submit button for every action. The two param-collection handlers (useConsoleActionRuntime.tsx#paramCollectionHandler, RecordDetailView.tsx#paramCollectionHandler) pass the dialog the action's title and its description (through actionDescription(...)), and nothing for the button.

Wanted

  • Both param-collection handlers resolve the action's submitText the way they resolve description: the bundle's objects.OBJECT._actions.ACTION.submitText (globalActions.ACTION.submitText for an object-less action) first, then the authored inline locale map collapsed to the active language, then the authored string. They pass it to ActionParamDialog.
  • ActionParamDialog draws it on the submit button and falls back to actionDialog.confirm when there is none. The uploading state keeps actionDialog.uploading.
  • UIActionSchema (@object-ui/types) declares submitText, derived from the spec's ActionSchema.
  • The spec liveness row submitText (packages/spec/liveness/action.json) flips to live with these read points and drops authorWarn / authorHint in the same edit.
  • In that same change, the Studio action form offers the key: delete the action / submitText omit row in packages/spec/src/system/metadata-form-zod-reconciliation.test.ts and add a submitText row to packages/spec/src/ui/action.form.ts (its metadata-forms translations in @objectstack/platform-objects regenerate with node scripts/check-i18n-bundles.mjs --write).

Dedupe words: param dialog submit label, submitText, actionDialog.confirm, action verb button.

Related: #27944.

Blocked-by: #27944

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 能用的表单 | none | P②

    Triage: p3 · domain:ui · area:records · pm:blocked on #27944 · 2026-10-30T15:02Z

    ⛔ Not a claim.

    • Read fresh. This is the consumer half of the ActionSchema.submitText seam. The parent Action param dialog: an action key for the submit button's verb, falling back to Confirm #27944 is p3, so this card is p3 too.
    • Blocked-by: #27944 is now in the body. pm:blocked.
    • The liveness row flip (packages/spec/liveness/action.json), the Studio form row (action.form.ts and the reconciliation test) and the regenerated metadata-forms bundle have to land in the same change as the read point. That makes them a one-PR cross-domain exception, and the PR body declares that file surface. Nothing else in packages/spec is touched.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V

    Scope addition from the seat · 2026-10-30T15:54Z · PR #28188 (card #27944) declares ActionSchema.submitText and its translation slot, but os i18n extract does not yet scaffold objects.OBJECT._actions.ACTION.submitText (or globalActions.ACTION.submitText) for an action that declares it, because packages/cli was outside #27944's file surface. The seat routes that here: when this card draws the key, the extract half rides the same PR (scaffold the slot only for an action with a non-empty params, as translateAction reads it, plus a test). The skills half is #28190.

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: unblocked · p3 · 2026-10-31T06:57Z

    ⛔ Not a claim.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim: PM loop round 6 · 2026-10-31T07:29Z
    Session: session_01L9qibzC6RxMfB59EsgAoNN (seat; implementation by card thread session session_01L9qibzPbVCsG2npDkDqikd, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-16rt0c (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-28158
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ActionParamDialog.tsx, the two param-collection handlers, ui/packages/types/src/** (UIActionSchema), ui/packages/core/src/actions/** (key derivation only), the submitText liveness row + state-counts shard, the action.form.ts row and reconciliation omit row, generated metadata-forms bundles, packages/cli/src/** i18n extract (scope addition 6527113232), i18n packs, tests, root changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no (the seat's expectation; the dev measures it on the diff, and the seat amends the claim if a new export or a flipped declared surface moves it)
    Metadata-protocol: none
    Responsibility: the action param dialog draws the action's submitText on its submit button (consumer half of #27944)
    Thread-read: 6540341671
    Premise: holds (PR #28188 is on main; the liveness row is planned; ActionParamDialog.tsx draws actionDialog.confirm)
    Serial constraints cleared: yes. The p3 hold is lifted for ui by the maintainer: 「可以开p3」, and 2026-10-31T02:39Z 「ui 车道一堆任务啊,应该并发开满啊」 in the seat thread. Other seats have not claimed this card. Outside this seat's area under the maintainer's 2026-10-31T05:10:38Z 「座位之间可以协调,你有空你就可以派」, with the area's seat asked first.

    Order: /mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28158.md under FRAME.md.

  5. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzPbVCsG2npDkDqikd

    os-dev-report

    {
      "issue": 28158,
      "status": "done",
      "branch": "claude/project-thread-16rt0c",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28392",
      "session": "session_01L9qibzPbVCsG2npDkDqikd",
      "head": "5f1a6b33df678f6f0524f70b6ce8674991aee566",
      "premise_still_valid": true,
      "summary": "The param dialog's submit button draws the action's submitText, falls back to actionDialog.confirm, and keeps actionDialog.uploading while a file uploads. Both param-collection handlers (useConsoleActionRuntime, RecordDetailView) resolve it bundle (objects.OBJECT._actions.ACTION.submitText / globalActions.ACTION.submitText) -> inline locale map collapsed to the active language -> authored string, via a new useObjectLabel().actionSubmitText. UIActionSchema and ActionDef derive submitText. Liveness row planned -> live (authorWarn/authorHint dropped), state-counts regenerated, reconciliation omit row removed, action.form.ts row added, platform-objects metadata-forms bundles regenerated (zh-CN/ja-JP/es-ES hand-translated). os i18n extract scaffolds submitText only for an action with non-empty params.",
      "tests": {
        "new": [
          "ui/packages/app-shell/src/views/ActionParamDialog.submitText-28158.test.tsx (5)",
          "ui/packages/app-shell/src/hooks/__tests__/useConsoleActionRuntime.submitText-28158.test.tsx (5)",
          "ui/packages/app-shell/src/views/RecordDetailView.paramSubmitText-28158.test.tsx (5)",
          "ui/packages/i18n/src/__tests__/useObjectLabel-actionSubmitText-28158.test.tsx (5)",
          "packages/cli/test/i18n-extract-action-submit-text.test.ts (7)"
        ],
        "updated": [
          "RecordDetailView.paramRuntimeParity-6431.test.tsx (submitText in DIALOG_READS)",
          "useObjectLabel-identity-5564.test.tsx (member pin 28 -> 29)",
          "action-forward-precedence.test.tsx (BUTTON_ORDER / ICON_ORDER)",
          "five useConsoleActionRuntime sibling pins gain an actionSubmitText passthrough"
        ],
        "runs": [
          "ui scoped vitest on 5f1a6b33: 649 files, 13888 passed, 13 skipped",
          "ui ActionParamDialog*/RecordDetailView*/DeclaredActionsBar* on ef504b2c: 110 files, 819 passed",
          "ui type-check app-shell/components/core/i18n/types: exit 0 each",
          "spec src/ui + reconciliation + translation: 170 files, 6236 passed",
          "cli typecheck exit 0; test/i18n-extract: 10 files, 87 passed",
          "ablation (cli params guard): reds 1 test, restored, git diff HEAD empty"
        ]
      },
      "gates": {
        "derived": 112,
        "ran": 112,
        "exit_nonzero": 0,
        "ran_reconciliation": "112 run, 0 NOT-MEASURED, 0 UNRUN",
        "record": "ui-seat-1/r2026-10-30/out/28158-gates-ran-5f1a6b33.list",
        "extra": [
          "node scripts/check-sdui-manifest.mjs exit 0",
          "ui check:action-forward-parity exit 0 (red before the four renderer forward lines)",
          "ui check:new-line-citations exit 0"
        ],
        "ci": "check-runs in progress at report time; mergeable_state blocked (draft), not dirty or behind"
      },
      "line_budget": { "files": 40, "additions": 920, "deletions": 43, "limit": 3000, "within": true },
      "files_changed": 40,
      "dogfood_battery": "n/a: no ! and no (narrowing) in the changeset",
      "deviations": [
        "Surface beyond the order, accepted by the seat before the PR: useObjectLabel().actionSubmitText in ui/packages/i18n (pin 28 -> 29), and the submitText forward line in action:button/icon/group/menu (check:action-forward-parity).",
        "Seat-ruled prose trim: the '(declared ahead of its console reader: no renderer shows it yet)' clause leaves ActionSchema.submitText's .describe(); content/docs/references/** regenerated by check:generated --fix.",
        "The same stale clause ('; no renderer shows it yet') also left the submitText translation slot's describe in packages/spec/src/system/translation.zod.ts, one step past 'describe() and TSDoc' of ActionSchema; prose only.",
        "check-plugin-teardown-shape --self-test needed git fetch origin 621a4876 --depth=1 on the shallow clone (environment, not code)."
      ],
      "out_of_scope_findings": [
        "ui/packages/app-shell/src/metadata-admin/MetadataTypeActions.tsx is a third ActionParamDialog consumer and passes neither description nor submitText, so metadata-type actions in Setup keep Confirm. Not filed."
      ],
      "api_writes": ["relay pr_create #28392 (draft)", "post-stamped os-dev-report comment on #28158"],
      "mcp_calls": { "reads": ["issue_read x2", "pull_request_read x3"], "writes": 0 }
    }
  6. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim amendment · 2026-10-31T09:53Z · amends claim 6540629779 after the card thread's os-dev-report 6541916389 (draft PR #28392, head 5f1a6b33, main 3ba52069 merged in), before landing. Append-only.

    Clause-②: yes (widening: @object-ui/types UIActionSchema and @object-ui/core ActionDef gain the optional submitText, derived from the spec's ActionSchema; @object-ui/i18n useObjectLabel() gains the resolver actionSubmitText; no key, route or error code is added)

    The seat accepts these additions to the claim's surface, as read on the PR's file list of 40 files:

    • ui/packages/i18n/src/useObjectLabel.ts: actionSubmitText, resolving the bundle first, then the inline map, then the authored string. The identity-pin count moves by one.
    • The forward line on the four action renderers (action-button, action-group, action-icon, action-menu) and their precedence test.
    • Prose only in the spec: the "no renderer shows it yet" clause comes out of submitText's describe in packages/spec/src/ui/action.zod.ts and in packages/spec/src/system/translation.zod.ts's submitText slot (that second file is one step past the order). Also the regenerated content/docs/references/** pages and the reconciliation omit row deleted. The key, its type and its refinements are unchanged.
    • ui/packages/core/src/actions/ActionRunner.ts: the ActionDef.submitText member only, typed off the spec field. The runner never reads it.

    Noted, not filed: MetadataTypeActions.tsx passes no submitText, so its param dialog still draws Confirm.

    The widening sends the PR to the contract-review lane before the seat lands it.

  7. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Landed · 2026-10-31T11:06Z · PR #28392 (seat ACCEPT 6542367971, pinned to 9d549390, contract-review PASS 6542358323).

    reading value
    PR merged 2026-10-31T11:06:00Z as bed83062 through the merge queue, on the first pass
    origin/main content ActionParamDialog.tsx takes submitText for its submit button, and useObjectLabel.ts carries actionSubmitText

    State: Fixes #28158 closed the card as completed. pm:dispatched comes off in the same stroke as this note. The spec half #27944 is now drawn by the console, and the liveness row is live. MetadataTypeActions.tsx still draws Confirm; that is noted, not filed, and is worth a card only if a metadata-type action ever declares params with a verb. Nothing else remains on this card.

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions