Files
mabibli/MaBibli.Shared/Catalogue/CritereLivres.cs
T
mathieuandClaude Opus 5 4fd67e4e3b Auteurs cherchables et triables, filtre de prêt, rang dans les exports, couvertures d'envies
Auteurs
- Recherche et tri (par nom, ou du plus présent au moins présent), en mémoire : la liste
  est déjà chargée en entier — c'est elle qui sert l'instantané hors-ligne — et la filtrer
  côté serveur aurait rendu la page inutilisable sans réseau.
- Trois colonnes dont une seule est élastique : compteur à gauche sur une largeur figée,
  nom au milieu, actions à droite. Les compteurs et les boutons s'alignent alors d'une
  ligne à l'autre au lieu de suivre la longueur du nom.

Catalogue
- Filtre « À la maison / Prêtés », posé dans les deux implémentations (serveur et
  hors-ligne) et dans le test qui les confronte, avec un cas de prêt CLOS — c'est
  exactement là que les deux auraient pu diverger en silence.
- La ligne disparaît tant que rien n'est prêté, comme celles des formats et des types.

Envies
- ⚠️ Les couvertures manquaient parce que seul l'écran « ajouter une envie » remplissait
  CoverUrl : la bibliographie et les tomes manquants transmettent un ISBN mais aucune
  image. Le repli est posé à la LECTURE, donc il vaut aussi pour les envies déjà
  enregistrées, sans migration.
- Les exports .txt et .csv portent le rang d'envie. Le .txt en a le plus besoin : son
  groupement par auteur détruit précisément cet ordre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 20:42:13 +02:00

66 lines
2.9 KiB
C#

using MaBibli.Shared.Entites;
namespace MaBibli.Shared.Catalogue;
/// <summary>
/// Critères de consultation du catalogue.
/// </summary>
/// <remarks>
/// <b>Il n'existe volontairement aucun critère sur <c>AjoutePar</c>.</b> La bibliothèque est
/// commune à tout le foyer : filtrer les lectures sur ce champ serait un bug de conception.
/// L'absence de ce critère est l'endroit où l'invariant est le plus visible.
/// <para>
/// <see cref="Statut"/> n'est pas une exception : il filtre sur le statut de <b>l'appelant</b>,
/// que le serveur connaît par les en-têtes SSOwat. Le client ne désigne jamais de qui il parle.
/// </para>
/// </remarks>
public record CritereLivres
{
/// <summary>
/// Texte cherché dans le titre <i>ou</i> les auteurs. Insensible à la casse
/// <b>et aux accents</b> : « emile » trouve « Émile ».
/// </summary>
public string? Recherche { get; init; }
/// <summary>Physique ou numérique. <c>null</c> = les deux : le catalogue est unique.</summary>
public Format? Format { get; init; }
/// <summary>
/// Roman, bande dessinée… <c>null</c> = tous.
/// </summary>
/// <remarks>
/// <c>TypeDocument.NonPrecise</c> <b>est</b> une valeur filtrable : « ce que je n'ai pas
/// encore rangé » est justement la question qu'on se pose après avoir introduit ce champ.
/// C'est ce qui la distingue du statut de lecture, dont l'absence n'est pas une valeur.
/// </remarks>
public TypeDocument? TypeDocument { get; init; }
/// <summary>
/// Statut de lecture de l'utilisateur courant. <c>null</c> = tous.
/// </summary>
/// <remarks>
/// Un livre sans statut pour cette personne ne remonte sous <b>aucune</b> valeur : « non
/// commencé » n'est pas un statut, c'est l'absence de statut. Il reste visible sans filtre.
/// </remarks>
public Statut? Statut { get; init; }
/// <summary>Ne garder que les livres d'un auteur — le « cliquer sur un auteur » d'IDEES.md.</summary>
public int? AuteurId { get; init; }
/// <summary>
/// <c>true</c> = ce qui est dehors, <c>false</c> = ce qui est à la maison, <c>null</c> = tout.
/// </summary>
/// <remarks>
/// ⚠️ Contrairement à <see cref="Statut"/>, ce critère est <b>commun au foyer</b> : un prêt
/// n'appartient à personne en particulier, et aucune identité n'entre dans son évaluation.
/// C'est la même dissymétrie que partout ailleurs — le livre absent l'est pour tout le monde,
/// sa lecture ne l'est que pour soi.
/// <para>
/// L'écran « Prêts » répond déjà à « qu'est-ce qui est dehors ? ». Ce critère-ci répond à
/// l'autre moitié de la question, celle qu'aucun écran ne servait : « qu'est-ce que j'ai
/// réellement sous la main ? », par exemple avant de promettre un livre à quelqu'un.
/// </para>
/// </remarks>
public bool? Prete { get; init; }
}