mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-21 23:05:46 +00:00
feat(artist): sort albums by year on artist detail (#877)
* feat(artist): year sort for albums section on artist detail Add a sort dropdown next to "Albums by …" with release-type grouping (default), newest-first, and oldest-first by album year. * chore: note PR #877 in CHANGELOG and settings credits * fix(artist): toggle year sort inside release groups, session per server Replace dropdown with a click-to-toggle newest/oldest button. Keep release-type blocks; sort albums by year within each group. Persist order in session store.
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
import { describe, expect, it, beforeEach } from 'vitest';
|
||||
import {
|
||||
DEFAULT_ARTIST_ALBUM_YEAR_ORDER,
|
||||
useArtistAlbumYearSortStore,
|
||||
} from './artistAlbumYearSortStore';
|
||||
|
||||
describe('artistAlbumYearSortStore', () => {
|
||||
beforeEach(() => {
|
||||
useArtistAlbumYearSortStore.setState({ orderByServer: {} });
|
||||
});
|
||||
|
||||
it('defaults to newest first per server', () => {
|
||||
expect(useArtistAlbumYearSortStore.getState().yearOrderFor('s1')).toBe(
|
||||
DEFAULT_ARTIST_ALBUM_YEAR_ORDER,
|
||||
);
|
||||
});
|
||||
|
||||
it('toggles between newest and oldest for the same server', () => {
|
||||
const { toggleYearOrder, yearOrderFor } = useArtistAlbumYearSortStore.getState();
|
||||
toggleYearOrder('s1');
|
||||
expect(yearOrderFor('s1')).toBe('yearAsc');
|
||||
toggleYearOrder('s1');
|
||||
expect(yearOrderFor('s1')).toBe('yearDesc');
|
||||
});
|
||||
|
||||
it('keeps order per server independently', () => {
|
||||
const { toggleYearOrder, yearOrderFor } = useArtistAlbumYearSortStore.getState();
|
||||
toggleYearOrder('s1');
|
||||
expect(yearOrderFor('s1')).toBe('yearAsc');
|
||||
expect(yearOrderFor('s2')).toBe('yearDesc');
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,27 @@
|
||||
import { create } from 'zustand';
|
||||
|
||||
import type { ArtistAlbumYearOrder } from '../utils/library/sortArtistAlbums';
|
||||
|
||||
export const DEFAULT_ARTIST_ALBUM_YEAR_ORDER: ArtistAlbumYearOrder = 'yearDesc';
|
||||
|
||||
interface ArtistAlbumYearSortStore {
|
||||
orderByServer: Record<string, ArtistAlbumYearOrder>;
|
||||
yearOrderFor: (serverId: string) => ArtistAlbumYearOrder;
|
||||
toggleYearOrder: (serverId: string) => void;
|
||||
}
|
||||
|
||||
export const useArtistAlbumYearSortStore = create<ArtistAlbumYearSortStore>((set, get) => ({
|
||||
orderByServer: {},
|
||||
|
||||
yearOrderFor: (serverId) =>
|
||||
get().orderByServer[serverId] ?? DEFAULT_ARTIST_ALBUM_YEAR_ORDER,
|
||||
|
||||
toggleYearOrder: (serverId) => {
|
||||
if (!serverId) return;
|
||||
const current = get().yearOrderFor(serverId);
|
||||
const next: ArtistAlbumYearOrder = current === 'yearDesc' ? 'yearAsc' : 'yearDesc';
|
||||
set(s => ({
|
||||
orderByServer: { ...s.orderByServer, [serverId]: next },
|
||||
}));
|
||||
},
|
||||
}));
|
||||
Reference in New Issue
Block a user