Skip to content

console list empty states: a member with no visible records reads "这里还没有数据 — 创建第一条记录即可开始" beside no Create button, and every "my …" view says only "没有匹配的记录" #25898

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 (23 cards: hotcrm 10, objectui 10, objectstack 3). 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, demo org)

  1. Signed in as a sales rep (sales_rep set, no case read), open /_console/apps/app.objectstack.hotcrm/crm_case. The list renders the object's seven view tabs, no 新建 button, and the empty state 「这里还没有数据 / 创建第一条记录即可开始。」. The database holds 38 cases; the member may read none. The text tells him the desk is empty and invites him to create a record he cannot create. r6-rep-cases.png.
  2. As the dev admin (owns nothing after demo:staff), 我的商机 / 我的线索 / 我的工单 and the Sales Home 「My Leads」 tab all show 「没有匹配的记录 / 没有符合该视图筛选条件的记录。」 — correct, and useless: the view's filter is owner = current user, so the message a user needs is "you own no opportunities yet" with the create action. 35-crm_opportunity_view_my_open_deals.png,`` 39-crm_case_view_my_open_cases.png.```

reach: the public UI, measured once per case above.

Expected

Three empty states, chosen by what the list knows:

situation the list knows text
the object has no records the caller may create into count 0 and the caller has create "no records yet" + Create
the caller may read none (count 0, no create, or a 403 on the read) no create permission / forbidden "你没有可查看的工单" + who to ask; never "create the first one"
the view's own filter matches nothing the view's filter is non-empty today's text; when the filter is on current_user, "你还没有负责的 …" + Create when allowed

The third row is what hotcrm AGENTS.md rule 4 asks for: a default, not an emptyState authored on every "my" view.

Dedupe

