@page "/auteurs/{AuteurId:int}/bibliographie" @inject ServiceLivresApi Api MaBibli — bibliographie @if (_bibliographie is null && _erreur is null) {

Bibliographie

Interrogation de la BnF…

} else if (_erreur is not null) {

Bibliographie

} else if (_bibliographie is { } biblio) {

@biblio.Auteur.Nom

@if (biblio.Avertissement is not null) { } @if (biblio.Oeuvres.Count == 0) {

La BnF ne connaît aucun livre de cet auteur. C'est le cas attendu pour les auteurs étrangers : le dépôt légal français ne couvre que l'édition francophone.

} else { @* Ces compteurs disent à l'utilisateur CE QU'IL REGARDE. Sur un auteur très réédité, la liste n'est qu'un extrait : le taire ferait croire qu'un livre absent n'existe pas. *@

@biblio.Oeuvres.Count œuvre@(biblio.Oeuvres.Count > 1 ? "s" : "") — @_possedees déjà chez vous

@* Deux phrases distinctes plutôt qu'une seule à trous : enchaîner des fragments conditionnels dans une même phrase produit une ponctuation bancale dès qu'un des fragments manque (« exister. .34 notices ont été écartées »). *@

@if (biblio.Tronquee) { D'après le catalogue de la BnF, à partir de @biblio.NoticesLues notices sur les @biblio.NoticesAnnoncees qu'elle annonce : cette liste est un extrait, classé par pertinence. Un livre absent d'ici peut très bien exister. } else { D'après le catalogue de la BnF, sur @biblio.NoticesLues notice@(biblio.NoticesLues > 1 ? "s" : ""). }

@if (biblio.NoticesEcartees > 0) {

@biblio.NoticesEcartees notice@(biblio.NoticesEcartees > 1 ? "s ont" : " a") été écartée@(biblio.NoticesEcartees > 1 ? "s" : "") : autre support (livre audio, jeu) ou ouvrage signé de quelqu'un d'autre.

} @if (_message is not null) { } @* Filtre sur une seule question : « qu'est-ce qui me manque ? ». Les livres possédés ne sont jamais masqués par défaut — le grisage est l'information principale de l'écran. *@
@* Le rapprochement est fait par titre, et il rate des choses (voir CleOeuvre). Le dire franchement vaut mieux que laisser l'utilisateur découvrir seul qu'un livre qu'il possède n'est pas grisé. *@

Le rapprochement avec votre bibliothèque se fait par titre. Un livre que vous possédez sous un titre différent (traduction, intégrale, édition retitrée) n'apparaîtra donc pas comme possédé. Rien n'est masqué : à vous de trancher.

} } @code { [Parameter] public int AuteurId { get; set; } private BibliographieDto? _bibliographie; private bool _seulementManquants; private bool _enCours; private string? _erreur; private string? _message; private int _possedees; protected override async Task OnParametersSetAsync() => await ChargerAsync(); private IEnumerable Affichees(BibliographieDto biblio) => _seulementManquants ? biblio.Oeuvres.Where(o => o.ADecouvrir) : biblio.Oeuvres; private async Task ChargerAsync() { _erreur = null; try { _bibliographie = await Api.ObtenirBibliographieAsync(AuteurId); if (_bibliographie is null) { _erreur = "Cet auteur n'existe pas dans votre bibliothèque."; return; } _possedees = _bibliographie.Oeuvres.Count(o => o.Possede); } catch (Exception ex) { _erreur = $"Impossible d'obtenir la bibliographie : {ex.Message}"; } } /// /// Ajoute une œuvre à la liste d'envies, en emportant ce que la BnF en sait. /// /// /// L'auteur enregistré est celui de l'écran, pas celui de la notice : c'est lui que /// l'utilisateur a en tête, et c'est sous ce nom qu'il retrouvera l'envie dans l'export. /// /// Après l'ajout, la bibliographie est relue plutôt que corrigée en mémoire : c'est /// le serveur qui sait rapprocher l'envie de l'œuvre, et refaire ce calcul ici le /// dupliquerait — avec le risque qu'il diverge. /// /// private async Task SouhaiterAsync(OeuvreBibliographie oeuvre) { if (_bibliographie is null) { return; } _enCours = true; _message = null; var resultat = await Api.AjouterSouhaitAsync(new EnregistrementSouhait { Titre = oeuvre.Titre, Auteur = _bibliographie.Auteur.Nom, Editeur = oeuvre.Editeur, Annee = oeuvre.Annee, // L'ISBN de la BnF est celui d'UNE édition relevée, souvent à 10 chiffres et parfois // épuisée. Il est repris tel quel : il aide à commander, sans engager le choix. Isbn = oeuvre.Isbn, }); _enCours = false; if (!resultat.EstOk) { _message = resultat.Erreur; return; } await ChargerAsync(); } }