Skip to content

fix(macapp): make session and model interactions accessible and preserve settings feedback #999

Description

@dennisonbertram

Parent: #991

Summary

Major list actions are attached to tap gestures instead of semantic controls, model-exposure toggles have an empty hidden label, model fetch status is cleared by the reload it triggers, and custom provider deletion executes immediately.

Evidence

  • macapp/Sources/GoCodeUI/SessionsView.swift:41-49 — session selection is an onTapGesture on a row.
  • macapp/Sources/GoCodeUI/SettingsView.swift:136-159 — model selection is an onTapGesture on a row.
  • macapp/Sources/GoCodeUI/ModelSettingsView.swift:353-365 — exposure Toggle uses an empty label then hides it.
  • ModelSettingsView.swift:53-66 — fetch sets success/failure status, then load() clears it on success.
  • ModelSettingsView.swift:110-119,291-295 — custom provider removal is immediate and has no confirmation.

Impact

Keyboard and VoiceOver users cannot reliably discover or activate the primary row actions, cannot identify exposure toggles, and may receive no feedback for model-fetch success/failure. Provider configuration can be removed by one click.

Scope

  • Replace row tap gestures with semantic Buttons or selection-enabled Lists that support keyboard activation and expose selected state.
  • Give every exposure toggle a meaningful model-specific accessibility label/value.
  • Preserve action result status across refresh; announce it politely and make dismissal explicit.
  • Confirm custom provider removal, naming the provider and impact on exposed models.
  • Ensure focus remains stable after selection, refresh, dismissal, and deletion.

Tests first

  • Source/interaction tests proving no primary list action depends solely on onTapGesture.
  • Accessibility-label/state tests for session rows, model rows, and exposure toggles.
  • Model-settings model tests proving fetch success/failure survives the follow-up load.
  • Regression: provider DELETE is not sent before confirmation; Cancel leaves selection intact.
  • Manual keyboard + VoiceOver smoke on Sessions and Settings.

Acceptance criteria

  • Sessions and models are selectable without a pointer.
  • VoiceOver announces row purpose, current selection, and exposure toggle model/value.
  • Fetch/save/delete results remain visible until dismissed or superseded.
  • Provider removal requires confirmation and safe default focus.
  • Focus does not jump unexpectedly after refresh.
  • swift test, Swift build, formatting, strict format lint, and accessibility smoke pass.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingmacappNative macOS app (macapp/)mediumMedium effort: 1-3 daysuxUser experience improvementswell-specifiedIssue is clear, scoped, and ready to implement

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions