From 946d9d92f912c00d253fc8a5160468ba18187a77 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Mon, 9 Feb 2026 21:26:41 -0800 Subject: [PATCH] properly handle genre columns --- .../columns/genre-badge-column.module.css | 12 +++++ .../columns/genre-badge-column.tsx | 46 ++++++++++++++++++- .../item-detail-list/columns/genre-column.tsx | 42 +++++++++++++++-- 3 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.module.css diff --git a/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.module.css b/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.module.css new file mode 100644 index 000000000..2a4af2c49 --- /dev/null +++ b/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.module.css @@ -0,0 +1,12 @@ +.group { + flex-wrap: nowrap; + gap: var(--theme-spacing-sm) var(--theme-spacing-xs); + min-width: 0; + padding: var(--theme-spacing-xs) 0; + overflow: hidden; +} + +.group a { + cursor: pointer; + user-select: none; +} diff --git a/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.tsx b/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.tsx index d196d77ef..8cff88338 100644 --- a/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.tsx +++ b/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.tsx @@ -1,4 +1,46 @@ +import { useMemo } from 'react'; +import { generatePath, Link } from 'react-router'; + +import styles from './genre-badge-column.module.css'; import { ItemDetailListCellProps } from './types'; -export const GenreBadgeColumn = ({ song }: ItemDetailListCellProps) => - song.genres?.length ? song.genres.map((g) => g.name).join(', ') : <> ; +import { AppRoute } from '/@/renderer/router/routes'; +import { Badge } from '/@/shared/components/badge/badge'; +import { Group } from '/@/shared/components/group/group'; +import { stringToColor } from '/@/shared/utils/string-to-color'; + +const MAX_GENRES = 4; + +export const GenreBadgeColumn = ({ song }: ItemDetailListCellProps) => { + const genres = song.genres; + + const genresWithStyle = useMemo(() => { + if (!genres) return []; + return genres.slice(0, MAX_GENRES).map((genre) => { + const { color, isLight } = stringToColor(genre.name); + const path = generatePath(AppRoute.LIBRARY_GENRES_DETAIL, { genreId: genre.id }); + return { ...genre, color, isLight, path }; + }); + }, [genres]); + + if (!genresWithStyle.length) return <> ; + + return ( + + {genresWithStyle.map((genre) => ( + + {genre.name} + + ))} + + ); +}; diff --git a/src/renderer/components/item-list/item-detail-list/columns/genre-column.tsx b/src/renderer/components/item-list/item-detail-list/columns/genre-column.tsx index e337fe123..6c3406910 100644 --- a/src/renderer/components/item-list/item-detail-list/columns/genre-column.tsx +++ b/src/renderer/components/item-list/item-detail-list/columns/genre-column.tsx @@ -1,4 +1,40 @@ -import { ItemDetailListCellProps } from './types'; +import { Fragment } from 'react'; +import { generatePath, Link } from 'react-router'; -export const GenreColumn = ({ song }: ItemDetailListCellProps) => - song.genres?.length ? song.genres.map((g) => g.name).join(', ') : <> ; +import { ItemDetailListCellProps } from '/@/renderer/components/item-list/item-detail-list/columns/types'; +import { AppRoute } from '/@/renderer/router/routes'; +import { Text } from '/@/shared/components/text/text'; + +const TEXT_PROPS = { isMuted: true, isNoSelect: true, size: 'sm' as const } as const; + +export const GenreColumn = ({ isRowHovered, song }: ItemDetailListCellProps) => { + const genres = song.genres ?? []; + if (!genres.length) return <> ; + + return ( + <> + {genres.map((genre, index) => ( + + {isRowHovered ? ( + + {genre.name} + + ) : ( + + {genre.name} + + )} + {index < genres.length - 1 && ', '} + + ))} + + ); +};