Skip to content

Commit 76cb6be

Browse files
committed
feat: Add album search/filter functionality to the ArtistAlbumsPage.
1 parent 7b83c8f commit 76cb6be

File tree

1 file changed

+42
-23
lines changed

1 file changed

+42
-23
lines changed

frontend/src/pages/ArtistAlbumsPage.tsx

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const ArtistAlbumsPage: React.FC = () => {
4141
const storedState = artistId ? getStoredState(artistId) : null;
4242
const [sortField, setSortField] = useState<SortField>(storedState?.sortField ?? 'year');
4343
const [sortOrder, setSortOrder] = useState<SortOrder>(storedState?.sortOrder ?? 'desc');
44+
const [searchTerm, setSearchTerm] = useState<string>('');
4445

4546
// Save state to sessionStorage whenever it changes
4647
useEffect(() => {
@@ -75,7 +76,14 @@ const ArtistAlbumsPage: React.FC = () => {
7576
const sortedAlbums = useMemo(() => {
7677
if (!pageData) return [];
7778

78-
return [...pageData.albums].sort((a, b) => {
79+
let result = pageData.albums;
80+
81+
if (searchTerm.trim() !== '') {
82+
const lowerQuery = searchTerm.toLowerCase();
83+
result = result.filter(a => a.title.toLowerCase().includes(lowerQuery));
84+
}
85+
86+
return [...result].sort((a, b) => {
7987
if (sortField === 'title') {
8088
const comparison = a.title.localeCompare(b.title);
8189
return sortOrder === 'asc' ? comparison : -comparison;
@@ -84,7 +92,7 @@ const ArtistAlbumsPage: React.FC = () => {
8492
return sortOrder === 'asc' ? comparison : -comparison;
8593
}
8694
});
87-
}, [pageData, sortField, sortOrder]);
95+
}, [pageData, sortField, sortOrder, searchTerm]);
8896

8997
const handleAlbumClick = (album: ArtistAlbum) => {
9098
if (album.type === 'master') {
@@ -130,31 +138,42 @@ const ArtistAlbumsPage: React.FC = () => {
130138
</div>
131139
</div>
132140

133-
{/* Sort controls */}
134-
<div className="flex flex-wrap items-center gap-4 mb-6 p-4 bg-base-200 rounded-lg">
135-
<span className="text-sm font-medium">{t('artist.sortBy')}</span>
136-
<div className="flex gap-2">
137-
<button
138-
className={`btn btn-sm ${sortField === 'title' ? 'btn-primary' : 'btn-outline'}`}
139-
onClick={() => setSortField('title')}
140-
>
141-
{t('common.title')}
142-
</button>
141+
{/* Filter and Sort controls */}
142+
<div className="flex flex-col md:flex-row justify-between gap-4 mb-6 p-4 bg-base-200 rounded-lg">
143+
<div className="w-full md:max-w-sm">
144+
<input
145+
type="text"
146+
placeholder={t('search.placeholder', 'Search...')}
147+
className="input input-bordered input-sm w-full"
148+
value={searchTerm}
149+
onChange={(e) => setSearchTerm(e.target.value)}
150+
/>
151+
</div>
152+
<div className="flex flex-wrap items-center gap-4">
153+
<span className="text-sm font-medium">{t('artist.sortBy')}</span>
154+
<div className="flex gap-2">
155+
<button
156+
className={`btn btn-sm ${sortField === 'title' ? 'btn-primary' : 'btn-outline'}`}
157+
onClick={() => setSortField('title')}
158+
>
159+
{t('common.title')}
160+
</button>
161+
<button
162+
className={`btn btn-sm ${sortField === 'year' ? 'btn-primary' : 'btn-outline'}`}
163+
onClick={() => setSortField('year')}
164+
>
165+
{t('common.year')}
166+
</button>
167+
</div>
168+
<div className="divider divider-horizontal mx-0 hidden md:flex"></div>
143169
<button
144-
className={`btn btn-sm ${sortField === 'year' ? 'btn-primary' : 'btn-outline'}`}
145-
onClick={() => setSortField('year')}
170+
className="btn btn-sm btn-ghost gap-2"
171+
onClick={toggleSortOrder}
146172
>
147-
{t('common.year')}
173+
{sortOrder === 'asc' ? <ArrowUp size={16} /> : <ArrowDown size={16} />}
174+
{sortOrder === 'asc' ? t('artist.ascending') : t('artist.descending')}
148175
</button>
149176
</div>
150-
<div className="divider divider-horizontal mx-0"></div>
151-
<button
152-
className="btn btn-sm btn-ghost gap-2"
153-
onClick={toggleSortOrder}
154-
>
155-
{sortOrder === 'asc' ? <ArrowUp size={16} /> : <ArrowDown size={16} />}
156-
{sortOrder === 'asc' ? t('artist.ascending') : t('artist.descending')}
157-
</button>
158177
</div>
159178

160179
{/* Albums grid */}

0 commit comments

Comments
 (0)