/* Barre d'apps commune dracodev — comportement (v0.1.0, ACC-0.2 ; * 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 trois points par défaut et menu compte fonctionnels, voir ci-dessous ; * correctif fusion #70 (SANS bump de version, publication séparée) : * bouton trois points et son menu par défaut SUPPRIMÉS, « Console Spark » * ajoutée au menu de la marque, fermeture/focus corrigés (voir * « Menu des applications », « Focus » et « Écouteurs globaux »). * * 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 * proscrits dans tout le programme). * * Configuration attendue avant le chargement : * window.DRACO_BAR_CONFIG = { * 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). * La clé spark ne correspond à aucun onglet de la barre : elle est * résolue et exposée via DRACO_BAR.urls pour le panneau Spark * (panneau-agent), qui suit le même contrat d'injection. La clé agent, * elle, a un onglet depuis le chantier 5 (ordre : ObsiGate, Flowdeck, * TikTak, Kanbante, Console Spark) : elle suit donc l'étape « href * rendu » comme les autres onglets, en plus d'alimenter le menu de * la marque et DRACO_BAR.urls. * 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…). * Actions INTERNES (jamais relayées comme avant) : apps — la marque ✦ * ouvre le menu des applications, construit depuis les onglets, plus * (depuis le correctif #70) une entrée « Console Spark » vers la * console de l'agent commun (URL agent résolue, voir ci-dessous) ; * c'est le moyen de changer d'app en mobile, où les onglets sont * repliés (v0.1.2). Menu compte : voir ci-dessous. * L'action « menu » n'est PLUS émise nulle part : le bouton trois points * a été supprimé (#70) ; les branches onAction("menu") des hôtes * (TikTak/Kanbante/Flowdeck : retour false pour le menu par défaut ; * ObsiGate : clic #header-menu-btn) sont donc mortes et ont été * retirées des gabarits hôtes — le menu natif d'ObsiGate * (#header-menu-btn) lui-même n'est pas touché. * * Retrait du bouton trois points (correctif fusion #70) — le bouton et * son menu par défaut (console agent + applications) sont supprimés * du fragment, du JS et du CSS. La console agent reste joignable par * l'entrée « Console Spark » du menu de la marque (ci-dessous) et * par le bouton Spark (panneau), donc aucun accès n'est perdu. * Menu des applications (v0.1.3, étendu #70) — construit depuis les * onglets présents dans la barre, puis une entrée « Console Spark » * (logo ✦, rôle « Agent commun ») APRÈS Kanbante, vers l'URL agent * résolue : 1) config explicite DRACO_BAR_CONFIG.urls.agent, * 2) dérivation -dev agent-dev sur hôte -dev, 3) href rendu de * l'onglet « Console Spark » (chantier 5, data-app="agent"), * 4) défaut officiel prod https://agent.dracodev.net/. * AUCUN hôte spark-dev n'est inventé : * la clé spark, elle, suit toujours son propre contrat (explicite > * href rendu > défaut prod) et ne sert qu'au panneau Spark. * Focus (correctif #70) — ouverture au clavier : Entrée sur la marque * (clic natif du lien) ; Espace sur la marque (keydown dédié, car un * lien ne s'active pas à l'Espace) : ouvre le menu et met le focus * sur son premier item. Fermeture : Échap (focus rendu au déclencheur * qui avait ouvert le menu : la marque pour le menu apps, l'avatar * pour le menu compte), nouvel appui sur le déclencheur (le focus y * est déjà), choix d'un item, ou clic extérieur — ce dernier cas ne * déplace VOLONTAIREMENT pas le focus (l'utilisateur vient de cliquer * ailleurs : recherche, tâche… ; lui voler le focus casserait son * geste). aria-expanded est tenu à jour sur chaque déclencheur. * Écouteurs globaux (correctif #70, bug tiktak-dev) — les écouteurs * clic/Échap de la barre sont posés via EventTarget.prototype (voir * addGlobalListener), PAS via document.addEventListener. Cause * prouvée sur TikTak (app/static/js/app.js, navigation #89) : app.js * remplace document/window.addEventListener par un registre * (__tcDocWin) et chaque navigation douce appelle tcInit() puis * __tcTeardown(), qui SUPPRIME tous les écouteurs du registre — y * compris ceux de draco-barre.js (script defer, enregistré après le * tcInit() initial). La barre survit à la navigation (hors .layout * remplacé) mais ses gestionnaires sont morts : un menu ouvert avant * la navigation reste ouvert (Échap et clic extérieur sans effet) et * la marque, lien href="/", est interceptée par l'intercepteur SPA * brut de TikTak (__tcDocAdd, hors registre, donc survivant) comme * une navigation interne au lieu de basculer le menu. Les écouteurs * posés sur le prototype ne figurent pas dans le registre et ne sont * donc jamais supprimés par le teardown ; en complément, le gabarit * TikTak exclut désormais .draco-bar de l'intercepteur SPA, pour que * la marque ne déclenche plus de navigation douce. Les autres hôtes * (SSR, rechargement complet) ne sont pas concernés par le teardown * mais bénéficient du même code ; repli : si EventTarget.prototype * est indisponible (mini-DOM de tests), document.addEventListener * classique est utilisé. * Menu compte (v0.1.6) — l'avatar, auparavant un mort affichant * un « B » codé en dur dans le fragment, est un vrai