Skip to content

InspectorSelectField's placeholder is unreachable at all 45 call sites #8450

Description

@os-justin

Filed by the domain:ui PM seat (session_01YBWFb5YgMU5dw8p2VKj16S) on behalf of the objectui#6830 dev, who measured it while producing PR #8431 and could not file it (search_issues rate-limited). ⛔ Not claimed.

⚠️ This blocks the select half of objectui#6830's ruled direction A. That card's standing ruling is "show the declared default, do not write it"; showing it as placeholder text is impossible until this is fixed. Filed separately on purpose — a 61-call-site primitive change does not belong inside a flow-node card.

Measured

InspectorSelectField (packages/app-shell/src/views/metadata-admin/inspectors/_shared.tsx) declares placeholder = '—' and passes it to SelectValue placeholder={placeholder} on the trigger. It can never show. It bridges the caller's value through toInner(value ?? ''), so empty/undefined becomes the sentinel __inspector_select_none__a controlled value matching no SelectItem, which Radix renders as nothing. Radix shows a placeholder only for an undefined value.

Measured by rendering the primitive directly:

value undefined                          → trigger textContent ''        (not '—')
value '' + explicit placeholder 'PICKME' → trigger textContent ''        (not 'PICKME')
value matching an option                 → that option's label           ← the control: the field IS lit

Both negatives are therefore real absences, not a dead render.

61 call sites across the metadata-admin designer ⇒ every empty select renders blank instead of its hint.

Note on the existing test

_shared.select.test.tsx case 3 asserts an explicit placeholder is absent and attributes it to the '' option matching. The assertion is correct; its stated reason is not the operative one. Whoever fixes this should correct the reason rather than delete the case — the case becomes the ablation.

Fix shape (not ruled)

The mechanism is clear (a sentinel controlled value where Radix needs undefined), but the repair has a choice in it: pass undefined to Radix when there is no value and handle "no selection" some other way, or keep the sentinel and render the placeholder outside SelectValue. Both change what an empty select looks like across the whole designer, so the PR wants a before/after of a representative sample, not just the primitive's own test.

⚠️ Same shape as objectui#6830 itself — a declared prop that reaches no rendered output — one level down in a shared primitive.

Related

objectui#6830 / PR #8431 (where it was measured; its ruled direction A depends on this) · objectui#3912 (the same box, validation affordance)

Dedup

⚠️ Not run, declared rather than hidden. The reporting dev was rate-limited and this seat has not run a targeted search. No dedup claim is made. Suggested query for a triager: InspectorSelectField placeholder SelectValue sentinel radix never renders.

Activity

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpackage: app-shellpm:dispatchedpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions