Skip to content

Converge the empty-state defaults onto DataEmptyState — four packages now answer "is it broken or is it young" four different ways, and two rulings just fixed two of them locally #7132

Description

@os-warren

Filed by the domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM) as the deliberately deferred convergence half of two maintainer rulings that landed within ten minutes of each other:

Both rest on the same principle — objectstack#13848: apps are simplified business implementations; uniform behaviour belongs to the platform, and per-widget/per-section authored copy is the per-app tax being ruled against.

⭐ Why this card exists rather than having been done inside one of those PRs

DataEmptyState (packages/components/src/custom/view-states.tsx) is already consumed by four packages: plugin-list, plugin-kanban, plugin-dashboard and plugin-detail. Its title default is literally 'No data'.

⇒ Changing its defaults would have been a smaller diff that repaired both rulings at once, and #7124's implementer identified exactly that and declined it on purpose, consuming the primitive unchanged and recording the reason in the new component's file header.

That was the correct call, and it is the reason this card is filed rather than lost: the two rulings were dispatched in parallel to two agents who could not see each other's reasoning, and both dispatch orders explicitly forbade designing a cross-surface abstraction, requiring stop-and-report instead. ⚠️ A shared abstraction designed simultaneously by two agents is worse than two honest local fixes — and it would have been invisible as a problem, because the diff would have looked elegant.

Both local fixes have now landed. The precondition for doing it properly, once, is satisfied.

The measured spread — four packages, four answers

surface what an empty result renders state
plugin-detail record sections heading + labels + em-dash placeholders, heuristic-owned ✅ just ruled and fixed (#7064)
plugin-dashboard dataset/table/pivot widgets WidgetEmptyStaterole="status", title + explanation, names the data source ✅ just ruled and fixed (#7063)
plugin-list, plugin-kanban DataEmptyState defaults — terse, unexamined against either ruling ⚠️ unmeasured
plugin-charts ObjectChart no empty branch at all — a bare chart frame 🟡 filed as #7130

⇒ The two rulings did not establish a platform-wide answer; they established it on two surfaces. This card is about whether the other two should follow, and whether the shared primitive should carry the answer.

⛔ What this card must NOT do

Suggested first step — measurement, not refactor

Render all four surfaces' empty states side by side and judge them against the two rulings' own stated properties:

  1. distinguishable from a load failure at a glance (role="status" vs role="alert" is the structural test fix(plugin-dashboard,i18n): a self-explaining default empty state for dashboard widgets #7124 used);
  2. self-describing without authored copy.

Then answer: does the shared primitive carry those properties, or does each surface legitimately differ? ⭐ "They legitimately differ, here is the evidence" is a fully valid outcome — close it measured-and-declined.

Sequencing

⚠️ packages/components is consumed by all four packages, so a defaults change there is broad-blast. Check the packages/app-shell PR backlog before starting.

Refs: #7063 · #7064 · PR #7123 · PR #7124 · #7130 (ObjectChart) · #7125 (dead keys from #7124) · objectstack#13848 · hotcrm#1212 · hotcrm#1247.

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 seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions