Audit complet de mise en forme — Liste à puces/numérotée (4e élément)
Implémente toutes les options manquantes identifiées pour les listes :
typographie complète, style/position/couleur/taille de puce (validés
selon le kind), puce personnalisée en SVG pour les listes à puces,
padding uniforme par élément (nouveau, il n'y en avait aucun), espacement
entre éléments réglable, et tous les attributs de boîte partagés sur la
liste entière. Bordure/fond/padding par élément individuel et sous-listes
imbriquées volontairement différés (portée actée avec l'utilisateur
avant implémentation : transformeraient le stockage des éléments en
objets structurés, chantier bien plus lourd).
Trois ajouts transversaux bénéficiant à plusieurs éléments : sections
"Contenu"/"Conteneur" dans tous les panneaux de propriétés, alignement
vertical du contenu dans son bloc (Titre/Paragraphe/Liste/Image
légendée), et une option pour retirer un thème appliqué ("Aucun modèle"
dans la modale, avec une nouvelle fonction db.remove_document_theme).
Quatre bugs réels trouvés et corrigés en chaîne pendant la validation
avec le thème "Sécurité incendie" : un badge de thème s'affichait
au-dessus du texte au lieu d'à côté ; le correctif a d'abord fait
disparaître les puces/numéros natifs de TOUTES les listes (bug plus
grave que celui corrigé) ; puis un marqueur natif redondant apparaissait
à côté du badge du thème ; puis une règle CSS site-large de spécificité
supérieure empêchait silencieusement ce dernier correctif. Chaque étape
vérifiée par navigateur automatisé sur un support jetable.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
8f879f6321
commit
4db1269348
@@ -548,6 +548,39 @@ def test_document_theme_apply_template_content_replaces_everything(client: Flask
|
||||
assert len(pages) == len(theme["seed_pages"])
|
||||
|
||||
|
||||
def test_document_theme_apply_with_empty_theme_id_removes_the_theme(client: FlaskClient, support: str) -> None:
|
||||
# Retour utilisateur du 26/09/2026 : la modale "Utiliser un modèle"
|
||||
# propose une carte "Aucun modèle" pour "revenir à un document de
|
||||
# base" — theme_id vide est le signal que la route interprète comme
|
||||
# un retrait, jamais comme une erreur de validation.
|
||||
page_id = _page_id(support)
|
||||
client.post(f"/document/{support}/elements/add", data={"kind": "titre", "page_id": page_id})
|
||||
client.post(
|
||||
f"/document/{support}/theme/apply",
|
||||
json={"theme_id": "securite-incendie", "mode": "keep_content"},
|
||||
)
|
||||
assert db.get_document_theme(support) == "securite-incendie"
|
||||
|
||||
resp = client.post(f"/document/{support}/theme/apply", json={"theme_id": ""})
|
||||
assert resp.status_code == 200
|
||||
assert resp.get_json() == {"ok": True, "theme_id": ""}
|
||||
# Retire vraiment la ligne _meta (voir db/supports/remove_document_theme.py)
|
||||
# — jamais une chaîne vide qui violerait le contrat documenté de
|
||||
# get_document_theme ("None" = aucun thème jamais appliqué/retiré).
|
||||
assert db.get_document_theme(support) is None
|
||||
# Le contenu n'est JAMAIS touché en retirant le thème.
|
||||
assert len(document_engine.list_document_elements(support, page_id)) == 1
|
||||
|
||||
edit_resp = client.get(f"/document/{support}/edit")
|
||||
assert "document/themes/securite-incendie.css" not in edit_resp.get_data(as_text=True)
|
||||
|
||||
|
||||
def test_document_theme_apply_with_empty_theme_id_ignores_mode(client: FlaskClient, support: str) -> None:
|
||||
resp = client.post(f"/document/{support}/theme/apply", json={"theme_id": "", "mode": "n-importe-quoi"})
|
||||
assert resp.status_code == 200
|
||||
assert db.get_document_theme(support) is None
|
||||
|
||||
|
||||
def test_document_theme_preview_renders_every_seed_page_with_navigation(client: FlaskClient, support: str) -> None:
|
||||
resp = client.get(f"/document/{support}/theme/securite-incendie/preview")
|
||||
assert resp.status_code == 200
|
||||
|
||||
Reference in New Issue
Block a user