République
française
dsfr-data
Documentation — Web Components DSFR pour la dataviz
Composant de tableau de données avec fonctionnalites de recherche, filtrage, tri, pagination et export CSV.
Se connecte a un <dsfr-data-source> pour recevoir les données dynamiquement.
| Attribut | Type | Description |
|---|---|---|
source | String | Id de la source (ou du transformateur) dont ce tableau consomme les données. |
columns | String | Définition des colonnes : "clé:Label, cle2:Label2". Omis : toutes les clés présentes dans les données deviennent colonnes, dans leur ordre d'apparition, libellé = clé — le tableau suit un schéma dynamique (aval d'un dsfr-data-pivot, #255). |
search | Boolean | Afficher un champ de recherche. Recherche TOLÉRANTE, celle de dsfr-data-search : le terme est cherché comme sous-chaîne dans tous les champs de la ligne (hors champs techniques _…), casse ET accents ignorés — « beziers » trouve « Béziers ». Calculée dans le navigateur, sur les lignes reçues ; ignorée en pagination serveur (une dsfr-data-search en amont cherche alors côté serveur). |
filters | String | Colonnes filtrables: "ministere,statut" |
sort | String | Tri par défaut: "score:desc" |
pagination | Number | Nombre d'éléments par page (0 = pas de pagination) |
export | String | Formats d'export disponibles: "csv", "html" (separables par virgule) |
caption | String | Titre du tableau, rendu dans caption (masqué visuellement, lu par les lecteurs d'écran — RGAA 5.4, #669). À défaut, dérivé de aria-label. |
decimals | Number | Nombre de décimales des cellules numériques (#666). Absent : au plus 2 décimales, format fr-FR — sauf pour une valeur non nulle inférieure à 0,01 en valeur absolue, qui garde deux chiffres significatifs (0,00123 → « 0,0012 ») au lieu de s'afficher « 0 » (#1282). Posé, ce nombre de décimales est tenu tel quel : decimals="2" rend « 0,00 ». Les exports CSV/HTML ne sont pas concernés. |
url-sync | Boolean | Synchronise le numéro de page dans l'URL (replaceState) |
url-page-param | String | Nom du paramètre URL pour la page (défaut: "page") |
server-sort | Boolean | Active le tri serveur. Au lieu de trier localement, envoie une commande { orderBy } au source upstream (dsfr-data-query server-side) qui re-fetche les données triees. |
columns-auto | Boolean | Complète columns avec les clés des données qui n'y figurent pas (ordre d'apparition, libellé = clé) : les premières colonnes sont libellées et figées, les suivantes suivent les données (#640). |
idle-message | String | Message rendu quand l'amont attend un filtre (require-where, #690). Distinct de « aucune donnée » : aucune requête n'a été faite. Vide, le libellé par défaut est utilisé. |
count-label | String | Nom compté par le compteur rendu au-dessus du tableau, à la place de « résultat » : count-label="commune" affiche « 1 234 communes » (#925, AM-077 — même grammaire que dsfr-data-search, #779). Une forme seule prend un « s » au pluriel ; pour un pluriel irrégulier ou un mot invariable, donner les deux formes séparées par une **barre verticale** : count-label="cheval|chevaux", count-label="prix|prix". La virgule ne sépare PAS les deux formes. Poser l'attribut fait aussi passer le nombre par le formateur fr-FR (séparateur de milliers). Sans l'attribut, le compteur est rendu exactement comme avant. La mention « (filtré) » suit le compteur dans les deux cas. |
Les anciens noms francais (colonnes, recherche, filtres, tri, server-tri) restent lus en alias deprecies (#300).
Événements : le composant n'émet pas d'événement custom ; il participe au data-bridge en consommateur (abonnement à la source) et émet des commandes dsfr-data-source-command (page, orderBy) en pagination/tri serveur.
Une liste dont la source échoue rend le message de panne et ne garde aucune ligne ; son export
(export) ne produit alors aucun fichier. Un seul cas garde des lignes : en
pagination serveur, un changement de page refusé laisse la page précédente
affichée, sous la phrase « La page 4 n'a pas pu être chargée. Vous consultez toujours la
page 3. » La pagination revient sur la page affichée, et redemander la page refusée relance la
source. Voir Quand la source est en panne.
Quand la source porte stale-if-error, la liste garde ses lignes pendant une panne
passagère, sous l'étiquette « Non actualisé » et la phrase « Chiffres relevés aujourd'hui à
14 h 32. » Recherche, filtres, tri et pagination locaux répondent ; en pagination ou en tri
serveur, les autres pages sont neutralisées. L'export reste possible, daté dans son libellé et
dans le nom du fichier. Voir Le dernier relevé, sur demande.
Sur une page d'exploration, l'amont peut porter require-where
(<dsfr-data-source> ou <dsfr-data-query>) et ne rien émettre
tant qu'aucun filtre n'est posé — un tableau de 19 000 lignes que personne ne lira ne part pas.
Le tableau rend alors le texte de idle-message (« Choisissez un filtre pour afficher
les données » par défaut) à la place du message « aucune donnée » : rien n'a été demandé, aucune
requête n'est revenue vide. Le mécanisme est décrit sur
dsfr-data-source.
Colorer une cellule selon sa valeur ne se fait pas dans le tableau : la règle est une donnée, elle
se calcule en amont. cell-class relie une colonne affichée à une colonne de classes
produite par le compute de
dsfr-data-normalize.
| Attribut | Type | Description |
|---|---|---|
cell-class | String | Classe CSS d'une cellule pilotée par une colonne calculée (#740) : "colonne:colonne_classe", plusieurs paires séparées par des virgules ; "colonne" seul classe la cellule par sa propre valeur. La valeur de la colonne de classe DEVIENT la classe de la cellule (plusieurs classes séparées par des espaces) : produisez-la avec le compute de dsfr-data-normalize, par exemple compute="alerte = when taux >= 50 then 'seuil-ok' else 'seuil-bas'", puis stylez .seuil-bas dans la page. Seuls les identifiants CSS sont retenus, le reste est ignoré. Quand la colonne de classe n'est pas affichée, sa valeur est ajoutée à la cellule en texte pour les lecteurs d'écran : l'information n'est jamais portée par la seule couleur. |
<dsfr-data-normalize id="calc" source="src"
compute="alerte = when taux >= 50 then 'seuil-ok' else 'seuil-bas'">
</dsfr-data-normalize>
<dsfr-data-list source="calc"
columns="commune:Commune, taux:Taux (%)"
cell-class="taux:alerte">
</dsfr-data-list>
<style>.seuil-bas { color: var(--text-default-error); }</style>
Plusieurs paires se séparent par des virgules ; cell-class="taux" seul classe la
cellule par sa propre valeur. Seuls les identifiants CSS sont retenus. Quand la colonne de classes
n'est pas affichée, sa valeur est ajoutée à la cellule en texte pour les lecteurs d'écran :
l'information n'est jamais portée par la seule couleur.
Un tableau sert souvent de sélecteur : on clique une ligne, et les graphiques de la page se
recentrent sur elle. refine-on-click nomme le champ dont la valeur de la ligne
cliquée devient un filtre eq. Une colonne de sélection est ajoutée en tête du
tableau : un bouton par ligne, atteignable au clavier et dont l'état est annoncé
(aria-pressed) — la couleur de la ligne n'est jamais la seule marque.
| Attribut | Type | Description |
|---|---|---|
refine-on-click | String | Champ dont la valeur de la ligne cliquée devient un filtre eq (#734). Premier clic = filtre, second clic sur la même ligne = retrait, clic sur une autre ligne = remplacement. Une colonne de sélection est ajoutée en tête du tableau : un bouton par ligne, atteignable au clavier, dont l'état est annoncé (aria-pressed) — la couleur de la ligne sélectionnée n'est jamais la seule marque. Avec context="id" (recommandé), le tableau s'enregistre comme filtre du dsfr-data-context : diffusion à toutes ses sources cibles au dialecte de chacune, tag dans dsfr-data-context-tags, URL portée par le contexte. Sans context, la clause part directement à source (whereKey list-select-ID) — sans tag ni URL, et le tableau se filtre lui-même (seule la ligne cliquée reste, jusqu'au second clic). |
context | String | Identifiant du dsfr-data-context auquel s'enregistrer en refine-on-click (#734, ADR-104). Le contexte peut être déclaré après le tableau dans la page. Vide = commande directe à source (chemin dégradé). |
label | String | Libellé du tag de contexte en refine-on-click (#734). Vide = le libellé de la colonne filtrée, à défaut le nom du champ. |
<dsfr-data-context id="ctx" sources="src"></dsfr-data-context> <dsfr-data-context-tags for="ctx"></dsfr-data-context-tags> <dsfr-data-list source="src" columns="departement:Département, total:Total" refine-on-click="departement" context="ctx" label="Département"> </dsfr-data-list>
Premier clic = filtre, second clic sur la même ligne = retrait, clic sur une autre ligne =
remplacement. Avec context (recommandé), le tableau s'enregistre comme filtre du
dsfr-data-context : diffusion à toutes ses sources cibles au
dialecte de chacune, tag supprimable, URL portée par le contexte, et label donne son
libellé au tag. Sans context, la clause part directement à source — sans
tag ni URL, et le tableau se filtre lui-même, ne gardant que la ligne cliquée jusqu'au second clic.
Affiche uniquement les données dans un tableau sans fonctionnalites supplementaires.
<dsfr-data-list source="sites" columns="nom:Nom du site, ministere:Ministere, score_rgaa:RGAA (%)"> </dsfr-data-list>
Ajoute un champ de recherche pour filtrer les données en temps reel.
La recherche est tolérante, comme celle de dsfr-data-search : le terme
est cherché comme sous-chaîne dans tous les champs de la ligne (hors champs techniques
_…), casse et accents ignorés — « beziers » trouve « Béziers », « ECOLE »
trouve « École ». Une valeur absente ne contient rien. Calculée dans le navigateur, sur les lignes
reçues.
<dsfr-data-list source="sites" columns="nom:Nom du site, ministere:Ministere, score_rgaa:RGAA (%)" search> </dsfr-data-list>
Ajoute des menus deroulants pour filtrer par colonne spécifique.
<dsfr-data-list source="sites" columns="nom:Nom du site, ministere:Ministere, statut:Statut, score_rgaa:RGAA (%)" filters="ministere,statut"> </dsfr-data-list>
Definit un tri par défaut et permet de trier en cliquant sur les en-tetes.
<dsfr-data-list source="sites" columns="nom:Nom du site, ministere:Ministere, score_rgaa:RGAA (%)" sort="score_rgaa:desc"> </dsfr-data-list>
Divise les données en pages pour une meilleure lisibilite.
<dsfr-data-list source="sites" columns="nom:Nom du site, ministere:Ministere, score_rgaa:RGAA (%)" pagination="5"> </dsfr-data-list>
Ajoute un bouton pour exporter les données au format CSV.
<dsfr-data-list source="sites" columns="nom:Nom du site, ministere:Ministere, score_rgaa:RGAA (%)" export="csv"> </dsfr-data-list>
Combine toutes les fonctionnalites : recherche, filtres, tri, pagination et export.
<dsfr-data-list source="sites" columns="nom:Nom du site, ministere:Ministere, score_rgaa:RGAA (%), score_dsfr:DSFR (%), statut:Statut, certificat_valide:Certificat" search filters="ministere,statut" sort="score_rgaa:desc" pagination="10" export="csv"> </dsfr-data-list>
Quand la source utilise paginate, dsfr-data-list détecté automatiquement
la pagination serveur. Chaque changement de page declenche un nouvel appel API. Le nombre total
d'enregistrements et de pages vient des metadonnees de l'API.
Boutons de bord. À la première et à la dernière page, « Première page »,
« Page précédente », « Page suivante » et « Dernière page » restent atteignables au clavier :
ils portent aria-disabled="true" (jamais disabled), prennent
l'apparence inactive du DSFR et ignorent clic et Entrée. Arrivé sur la dernière page par
« Page suivante », le focus reste sur le bouton. Vaut en pagination cliente comme serveur.
<dsfr-data-source id="rappels" api-type="opendatasoft" dataset-id="rappelconso-v2-gtin-trie" base-url="https://data.economie.gouv.fr" server-side paginate page-size="20"> </dsfr-data-source> <dsfr-data-list source="rappels" columns="modeles_ou_references:Produit, categorie_produit:Catégorie, marque_produit:Marque" search sort="date_publication:desc" pagination="20"> </dsfr-data-list>
Comportement : en mode pagination serveur, le total affiche (ex: "34 874 résultats")
vient de meta.total. La recherche, le tri et les filtres ne s'appliquent qu'aux données
de la page courante. Pour filtrer sur tout le dataset, utilisez les paramètres API via params.
Pendant le chargement d'une page, seules les lignes laissent la place à « Chargement de la page 4… » :
le compte de résultats et la pagination restent en place, à la même hauteur, et le bouton cliqué
garde le focus — un usager au clavier enchaîne les pages sans revenir en haut de la liste. La page
demandée est annoncée par la région live de la liste. Les fiches (dsfr-data-display)
suivent le même contrat.
Performance : Pour les grands ensembles de données, utilisez toujours la pagination
pour eviter de surcharger le navigateur. Avec paginate sur dsfr-data-source,
la pagination est geree côté serveur et seule la page courante est en memoire.
Accessibilité : Le composant inclut automatiquement les attributs ARIA nécessaires pour les lecteurs d'écran.