Implemente le mini-jeu Mots meles (grille reelle, placement 4 directions)
Build and deploy / test-python (push) Failing after 1m0s
Build and deploy / test-js (push) Failing after 50s
Build and deploy / lint-python (push) Failing after 1m2s
Build and deploy / lint-js (push) Failing after 1m7s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped
Build and deploy / sonarqube (push) Failing after 1m1s

Quatrieme mini-jeu du support de formation : le createur ecrit 5 a 10
mots (recommandation souple, comme MIN_PAIRS/MIN_CARDS), places par le
serveur dans une grille carree horizontalement, verticalement, ou en
diagonale (deux sens seulement, jamais a l'envers) via un vrai
algorithme de placement avec retry/agrandissement de grille en cas de
conflit. La grille ET la position exacte de chaque mot sont calculees
cote serveur puis embarquees en JSON ; le client valide chaque
selection (glisser ou cliquer-cliquer) par comparaison de coordonnees
exactes, jamais une simple comparaison de texte (qui se tromperait sur
des lettres partagees entre deux mots qui se croisent). Comme
Association/Memory, la grille reste affichee une fois tous les mots
trouves : seul le bouton Recommencer (.docMinigameRestartBar, partage)
apparait.

Verifie via simulation DOM reelle (jsdom) : selection au glisser ET au
clic-clic, mot invalide sans crash, barre de fin qui bascule, panneau
Proprietes (ajout/suppression de mot avec revalidation serveur).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-09-20 15:31:46 +02:00
co-authored by Claude Sonnet 5
parent 1b1307bb85
commit d8be80ebd1
11 changed files with 789 additions and 20 deletions
+10 -7
View File
@@ -14,14 +14,15 @@ def document_element_update(slug: str, element_id: int) -> Response | tuple[Resp
Propriétés (voir static/document/js/document-editor.js) envoie
systématiquement l'état complet de ses champs.
Quiz, Association et Memory sont les seuls kinds revalidés côté
serveur (sanitize_quiz_config/sanitize_association_config/
sanitize_memory_config, même convention que
Quiz, Association, Memory et Mots mêlés sont les seuls kinds
revalidés côté serveur (sanitize_quiz_config/
sanitize_association_config/sanitize_memory_config/
sanitize_mots_config, même convention que
game_engine/rendering/quiz_box_config.py côté jeu) : leur forme (liste
de questions/choix, liste de paires, liste de cartes) doit rester
structurellement correcte pour que le rendu ne plante jamais,
contrairement aux autres kinds (texte/forme/image...) dont les
attributs sont de simples valeurs scalaires sans structure à
de questions/choix, liste de paires, liste de cartes, liste de mots)
doit rester structurellement correcte pour que le rendu ne plante
jamais, contrairement aux autres kinds (texte/forme/image...) dont
les attributs sont de simples valeurs scalaires sans structure à
garantir."""
element = document_engine.get_document_element(slug, element_id)
if element is None:
@@ -33,6 +34,8 @@ def document_element_update(slug: str, element_id: int) -> Response | tuple[Resp
attributes = document_engine.sanitize_association_config(attributes)
elif element["kind"] == "memory":
attributes = document_engine.sanitize_memory_config(attributes)
elif element["kind"] == "mots":
attributes = document_engine.sanitize_mots_config(attributes)
document_engine.update_document_element_attributes(slug, element_id, attributes)
element = db.assert_not_none(
document_engine.get_document_element(slug, element_id),