diff --git a/src/renderer/features/artists/components/album-artist-detail-content.tsx b/src/renderer/features/artists/components/album-artist-detail-content.tsx
index 606f5ae11..427ab0b98 100644
--- a/src/renderer/features/artists/components/album-artist-detail-content.tsx
+++ b/src/renderer/features/artists/components/album-artist-detail-content.tsx
@@ -225,6 +225,39 @@ const AlbumArtistMetadataBiography = ({
);
};
+const TABLE_ROW_HEIGHT = {
+ compact: 40,
+ default: 64,
+ large: 88,
+} as const;
+
+const TABLE_HEADER_HEIGHT = 40;
+
+interface SongTableListContainerProps {
+ children: React.ReactNode;
+ enableHeader?: boolean;
+ itemCount: number;
+ maxRows?: number;
+ tableSize?: 'compact' | 'default' | 'large';
+}
+
+function getTableRowHeight(size: 'compact' | 'default' | 'large' | undefined): number {
+ return size ? TABLE_ROW_HEIGHT[size] : TABLE_ROW_HEIGHT.default;
+}
+
+const SongTableListContainer = ({
+ children,
+ enableHeader = true,
+ itemCount,
+ maxRows = 5,
+ tableSize = 'default',
+}: SongTableListContainerProps) => {
+ const rowHeight = getTableRowHeight(tableSize);
+ const headerOffset = enableHeader ? TABLE_HEADER_HEIGHT : 0;
+ const height = headerOffset + rowHeight * Math.min(itemCount, maxRows);
+ return
{children}
;
+};
+
interface AlbumArtistMetadataTopSongsProps {
detailQuery: ReturnType>;
routeId: string;
@@ -237,7 +270,6 @@ const AlbumArtistMetadataTopSongsContent = ({
const { t } = useTranslation();
const [searchTerm, setSearchTerm] = useState('');
const [debouncedSearchTerm] = useDebouncedValue(searchTerm, 300);
- const [showAll, setShowAll] = useState(false);
const [topSongsQueryType, setTopSongsQueryType] = useLocalStorage<'community' | 'personal'>({
defaultValue: 'community',
key: 'album-artist-top-songs-query-type',
@@ -269,13 +301,8 @@ const AlbumArtistMetadataTopSongsContent = ({
}, [tableConfig?.columns]);
const filteredSongs = useMemo(() => {
- const filtered = searchLibraryItems(songs, debouncedSearchTerm, LibraryItem.SONG);
- // When searching, show all results. Otherwise, limit to 5 if not showing all
- if (debouncedSearchTerm?.trim() || showAll) {
- return filtered;
- }
- return filtered.slice(0, 5);
- }, [songs, debouncedSearchTerm, showAll]);
+ return searchLibraryItems(songs, debouncedSearchTerm, LibraryItem.SONG);
+ }, [songs, debouncedSearchTerm]);
const { handleColumnReordered } = useItemListColumnReorder({
itemListKey: ItemListKey.SONG,
@@ -459,35 +486,35 @@ const AlbumArtistMetadataTopSongsContent = ({
tableColumnsData={SONG_TABLE_COLUMNS}
/>
-
- {!searchTerm.trim() && songs.length > 5 && !showAll && (
-
-
-
- )}
+ itemCount={filteredSongs.length}
+ maxRows={5}
+ tableSize={tableConfig.size}
+ >
+
+
>
) : null}
@@ -523,7 +550,6 @@ const AlbumArtistMetadataFavoriteSongs = ({ routeId }: AlbumArtistMetadataFavori
const { t } = useTranslation();
const [searchTerm, setSearchTerm] = useState('');
const [debouncedSearchTerm] = useDebouncedValue(searchTerm, 300);
- const [showAll, setShowAll] = useState(false);
const tableConfig = useSettingsStore((state) => state.lists[ItemListKey.SONG]?.table);
const currentSong = usePlayerSong();
const player = usePlayer();
@@ -548,13 +574,8 @@ const AlbumArtistMetadataFavoriteSongs = ({ routeId }: AlbumArtistMetadataFavori
}, [tableConfig?.columns]);
const filteredSongs = useMemo(() => {
- const filtered = searchLibraryItems(songs, debouncedSearchTerm, LibraryItem.SONG);
- // When searching, show all results. Otherwise, limit to 5 if not showing all
- if (debouncedSearchTerm?.trim() || showAll) {
- return filtered;
- }
- return filtered.slice(0, 5);
- }, [songs, debouncedSearchTerm, showAll]);
+ return searchLibraryItems(songs, debouncedSearchTerm, LibraryItem.SONG);
+ }, [songs, debouncedSearchTerm]);
const { handleColumnReordered } = useItemListColumnReorder({
itemListKey: ItemListKey.SONG,
@@ -717,8 +738,12 @@ const AlbumArtistMetadataFavoriteSongs = ({ routeId }: AlbumArtistMetadataFavori
tableColumnsData={SONG_TABLE_COLUMNS}
/>
- {/* Restrict the height. Rendering all items in the DOM makes for a long delay */}
-
+
-
-
- {!searchTerm.trim() && songs.length > 5 && !showAll && (
-
-
-
- )}
+
>
) : null}