Skip to content

feat(settings): T229 polish batch — per-key errors, persona dropdowns, lat/long help, bed flyover - #450

Merged
genwave-radio merged 2 commits into
mainfrom
feat/t229-settings-polish
Aug 9, 2026
Merged

feat(settings): T229 polish batch — per-key errors, persona dropdowns, lat/long help, bed flyover#450
genwave-radio merged 2 commits into
mainfrom
feat/t229-settings-polish

Conversation

@genwave-radio

Copy link
Copy Markdown
Collaborator

Closes #425 #426 #427 #431 — the four settings-surface findings from Dean's T229 pass, one batch because they share files. 🎛️

gh-#425 — errors land on the right field (the phantom-bug maker)

Backend: ValidationProblemDetails.Errors keyed by the actual setting key (AddError helper); empty-key entries + the cross-field ValidateBatch message go under ASP.NET's keyless "" bucket. Atomic reject unchanged. UI: per-key messages paint only their field; batch-wide messages paint the changed fields that DON'T have their own error (no double-painting); tab auto-jump targets the offending keys; danger dots light only implicated tabs. This is the bug that manufactured the 'PatterCadence help is wrong' phantom during testing.

gh-#426 — persona dropdowns

PersonaSettingControl ('On-air DJ (default)' → "0", personas by name → id; an unknown saved id renders as 'Unknown persona (#id)' so a save can never silently rewrite it — an empty roster falls through the same branch, so fetch failure can't eat a value either) + use-persona-list.ts mirroring the F79.5 single-listing-path idiom. Rider taken: VoiceSettingControl deduped onto the shared useVoiceList() — one voice-listing path again. Tts:Fallback:Voice untouched (Piper, stays text).

gh-#427 — lat/long help states the contract

Signed decimal degrees, period separator, ±90/±180, first-4-decimals, DMS/DMM rejected, invalid ≡ blank = weather silently off (F108.1). The ±90/±180 bounds are now range-pinned in settings-help-coverage.spec.tsx so the prose can't drift from the validator.

gh-#431 — Bed (optional) explains itself

Shared HelpFlyover (the booth-log Mode idiom) on the BedPicker label + aria-describedby: ducked −12dB, 1.5s pads, loops, cue-honoring, baked in at generate time, duck/pad are env-only.

Verification

Full C# suite 0 failed across all 7 projects (Host +3 new facts for the keyed contract); jest 92 suites / 881 passed / 0 failed incl. new persona-control, bed-flyover, and paints-only-the-offending-field specs; tsc --noEmit clean; next build green. Old errors:{settings:[…]} fixtures in unrelated specs still pass via the batch-wide fallback path (documented in the diff). Built by a worktree builder; reviewed + full-suite re-verified before PR.

…, lat/long help, bed flyover

gh-#425: ValidationProblemDetails keyed by setting key (keyless '' for
empty-key + cross-field); UI paints per-key errors on their own field
only, batch-wide on the rest; tab jump targets offending keys.
gh-#426: PersonaSettingControl + use-persona-list hook for both
Context:*:PersonaId keys; VoiceSettingControl deduped onto useVoiceList.
gh-#427: lat/long help states the full DD contract, range-pinned in the
help-coverage spec. gh-#431: BedPicker gains the shared HelpFlyover.

Closes #425, closes #426, closes #427, closes #431
@genwave-radio
genwave-radio merged commit 34fe30f into main Aug 9, 2026
11 checks passed
@genwave-radio
genwave-radio deleted the feat/t229-settings-polish branch August 9, 2026 22:16
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 9, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

admin-ui: one invalid setting paints its error under every field in the batch

1 participant