Fusionne les 4 pages de création dans le dashboard, retire le titre/BDD

Suite de la demande précédente : les 4 pages autrefois listées dans la
barre de navigation n'existent plus en tant que pages séparées — tout
vit désormais dans les onglets du tableau de bord (commit précédent) ou,
pour la création d'un objet, dans un panneau déplaçable.

- screens_list.html + sa route (screens_list) : supprimés (l'onglet
  "Écrans du jeu" du dashboard couvre déjà tout : créer, réordonner,
  éditer, supprimer). screen_new/screen_move/screen_delete redirigent
  maintenant vers le dashboard (tab=screens) au lieu de cette page.
- element_types.html : supprimé, mais la route element_types est
  conservée (GET redirige vers le dashboard, POST — utilisé par la barre
  de création repliable de l'onglet "Éléments de jeu" — continue de
  fonctionner). element_type_edit/element_type_delete redirigent aussi
  vers le dashboard.
- game_variables.html + sa route (game_variables) : supprimés (l'onglet
  "Variables" du dashboard couvre déjà tout). create_global_var/
  global_var_edit/global_var_delete redirigent vers le dashboard
  (tab=variables) au lieu de cette page.
- object_form.html : supprimé. La route object_new (POST) est conservée
  pour traiter la soumission du panneau — voir plus bas — mais ne rend
  plus de page pour un GET (redirige vers le dashboard).

