WIP: feat(tableau): migration vers AG Grid (Lot 1, #41) #113

Closed
ColinMaudry wants to merge 0 commits from 41-migration-ag-grid into dev
ColinMaudry commented 2026-07-10 14:51:36 +02:00 (Migrated from github.com)

Résumé

Migration de la page /tableau de dash_table.DataTable vers dash-ag-grid (Lot 1 de #41). Objectif préservé : maintenir toutes les fonctionnalités existantes, sans porter les overrides CSS custom (apparence de base d'AG Grid, portage CSS reporté à un 2e temps).

  • AG Grid en infinite row model (server-side), scroll infini (pas de pagination numérotée), en-têtes toujours visibles.
  • Nouveau moteur de requête canonique : un AST booléen (src/utils/query_ast.py, Condition/And/Or/Not) compilé en SQL DuckDB paramétré, posé comme socle pour #97 (requêtes booléennes OR/AND/NOT réservées aux abonnés).
  • Filtres de colonne AG Grid → AST (filtermodel_to_ast) → SQL. Export Excel recompilé sur le même chemin DuckDB (plus de pipeline Polars).
  • Vues sauvegardées (abonnés) : stockent désormais l'AST canonique (JSON) + columnState, conformément au spec de design.
  • Rétro-compatibilité de l'ancienne URL riche (?filtres=...&tris=...&colonnes=...) volontairement abandonnée (version majeure) — le partage/rappel de vue passe uniquement par les vues sauvegardées désormais.

Documents de référence

  • Spec de design : docs/superpowers/specs/2026-07-09-migration-ag-grid-design.md
  • Plan d'implémentation : docs/superpowers/plans/2026-07-10-migration-ag-grid-tableau.md
  • Décision d'architecture documentée en commentaire sur #41

Process

Implémenté en 12 tâches TDD (subagent-driven-development), chacune revue individuellement (conformité spec + qualité), puis une revue finale de branche complète (Opus) a identifié 1 bug critique et 4 points importants — tous corrigés en 2 rounds de correctifs, re-vérifiés par une seconde revue finale :

  • Correctif critique : apply_saved_view plantait sur une vue sauvegardée créée avant cette migration (ancien format URL au lieu de JSON) — désormais dégradation gracieuse.
  • Dé-doublonnage de track_search (se déclenchait à chaque bloc de scroll infini au lieu d'une fois par filtre).
  • Vues sauvegardées basculées vers le stockage AST canonique (conforme au spec), avec un nouveau convertisseur inverse ast_to_filtermodel.
  • Mise en cache de count_marches (comptage sur ~1,5M lignes, recalculé à chaque bloc de scroll avant ce correctif).
  • Synchronisation de la visibilité des colonnes après rappel d'une vue sauvegardée (le sélecteur de colonnes pouvait afficher un état obsolète).

Hors périmètre (Lot 1)

  • Portage des overrides CSS (2e temps).
  • Migration des autres pages (acheteur.py, titulaire.py, observatoire.py, recherche.py, admin/liste.py) — Lots 2/3.
  • UI du champ de requête booléenne #97 (le moteur AST est posé, l'UI viendra avec #97).
  • Partage de vue par URL courte ?vue=<user_id>_<nom> (#112).

Test plan

  • Suite complète : uv run pytest → 596 passed, 1 skipped, 0 failed
  • Nouveaux tests unitaires : moteur AST (tests/test_query_ast.py), datasource grid (tests/test_grid.py)
  • Test d'intégration Selenium AG Grid (tests/test_tableau_ag_grid.py)
  • Tests DataTable historiques adaptés (retargetés vers les pages non-migrées acheteurs/titulaires, toujours en dash_table.DataTable)
  • Vérification manuelle sur un environnement de test (test.colibre.fr après déploiement dev) : filtres de colonne, tri, scroll infini, sélecteur de colonnes, export Excel, sauvegarde/rappel de vue (compte abonné)

🤖 Généré avec Claude Code

## Résumé Migration de la page `/tableau` de `dash_table.DataTable` vers `dash-ag-grid` (Lot 1 de #41). Objectif préservé : maintenir toutes les fonctionnalités existantes, sans porter les overrides CSS custom (apparence de base d'AG Grid, portage CSS reporté à un 2e temps). - AG Grid en **infinite row model** (server-side), scroll infini (pas de pagination numérotée), en-têtes toujours visibles. - Nouveau moteur de requête canonique : un **AST booléen** (`src/utils/query_ast.py`, `Condition`/`And`/`Or`/`Not`) compilé en SQL DuckDB paramétré, posé comme socle pour #97 (requêtes booléennes OR/AND/NOT réservées aux abonnés). - Filtres de colonne AG Grid → AST (`filtermodel_to_ast`) → SQL. Export Excel recompilé sur le même chemin DuckDB (plus de pipeline Polars). - **Vues sauvegardées** (abonnés) : stockent désormais l'AST canonique (JSON) + `columnState`, conformément au spec de design. - **Rétro-compatibilité de l'ancienne URL riche (`?filtres=...&tris=...&colonnes=...`) volontairement abandonnée** (version majeure) — le partage/rappel de vue passe uniquement par les vues sauvegardées désormais. ## Documents de référence - Spec de design : `docs/superpowers/specs/2026-07-09-migration-ag-grid-design.md` - Plan d'implémentation : `docs/superpowers/plans/2026-07-10-migration-ag-grid-tableau.md` - Décision d'architecture documentée en commentaire sur #41 ## Process Implémenté en 12 tâches TDD (subagent-driven-development), chacune revue individuellement (conformité spec + qualité), puis une revue finale de branche complète (Opus) a identifié 1 bug critique et 4 points importants — tous corrigés en 2 rounds de correctifs, re-vérifiés par une seconde revue finale : - **Correctif critique** : `apply_saved_view` plantait sur une vue sauvegardée créée avant cette migration (ancien format URL au lieu de JSON) — désormais dégradation gracieuse. - Dé-doublonnage de `track_search` (se déclenchait à chaque bloc de scroll infini au lieu d'une fois par filtre). - Vues sauvegardées basculées vers le stockage AST canonique (conforme au spec), avec un nouveau convertisseur inverse `ast_to_filtermodel`. - Mise en cache de `count_marches` (comptage sur ~1,5M lignes, recalculé à chaque bloc de scroll avant ce correctif). - Synchronisation de la visibilité des colonnes après rappel d'une vue sauvegardée (le sélecteur de colonnes pouvait afficher un état obsolète). ## Hors périmètre (Lot 1) - Portage des overrides CSS (2e temps). - Migration des autres pages (`acheteur.py`, `titulaire.py`, `observatoire.py`, `recherche.py`, `admin/liste.py`) — Lots 2/3. - UI du champ de requête booléenne #97 (le moteur AST est posé, l'UI viendra avec #97). - Partage de vue par URL courte `?vue=<user_id>_<nom>` (#112). ## Test plan - [x] Suite complète : `uv run pytest` → 596 passed, 1 skipped, 0 failed - [x] Nouveaux tests unitaires : moteur AST (`tests/test_query_ast.py`), datasource grid (`tests/test_grid.py`) - [x] Test d'intégration Selenium AG Grid (`tests/test_tableau_ag_grid.py`) - [x] Tests DataTable historiques adaptés (retargetés vers les pages non-migrées `acheteurs`/`titulaires`, toujours en `dash_table.DataTable`) - [ ] Vérification manuelle sur un environnement de test (test.colibre.fr après déploiement `dev`) : filtres de colonne, tri, scroll infini, sélecteur de colonnes, export Excel, sauvegarde/rappel de vue (compte abonné) 🤖 Généré avec [Claude Code](https://claude.com/claude-code)
ColinMaudry commented 2026-07-10 15:59:02 +02:00 (Migrated from github.com)

Fermeture : fusion directe sur dev en local, sans passer par la PR.

Fermeture : fusion directe sur dev en local, sans passer par la PR.

Pull request closed

Sign in to join this conversation.