from typing import Any from flask import render_template import db import document_engine from core.flask_app import app @app.route("/document//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//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, )