Nouveau panneau déplaçable "Nouvel objet" sur le dashboard (bouton
"+ Nouvel objet" de l'onglet Objets) : réutilise .floatPanel/
.floatPanelHeader/.floatPanelBody (déjà utilisées dans l'éditeur d'écran)
avec une nouvelle variante centrée (.floatPanel--center) et son propre
glisser-déposer minimal (pas de position persistée, contrairement aux
panneaux de l'éditeur d'écran — inutile pour un panneau ouvert
ponctuellement). Contenu et script (object_form.js) repris tels quels de
l'ancienne page.

base.html : la barre de navigation du jeu n'a donc plus que 2 liens —
"📊 Tableau de bord" (nouveau) et "▶️ Jouer" (toujours en dernier).

game_dashboard.html : titre du jeu et chemin de la base de données
retirés (redondants avec le nom déjà visible dans l'onglet du
navigateur/la barre de nav).

Les liens "crée-en un"/"gérer les variables" dans l'éditeur d'écran
(screen_edit.html) pointent maintenant vers le dashboard avec le bon
onglet (?tab=...), lu et appliqué au chargement de la page
(switchDashTab() côté JS).

2 tests (test_screens_and_elements.py) mis à jour : ils vérifiaient le
contenu des pages supprimées (element-types, screens) — adaptés pour
vérifier la même chose sur le dashboard, qui porte maintenant cette
information.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-08-27 10:54:19 +02:00
co-authored by Claude Sonnet 5
parent 65450a5719
commit d875557254
24 changed files with 197 additions and 391 deletions
+1 -1
View File
@@ -9,4 +9,4 @@ from core.flask_app import app
def element_type_delete(slug, element_type_id):
if screens.element_type_usage_count(slug, element_type_id) == 0:
screens.delete_element_type(slug, element_type_id)
return redirect(url_for("element_types", slug=slug))
return redirect(url_for("game_dashboard", slug=slug, tab="element_types"))
+1 -1
View File
@@ -13,4 +13,4 @@ def element_type_edit(slug, element_type_id):
name = request.form.get("name", "").strip() or None
bound_definition_id = request.form.get("bound_definition_id") or None
screens.update_element_type(slug, element_type_id, name=name, bound_definition_id=bound_definition_id)
return redirect(url_for("element_types", slug=slug))
return redirect(url_for("game_dashboard", slug=slug, tab="element_types"))
+8 -11
View File
@@ -1,6 +1,5 @@
from flask import render_template, request, redirect, url_for
from flask import request, redirect, url_for
import db
import screens
from core.flask_app import app
@@ -8,18 +7,16 @@ from core.flask_app import app
@app.route("/game/<slug>/element-types", methods=["GET", "POST"])
def element_types(slug):
game = db.game_meta(slug)
"""La création/gestion d'un élément de jeu se fait désormais depuis
l'onglet "Éléments de jeu" du tableau de bord (voir game_dashboard.html)
plutôt qu'une page dédiée — cette route ne fait donc plus que traiter la
création (barre de création repliable de cet onglet). Un GET direct
redirige vers le tableau de bord."""
if request.method == "POST":
name = request.form.get("name", "").strip()
icon = request.form.get("icon", "").strip() or "🧩"
bound_definition_id = request.form.get("bound_definition_id") or None
if name:
screens.create_element_type(slug, name, icon, bound_definition_id)
return redirect(url_for("element_types", slug=slug))
types = screens.list_element_types(slug)
usage = {t["id"]: screens.element_type_usage_count(slug, t["id"]) for t in types}
definitions = db.list_definitions(slug)
return render_template(
"element_types.html", game=game, types=types, usage=usage, widgets=screens.WIDGETS,
definitions=definitions,
)
return redirect(url_for("game_dashboard", slug=slug, tab="element_types"))
return redirect(url_for("game_dashboard", slug=slug, tab="element_types"))
+1 -1
View File
@@ -24,5 +24,5 @@ def game_dashboard(slug):
"game_dashboard.html", game=game, definitions=definitions,
screen_list=screen_list, element_types=element_types,
element_type_usage=element_type_usage, variables=variables,
variable_types=db.GLOBAL_VARIABLE_TYPES,
variable_types=db.GLOBAL_VARIABLE_TYPES, field_types=db.FIELD_TYPES,
)
-1
View File
@@ -1,4 +1,3 @@
from .create_global_var import create_global_var
from .game_variables import game_variables
from .global_var_edit import global_var_edit
from .global_var_delete import global_var_delete
+1 -1
View File
@@ -15,4 +15,4 @@ def create_global_var(slug):
default_value = request.form.get("default_value") or ""
if name:
db.create_global_variable(slug, name, var_type, default_value)
return redirect(url_for("game_variables", slug=slug))
return redirect(url_for("game_dashboard", slug=slug, tab="variables"))
-19
View File
@@ -1,19 +0,0 @@
from flask import render_template
import db
from core.flask_app import app
@app.route("/game/<slug>/variables")
def game_variables(slug):
"""Page de gestion des variables globales (voir db/global_vars/) : un
objet "jeu" implicite dont les propriétés/valeurs sont visibles partout
(condition de visibilité, action "Modifier une variable"), plutôt
qu'attachées à un objet de données précis."""
game = db.game_meta(slug)
variables = db.list_global_variables(slug)
return render_template(
"game_variables.html", game=game, variables=variables,
variable_types=db.GLOBAL_VARIABLE_TYPES,
)
+1 -1
View File
@@ -8,4 +8,4 @@ from core.flask_app import app
@app.route("/game/<slug>/variables/<int:var_id>/delete", methods=["POST"])
def global_var_delete(slug, var_id):
db.delete_global_variable_by_id(slug, var_id)
return redirect(url_for("game_variables", slug=slug))
return redirect(url_for("game_dashboard", slug=slug, tab="variables"))
+1 -1
View File
@@ -10,4 +10,4 @@ def global_var_edit(slug, var_id):
var_type = request.form.get("type") or "texte"
value = request.form.get("value") or ""
db.update_global_variable(slug, var_id, var_type, value)
return redirect(url_for("game_variables", slug=slug))
return redirect(url_for("game_dashboard", slug=slug, tab="variables"))
+7 -11
View File
@@ -1,4 +1,4 @@
from flask import render_template, request, redirect, url_for
from flask import request, redirect, url_for
import db
@@ -8,20 +8,16 @@ from .parse_field_rows import _parse_field_rows
@app.route("/game/<slug>/objects/new", methods=["GET", "POST"])
def object_new(slug):
game = db.game_meta(slug)
existing_definitions = db.list_definitions(slug)
"""La création d'un objet se fait désormais depuis un panneau déplaçable
sur le tableau de bord du jeu (voir game_dashboard.html, formulaire
#objectForm) plutôt qu'une page dédiée — cette route ne fait donc plus
que traiter la soumission de CE formulaire. Un GET direct (ex. lien
externe obsolète) redirige simplement vers le tableau de bord."""
if request.method == "POST":
name = request.form.get("object_name", "").strip()
fields = _parse_field_rows(request.form)
if name and fields:
definition_id = db.create_definition(slug, name, fields)
return redirect(url_for("object_view", slug=slug, definition_id=definition_id))
return render_template(
"object_form.html",
game=game,
existing_definitions=existing_definitions,
field_types=db.FIELD_TYPES,
)
return redirect(url_for("game_dashboard", slug=slug))
+1 -1
View File
@@ -1 +1 @@
from . import screens_list, screens_new, screen_rename, screen_move, screen_delete, screen_edit, screen_set_aspect
from . import screens_new, screen_rename, screen_move, screen_delete, screen_edit, screen_set_aspect
+2 -2
View File
@@ -9,6 +9,6 @@ from core.flask_app import app
def screen_delete(slug, screen_id):
referencing = screens.screens_referencing(slug, screen_id)
if referencing:
return redirect(url_for("screens_list", slug=slug, blocked_screen=screen_id))
return redirect(url_for("game_dashboard", slug=slug, tab="screens", blocked_screen=screen_id))
screens.delete_screen(slug, screen_id)
return redirect(url_for("screens_list", slug=slug))
return redirect(url_for("game_dashboard", slug=slug, tab="screens"))
+1 -1
View File
@@ -9,4 +9,4 @@ from core.flask_app import app
def screen_move(slug, screen_id):
direction = -1 if request.form.get("direction") == "up" else 1
screens.move_screen(slug, screen_id, direction)
return redirect(url_for("screens_list", slug=slug))
return redirect(url_for("game_dashboard", slug=slug, tab="screens"))
-12
View File
@@ -1,12 +0,0 @@
from flask import render_template
import db
import screens
from core.flask_app import app
@app.route("/game/<slug>/screens")
def screens_list(slug):
game = db.game_meta(slug)
return render_template("screens_list.html", game=game, screen_list=screens.list_screens(slug))
+1 -1
View File
@@ -11,4 +11,4 @@ def screens_new(slug):
if name:
screen_id = screens.create_screen(slug, name)
return redirect(url_for("screen_edit", slug=slug, screen_id=screen_id))
return redirect(url_for("screens_list", slug=slug))
return redirect(url_for("game_dashboard", slug=slug, tab="screens"))