@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
@_erreur
}
else if (_bibliographie is { } biblio)
{
@biblio.Auteur.Nom
@if (biblio.Avertissement is not null)
{
@biblio.Avertissement
}
@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)
{
@_message
}
@* 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. *@
@foreach (var oeuvre in Affichees(biblio))
{
@* La classe « oeuvre-possedee » grise la ligne : le livre est déjà sur l'étagère. *@
@if (!string.IsNullOrWhiteSpace(oeuvre.Annee))
{
@oeuvre.Annee
}
@if (!string.IsNullOrWhiteSpace(oeuvre.Editeur))
{
@oeuvre.Editeur
}
@if (oeuvre.NombreEditions > 1)
{
@oeuvre.NombreEditions éditions
}
@if (oeuvre.Possede)
{
Déjà chez vous
}
else if (oeuvre.Souhaite)
{
Dans vos envies
}
@if (oeuvre.ADecouvrir)
{
}
}
@* 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();
}
}