MCP search_issues objectui "list empty state no data yet create first record shown when user lacks visibility permission" → 1 hit, objectstack-ai/objectui#11687 (closed: the invite / filter wording), which fixed two other contradictions and did not cover the no-visibility case or the owner-filter case. Report: REPORT.md §2.2–2.3.

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:p2 · domain:ui · area:records · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-25T12:55Z

    ⛔ Not a claim, ⛔ not a dispatch. finding comes off.

    • A member who may read none of 38 cases is told the desk is empty and invited to create one. The empty state should tell 'no records you can see' apart from 'no records', and offer Create only with the create grant.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Transferred 2026-10-26T03:03Z from objectstack-ai/objectui#13516, 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#11687.

    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_01RYq63NT6L4eGmQNvE9e7D8
    Account: os-steve
    Branch: claude/project-thread-lr711r (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. Wording amended by the seat: an issue-shaped placeholder here was read by the Closing-Target Claim Guard as a second claimed branch)
    Worktree: the card thread's own container
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/plugin-list/src/ListEmptyState.tsx, ui/packages/plugin-list/src/ListView.tsx (empty-state region ~6210-6234 and the inline list.* fallback table ~934-949), ui/packages/plugin-grid/src/ObjectGrid.tsx (empty-state region ~7476-7483 and fallback table ~499-502 only), ui/packages/plugin-list/src/ObjectGallery.tsx (~677), ui/packages/i18n/src/locales/*.ts (ten packs); tests (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: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no (ListEmptyState is module-internal; the authored emptyState schema is unchanged)
    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: 6407280247
    Premise: holds (read-only premise check at origin/main 59d9181, 2026-10-26T06:54Z; spot-checked by the seat)
    Serial constraints cleared: ObjectGrid.tsx shared with #25858 by REGION (this card: empty state; #25858: group-header ordering); locale packs shared with #25916 (append-only keys); no open PR touches these files (open-PR file scan 2026-10-26T06:33Z)

    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": 25898,
      "status": "done",
      "branch": "claude/project-thread-lr711r",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25987",
      "head": "8878ebe80ccf2feef4f35be4c93e9fe3e13d4478",
      "session": "session_01RYq63NT6L4eGmQNvE9e7D8",
      "premise_still_valid": true,
      "summary": "ListEmptyState now picks two more cases: no filter and a caller KNOWN (permissions loaded) not to hold the listNew verdict reads 'No records you can see' and never draws the add-record action; a declared filter naming the signed-in user (resolved id or the {current_user_id} placeholder) reads 'Nothing of yours yet', Create only with the grant. ListView (grid+gallery), standalone ObjectGallery and ObjectGrid's default empty state decide the same way; four list.* keys in all ten locale packs and both in-code fallback tables. PM hypotheses held: copy chose from hasUserQuery/hasBaseFilter only, Create came from addRecord.enabled, ObjectGrid duplicated the decision, the 403 panel is its own state (untouched). The console host already withheld addRecord without the grant, so the visible defect was the copy.",
      "tests": "head 8878ebe8: 3 new files (ListView 9, ObjectGallery 4, ObjectGrid 5) 18/18 pass via real MePermissionsProvider + FilterScopeProvider; reverse verification with sources + locales restored to base 38050ced: 11 failed / 7 passed as predicted, restored from HEAD, git diff HEAD empty; vitest run packages/plugin-list/ packages/plugin-grid/ packages/i18n/ + plugin-form affordanceGrantMap-12082 census: Test Files 498 passed, Tests 5253 passed / 13 skipped (lock VERDICT command-exit 0); type-check plugin-list, plugin-grid, i18n: exit 0",
      "gates": "dispatch-gates --commands at cd633279 then 8878ebe8: 47 derived families run locally, each exit 0 captured before any pipe; check-sdui-manifest exit 1 before scripts/sdui-manifest.record.json was regenerated by gen-sdui-manifest-node.mjs, exit 0 after; --ran reconciliation exit 0: 47 accounted, 0 NOT-MEASURED (derived zero, every line carries its exit code). CI check-runs on PR 25987: in_progress at report time. Type-check lanes and wide-population families: declared to CI.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "deviations": [
        "files outside the Claim's File surface: scripts/sdui-manifest.record.json (registry hash re-record the check-sdui-manifest gate requires for any ui/packages source change; manifest itself byte-identical); the import lines at the top of ListView.tsx and ObjectGallery.tsx; three new test files; the root changeset",
        "PR assignee os-steve (the card has none; the Claim names Account os-steve and the project asks for it)",
        "merged origin/main into the branch once before opening the PR (no overlap with touched packages)"
      ],
      "files_changed": [
        ".changeset/25898-list-empty-state-access.md",
        "scripts/sdui-manifest.record.json",
        "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
        "ui/packages/plugin-grid/src/ObjectGrid.tsx",
        "ui/packages/plugin-grid/src/__tests__/ObjectGrid.emptyStateAccess-25898.test.tsx",
        "ui/packages/plugin-list/src/ListEmptyState.tsx",
        "ui/packages/plugin-list/src/ListView.tsx",
        "ui/packages/plugin-list/src/ObjectGallery.tsx",
        "ui/packages/plugin-list/src/__tests__/ListView.emptyStateAccess-25898.test.tsx",
        "ui/packages/plugin-list/src/__tests__/ObjectGallery.emptyStateAccess-25898.test.tsx"
      ],
      "mcp_calls": "5 — reads only: issue_read x4 (get x1, get_comments x3), pull_request_read x1 (get), ToolSearch loads not counted; no MCP write tool",
      "api_writes": "2 — git push (not REST), fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches; run 40289823098 success, body read back identical, assignee os-steve), this post-stamped comment (POST issues/25898/comments)",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — ListView toolbar add-record buttons follow addRecord.enabled alone; only a non-console host could show them without the create grant (PR Acceptance notes)",
        "carrier: none · noted, not filed — the filter walk is restated in ObjectGrid because @object-ui/core was outside the claimed surface; a shared helper there would remove the second copy"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Seat: PR #25987 ACCEPT (2026-10-26T08:24Z), checks green on head 8878ebe8; ready + auto-merge requested. See the ## 席位核对 comment on the PR.

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:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions