import db from ..flow.ensure_flow_schema import ensure_flow_schema from .element_descendant_ids import element_descendant_ids def delete_element(slug, element_id): ensure_flow_schema(slug) conn = db.connect(slug) row = conn.execute("SELECT screen_id FROM _screen_elements WHERE id = ?", (element_id,)).fetchone() if not row: conn.close() return ids = element_descendant_ids(conn, row["screen_id"], element_id) placeholders = ",".join("?" * len(ids)) # Un nœud de la Logique de la scène (déclencheur "clic sur cet # élément"/action "Modifier cet élément"...) ou une ancienne action du # système _actions (conservé pour compatibilité) qui référence # l'élément supprimé OU L'UN DE SES DESCENDANTS n'a plus aucun sens une # fois l'élément disparu — et ces colonnes (trigger_element_id/ # target_element_id) n'ont volontairement PAS de ON DELETE CASCADE (un # élément ne doit pas pouvoir être supprimé "par erreur" en cascade # depuis un nœud de logique qu'on modifie). Sans ce nettoyage préalable, # PRAGMA foreign_keys=ON (voir db/connection.py) fait échouer la # suppression elle-même avec "FOREIGN KEY constraint failed". Voir # element_delete_impact.py pour prévenir l'utilisateur AVANT qu'il # confirme, plutôt que de supprimer ces nœuds en silence. conn.execute( f"DELETE FROM _flow_nodes WHERE trigger_element_id IN ({placeholders}) OR target_element_id IN ({placeholders})", ids + ids, ) conn.execute(f"DELETE FROM _actions WHERE target_element_id IN ({placeholders})", ids) conn.execute("DELETE FROM _screen_elements WHERE id = ?", (element_id,)) conn.commit() conn.close()