from typing import Any from flask import jsonify, request from werkzeug.wrappers import Response import db import document_engine from core.flask_app import app @app.route("/document//elements/add", methods=["POST"]) def document_element_add(slug: str) -> Response | tuple[Response, int]: """Ajoute un élément à une page précise — appelée en AJAX depuis la bibliothèque du panneau gauche (clic ou glisser-déposer initial), OU par le moteur de layout lui-même pour créer une rangée à la volée au moment d'un dépôt latéral (kind="row" — jamais choisi directement dans la bibliothèque, absent de document_engine.ELEMENT_LIBRARY, mais un kind valide comme un autre pour cette route ; voir static/document/js/document-editor.js). parent_id, quand fourni, place l'élément directement dans une rangée existante DE CETTE MÊME PAGE.""" kind = request.form.get("kind", "") if kind not in document_engine.ELEMENT_KIND_LABELS: return jsonify({"error": "type d'élément inconnu"}), 400 page_id = request.form.get("page_id", type=int) if page_id is None or document_engine.get_document_page(slug, page_id) is None: return jsonify({"error": "page introuvable"}), 404 parent_id = request.form.get("parent_id", type=int) element_id = document_engine.add_document_element(slug, kind, page_id=page_id, parent_id=parent_id) element = db.assert_not_none( document_engine.get_document_element(slug, element_id), "element_id vient d'etre cree par add_document_element juste au-dessus", ) elements_by_parent: dict[int | None, list[dict[str, Any]]] = {} for el in document_engine.list_document_elements(slug, page_id): elements_by_parent.setdefault(el["parent_id"], []).append(el) return jsonify( { "id": element_id, "kind": kind, "parent_id": parent_id, "attributes": element["attributes"], "rendered_html": document_engine.render_document_element(element, elements_by_parent), } )