Merge pull request 'Flowdeck 7.84.10 : barre v0.2.0 — onglet ShaarIt + garde data-theme' (#45) from barre-v020-7-84-10 into main
FlowDeck CI / test (push) Failing after 1s
FlowDeck CI / docker (push) Skipped
FlowDeck CI / lint (push) Failing after 13s

This commit was merged in pull request #45.
This commit is contained in:
2026-11-04 11:16:39 -05:00
11 changed files with 126 additions and 18 deletions
+1
View File
@@ -38,6 +38,7 @@ OBSIGATE_CONSUMER_TOKEN=
DRACO_AGENT_URL= # Service d'agents Spark — défaut https://agent.dracodev.net ; dev : https://agent-dev.dracodev.net DRACO_AGENT_URL= # Service d'agents Spark — défaut https://agent.dracodev.net ; dev : https://agent-dev.dracodev.net
TIKTAK_URL= # TikTak (preset MCP, barre, refs) — défaut https://tiktak.dracodev.net ; dev : https://tiktak-dev.dracodev.net TIKTAK_URL= # TikTak (preset MCP, barre, refs) — défaut https://tiktak.dracodev.net ; dev : https://tiktak-dev.dracodev.net
KANBANTE_URL= # Kanbante (barre, refs) — défaut https://kanbante.dracodev.net ; dev : https://kanbante-dev.dracodev.net KANBANTE_URL= # Kanbante (barre, refs) — défaut https://kanbante.dracodev.net ; dev : https://kanbante-dev.dracodev.net
SHAARIT_URL= # ShaarIt (barre v0.2.0) — défaut https://shaarit.dracodev.net ; dev : https://shaarit-dev.dracodev.net
FLOWDECK_URL= # URL publique de CETTE instance — défaut : dérivée d'OAUTH_REDIRECT_URI, sinon https://flowdeck.dracodev.net ; dev : https://flowdeck-dev.dracodev.net FLOWDECK_URL= # URL publique de CETTE instance — défaut : dérivée d'OAUTH_REDIRECT_URI, sinon https://flowdeck.dracodev.net ; dev : https://flowdeck-dev.dracodev.net
# SSO draco (Fusion ACC-3.2) — secret partagé avec l'émettrice ObsiGate. # SSO draco (Fusion ACC-3.2) — secret partagé avec l'émettrice ObsiGate.
DRACO_SESSION_SECRET= DRACO_SESSION_SECRET=
+8
View File
@@ -1,3 +1,11 @@
## v7.84.10 (2026-11-03) — Barre commune v0.2.0 : onglet ShaarIt, garde data-theme
- **Barre d'apps v0.2.0 vendangée (dracodev-commons @70c837a)** : `static/css/draco-barre.css` et `static/js/vendor/draco-barre.js` remplacés verbatim par la v0.2.0 (hachages SHA-256 vérifiés contre la source) ; fragment `app/templates/_draco_bar.html` porté à la v0.2.0, le reste de son intégration Flowdeck (URL `draco_urls()`, `onAction`, nonce CSP, `asset_version`) est inchangé.
- **Onglet ShaarIt** : 5e application (bookmarks, réécriture Rust de Shaarli) — nouvel onglet `data-app="shaarit"` après Kanbante et avant l'onglet Console Spark, logo `static/img/logos/shaarit.svg` ajouté tel quel (copie verbatim de `ui/barre-apps/logos/` de commons). Le menu de la marque, construit depuis les onglets, l'inclut automatiquement.
- **URL ShaarIt par le même mécanisme que les autres** : `app/services/draco_urls.py` gagne la clé `shaarit` (défaut officiel `https://shaarit.dracodev.net` ; explicite `SHAARIT_URL` / `settings.shaarit_url` ; dérivation par l'hôte de la requête et par l'hôte de l'agent : `shaarit-dev` en dev) et `draco_urls().shaarit` alimente le href de l'onglet — aucune URL codée en dur hors des défauts officiels du résolveur.
- **⚠️ Changement de comportement visible — garde `data-theme`** : le CSS v0.2.0 préfixe ses blocs `prefers-color-scheme` par `html:not([data-theme])`. La copie v0.1.11 n'avait pas cette garde : c'est le **piège connu de Flowdeck** — système en mode sombre + `fd_theme` clair (`data-theme="light"` posé) ⇒ la barre s'affichait quand même en sombre. La re-vendange corrige ce point : la barre suit désormais le thème choisi dans l'app. Signalé en tête de la PR pour arbitrage à la fusion.
- **Cache** : le bump 7.84.9 → 7.84.10 change aussi `asset_version`, donc les navigateurs ne garderont pas l'ancienne barre.
## v7.84.9 (2026-10-29) — Barre commune : marque monochrome, anneau rouge avatar ## v7.84.9 (2026-10-29) — Barre commune : marque monochrome, anneau rouge avatar
- **Barre d'apps v0.1.11 vendangée (dracodev-commons)** : `static/css/draco-barre.css` remplacé verbatim par la v0.1.11 ; `static/js/vendor/draco-barre.js` inchangé (déjà identique à commons, JS inchangé en v0.1.11) ; fragment `app/templates/_draco_bar.html` porté à la v0.1.11, le reste de son intégration Flowdeck (URL `draco_urls()`, `onAction`, nonce CSP, `asset_version`) est inchangé. - **Barre d'apps v0.1.11 vendangée (dracodev-commons)** : `static/css/draco-barre.css` remplacé verbatim par la v0.1.11 ; `static/js/vendor/draco-barre.js` inchangé (déjà identique à commons, JS inchangé en v0.1.11) ; fragment `app/templates/_draco_bar.html` porté à la v0.1.11, le reste de son intégration Flowdeck (URL `draco_urls()`, `onAction`, nonce CSP, `asset_version`) est inchangé.
+1 -1
View File
@@ -1 +1 @@
7.84.9 7.84.10
+2
View File
@@ -156,6 +156,7 @@ class Settings(BaseSettings):
# DRACO_AGENT_URL=https://agent-dev.dracodev.net # DRACO_AGENT_URL=https://agent-dev.dracodev.net
# TIKTAK_URL=https://tiktak-dev.dracodev.net # TIKTAK_URL=https://tiktak-dev.dracodev.net
# KANBANTE_URL=https://kanbante-dev.dracodev.net # KANBANTE_URL=https://kanbante-dev.dracodev.net
# SHAARIT_URL=https://shaarit-dev.dracodev.net
# FLOWDECK_URL=https://flowdeck-dev.dracodev.net # FLOWDECK_URL=https://flowdeck-dev.dracodev.net
draco_sso_url: str = "https://og.dracodev.net" # ObsiGate (émettrice SSO) draco_sso_url: str = "https://og.dracodev.net" # ObsiGate (émettrice SSO)
# ── Coffre ObsiGate, côté consommateur Flowdeck (Phase 4, issue #22) ── # ── Coffre ObsiGate, côté consommateur Flowdeck (Phase 4, issue #22) ──
@@ -168,6 +169,7 @@ class Settings(BaseSettings):
draco_agent_url: str = "https://agent.dracodev.net" # service d'agents (Spark) draco_agent_url: str = "https://agent.dracodev.net" # service d'agents (Spark)
tiktak_url: str = "https://tiktak.dracodev.net" tiktak_url: str = "https://tiktak.dracodev.net"
kanbante_url: str = "https://kanbante.dracodev.net" kanbante_url: str = "https://kanbante.dracodev.net"
shaarit_url: str = "https://shaarit.dracodev.net"
# URL publique de CETTE instance ; vide = dérivée de # URL publique de CETTE instance ; vide = dérivée de
# OAUTH_REDIRECT_URI, puis d'APP_BASE_URL (si non locale), puis du # OAUTH_REDIRECT_URI, puis d'APP_BASE_URL (si non locale), puis du
# nom officiel. # nom officiel.
+12 -3
View File
@@ -12,6 +12,7 @@ car il est passé par ``environment:``/``env_file:``) :
DRACO_AGENT_URL=https://agent-dev.dracodev.net DRACO_AGENT_URL=https://agent-dev.dracodev.net
TIKTAK_URL=https://tiktak-dev.dracodev.net TIKTAK_URL=https://tiktak-dev.dracodev.net
KANBANTE_URL=https://kanbante-dev.dracodev.net KANBANTE_URL=https://kanbante-dev.dracodev.net
SHAARIT_URL=https://shaarit-dev.dracodev.net
FLOWDECK_URL=https://flowdeck-dev.dracodev.net (ou OAUTH_REDIRECT_URI) FLOWDECK_URL=https://flowdeck-dev.dracodev.net (ou OAUTH_REDIRECT_URI)
Priorité de résolution, à chaque appel (les tests et les modules qui Priorité de résolution, à chaque appel (les tests et les modules qui
@@ -19,15 +20,16 @@ lisaient déjà ``os.environ`` au moment de l'appel gardent ce
comportement) : variable d'environnement > ``app.config.settings`` > comportement) : variable d'environnement > ``app.config.settings`` >
défaut officiel. Aucun défaut ne contient ``-dev``. défaut officiel. Aucun défaut ne contient ``-dev``.
**Dérivation d'environnement (v7.82.3)** — pour les quatre URL **Dérivation d'environnement (v7.82.3)** — pour les URL
sœurs (ObsiGate, Flowdeck, TikTak, Kanbante), entre la configuration sœurs (ObsiGate, Flowdeck, TikTak, Kanbante, et ShaarIt depuis la
barre v0.2.0), entre la configuration
explicite et le défaut officiel : si l'origine de l'agent telle que explicite et le défaut officiel : si l'origine de l'agent telle que
l'app la connaît déjà (``AGENT_EVENEMENTS_URL``, via l'app la connaît déjà (``AGENT_EVENEMENTS_URL``, via
``agent_evenements_url()``) a un hôte de la forme ``agent_evenements_url()``) a un hôte de la forme
``agent<SUFFIXE>.dracodev.net`` (SUFFIXE éventuellement vide, ``agent<SUFFIXE>.dracodev.net`` (SUFFIXE éventuellement vide,
typiquement ``-dev``), l'URL sœur est dérivée : typiquement ``-dev``), l'URL sœur est dérivée :
``https://<slug><SUFFIXE>.dracodev.net`` (slugs : ``og``, ``https://<slug><SUFFIXE>.dracodev.net`` (slugs : ``og``,
``flowdeck``, ``tiktak``, ``kanbante``). Ainsi une installation dev ``flowdeck``, ``tiktak``, ``kanbante``, ``shaarit``). Ainsi une installation dev
qui ne déclare que l'agent pointe ses liens inter-apps en ``-dev`` qui ne déclare que l'agent pointe ses liens inter-apps en ``-dev``
sans quatre variables de plus. Si l'hôte de l'agent ne correspond sans quatre variables de plus. Si l'hôte de l'agent ne correspond
pas au motif (autre domaine, LAN, IP), **aucune dérivation** : on pas au motif (autre domaine, LAN, IP), **aucune dérivation** : on
@@ -94,6 +96,7 @@ OFFICIELLES = {
"agent": "https://agent.dracodev.net", "agent": "https://agent.dracodev.net",
"tiktak": "https://tiktak.dracodev.net", "tiktak": "https://tiktak.dracodev.net",
"kanbante": "https://kanbante.dracodev.net", "kanbante": "https://kanbante.dracodev.net",
"shaarit": "https://shaarit.dracodev.net",
"flowdeck": "https://flowdeck.dracodev.net", "flowdeck": "https://flowdeck.dracodev.net",
"gitea": "https://git.dracodev.net", "gitea": "https://git.dracodev.net",
} }
@@ -119,6 +122,7 @@ _SLUGS_SOEURS = {
"flowdeck": "flowdeck", "flowdeck": "flowdeck",
"tiktak": "tiktak", "tiktak": "tiktak",
"kanbante": "kanbante", "kanbante": "kanbante",
"shaarit": "shaarit",
} }
# Hôte de l'agent : agent<SUFFIXE>.dracodev.net (SUFFIXE = ``-dev``…). # Hôte de l'agent : agent<SUFFIXE>.dracodev.net (SUFFIXE = ``-dev``…).
@@ -274,6 +278,10 @@ def kanbante_url() -> str:
return _resoudre_soeur("KANBANTE_URL", "kanbante_url", "kanbante") return _resoudre_soeur("KANBANTE_URL", "kanbante_url", "kanbante")
def shaarit_url() -> str:
return _resoudre_soeur("SHAARIT_URL", "shaarit_url", "shaarit")
def gitea_url() -> str: def gitea_url() -> str:
return _resoudre("GITEA_URL", "gitea_url", "gitea") return _resoudre("GITEA_URL", "gitea_url", "gitea")
@@ -356,6 +364,7 @@ def toutes() -> dict[str, str]:
"agent": agent_url(), "agent": agent_url(),
"tiktak": tiktak_url(), "tiktak": tiktak_url(),
"kanbante": kanbante_url(), "kanbante": kanbante_url(),
"shaarit": shaarit_url(),
"flowdeck": flowdeck_url(), "flowdeck": flowdeck_url(),
"gitea": gitea_url(), "gitea": gitea_url(),
} }
+17 -4
View File
@@ -1,7 +1,8 @@
{# Barre d'apps commune dracodev — Fusion ACC-1.1 (issue #17). {# Barre d'apps commune dracodev — Fusion ACC-1.1 (issue #17).
Snippet FIGÉ vendangé depuis Projets/dracodev-commons v0.1.11 Snippet FIGÉ vendangé depuis Projets/dracodev-commons v0.2.0
(ui/barre-apps/) : ne pas modifier la structure ici ; toute évolution (ui/barre-apps/, commit 70c837a de la branche
passe par une nouvelle version de commons. shaarit-phase3-barre-contrats) : 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. CSS/JS : /static/css/draco-barre.css, /static/js/vendor/draco-barre.js.
v7.82.0 (dev/prod) : les href des onglets ne sont plus figés — v7.82.0 (dev/prod) : les href des onglets ne sont plus figés —
l'hôte les injecte depuis sa config (draco_urls(), noms officiels l'hôte les injecte depuis sa config (draco_urls(), noms officiels
@@ -27,7 +28,15 @@
bouton avatar flottant (bordure du CSS vendangé). Thème de la bouton avatar flottant (bordure du CSS vendangé). Thème de la
barre : data-theme sur <html> (fd_theme, défaut light) — les barre : data-theme sur <html> (fd_theme, défaut light) — les
règles thème de commons s'appliquent, aucune surcharge propre règles thème de commons s'appliquent, aucune surcharge propre
n'est nécessaire. #} n'est nécessaire.
v0.2.0 : 6e onglet ShaarIt (data-app="shaarit",
draco_urls().shaarit, logo static/img/logos/shaarit.svg copie
verbatim de commons), après Kanbante et avant l'onglet agent ;
le CSS vendangé gagne la GARDE data-theme : ses blocs
prefers-color-scheme sont préfixés html:not([data-theme]) —
c'est le correctif du piège connu chez Flowdeck (barre sombre
forcée quand le système est sombre mais que fd_theme = light) :
changement de comportement visible, signalé en tête de la PR. #}
<link rel="stylesheet" href="/static/css/draco-alertes.css?v={{ asset_version }}"> <link rel="stylesheet" href="/static/css/draco-alertes.css?v={{ asset_version }}">
<header class="draco-bar" data-current="flowdeck"> <header class="draco-bar" data-current="flowdeck">
<div class="draco-bar-zone draco-bar-gauche"> <div class="draco-bar-zone draco-bar-gauche">
@@ -54,6 +63,10 @@
<span class="draco-apptab-txt"><strong>Kanbante</strong><small>Kanban</small></span> <span class="draco-apptab-txt"><strong>Kanbante</strong><small>Kanban</small></span>
<span class="draco-badge" data-badge="kanbante" hidden>0</span> <span class="draco-badge" data-badge="kanbante" hidden>0</span>
</a> </a>
<a class="draco-apptab" data-app="shaarit" href="{{ draco_urls().shaarit }}/">
<span class="draco-apptab-ico" style="--app:#059669" data-icon="shaarit"><img src="/static/img/logos/shaarit.svg" alt="ShaarIt" width="30" height="30"></span>
<span class="draco-apptab-txt"><strong>ShaarIt</strong><small>Bookmarks</small></span>
</a>
<a class="draco-apptab" data-app="agent" href="{{ draco_urls().agent }}/"> <a class="draco-apptab" data-app="agent" href="{{ draco_urls().agent }}/">
<span class="draco-apptab-ico" style="--app:#c00000" data-icon="agent"><img src="/static/img/logos/spark.png" alt="Console Spark" width="30" height="30"></span> <span class="draco-apptab-ico" style="--app:#c00000" data-icon="agent"><img src="/static/img/logos/spark.png" alt="Console Spark" width="30" height="30"></span>
<span class="draco-apptab-txt"><strong>Console Spark</strong><small>Agent commun</small></span> <span class="draco-apptab-txt"><strong>Console Spark</strong><small>Agent commun</small></span>
+19 -3
View File
@@ -12,9 +12,18 @@
Alertes icône seule. Alertes icône seule.
v0.1.11 : marque = étoile Spark monochrome (blanche barre foncée, v0.1.11 : marque = étoile Spark monochrome (blanche barre foncée,
noire barre claire) ; anneau rouge #c00000 autour de l'avatar flottant. noire barre claire) ; anneau rouge #c00000 autour de l'avatar flottant.
v0.2.0 : nouvel onglet « ShaarIt » (data-app="shaarit", --app émeraude
#059669, logo logos/shaarit.svg via {{LOGO_SHAARIT}}) avant l'onglet
agent ; GARDE data-theme : les blocs prefers-color-scheme ne
s'appliquent que si <html> n'a AUCUN attribut data-theme
(html:not([data-theme])) — avant ce correctif, un hôte ayant choisi
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).
Jetons repris du prototype validé Console v7.2. Jetons repris du prototype validé Console v7.2.
Thème : clair par défaut, sombre via [data-theme="dark"] sur <html> Thème : clair par défaut, sombre via [data-theme="dark"] sur <html>
ou prefers-color-scheme si l'app intégratrice ne force rien. */ ou prefers-color-scheme si l'app intégratrice ne force rien
(aucun attribut data-theme sur <html>). */
.draco-bar { .draco-bar {
--bg: #f2f2f0; --surface: #ffffff; --surface-2: #e9eae6; --surface-3: #f6f6f3; --bg: #f2f2f0; --surface: #ffffff; --surface-2: #e9eae6; --surface-3: #f6f6f3;
@@ -27,8 +36,12 @@
background: var(--surface); border-bottom: 1px solid var(--line); background: var(--surface); border-bottom: 1px solid var(--line);
font: 500 14px/1.3 system-ui, "Segoe UI", sans-serif; color: var(--ink); font: 500 14px/1.3 system-ui, "Segoe UI", sans-serif; color: var(--ink);
} }
/* Garde data-theme (v0.2.0) : le sombre système ne s'applique QUE si
* l'hôte n'a posé aucun data-theme sur <html>. Sans cette garde, un
* hôte en data-theme="light" sur un système sombre affichait la barre
* sombre malgré son choix explicite. */
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
.draco-bar { --bg:#101211; --surface:#1a1c1a; --surface-2:#242624; --surface-3:#20221f; html:not([data-theme]) .draco-bar { --bg:#101211; --surface:#1a1c1a; --surface-2:#242624; --surface-3:#20221f;
--ink:#eceee9; --ink-2:#a6aba2; --ink-3:#8b9089; --line:#2e302c; } --ink:#eceee9; --ink-2:#a6aba2; --ink-3:#8b9089; --line:#2e302c; }
} }
[data-theme="dark"] .draco-bar { --bg:#101211; --surface:#1a1c1a; --surface-2:#242624; --surface-3:#20221f; [data-theme="dark"] .draco-bar { --bg:#101211; --surface:#1a1c1a; --surface-2:#242624; --surface-3:#20221f;
@@ -48,7 +61,7 @@
barre foncée (filtre annulé par les règles thème ci-dessous). */ barre foncée (filtre annulé par les règles thème ci-dessous). */
.draco-brand-mark img { width: 26px; height: 26px; object-fit: cover; display: block; filter: brightness(0); } .draco-brand-mark img { width: 26px; height: 26px; object-fit: cover; display: block; filter: brightness(0); }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
.draco-bar .draco-brand-mark img { filter: none; } html:not([data-theme]) .draco-bar .draco-brand-mark img { filter: none; }
} }
[data-theme="dark"] .draco-bar .draco-brand-mark img { filter: none; } [data-theme="dark"] .draco-bar .draco-brand-mark img { filter: none; }
@@ -218,6 +231,9 @@
.draco-bar[data-current="flowdeck"] .draco-apptab[data-app="flowdeck"], .draco-bar[data-current="flowdeck"] .draco-apptab[data-app="flowdeck"],
.draco-bar[data-current="tiktak"] .draco-apptab[data-app="tiktak"], .draco-bar[data-current="tiktak"] .draco-apptab[data-app="tiktak"],
.draco-bar[data-current="kanbante"] .draco-apptab[data-app="kanbante"], .draco-bar[data-current="kanbante"] .draco-apptab[data-app="kanbante"],
/* v0.2.0 : sur ShaarIt elle-même (data-current="shaarit"), c'est
l'onglet ShaarIt qui reste visible en mobile. */
.draco-bar[data-current="shaarit"] .draco-apptab[data-app="shaarit"],
/* Chantier 5 : sur la console elle-même (data-current="agent", /* Chantier 5 : sur la console elle-même (data-current="agent",
programme console #71), c'est l'onglet Console Spark qui reste programme console #71), c'est l'onglet Console Spark qui reste
visible en mobile — les 4 hôtes gardent leur propre courant. */ visible en mobile — les 4 hôtes gardent leur propre courant. */
+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 240">
<!-- ShaarIt — signet (bookmark) blanc sur fond émeraude #059669,
couleur signature de l'app dans la barre (#059669, distincte du
teal Kanbante #0d9488). Fond arrondi comme les logos PNG 180 px
des autres apps ; géométrie simple, aucun redessin d'un logo
existant : le signet EST le symbole de l'app (bookmarks). -->
<rect x="8" y="8" width="224" height="224" rx="48" fill="#059669"/>
<path d="M 82 52 L 158 52 L 158 190 L 120 152 L 82 190 Z" fill="#ffffff"/>
</svg>

