+ 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 %}
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).
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