diff --git a/partitions/src/routes/scores/+page.svelte b/partitions/src/routes/scores/+page.svelte index e935f82..889ffdb 100644 --- a/partitions/src/routes/scores/+page.svelte +++ b/partitions/src/routes/scores/+page.svelte @@ -2,11 +2,12 @@ import { onMount } from 'svelte'; import { apiService, type Score } from '$lib/api'; - let scores: Score[] = []; - let loading = true; - let error = ''; - let sortBy: 'id' | 'name' | 'compositor' = 'id'; - let sortOrder: 'asc' | 'desc' = 'asc'; + let scores = $state([]); + let loading = $state(true); + let error = $state(''); + let sortBy: 'id' | 'name' | 'compositor' = $state('id'); + let sortOrder: 'asc' | 'desc' = $state('desc'); + let filter: string = $state(''); onMount(async () => { try { @@ -28,16 +29,37 @@ } } - $: sortedScores = [...scores].sort((a, b) => { - let aVal = a[sortBy] || ''; - let bVal = b[sortBy] || ''; - let cmp: number; - if (sortBy === 'id') { - cmp = parseInt(a.id) - parseInt(b.id); - } else { - cmp = aVal.localeCompare(bVal); + function removeAccents(str: string): string { + return str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); + } + + let filteredScores = $derived.by(() => { + let result = [...scores]; + + // Filter + if (filter.trim()) { + const f = removeAccents(filter.toLowerCase()); + result = result.filter(s => + removeAccents(s.id.toLowerCase()).includes(f) || + removeAccents(s.name.toLowerCase()).includes(f) || + removeAccents(s.compositor || '').toLowerCase().includes(f) + ); } - return sortOrder === 'asc' ? cmp : -cmp; + + // Sort + result.sort((a, b) => { + let aVal = a[sortBy] || ''; + let bVal = b[sortBy] || ''; + let cmp: number; + if (sortBy === 'id') { + cmp = parseInt(a.id) - parseInt(b.id); + } else { + cmp = String(aVal).localeCompare(String(bVal)); + } + return sortOrder === 'asc' ? cmp : -cmp; + }); + + return result; }); @@ -48,7 +70,7 @@

Répertoire

-

{scores.length} partitions disponibles

+

{scores.length} partition{scores.length !== 1 ? 's' : ''} disponible{scores.length !== 1 ? 's' : ''}

{#if loading} @@ -60,32 +82,76 @@ {error}
{:else} + +
+
+ +
+
+ + + + +
+
+ + +
+ Trier par : +
+ + + +
+
+
+ + {#if filter} +

{filteredScores.length} résultat{filteredScores.length !== 1 ? 's' : ''} pour "{filter}"

+ {/if} +
+ +
- - - - {#each sortedScores as score} + {#each filteredScores as score} window.location.href = '/scores/' + score.id}>
sortScores('id')} - > - № {sortBy === 'id' ? (sortOrder === 'asc' ? '↑' : '↓') : ''} + + № sortScores('name')} - > - Nom {sortBy === 'name' ? (sortOrder === 'asc' ? '↑' : '↓') : ''} + + Nom sortScores('compositor')} - > - Compositeur {sortBy === 'compositor' ? (sortOrder === 'asc' ? '↑' : '↓') : ''} + + Compositeur
{score.id} @@ -100,6 +166,12 @@ {/each}
+ + {#if filteredScores.length === 0} +
+ Aucune partition ne correspond à votre recherche +
+ {/if}
{/if}