fix(settings): stop offering a column the backend rejects #232
Open
logan
wants to merge 1 commits from
fix/197-duplicate-column-label into main
pull from: fix/197-duplicate-column-label
merge into: :main
:main
:fix/146-stub-etxtbsy
:fix/175-wizard-follows-the-library
:fix/231-setter-rollback
:fix/197-duplicate-column-label
:docs/225-fixtures-wav-tags
:docs/220-skill-check-scope
:test/217-fixture-names-in-queue-selection
:fix/216-riff-parse-allocation
:fix/170-queue-header-action-names
:fix/210-nav-sheet-scroll-affordance
:docs/50-readme-landing-page
:feat/65-art-prefetch-ahead
:feat/71-more-as-a-bottom-sheet
:feat/54-native-touch-feel
:feat/67-entity-links-into-menus
:test/196-visual-tier-gates
:fix/138-ui-test-storage-leak
:fix/104-wav-tags-read
:fix/207-sheet-scroll-affordance
:fix/204-ui-visual-update-filter
:pi-agent-backlog-automation
:63-touch-model-phase-2
:63-android-touch-model
:186-touch-targets-settings
:186-touch-targets-page-header
:187-seek-bar-hit-area
:189-190-explore-correctness
:135-android-underrun-instrumentation
:51-android-small-screens
:fix/171-phone-queue-scrim
:fix/137-touch-only-affordances
:fix/154-nested-css-check
:feat/58-mini-player-progress-line
:fix/66-album-page-scrolls-as-one
:60-context-menu-action-sheet
:64-android-system-volume
:59-slim-the-mini-player
:55-queue-as-a-screen
:feat/57-drop-the-android-top-bar
:feat/62-jobs-as-a-notification
:fix/53-seek-bar-never-moves
:fix/159-android-task-app-id
:fix/52-android-activity-recreation-restarts-the-process
:fix/150-expand-button-under-the-art
:feat/42-inline-volume-and-centred-transport
:fix/156-queue-selection-fixture-order
:fix/151-fuse-the-scroll-guard-and-the-write
:fix/43-queue-panel-selection
:fix/143-top-bar-fits-its-window
:feat/27-jobs-into-settings
:feat/25-configurable-sidebar-tabs
:feat/6-global-back-forward
:fix/72-active-view-broadcast
:fix/69-page-header-action-overflow
:fix/quick-wins-batch
:fix/118-in-library-clear
:fix/61-mini-player-plain-text
:fix/68-hover-affordances-pointer
:fix/119-dev-headless-port
:fix/130-issue-claim-user
:fix/131-codegen-check-scope
:feat/28-autotag-match-on-album
:feat/17-demote-version-selector
:feat/38-ownership-visibility
:ci/115-manual-release
:feat/34-icon-language
:feat/7-full-tracklist-toggle
:fix/16-tagwriter-totals
:fix/unclaim-ca-certs
:fix/unclaim-shell
:ci/unclaim-on-close
:docs/closing-keyword
:docs/retire-stale-planning-docs
:docs/issue-driven-workflow
:integration/small-fixes
:fix/small-issue-batch
:fix/queue-toggle-state
:fix/drag-count-badge
:fix/album-card-year
:fix/album-tracklist-heading
:fix/seek-bar-clock-width
:fix/explore-art-scanner-requests
:chore/workflow-guardrails
1
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
d225f922fb |
fix(settings): stop offering a column the backend rejects
Settings -> Track List Columns listed two rows both called "Track Name", one of which could not be ticked, and a screen reader heard "Show the Track Name column" twice with nothing to tell them apart. They are `titleArtist` and `trackName`, and the issue left open which way to fix it: a second label so the sort dropdown and the configurator can say different words, or drop the row because the user cannot select it. The code settles that. `titleArtist` is not in `tracklist.AllColumnIDs`, so `Config.Validate()` returns `unknown track-list column ID: "titleArtist"` -- ticking the row sends a column set the backend rejects, `config-page` swallows the rejection into a `console.error`, and the tick reverts. A second label would have named a control that cannot work. So a definition says whether it is a *choice*, and the configurator reads `CONFIGURABLE_COLUMN_IDS` rather than `Object.keys(COLUMN_DEFS)`. The new test reads Go's own list out of `backend/tracklist/config.go` rather than writing it down a third time, since a third copy is the fault one step earlier. Verified by planting: with the filter removed all four assertions fail with the defect's own numbers. Not fixed here, and filed as #231: `SetTrackListColumns` assigns before it validates, so a rejected list stays in memory and `Save()` validates the whole config -- one tick and no setting saves for the rest of the session. That is reachable from any invalid input, not from this row. Closes #197 |