Pagination automatique : le contenu qui déborde part sur une nouvelle page
Retour utilisateur du 23/09/2026 : "si il n'y a plus de place sur la page il faut automatiquement créer une autre page [et y] coller le contenu et amener l'utilisateur sur la page" — remplace le comportement précédent (overflow:hidden, contenu clipsé, à gérer manuellement). - Nouvelle capacité serveur : document_engine.move_document_element_to_page (+ route POST /document/<slug>/elements/<id>/move-to-page) déplace un élément (et ses enfants de rangée en cascade) vers une AUTRE page — jusqu'ici move_document_element ne gérait que le réordonnancement DANS la même page. - Client : forgeDocCheckPageOverflow, appelée à la fin de CHAQUE forgeDocRefreshCanvas (point d'entrée unique après toute mutation) : mesure le débordement réel (scrollHeight vs clientHeight), trouve le premier élément top-niveau qui dépasse le bas de la page (getBoundingClientRect, tient compte du zoom), déplace cet élément et tout ce qui le suit vers une page neuve, puis y bascule l'utilisateur. Jamais déclenché sur une page mini-jeu (toujours seule sur sa page, aucun débordement pertinent à corriger). Vérifié par un test jsdom dédié (géométrie simulée via getBoundingClientRect/scrollHeight/clientHeight, jsdom n'ayant pas de vrai moteur de mise en page) : ordre des déplacements, page inchangée si le contenu tient, page mini-jeu jamais scindée. 6 nouveaux tests Python (document_engine + route). 711/711 tests passent. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
0e8c6efb06
commit
c6e173589f
@@ -9,6 +9,7 @@ from . import ( # noqa: F401 - enregistre les routes definies dans chaque modul
|
||||
document_element_add,
|
||||
document_element_delete,
|
||||
document_element_move,
|
||||
document_element_move_to_page,
|
||||
document_element_update,
|
||||
document_new,
|
||||
document_page_add,
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
from flask import jsonify, request
|
||||
from werkzeug.wrappers import Response
|
||||
|
||||
import document_engine
|
||||
from core.flask_app import app
|
||||
|
||||
|
||||
@app.route("/document/<slug>/elements/<int:element_id>/move-to-page", methods=["POST"])
|
||||
def document_element_move_to_page(slug: str, element_id: int) -> Response | tuple[Response, int]:
|
||||
"""Déplace un élément vers une AUTRE page du support — appelée par la
|
||||
pagination automatique côté client (retour utilisateur du 23/09/2026 :
|
||||
"si il n'y a plus de place sur la page il faut automatiquement créer
|
||||
une autre page [et y] coller le contenu", voir
|
||||
static/document/js/document-editor.js, forgeDocCheckPageOverflow),
|
||||
jamais par un glisser-déposer manuel (qui reste sur
|
||||
document_element_move, réordonnancement dans la MÊME page)."""
|
||||
payload = request.get_json(force=True) or {}
|
||||
target_page_id = payload.get("target_page_id")
|
||||
if not isinstance(target_page_id, int) or isinstance(target_page_id, bool):
|
||||
return jsonify({"error": "page cible introuvable"}), 404
|
||||
if document_engine.get_document_page(slug, target_page_id) is None:
|
||||
return jsonify({"error": "page cible introuvable"}), 404
|
||||
document_engine.move_document_element_to_page(slug, element_id, target_page_id)
|
||||
return jsonify({"ok": True})
|
||||
Reference in New Issue
Block a user