from db.supports import connect_support 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.""" 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()