Depuis le dernier correctif, supprimer un élément supprime aussi en silence tout nœud de la Logique de la scène qui le référence (déclencheur/ action, voir delete_element.py) - nécessaire pour éviter le plantage "FOREIGN KEY constraint failed", mais l'utilisateur n'était jamais prévenu qu'un bout de sa logique disparaissait en même temps. Nouvelle route GET .../elements/<id>/delete-impact (element_delete_ impact.py) : calcule, sans rien supprimer, combien de nœuds de la Logique de la scène référencent cet élément OU l'un de ses descendants (partage element_descendant_ids.py avec delete_element.py, pour rester exactement cohérent avec ce qui sera réellement supprimé). Les deux boutons "supprimer" de screen_edit.html (élément sélectionné, et onglet d'un widget Onglets) ouvrent maintenant une modale custom (deleteConfirmModal, même famille que le sélecteur d'icônes) au lieu du confirm() natif du navigateur : elle interroge cette route juste après ouverture et affiche un avertissement dédié si le nombre remonté est non nul, avant que l'utilisateur ne confirme quoi que ce soit - impossible à faire avec confirm(), dont le texte est figé au moment du rendu de la page. La confirmation soumet ensuite le formulaire normalement (via requestSubmit(), intercepté par pjax.js comme n'importe quel autre formulaire). Ajoute deux tests pour la nouvelle route (impact nul, impact non nul sans rien supprimer). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
36 lines
1.7 KiB
Python
36 lines
1.7 KiB
Python
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()
|