fix: recherche insensible à la casse et aux accents dans tous les filtres

- utils/search.ts : normalize() (NFD + minuscules) + matchesSearch()
- ShoppingPage filteredProducts : matchesSearch sur nom ET marque
- Backend searchProducts : ilike sur nom ET marque (or_)
- Notes FTS : déjà insensible nativement (plainto_tsquery)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 07:00:27 +02:00
parent a86c14b0b9
commit 377531d08e
3 changed files with 17 additions and 5 deletions
+5 -3
View File
@@ -1,5 +1,6 @@
// frontend/src/pages/ShoppingPage.tsx
import { useState, useEffect, useCallback } from 'react'
import { matchesSearch } from '../utils/search'
import type { ShoppingListDetail, ShoppingList, Store, Product } from '../api/shopping'
import {
fetchLists, createList, fetchListDetail, deleteList,
@@ -213,9 +214,10 @@ export default function ShoppingPage() {
const hasCurrentList = currentList !== null
const pastLists = allLists.filter(l => l.status === 'done')
const filteredProducts = products.filter(
p => !itemSearch.trim() || p.name.toLowerCase().includes(itemSearch.trim().toLowerCase())
)
const filteredProducts = products.filter(p => {
const term = itemSearch.trim()
return !term || matchesSearch(p.name, term) || matchesSearch(p.brand ?? '', term)
})
return (
<div style={{ display: 'flex', flexDirection: 'column', minHeight: '100%' }}>
+10
View File
@@ -0,0 +1,10 @@
/** Normalise une chaîne : minuscules + suppression des accents. */
export function normalize(s: string): string {
return s.toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g, '')
}
/** Vérifie si `haystack` contient `needle` (insensible casse/accents). */
export function matchesSearch(haystack: string, needle: string): boolean {
if (!needle) return true
return normalize(haystack).includes(normalize(needle))
}