On replie par defaut les série dans le catalogue.
Un bouton permet de déplier/replier toutes les séries d'un coup.
This commit is contained in:
@@ -32,6 +32,14 @@
|
||||
Filtrer@(FiltresActifs > 0 ? $" ({FiltresActifs})" : "")
|
||||
</button>
|
||||
|
||||
@if (_grouper && Entrees.Any(e => e.EstGroupe))
|
||||
{
|
||||
<button type="button" class="bouton bouton-discret bouton-compact"
|
||||
@onclick="() => { if (AuMoinsUneSerieOuverte) { ToutReplier(); } else { ToutDeplier(); } }">
|
||||
@(AuMoinsUneSerieOuverte ? "Replier les séries" : "Déplier les séries")
|
||||
</button>
|
||||
}
|
||||
|
||||
@if (Reseau.EnLigne)
|
||||
{
|
||||
<a class="bouton bouton-principal bouton-compact" href="ajout">Ajouter un ouvrage</a>
|
||||
@@ -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.
|
||||
*@
|
||||
<ul class="liste-livres">
|
||||
@foreach (var entree in Entrees)
|
||||
{
|
||||
@if (entree.EstGroupe)
|
||||
{
|
||||
<GroupeCatalogue Entree="entree" Replies="_replies" Totaux="_totauxSeries" />
|
||||
<GroupeCatalogue Entree="entree" Ouverts="_ouverts" Totaux="_totauxSeries" />
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -269,15 +282,45 @@ else if (_livres is not null)
|
||||
private bool _grouper = true;
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// ⚠️ 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.
|
||||
/// </remarks>
|
||||
private readonly HashSet<int> _replies = [];
|
||||
private readonly HashSet<int> _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<int> IdentifiantsSeries(IEnumerable<EntreeCatalogue> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ce que chaque série possède et recense, descendance comprise.
|
||||
|
||||
Reference in New Issue
Block a user