diff --git a/MaBibli.Client/Pages/Bibliographie.razor b/MaBibli.Client/Pages/Bibliographie.razor
index 223e206..d547494 100644
--- a/MaBibli.Client/Pages/Bibliographie.razor
+++ b/MaBibli.Client/Pages/Bibliographie.razor
@@ -7,7 +7,9 @@
@if (_bibliographie is null && _erreur is null)
{
Bibliographie
-
Interrogation de la BnF…
+ @* L1 : une bibliographie coûte ~1 s par page, et jusqu'à dix pages pour les nouveautés.
+ Sans indicateur, l'écran se lit comme planté — et l'on reclique, donc on relance. *@
+
}
else if (_erreur is not null)
{
@@ -172,6 +174,24 @@ else if (_bibliographie is { } biblio)
vous » sont trois façons de restreindre la même liste. Les chercher en bas d'un
écran qui défile sur cinquante lignes n'avait pas de sens. *@
+
+ @*
+ I1 : « Tout cocher » vit ICI et non dans la barre de sélection, qui n'apparaît
+ qu'une fois une case cochée — c'est-à-dire trop tard pour rendre service.
+
+ ⚠️ « Tout » signifie ce qui est ACTUELLEMENT VISIBLE, donc après filtre et selon
+ que les masquées sont affichées ou non. Cocher les 200 notices remontées, dont
+ l'écran n'en montre que trente, serait exactement ce que les compteurs par
+ bouton cherchent à éviter.
+ *@
+ @if (ACocher(biblio).Count is var aCocher and > 0)
+ {
+
+ }
@if (_filtresOuverts)
@@ -314,16 +334,33 @@ else if (_bibliographie is { } biblio)
@if (_oeuvresOuvertes.Contains(oeuvre.Titre))
{
-
+ @*
+ I2 : la vignette n'est rendue qu'ICI, au dépliage. Une
+ bibliographie compte des dizaines de lignes : les charger
+ toutes d'avance ferait payer des images que personne ne
+ regarde. Les œuvres possédées, elles, ont déjà la leur par
+ CarteLivre.
+
+ ⚠️ « Sans ISBN, pas de couverture, et on n'en invente pas » :
+ la formule OpenLibrary s'applique à l'ISBN repris du
+ dc:identifier de la notice, et le substitut à initiale sert
+ de repli quand la notice n'en porte aucun.
+ *@
+
}
}
@@ -403,6 +440,26 @@ else if (_bibliographie is { } biblio)
private int NombreFiltres =>
(_modePossession == 0 ? 0 : 1) + (_masquees > 0 && !_afficherMasquees ? 1 : 0);
+ ///
+ /// URL de couverture d'une œuvre non possédée, ou null quand la notice n'a pas
+ /// d'ISBN — auquel cas la vignette retombe sur son substitut à initiale.
+ ///
+ private static string? CouvertureDe(OeuvreBibliographie oeuvre) =>
+ string.IsNullOrWhiteSpace(oeuvre.Isbn) ? null : IsbnUtils.UrlCouverture(oeuvre.Isbn);
+
+ /// Les œuvres visibles qui ne sont pas encore cochées.
+ private List ACocher(BibliographieDto biblio) =>
+ Affichees(biblio).Where(o => !_selection.Contains(o.Titre)).ToList();
+
+ /// Coche tout ce qui est visible — jamais ce que le filtre écarte.
+ private void CocherTout(BibliographieDto biblio)
+ {
+ foreach (var oeuvre in ACocher(biblio))
+ {
+ _selection.Add(oeuvre.Titre);
+ }
+ }
+
/// Les œuvres cochées qui peuvent effectivement rejoindre la liste d'envies.
private List SelectionADecouvrir(BibliographieDto biblio) =>
biblio.Oeuvres.Where(o => _selection.Contains(o.Titre) && o.ADecouvrir).ToList();
diff --git a/MaBibli.Client/wwwroot/css/app.css b/MaBibli.Client/wwwroot/css/app.css
index d15514b..eb04867 100644
--- a/MaBibli.Client/wwwroot/css/app.css
+++ b/MaBibli.Client/wwwroot/css/app.css
@@ -983,6 +983,7 @@ body {
.detail-oeuvre {
display: flex;
flex-wrap: wrap;
+ align-items: flex-start;
gap: 0.5rem;
margin: 0.25rem 0 0;
}