Distinguer romans et BD par un type de document

Format disait physique ou numérique, jamais roman ou BD. Trois valeurs
seulement : une valeur s'ajoute sans migration, la renommer une fois posée
sur des centaines de fiches, non.

Le défaut est « non précisé », pas « roman » : les fiches existantes n'ont
pas été saisies avec cette question en tête, et un AddColumn suffit
justement parce que la valeur par défaut ne prétend rien. L'interface
n'affiche donc que ce qui a été choisi, comme pour le format.

Filtre ajouté aux DEUX implémentations, serveur et hors-ligne, avec quatre
jeux de critères de plus dans le test qui les confronte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-19 21:45:37 +02:00
co-authored by Claude Opus 5
parent a49125ddc3
commit 49eb8e1c98
21 changed files with 631 additions and 27 deletions
+10
View File
@@ -25,6 +25,16 @@ public record CritereLivres
/// <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>
+5
View File
@@ -34,6 +34,11 @@ public static class FiltreLivres
source = source.Where(l => l.Format == format);
}
if (criteres.TypeDocument is { } type)
{
source = source.Where(l => l.TypeDocument == type);
}
if (criteres.Statut is { } statut)
{
// Le statut vit dans une table par personne : on interroge la ligne de l'appelant,
@@ -34,6 +34,9 @@ public record EnregistrementLivre
public Format Format { get; set; }
/// <summary>Roman, bande dessinée… Facultatif : « non précisé » est une réponse valable.</summary>
public TypeDocument TypeDocument { get; set; }
/// <summary>
/// Statut de lecture <b>de l'appelant</b>. <c>null</c> = non commencé, et aucune ligne n'est
/// alors écrite en base.
+5
View File
@@ -34,6 +34,11 @@ public record LivreDto
public required Format Format { get; init; }
/// <summary>
/// Roman, bande dessinée… <c>NonPrecise</c> par défaut, qui ne veut <b>pas</b> dire « roman ».
/// </summary>
public TypeDocument TypeDocument { get; init; }
/// <summary>
/// Statut de lecture <b>de l'utilisateur courant</b>, ou <c>null</c> s'il n'en a jamais posé
/// (« non commencé »).
+10
View File
@@ -27,6 +27,16 @@ public class Livre
public Format Format { get; set; }
/// <summary>
/// Roman, bande dessinée… <b>Indépendant du format</b> : une BD numérique existe.
/// </summary>
/// <remarks>
/// Par défaut <see cref="TypeDocument.NonPrecise"/>, qui ne veut pas dire « roman » : voir
/// l'énumération. L'interface n'affiche donc une étiquette que lorsque le type a été
/// <b>choisi</b>, comme elle n'affiche le format que pour les ebooks.
/// </remarks>
public TypeDocument TypeDocument { get; set; }
/// <summary>URL de la couverture (OpenLibrary), pas de fichier stocké localement.</summary>
public string? CoverUrl { get; set; }
+34
View File
@@ -0,0 +1,34 @@
namespace MaBibli.Shared.Entites;
/// <summary>
/// Nature de l'ouvrage, indépendante de son support (voir <see cref="Format"/>).
/// </summary>
/// <remarks>
/// Une BD est déjà catalogable telle quelle — elle a un ISBN et la BnF la connaît. Ce qui
/// manquait était de pouvoir la <b>distinguer</b> : <see cref="Format"/> dit physique ou
/// numérique, pas roman ou bande dessinée.
/// <para>
/// ⚠️ <b><see cref="NonPrecise"/> est la valeur par défaut, et ce n'est pas « roman ».</b> Les
/// fiches saisies avant l'arrivée de ce champ ne l'ont pas été avec cette question en tête : les
/// déclarer romans d'office affirmerait quelque chose qu'on ne sait pas. Même raisonnement que
/// l'absence de ligne de statut, qui vaut « non commencé » et non « à lire ».
/// </para>
/// <para>
/// La liste est volontairement courte. Une valeur s'ajoute sans migration — une énumération est
/// stockée en entier — alors que renommer ou fusionner des valeurs déjà posées sur des centaines
/// de fiches, non. Dans le doute, on n'ajoute pas.
/// </para>
/// <para>
/// ⚠️ Les <b>périodiques</b> n'y figurent pas : leur catalogage demande un ISSN et une table de
/// numéros, pas une étiquette de plus. Voir IDEES.md.
/// </para>
/// </remarks>
public enum TypeDocument
{
/// <summary>On ne sait pas, et on ne prétend pas le savoir. Valeur par défaut.</summary>
NonPrecise = 0,
Roman = 1,
BandeDessinee = 2,
}