From 9ae054d1baa72f4c3f34c34755ecc176c8fd20e4 Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 16:01:18 -0400 Subject: [PATCH 1/4] Recherche onglets (defaut 6) : app/templates/recherche.html --- app/templates/recherche.html | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/app/templates/recherche.html b/app/templates/recherche.html index 3610213..2a7666c 100644 --- a/app/templates/recherche.html +++ b/app/templates/recherche.html @@ -1,17 +1,22 @@ {% extends "base.html" %} {% block title_prefix %}Rechercher partout{% endblock %} {% block content %} - -{# Console : pas de data-base-console ici — la route Flowdeck de /recherche - n'expose pas la base agent dans son contexte `bases` ; recherche.js - dérive donc la base console (hôte -dev -> agent-dev, sinon prod) ou - reprend le href d'un onglet de barre console/spark quand il existe. - Les 3 autres hôtes rendent data-base-console explicitement. #} +{# Versionnes (?v=asset_version) comme les autres feuilles/scripts de + base.html : sans version, le service worker (static/sw.js, cache-first + des .js/.css) resservait indefiniment les copies pre-#33 de ces deux + fichiers aux navigateurs les ayant deja visites — la page paraissait + donc « non corrigee » malgre les PR #33/#36. #} + +{# Console : data-base-console rendu explicitement, comme les 3 autres + hotes — la route Flowdeck de /recherche expose la base agent dans + son contexte `bases` (defaut 6). recherche.js garde ses replis + (derivation -dev, href d'onglet de barre) si l'attribut est vide. #}
+ data-base-kanbante="{{ bases.kanbante }}" + data-base-console="{{ bases.agent }}">

Rechercher partout

Notes ObsiGate, pages Flowdeck, tâches TikTak, cartes Kanbante — dans l'environnement courant (dev reste dev). « / » ou Ctrl+K pour rechercher, ↑/↓ puis Entrée pour ouvrir un résultat. « Tout voir » bascule vers l'onglet de l'application, sans quitter la page.

@@ -49,5 +54,5 @@
{% endblock %} {% block scripts %} - + {% endblock %} From c0bf0e85230c0021f08490c4cc90fe42d8612a01 Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 16:01:21 -0400 Subject: [PATCH 2/4] Recherche onglets (defaut 6) : app/routers/search.py --- app/routers/search.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/routers/search.py b/app/routers/search.py index 28e3e3e..80ed0f2 100644 --- a/app/routers/search.py +++ b/app/routers/search.py @@ -63,7 +63,12 @@ def recherche_page(request: Request, q: str = Query(default="")): user = SessionManager.decode_session(request.cookies.get("flowdeck_session", "")) bases = draco_urls.toutes() template = ENV.get_template("recherche.html") + # Defaut 6 : la base agent est exposee explicitement (data-base-console + # dans recherche.html), comme les 3 autres hotes — recherche.js ne doit + # plus la deviner (derivation -dev / href d'onglet de barre) pour + # l'onglet Console Spark (GET /api/v1/recherche, alignement #36). return HTMLResponse(template.render( request=request, q=q.strip(), user=user, - bases={k: bases[k] for k in ("obsigate", "flowdeck", "tiktak", "kanbante")}, + bases={k: bases[k] for k in ("obsigate", "flowdeck", "tiktak", + "kanbante", "agent")}, )) From 71c7113a8c2cfa156730f34a23a8a4a0f96be3c5 Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 16:01:25 -0400 Subject: [PATCH 3/4] Recherche onglets (defaut 6) : static/sw.js --- static/sw.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/static/sw.js b/static/sw.js index 4bbba24..d038c17 100644 --- a/static/sw.js +++ b/static/sw.js @@ -8,7 +8,14 @@ ═══════════════════════════════════════════════════════════ */ 'use strict'; -const CACHE_NAME = 'flowdeck-v8'; // v8 : Alpine CSP build (A20 fini) +const CACHE_NAME = 'flowdeck-v9'; // v9 : purge des caches pre-#33/#36 — + // recherche.js/recherche.css etaient servis cache-first SANS version + // (?v= absent dans recherche.html) : les navigateurs ayant visite + // Flowdeck avant les onglets gardaient les copies pre-#33 (JS sans + // onglets/compteurs/console, CSS sans .rp-tabs) malgre les deplois + // 7.84.3/7.84.4. Le bump purge ces caches a l'activation, et les + // liens versionnes (?v=asset_version) font des futurs changements + // de nouvelles cles de cache. const DATA_CACHE = 'flowdeck-data-v7'; // App shell (assets versionnés comme référencés dans les templates). From ee065978b219f157af50bcd3a5d2992013386546 Mon Sep 17 00:00:00 2001 From: bruno Date: Wed, 28 Oct 2026 16:01:30 -0400 Subject: [PATCH 4/4] Recherche onglets (defaut 6) : tests/test_recherche_onglets.py --- tests/test_recherche_onglets.py | 85 +++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 tests/test_recherche_onglets.py diff --git a/tests/test_recherche_onglets.py b/tests/test_recherche_onglets.py new file mode 100644 index 0000000..c5aef9e --- /dev/null +++ b/tests/test_recherche_onglets.py @@ -0,0 +1,85 @@ +"""Page /recherche Flowdeck : onglets, base console, anti-cache (defaut 6). + +Audit prealable (main 7.84.4, tag v7.84.4 = 984e92b) : la route +(app/routers/search.py:51), le gabarit (app/templates/recherche.html), +le JS (static/js/recherche.js) et le CSS (static/css/recherche.css) +contenaient DEJA la page a onglets des PR #33/#36 — aucune route +fantome, aucun bloc `scripts` manquant dans base.html:869, aucune +regle CSP ne bloquant le script (script-src 'self'). Le symptome +deploie (« pas d'onglets, resultats Flowdeck seuls ») ne s'explique +donc PAS par un mauvais gabarit dans main, mais par deux causes +reelles, corrigees ici : + +1. Assets recherche servis CACHE-FIRST par le service worker + (static/sw.js) SANS version (?v= absent) sous un CACHE_NAME + inchange depuis A20 ('flowdeck-v8') : un navigateur ayant visite + Flowdeck avant #33 gardait le recherche.js pre-#33 (sans onglets, + sans compteurs, sans logique console, « Tout voir » naviguant + ailleurs) et le recherche.css pre-#33 (sans .rp-tabs) — la page + paraissait donc « non corrigee » malgre les deplois 7.84.3/7.84.4, + et le repli networkFirst du HTML vers le cache couvrait aussi le + cas reseau lent. Correctif : liens versionnes (?v=asset_version, + comme tous les autres assets de base.html) + bump CACHE_NAME + (purge a l'activation du nouveau worker). +2. Flowdeck etait le seul hote a ne pas rendre data-base-console + (son propre commentaire l'admettait) : la base console de l'onglet + Console Spark etait devine (derivation -dev / href d'onglet de + barre) au lieu d'etre explicite. Correctif : la route expose + `bases.agent` et le gabarit le rend en data-base-console. + +La logique d'onglets elle-meme (focus, compteurs, « Tout voir » sur +place, etats par application, liens -dev, console sur +GET /api/v1/recherche) est deja couverte par tests/recherche.test.js +(suite Node, lancee en sandbox) ; ce fichier-ci verrouille le +branchement gabarit/route/service worker, sans serveur ni base. +""" + +import re +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent + +ONGLETS_ATTENDUS = ["all", "obsigate", "flowdeck", "tiktak", "kanbante", + "console"] + + +def test_gabarit_recherche_onglets_complets(): + gabarit = (ROOT / "app/templates/recherche.html").read_text() + trouves = re.findall(r'data-rp-tab="([^"]+)"', gabarit) + assert trouves == ONGLETS_ATTENDUS, trouves + for section in ("obsigate", "flowdeck", "tiktak", "kanbante", "console"): + assert f'data-rp-section="{section}"' in gabarit + assert 'id="rp-q"' in gabarit and "autofocus" in gabarit + + +def test_gabarit_recherche_base_console_explicite(): + gabarit = (ROOT / "app/templates/recherche.html").read_text() + assert 'data-base-console="{{ bases.agent }}"' in gabarit + + +def test_gabarit_recherche_assets_versionnes(): + """Sans ?v=, le SW cache-first ressert les copies pre-#33.""" + gabarit = (ROOT / "app/templates/recherche.html").read_text() + assert "/static/css/recherche.css?v={{ asset_version }}" in gabarit + assert "/static/js/recherche.js?v={{ asset_version }}" in gabarit + + +def test_route_recherche_expose_base_agent(): + route = (ROOT / "app/routers/search.py").read_text() + assert '"agent"' in route or "'agent'" in route + assert "bases.agent" in (ROOT / "app/templates/recherche.html").read_text() + + +def test_service_worker_purge_anciens_caches(): + """Le bump de CACHE_NAME purge les caches pre-#33 a l'activation.""" + sw = (ROOT / "static/sw.js").read_text() + assert "const CACHE_NAME = 'flowdeck-v9'" in sw + assert "flowdeck-v8" not in sw + assert "cache-first" in sw or "cacheFirst" in sw + + +def test_recherche_js_branche_console_v1(): + """Rappel : l'onglet console appelle GET /api/v1/recherche (cf. #36).""" + js = (ROOT / "static/js/recherche.js").read_text() + assert 'CONSOLE_SEARCH_PATH = "api/v1/recherche"' in js + assert "CONSOLE_SEARCH_LIMIT = 20" in js