Desktop: the Artists view can only sort by name #32
Open
opened 2026-08-18 05:56:10 +00:00 by logan
·
1 comment
No Branch/Tag Specified
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
v0.7.0
v0.6.0
v0.5.0
v0.4.0
v0.3.1
v0.3.0
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0
v0.0.1
v0.0.0
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
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: yonlu/yellowjacket#32
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.
Report
Name is the only sort on the Artists page. Are there other useful keys?
Findings
frontend/src/components/artists-view/artists-view.tssays so in a comment (~line 196): "There is only one key to sort by" —ARTIST_SORT_OPTIONShas a single entry andsort-fieldis hardcoded toname.library.Artist(backend/library/query.go:53) carries only ID, Name, MBID and three image paths. Every other key needs the query to return it.Direction
Candidate keys, all cheap from
audio_filesjoins: album count, track count, total duration, most recently played, most played, and date added (which is a separate request across the app). Extendlibrary.ArtistandGetAllArtists...to carry the counts, then add the options. Sorting is done in the frontend today (asckeeps the backend's order,descreverses) — a new key means either sorting in Go or a real comparator per key; pick one deliberately, since the artists grid is virtualized and its per-render arrow functions are load-bearing for repaint.Scope agreed for this issue and #46, recorded here so it is on the
tracker rather than in a session.
The two are one backend change:
GetAlbumArtistsselectsa.id, a.name, a.mbidandlibrary.Artistcarries those plus three image paths, soevery key either issue proposes needs the same projection widened.
The model to follow already exists —
cover-grid's.AlbumSortOptionis structurallySortOption & { comparator }, andpage-headeronly readsidandlabel, so one array is both the menuand the sort logic and they cannot drift.
genres-view's inline ternaryand
artists-view's single degenerate key collapse into it at ~15 lineseach.
track-listkeepsCOLUMN_DEFS: its comparators are keyed bycolumn, which also carries width, label, phone visibility and a
renderer, and merging the two tables would cost more than it saves.
Sorting stays in the frontend. The new keys need the data from the
backend regardless; they do not need
ORDER BYvariants. A backend sortwould refetch on every sort change and throw away the array identity
lit-virtualizerkeys on — the propertycard-grid-repaint.test.tsexists to protect. Adding
fieldtorecomputeArtistCaches's memo keyis what makes a comparator model safe there; the copy is per
input-change, not per render.
Keys, by what they cost.
Already over the IPC, pure frontend:
library.Track.LastPlayedis in the structand sent on every track, and there is no
lastPlayedentry inCOLUMN_DEFS. An unused field.FavoritesControlleralready holds the setclient-side for the star column.
library.Album.ReleaseYear, distinct fromYear; differs only on remasters — marginal, include only if wanted).One projection change:
last played
the main grid has three keys today, which is thin
Needs
audio_files.added_at(#46): date added, everywhere.Two rollup definitions have to be stated in a comment beside the
query, the way #46 already asks for date-added's:
MAXover its tracks;SUMover theirs — which favours aprolific artist over a beloved one, and is still right, because the
question people mean is "who do I listen to most".
Also note
home.sql'sHomeRecentlyAddedAlbumsusesMAX(af.id)as anexplicit stand-in for the missing column and says so; it should move to
added_atin the same pass, and its latest-file semantics should agreewith whatever the album sort key picks.
Split out rather than folded in: album completeness as a key (#184,
blocked on moving the answer out of the per-screenful store) and
recency-weighted play stats (#185). Tag status was considered and
rejected — it would widen the hot track projection to duplicate
autotag-view.Prerequisite: #138. Sort state is persisted under seven
localStoragekeys across five components in three naming conventions,and nothing resets them between specs. This adds four more, so the
one-module extraction wants doing first.