Build and deploy / test-python (push) Successful in 7m23s
Build and deploy / test-js (push) Successful in 1m24s
Build and deploy / lint-python (push) Successful in 6m29s
Build and deploy / lint-js (push) Failing after 1m31s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped
Build and deploy / sonarqube (push) Failing after 5m18s
Les vignettes réutilisent le HTML réellement rendu de chaque page (CSS scale trick) et sont centrées dans le conteneur du milieu, au lieu d'une barre pleine largeur. Corrige au passage deux bugs réels trouvés en écrivant les tests : - une page contenant un mini-jeu (bouton Suivant/Recommencer) cassait le parsing HTML car .docPageThumbCard était un <button> englobant un autre <button> ; passage en div role="button" + équivalent clavier, contenu copié rendu inert. - le renommage d'une page par double-clic ne fonctionnait plus du tout (sélecteur .docPageTab oublié lors du renommage des classes). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
67 lines
2.9 KiB
Python
67 lines
2.9 KiB
Python
from typing import Any
|
|
|
|
from flask import render_template
|
|
|
|
import db
|
|
import document_engine
|
|
from core.flask_app import app
|
|
|
|
|
|
@app.route("/document/<slug>/edit")
|
|
def document_edit(slug: str) -> str:
|
|
"""Éditeur du support — route directe, sans page intermédiaire (un
|
|
support = un projet = un document, voir docs/plan/PLAN.md). Contraste
|
|
avec l'environnement 2D (clic sur une carte -> game_dashboard qui liste
|
|
ses écrans -> éditeur de scène) : ici la carte "Mes formations" mène
|
|
directement ici.
|
|
|
|
Un support est composé de plusieurs PAGES (voir document_engine/
|
|
pages/, retour utilisateur du 21/09/2026 : "il faut implémenter un
|
|
système de page") : le canevas n'affiche au chargement que la
|
|
PREMIÈRE page (triée par order_index) — changer de page se fait
|
|
ensuite entièrement côté client via /document/<slug>/render?page_id=
|
|
(voir static/document/js/document-editor.js), jamais un rechargement
|
|
complet de cette route.
|
|
|
|
`rendered_pages` (retour utilisateur du 21/09/2026 : "je préfère
|
|
avoir des miniatures") rend le document de CHAQUE page — pas
|
|
seulement la page active — pour construire les vraies vignettes
|
|
miniatures de la bande au-dessus du canevas (voir templates/document/
|
|
document_edit.html, .docPageThumbInner) : un rendu réduit (CSS
|
|
`transform: scale()`) du contenu RÉEL de chaque page, pas une carte
|
|
générique numéro+titre.
|
|
|
|
Les attributs de chaque élément sont revalidés (document_engine.
|
|
sanitize_element_attributes) avant d'atteindre le client — jamais les
|
|
valeurs brutes stockées telles quelles : un élément dont le schéma a
|
|
évolué depuis sa création (ex. le mini-jeu Scénario, passé d'une liste
|
|
plate à un arbre de décision) ferait sinon planter silencieusement le
|
|
panneau Propriétés côté client, qui suppose la forme ACTUELLE (bug réel
|
|
constaté le 21/09/2026)."""
|
|
support = db.support_meta(slug)
|
|
pages = document_engine.list_document_pages(slug)
|
|
active_page = pages[0]
|
|
|
|
rendered_pages: dict[int, str] = {}
|
|
active_elements: list[dict[str, Any]] = []
|
|
for page in pages:
|
|
page_elements = [
|
|
{**el, "attributes": document_engine.sanitize_element_attributes(el["kind"], el["attributes"])}
|
|
for el in document_engine.list_document_elements(slug, page["id"])
|
|
]
|
|
rendered_pages[page["id"]] = document_engine.render_document(page_elements)
|
|
if page["id"] == active_page["id"]:
|
|
active_elements = page_elements
|
|
|
|
return render_template(
|
|
"document/document_edit.html",
|
|
support=support,
|
|
pages=pages,
|
|
active_page=active_page,
|
|
elements=active_elements,
|
|
rendered_document=rendered_pages[active_page["id"]],
|
|
rendered_pages=rendered_pages,
|
|
element_library=document_engine.ELEMENT_LIBRARY,
|
|
element_kind_labels=document_engine.ELEMENT_KIND_LABELS,
|
|
)
|