Composant invisible de connexion aux donnees. Recupere des donnees depuis une API REST (URL brute ou via un adapter specialise) et les distribue aux autres composants via le systeme d'evenements. Supporte aussi les donnees JSON inline.

Invisible : Ce composant ne rend rien visuellement. Il agit comme un "pont" entre votre API et les composants de visualisation.

dsfr-data-source vs dsfr-data-query

dsfr-data-source se connecte a une API, recupere les donnees et les redistribue. En mode adapter, il gere la pagination automatique, les filtres server-side et la pagination pilotable (server-side).

dsfr-data-query est une couche de transformation client-side : il filtre, groupe, agrege et trie les donnees. Il ecoute un dsfr-data-source via l'attribut source et traite les donnees cote client.

Pattern recommande : <dsfr-data-source api-type="..."> + <dsfr-data-query source="..."> pour combiner fetch serveur et transformation client.

Modes de fonctionnement

Le composant supporte trois modes :

ModeDescription
URL brute Appel HTTP generique via l'attribut url. Supporte GET/POST, headers, params JSON, extraction via transform et pagination manuelle via paginate.
Adapter Active via api-type (sans url). L'adapter gere la construction d'URL, la pagination automatique, les filtres et le parsing specifiques au provider (OpenDataSoft, Tabular, Grist).
Inline data Donnees JSON passees directement via l'attribut data. Pas de fetch HTTP.

Types d'adapter

En mode adapter, l'attribut api-type selectionne le provider :

api-typeAPIIdentifiant requisPaginationMax records
opendatasoft OpenDataSoft (v2.1) dataset-id offset, 100/page, max 10 pages 1 000
tabular Tabular API (data.gouv.fr) resource page, 50/page, max 500 pages 25 000
grist Grist (numerique.gouv.fr, getgrist.com) base-url offset, 100/page, illimitee Illimite

Attributs

Attributs communs

AttributTypeFormat / ValeursDescription
idStringid="ma-source"Identifiant unique (requis). Les composants en aval l'utilisent pour s'abonner aux donnees.
refreshNumberEntier en secondes. 0 = offIntervalle de rafraichissement automatique
transformString"results", "data.items"Chemin JSON pour extraire les donnees de la reponse API
headersString'{"apikey":"abc123"}'Headers HTTP en JSON (API key, Bearer token, etc.)
cache-ttlNumberEntier en secondes. Defaut : 3600Duree de cache serveur en mode DB (0 = pas de cache)

Attributs mode URL brute

AttributTypeFormat / ValeursDescription
urlStringURL relative ou absolueURL de l'API REST a appeler
methodStringGET | POSTMethode HTTP. Defaut : GET
paramsString'{"limit": 100}'GET : ajoutes a l'URL comme query params. POST : envoyes comme body JSON.
paginateBooleanPresence = trueActive la pagination manuelle. Injecte page et page_size dans l'URL. Auto-extrait json.data si aucun transform n'est defini.
page-sizeNumberEntier positif. Defaut : 20Taille de page pour la pagination manuelle
use-proxyBooleanPresence = trueForce le passage par le proxy CORS generique (/cors-proxy). Utile pour les APIs externes qui ne gerent pas CORS. La requete est routee cote serveur via un header X-Target-URL.

Attributs mode adapter

AttributTypeFormat / ValeursDescription
api-typeStringopendatasoft | tabular | gristType de provider. Active le mode adapter (ne pas combiner avec url).
base-urlString"https://data.iledefrance.fr"URL de base de l'API. Requis pour Grist, optionnel pour ODS/Tabular (defauts fournis).
dataset-idString"mon-dataset-2024"Identifiant (slug) du dataset. Mode opendatasoft uniquement.
resourceString"2876a346-d50c-..." (UUID)Identifiant de la ressource. Mode tabular uniquement.
whereStringColon : "champ:op:val"
ODS : ODSQL libre
Clause WHERE statique. Format depend du provider (voir section Filtres).
selectString"sum(pop) as total, region"Clause SELECT en syntaxe ODSQL. Mode opendatasoft uniquement.
group-byString"champ1, champ2"Champs de regroupement. Delegue au serveur si le provider le supporte.
aggregateString"champ:fn" ou "champ:fn:alias"Agregations server-side. Fonctions : count sum avg min max.
order-byString"champ:asc" ou "champ:desc"Tri des resultats. Peut etre surcharge dynamiquement par un dsfr-data-list.
limitNumberEntier positif. 0 = illimiteNombre maximum de resultats
server-sideBooleanPresence = trueMode pagination pilotable : charge une page a la fois, ecoute les commandes des composants en aval (dsfr-data-list, dsfr-data-facets, dsfr-data-search).

Attribut mode inline

