fix: side peek des bases repasse en vanilla JS + largeur 1100px standard (v7.49.0)
- Panneau peek: les bindings Alpine (x-data absent du conteneur) rendaient loovverture et le redimensionnement inoperants -> cblage direct sur le document. - Helper unique window.fdWirePeekResize (app.js): pointer capture, 300px-90vw, clic=fermer, largeur persiste fd_peek_width partagee entre les 4 peeks. - database-table-container margin:0 (tableau colle a gauche, marge Library). - .lib-container remonte dans app.css (trash etait pleine largeur), .db-index 1100px. - ObsiGate verifie sans code: creation .xlsx OK (openpyxl, #186).
This commit is contained in:
+38
-1
@@ -6,10 +6,46 @@ les `|safe` du codebase étaient des no-op.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import pathlib
|
||||
from contextvars import ContextVar
|
||||
|
||||
from jinja2 import Environment, FileSystemLoader, select_autoescape
|
||||
from jinja2 import Environment, FileSystemLoader, Undefined, select_autoescape
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class LoggingUndefined(Undefined):
|
||||
"""Undefined qui se rend comme une chaîne vide mais **journalise**.
|
||||
|
||||
v7.46.0 : avec l'`Undefined` par défaut, une variable mal orthographiée
|
||||
(ou absente du contexte de la route) rendait `""` sans aucune trace — c'est
|
||||
exactement ce qui a rendu le bug du bouton Home invisible (``local_workspaces``
|
||||
absent ⇒ `/workspaces`` en silence). ``StrictUndefined`` est inutilisable ici
|
||||
(40+ templates optionnelles, ex. ``embed_mode``), donc on garde le rendu et
|
||||
on rend le silence visible dans les logs.
|
||||
"""
|
||||
|
||||
__slots__ = ()
|
||||
|
||||
def _warn(self) -> None:
|
||||
logger.warning("Jinja: variable non définie utilisée dans un template: %r", self._undefined_name)
|
||||
|
||||
def __str__(self) -> str:
|
||||
self._warn()
|
||||
return ""
|
||||
|
||||
def __bool__(self) -> bool:
|
||||
self._warn()
|
||||
return False
|
||||
|
||||
def __iter__(self):
|
||||
self._warn()
|
||||
return iter(())
|
||||
|
||||
def __len__(self) -> int:
|
||||
self._warn()
|
||||
return 0
|
||||
|
||||
# A20 : nonce de script par requête, posé par le middleware CSP, lu par les
|
||||
# templates via `{{ csp_nonce() }}` (vide hors requête — pas de header CSP
|
||||
@@ -25,6 +61,7 @@ CSRF_TOKEN: ContextVar[str] = ContextVar("csrf_token", default="")
|
||||
ENV = Environment(
|
||||
loader=FileSystemLoader("app/templates"),
|
||||
autoescape=select_autoescape(["html"]),
|
||||
undefined=LoggingUndefined,
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user