simplify disc/subtitle for album list
This commit is contained in:
parent
b41a1a8b15
commit
8a8542ddb1
3 changed files with 32 additions and 20 deletions
|
@ -19,8 +19,11 @@ export const FullWidthDiscCell = ({ node, data, api }: ICellRendererParams) => {
|
||||||
|
|
||||||
const handleToggleDiscNodes = () => {
|
const handleToggleDiscNodes = () => {
|
||||||
if (!data) return;
|
if (!data) return;
|
||||||
const discNumber = Number(node.data.id.split('-')[1]);
|
const split: string[] = node.data.id.split('-');
|
||||||
const nodes = getNodesByDiscNumber({ api, discNumber });
|
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 });
|
setNodeSelection({ isSelected: !isSelected, nodes });
|
||||||
setIsSelected((prev) => !prev);
|
setIsSelected((prev) => !prev);
|
||||||
|
|
|
@ -1,11 +1,16 @@
|
||||||
import { GridApi, RowNode } from '@ag-grid-community/core';
|
import { GridApi, RowNode } from '@ag-grid-community/core';
|
||||||
|
|
||||||
export const getNodesByDiscNumber = (args: { api: GridApi; discNumber: number }) => {
|
export const getNodesByDiscNumber = (args: {
|
||||||
const { api, discNumber } = args;
|
api: GridApi;
|
||||||
|
discNumber: number;
|
||||||
|
subtitle: string | null;
|
||||||
|
}) => {
|
||||||
|
const { api, discNumber, subtitle } = args;
|
||||||
|
|
||||||
const nodes: RowNode<any>[] = [];
|
const nodes: RowNode<any>[] = [];
|
||||||
api.forEachNode((node) => {
|
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;
|
return nodes;
|
||||||
|
|
|
@ -105,28 +105,32 @@ export const AlbumDetailContent = ({ tableRef, background }: AlbumDetailContentP
|
||||||
return [];
|
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 rowData: (QueueSong | { id: string; name: string })[] = [];
|
||||||
|
const discTranslated = t('common.disc', { postProcess: 'upperCase' });
|
||||||
|
|
||||||
for (const discNumber of uniqueDiscNumbers.values()) {
|
for (const song of detailQuery.data.songs) {
|
||||||
const songsByDiscNumber = detailQuery.data?.songs.filter(
|
if (song.discNumber !== discNumber || song.discSubtitle !== discSubtitle) {
|
||||||
(s) => s.discNumber === discNumber,
|
discNumber = song.discNumber;
|
||||||
);
|
discSubtitle = song.discSubtitle;
|
||||||
|
|
||||||
const discSubtitle = songsByDiscNumber?.[0]?.discSubtitle;
|
let id = `disc-${discNumber}`;
|
||||||
const discName = [`Disc ${discNumber}`.toLocaleUpperCase(), discSubtitle]
|
let name = `${discTranslated} ${discNumber}`;
|
||||||
.filter(Boolean)
|
|
||||||
.join(': ');
|
|
||||||
|
|
||||||
rowData.push({
|
if (discSubtitle) {
|
||||||
id: `disc-${discNumber}`,
|
id += `-${discSubtitle}`;
|
||||||
name: discName,
|
name += `: ${discSubtitle}`;
|
||||||
});
|
}
|
||||||
rowData.push(...songsByDiscNumber);
|
|
||||||
|
rowData.push({ id, name });
|
||||||
|
}
|
||||||
|
rowData.push(song);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rowData;
|
return rowData;
|
||||||
}, [detailQuery.data?.songs]);
|
}, [detailQuery.data?.songs, t]);
|
||||||
|
|
||||||
const [pagination, setPagination] = useSetState({
|
const [pagination, setPagination] = useSetState({
|
||||||
artist: 0,
|
artist: 0,
|
||||||
|
|
Reference in a new issue