After

Width:  |  Height:  |  Size: 569 B

+18 -6
View File
@@ -8,7 +8,12 @@
* correctif fusion #70 (SANS bump de version, publication séparée) : * correctif fusion #70 (SANS bump de version, publication séparée) :
* bouton trois points et son menu par défaut SUPPRIMÉS, « Console Spark » * 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 * ajoutée au menu de la marque, fermeture/focus corrigés (voir
* « Menu des applications », « Focus » et « Écouteurs globaux »). * « Menu des applications », « Focus » et « Écouteurs globaux ») ;
* v0.2.0 : 5e application ShaarIt — clé urls.shaarit, défaut officiel
* https://shaarit.dracodev.net/, dérivation -dev shaarit-dev (même
* 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.
* *
* Aucun gestionnaire inline : un seul écouteur délégué sur le document * 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 * (patron validé par le prototype — les onclick du HTML généré sont
@@ -26,6 +31,7 @@
* flowdeck: "https://flowdeck.dracodev.net/", * flowdeck: "https://flowdeck.dracodev.net/",
* tiktak: "https://tiktak.dracodev.net/", * tiktak: "https://tiktak.dracodev.net/",
* kanbante: "https://kanbante.dracodev.net/", * kanbante: "https://kanbante.dracodev.net/",
* shaarit: "https://shaarit.dracodev.net/",
* agent: "https://agent.dracodev.net/", * agent: "https://agent.dracodev.net/",
* spark: "https://spark.dracodev.net/" * spark: "https://spark.dracodev.net/"
* }, * },
@@ -54,10 +60,13 @@
* La clé spark ne correspond à aucun onglet de la barre : elle est * 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 * 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, * (panneau-agent), qui suit le même contrat d'injection. La clé agent,
* elle, a un onglet depuis le chantier 5 (ordre : ObsiGate, Flowdeck, * elle, a un onglet depuis le chantier 5 (ordre, v0.2.0 : ObsiGate,
* TikTak, Kanbante, Console Spark) : elle suit donc l'étape « href * Flowdeck, TikTak, Kanbante, ShaarIt, Console Spark) : elle suit
* donc l'étape « href
* rendu » comme les autres onglets, en plus d'alimenter le menu de * rendu » comme les autres onglets, en plus d'alimenter le menu de
* la marque et DRACO_BAR.urls. * 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.
* Actions émises (data-act) : rail, palette, domaine (data-dom), * Actions émises (data-act) : rail, palette, domaine (data-dom),
* alertes, spark, rappel-entete. L'app intégratrice décide de chacune * alertes, spark, rappel-entete. L'app intégratrice décide de chacune
* (ouvrir la palette, le panneau Spark, changer de domaine…). * (ouvrir la palette, le panneau Spark, changer de domaine…).
@@ -144,6 +153,7 @@
flowdeck: "https://flowdeck.dracodev.net/", flowdeck: "https://flowdeck.dracodev.net/",
tiktak: "https://tiktak.dracodev.net/", tiktak: "https://tiktak.dracodev.net/",
kanbante: "https://kanbante.dracodev.net/", kanbante: "https://kanbante.dracodev.net/",
shaarit: "https://shaarit.dracodev.net/",
agent: "https://agent.dracodev.net/", agent: "https://agent.dracodev.net/",
spark: "https://spark.dracodev.net/" spark: "https://spark.dracodev.net/"
}; };
@@ -157,12 +167,13 @@
flowdeck: "https://flowdeck-dev.dracodev.net/", flowdeck: "https://flowdeck-dev.dracodev.net/",
tiktak: "https://tiktak-dev.dracodev.net/", tiktak: "https://tiktak-dev.dracodev.net/",
kanbante: "https://kanbante-dev.dracodev.net/", kanbante: "https://kanbante-dev.dracodev.net/",
shaarit: "https://shaarit-dev.dracodev.net/",
agent: "https://agent-dev.dracodev.net/" agent: "https://agent-dev.dracodev.net/"
}; };
var APP_LABELS = { var APP_LABELS = {
obsigate: "ObsiGate", flowdeck: "Flowdeck", obsigate: "ObsiGate", flowdeck: "Flowdeck",
tiktak: "TikTak", kanbante: "Kanbante" tiktak: "TikTak", kanbante: "Kanbante", shaarit: "ShaarIt"
}; };
/* Vrai si hostname est un hôte -dev dracodev.net : première étiquette /* Vrai si hostname est un hôte -dev dracodev.net : première étiquette
@@ -365,7 +376,8 @@
if (badge) a.appendChild(badge.cloneNode(true)); if (badge) a.appendChild(badge.cloneNode(true));
appsMenu.appendChild(a); appsMenu.appendChild(a);
}); });
/* Entrée « Console Spark » (#70) : après Kanbante, vers la console /* Entrée « Console Spark » (#70) : après les onglets d'apps
* (ObsiGate…ShaarIt, v0.2.0), vers la console
* de l'agent commun (URL agent résolue — explicite > -dev > * de l'agent commun (URL agent résolue — explicite > -dev >
* défaut prod ; aucun hôte spark-dev inventé). data-app="agent" * défaut prod ; aucun hôte spark-dev inventé). data-app="agent"
* l'intègre à refreshMenuHrefs/applyUrls/setCurrent comme les * l'intègre à refreshMenuHrefs/applyUrls/setCurrent comme les
+20
View File
@@ -33,6 +33,26 @@ def test_aucun_texte_chantier_rendu():
assert rendu.lstrip().startswith("<link") assert rendu.lstrip().startswith("<link")
def test_barre_v020_onglet_shaarit_et_garde_data_theme():
"""Barre v0.2.0 (commons @70c837a) : onglet ShaarIt entre Kanbante
et l'onglet agent, logo fourni tel quel, CSS vendangé verbatim
avec la garde data-theme sur prefers-color-scheme."""
gabarit = (ROOT / "app/templates/_draco_bar.html").read_text()
rendu = _hors_commentaires(gabarit)
nav = rendu.split('<nav class="draco-apptabs"')[1].split("</nav>")[0]
assert nav.index('data-app="kanbante"') < nav.index('data-app="shaarit"')
assert nav.index('data-app="shaarit"') < nav.index('data-app="agent"')
assert 'href="{{ draco_urls().shaarit }}/"' in nav
assert 'data-icon="shaarit"><img src="/static/img/logos/shaarit.svg"' in nav
assert (ROOT / "static/img/logos/shaarit.svg").is_file()
css = (ROOT / "static/css/draco-barre.css").read_text()
assert "html:not([data-theme]) .draco-bar {" in css
assert "html:not([data-theme]) .draco-bar .draco-brand-mark img" in css
js = (ROOT / "static/js/vendor/draco-barre.js").read_text()
assert 'shaarit: "https://shaarit.dracodev.net/"' in js
assert 'shaarit: "https://shaarit-dev.dracodev.net/"' in js
def test_barre_intacte_apres_suppression(): def test_barre_intacte_apres_suppression():
"""Le 5e onglet Console Spark et la marque survivent a la suppression.""" """Le 5e onglet Console Spark et la marque survivent a la suppression."""
gabarit = (ROOT / "app/templates/_draco_bar.html").read_text() gabarit = (ROOT / "app/templates/_draco_bar.html").read_text()
+19 -1
View File
@@ -12,7 +12,8 @@ import pytest
from app.services import draco_urls from app.services import draco_urls
VARS = ("DRACO_SSO_URL", "DRACO_AGENT_URL", "TIKTAK_URL", "KANBANTE_URL", VARS = ("DRACO_SSO_URL", "DRACO_AGENT_URL", "TIKTAK_URL", "KANBANTE_URL",
"FLOWDECK_URL", "OAUTH_REDIRECT_URI", "AGENT_EVENEMENTS_URL") "SHAARIT_URL", "FLOWDECK_URL", "OAUTH_REDIRECT_URI",
"AGENT_EVENEMENTS_URL")
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
@@ -45,6 +46,23 @@ def test_surcharge_dev_par_env(monkeypatch):
assert urls["flowdeck"] == "https://flowdeck-dev.dracodev.net" assert urls["flowdeck"] == "https://flowdeck-dev.dracodev.net"
def test_shaarit_defaut_derivation_et_explicite(monkeypatch, avec_hote):
# Barre v0.2.0 : ShaarIt suit le même mécanisme que les autres
# sœurs — défaut officiel, dérivation -dev (agent connu puis
# hôte de la requête), explicite prioritaire.
assert draco_urls.shaarit_url() == "https://shaarit.dracodev.net"
assert draco_urls.toutes()["shaarit"] == "https://shaarit.dracodev.net"
monkeypatch.setenv(
"AGENT_EVENEMENTS_URL",
"https://agent-dev.dracodev.net/api/v1/evenements")
assert draco_urls.shaarit_url() == "https://shaarit-dev.dracodev.net"
monkeypatch.delenv("AGENT_EVENEMENTS_URL")
avec_hote("flowdeck-dev.dracodev.net")
assert draco_urls.shaarit_url() == "https://shaarit-dev.dracodev.net"
monkeypatch.setenv("SHAARIT_URL", "https://bm.example.net/")
assert draco_urls.shaarit_url() == "https://bm.example.net"
def test_flowdeck_url_derivée_oauth_redirect(monkeypatch): def test_flowdeck_url_derivée_oauth_redirect(monkeypatch):
monkeypatch.setenv( monkeypatch.setenv(
"OAUTH_REDIRECT_URI", "https://flowdeck-dev.dracodev.net/auth/callback") "OAUTH_REDIRECT_URI", "https://flowdeck-dev.dracodev.net/auth/callback")