@page "/souhaits" @inject ServiceLivresApi Api MaBibli — liste d'envies

Liste d'envies

@* Le rappel n'est pas décoratif : la bibliothèque est commune, cette liste ne l'est pas. Sans ce mot, on pourrait croire que le foyer entier voit ce qu'on note ici. *@

Les livres que vous aimeriez acquérir. Cette liste est la vôtre : les autres membres du foyer ont la leur, et ne voient pas celle-ci. Ces livres ne sont pas dans le catalogue et ne comptent pas dans la bibliothèque.

@if (_erreur is not null) { } @if (_souhaits is null) {

Chargement…

} else {

Ajouter une envie

@* Deux façons d'alimenter la liste : l'ISBN quand on a le livre en main (en librairie, chez quelqu'un), la saisie libre quand on n'a qu'un titre. La bibliographie d'un auteur, elle, alimente la liste depuis l'écran des auteurs. *@

Facultatif : les champs ci-dessous restent modifiables.

@if (_souhaits.Count == 0) {

Votre liste est vide. Ajoutez un livre ci-dessus, ou ouvrez la bibliographie d'un auteur depuis la liste des auteurs.

} else {

@_souhaits.Count livre@(_souhaits.Count > 1 ? "s" : "") souhaité@(_souhaits.Count > 1 ? "s" : "")

@* Un seul bloc d'export, en haut de liste : c'est l'action qu'on vient chercher quand on part en librairie, elle ne doit pas être au bout d'un défilement. *@
Exporter en texte Exporter en CSV
} } @code { private IReadOnlyList? _souhaits; private EnregistrementSouhait _saisie = new(); private string _isbn = string.Empty; private bool _ajout; private bool _recherche; private bool _enCours; private string? _erreur; protected override Task OnInitializedAsync() => ChargerAsync(); private async Task ChargerAsync() { try { _souhaits = await Api.ListerSouhaitsAsync(); } catch (Exception ex) { _erreur = $"Impossible de charger la liste d'envies : {ex.Message}"; } } /// /// Pré-remplit le formulaire depuis la cascade ISBN existante (BnF → OpenLibrary). /// /// /// On retient le premier candidat sans demander de choisir : contrairement à l'ajout au /// catalogue, une envie ne fige pas d'édition — l'utilisateur achètera celle qu'il trouvera. /// Tous les champs restent modifiables. /// private async Task ChercherIsbnAsync() { _recherche = true; _erreur = null; try { var resultat = await Api.ChercherIsbnAsync(_isbn.Trim()); var candidat = resultat?.Candidats.FirstOrDefault(); if (candidat is null) { _erreur = $"Aucune notice trouvée pour « {_isbn.Trim()} ». Complétez à la main."; return; } _saisie.Titre = candidat.Titre; _saisie.Auteur = string.Join(", ", candidat.Auteurs); _saisie.Editeur = candidat.Editeur; _saisie.Annee = candidat.Annee; _saisie.Isbn = _isbn.Trim(); _saisie.CoverUrl = candidat.CoverUrl; } catch (Exception ex) { _erreur = $"La recherche a échoué : {ex.Message}"; } finally { _recherche = false; } } private async Task AjouterAsync() { _ajout = true; _erreur = null; var resultat = await Api.AjouterSouhaitAsync(_saisie); _ajout = false; if (!resultat.EstOk) { _erreur = resultat.Erreur; return; } _saisie = new EnregistrementSouhait(); _isbn = string.Empty; await ChargerAsync(); } private async Task SupprimerAsync(SouhaitDto souhait) { _enCours = true; _erreur = await Api.SupprimerSouhaitAsync(souhait.Id); _enCours = false; if (_erreur is null) { await ChargerAsync(); } } }