Filtre les prêts en cours par nom d'emprunteur (lot G)
Ajoute un champ de recherche insensible aux accents sur l'écran des prêts en cours, visible dès qu'il y a plus d'un prêt. Filtrage en mémoire, sans colonne normalisée : la liste est courte par construction, une forme dédiée en base serait disproportionnée. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
co-authored by
Copilot
parent
c2d408afc6
commit
a0cb727ff0
@@ -2033,3 +2033,18 @@ Le filtre par thème n'est **pas inclus dans F2**. Il aurait fallu ajouter une d
|
||||
implémentations de filtrage (`FiltreLivres` et `FiltreLivresLocal`), au contrat de cache et aux
|
||||
tests de confrontation ; cette extension est reportée à un lot ultérieur plutôt que d'introduire
|
||||
un filtre partiel ou divergent.
|
||||
|
||||
## Lot G — filtrer les prêts par emprunteur (2026-08-20)
|
||||
|
||||
`Prets.razor` filtre désormais la liste des prêts en cours par nom d'emprunteur, en mémoire
|
||||
côté client. **Pas de colonne normalisée ajoutée** : la liste des prêts en cours est courte par
|
||||
construction (ce qui n'est pas à la maison, pas tout l'historique), une table déjà bornée en
|
||||
pratique par la taille d'un foyer — ajouter une forme normalisée en base et l'entretenir via
|
||||
`ServiceRenormalisation` aurait été disproportionné pour ce seul besoin, conformément à la
|
||||
mise en garde d'IDEES.md.
|
||||
|
||||
La recherche passe par `NormalisationTexte.Normaliser`, comme partout ailleurs : insensible aux
|
||||
accents et à la casse, cohérente avec le reste de l'application sans dupliquer de logique. Le
|
||||
champ n'apparaît que s'il y a plus d'un prêt en cours — avec un seul prêt, filtrer n'apprendrait
|
||||
rien, même raison que les lignes de filtre qui se cachent déjà ailleurs dans le catalogue quand
|
||||
elles seraient inutiles.
|
||||
|
||||
@@ -255,9 +255,7 @@ L'écran `/souhaits/ajout` rend aujourd'hui une liste plate.
|
||||
|
||||
---
|
||||
|
||||
## Lot G — Prêts
|
||||
## Lot G — Prêts — traité le 2026-08-20
|
||||
|
||||
- **G1. Filtrer les prêts en cours par nom d'emprunteur.** Le plus petit item de la liste.
|
||||
⚠️ `Emprunteur` est un texte libre sans colonne normalisée : soit on cherche en mémoire (la
|
||||
liste est courte, c'est probablement suffisant), soit on ajoute une forme normalisée — et alors
|
||||
`ServiceRenormalisation` doit la reprendre, comme pour les six autres colonnes.
|
||||
**G1. Filtrer les prêts en cours par nom d'emprunteur** : fait, en mémoire, sans colonne
|
||||
normalisée (voir `CLAUDE.md`).
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
@page "/prets"
|
||||
@using MaBibli.Shared.Textes
|
||||
@inject ServiceLivresApi Api
|
||||
@inject EtatReseau Reseau
|
||||
@implements IDisposable
|
||||
@@ -38,8 +39,24 @@ else
|
||||
{
|
||||
<p class="compteur">@_prets.Count livre@(_prets.Count > 1 ? "s" : "") dehors</p>
|
||||
|
||||
@* Filtre en mémoire : la liste des prêts en cours est courte, une forme normalisée en
|
||||
base serait disproportionnée pour ce seul besoin (voir IDEES.md, lot G). La recherche
|
||||
reste insensible aux accents et à la casse, comme partout ailleurs dans l'application. *@
|
||||
@if (_prets.Count > 1)
|
||||
{
|
||||
<div class="barre-recherche">
|
||||
<input class="champ-saisie" type="search" placeholder="Filtrer par emprunteur…"
|
||||
value="@_recherche" @oninput="SurRecherche" aria-label="Filtrer par emprunteur" />
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (PretsAffiches().Count == 0)
|
||||
{
|
||||
<p class="message-discret">Aucun prêt ne correspond à « @_recherche ».</p>
|
||||
}
|
||||
|
||||
<ul class="liste-livres">
|
||||
@foreach (var pret in _prets)
|
||||
@foreach (var pret in PretsAffiches())
|
||||
{
|
||||
<li class="carte-livre" @key="pret.Id">
|
||||
<Couverture Url="@pret.LivreCoverUrl" Titre="@pret.LivreTitre"
|
||||
@@ -77,6 +94,22 @@ else
|
||||
private IReadOnlyList<PretDto>? _prets;
|
||||
private string? _erreur;
|
||||
private int? _enCours;
|
||||
private string _recherche = string.Empty;
|
||||
|
||||
private void SurRecherche(ChangeEventArgs e) => _recherche = e.Value?.ToString() ?? string.Empty;
|
||||
|
||||
private IReadOnlyList<PretDto> PretsAffiches()
|
||||
{
|
||||
if (_prets is null)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
var terme = NormalisationTexte.Normaliser(_recherche);
|
||||
return terme.Length == 0
|
||||
? _prets
|
||||
: _prets.Where(p => NormalisationTexte.Normaliser(p.Emprunteur).Contains(terme)).ToList();
|
||||
}
|
||||
|
||||
protected override void OnInitialized() => Reseau.Change += SurChangementReseau;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user