Skip to content

finding(fields): LocationField refuses input silently — the validation slot it wires has no producer #6716

Description

@claude

Filed unassigned by the dev seat implementing #6714, as an out-of-scope finding. Recording, not choosing.

Dedup before filing: repo-scoped REST list of open issues updated since 2026-08-18 (239 issues), grepped for LocationField / aria-invalid / silent-refusal and feedback wordings — nothing matched.

What

packages/fields/src/widgets/LocationField.tsx REFUSES to emit for input it cannot accept, and says nothing when it does. Two refusals now share that silence:

In both cases onChange is simply not called. The box is a CONTROLLED input showing "lat, lng", so the typed text sits in the DOM until the next re-render and then snaps back to the stored value — with no error text, and with aria-invalid reading "false" throughout (measured: driving a real ObjectForm and typing 999, 999, the control's aria-invalid was "false" and the field rendered only its label).

The widget does wire the published validation slot from objectui#3222 — aria-invalid={!!error} — but error is a prop the HOST produces. buildValidationRules has no branch for location, so nothing ever produces one for either refusal. The slot is wired to a producer that does not exist for this field.

Why it may matter

The user's edit disappears and nothing explains why. That is the same "silence after a refusal" shape objectui#4989 defects 2/3/5 were about on the submit-redirect path, where the recorded consequence was the submitter re-trying the action.

⚠️ This is NOT a request to reverse #6714. Triage there weighed "refuse the emission" against "emit and mark invalid" and the implementer chose refusal on a measurement (nothing downstream rejects or repairs the value, so an emission is a write). This card is about telling the user a refusal HAPPENED — which is compatible with refusing, and which the format refusal has needed since well before that card.

What is NOT measured

  • Whether the fix belongs in the widget (computing its own invalid state and OR-ing it into the slot it already reads) or at the form renderer (teaching buildValidationRules a location branch so the existing host-produced error path lights up). The second keeps a single producer for validation messages, which is the direction FieldWidgetComponentProps' doc comment argues for required; the first is local but gives the slot a second author. That choice is triage's, and it is a shared-surface decision rather than a widget one.
  • Whether the snap-back on re-render is itself worth changing.

Related

#6714 (the range refusal, which added the second silent case) · objectui#3222 (the validation slot this widget already reads) · objectui#4989 (silence after a refusal, same shape)


Generated by Claude Code

Metadata

Metadata

Assignees

Labels

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

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions