fix(tableau): filtres à conditions multiples ignorés + tri non réinitialisé (#41)

Deux bugs découverts en usage réel sur /tableau :

1. filtermodel_to_ast lisait condition1/condition2 pour un filtre à
   deux conditions (ET/OU) sur une colonne — mais AG Grid >=29.2 (la
   version 35.2.0 utilisée ici) encode ça via une liste `conditions`,
   confirmé par la doc Dash AG Grid "Filter Model & Dash Callbacks" >
   "Filter Model Multiple Conditions". Le filtre était donc
   silencieusement ignoré (colonne exclue du AST, comme si aucun
   filtre n'était posé), d'où des résultats sans rapport avec les
   valeurs saisies. Corrigé : filtermodel_to_ast lit désormais
   `conditions` (N éléments) en priorité, avec repli sur
   condition1/condition2 (forme dépréciée mais "still accepted" selon
   AG Grid). L'inverse (ast_to_filtermodel, utilisé au rappel d'une
   vue sauvegardée) produit aussi la forme `conditions`.

2. Le bouton "Réinitialiser" ("Supprime tous les filtres et les tris")
   ne réinitialisait que filterModel, jamais le tri. Corrigé via
   resetColumnState (remet les colonnes à l'état de columnDefs, qui
   reflète déjà la visibilité choisie via le sélecteur de colonnes —
   seul le tri est donc affecté).

Reproduit et corrigé en TDD (tests/test_query_ast.py,
tests/test_grid.py), vérifié manuellement en navigateur par l'auteur
du rapport de bug.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Colin Maudry
2026-07-10 20:21:53 +02:00
parent 4e07c69a85
commit 117ce9a4ab
4 changed files with 98 additions and 27 deletions
+6 -1
View File
@@ -544,11 +544,16 @@ def toggle_tableau_columns(click_open, click_close, is_open):
@callback(
Output("tableau_grid", "filterModel", allow_duplicate=True),
Output("tableau_grid", "resetColumnState", allow_duplicate=True),
Input("btn-tableau-reset", "n_clicks"),
prevent_initial_call=True,
)
def reset_view(n_clicks):
return {}
# resetColumnState remet les colonnes (tri inclus) à l'état déclaré dans
# columnDefs — qui reflète déjà la visibilité choisie via le sélecteur de
# colonnes (cf. apply_hidden_columns), donc ça ne touche pas au choix de
# colonnes affichées, seulement au tri.
return {}, True
@callback(