Ajoute les thèmes communs sur les fiches de livres

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
LIMONIER Mathieu
2026-08-20 14:38:19 +02:00
co-authored by Copilot
parent e28d5bce32
commit c2d408afc6
17 changed files with 992 additions and 8 deletions
+25
View File
@@ -2008,3 +2008,28 @@ la position la plus précoce et un rôle renseigné plutôt que `NonPrecise`, pu
ses refus deviennent obsolètes. Sans collision, le renommage est direct. Cette opération est
volontairement distincte de la renormalisation automatique : c'est un choix explicite de
l'utilisateur.
### F2 : thèmes en étiquettes (2026-08-20)
Les thèmes décrivent l'œuvre (« dark fantasy », « space opera »), pas la relation personnelle
d'un lecteur à un livre. Ils sont donc **communs au foyer**, comme le catalogue, les auteurs et
les séries : `AjoutePar` reste une trace de saisie et ne crée aucune frontière. Les statuts de
lecture et les envies restent les seules données personnelles parce qu'elles expriment une
relation de l'utilisateur, et non une propriété de l'œuvre.
La saisie est **manuelle uniquement**. La BnF expose bien `dc:subject`, mais son vocabulaire
Rameau est une indexation documentaire professionnelle et ne correspond pas aux étiquettes
attendues par l'utilisateur. Aucun thème n'est donc déduit automatiquement d'un lookup ISBN ;
comme pour les rôles d'auteurs, l'utilisateur choisit ce qu'il veut réellement afficher.
Le modèle est une table dédiée `Theme` (`Nom`, `NomNormalise`) et une table n-n `LivreTheme`,
avec clé composite et suppression en cascade depuis le livre. La forme normalisée réutilise
`NormalisationTexte` et porte un index unique : « Fantasy » et « fantasy » partagent la même
fiche. Le formulaire accepte une liste séparée par des virgules, dédoublonnée avant résolution ;
le premier libellé saisi devient la forme affichée. Les thèmes apparaissent en étiquettes sur la
carte partagée `CarteLivre` et sur la fiche en consultation.
Le filtre par thème n'est **pas inclus dans F2**. Il aurait fallu ajouter une dimension aux deux
implémentations de filtrage (`FiltreLivres` et `FiltreLivresLocal`), au contrat de cache et aux
tests de confrontation ; cette extension est reportée à un lot ultérieur plutôt que d'introduire
un filtre partiel ou divergent.