Implémente C1 à C5 pour les séries et cycles

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
LIMONIER Mathieu
2026-08-20 13:27:49 +02:00
co-authored by Copilot
parent 3d5e73838e
commit ddc60898da
12 changed files with 534 additions and 45 deletions
+26
View File
@@ -1908,3 +1908,29 @@ Points à réévaluer en cours de route, sans blocage :
- **Wikidata en 3ᵉ source ISBN** : uniquement si la cascade BnF → OpenLibrary montre ses limites en usage réel.
- **Démarrage hors-ligne par le service worker** : à confirmer dans un navigateur ordinaire, l'environnement d'automatisation ne permettant pas d'enregistrer un service worker (voir la section dédiée). Le reste du hors-ligne, lui, est vérifié.
- **Taille de l'instantané** : 10 livres pèsent ~2,4 Ko de JSON. Rien à optimiser avant plusieurs milliers de fiches ; si le jour vient, découper par pages plutôt que renoncer à l'instantané complet, qui est ce qui rend la recherche hors-ligne possible.
## Lot C — séries, cycles et arborescence (2026-08-20)
Le cycle affiche désormais un arbre de profondeur non bornée par la base : `ArbreSerie.razor`
descend récursivement les séries à partir de la liste plate de `GET /api/series`. Le chemin déjà
rendu est transmis au composant afin qu'une boucle résiduelle en base coupe le rendu au lieu de
provoquer une récursion Razor infinie ; le garde-fou serveur de remontée reste borné par le nombre
de séries.
Les séries directement contenues dans un cycle se réordonnent par flèches via
`PUT /api/series/{id}/sous-series/ordre`. Les tomes conservent leur propre ordre et la règle
hors-ligne reste la même : les boutons d'écriture restent visibles mais désactivés avec
`EtatReseau.MotifHorsLigne`.
Le pliage/dépliage est un état local de l'écran (`HashSet<int>`), volontairement non persistant :
il s'agit d'un confort de lecture, pas d'une propriété de la série. Une série repliée montre son
résumé ; une série dépliée montre ses tomes et ses descendants.
Les compteurs « possédés / total » sont calculés côté client par `TotauxSeries`, en sommant
récursivement les éléments directs et ceux de tous les descendants. Le calcul est lui aussi
protégé contre une boucle.
Depuis une place manquante, un ISBN passe par la cascade BnF puis OpenLibrary existante. Le
candidat choisi peut créer un livre du catalogue puis rattacher la place, ou créer une envie avec
les métadonnées complètes, notamment l'auteur trouvé par le lookup. Les revues (préfixe `977`) ne
font pas partie de ce flux : `ElementSerie.LivreId` ne pointe que vers `Livre`.