
# Liaison de données

`dataSource` lie une page ou un composant à une table. Les enregistrements résolus deviennent accessibles à tous les descendants via des références `$record.<field>`.

```yaml
- type: data-table
  dataSource:
    table: tasks
    filter:
      - { field: status, operator: neq, value: archived }
    sort:
      - { field: created_at, direction: desc }
    pagination: { pageSize: 25, style: numbered }
```

## Propriétés de `dataSource`

| Propriété        | Description                                                                                      |
| ---------------- | ------------------------------------------------------------------------------------------------ |
| `table`          | **Obligatoire.** Table à lier, validée contre `app.tables`.                                      |
| `fields`         | Champs spécifiques à récupérer. Omettre pour tout récupérer.                                     |
| `mode`           | `list` (défaut), `single` ou `search`.                                                           |
| `filter`         | Conditions `{ field, operator, value }`, combinées par ET.                                       |
| `sort`           | Règles `{ field, direction }` appliquées dans l'ordre — primaire, puis secondaire.               |
| `pagination`     | `{ pageSize, style }`. `pageSize` est obligatoire dès que le bloc est présent.                   |
| `param`          | Paramètre de route d'où résoudre l'enregistrement, en mode `single`.                             |
| `searchFields`   | Champs interrogés en mode `search`. Au moins un.                                                 |
| `searchEngine`   | `client`, `fts`, `trigram` ou `hybrid`.                                                          |
| `debounceMs`     | Délai avant le déclenchement d'une requête de recherche.                                         |
| `limit`          | Plafond du nombre d'enregistrements renvoyés.                                                    |
| `targetId`       | Nomme cette source afin qu'un autre composant puisse s'y lier.                                   |
| `bindTo`         | Lit une source nommée par le `targetId` d'un autre composant au lieu de faire sa propre requête. |
| `sharedFilter`   | Filtre apporté à la source partagée référencée par `bindTo`.                                     |
| `refreshMode`    | `none` (défaut), `poll` ou `realtime`.                                                           |
| `pollIntervalMs` | Intervalle d'interrogation en millisecondes quand `refreshMode: poll` — entre 1000 et 300000.    |

Un composant peut se lier à un point de terminaison plateforme plutôt qu'à une table avec `dataSource: { system: { endpoint: … } }`, ou à une entrée nommée du [catalogue de sources système](/fr/docs/system-sources).

## Opérateurs de filtre

| Opérateur    | Correspond à                                                               |
| ------------ | -------------------------------------------------------------------------- |
| `eq` / `neq` | Égal / différent.                                                          |
| `gt` / `gte` | Supérieur / supérieur ou égal.                                             |
| `lt` / `lte` | Inférieur / inférieur ou égal.                                             |
| `contains`   | Correspondance de sous-chaîne.                                             |
| `in`         | La valeur figure dans un tableau — utilisé avec les listes `$currentUser`. |

Les conditions se combinent par ET. Il n'y a pas de OU à ce niveau ; exprimez les alternatives via une [vue enregistrée](/fr/docs/table-views) ou un composant distinct.

## Modes single et search

`mode: single` résout exactement un enregistrement, lu depuis le paramètre de route nommé par `param` — le mécanisme derrière les [routes de détail](/fr/docs/pages-routing#routes-de-dtail-denregistrement).

`mode: search` filtre sur `searchFields` au fil de la saisie, limité par `debounceMs` et plafonné par `limit` :

```yaml
- type: list
  dataSource:
    table: articles
    mode: search
    searchFields: [title, summary]
    searchEngine: fts
    debounceMs: 250
    limit: 20
```

## Pagination

| `style`    | Rend                                              |
| ---------- | ------------------------------------------------- |
| `numbered` | Une navigation numérotée par pages.               |
| `loadMore` | Un bouton Charger plus ajoutant la page suivante. |
| `infinite` | Un chargement automatique au défilement.          |

## Familles de références

Les valeurs de `content` et de `props` résolvent quatre familles de références au moment du rendu :

| Référence             | Se résout en                                                                       |
| --------------------- | ---------------------------------------------------------------------------------- |
| `$record.<field>`     | Un champ de l'enregistrement courant de la source de données.                      |
| `$vars.<key>`         | Une variable à portée de page déclarée dans les `vars` de la page.                 |
| `$currentUser.<path>` | Le contexte de session — voir ci-dessous.                                          |
| `$t:<key>`            | Une clé de traduction, avec repli sur la clé elle-même en l'absence de traduction. |

Une page rendue depuis `markdown` expose en plus `$frontmatter.*`.

## Cadrage par utilisateur courant

`$currentUser` se résout à chaque requête durant le SSR et n'est jamais mis en cache entre utilisateurs.

| Chemin                             | Valeur                                                                                    |
| ---------------------------------- | ----------------------------------------------------------------------------------------- |
| `$currentUser.id`                  | L'identifiant de l'utilisateur connecté.                                                  |
| `$currentUser.email`               | Son adresse e-mail.                                                                       |
| `$currentUser.role`                | Son nom de rôle.                                                                          |
| `$currentUser.isUnrestricted`      | `true` pour un administrateur global, qui contourne le cadrage par affectation.           |
| `$currentUser.assignments.<table>` | Les identifiants d'enregistrements auxquels l'utilisateur est affecté. À associer à `in`. |
| `$currentUser.activeAssignment`    | Le cadre actif du sélecteur de tenant, ou `null`.                                         |

```yaml
- type: data-table
  dataSource:
    table: projects
    filter:
      - { field: id, operator: in, value: '$currentUser.assignments.projects' }
```

:::callout
**Un filtre `$currentUser` rend la page authentifiée.** Le résoudre sans session renvoie `401 Unauthorized` — ce qui est distinct de la barrière `access` de la page, laquelle redirige ou renvoie 404. Une section de `layout.sidebar` rencontrant la même condition est abandonnée silencieusement plutôt que de faire échouer la page.
:::

## Pages connexes

- [Présentation des pages](/fr/docs/pages-overview) — le tableau complet des propriétés de page.
- [Composants de données](/fr/docs/data-components) — les composants qui consomment une source.
- [Sources système](/fr/docs/system-sources) — se lier à des points de terminaison plateforme par nom.
- [Vues](/fr/docs/table-views) — filtres et tris enregistrés.
- [Mises en page, barres latérales et accès](/fr/docs/pages-layouts-access) — la barrière `access`.
