From 34f10f228316bc91b1585a43b9a3bdc66bc980fe Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Mon, 13 Jul 2026 23:04:48 +0200 Subject: [PATCH] Tooltips abonnement sur Sauvegarder vue et Mes vues --- src/pages/tableau.py | 55 +++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/src/pages/tableau.py b/src/pages/tableau.py index 016aa2e..cbe72e0 100644 --- a/src/pages/tableau.py +++ b/src/pages/tableau.py @@ -332,24 +332,37 @@ layout = [ id="saved-views-bar", className="d-inline-flex align-items-center gap-2", children=[ - dbc.Button( - "Sauvegarder la vue", - id="btn-save-view", - color="secondary", - size="sm", - # Grisé/désactivé pour les non-abonnés (le callback - # toggle_saved_views_controls affine au chargement). - disabled=True, - title="Enregistrer les filtres, tris et colonnes actuels sous un nom (abonnés)", - ), - dbc.DropdownMenu( - id="saved-views-menu", - label="Mes vues", - color="secondary", - size="sm", - children=[], - disabled=True, + # Boutons enveloppés dans un : Bootstrap met + # `pointer-events: none` sur les boutons désactivés, + # ce qui empêche le survol (et donc le `title` + # natif) de fonctionner directement dessus. Le + # `title` est donc porté par le span englobant. + html.Span( + id="btn-save-view-wrapper", className="d-inline-block", + children=dbc.Button( + "Sauvegarder la vue", + id="btn-save-view", + color="secondary", + size="sm", + # Grisé/désactivé pour les non-abonnés (le + # callback toggle_saved_views_controls + # affine au chargement). + disabled=True, + ), + ), + html.Span( + id="saved-views-menu-wrapper", + className="d-inline-block", + children=dbc.DropdownMenu( + id="saved-views-menu", + label="Mes vues", + color="secondary", + size="sm", + children=[], + disabled=True, + className="d-inline-block", + ), ), ], ), @@ -647,14 +660,18 @@ def reset_view(n_clicks, column_state): @callback( Output("btn-save-view", "disabled"), Output("saved-views-menu", "disabled"), + Output("btn-save-view-wrapper", "title"), + Output("saved-views-menu-wrapper", "title"), Input("tableau_url", "pathname"), ) def toggle_saved_views_controls(_pathname): # La barre reste visible pour tous ; « Sauvegarder la vue » et « Mes vues » # sont grisés et désactivés pour les non-abonnés (le gating serveur de - # save_view reste en place via prepare_view_to_save). + # save_view reste en place via prepare_view_to_save). L'infobulle est + # portée par les englobants, cf. layout. disabled = saved_views_ui.controls_disabled(current_user_has_subscription()) - return disabled, disabled + tooltip = "Fonctionnalité accessible en vous abonnant" if disabled else "" + return disabled, disabled, tooltip, tooltip def resolve_vue_from_url(search: str) -> dict | None: