From b039657b84960c8ac7a970476b408f6679813d75 Mon Sep 17 00:00:00 2001 From: Spark Date: Wed, 4 Nov 2026 21:49:59 +0000 Subject: [PATCH 1/3] =?UTF-8?q?Kanbante=200.45.9=20:=20barre=20v0.3.0=20?= =?UTF-8?q?=E2=80=94=20liens=20Hub=20du=20menu=20compte,=20Profil=20devien?= =?UTF-8?q?t=20un=20lien=20Hub=20(branche=20/profile=20retir=C3=A9e),=20UR?= =?UTF-8?q?L=20Hub=20r=C3=A9solue=20comme=20les=20s=C5=93urs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/config.py | 13 ++++- app/main.py | 1 + app/templates/_draco_bar.html | 33 ++++++++--- static/css/draco-barre.css | 4 ++ static/js/draco-barre.js | 101 +++++++++++++++++++++++++++++----- 5 files changed, 126 insertions(+), 26 deletions(-) diff --git a/app/config.py b/app/config.py index 5ec94f8..1a42a32 100644 --- a/app/config.py +++ b/app/config.py @@ -181,7 +181,7 @@ from urllib.parse import urlparse BASE_DIR = Path(__file__).resolve().parent.parent -APP_VERSION = "0.45.7" +APP_VERSION = "0.45.9" def _env_bool(name: str, default: bool) -> bool: @@ -236,7 +236,7 @@ def _env_wip_limits(name: str) -> dict[str, int]: # du service (élargie en 0.32.2) ; 4) défaut officiel. _MOTIF_HOTE_AGENT = re.compile(r"agent([a-z0-9-]*)\.dracodev\.net") _MOTIF_HOTE_PUBLIC = re.compile( - r"(?:og|flowdeck|tiktak|kanbante|shaarit|agent)([a-z0-9-]*)\.dracodev\.net" + r"(?:og|flowdeck|tiktak|kanbante|shaarit|agent|hub)([a-z0-9-]*)\.dracodev\.net" ) @@ -311,6 +311,7 @@ class UrlsDraco: flowdeck_url: str tiktak_url: str shaarit_url: str # ShaarIt (barre v0.2.0 ; explicite = DRACO_SHAARIT_URL) + hub_url: str # Hub (barre v0.3.0 ; explicite = DRACO_HUB_URL) public_url: str # Kanbante elle-même (KANBANTE_PUBLIC_URL) agent_url: str # base du service d'agents (panneau + CSP) @@ -352,6 +353,7 @@ def resoudre_urls_draco( shaarit_url=resoudre( "DRACO_SHAARIT_URL", "shaarit", base.shaarit_url ), + hub_url=resoudre("DRACO_HUB_URL", "hub", base.hub_url), public_url=resoudre( "KANBANTE_PUBLIC_URL", "kanbante", base.public_url ), @@ -402,6 +404,7 @@ class Settings: flowdeck_url: str = "https://flowdeck.dracodev.net" tiktak_url: str = "https://tiktak.dracodev.net" shaarit_url: str = "https://shaarit.dracodev.net" + hub_url: str = "https://hub.dracodev.net" agent_url: str = "https://agent.dracodev.net" archive_suggest_days: int = 180 agent_evenements_url: str = "https://agent.dracodev.net/api/v1/evenements" @@ -512,6 +515,12 @@ def _env_settings() -> Settings: "https://shaarit.dracodev.net", suffixe_agent, ), + hub_url=_url_soeur_draco( + "DRACO_HUB_URL", + "hub", + "https://hub.dracodev.net", + suffixe_agent, + ), agent_url=agent_url, archive_suggest_days=_env_int("KANBANTE_ARCHIVE_SUGGEST_DAYS", 180), agent_evenements_url=agent_evenements_url, diff --git a/app/main.py b/app/main.py index 1b894dc..57d47c0 100644 --- a/app/main.py +++ b/app/main.py @@ -2251,6 +2251,7 @@ def render( "tiktak": _urls.tiktak_url, "kanbante": _urls.public_url, "shaarit": _urls.shaarit_url, + "hub": _urls.hub_url, }, ) context.setdefault("agent_url", _urls.agent_url) diff --git a/app/templates/_draco_bar.html b/app/templates/_draco_bar.html index 706c3f2..842396a 100644 --- a/app/templates/_draco_bar.html +++ b/app/templates/_draco_bar.html @@ -1,13 +1,19 @@ {# Barre d'apps commune dracodev — Fusion ACC-1 (issue kanbante#28). - Snippet vendangé depuis Projets/dracodev-commons v0.2.0 - (ui/barre-apps/ @70c837a, PR commons #7) : structure du fragment + Snippet vendangé depuis Projets/dracodev-commons v0.3.0 + (ui/barre-apps/, branche hub-menu-compte-v0-3-0 de la PR commons + #9 — HUB-1, fusion #115) : v0.3.0 = menu compte à liens Hub + (Télécharger, À Propos, Aides, Profil-lien ; base + draco_urls.hub en urls.hub ci-dessous) et branche « profil » + de onAction RETIRÉE (voir le commentaire dans la configuration — + la page /profile de Kanbante existe toujours, elle n'est plus + la cible du menu compte). Structure du fragment commons portée ici ; seule adaptation locale (0.32.0, dev/prod) = les URL des apps et l'adresse du service d'agents sont INJECTÉES par l'hôte depuis app.config (draco_urls / agent_url, défauts = noms officiels) — aucun nom public codé en dur dans ce gabarit ni dans draco-panneau.js. Le CSS et le JS, eux, sont vendangés VERBATIM (static/css/draco-barre.css, - static/js/draco-barre.js — voir CHANGELOG 0.45.6). + static/js/draco-barre.js — voir CHANGELOG 0.45.9). v0.2.0 (phase 3 ShaarIt) : nouvel onglet ShaarIt (data-app="shaarit", draco_urls.shaarit), APRÈS Kanbante et AVANT l'onglet agent ; couleur émeraude #059669, logo @@ -112,6 +118,12 @@ recherche partout : page /recherche (Fusion #68). */ window.DRACO_BAR_CONFIG = { current: "kanbante", + /* Barre v0.3.0 (HUB-1) : base du Hub résolue par l'hôte + (draco_urls.hub — DRACO_HUB_URL explicite, hôte de la + requête, dérivation par l'agent, défaut officiel) ; + le Hub n'a pas d'onglet, urls.hub alimente les liens + du menu compte. */ + urls: { hub: "{{ draco_urls.hub }}/" }, /* v0.1.6 : user = initiale auth_user ou K (draco_avatar). Sans cfg.user, le nouveau JS dériverait l'initiale du title ("Opérateur Kanbante" → "O"), qui est un libellé de rôle et @@ -132,12 +144,15 @@ }; if (act === "domaine") { try { localStorage.setItem("draco_domain", el.dataset.dom); } catch (e) { } return; } if (act === "rail") { var b = document.getElementById("side-collapse"); if (b) b.click(); return; } - /* Menu compte (image 2) : ces deux actions étaient relayées - par draco-barre.js mais jamais prises en charge ici — - le menu se fermait sans rien faire. En mobile, c'est le - seul accès au profil et à la déconnexion (le pied de - sidebar était masqué). */ - if (act === "profil") { location.href = "/profile"; return; } + /* Menu compte — barre v0.3.0 (HUB-1) : « Profil » n'est + PLUS relayé par la barre : c'est un vrai lien vers + /profil (un seul Profil, celui du Hub — décision + du plan Hub). L'ancienne branche onAction("profil") + qui menait à la page /profile propre à Kanbante est + donc RETIRÉE : la page /profile elle-même continue + d'exister (jetons API, réglages du compte Kanbante), + mais elle n'est plus la cible du menu compte de la + barre. « Déconnexion » reste relayée, inchangée. */ if (act === "deconnexion") { location.href = "/logout"; return; } if (act === "palette") { location.href = "/recherche"; return; } if (act === "alertes") { if (window.DRACO_ALERTES) { window.DRACO_ALERTES.open(); } else { location.href = "/activity"; } return; } diff --git a/static/css/draco-barre.css b/static/css/draco-barre.css index 8c9927c..c01145f 100644 --- a/static/css/draco-barre.css +++ b/static/css/draco-barre.css @@ -20,6 +20,10 @@ le clair via data-theme="light" héritait quand même du sombre système (piège constaté dans les copies vendangées de Kanbante/Flowdeck ; les re-vendanges de la v0.2.0 le corrigent). + v0.3.0 (HUB-1) : aucun style nouveau — les liens du Hub du menu + compte (Télécharger, À Propos, Aides, Profil) réutilisent + .draco-menu-item (déjà ancre-compatible : text-decoration none) + et le séparateur .draco-menu-sep du menu des applications. Jetons repris du prototype validé Console v7.2. Thème : clair par défaut, sombre via [data-theme="dark"] sur ou prefers-color-scheme si l'app intégratrice ne force rien diff --git a/static/js/draco-barre.js b/static/js/draco-barre.js index 4e77833..3de0f03 100644 --- a/static/js/draco-barre.js +++ b/static/js/draco-barre.js @@ -14,6 +14,21 @@ * contrat que les autres apps), entrée APP_LABELS ; l'onglet * (data-app="shaarit", après Kanbante, avant agent) est repris * automatiquement par la construction du menu de la marque. + * v0.3.0 (carte HUB-1, fusion #115) : le Hub, point central de la + * suite — nouvelle clé d'URL « hub » (jeton {{URL_HUB}} côté hôte, + * DRACO_BAR_CONFIG.urls.hub), défaut officiel + * https://hub.dracodev.net/, dérivation -dev hub-dev comme les + * sœurs. Le menu compte gagne trois vrais liens (patron + * buildAppsMenu : , classe draco-menu-item) — Télécharger + * → /telecharger, À Propos → /a-propos, Aides → + * /aide — et « Profil » devient lui aussi un lien, vers + * /profil (il n'est plus relayé aux hôtes : un seul Profil, + * celui du Hub). « Déconnexion » reste l'action relayée + * (data-compte-act="deconnexion" / onAction), inchangée. + * refreshMenuHrefs() resynchronise aussi les liens du Hub à + * l'ouverture des menus. Le Hub n'a pas d'onglet dans la barre : + * comme spark, sa clé est résolue et exposée via DRACO_BAR.urls, + * sans étape « href rendu » (voir « URL » 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 @@ -33,7 +48,8 @@ * kanbante: "https://kanbante.dracodev.net/", * shaarit: "https://shaarit.dracodev.net/", * agent: "https://agent.dracodev.net/", - * spark: "https://spark.dracodev.net/" + * spark: "https://spark.dracodev.net/", + * hub: "https://hub.dracodev.net/" * }, * onAction: function (act, el) { … } // l'app relaie les actions * } // qu'elle ne connaît pas @@ -67,6 +83,12 @@ * la marque et DRACO_BAR.urls. Même résolution pour shaarit (v0.2.0) : * explicite > dérivation -dev shaarit-dev > href rendu * ({{URL_SHAARIT}}) > défaut officiel. + * Cas hub (v0.3.0) : PAS d'onglet, donc pas d'étape « href rendu » — + * explicite (DRACO_BAR_CONFIG.urls.hub, alimenté par le jeton + * {{URL_HUB}} remplacé côté serveur par l'hôte) > dérivation -dev + * hub-dev sur hôte -dev > défaut officiel + * https://hub.dracodev.net/. La base résolue sert les quatre liens + * du menu compte (telecharger, a-propos, aide, profil). * Actions émises (data-act) : rail, palette, domaine (data-dom), * alertes, spark, rappel-entete. L'app intégratrice décide de chacune * (ouvrir la palette, le panneau Spark, changer de domaine…). @@ -141,6 +163,14 @@ * mais le menu affiche l'identité même sans gestionnaire hôte. * Accessibilité : vrais