From 59c840c21798d515bfc375bead87e690cd70900a Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Fri, 31 Jul 2026 14:15:15 +0200 Subject: feat(catalog): add in-memory case-insensitive search filter Adds a search input to the Catalog page that filters items by name using a simple case-insensitive substring match. Empty categories are hidden when filtering. --- src/routes/catalog/+page.svelte | 126 +++++++++++++++++++++++++--------------- 1 file changed, 80 insertions(+), 46 deletions(-) (limited to 'src/routes') diff --git a/src/routes/catalog/+page.svelte b/src/routes/catalog/+page.svelte index aa02ef5..ebc1819 100644 --- a/src/routes/catalog/+page.svelte +++ b/src/routes/catalog/+page.svelte @@ -6,6 +6,15 @@ let catalogItems = $derived(data?.items ?? []); let selectedIds = new SvelteSet(); + let searchQuery = $state(''); + + let filteredItems = $derived( + searchQuery.trim() === '' + ? catalogItems + : catalogItems.filter((item) => + item.name.toLowerCase().includes(searchQuery.toLowerCase()), + ), + ); function toggleId(id: number) { if (selectedIds.has(id)) selectedIds.delete(id); @@ -18,9 +27,12 @@ const key = item.categoryName ?? 'Non catégorisé'; (groups[key] ??= []).push(item); } - const result: [string, typeof catalogItems][] = data.categories.map( - (cat) => [cat.name, groups[cat.name] ?? []], - ); + const result: [string, typeof catalogItems][] = []; + for (const cat of data.categories) { + if (groups[cat.name]?.length > 0) { + result.push([cat.name, groups[cat.name]]); + } + } if (groups['Non catégorisé']?.length > 0) { result.unshift(['Non catégorisé', groups['Non catégorisé']]); } @@ -68,49 +80,60 @@ {#if catalogItems.length === 0}

Aucun article

{:else} -
- {#each groupByCategory(catalogItems) as [cat, items] (cat)} -

{cat}

-
    - {#each items as item (item.id)} -
  • - toggleId(item.id)} - /> - - → -
  • - {/each} -
- {/each} -
+ + + {#if filteredItems.length === 0} +

Aucun résultat

+ {:else} +
+ {#each groupByCategory(filteredItems) as [cat, items] (cat)} +

{cat}

+
    + {#each items as item (item.id)} +
  • + toggleId(item.id)} + /> + + → +
  • + {/each} +
+ {/each} +
+ {/if} {/if} @@ -173,4 +196,15 @@ margin-top: 1rem; padding: 2rem; } + + .search-input { + width: 100%; + padding: 0.75rem 1rem; + border: 1px solid var(--border); + border-radius: 0.5rem; + background: var(--surface); + color: var(--text); + font-size: 1rem; + margin-top: 1rem; + } -- cgit v1.3