Skip to content

Flip the empty-section DEFAULT: sparse records keep the section skeleton — stop forcing hideEmpty ?? true over DetailSection's own stated heuristic #7064

Description

@huangyiirene

Filed on the maintainer's ruling (2026-08-31, hotcrm#1247 adjudication, verbatim: 「#1247 也是平台的问题吧。元数据应用不应该考虑这些细节。」).

The mechanism (measured across hotcrm#1247 / objectstack#11289 / shipped bundle)

record:details hides empty fields, then RecordDetailsRenderer (packages/plugin-detail/src/renderers/record-details.tsx) maps every section with hideEmpty: s.hideEmpty ?? true, and DetailSection returns null when all fields are empty. On a hand-created sparse record the body collapses to a degenerate two rows (hotcrm opportunity: 7 optional body fields, 5 empty; case page: case number + three empty rows) — while seeded demo data masks it.

⭐ The platform already knows the right behavior and says so in its own code — DetailSection's heuristic comment: "If a section is entirely empty (e.g., loading state, brand-new record), do NOT auto-hide — the labels themselves are useful as a structural skeleton." The renderer's forced ?? true overrides exactly that case. objectstack PR #11662 then made hideEmpty an AUTHORABLE opt-out — which is the shape the maintainer has now ruled against: every app hand-writing hideEmpty: false per section to avoid looking broken is per-app tax (objectstack#13848 principles).

Deliverable

  1. Flip the default: stop forcing hideEmpty ?? true in RecordDetailsRenderer; let DetailSection's stated heuristic own the all-empty case — an empty section keeps its heading and field labels (empty-value placeholders per the design system), so a sparse record renders a full structural skeleton with ZERO app-side authoring;
  2. authored hideEmpty: true (declared by objectstack PR #11662) remains fully honoured as the explicit opt-in to hiding — the key's meaning is unchanged, only the unauthored default flips;
  3. changeset marks the behavior change (apps relying on auto-hide of unauthored sections will now show skeletons — the ruled loud-over-silent direction); name any reference-app hits in the PR.

Acceptance scenario

hotcrm opportunity_detail_page and case_detail_page on hand-created records with only required fields: full section skeletons render (no two-row body, no vanished sections), with zero hotcrm-side changes. The strip-vs-body field re-allocation hotcrm#1247 contemplated becomes unnecessary and is NOT performed.

Refs: hotcrm#1247 (closed with pointer here) · objectstack#11289 / PR #11662 (key declaration half) · objectstack#13848 (application-repo principles) · objectui#7063 (sibling ruling: dashboard widget default empty state — same principle, different surface).

Activity

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

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions