Comportement SYSTÉMATIQUE à chaque création de jeu (admin compris), pas une formalité réservée à l'inscription : /onboarding (routes/onboarding/) devient le point d'entrée unique — 4 cartes retournables (survol = explication au dos), défilement horizontal animé vers le nom du jeu. Un admin y repasse à volonté (pas de project_slug dédié, jamais bloqué/ redirigé vers un projet précédent) ; un compte "user" n'en a plus qu'un créé d'office (routes/auth/register_2fa.py), guidé ici à la place. - db/games/game_type_catalog.py : catalogue des 4 types (Quiz/ Embranchement-escape game/RPG/Créer mon jeu de A à Z), _meta['onboarding_type'] décide du "kind" du premier écran créé et si le tableau de bord complet reste accessible. - routes/games/game_dashboard.py, templates/game_dashboard_simple.html : un type restreint (quiz/embranchement/rpg) voit désormais SON tableau de bord (même route que "custom"), rendu en version simplifiée — juste ses écrans en cartes avec un aperçu RÉEL du contenu (scène mise à l'échelle par container query CSS, adaptée à la largeur réelle de la carte). "+ Ajouter un écran" n'y propose pas de choix de type : imposé par le projet (routes/screens/screens_new.py), verrouillé aussi côté serveur. - core/auth_guard.py : plus de blocage de game_dashboard par type — la restriction se fait au rendu, pas à l'accès à la route. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
98 lines
4.5 KiB
Python
98 lines
4.5 KiB
Python
from flask import render_template
|
|
|
|
import db
|
|
import screens
|
|
|
|
from core.flask_app import app
|
|
|
|
|
|
@app.route("/game/<slug>")
|
|
def game_dashboard(slug):
|
|
"""Vue d'ensemble du jeu : tout ce qui a été créé (écrans, objets,
|
|
éléments de jeu réutilisables, variables), en un coup d'œil, avec un
|
|
accès direct à chaque élément — la barre de navigation du jeu (voir
|
|
base.html) permet déjà de sauter directement vers chaque éditeur, cette
|
|
page sert donc de résumé/point d'entrée plutôt que de répéter les mêmes
|
|
liens.
|
|
|
|
Onboarding guidé (voir db/games/game_type_catalog.py) : un compte
|
|
"restreint" (quiz/embranchement/rpg) voit ici une version SIMPLIFIÉE —
|
|
juste ses écrans, en cartes avec un aperçu de leur contenu, plus un
|
|
bouton "+ Ajouter un écran" qui ne demande PAS de type (imposé par le
|
|
projet : "jeu_2d" pour un RPG, "document" pour les autres — voir
|
|
routes/screens/screens_new.py). Objets/éléments de jeu réutilisables/
|
|
variables restent réservés à "Créer mon jeu de A à Z", la seule
|
|
formule pensée pour la puissance complète du moteur."""
|
|
game = db.game_meta(slug)
|
|
if db.is_restricted(slug):
|
|
return _render_simple_dashboard(slug, game)
|
|
return _render_full_dashboard(slug, game)
|
|
|
|
|
|
def _render_simple_dashboard(slug, game):
|
|
screen_list = screens.list_screens(slug)
|
|
previews = {}
|
|
for s in screen_list:
|
|
if s["kind"] == "jeu_2d":
|
|
objects = screens.list_scene_objects(slug, s["id"])
|
|
for o in objects:
|
|
o["rendered_html"] = screens.render_scene_object(o)
|
|
previews[s["id"]] = {"kind": "jeu_2d", "objects": objects}
|
|
else:
|
|
previews[s["id"]] = {
|
|
"kind": "document",
|
|
"elements": screens.list_elements(slug, s["id"]),
|
|
}
|
|
return render_template(
|
|
"game_dashboard_simple.html", game=game, screen_list=screen_list, previews=previews,
|
|
)
|
|
|
|
|
|
def _render_full_dashboard(slug, game):
|
|
definitions = db.list_definitions(slug)
|
|
# Détail complet (avec ses champs) de chaque objet, pour le panneau
|
|
# d'édition déplaçable (voir game_dashboard.html) ouvert par le crayon
|
|
# ✏️ de l'onglet Objets — un panneau par objet, pré-rendu ici et
|
|
# simplement montré/masqué en JS, plutôt qu'un aller-retour serveur à
|
|
# l'ouverture (voir openObjectEditPanel()).
|
|
definitions_full = {d["id"]: db.get_definition(slug, d["id"]) for d in definitions}
|
|
|
|
# Pour l'onglet "Données" de ce même panneau (remplace data_list.html/
|
|
# object_view.py, retirés) : les lignes déjà enregistrées de chaque
|
|
# objet, les libellés lisibles de ses champs relation (pour l'affichage
|
|
# du tableau) et les options possibles de ces mêmes champs relation
|
|
# (pour le formulaire "Ajouter une entrée").
|
|
rows_by_definition = {}
|
|
relation_labels_by_definition = {}
|
|
relation_options_by_definition = {}
|
|
referenced_by_definition = {}
|
|
for d in definitions:
|
|
full = definitions_full[d["id"]]
|
|
rows_by_definition[d["id"]] = db.list_rows(slug, full)
|
|
relation_labels = {}
|
|
relation_options = {}
|
|
for f in full["fields"]:
|
|
if f["type"] == "relation":
|
|
options = db.relation_options(slug, f["relation_definition_id"])
|
|
relation_labels[f["id"]] = {opt["id"]: opt["label"] for opt in options}
|
|
relation_options[f["id"]] = options
|
|
relation_labels_by_definition[d["id"]] = relation_labels
|
|
relation_options_by_definition[d["id"]] = relation_options
|
|
referenced_by_definition[d["id"]] = db.definitions_referencing(slug, d["id"])
|
|
|
|
screen_list = screens.list_screens(slug)
|
|
element_types = screens.list_element_types(slug)
|
|
element_type_usage = {t["id"]: screens.element_type_usage_count(slug, t["id"]) for t in element_types}
|
|
variables = db.list_global_variables(slug)
|
|
return render_template(
|
|
"game_dashboard.html", game=game, definitions=definitions,
|
|
definitions_full=definitions_full,
|
|
rows_by_definition=rows_by_definition,
|
|
relation_labels_by_definition=relation_labels_by_definition,
|
|
relation_options_by_definition=relation_options_by_definition,
|
|
referenced_by_definition=referenced_by_definition,
|
|
screen_list=screen_list, element_types=element_types,
|
|
element_type_usage=element_type_usage, variables=variables,
|
|
variable_types=db.GLOBAL_VARIABLE_TYPES, field_types=db.FIELD_TYPES,
|
|
)
|