mirror of
https://github.com/jeffvli/feishin.git
synced 2026-06-22 20:07:42 +02:00
feat(albums): show grouping tags on album detail page (#1872)
* feat(albums): show grouping tags on album detail page --------- Co-authored-by: Romain VIGNERES <romain.vigneres@texa.fr>
This commit is contained in:
@@ -301,6 +301,7 @@
|
|||||||
"forward": "endavant",
|
"forward": "endavant",
|
||||||
"manage": "gestiona",
|
"manage": "gestiona",
|
||||||
"mbid": "ID de MusicBrainz",
|
"mbid": "ID de MusicBrainz",
|
||||||
|
"grouping": "agrupament",
|
||||||
"noResultsFromQuery": "la petició no ha produït resultats",
|
"noResultsFromQuery": "la petició no ha produït resultats",
|
||||||
"path": "ruta",
|
"path": "ruta",
|
||||||
"playerMustBePaused": "cal pausar el reproductor",
|
"playerMustBePaused": "cal pausar el reproductor",
|
||||||
|
|||||||
@@ -124,6 +124,7 @@
|
|||||||
"preview": "Vorschau",
|
"preview": "Vorschau",
|
||||||
"reload": "Neu Laden",
|
"reload": "Neu Laden",
|
||||||
"mbid": "MusicBrainz ID",
|
"mbid": "MusicBrainz ID",
|
||||||
|
"grouping": "gruppierung",
|
||||||
"close": "schließen",
|
"close": "schließen",
|
||||||
"share": "Teilen",
|
"share": "Teilen",
|
||||||
"translation": "Übersetzung",
|
"translation": "Übersetzung",
|
||||||
|
|||||||
@@ -109,6 +109,7 @@
|
|||||||
"minimize": "minimize",
|
"minimize": "minimize",
|
||||||
"modified": "modified",
|
"modified": "modified",
|
||||||
"mbid": "MusicBrainz ID",
|
"mbid": "MusicBrainz ID",
|
||||||
|
"grouping": "grouping",
|
||||||
"mood": "mood",
|
"mood": "mood",
|
||||||
"name": "name",
|
"name": "name",
|
||||||
"no": "no",
|
"no": "no",
|
||||||
|
|||||||
@@ -183,6 +183,7 @@
|
|||||||
"albumPeak": "crête de l'album",
|
"albumPeak": "crête de l'album",
|
||||||
"close": "fermer",
|
"close": "fermer",
|
||||||
"mbid": "Identifiant MusicBrainz",
|
"mbid": "Identifiant MusicBrainz",
|
||||||
|
"grouping": "regroupement",
|
||||||
"preview": "aperçu",
|
"preview": "aperçu",
|
||||||
"share": "partager",
|
"share": "partager",
|
||||||
"reload": "recharger",
|
"reload": "recharger",
|
||||||
|
|||||||
@@ -128,6 +128,7 @@
|
|||||||
"close": "chiudi",
|
"close": "chiudi",
|
||||||
"codec": "codec",
|
"codec": "codec",
|
||||||
"mbid": "MusicBrainz ID",
|
"mbid": "MusicBrainz ID",
|
||||||
|
"grouping": "raggruppamento",
|
||||||
"preview": "anteprima",
|
"preview": "anteprima",
|
||||||
"reload": "aggiorna",
|
"reload": "aggiorna",
|
||||||
"share": "condividi",
|
"share": "condividi",
|
||||||
|
|||||||
@@ -134,6 +134,7 @@
|
|||||||
"bitDepth": "bitdiepte",
|
"bitDepth": "bitdiepte",
|
||||||
"codec": "codec",
|
"codec": "codec",
|
||||||
"mbid": "MusicBrainz ID",
|
"mbid": "MusicBrainz ID",
|
||||||
|
"grouping": "groepering",
|
||||||
"share": "deel",
|
"share": "deel",
|
||||||
"explicit": "expliciet",
|
"explicit": "expliciet",
|
||||||
"sampleRate": "sample rate",
|
"sampleRate": "sample rate",
|
||||||
|
|||||||
@@ -84,6 +84,7 @@
|
|||||||
"size": "tamanho",
|
"size": "tamanho",
|
||||||
"note": "observação",
|
"note": "observação",
|
||||||
"mbid": "ID no MusicBrainz",
|
"mbid": "ID no MusicBrainz",
|
||||||
|
"grouping": "agrupamento",
|
||||||
"reload": "recarregar",
|
"reload": "recarregar",
|
||||||
"codec": "codec",
|
"codec": "codec",
|
||||||
"preview": "pré-visualizar",
|
"preview": "pré-visualizar",
|
||||||
|
|||||||
@@ -72,6 +72,7 @@
|
|||||||
"forceRestartRequired": "reinicie para aplicar as alterações… feche a notificação para reiniciar",
|
"forceRestartRequired": "reinicie para aplicar as alterações… feche a notificação para reiniciar",
|
||||||
"forward": "para frente",
|
"forward": "para frente",
|
||||||
"gap": "intervalo",
|
"gap": "intervalo",
|
||||||
|
"grouping": "agrupamento",
|
||||||
"home": "início",
|
"home": "início",
|
||||||
"increase": "incrementar",
|
"increase": "incrementar",
|
||||||
"left": "esquerda",
|
"left": "esquerda",
|
||||||
|
|||||||
@@ -126,6 +126,7 @@
|
|||||||
"note": "заметка",
|
"note": "заметка",
|
||||||
"none": "нет",
|
"none": "нет",
|
||||||
"mbid": "MusicBrainz ID",
|
"mbid": "MusicBrainz ID",
|
||||||
|
"grouping": "группировка",
|
||||||
"reload": "перезагрузить",
|
"reload": "перезагрузить",
|
||||||
"preview": "просмотр",
|
"preview": "просмотр",
|
||||||
"codec": "кодек",
|
"codec": "кодек",
|
||||||
|
|||||||
@@ -98,6 +98,7 @@
|
|||||||
"forceRestartRequired": "перезапустіть, щоб застосувати зміни… закрийте повідомлення, щоб перезапустити",
|
"forceRestartRequired": "перезапустіть, щоб застосувати зміни… закрийте повідомлення, щоб перезапустити",
|
||||||
"forward": "уперед",
|
"forward": "уперед",
|
||||||
"gap": "прогалина",
|
"gap": "прогалина",
|
||||||
|
"grouping": "групування",
|
||||||
"home": "додому",
|
"home": "додому",
|
||||||
"increase": "збільшити",
|
"increase": "збільшити",
|
||||||
"left": "ліво",
|
"left": "ліво",
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ interface AlbumMetadataTagsProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const MOOD_TAG = 'mood';
|
const MOOD_TAG = 'mood';
|
||||||
|
const GROUPING_TAG = 'grouping';
|
||||||
const RELEASE_COUNTRY_TAG = 'releasecountry';
|
const RELEASE_COUNTRY_TAG = 'releasecountry';
|
||||||
const RELEASE_STATUS_TAG = 'releasestatus';
|
const RELEASE_STATUS_TAG = 'releasestatus';
|
||||||
|
|
||||||
@@ -155,6 +156,30 @@ const AlbumMetadataTags = ({ album }: AlbumMetadataTagsProps) => {
|
|||||||
}));
|
}));
|
||||||
}, [album]);
|
}, [album]);
|
||||||
|
|
||||||
|
const groupingItems = useMemo(() => {
|
||||||
|
if (!album) return [];
|
||||||
|
|
||||||
|
return (
|
||||||
|
album.tags?.[GROUPING_TAG]?.map((tag) => {
|
||||||
|
if (album._serverType !== ServerType.NAVIDROME) {
|
||||||
|
return { id: tag, label: tag, url: null };
|
||||||
|
}
|
||||||
|
|
||||||
|
const searchParams = new URLSearchParams();
|
||||||
|
const paramsWithCustom = setJsonSearchParam(
|
||||||
|
searchParams,
|
||||||
|
FILTER_KEYS.ALBUM._CUSTOM,
|
||||||
|
{ grouping: [tag] },
|
||||||
|
);
|
||||||
|
return {
|
||||||
|
id: tag,
|
||||||
|
label: tag,
|
||||||
|
url: `${AppRoute.LIBRARY_ALBUMS}?${paramsWithCustom.toString()}`,
|
||||||
|
};
|
||||||
|
}) ?? []
|
||||||
|
);
|
||||||
|
}, [album]);
|
||||||
|
|
||||||
const recordLabels = useMemo(() => {
|
const recordLabels = useMemo(() => {
|
||||||
if (!album?.recordLabels || album.recordLabels.length === 0) return [];
|
if (!album?.recordLabels || album.recordLabels.length === 0) return [];
|
||||||
|
|
||||||
@@ -221,6 +246,29 @@ const AlbumMetadataTags = ({ album }: AlbumMetadataTagsProps) => {
|
|||||||
items={moodTagItems}
|
items={moodTagItems}
|
||||||
title={t('common.mood', { postProcess: 'sentenceCase' })}
|
title={t('common.mood', { postProcess: 'sentenceCase' })}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{groupingItems.length > 0 && (
|
||||||
|
<Stack align="center" className={styles.metadataPillGroup} gap="xs">
|
||||||
|
<Text fw={600} isNoSelect size="sm" tt="uppercase">
|
||||||
|
{t('common.grouping', { postProcess: 'sentenceCase' })}
|
||||||
|
</Text>
|
||||||
|
<div className={styles['pill-group-wrapper']}>
|
||||||
|
<Pill.Group>
|
||||||
|
{groupingItems.map((item) =>
|
||||||
|
item.url ? (
|
||||||
|
<PillLink key={`grouping-${item.id}`} size="md" to={item.url}>
|
||||||
|
{item.label}
|
||||||
|
</PillLink>
|
||||||
|
) : (
|
||||||
|
<Pill key={`grouping-${item.id}`} size="md">
|
||||||
|
{item.label}
|
||||||
|
</Pill>
|
||||||
|
),
|
||||||
|
)}
|
||||||
|
</Pill.Group>
|
||||||
|
</div>
|
||||||
|
</Stack>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user