Uh oh!
There was an error while loading. Please reload this page.
showcase: author an emptyState fixture on the Urgent task view - #8036
Merged
Conversation
The spec declares a per-view empty-state translation surface
(`objects.<object>._views.<view>.emptyState.{title,message}`), it is
authorable on a list view and it is documented — but no view anywhere
under `examples/` authored one, so the declared key group had no
reachable instance on the stock fixture. The i18n surface-matrix check
had nothing to resolve and was recorded as waived-for-missing-fixture
rather than actually run.
Author the specimen on `showcase_task.listViews.urgent` and translate it
in both bundle locales.
The view choice is the substance here. Emptiness means different things
on a filtered saved view and on an unfiltered object list: empty and
unfiltered is a setup state ("nothing exists yet") that the showcase
seed deliberately never produces, while empty and filtered is a steady
state ("nothing matches right now") that a running deployment hits
constantly. On this particular filter the empty result is also the
outcome the user wants, so the copy reports good news instead of nagging
about absent data — which is the case per-view empty-state copy exists
to serve. It stays reachable without touching the seed, too: the two
urgent seed rows are what the neighbouring `bulk_actions` view's
`showcase_mark_done` is there to clear.
The `en` arm is a first for this bundle, which until now carried `_views`
only on the zh-CN side. It is deliberately not a mirror: view labels are
already English in the view file, so restating all fifteen would be
fifteen fake translations of exactly the kind this bundle's header warns
about. Only the `emptyState` group is pinned, because a key present in
one locale cannot demonstrate a locale-resolving surface — an `en`
session would read the view's inline source string through the fallback
path instead, which is a different code path.
No changeset: `@objectstack/example-showcase` is a private workspace
package, which the changeset gate excludes by design.The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
hotlong
marked this pull request as ready for review
August 12, 2026 13:37
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#7714
What
packages/specdeclares a per-view empty-state translation surface —objects.OBJECT._views.VIEW.emptyState.title/.message— it is authorable on a list view, and it is documented. But no view anywhere underexamples/authored one, so the declared key group had no reachable instance on the stock fixture. The i18n surface-matrix check therefore had nothing to resolve and was recorded as waived-for-missing-fixture rather than actually run.This authors the specimen and translates it in both bundle locales. Fixture-only, entirely inside
examples/app-showcase/src/**; no spec change — the surface was already declared and authorable, and the card exists precisely because nothing used it.src/ui/views/task.view.ts—listViews.urgentgainsemptyState: { title, message }src/system/translations/index.ts— the matchingenandzh-CNentries under_views.urgentWhy this view
This is the whole substance of an otherwise small diff, so stating it plainly: emptiness means different things on a filtered saved view and on an unfiltered object list.
An unfiltered list that is empty is a setup state — "nothing exists yet" — and the showcase seed deliberately never produces it (
data/seed/index.tsseeds inquiries specifically so "every view renders real data"). A filtered view that is empty is a steady state — "nothing matches right now" — which a running deployment hits constantly. That second case is what per-view empty-state copy exists to serve, which makes it the spelling worth pinning as the fixture.listViews.urgent(filter:priority equals urgent) is the strongest instance of it, for two reasons beyond being filtered:bulk_actionsview'sshowcase_mark_doneexists to clear — so a demo user empties this view by using the app, not by editing fixtures. That kept the change inside the declared file surface.Why the
enarm is not a mirrorThe
enside of this bundle carried no_viewsblock at all before this change; all fifteen live on the zh-CN side. The newenblock is deliberately only theemptyStategroup, not a mirror: view labels are already English in the view file, so restating all fifteen would be fifteen fake translations of exactly the kind the bundle's own header warns about.The
emptyStategroup earns its entry because a key present in one locale cannot demonstrate a locale-resolving surface — anensession would read the view's inline source string through the fallback path, which is a different code path and proves nothing about the resolver. Both arms present is what gives the surface-matrix check the same key resolving to different copy per locale.Verification
Gates derived from the touched paths via
scripts/pm/dispatch-gates.mjs(it named no path-scoped family; the implicated ones were run by convention).pnpm --filter '@objectstack/example-showcase...' buildcheck:i18n-coverageOK (12 config(s), 660 baselined untranslated string(s), none new)check:i18nOK (9 package(s) — all bundles in sync, no undeclared authoring keys)check:nul-bytesOK (scanned 7331 text file(s) … no raw ASCII control bytes)Reverse verification — direction predicted before running.
i18n-extract.tsemits_views.VIEW.emptyState.title/.messageas real expected entries, so the prediction was that dropping the bundle entries while keeping the view'semptyStateshould make the ratchet go red by exactly two. Reverting only the translations file and re-running gave:+2, as predicted. That is what proves the fixture genuinely reaches the extractor rather than sitting inert, and it is why both keys are translated in the same change: leaving them untranslated widens the frozen count (fails the ratchet), and translating anything extra would push it below baseline (which the same gate rejects). Restored via patch file, both gates re-confirmed green.
Notes
skip-changesetapplies:@objectstack/example-showcaseisprivate: true, whichscripts/check-changeset-fixed.mjsexcludes by design (if (!pkg.name || pkg.private === true) continue)._views.VIEW.emptyState—i18n-resolver.tsresolveslabelanddescriptiononly. The consumer is theobjectuilist renderer. That does not affect this card (the gap filed was the missing fixture, and the extractor/coverage path does read the key, as the reverse verification above shows), but a checklist item expecting a framework-side resolver call would be looking in the wrong repo.Generated by Claude Code