diff --git a/src/renderer/components/virtual-table/cells/full-width-disc-cell.tsx b/src/renderer/components/virtual-table/cells/full-width-disc-cell.tsx index 2dec42b7..9ad46dcc 100644 --- a/src/renderer/components/virtual-table/cells/full-width-disc-cell.tsx +++ b/src/renderer/components/virtual-table/cells/full-width-disc-cell.tsx @@ -19,8 +19,11 @@ export const FullWidthDiscCell = ({ node, data, api }: ICellRendererParams) => { const handleToggleDiscNodes = () => { if (!data) return; - const discNumber = Number(node.data.id.split('-')[1]); - const nodes = getNodesByDiscNumber({ api, discNumber }); + const split: string[] = node.data.id.split('-'); + const discNumber = Number(split[1]); + // the subtitle could have '-' in it; make sure to have all remaining items + const subtitle = split.length === 3 ? split.slice(2).join('-') : null; + const nodes = getNodesByDiscNumber({ api, discNumber, subtitle }); setNodeSelection({ isSelected: !isSelected, nodes }); setIsSelected((prev) => !prev); diff --git a/src/renderer/components/virtual-table/utils.ts b/src/renderer/components/virtual-table/utils.ts index 80057720..6618ea73 100644 --- a/src/renderer/components/virtual-table/utils.ts +++ b/src/renderer/components/virtual-table/utils.ts @@ -1,11 +1,16 @@ import { GridApi, RowNode } from '@ag-grid-community/core'; -export const getNodesByDiscNumber = (args: { api: GridApi; discNumber: number }) => { - const { api, discNumber } = args; +export const getNodesByDiscNumber = (args: { + api: GridApi; + discNumber: number; + subtitle: string | null; +}) => { + const { api, discNumber, subtitle } = args; const nodes: RowNode[] = []; api.forEachNode((node) => { - if (node.data.discNumber === discNumber) nodes.push(node); + if (node.data.discNumber === discNumber && node.data.discSubtitle === subtitle) + nodes.push(node); }); return nodes; diff --git a/src/renderer/features/albums/components/album-detail-content.tsx b/src/renderer/features/albums/components/album-detail-content.tsx index 728e0608..73834a21 100644 --- a/src/renderer/features/albums/components/album-detail-content.tsx +++ b/src/renderer/features/albums/components/album-detail-content.tsx @@ -105,28 +105,32 @@ export const AlbumDetailContent = ({ tableRef, background }: AlbumDetailContentP return []; } - const uniqueDiscNumbers = new Set(detailQuery.data?.songs.map((s) => s.discNumber)); + let discNumber = -1; + let discSubtitle: string | null = null; + const rowData: (QueueSong | { id: string; name: string })[] = []; + const discTranslated = t('common.disc', { postProcess: 'upperCase' }); - for (const discNumber of uniqueDiscNumbers.values()) { - const songsByDiscNumber = detailQuery.data?.songs.filter( - (s) => s.discNumber === discNumber, - ); + for (const song of detailQuery.data.songs) { + if (song.discNumber !== discNumber || song.discSubtitle !== discSubtitle) { + discNumber = song.discNumber; + discSubtitle = song.discSubtitle; - const discSubtitle = songsByDiscNumber?.[0]?.discSubtitle; - const discName = [`Disc ${discNumber}`.toLocaleUpperCase(), discSubtitle] - .filter(Boolean) - .join(': '); + let id = `disc-${discNumber}`; + let name = `${discTranslated} ${discNumber}`; - rowData.push({ - id: `disc-${discNumber}`, - name: discName, - }); - rowData.push(...songsByDiscNumber); + if (discSubtitle) { + id += `-${discSubtitle}`; + name += `: ${discSubtitle}`; + } + + rowData.push({ id, name }); + } + rowData.push(song); } return rowData; - }, [detailQuery.data?.songs]); + }, [detailQuery.data?.songs, t]); const [pagination, setPagination] = useSetState({ artist: 0,