Skip to content

record create / edit dialog: a failed submit shows a summary banner ("请检查表单中标记的字段:名、姓、公司...") over the dialog title and the same messages under each field — one of the two, placed clear of the title #25874

Closed

Description

@os-steve

Filing gate ① a user-visible defect with a named landing site. Batch-of: 2026-10-25 browser pass on @objectstack/* 18.1.0 (second batch, 8 cards). Filed by the maintainer's account (os-steve) from the HotCRM pass driven in session session_01AwpXhq2nFKU6J7GmbCEmZu; ⛔ not a claim. Grade and routing are objectui triage's.

What is seen (HotCRM on @objectstack/console 18.1.0)

新建线索 → 创建 with nothing filled: four fields get the red outline and a message under each (「名不能为空」「姓不能为空」「公司不能为空」「邮箱不能为空」), and at the same moment a red banner 「请检查表单中标记的字段:名、姓、公司...」 is drawn over the dialog's title row, truncating its own list with 「...」. The banner repeats what the fields already say, hides 「新建线索」, and the truncated list is less information than the fields below it. 71-new-lead-empty-submit.png;`` the dialog before submit: 70-new-lead-form.png.

reach: the public UI, measured once; every record dialog with required fields shows it on an empty submit.

Expected

Per-field messages carry the detail; the summary, if kept, is one short line inside the dialog body (above the first section, not over the title) saying how many fields need attention and focusing the first one — or a toast placed clear of the header, the rule objectui#13340 set for Setup forms.

Dedupe

MCP search_issues objectui "form validation error summary banner duplicates per-field messages and covers the dialog title" → 6 hits; nearest is objectstack-ai/objectui#13340 (closed: Setup forms' duplicate toasts covering header buttons), which fixed the Setup toast stack and not the record dialog's banner. Report: REPORT.md §4.4.

Activity

  1. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    and removed on Oct 25, 2026
  2. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Triage: first grade — bug · priority:p3 · domain:ui · area:records · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-25T14:53Z

    ⛔ Not a claim, ⛔ not a dispatch.

    • One error presentation: field-level messages, plus a short banner placed clear of the title only when an error has no field.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Transferred 2026-10-26T01:59Z from objectstack-ai/objectui#13538, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the ui/ workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.

    Paths. The body names no file paths; the UI code it describes lives under ui/ here (the Console is ui/apps/console, the libraries ui/packages/*).

    References. The bare issue numbers in the body were written in objectui and now resolve against this repository by mistake; read them as objectstack-ai/objectui#13340.

    No stale pm:dispatched or assignee to strip.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1
    Session: session_017iXjUm1rujwDk7f3KT1Pkk (seat); implementing card thread session_01CzUs1oNtFWhWUXT7rmoGy2
    Account: os-steve
    Branch: claude/project-thread-eprqgc (platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record)
    Worktree: the card thread's own container
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/components/src/renderers/form/form.tsx (announceFieldErrors and the reveal / focus path), its tests, scripts/sdui-manifest.record.json (derived hash); ui/packages/app-shell ConsoleToaster only if placement must change. Ruling: route (c), as seat 2's premise check proposed. Drop the field-level toast and keep reveal + focus on the first invalid field. An error inside a hidden tab must switch to that tab first, so the error is visible (stop on breach; explain in the report). ⛔ ui/.github/** and the root .github/workflows/ci.yml are out of bounds (maintainer's word, ui-merge epic in flight). Changeset in the root .changeset/.
    Container & model: S, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a: renderer defect in ui/, the producing code is the cited ui file; no platform path covers it; reached through the public Console
    Thread-read: 6406547000
    Premise: holds (premise check by seat domain:ui#2 at origin/main ~08:30Z: the "banner" is a sonner toast raised by announceFieldErrors in form.tsx; plugin-form is not involved; spot-checked by the seat 2026-10-26T09:06Z)
    Serial constraints cleared: none: no open PR touches form.tsx (open-PR file scan 2026-10-26T09:06Z; #25985, the last one in this area, merged at 08:59Z)

    Dispatch order handed to the card thread by the project coordinator (three partitions: ruling / mechanism hypotheses / suggested route); the dev does not claim, and starts only once this claim names its branch.

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 25874,
      "status": "done",
      "branch": "claude/project-thread-eprqgc",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26040",
      "session": "session_01CzUs1oNtFWhWUXT7rmoGy2",
      "premise_still_valid": true,
      "summary": "Route (c) as claimed. announceFieldErrors in ui/packages/components/src/renderers/form/form.tsx no longer raises the field-list toast; it scrolls to and focuses the first invalid field in form order, activating its background tab first. It now returns the rejected names with no drawn input (predicate-hidden tab or section); on the server path any such name falls through to the existing form-level banner + toast with the server sentence, and the hidden tab is never activated. Because no refusal toast supersedes the outcome id any more, the client-invalid handler now clears submitError and dismisses the outcome id (previous refusal, or the objectui#8070 clear-on-hide notice). ConsoleToaster untouched.",
      "tests": "head cb3fe1a0. From ui/: node_modules/.bin/vitest run --maxWorkers=2 packages/components/src/renderers/form/__tests__/ -> Test Files 78 passed (78), Tests 545 passed | 17 skipped (562), lock VERDICT command-exit 0; re-run after merging origin/main 39a78b15, same result. Reverse verification: form.tsx restored to base 3518664c (git restore, tree only) over the 5 changed test files -> 5 failed | 33 passed (the 5 new/changed assertions; joiner file green as predicted); restored with git checkout HEAD, git diff HEAD empty, blob hash 4c8551d8 equals HEAD blob. pnpm --filter @object-ui/components type-check -> exit 0 (0 error TS). Ablation n/a beyond the reverse run: tests import form.tsx from src, no dist leg.",
      "gates": "local: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 46 families; all 46 run, each exit 0 (captured before any pipe); --ran reconciliation: '46 run, 0 NOT-MEASURED (a DERIVED zero — all 46 recorded an exit code and none of them is 3)'. Derived at 60aa2b49 (pre-merge); after merge the delta is only the re-recorded scripts/sdui-manifest.record.json, check-sdui-manifest exit 0 at cb3fe1a0. CI families: PR #26040 check-runs in_progress at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "5 — mcp__github__issue_read x4 (get, get_comments x3), mcp__claude-code-remote__subscribe_pr_activity x1; no MCP write tool",
      "api_writes": "3 — git push (not REST); relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, POST /issues/26040/assignees); this os-dev-report comment via post-stamped.mjs (POST /issues/25874/comments)",
      "files_changed": [
        "ui/packages/components/src/renderers/form/form.tsx",
        "ui/packages/components/src/renderers/form/__tests__/form-invalid-scroll.test.tsx",
        "ui/packages/components/src/renderers/form/__tests__/form-server-field-errors.test.tsx",
        "ui/packages/components/src/renderers/form/__tests__/fieldtab-visiblewhen-6237.test.tsx",
        "ui/packages/components/src/renderers/form/__tests__/visiblewhen-clear-notice-8070.test.tsx",
        "ui/packages/components/src/renderers/form/__tests__/form-invalid-toast-joiner.test.tsx",
        "scripts/sdui-manifest.record.json",
        ".changeset/25874-form-refusal-no-field-toast.md"
      ],
      "deviations": [
        "Client-invalid handler now also clears submitError and dismisses the outcome toast id: needed because the removed refusal toast was what superseded the previous outcome (objectui#8070 test pinned that); declared in the PR body.",
        "Server rejection of a field with no drawn input falls through to the form-level banner + toast: keeps the case the removed toast covered (the triage note: a short banner only when an error has no field).",
        "Merged origin/main (no rebase) and re-recorded scripts/sdui-manifest.record.json to clear the record conflict before opening the PR.",
        "Reviewer request for os-steve not sent: the dispatch order forbids GitHub MCP writes and the os-dev write budget is three; the seat can add it via relay pr_request_reviewers."
      ],
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  6. os-steve commented on Oct 26, 2026

    @os-steve
    CollaboratorAuthor

    Seat domain:ui#1: done. The fix (a refused submit focuses the first invalid field instead of toasting the field list over the dialog title) shipped via #26040, folded into the i18n batch #26158, merged 2026-10-26T16:46:30Z as 326a559.


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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions