Remplace le confirm() natif par une modale custom qui avertit des suppressions en cascade
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>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
1e86077e45
commit
6894c5fc95
@@ -20,6 +20,31 @@ def _add_element(client, slug, screen_id, widget="conteneur"):
|
||||
return int(re.search(r"selected=(\d+)", resp.headers["Location"]).group(1))
|
||||
|
||||
|
||||
def test_delete_impact_reports_zero_when_unused_by_flow(client, game):
|
||||
screen_id = _create_screen(client, game)
|
||||
element_id = _add_element(client, game, screen_id, "bouton")
|
||||
resp = client.get(f"/game/{game}/elements/{element_id}/delete-impact")
|
||||
assert resp.get_json() == {"flow_node_count": 0}
|
||||
|
||||
|
||||
def test_delete_impact_reports_referencing_flow_nodes_before_deletion(client, game):
|
||||
"""La modale de confirmation (screen_edit.html) interroge cette route
|
||||
AVANT que l'utilisateur ne confirme, pour l'avertir que des nœuds de
|
||||
la Logique de la scène seraient aussi supprimés — sans jamais rien
|
||||
supprimer elle-même."""
|
||||
screen_id = _create_screen(client, game)
|
||||
element_id = _add_element(client, game, screen_id, "bouton")
|
||||
client.post(
|
||||
f"/game/{game}/screens/{screen_id}/flow/nodes/add",
|
||||
data=json.dumps({"node_type": "trigger", "trigger_event": "clic", "trigger_element_id": element_id}),
|
||||
content_type="application/json",
|
||||
)
|
||||
resp = client.get(f"/game/{game}/elements/{element_id}/delete-impact")
|
||||
assert resp.get_json() == {"flow_node_count": 1}
|
||||
# Rien n'a été supprimé par cette simple consultation.
|
||||
assert screens.get_element(game, element_id) is not None
|
||||
|
||||
|
||||
def test_deleting_an_element_used_as_a_flow_trigger_does_not_crash(client, game):
|
||||
screen_id = _create_screen(client, game)
|
||||
element_id = _add_element(client, game, screen_id, "bouton")
|
||||
|
||||
Reference in New Issue
Block a user