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
No Reviewers
Labels
Clear labels
Area/Design
Area/Downloads
Area/Explore
Area/Library-UI
Area/Metadata
Area/Packaging
Area/Player
Area/Queue
Area/Settings
Area/Shell-Nav
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Platform/Android
Platform/Desktop
Breaking change that won't be backward compatible
Something is not working
Documentation changes
Improve existing functionality
New functionality
This is security issue
Issue or pull request related to testing
Priority
Critical
1
The priority is critical
Priority
High
2
The priority is high
Priority
Medium
3
The priority is medium
Priority
Low
4
The priority is low
Reviewed
Confirmed
1
Issue has been confirmed
Reviewed
Duplicate
2
This issue or pull request already exists
Reviewed
Invalid
3
Invalid issue
Reviewed
Won't Fix
3
This issue won't be fixed
Status
Blocked
1
Something is blocking this issue or pull request
Status
Need More Info
2
Feedback is required to reproduce issue or to continue work
Status
Abandoned
3
Somebody has started to work on this but abandoned work
Status
In Progress
Somebody is actively working on this right now
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: yonlu/yellowjacket#232
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The issue
Settings → Track List Columns listed two rows both called "Track
Name", one enabled and one not, with no way to tell them apart — and
the accessible names collided too, so a screen reader heard "Show the
Track Name column" twice in one list.
What the open question turned out to be
#197's Direction offered two answers of different sizes: a second
string (
configLabel) so the sort dropdown keeps "Track Name" whilethe configurator says something else, or filtering the row out because
titleArtistis the phone's column and the user cannot select it.The code settles it, and the honest answer is forced rather than
preferred.
titleArtistis not intracklist.AllColumnIDs, so:Ticking that row sends a column set the backend rejects,
config-pageswallows the rejection into
console.error('Failed to update columns:', err), and the tick reverts on the next render. AconfigLabelwouldhave given a distinct name to a control that cannot work.
What changed
ColumnDefgainsconfigurable?: boolean(default true), andtitleArtistis the onefalse— a definition is not the samething as a choice, and the fact lives next to the column it
describes.
ALL_COLUMN_IDS(Object.keys(COLUMN_DEFS)) becomesCONFIGURABLE_COLUMN_IDS, which is whatconfig-pagelists. Oneexport, one consumer, an accurate name.
titleArtist's own comment claimed its label was user-visible in thesort dropdown. It is not: that list is built from the configured
columns, which this one can never be. Corrected rather than left.
CLAUDE.mdgains the pair that drifted, beside theDefaultColumns/DEFAULT_COLUMN_IDSparagraph it belongs with.Verification
make ui-testnpx tsc --noEmitmake skill-checkmake lint/make test/make generate/make bindings.sql, no.templ, no bound signaturemake e2ee2e/specscounts these rows, and the tier that renders this component is the one abovefrontend/test/components/settings-column-list.test.tsis new andasserts four things: the rows are named once each, the checkboxes'
aria-labels are unique, every offered id is one Go'sAllColumnIDslists, and the drawing table still has the phone's column. The Go list
is read out of
backend/tracklist/config.goas text, because athird copy of it is the fault one step earlier.
Planted, not read. With the filter removed, all four fail with the
defect's own numbers:
Both queries are scoped to
[for^="column-"]: Settings' view-visibilitylist (#25) draws with the same two classes, so a bare
.column-labelsweeps 29 rows across two sections — and "Albums" the destination
sitting beside "Album" the column is not this fault.
Looked at it on the running app (
make dev-headless, port 34115checked free first):
Track Name | Artist | Album | Duration | Art | Genre | Year | …, eighteen rows, one "Track Name". Before the fix theduplicate sat sixth, between Art and Genre.
Deliberately not done
Filed #231 instead:
SetTrackListColumnsassignsc.TrackList.Columns = columnsbefore validating, so a rejected liststays in memory and
Save()validates the whole config — after onetick of the phantom row, no setting saves for the rest of the
session, silently:
That is reachable from any invalid input — a duplicate id, a stale
frontend — rather than from this row, and every setter in
backend/confighas the same read-modify-write-then-Save()shape, soit wants one pass over the file rather than one fix here.
Closes #197
CI is green on both jobs, first attempt.
check— run 22713, success (make lint,make testx3 configurations,tsc --noEmit,make ui-test,make bindings-check,make skill-check,make commit-check)e2e— run 22715, success (Chromium and WebKit)Not merging; leaving it for review.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.