-
- @Serie.Titre
- @Avancement()
+@*
+ L'arbre des séries : rien d'autre que la descendance.
+
+ ⚠️ Il dépliait auparavant la liste complète des tomes de chaque série, carte de livre
+ comprise. Un cycle de quatre séries occupait alors plusieurs écrans, et l'on ne voyait
+ justement plus ce qu'un arbre sert à voir — qui contient quoi. Les tomes ont leur écran,
+ celui de la série ; ici on ne montre que le titre, l'avancement, et le lien qui y mène.
+
+ Corollaire : tout est DÉPLIÉ par défaut, et l'on replie ce dont on ne veut pas. L'inverse
+ (tout replié) obligeait à ouvrir chaque nœud pour découvrir s'il contenait quelque chose,
+ c'est-à-dire à faire à la main le travail que l'arbre est censé faire.
+*@
+
+
+ @if (Enfants.Count > 0)
+ {
+
+ }
+ else
+ {
+ @* Une puce à la place de la bascule : sans elle, les titres sans descendance ne
+ s'aligneraient pas sur ceux qui en ont. *@
+ •
+ }
+
+ @Serie.Titre
+ @Avancement()
+
@if (ActionsActives)
{
-
-
+
+
+
+
}
- @if (Deplie)
+ @* Le chemin déjà rendu coupe la récursion : une boucle résiduelle en base ferait sinon
+ boucler le rendu Razor à l'infini. Le garde-fou serveur, lui, reste borné par le
+ nombre de séries. *@
+ @if (Deplie && Enfants.Count > 0)
{
-
- @if (Serie.Elements.Count == 0)
+
+ @foreach (var enfant in Enfants.Where(e => !CheminAvecSerie.Contains(e.Id)))
{
-
@code {
[Parameter, EditorRequired] public SerieDto Serie { get; set; } = default!;
[Parameter, EditorRequired] public IReadOnlyList Toutes { get; set; } = [];
- [Parameter, EditorRequired] public IReadOnlyList Livres { get; set; } = [];
[Parameter, EditorRequired] public IReadOnlyDictionary Totaux { get; set; } = new Dictionary();
[Parameter] public IReadOnlySet Chemin { get; set; } = new HashSet();
- [Parameter] public ISet Deplies { get; set; } = new HashSet();
+
+ ///
+ /// Nœuds REPLIÉS, et non dépliés : le défaut est de tout montrer.
+ ///
+ ///
+ /// État local de l'écran, volontairement non persistant : c'est un confort de lecture,
+ /// pas une propriété de la série.
+ ///
+ [Parameter] public ISet Replies { get; set; } = new HashSet();
+
[Parameter] public bool ActionsActives { get; set; }
[Parameter] public string? MotifBlocage { get; set; }
[Parameter] public EventCallback OnDeplacer { get; set; }
@@ -90,24 +98,28 @@
.ToList();
private int _index => Soeurs.FindIndex(s => s.Id == Serie.Id);
- private bool Deplie => Deplies.Contains(Serie.Id);
+ private bool Deplie => !Replies.Contains(Serie.Id);
private IReadOnlySet CheminAvecSerie => new HashSet(Chemin) { Serie.Id };
+ ///
+ /// « 3 sur 7 tomes », en comptant les descendants — c'est ce qu'on vient chercher.
+ ///
private string Avancement()
{
var total = Totaux.TryGetValue(Serie.Id, out var valeur)
? valeur
: (Possedes: Serie.NombrePossedes, Total: Serie.Elements.Count);
+
return total.Total == 0
- ? "Aucun tome recensé"
+ ? "aucun tome recensé"
: $"{total.Possedes} sur {total.Total} tome{(total.Total > 1 ? "s" : "")}";
}
private void Basculer()
{
- if (!Deplies.Add(Serie.Id))
+ if (!Replies.Add(Serie.Id))
{
- Deplies.Remove(Serie.Id);
+ Replies.Remove(Serie.Id);
}
}
diff --git a/MaBibli.Client/Pages/Serie.razor b/MaBibli.Client/Pages/Serie.razor
index bac9bda..d2d7cce 100644
--- a/MaBibli.Client/Pages/Serie.razor
+++ b/MaBibli.Client/Pages/Serie.razor
@@ -1,5 +1,6 @@
@page "/series/{Id:int}"
@page "/series/{Id:int}/edition"
+@page "/series/{Id:int}/ordre"
@inject ServiceLivresApi Api
@inject NavigationManager Navigation
@inject EtatReseau Reseau
@@ -39,6 +40,15 @@ else
}
+ @if (ModeOrdre)
+ {
+
+ Rangez les tomes dans l'ordre où vous voulez les lire — ce n'est
+ pas toujours l'ordre de publication : une préquelle se lit avant le livre paru dix
+ ans plus tôt. Rien d'autre ne se modifie depuis cet écran.
+