Traiter les retours d'usage du 2026-08-18 (2ᵉ série)
Six lots, issus d'IDEES.md. Les décisions actées sont reportées dans
CLAUDE.md, et les entrées traitées retirées d'IDEES.md.
1. Douchette USB, ISSN et enchaînement du scan
- Champ ISBN focalisé à l'ouverture : c'est tout ce qu'exige une
douchette USB, qui se présente au système comme un clavier. Remède
au scan caméra, qui rate sur la webcam d'un PC (optique, pas
décodage).
- Un EAN en 977 est un périodique : il porte un ISSN, donc un titre de
revue. Intercepté AVANT la validation ISBN (c'est un EAN-13
parfaitement valide), l'ISSN est déduit du code puis nommé via
bib.issn. Auparavant la cascade s'exécutait en entier pour finir sur
« aucun résultat ».
- L'enchaînement après scan existait déjà mais était invisible : une
étape « Recherche » affiche désormais le code interrogé.
2. ISBN affichés avec des tirets
Tables extraites du RangeMessage.xml officiel — plusieurs tranches ne
sont pas celles qu'on suppose. Le francophone est découpé en entier,
ailleurs on s'arrête au groupe et à la clé : aucune coupure fausse.
Corrige au passage l'export CSV, où un ISBN nu était lu comme un
nombre par Excel.
3. Hors-ligne : la liste d'envies
ListerSouhaitsAsync était le seul point de lecture hors du dispositif
hors-ligne, d'où le « 404 Not Found » brut à l'écran. Cinquième
instantané, écritures refusées, plus aucun message HTTP. Même défaut
corrigé sur la bibliographie.
4. Navigation par onglets
Catalogue / Auteurs / Prêts / Envies dans MainLayout ; les barres
d'actions ne portent plus que des actions. Filtres repliés derrière un
bouton compteur, ligne « format » masquée quand le fonds n'a qu'un
format. Une seule entrée d'ajout, désactivée hors-ligne — pas masquée.
5. Liste d'envies : ordre, recherche, couvertures
Migration RangDesEnvies. Le remplissage reconduit l'ordre affiché
jusqu'ici : sans lui, les listes existantes se seraient réordonnées
toutes seules. Réordonnancement par flèches et glisser-déposer (le
drag & drop HTML5 ne marche pas au doigt). Ajout dans son propre
écran, avec recherche par titre (bib.title) et couvertures enfin
alimentées.
6. Bibliographie : une source muette n'est pas une liste vide
L'écran affichait « BnF injoignable » PUIS « la BnF ne connaît aucun
livre de cet auteur » — la seconde phrase étant fausse. Les deux cas
s'excluent désormais, et un bouton Réessayer est offert.
Vérifié en exécution : le diagnostic d'IDEES.md était faux sur un
point. Robert A. Harper a bien 7 œuvres à la BnF (85 notices
annoncées) ; c'était le même délai dépassé observé deux fois, pris
pour deux causes distinctes.
380 tests, dont un qui applique réellement la migration (EnsureCreated
n'en joue aucune) et un qui verrouille les messages atteignant
l'utilisateur.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
namespace MaBibli.Shared.Dtos;
|
||||
|
||||
/// <summary>
|
||||
/// Ce qu'on sait d'un code-barres qui s'est révélé être celui d'un <b>périodique</b>
|
||||
/// (préfixe <c>977</c>) et non d'un livre.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Le modèle de données ne gère <b>pas</b> les périodiques : ni numéro, ni date de parution.
|
||||
/// Cet objet n'existe donc pas pour cataloguer une revue, mais pour <b>dire à l'utilisateur ce
|
||||
/// qu'il vient de scanner</b> au lieu de lui répondre « aucun résultat » — ce qui l'enverrait
|
||||
/// chercher un défaut là où il n'y en a pas.
|
||||
/// </remarks>
|
||||
public record PeriodiqueDetecte
|
||||
{
|
||||
/// <summary>ISSN déduit du code-barres, forme canonique à tiret (<c>2466-6718</c>).</summary>
|
||||
public required string Issn { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Titre de la revue d'après la BnF, ou <c>null</c> si elle ne connaît pas cet ISSN
|
||||
/// ou n'a pas répondu. Le distinguer d'un titre trouvé est ce qui permet de ne pas
|
||||
/// affirmer un nom qu'on n'a pas.
|
||||
/// </summary>
|
||||
public string? Titre { get; init; }
|
||||
|
||||
/// <summary>Éditeur de la revue, quand la notice en porte un.</summary>
|
||||
public string? Editeur { get; init; }
|
||||
|
||||
/// <summary>Année de début de publication de la revue (et non du numéro scanné).</summary>
|
||||
public string? Annee { get; init; }
|
||||
}
|
||||
@@ -23,4 +23,11 @@ public record ResultatLookupIsbn
|
||||
/// Une source en panne ne fait pas échouer la cascade, elle laisse une trace ici.
|
||||
/// </summary>
|
||||
public IReadOnlyList<string> Avertissements { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// Renseigné <b>uniquement</b> quand le code scanné s'est révélé être celui d'un périodique
|
||||
/// (préfixe <c>977</c>). Dans ce cas <see cref="Candidats"/> est toujours vide : la cascade
|
||||
/// ISBN n'a pas été lancée, elle ne pouvait pas aboutir.
|
||||
/// </summary>
|
||||
public PeriodiqueDetecte? Periodique { get; init; }
|
||||
}
|
||||
|
||||
@@ -106,6 +106,34 @@ public record OeuvreBibliographie
|
||||
public bool ADecouvrir => !Possede && !Souhaite;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ce qu'il est advenu de l'interrogation de la BnF.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// ⚠️ <b>Une source muette n'est pas une bibliographie vide</b>, et la différence n'est pas
|
||||
/// cosmétique : sans cet état, un délai dépassé produisait une liste vide, que l'écran
|
||||
/// commentait d'un rassurant « la BnF ne connaît aucun livre de cet auteur ». On affirmait donc
|
||||
/// une chose qu'on n'avait pas pu vérifier. C'est ce que cet énuméré rend impossible.
|
||||
/// <para>
|
||||
/// Le motif est distingué parce qu'il ne demande pas la même chose à l'utilisateur : un délai
|
||||
/// dépassé se retente, une réponse illisible non.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
public enum EtatSourceBibliographie
|
||||
{
|
||||
/// <summary>La BnF a répondu. La liste rendue est ce qu'elle sait, y compris si elle est vide.</summary>
|
||||
Ok = 0,
|
||||
|
||||
/// <summary>La BnF n'a pas répondu à temps. Cas le plus fréquent, et le plus souvent passager.</summary>
|
||||
DelaiDepasse = 1,
|
||||
|
||||
/// <summary>La BnF n'a pas pu être jointe, ou a répondu par une erreur.</summary>
|
||||
Injoignable = 2,
|
||||
|
||||
/// <summary>La BnF a répondu, mais sa réponse n'était pas exploitable.</summary>
|
||||
ReponseIllisible = 3,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Bibliographie d'un auteur du catalogue, telle que la BnF la connaît.
|
||||
/// </summary>
|
||||
@@ -134,4 +162,18 @@ public record BibliographieDto
|
||||
|
||||
/// <summary>Message à afficher quand la source n'a pas pu être interrogée normalement.</summary>
|
||||
public string? Avertissement { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Ce qu'il est advenu de l'interrogation. <see cref="EtatSourceBibliographie.Ok"/> ne veut
|
||||
/// pas dire « des résultats », mais « une réponse ».
|
||||
/// </summary>
|
||||
public EtatSourceBibliographie Etat { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Vrai quand la BnF n'a pas répondu : la liste vide ne prouve alors <b>rien</b>.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// C'est ce que l'interface doit consulter avant d'expliquer une absence de résultats.
|
||||
/// </remarks>
|
||||
public bool SourceMuette => Etat != EtatSourceBibliographie.Ok;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user