Coche toute la bibliographie visible, et montre ce qu'on ne possède pas

« Tout cocher » vit à côté du filtre et non dans la barre de sélection : celle-ci
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 — après filtre, et
selon que les masquées sont affichées. Cocher les deux cents notices remontées
alors que l'écran n'en montre que trente serait précisément ce que les compteurs
par bouton cherchent à éviter.

La couverture d'une œuvre non possédée n'est rendue qu'au dépliage : une
bibliographie compte des dizaines de lignes, et les charger d'avance ferait payer
des images que personne ne regarde. Sans ISBN, pas de couverture et on n'en
invente pas : la vignette retombe sur son substitut à initiale.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-21 11:25:48 +02:00
co-authored by Claude Opus 5
parent 7e47a5d6c0
commit 7c050cb410
2 changed files with 69 additions and 11 deletions
+68 -11
View File
@@ -7,7 +7,9 @@
@if (_bibliographie is null && _erreur is null) @if (_bibliographie is null && _erreur is null)
{ {
<h1 class="titre-page">Bibliographie</h1> <h1 class="titre-page">Bibliographie</h1>
<p class="message-discret">Interrogation de la BnF…</p> @* 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. *@
<Patience Message="@(Nouveautes ? "Recherche des nouveautés à la BnF…" : "Interrogation de la BnF…")" />
} }
else if (_erreur is not null) 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 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. *@ écran qui défile sur cinquante lignes n'avait pas de sens. *@
<BasculeBibliographie Biblio="biblio" /> <BasculeBibliographie Biblio="biblio" />
@*
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)
{
<button type="button" class="bouton bouton-discret"
disabled="@_enCours"
@onclick="() => CocherTout(biblio)">
Tout cocher (@aCocher)
</button>
}
</div> </div>
@if (_filtresOuverts) @if (_filtresOuverts)
@@ -314,16 +334,33 @@ else if (_bibliographie is { } biblio)
@if (_oeuvresOuvertes.Contains(oeuvre.Titre)) @if (_oeuvresOuvertes.Contains(oeuvre.Titre))
{ {
<p class="message-discret detail-oeuvre"> @*
@if (!string.IsNullOrWhiteSpace(oeuvre.Isbn)) I2 : la vignette n'est rendue qu'ICI, au dépliage. Une
{ bibliographie compte des dizaines de lignes : les charger
<span>ISBN : @FormatageIsbn.Afficher(oeuvre.Isbn)</span> toutes d'avance ferait payer des images que personne ne
} regarde. Les œuvres possédées, elles, ont déjà la leur par
@if (oeuvre.NombreEditions > 1) CarteLivre.
{
<span>@oeuvre.NombreEditions éditions recensées</span> ⚠️ « Sans ISBN, pas de couverture, et on n'en invente pas » :
} la formule OpenLibrary s'applique à l'ISBN repris du
</p> dc:identifier de la notice, et le substitut à initiale sert
de repli quand la notice n'en porte aucun.
*@
<div class="detail-oeuvre">
<Couverture Url="@CouvertureDe(oeuvre)" Titre="@oeuvre.Titre"
Classe="couverture-petite" Agrandissable="true" />
<p class="message-discret">
@if (!string.IsNullOrWhiteSpace(oeuvre.Isbn))
{
<span>ISBN : @FormatageIsbn.Afficher(oeuvre.Isbn)</span>
}
@if (oeuvre.NombreEditions > 1)
{
<span>@oeuvre.NombreEditions éditions recensées</span>
}
</p>
</div>
} }
</div> </div>
} }
@@ -403,6 +440,26 @@ else if (_bibliographie is { } biblio)
private int NombreFiltres => private int NombreFiltres =>
(_modePossession == 0 ? 0 : 1) + (_masquees > 0 && !_afficherMasquees ? 1 : 0); (_modePossession == 0 ? 0 : 1) + (_masquees > 0 && !_afficherMasquees ? 1 : 0);
/// <summary>
/// URL de couverture d'une œuvre non possédée, ou <c>null</c> quand la notice n'a pas
/// d'ISBN — auquel cas la vignette retombe sur son substitut à initiale.
/// </summary>
private static string? CouvertureDe(OeuvreBibliographie oeuvre) =>
string.IsNullOrWhiteSpace(oeuvre.Isbn) ? null : IsbnUtils.UrlCouverture(oeuvre.Isbn);
/// <summary>Les œuvres visibles qui ne sont pas encore cochées.</summary>
private List<OeuvreBibliographie> ACocher(BibliographieDto biblio) =>
Affichees(biblio).Where(o => !_selection.Contains(o.Titre)).ToList();
/// <summary>Coche tout ce qui est visible — jamais ce que le filtre écarte.</summary>
private void CocherTout(BibliographieDto biblio)
{
foreach (var oeuvre in ACocher(biblio))
{
_selection.Add(oeuvre.Titre);
}
}
/// <summary>Les œuvres cochées qui peuvent effectivement rejoindre la liste d'envies.</summary> /// <summary>Les œuvres cochées qui peuvent effectivement rejoindre la liste d'envies.</summary>
private List<OeuvreBibliographie> SelectionADecouvrir(BibliographieDto biblio) => private List<OeuvreBibliographie> SelectionADecouvrir(BibliographieDto biblio) =>
biblio.Oeuvres.Where(o => _selection.Contains(o.Titre) && o.ADecouvrir).ToList(); biblio.Oeuvres.Where(o => _selection.Contains(o.Titre) && o.ADecouvrir).ToList();
+1
View File
@@ -983,6 +983,7 @@ body {
.detail-oeuvre { .detail-oeuvre {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
align-items: flex-start;
gap: 0.5rem; gap: 0.5rem;
margin: 0.25rem 0 0; margin: 0.25rem 0 0;
} }