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
This commit was merged in pull request #45.
This commit is contained in:
@@ -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=
|
||||||
|
|||||||
@@ -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é.
|
||||||
|
|||||||
@@ -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,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(),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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. */
|
||||||
|
|||||||
@@ -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 |
Vendored
+18
-6
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user