From 65aaa71a3d76dd81b16a4f1a9d00551bd2dc0834 Mon Sep 17 00:00:00 2001 From: valere Date: Mon, 8 Dec 2025 23:48:21 +0100 Subject: [PATCH] FEAT: playlist filters --- app/components/Card.vue | 9 +-- app/components/deck/DeckPlaylist.vue | 92 ++++++++++++++++++++++++---- app/components/ui/SearchInput.vue | 25 ++++++++ app/components/ui/SelectCardRank.vue | 37 +++++++++++ app/components/ui/SelectCardSuit.vue | 28 +++++++++ app/layouts/default.vue | 2 +- 6 files changed, 176 insertions(+), 17 deletions(-) create mode 100644 app/components/ui/SearchInput.vue create mode 100644 app/components/ui/SelectCardRank.vue create mode 100644 app/components/ui/SelectCardSuit.vue diff --git a/app/components/Card.vue b/app/components/Card.vue index 9fd2ae5..6afc935 100644 --- a/app/components/Card.vue +++ b/app/components/Card.vue @@ -35,7 +35,8 @@ - +

--> + diff --git a/app/components/deck/DeckPlaylist.vue b/app/components/deck/DeckPlaylist.vue index fcf5a19..2b1c4be 100644 --- a/app/components/deck/DeckPlaylist.vue +++ b/app/components/deck/DeckPlaylist.vue @@ -1,16 +1,28 @@ @@ -21,6 +33,9 @@ import { useCardStore } from '~/store/card' import { usePlayerStore } from '~/store/player' import { useUiStore } from '~/store/ui' import type { Box } from '~~/types/types' +import SelectCardSuit from '~/components/ui/SelectCardSuit.vue' +import SelectCardRank from '~/components/ui/SelectCardRank.vue' +import SearchInput from '~/components/ui/SearchInput.vue' const props = defineProps<{ box: Box @@ -33,10 +48,63 @@ const uiStore = useUiStore() const deck = ref() const tracks = computed(() => dataStore.getTracksByboxId(props.box.id)) +const filteredTracks = ref(tracks.value) + +// Variables réactives pour les filtres +const selectedSuit = ref('') +const selectedRank = ref('') +const searchQuery = ref('') const isCardRevealed = (trackId: number) => cardStore.isCardRevealed(trackId) const closeDatBox = () => { uiStore.closeBox() } + +const onSuitChange = (suit: string) => { + selectedSuit.value = suit + applyFilters() +} + +const onRankChange = (rank: string) => { + selectedRank.value = rank + applyFilters() +} + +const onSearch = (query: string) => { + searchQuery.value = query + applyFilters() +} + +// Applique tous les filtres (couleur, rang et recherche) +const applyFilters = () => { + let result = [...tracks.value] + + // Filtre par couleur + if (selectedSuit.value) { + result = result.filter(track => track.card?.suit === selectedSuit.value) + } + + // Filtre par rang + if (selectedRank.value) { + result = result.filter(track => track.card?.rank === selectedRank.value) + } + + // Filtre par recherche textuelle + if (searchQuery.value) { + const query = searchQuery.value.toLowerCase() + result = result.filter(track => { + // Gestion du nom d'artiste (peut être un objet ou une chaîne) + const artistName = typeof track.artist === 'object' ? track.artist?.name : String(track.artist || '') + // Recherche dans le titre, l'artiste et l'année + return ( + track.title?.toLowerCase().includes(query) || + artistName.toLowerCase().includes(query) || + String(track.year || '').includes(query) + ) + }) + } + + filteredTracks.value = result +} diff --git a/app/components/ui/SearchInput.vue b/app/components/ui/SearchInput.vue new file mode 100644 index 0000000..522f017 --- /dev/null +++ b/app/components/ui/SearchInput.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/components/ui/SelectCardRank.vue b/app/components/ui/SelectCardRank.vue new file mode 100644 index 0000000..cf7bb76 --- /dev/null +++ b/app/components/ui/SelectCardRank.vue @@ -0,0 +1,37 @@ + + + \ No newline at end of file diff --git a/app/components/ui/SelectCardSuit.vue b/app/components/ui/SelectCardSuit.vue new file mode 100644 index 0000000..c045a94 --- /dev/null +++ b/app/components/ui/SelectCardSuit.vue @@ -0,0 +1,28 @@ + + + \ No newline at end of file diff --git a/app/layouts/default.vue b/app/layouts/default.vue index 1c1a9d1..08eaab0 100644 --- a/app/layouts/default.vue +++ b/app/layouts/default.vue @@ -3,6 +3,6 @@ - +