Noms de colonnes friendly et définition de colonne (tooltip) #33

This commit is contained in:
Colin Maudry
2025-09-29 17:05:37 +02:00
parent 502f652791
commit a44e1a37cb
+47 -13
View File
@@ -7,6 +7,7 @@ from dash import Input, Output, State, callback, dash_table, dcc, html, register
from src.utils import ( from src.utils import (
add_org_links, add_org_links,
add_resource_link, add_resource_link,
data_schema,
filter_table_data, filter_table_data,
format_montant, format_montant,
format_number, format_number,
@@ -73,6 +74,8 @@ datatable = html.Div(
], ],
data_timestamp=0, data_timestamp=0,
markdown_options={"html": True}, markdown_options={"html": True},
tooltip_duration=8000,
tooltip_delay=350,
), ),
) )
@@ -85,21 +88,35 @@ layout = [
), ),
dcc.Markdown( dcc.Markdown(
""" """
##### Définition des colonnes
**Filtres** Pour voir la définition d'une colonne, passez votre souris sur son en-tête.
##### Filtres
Vous pouvez appliquer un filtre pour chaque colonne en entrant du texte sous le nom de la colonne, puis en tapant sur `Entrée`. Vous pouvez appliquer un filtre pour chaque colonne en entrant du texte sous le nom de la colonne, puis en tapant sur `Entrée`.
- Champs textuels : la recherche est insensible à la casse (majuscules/minuscules). - Champs textuels : la recherche est insensible à la casse (majuscules/minuscules) et retourne les valeurs qui contiennent
- Champs numériques : vous pouvez soit taper un nombre pour trouver les valeurs égales, soit le précéder de > ou < pour filtrer les valeurs supérieures ou inférieures. le texte recherché. Exemple : `rennes` retourne "RENNES METROPOLE".
- Champs numériques : vous pouvez soit taper un nombre pour trouver les valeurs égales, soit le précéder de **>** ou **<** pour filtrer les valeurs supérieures ou inférieures. Exemple pour les offres reçues : `> 4` retourne les marchés ayant reçu plus de 4 offres.
- Champs date : vous pouvez également utiliser **>** ou **<**. Exemples : `< 2024-01-31` pour "avant le 31 janvier 2024",
`2024` pour "en 2024", `> 2022` pour "à partir de 2022"
Vous pouvez filtrer plusieurs colonnes à la fois. Vos filtres sont remis à zéro quand vous rafraîchissez la page. Vous pouvez filtrer plusieurs colonnes à la fois. Vos filtres sont remis à zéro quand vous rafraîchissez la page.
**Télécharger le résultat** ##### Tri
Vous pouvez télécharger le résultat de vos filtres et tris, pour les colonnes affichées, en cliquant sur Télécharger au format Excel. Pour trier une colonne, utilisez les flèches grises à côté des noms de colonnes. Chaque clic change le tri dans cet ordre : tri ascendant, tri descendant, pas de tri.
##### Télécharger le résultat
Vous pouvez télécharger le résultat de vos filtres et tris, pour les colonnes affichées, en cliquant sur **Télécharger au format Excel**.
##### Liens
Les liens dans les colonnes Acheteur et Titulaire vous permettent de consulter une vue qui leur est dédiée
(informations, marchés attribués/remportés, etc.)
Si vous téléchargez un volume important de données, il se peut que vous attendiez quelques minutes avant le début du téléchargement.
""" """
), ),
], ],
@@ -141,7 +158,7 @@ layout = [
@callback( @callback(
Output("table", "data"), Output("table", "data"),
Output("table", "columns"), Output("table", "columns"),
# Output("filtered_data", "data"), Output("table", "tooltip_header"),
Output("table", "data_timestamp"), Output("table", "data_timestamp"),
Output("nb_rows", "children"), Output("nb_rows", "children"),
Output("btn-download-data", "disabled"), Output("btn-download-data", "disabled"),
@@ -189,17 +206,33 @@ def update_table(page_current, page_size, filter_query, sort_by, data_timestamp)
dff = format_montant(dff) dff = format_montant(dff)
# Liste finale de colonnes # Liste finale de colonnes
columns = [ columns = []
{ tooltip = {}
"name": column, for column_id in dff.columns:
"id": column, column_object = data_schema.get(column_id)
if column_object:
column_name = column_object.get("friendly_name", column_id)
else:
column_name = column_id
column = {
"name": column_name,
"id": column_id,
"presentation": "markdown", "presentation": "markdown",
"type": "text", "type": "text",
"format": {"nully": "N/A"}, "format": {"nully": "N/A"},
"hideable": True, "hideable": True,
} }
for column in dff.columns columns.append(column)
]
if column_object:
tooltip[column_id] = {
"value": f"""**{column_object.get("friendly_name", column_id)}**
"""
+ column_object["description"],
"type": "markdown",
}
dicts = dff.to_dicts() dicts = dff.to_dicts()
@@ -215,6 +248,7 @@ def update_table(page_current, page_size, filter_query, sort_by, data_timestamp)
return ( return (
dicts, dicts,
columns, columns,
tooltip,
data_timestamp + 1, data_timestamp + 1,
nb_rows, nb_rows,
download_disabled, download_disabled,