From bd4fea26387b1720e724a4680209cd560b8b89f5 Mon Sep 17 00:00:00 2001 From: mathieu Date: Thu, 20 Aug 2026 20:45:14 +0200 Subject: [PATCH] =?UTF-8?q?Arbre=20des=20s=C3=A9ries=20d=C3=A9pouill=C3=A9?= =?UTF-8?q?,=20et=20ordre=20de=20lecture=20derri=C3=A8re=20son=20propre=20?= =?UTF-8?q?=C3=A9cran?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - L'arbre ne montre plus que la descendance : titre, avancement, lien. Il dépliait auparavant la liste complète des tomes de chaque nœud, cartes de livres comprises — un cycle occupait plusieurs écrans et l'on ne voyait plus qui contient quoi. Corollaire : tout est déplié par défaut, et l'on replie ce dont on ne veut pas. - /series ne charge plus le catalogue entier : l'arbre n'en a plus l'usage. - ⚠️ Nouvelle route /series/{id}/ordre, sur le modèle de /souhaits/ordre. Les flèches n'existent plus qu'ici : en consultation, elles se déclenchaient au défilement du pouce et l'ordre de lecture d'une saga changeait sans qu'on l'ait voulu. - Le mode ordre ne fait QUE réordonner : les actions par tome et l'ajout de tome n'y figurent pas. Co-Authored-By: Claude Opus 5 --- MaBibli.Client/Composants/ArbreSerie.razor | 134 +++++++++++---------- MaBibli.Client/Pages/Serie.razor | 91 +++++++++++--- MaBibli.Client/Pages/Series.razor | 13 +- MaBibli.Client/wwwroot/css/app.css | 78 ++++++++++++ 4 files changed, 230 insertions(+), 86 deletions(-) diff --git a/MaBibli.Client/Composants/ArbreSerie.razor b/MaBibli.Client/Composants/ArbreSerie.razor index 2499c93..7ea119f 100644 --- a/MaBibli.Client/Composants/ArbreSerie.razor +++ b/MaBibli.Client/Composants/ArbreSerie.razor @@ -1,78 +1,86 @@ @using MaBibli.Shared.Dtos -
  • -
    - - @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))) { -

      Aucun tome recensé.

      + } - else - { - @foreach (var element in Serie.Elements) - { - @if (element.LivreId is { } livreId - && Livres.FirstOrDefault(l => l.Id == livreId) is { } livre) - { - - } - else - { -

      - @element.Titre - Pas dans la bibliothèque -

      - } - } - } - - @if (Enfants.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. +

    + } + @if (_erreur is not null) { @@ -56,13 +66,17 @@ else @if (!ModeEdition && _filles.Count > 0) {

    Séries de ce cycle

    -
      +
        @foreach (var fille in _filles) { - }
      @@ -83,19 +97,25 @@ else {
    • - + @if (ModeOrdre) + { + + } - + @if (ModeOrdre) + { + + }
      @@ -134,6 +154,8 @@ else

      } + @if (!ModeOrdre) + {
      @if (!element.Possede) { @@ -172,6 +194,7 @@ else Retirer
      + } @if (_rattachement == element.Id) { @@ -237,7 +260,7 @@ else
    } - @if (!ModeEdition) + @if (ModeConsultation) {

    Ajouter un tome

    @@ -333,11 +356,24 @@ else

    } } - @if (!ModeEdition) + @if (ModeOrdre) + { + + } + else if (ModeConsultation) {