From 7a43ca00ad24a833ac7afe47edf7968c6cd34e74 Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 10:31:36 -0400 Subject: [PATCH 1/3] barre-apps v0.1.6 : fragment (avatar bouton compte, menu par defaut demande, nonce CSP inchange) --- app/templates/_draco_bar.html | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/app/templates/_draco_bar.html b/app/templates/_draco_bar.html index da47292..5f181e6 100644 --- a/app/templates/_draco_bar.html +++ b/app/templates/_draco_bar.html @@ -1,5 +1,5 @@ {# Barre d'apps commune dracodev — Fusion ACC-1.1 (issue #17). - Snippet FIGÉ vendangé depuis Projets/dracodev-commons v0.1.4 + Snippet FIGÉ vendangé depuis Projets/dracodev-commons v0.1.6 (ui/barre-apps/) : ne pas modifier la structure ici ; toute évolution passe par une nouvelle version de commons. CSS/JS : /static/css/draco-barre.css, /static/js/vendor/draco-barre.js. @@ -56,8 +56,8 @@ ✦Spark - - {{ user.full_name[:1].upper() if user and user.get('full_name') else 'F' }} + + @@ -87,7 +87,13 @@ return; } if (act === "palette") { dire("Recherche fédérée ⌘K : arrive avec la fédération (programme Fusion)."); return; } - if (act === "menu") { dire("Menu commun : arrive avec la fédération (programme Fusion)."); return; } + /* v0.1.6 : le toast placeholder "fédération" est remplacé + par le menu par défaut du nouveau JS — retourner false le + demande explicitement (un onAction existant garde sinon la + main). Contenu : Console agent + applications, URL résolues + donc dérivées -dev sur un hôte -dev. Nonce CSP du script + inchangé. */ + if (act === "menu") { return false; } if (act === "spark") { if (window.DRACO_PANNEAU) { window.DRACO_PANNEAU.toggle(); } else { dire("Spark : le panneau n'a pas pu se charger."); } -- 2.54.0 From ecafeecda02dfae5a70c610c6081bbddb49ffa66 Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 10:31:41 -0400 Subject: [PATCH 2/3] barre-apps v0.1.6 : JS vendange (derivation -dev, menus) --- static/js/vendor/draco-barre.js | 443 +++++++++++++++++++++++++++++--- 1 file changed, 403 insertions(+), 40 deletions(-) diff --git a/static/js/vendor/draco-barre.js b/static/js/vendor/draco-barre.js index b5e454b..86ace8f 100644 --- a/static/js/vendor/draco-barre.js +++ b/static/js/vendor/draco-barre.js @@ -1,5 +1,10 @@ /* Barre d'apps commune dracodev — comportement (v0.1.0, ACC-0.2 ; - * v0.1.3 : menu des applications ouvert par la marque ✦). + * v0.1.3 : menu des applications ouvert par la marque ✦ ; + * v0.1.5 : noms publics par configuration — aucun nom public d'un + * environnement particulier n'est codé en dur, voir « URL » ci-dessous ; + * v0.1.6 (prochaine publication — VERSION non bumpée dans cette PR, + * la publication est séparée) : dérivation -dev par l'hôte courant, + * menu « ••• » par défaut et menu compte fonctionnels, voir ci-dessous). * * Aucun gestionnaire inline : un seul écouteur délégué sur le document * (patron validé par le prototype — les onclick du HTML généré sont @@ -10,19 +15,158 @@ * current: "tiktak", // app courante * domain: "pro", // domaine actif * counts: { tiktak: 3, kanbante: 3, alertes: 3, spark: 0 }, + * user: "Bruno", // nom affiché (v0.1.6) ; + * // ou { display_name: "Bruno", username: "bruno" } + * urls: { // bases des applications + * obsigate: "https://og.dracodev.net/", + * flowdeck: "https://flowdeck.dracodev.net/", + * tiktak: "https://tiktak.dracodev.net/", + * kanbante: "https://kanbante.dracodev.net/", + * agent: "https://agent.dracodev.net/", + * spark: "https://spark.dracodev.net/" + * }, * onAction: function (act, el) { … } // l'app relaie les actions * } // qu'elle ne connaît pas + * + * URL des applications (contrat dev/prod, v0.1.5 puis v0.1.6) — + * résolution, dans l'ordre STRICT, pour chaque app : + * 1. DRACO_BAR_CONFIG.urls., injectée par l'app hôte (rendu + * serveur ou client) depuis SA configuration d'environnement — + * explicite, donc prioritaire, même sur un hôte -dev ; + * 2. (v0.1.6) SI l'hôte courant est un hôte -dev dracodev.net + * (première étiquette se terminant par -dev : tiktak-dev, + * kanbante-dev, og-dev, flowdeck-dev, agent-dev…), l'URL sœur + * dérivée avec -dev (voir DEV_URLS). C'est le correctif du bug + * constaté sur tiktak-dev / kanbante-dev, où les liens suivaient + * les noms SANS -dev faute de configuration explicite ; + * 3. le href déjà rendu dans le fragment HTML, c.-à-d. le jeton + * {{URL_}} remplacé côté serveur par l'app hôte ; + * 4. le défaut officiel ci-dessous (production, noms SANS suffixe). + * Un jeton {{URL_…}} non remplacé n'est jamais une URL : il est ignoré + * partout (config injectée comme href rendu) et ne peut pas être exposé. + * Cas spark (v0.1.6) : AUCUNE dérivation inventée — aucun hôte + * spark-dev connu ; sur un hôte -dev, spark retombe sur l'étape 3 + * (href rendu) puis 4 (défaut prod), sauf config explicite (étape 1). + * Les clés agent et spark ne correspondent à aucun onglet de la barre : + * elles sont résolues et exposées via DRACO_BAR.urls pour le panneau + * Spark (panneau-agent), qui suit le même contrat d'injection. * Actions émises (data-act) : rail, palette, domaine (data-dom), - * alertes, spark, menu, rappel-entete. L'app intégratrice décide de - * chacune (ouvrir la palette, le panneau Spark, changer de domaine…). - * Action INTERNE (jamais relayée) : apps — la marque ✦ ouvre le menu - * des applications, construit depuis les onglets ; c'est le moyen de - * changer d'app en mobile, où les onglets sont repliés (v0.1.2). + * alertes, spark, rappel-entete. L'app intégratrice décide de chacune + * (ouvrir la palette, le panneau Spark, changer de domaine…). + * Actions INTERNES (jamais relayées comme avant) : apps — la marque ✦ + * ouvre le menu des applications, construit depuis les onglets ; + * c'est le moyen de changer d'app en mobile, où les onglets sont + * repliés (v0.1.2). Menu « ••• » et compte : voir ci-dessous. + * + * Menu « ••• » (v0.1.6) — audit des hôtes : ObsiGate est le seul hôte + * connu à gérer l'action "menu" via onAction (il déclenche son propre + * bouton d'en-tête #header-menu-btn) ; les autres hôtes ne la gèrent + * pas et le bouton restait mort (relais vers un onAction absent, puis + * événement draco:bar sans écouteur). Comportement désormais : + * - sans onAction : un menu par défaut FONCTIONNEL s'ouvre — accès à + * la console agent (URL agent résolue, donc dérivée -dev sur un + * hôte -dev) et aux quatre applications (URL résolues) ; fermeture + * par clic extérieur, Échap ou choix d'un lien ; + * - avec onAction : l'hôte garde la main (comportement historique, + * zéro régression pour ObsiGate) ; il peut demander explicitement + * le menu par défaut en retournant false pour l'action "menu". + * Menu compte (v0.1.6) — l'avatar, auparavant un mort affichant + * un « B » codé en dur dans le fragment, est un vrai