feat(recipes): barre de recherche commune à tous les onglets de sources (#133) #140
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/common-source-search"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Closes #133(puce 6 de #3). Chaque onglet de source rendait son propre champ recherche (RecipeSourcesPanel, sonsearch/debouncedSearchinterne), et le panneau est remonté (key={sourceKey}) à chaque changement de source → la requête tapée était perdue en passant d'une source à une autre.Changements
RecipesPage— le champ recherche est rendu en permanence (plus de conditionactiveSourceKey === null).search/debouncedSearchétaient déjà là pour les onglets réels ;debouncedSearchest maintenant passé en prop àRecipeSourcesPanel.RecipeSourcesPanel— plus deuseStatede recherche, plus d'<input>, plus d'effet de debounce internes. Nouvelle propdebouncedSearch: string; l'effet debrowse(et le préchargement, ethandleLoadMore) en dépendent. Lekey={sourceKey}reste (il remonte la liste + le préchargement, ce qui est voulu) — le terme, lui, vit au-dessus. Le panneau ne rend plus que.recipes-page__catalog(liste + preview) ; l'ancien<div class="recipes-page__header--sources">disparaît.RecipePickerDialog— même logique : le champ recherche sort du blocactiveSourceKey === null(les filtres ingrédients/régimes/foyer y restent, ils ne s'appliquent qu'aux onglets en base),debouncedSearchest passé au panneau. Le dialogue avait déjà son propresearch/debouncedSearch.Nettoyage —
.recipes-page__header--sourcessupprimé derecipes.scss; clé i18n morterecipes.sources.searchPlaceholderretirée ;specs/frontend-architecture.mdmis à jour (recherche portée par la page).Tests
recipe-sources.feature— nouveau scénario « Keeps the search term when switching between source tabs » : deux sources activées, on tape « poulet » sur l'onglet TheMealDB, on bascule sur Marmiton → le champ garde « poulet » et lebrowsede Marmiton part avecquery=poulet.Vérification locale
pnpm lint✓ ·pnpm build✓ · Cypress :recipe-sources.feature8/8 (dont le nouveau), régressionrecipes.feature5/5,recipes.cy.ts12/12,planning.feature3/3.🤖 Generated with Claude Code
Avant : chaque onglet de source rendait son propre champ recherche, avec son propre state, et `RecipeSourcesPanel` est remonté (`key={sourceKey}`) à chaque changement de source — la requête tapée était donc perdue en passant d'une source à une autre. Maintenant : un seul champ, dans l'en-tête de `RecipesPage`. `search` / `debouncedSearch` (déjà présents pour les onglets réels) sont rendus en permanence et `debouncedSearch` est passé en prop à `RecipeSourcesPanel`, qui n'a plus ni `useState` de recherche, ni `<input>`, ni effet de debounce internes — son effet de `browse` dépend de la prop. La requête survit donc au changement de source (le `key` remonte toujours la liste + le préchargement, mais le terme vit au-dessus), et elle est commune aux onglets réels comme aux sources. `RecipePickerDialog` : même chose — le champ recherche sort du bloc de filtres `activeSourceKey === null` (les filtres ingrédients/régimes/foyer y restent, ils ne concernent que les onglets en base) et `debouncedSearch` est passé au panneau. - SCSS : `.recipes-page__header--sources` supprimé (le panneau n'a plus d'en-tête). Clé i18n morte `recipes.sources.searchPlaceholder` retirée. - `specs/frontend-architecture.md` : recherche au niveau page. Tests : `recipe-sources.feature` — nouveau scénario « la requête est conservée en changeant d'onglet de source » (tape « poulet » sur TheMealDB, bascule sur Marmiton, le champ garde « poulet » et Marmiton est interrogé avec `query=poulet`). `pnpm lint` / `pnpm build` verts ; Cypress local : recipe-sources 8/8, recipes 5/5, recipes.cy 12/12, planning 3/3. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>