From 47d371fa3a18f66f7b208a20c7d2d813dd7b3d3b Mon Sep 17 00:00:00 2001 From: mathieu Date: Thu, 10 Sep 2026 01:39:17 +0200 Subject: [PATCH] =?UTF-8?q?On=20replie=20par=20defaut=20les=20s=C3=A9rie?= =?UTF-8?q?=20dans=20le=20catalogue.=20Un=20bouton=20permet=20de=20d=C3=A9?= =?UTF-8?q?plier/replier=20toutes=20les=20s=C3=A9ries=20d'un=20coup.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Composants/GroupeCatalogue.razor | 25 +++++---- MaBibli.Client/Pages/Catalogue.razor | 51 +++++++++++++++++-- 2 files changed, 59 insertions(+), 17 deletions(-) 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 @@ } @@ -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.