AttributTypeFormat / ValeursDescription
dataStringJSON valide (tableau ou objet)Donnees inline. Pas de fetch HTTP, les donnees sont parsees et emises directement.

Filtres et WHERE dynamique

WHERE statique

L'attribut where definit un filtre permanent sur la source.

En mode Tabular / Grist, format colon champ:operateur:valeur :

where="population:gt:5000"
where="population:gt:5000, region:in:IDF|OCC|BRE"
where="email:isnull"

En mode OpenDataSoft, syntaxe ODSQL libre :

where="population > 5000 AND status = 'active'"

WHERE dynamique (overlays)

Les composants en aval (dsfr-data-facets, dsfr-data-search) peuvent ajouter des filtres dynamiques via le systeme de commandes. Ces filtres sont fusionnes avec le where statique a chaque requete.

Chaque composant envoie un overlay identifie par une cle unique (whereKey). Les overlays sont combines en ET logique. La methode getEffectiveWhere() retourne la clause WHERE fusionnee.

<!-- WHERE statique + overlays dynamiques des facettes et recherche -->
<dsfr-data-source id="src" api-type="opendatasoft"
  dataset-id="rappelconso-v2-gtin-trie"
  base-url="https://data.economie.gouv.fr"
  where="categorie_produit = 'Alimentation'"
  server-side page-size="20">
</dsfr-data-source>

<!-- La recherche ajoute un overlay WHERE via server-search -->
<dsfr-data-search id="search" source="src"
  server-search>
</dsfr-data-search>

<!-- Les facettes ajoutent des overlays WHERE -->
<dsfr-data-facets id="facets" source="src"
  fields="categorie_produit, marque_produit" server-facets>
</dsfr-data-facets>

Mode server-side

Avec server-side, dsfr-data-source charge une seule page a la fois et ecoute les commandes des composants en aval pour naviguer entre les pages. Cela permet d'afficher des datasets de milliers d'enregistrements sans tout charger en memoire.

Le composant reagit a trois types de commandes :

CommandeSourceEffet
{ page }dsfr-data-listChange la page courante et re-fetche
{ where, whereKey }dsfr-data-facets, dsfr-data-searchAjoute/supprime un overlay WHERE et reset a la page 1
{ orderBy }dsfr-data-listChange le tri et re-fetche

Exemples

Mode URL brute : API REST generique

<dsfr-data-source
  id="prix-ct"
  url="https://data.economie.gouv.fr/api/explore/v2.1/catalog/datasets/prix-controle-technique/records"
  transform="results"
></dsfr-data-source>

Mode URL brute : POST avec headers et params

<dsfr-data-source
  id="api-privee"
  url="https://mon-api.gouv.fr/data"
  method="POST"
  headers='{"Authorization": "Bearer TOKEN"}'
  params='{"limit": 100, "filters": {"annee": 2024}}'
  transform="data.items"
  refresh="60"
></dsfr-data-source>

Mode URL brute : pagination manuelle

Avec paginate, chaque changement de page dans un dsfr-data-list en aval declenche un nouvel appel API avec les parametres de pagination.

<dsfr-data-source
  id="browse"
  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="browse"
  colonnes="modeles_ou_references:Produit, categorie_produit:Categorie, marque_produit:Marque"
  pagination="20">
</dsfr-data-list>

Auto-extraction : en mode paginate, pas besoin de transform="data". Les donnees sont automatiquement extraites depuis json.data et les metadonnees de pagination (json.meta) sont stockees pour calculer le nombre total de pages.

Mode URL brute : API externe avec proxy CORS

L'attribut use-proxy force le passage par le proxy CORS generique. Utile quand l'API cible ne renvoie pas les headers CORS necessaires.

<dsfr-data-source
  id="ghibli-films"
  url="https://ghibliapi.vercel.app/films"
  use-proxy
></dsfr-data-source>

Fonctionnement : en dev, la requete est routee via le middleware Vite /cors-proxy. En production, elle passe par l'endpoint equivalent sur le serveur proxy (<votre-proxy>/cors-proxy). L'URL cible est transmise dans le header X-Target-URL.

Mode adapter : OpenDataSoft

L'adapter gere automatiquement la construction d'URL, la pagination et le parsing. Pagination automatique (toutes les pages en une seule requete) jusqu'a 1 000 records.

<dsfr-data-source
  id="elus"
  api-type="opendatasoft"
  base-url="https://data.iledefrance.fr"
  dataset-id="elus-regionaux"
  where="sexe = 'F'"
></dsfr-data-source>

<dsfr-data-query id="stats" source="elus"
  group-by="groupe_politique"
  aggregate="nom:count:nb"
  order-by="nb:desc">
</dsfr-data-query>

<dsfr-data-chart source="stats" type="bar"
  label-field="groupe_politique" value-field="nb">
