diff --git a/MaBibli.Client/Composants/GroupeCatalogue.razor b/MaBibli.Client/Composants/GroupeCatalogue.razor
index 4ca8374..1ec6c05 100644
--- a/MaBibli.Client/Composants/GroupeCatalogue.razor
+++ b/MaBibli.Client/Composants/GroupeCatalogue.razor
@@ -4,9 +4,9 @@
Un bloc de série au catalogue, replié ou déplié — et récursif, parce qu'un cycle est une
série de séries : chaque niveau porte sa propre bascule.
- ⚠️ Tout est DÉPLIÉ par défaut, et l'on replie ce dont on ne veut pas. C'est la règle déjà
- tenue par l'arbre des séries : l'inverse obligerait à ouvrir chaque bloc pour retrouver un
- livre qu'on voyait très bien avant.
+ ⚠️ Tout est REPLIÉ par défaut ici (2026-09-10), à l'inverse de l'arbre des séries : le
+ catalogue liste D'ABORD les livres, une série n'y est qu'un détail qu'on ouvre au besoin —
+ alors que l'écran des séries EST la liste des séries, où les masquer toutes viderait l'écran.
⚠️ Replié, le bloc annonce toujours ce qu'il contient : sans ce compte, le compteur du haut
du catalogue paraîtrait mentir.
@@ -43,7 +43,7 @@
@foreach (var sous in Entree.SousEntrees)
{
-
+
}
}
@@ -66,15 +66,14 @@
[Parameter, EditorRequired] public EntreeCatalogue Entree { get; set; } = default!;
///
- /// Blocs REPLIÉS, par identifiant de série — et non dépliés : le défaut est de tout montrer.
+ /// Blocs OUVERTS, par identifiant de série — et non repliés : le défaut est de tout replier.
///
///
- /// État local de l'écran, volontairement non persistant, comme celui de l'arbre des séries :
- /// c'est un confort de lecture, pas une propriété de la série. Il survit en revanche aux
- /// rechargements du catalogue (frappe dans la recherche, filtre), le jeu appartenant à
- /// l'écran et non au bloc.
+ /// État local de l'écran, volontairement non persistant : c'est un confort de lecture, pas
+ /// une propriété de la série. Il survit en revanche aux rechargements du catalogue (frappe
+ /// dans la recherche, filtre), le jeu appartenant à l'écran et non au bloc.
///
- [Parameter, EditorRequired] public ISet Replies { get; set; } = new HashSet();
+ [Parameter, EditorRequired] public ISet Ouverts { get; set; } = new HashSet();
///
/// Compteurs par série, descendance comprise : ce qu'on possède, et ce que la série recense.
@@ -95,13 +94,13 @@
private int Total => Compte.Total;
- private bool Deplie => !Replies.Contains(Entree.Serie!.Id);
+ private bool Deplie => Ouverts.Contains(Entree.Serie!.Id);
private void Basculer()
{
- if (!Replies.Add(Entree.Serie!.Id))
+ if (!Ouverts.Add(Entree.Serie!.Id))
{
- Replies.Remove(Entree.Serie!.Id);
+ Ouverts.Remove(Entree.Serie!.Id);
}
}
}
diff --git a/MaBibli.Client/Pages/Catalogue.razor b/MaBibli.Client/Pages/Catalogue.razor
index d5c8d8a..5215618 100644
--- a/MaBibli.Client/Pages/Catalogue.razor
+++ b/MaBibli.Client/Pages/Catalogue.razor
@@ -32,6 +32,14 @@
Filtrer@(FiltresActifs > 0 ? $" ({FiltresActifs})" : "")
+ @if (_grouper && Entrees.Any(e => e.EstGroupe))
+ {
+
+ }
+
@if (Reseau.EnLigne)
{
Ajouter un ouvrage
@@ -228,13 +236,18 @@ else if (_livres is not null)
tomes occupait tout l'écran alors qu'on cherchait un livre rangé après lui. Replier ne
retire rien de la liste — le compteur du haut ne bouge pas, et le bloc replié dit
toujours ce qu'il contient.
+
+ ⚠️ Ici, contrairement à l'arbre des séries, tout est REPLIÉ par défaut (2026-09-10) :
+ le catalogue liste des livres, pas des séries — une série n'y est qu'un regroupement
+ qu'on ouvre au besoin. Le bouton qui bascule tout l'arbre est dans l'en-tête, à côté
+ de « Filtrer », pas ici : c'est un réglage d'affichage, pas une action sur la liste.
*@
@foreach (var entree in Entrees)
{
@if (entree.EstGroupe)
{
-
+
}
else
{
@@ -269,15 +282,45 @@ else if (_livres is not null)
private bool _grouper = true;
///
- /// Blocs repliés à la main, par identifiant de série. Tout est déplié par défaut.
+ /// Blocs ouverts à la main, par identifiant de série. Tout est replié par défaut.
///
///
/// ⚠️ Le jeu appartient à l'ÉCRAN, et non aux blocs : le catalogue se relit à chaque frappe
/// dans la recherche, et un état porté par les composants se perdrait à chaque caractère.
/// Il n'est pas persistant d'une visite à l'autre pour autant — c'est un confort de
- /// lecture, pas une propriété de la série, même règle que l'arbre des séries.
+ /// lecture, pas une propriété de la série.
///
- private readonly HashSet _replies = [];
+ private readonly HashSet _ouverts = [];
+
+ private bool AuMoinsUneSerieOuverte => _ouverts.Count > 0;
+
+ private void ToutReplier() => _ouverts.Clear();
+
+ private void ToutDeplier()
+ {
+ foreach (var id in IdentifiantsSeries(Entrees))
+ {
+ _ouverts.Add(id);
+ }
+ }
+
+ private static IEnumerable IdentifiantsSeries(IEnumerable entrees)
+ {
+ foreach (var entree in entrees)
+ {
+ if (!entree.EstGroupe)
+ {
+ continue;
+ }
+
+ yield return entree.Serie!.Id;
+
+ foreach (var id in IdentifiantsSeries(entree.SousEntrees))
+ {
+ yield return id;
+ }
+ }
+ }
///
/// Ce que chaque série possède et recense, descendance comprise.