From 59247694d6dc6b268d2157c3f754cfafac06e3f0 Mon Sep 17 00:00:00 2001 From: william Date: Tue, 25 Aug 2026 10:45:42 +0200 Subject: [PATCH] =?UTF-8?q?Applique=20le=20gabarit=20sobre/compact/sans=20?= =?UTF-8?q?d=C3=A9filement=20=C3=A0=20toutes=20les=20pages=20hors=20=C3=A9?= =?UTF-8?q?diteur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Généralise le principe déjà en place pour l'édition d'objet (la page n'occupe jamais plus que la hauteur de la fenêtre, seules ses zones internes défilent) à toutes les pages restantes : liste des jeux, tableau de bord d'un jeu, écrans, éléments de jeu, variables, nouvel objet, formulaire de données, tableau des données d'un objet. Seuls l'éditeur d'écran/d'élément et l'aperçu jouable restent en dehors (déjà exclus par leur propre gabarit plein écran, ou pas concernés). Nouveau gabarit générique à une colonne (body.pageBody + .content-page + .scrollArea) sur le même principe que .content-objectEdit, plus une variante .formScroll pour un formulaire long à défilement interne (liste de champs d'un nouvel objet, formulaire de données) tout en gardant les boutons d'action toujours visibles. Les listes/tableaux remplacés par le format dense .fieldsTable (déjà utilisé pour le tableau de bord) pour rester cohérent et afficher plus de lignes à l'écran. Co-Authored-By: Claude Sonnet 5 --- static/style.css | 34 +++++++++++ templates/data_form.html | 12 ++-- templates/data_list.html | 20 ++++--- templates/element_types.html | 104 ++++++++++++++++------------------ templates/game_variables.html | 62 +++++++++++--------- templates/index.html | 63 ++++++++++---------- templates/object_form.html | 22 +++---- templates/screens_list.html | 74 ++++++++++++------------ 8 files changed, 216 insertions(+), 175 deletions(-) diff --git a/static/style.css b/static/style.css index 5c6677f3..2fafe8c5 100644 --- a/static/style.css +++ b/static/style.css @@ -128,6 +128,40 @@ body.objectEditBody > main.content{ flex:1 1 auto; min-height:0; overflow:hidden .fieldsTable td input, .fieldsTable td select{ min-width:120px; width:auto; } .fieldsTableActions{ display:flex; gap:6px; } +/* ---------- Gabarit générique "page classique" (toutes les pages sauf + l'éditeur d'écran/d'élément et l'aperçu jouable) : même principe que + body.objectEditBody ci-dessus, mais à UNE colonne — un en-tête fixe + (titre, formulaire de création...) suivi d'UNE zone qui défile pour son + propre compte (.scrollArea), jamais la page elle-même. Permet d'afficher + beaucoup de lignes (jeux, écrans, objets, variables, données...) sans + perdre le formulaire de création ou le fil d'Ariane hors de l'écran. */ +body.pageBody{ display:flex; flex-direction:column; height:100vh; margin:0; overflow:hidden; } +body.pageBody > .topbar, body.pageBody > .breadcrumbBar{ flex:0 0 auto; } +body.pageBody > main.content{ flex:1 1 auto; min-height:0; overflow:hidden; display:flex; flex-direction:column; } + +.content-page{ width:100%; display:flex; flex-direction:column; min-height:0; flex:1 1 auto; } +.content-page > *{ flex:0 0 auto; } +.content-page > .scrollArea{ flex:1 1 auto; min-height:0; overflow-y:auto; } + +/* Cas d'un formulaire long à champs dynamiques (ex. object_form.html) : le + FORMULAIRE lui-même doit grandir pour occuper l'espace restant, et + seule sa liste de champs (.scrollArea, à l'intérieur) défile — le champ + "nom" et les boutons "+ Ajouter"/"Créer" restent toujours visibles. */ +.content-page > form.formScroll{ flex:1 1 auto; min-height:0; display:flex; flex-direction:column; } +.formScroll > *{ flex:0 0 auto; } +.formScroll > .scrollArea{ flex:1 1 auto; min-height:0; overflow-y:auto; } + +@media (max-width: 820px){ + /* Même logique de repli que .content-objectEdit : sous cette largeur, + mieux vaut une page qui défile normalement qu'une zone interne trop + comprimée. */ + body.pageBody{ height:auto; overflow:visible; } + body.pageBody > main.content{ overflow:visible; } + .content-page > .scrollArea{ overflow:visible; } + .content-page > form.formScroll{ flex:none; } + .formScroll > .scrollArea{ overflow:visible; } +} + /* ---------- Éditeur d'écrans (façon Elementor/Bricks) ---------- */ /* La page de l'éditeur d'écran ne doit jamais défiler elle-même : elle occupe exactement la hauteur de la fenêtre (topbar + zone de travail), et diff --git a/templates/data_form.html b/templates/data_form.html index 74c85b5a..366d2e62 100644 --- a/templates/data_form.html +++ b/templates/data_form.html @@ -1,5 +1,7 @@ {% extends "base.html" %} {% block title %}{{ 'Modifier' if row else 'Ajouter' }} — {{ definition.name }}{% endblock %} +{% block content_class %}content-page{% endblock %} +{% block body_class %}pageBody{% endblock %} {% block breadcrumb %}
  • {{ game.name }}
  • {{ definition.name }}
  • @@ -7,9 +9,10 @@ {% endblock %} {% block content %}

    {{ 'Modifier l\'entrée #' ~ row.id if row else 'Ajouter une entrée' }} — {{ definition.name }}

    -

    Formulaire généré automatiquement à partir de la définition de cet objet — aucun champ n'est codé en dur ici.

    +

    Formulaire généré automatiquement à partir de la définition de cet objet — aucun champ n'est codé en dur ici.

    -
    + +
    {% for f in definition.fields %} {% set col = f.name|colname %} {% set current = row[col] if row else none %} @@ -52,9 +55,10 @@
    {% endfor %} + -
    - +
    +
    {% endblock %} diff --git a/templates/data_list.html b/templates/data_list.html index 0bbeb939..285d1cb8 100644 --- a/templates/data_list.html +++ b/templates/data_list.html @@ -1,5 +1,7 @@ {% extends "base.html" %} {% block title %}{{ definition.name }} — {{ game.name }}{% endblock %} +{% block content_class %}content-page{% endblock %} +{% block body_class %}pageBody{% endblock %} {% block breadcrumb %}
  • {{ game.name }}
  • {{ definition.name }}
  • @@ -8,10 +10,10 @@

    {{ definition.name }} ✏️

    -

    Table SQL : {{ definition.table_name }} — {{ definition.fields|length }} champ(s)

    +

    Table SQL : {{ definition.table_name }} — {{ definition.fields|length }} champ(s)

    {% if referenced_by %} -
    +
    ⚠️ D'autres objets ont une relation vers « {{ definition.name }} » : {{ referenced_by|map(attribute='name')|join(', ') }}. La suppression de cet objet est bloquée tant que ces relations existent. @@ -19,16 +21,17 @@ {% endif %} {% if blocked_row_id %} -
    +
    ⚠️ Impossible de supprimer l'entrée #{{ blocked_row_id }} : elle est référencée par {% for ref in blocked_row_refs %}{{ ref.count }} entrée(s) de « {{ ref.definition_name }} » (champ « {{ ref.field_name }} »){% if not loop.last %}, {% endif %}{% endfor %}. Modifie ou supprime d'abord ces entrées.
    {% endif %} -+ Ajouter une entrée ++ Ajouter une entrée -

    Données enregistrées

    +

    Données enregistrées

    +
    {% if rows %} {% macro row_field_display(f, r) %} {%- if f.type == 'relation' -%} @@ -39,8 +42,8 @@ {{ r[f.name|colname] }} {%- endif -%} {% endmacro %} -
    - +
    +
    @@ -91,8 +94,9 @@ {% endfor %} {% else %} -

    Aucune donnée enregistrée pour l'instant.

    +

    Aucune donnée enregistrée pour l'instant.

    {% endif %} +
    #