Ajoute les listes à puces et numérotées dans la bibliothèque de contenu
Retour utilisateur du 24/09/2026 : "dans la section contenu il manque la possibilité d'utiliser une liste à puce ou ordonnée". - Deux nouveaux kinds "liste_puces"/"liste_numerotee" dans CONTENT_KINDS, chacun sélectionnable directement dans la bibliothèque (comme titre/paragraphe/image/bouton) — partagent la même structure d'attributs (`items`, une liste de chaînes), c'est le kind lui-même qui décide <ul> ou <ol> au rendu (_render_list), pas un attribut "ordered" redondant à tenir synchronisé. - Rendu : un <li> par item, échappé (html.escape) comme tout le contenu texte du document — une liste vide rend <ul>/<ol> sans enfant plutôt qu'un placeholder (état normal, pas une image sans fichier). - Panneau Propriétés : même patron répéteur que l'Association/Memory (ajouter/renommer/supprimer une ligne, rechargé après chaque modification). - Icônes de bibliothèque (☰/①) + style .docList (puces/numéros visibles, espacement entre items). 6 nouveaux tests Python (attributs par défaut, rendu <ul>/<ol>, échappement, liste vide, route d'ajout) + vérifié par un test jsdom dédié contre un vrai support (bibliothèque, panneau Propriétés : ajout/modification/suppression d'item réellement fonctionnels). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
eac45f1c9d
commit
e7c6ed7159
@@ -180,3 +180,48 @@ def test_move_document_element_to_page_on_missing_id_is_a_noop(tmp_support_slug_
|
||||
doc_engine.move_document_element_to_page(slug, 999, page2_id)
|
||||
assert doc_engine.list_document_elements(slug, page1_id) == []
|
||||
assert doc_engine.list_document_elements(slug, page2_id) == []
|
||||
|
||||
|
||||
def test_liste_puces_default_attributes_and_render(tmp_support_slug_cleanup: Any) -> None:
|
||||
slug, page_id = _new_support(tmp_support_slug_cleanup)
|
||||
element_id = doc_engine.add_document_element(slug, "liste_puces", page_id=page_id)
|
||||
element = doc_engine.get_document_element(slug, element_id)
|
||||
assert element is not None
|
||||
assert element["attributes"]["items"] == ["Premier élément", "Deuxième élément"]
|
||||
|
||||
html = doc_engine.render_document(doc_engine.list_document_elements(slug, page_id))
|
||||
assert html.startswith("<ul")
|
||||
assert 'data-kind="liste_puces"' in html
|
||||
assert "<li>Premier élément</li>" in html
|
||||
assert "<li>Deuxième élément</li>" in html
|
||||
|
||||
|
||||
def test_liste_numerotee_renders_an_ordered_list(tmp_support_slug_cleanup: Any) -> None:
|
||||
slug, page_id = _new_support(tmp_support_slug_cleanup)
|
||||
element_id = doc_engine.add_document_element(slug, "liste_numerotee", page_id=page_id)
|
||||
doc_engine.update_document_element_attributes(slug, element_id, {"items": ["Un", "Deux", "Trois"]})
|
||||
|
||||
html = doc_engine.render_document(doc_engine.list_document_elements(slug, page_id))
|
||||
assert html.startswith("<ol")
|
||||
assert 'data-kind="liste_numerotee"' in html
|
||||
assert "<li>Un</li><li>Deux</li><li>Trois</li>" in html
|
||||
|
||||
|
||||
def test_liste_puces_escapes_item_content(tmp_support_slug_cleanup: Any) -> None:
|
||||
slug, page_id = _new_support(tmp_support_slug_cleanup)
|
||||
element_id = doc_engine.add_document_element(slug, "liste_puces", page_id=page_id)
|
||||
doc_engine.update_document_element_attributes(slug, element_id, {"items": ["<script>alert(1)</script>"]})
|
||||
|
||||
html = doc_engine.render_document(doc_engine.list_document_elements(slug, page_id))
|
||||
assert "<script>" not in html
|
||||
assert "<script>" in html
|
||||
|
||||
|
||||
def test_liste_puces_with_no_items_renders_an_empty_list(tmp_support_slug_cleanup: Any) -> None:
|
||||
slug, page_id = _new_support(tmp_support_slug_cleanup)
|
||||
doc_engine.add_document_element(slug, "liste_puces", page_id=page_id)
|
||||
element_id = doc_engine.list_document_elements(slug, page_id)[0]["id"]
|
||||
doc_engine.update_document_element_attributes(slug, element_id, {"items": []})
|
||||
|
||||
html = doc_engine.render_document(doc_engine.list_document_elements(slug, page_id))
|
||||
assert html == f'<ul class="docList" data-element-id="{element_id}" data-kind="liste_puces"></ul>'
|
||||
|
||||
@@ -69,6 +69,25 @@ def test_document_element_add_accepts_row_for_the_layout_engine(client: FlaskCli
|
||||
assert resp.get_json()["kind"] == "row"
|
||||
|
||||
|
||||
def test_document_element_add_creates_a_bullet_list(client: FlaskClient, support: str) -> None:
|
||||
resp = client.post(f"/document/{support}/elements/add", data={"kind": "liste_puces", "page_id": _page_id(support)})
|
||||
assert resp.status_code == 200
|
||||
payload = resp.get_json()
|
||||
assert payload["kind"] == "liste_puces"
|
||||
assert "<ul" in payload["rendered_html"]
|
||||
assert "docList" in payload["rendered_html"]
|
||||
|
||||
|
||||
def test_document_element_add_creates_a_numbered_list(client: FlaskClient, support: str) -> None:
|
||||
resp = client.post(
|
||||
f"/document/{support}/elements/add", data={"kind": "liste_numerotee", "page_id": _page_id(support)}
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
payload = resp.get_json()
|
||||
assert payload["kind"] == "liste_numerotee"
|
||||
assert "<ol" in payload["rendered_html"]
|
||||
|
||||
|
||||
def test_document_element_update_persists_attributes(client: FlaskClient, support: str) -> None:
|
||||
page_id = _page_id(support)
|
||||
add_resp = client.post(f"/document/{support}/elements/add", data={"kind": "paragraphe", "page_id": page_id})
|
||||
|
||||
Reference in New Issue
Block a user