import db def reorder_element(slug, screen_id, element_id, target_id, position): """Déplace element_id juste avant ("before") ou juste après ("after") target_id, DANS LE MÊME CONTENEUR (les deux doivent avoir le même parent_id — sinon on ne touche à rien, pour ne jamais reparenter par erreur via le glisser-déposer de l'arborescence). L'ordre est porté par z_index, partagé par tous les éléments de l'écran (pas juste les frères et sœurs) : on renumérote donc l'écran entier à partir de l'ordre actuel (z_index, id) pour rester cohérent partout, pas seulement dans ce conteneur.""" conn = db.connect(slug) rows = conn.execute( "SELECT id, parent_id FROM _screen_elements WHERE screen_id = ? ORDER BY z_index, id", (screen_id,), ).fetchall() by_id = {r["id"]: r["parent_id"] for r in rows} if element_id not in by_id or target_id not in by_id: conn.close() return if by_id[element_id] != by_id[target_id]: conn.close() return order = [r["id"] for r in rows] order.remove(element_id) target_index = order.index(target_id) insert_at = target_index + 1 if position == "after" else target_index order.insert(insert_at, element_id) conn.executemany( "UPDATE _screen_elements SET z_index = ? WHERE id = ?", [(i + 1, eid) for i, eid in enumerate(order)], ) conn.commit() conn.close()