from db.supports import connect_support, ensure_document_pages_schema def move_document_element(slug: str, element_id: int, new_parent_id: int | None, new_index: int) -> None: """Réinsertion réelle d'un élément — appelée par l'algorithme de glisser-déposer du moteur de layout (voir docs/plan/PLAN.md) : dépose dans un nouveau groupe de frères (nouvelle rangée, ou top-niveau) à une position précise, pas juste "monter/descendre" d'un cran. Renumérote intégralement les deux groupes concernés (ancien et nouveau, ou un seul si inchangé) plutôt que de décaler un par un, pour rester correct même en cas de réordonnancement DANS le même groupe. new_parent_id doit toujours désigner un élément de la MÊME page que element_id (jamais vérifié ici — le client ne propose que des cibles de la page actuellement affichée, voir static/document/js/document-editor.js).""" ensure_document_pages_schema(slug) conn = connect_support(slug) row = conn.execute("SELECT parent_id FROM _document_elements WHERE id = ?", (element_id,)).fetchone() if not row: conn.close() return old_parent_id = row["parent_id"] if old_parent_id == new_parent_id: siblings = [ r["id"] for r in conn.execute( "SELECT id FROM _document_elements WHERE parent_id IS ? AND id != ? ORDER BY order_index", (old_parent_id, element_id), ).fetchall() ] siblings.insert(max(0, min(new_index, len(siblings))), element_id) for index, sibling_id in enumerate(siblings): conn.execute("UPDATE _document_elements SET order_index = ? WHERE id = ?", (index, sibling_id)) else: old_siblings = [ r["id"] for r in conn.execute( "SELECT id FROM _document_elements WHERE parent_id IS ? AND id != ? ORDER BY order_index", (old_parent_id, element_id), ).fetchall() ] for index, sibling_id in enumerate(old_siblings): conn.execute("UPDATE _document_elements SET order_index = ? WHERE id = ?", (index, sibling_id)) new_siblings = [ r["id"] for r in conn.execute( "SELECT id FROM _document_elements WHERE parent_id IS ? ORDER BY order_index", (new_parent_id,), ).fetchall() ] new_siblings.insert(max(0, min(new_index, len(new_siblings))), element_id) conn.execute("UPDATE _document_elements SET parent_id = ? WHERE id = ?", (new_parent_id, element_id)) for index, sibling_id in enumerate(new_siblings): conn.execute("UPDATE _document_elements SET order_index = ? WHERE id = ?", (index, sibling_id)) conn.commit() conn.close()