@page "/series" @inject ServiceLivresApi Api @inject EtatReseau Reseau @implements IDisposable MaBibli — séries

Séries

Sagas, cycles et trilogies, dans leur ordre de lecture — qui n'est pas toujours celui de publication. Les séries sont communes au foyer, comme le catalogue.

@if (_erreur is not null) { } @* Créer une série depuis la liste : c'est le seul endroit d'où l'on part, et un écran de plus pour un unique champ ne se justifierait pas. *@ @* M1 : le champ et son bouton sur UNE ligne. Le champ prend la place restante, le bouton garde la sienne et son libellé ne se tronque pas — vérifié jusqu'à 320 px. *@
@if (_series is null) {

Chargement…

} else if (_series.Count == 0) {

Aucune série pour l'instant. Créez-en une, puis ajoutez-y vos livres et les tomes qui vous manquent : c'est ce qui permet de voir les trous.

} else { } @code { private IReadOnlyList? _series; private IReadOnlyDictionary _totaux = new Dictionary(); /// Nœuds repliés à la main. Tout est déplié par défaut — voir ArbreSerie. private readonly HashSet _replies = []; private string _nouveau = string.Empty; private bool _enCours; private string? _erreur; private string? MotifBlocage => Reseau.EnLigne ? null : EtatReseau.MotifHorsLigne; /// Séries de premier niveau. Celles rangées dans un cycle s'affichent sous lui. private IEnumerable Racines => _series?.Where(s => s.SerieParenteId is null) ?? []; protected override void OnInitialized() => Reseau.Change += SurChangementReseau; private void SurChangementReseau() => _ = InvokeAsync(async () => { await ChargerAsync(); StateHasChanged(); }); public void Dispose() => Reseau.Change -= SurChangementReseau; protected override Task OnInitializedAsync() => ChargerAsync(); private async Task ChargerAsync() { // ⚠️ Le catalogue n'est plus chargé ici : l'arbre ne montre que la descendance des // séries, plus leurs tomes. C'était une lecture complète du fonds pour rien. _series = await Api.ListerSeriesAsync(); _totaux = TotauxSeries.Calculer(_series); } private async Task SurTouche(KeyboardEventArgs e) { if (e.Key == "Enter" && !string.IsNullOrWhiteSpace(_nouveau) && Reseau.EnLigne) { await CreerAsync(); } } private async Task CreerAsync() { _enCours = true; _erreur = null; var resultat = await Api.CreerSerieAsync(new EnregistrementSerie { Titre = _nouveau }); _enCours = false; if (!resultat.EstOk) { _erreur = resultat.Erreur; return; } _nouveau = string.Empty; await ChargerAsync(); } }