</dsfr-data-chart>

Mode adapter : OpenDataSoft (data.economie.gouv.fr)

L'adapter ODS gere la pagination, le tri serveur, la recherche full-text et les facettes. Ici un simple datalist pagine.

<dsfr-data-source
  id="src-ods"
  api-type="opendatasoft"
  dataset-id="rappelconso-v2-gtin-trie"
  base-url="https://data.economie.gouv.fr"
  server-side
  page-size="20"
></dsfr-data-source>

<dsfr-data-list source="src-ods"
  colonnes="modeles_ou_references:Produit, categorie_produit:Categorie, marque_produit:Marque, date_publication:Date"
  server-tri
  pagination="20">
</dsfr-data-list>

Mode adapter : Grist

L'adapter Grist se connecte aux instances Grist (numerique.gouv.fr ou getgrist.com). Il detecte automatiquement si la requete necessite le mode SQL (groupement, agregation, operateurs avances) ou le mode Records standard.

<dsfr-data-source
  id="grist-data"
  api-type="grist"
  base-url="https://grist.numerique.gouv.fr/api/docs/DOC_ID/tables/TABLE_ID/records"
  headers='{"Authorization": "Bearer TOKEN"}'
></dsfr-data-source>

<dsfr-data-normalize id="clean" source="grist-data" flatten>
</dsfr-data-normalize>

<dsfr-data-chart source="clean" type="bar"
  label-field="nom" value-field="valeur">
</dsfr-data-chart>

Flatten requis : Grist retourne les champs imbriques dans un objet fields. Utilisez <dsfr-data-normalize flatten> pour aplatir les donnees avant de les exploiter.

Mode adapter : server-side avec datalist

Avec server-side, la source charge une page a la fois. Le dsfr-data-list en aval pilote la navigation entre les pages.

<dsfr-data-source
  id="srv"
  api-type="opendatasoft"
  dataset-id="rappelconso-v2-gtin-trie"
  base-url="https://data.economie.gouv.fr"
  server-side
  page-size="20"
></dsfr-data-source>

<dsfr-data-list source="srv"
  colonnes="modeles_ou_references:Produit, categorie_produit:Categorie, marque_produit:Marque"
  server-tri
  pagination="20">
</dsfr-data-list>

Mode inline data

L'attribut data permet de passer des donnees JSON directement, sans aucun appel HTTP. Utile pour les exemples, prototypes ou donnees statiques.

<dsfr-data-source
  id="inline"
  data='[{"nom":"Paris","pop":2161000},{"nom":"Lyon","pop":516092},{"nom":"Marseille","pop":870731}]'
></dsfr-data-source>

<dsfr-data-chart source="inline" type="bar"
  label-field="nom" value-field="pop">
</dsfr-data-chart>

Rafraichissement automatique

L'attribut refresh re-execute la requete a intervalles reguliers (en secondes). Fonctionne dans les deux modes (URL brute et adapter).

<dsfr-data-source
  id="live"
  api-type="opendatasoft"
  base-url="https://data.opendatasoft.com"
  dataset-id="mon-dataset"
  refresh="30"
></dsfr-data-source>

Evenements

Le composant emet des evenements personnalises via le systeme data-bridge :

Methodes publiques

MethodeRetourDescription
reload()voidForce le rechargement des donnees
getData()unknownRetourne les donnees actuelles
isLoading()BooleanIndique si un chargement est en cours
getError()Error | nullRetourne l'erreur eventuelle
getAdapter()ApiAdapter | nullRetourne l'adapter actif (mode adapter uniquement, null en mode URL brute)
getEffectiveWhere(excludeKey?)StringRetourne la clause WHERE fusionnee (statique + tous les overlays dynamiques). Le parametre excludeKey permet d'exclure un overlay specifique (utilise par les facettes).

Conseils d'utilisation

Choisir le bon mode : Utilisez le mode URL brute pour vous connecter a n'importe quelle API REST. Utilisez le mode adapter pour les APIs connues (ODS, Tabular, Grist) afin de beneficier de la pagination automatique, des filtres server-side et de la construction d'URL geree.

server-side vs pagination automatique : Sans server-side, l'adapter charge toutes les donnees (multi-pages) en une seule operation. Avec server-side, il charge une seule page et attend les commandes des composants en aval. Utilisez server-side pour les grands datasets avec un dsfr-data-list pagine.

Pipeline de donnees : dsfr-data-source s'integre dans un pipeline : dsfr-data-sourcedsfr-data-normalizedsfr-data-query / dsfr-data-search / dsfr-data-facets → composants de visualisation.

Securite : les headers et tokens sont visibles dans le code source HTML. Ne les utilisez que pour des cles a acces restreint (lecture seule) ou dans des contextes proteges (intranet, applications internes).