@zevra/ui 0.42.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"css-inline.js","sourceRoot":"","sources":["../react/css-inline.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,0EAA0E;AAE1E;;;iEAGiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAW,gzhSAAgzhS,CAAA;AAEn1hS;;;yBAGyB;AACzB,MAAM,CAAC,MAAM,WAAW,GAAW,y3BAAy3B,CAAA"}
1
+ {"version":3,"file":"css-inline.js","sourceRoot":"","sources":["../react/css-inline.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,0EAA0E;AAE1E;;;iEAGiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAW,2r4SAA2r4S,CAAA;AAE9t4S;;;yBAGyB;AACzB,MAAM,CAAC,MAAM,WAAW,GAAW,y3BAAy3B,CAAA"}
@@ -1,5 +1,5 @@
1
- import type { ReactNode } from 'react';
2
- import { type RowData, type Table as TableTanstack } from '@tanstack/react-table';
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
+ import { type Column, type Header, type RowData, type Table as TableTanstack } from '@tanstack/react-table';
3
3
  declare module '@tanstack/react-table' {
4
4
  interface ColumnMeta<TData extends RowData, TValue> {
5
5
  /** `nom` : colonne d'identité, la seule en encre pleine.
@@ -13,10 +13,36 @@ declare module '@tanstack/react-table' {
13
13
  /** Largeur de la colonne dans la grille (syntaxe grid-template-columns).
14
14
  * Par défaut : `minmax(0, 1fr)`. */
15
15
  largeur?: string;
16
+ /** Famille du filtre de colonne dans la grille (`DataGrid`). Déduite
17
+ * des valeurs si absente : nombre, date (Date ou ISO), choix (peu de
18
+ * valeurs qui se répètent), texte. `false` retire le filtre. */
19
+ filtre?: 'texte' | 'nombre' | 'date' | 'choix' | false;
20
+ /** Classe de cellule supplémentaire, réservée au paquet (la case de
21
+ * sélection de la grille). Une app n'y écrit rien : le CSS du paquet
22
+ * est hors couche, une classe d'app y serait inerte. */
23
+ classe?: string;
16
24
  }
17
25
  }
26
+ /** Ce que reçoit un rendu d'en-tête substitué (`celluleEntete`) : la cellule
27
+ * telle que le tableau l'aurait rendue, classes, style et contenu compris.
28
+ * Le substitut l'ENVELOPPE (une poignée, un comportement), il ne la refait
29
+ * pas : c'est ce qui garde l'en-tête identique d'un tableau à l'autre. */
30
+ export interface CelluleEnteteProps<T> {
31
+ entete: Header<T, unknown>;
32
+ className: string;
33
+ style?: CSSProperties;
34
+ 'aria-sort'?: 'ascending' | 'descending';
35
+ children: ReactNode;
36
+ }
18
37
  export interface DataTableProps<T> {
19
38
  table: TableTanstack<T>;
39
+ /** Remplace le rendu de chaque cellule d'en-tête. Sert à la grille
40
+ * (poignées de déplacement et de largeur) ; un tableau simple n'en a
41
+ * pas besoin. */
42
+ celluleEntete?: (props: CelluleEnteteProps<T>) => ReactNode;
43
+ /** Rangée posée SOUS les intitulés, avant les lignes : les filtres de
44
+ * colonne de la grille. */
45
+ sousEntete?: ReactNode;
20
46
  /** Rendu à la place des lignes quand le modèle est vide. ⚠️ C'est la LIGNE
21
47
  * d'absence qu'on attend ici (filtre trop étroit), pas l'écran d'absence :
22
48
  * l'en-tête doit rester visible pour qu'on puisse élargir le filtre. */
@@ -26,5 +52,17 @@ export interface DataTableProps<T> {
26
52
  onRowClick?: (ligne: T) => void;
27
53
  className?: string;
28
54
  }
29
- export declare function DataTable<T>({ table, vide, onRowClick, className }: DataTableProps<T>): import("react").JSX.Element;
55
+ /** Classes et décalage d'une cellule épinglée (en-tête, filtres ou corps).
56
+ * Exporté pour la rangée de filtres de la grille, qui doit coller avec ses
57
+ * colonnes. */
58
+ export declare function epinglage<T>(c: Column<T, unknown>, table: TableTanstack<T>): {
59
+ classes: string | false;
60
+ style?: CSSProperties;
61
+ };
62
+ /** Les colonnes visibles DANS L'ORDRE DU RENDU : épinglées à gauche,
63
+ * centrales, épinglées à droite. C'est l'ordre des en-têtes et des cellules ;
64
+ * `getVisibleLeafColumns()`, lui, ignore l'épinglage, et un gabarit bâti
65
+ * dessus donne à la première colonne la largeur d'une autre. */
66
+ export declare function colonnesAffichees<T>(table: TableTanstack<T>): Column<T, unknown>[];
67
+ export declare function DataTable<T>({ table, vide, onRowClick, celluleEntete, sousEntete, className, }: DataTableProps<T>): import("react").JSX.Element;
30
68
  //# sourceMappingURL=data-table.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../react/data-table.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,KAAK,IAAI,aAAa,EAC5B,MAAM,uBAAuB,CAAA;AAM9B,OAAO,QAAQ,uBAAuB,CAAC;IAErC,UAAU,UAAU,CAAC,KAAK,SAAS,OAAO,EAAE,MAAM;QAChD;sEAC8D;QAC9D,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;QACxB;6DACqD;QACrD,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,8CAA8C;QAC9C,KAAK,CAAC,EAAE,SAAS,CAAA;QACjB;6CACqC;QACrC,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB;CACF;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IACvB;;6EAEyE;IACzE,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;8CAC0C;IAC1C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,+BA+FrF"}
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../react/data-table.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAY,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACpE,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,KAAK,KAAK,IAAI,aAAa,EAC5B,MAAM,uBAAuB,CAAA;AAM9B,OAAO,QAAQ,uBAAuB,CAAC;IAErC,UAAU,UAAU,CAAC,KAAK,SAAS,OAAO,EAAE,MAAM;QAChD;sEAC8D;QAC9D,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;QACxB;6DACqD;QACrD,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,8CAA8C;QAC9C,KAAK,CAAC,EAAE,SAAS,CAAA;QACjB;6CACqC;QACrC,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB;;yEAEiE;QACjE,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAA;QACtD;;iEAEyD;QACzD,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB;CACF;AAED;;;2EAG2E;AAC3E,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,WAAW,CAAC,EAAE,WAAW,GAAG,YAAY,CAAA;IACxC,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IACvB;;sBAEkB;IAClB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAA;IAC3D;gCAC4B;IAC5B,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB;;6EAEyE;IACzE,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;8CAC0C;IAC1C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAcD;;gBAEgB;AAChB,wBAAgB,SAAS,CAAC,CAAC,EACzB,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,EACrB,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GACtB;IAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAAE,CAiBpD;AAED;;;iEAGiE;AACjE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAMlF;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAC3B,KAAK,EACL,IAAI,EACJ,UAAU,EACV,aAAa,EACb,UAAU,EACV,SAAS,GACV,EAAE,cAAc,CAAC,CAAC,CAAC,+BA0HnB"}
@@ -1,23 +1,103 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Tableau piloté par TanStack Table.
3
+ //
4
+ // ⚠️ CE FICHIER N'EST PAS DANS LE BARREL, et c'est délibéré :
5
+ // `@tanstack/react-table` est une dépendance OPTIONNELLE. L'importer depuis
6
+ // `@zevra/ui/react` casserait toutes les apps qui ne l'ont pas installée :
7
+ // une landing n'a aucun tableau. D'où le sous-chemin dédié :
8
+ //
9
+ // import { DataTable } from '@zevra/ui/react/table'
10
+ //
11
+ // POURQUOI TANSTACK plutôt que notre propre tri/pagination : tri multi-colonnes,
12
+ // filtres, groupement, virtualisation, sélection de lignes : c'est un travail
13
+ // de plusieurs mois que personne ici n'a envie de refaire, et mal. TanStack est
14
+ // HEADLESS : il ne rend rien, il calcule des modèles de lignes. Ce fichier lui
15
+ // donne l'apparence du paquet, exactement comme shadcn le fait avec ses
16
+ // variables. Aucune classe nouvelle n'entre par cette porte : ce sont les
17
+ // mêmes .zv-table / .zv-row / .zv-cell que le tableau écrit à la main.
18
+ import { Fragment } from 'react';
2
19
  import { flexRender, } from '@tanstack/react-table';
3
20
  import { cx } from './cx.js';
4
- export function DataTable({ table, vide, onRowClick, className }) {
5
- const colonnes = table.getVisibleLeafColumns();
21
+ /** MODE GRILLE : activé par `enableColumnResizing`. Les largeurs viennent
22
+ * alors de TanStack en pixels (`size` = plancher, `columnSizing` = réglage
23
+ * de l'utilisateur), et les colonnes épinglées collent au bord du cadre.
24
+ * Sans ce réglage, le tableau rend exactement ce qu'il rendait avant. */
25
+ function piste(c, regle) {
26
+ const taille = c.getSize();
27
+ // Réglée ou épinglée : fixe. Sinon : un plancher, et une part de l'espace
28
+ // libre PROPORTIONNELLE au plancher, pour que les colonnes larges restent
29
+ // larges en s'étirant.
30
+ return regle || c.getIsPinned() ? `${taille}px` : `minmax(${taille}px, ${taille}fr)`;
31
+ }
32
+ /** Classes et décalage d'une cellule épinglée (en-tête, filtres ou corps).
33
+ * Exporté pour la rangée de filtres de la grille, qui doit coller avec ses
34
+ * colonnes. */
35
+ export function epinglage(c, table) {
36
+ const cote = c.getIsPinned();
37
+ if (!cote)
38
+ return { classes: false };
39
+ const voisines = cote === 'left' ? table.getLeftVisibleLeafColumns() : table.getRightVisibleLeafColumns();
40
+ const rang = voisines.findIndex((v) => v.id === c.id);
41
+ // Le bord : la dernière à gauche, la première à droite, celle qui touche
42
+ // ce qui défile.
43
+ const bord = cote === 'left' ? rang === voisines.length - 1 : rang === 0;
44
+ const decalage = cote === 'left'
45
+ ? { px: c.getStart('left'), gouttieres: rang }
46
+ : { px: c.getAfter('right'), gouttieres: voisines.length - 1 - rang };
47
+ const valeur = `calc(${decalage.px}px + ${decalage.gouttieres} * var(--zv-grille-gap))`;
48
+ return {
49
+ classes: cx('zv-cell--pin', cote === 'right' && 'zv-cell--pin-droite', bord && 'zv-cell--pin-bord'),
50
+ style: cote === 'left' ? { left: valeur } : { right: valeur },
51
+ };
52
+ }
53
+ /** Les colonnes visibles DANS L'ORDRE DU RENDU : épinglées à gauche,
54
+ * centrales, épinglées à droite. C'est l'ordre des en-têtes et des cellules ;
55
+ * `getVisibleLeafColumns()`, lui, ignore l'épinglage, et un gabarit bâti
56
+ * dessus donne à la première colonne la largeur d'une autre. */
57
+ export function colonnesAffichees(table) {
58
+ return [
59
+ ...table.getLeftVisibleLeafColumns(),
60
+ ...table.getCenterVisibleLeafColumns(),
61
+ ...table.getRightVisibleLeafColumns(),
62
+ ];
63
+ }
64
+ export function DataTable({ table, vide, onRowClick, celluleEntete, sousEntete, className, }) {
65
+ const grille = table.options.enableColumnResizing === true;
66
+ const reglages = table.getState().columnSizing;
67
+ const colonnes = colonnesAffichees(table);
6
68
  const gabarit = colonnes
7
- .map((c) => c.columnDef.meta?.largeur ?? 'minmax(0, 1fr)')
69
+ .map((c) => grille ? piste(c, reglages[c.id] != null) : (c.columnDef.meta?.largeur ?? 'minmax(0, 1fr)'))
8
70
  .join(' ');
9
71
  const lignes = table.getRowModel().rows;
10
- return (_jsxs("div", { className: cx('zv-table', className), style: { ['--zv-cols']: gabarit }, children: [table.getHeaderGroups().map((groupe) => (_jsx("div", { className: "zv-table__head", children: groupe.headers.map((entete) => {
72
+ const style = { '--zv-cols': gabarit };
73
+ if (grille) {
74
+ style['--zv-cols-somme'] = `${colonnes.reduce((s, c) => s + c.getSize(), 0)}px`;
75
+ style['--zv-cols-n'] = String(colonnes.length);
76
+ }
77
+ return (_jsxs("div", { className: cx('zv-table', className), style: style, children: [table.getHeaderGroups().map((groupe) => (_jsx("div", { className: "zv-table__head", children: groupe.headers.map((entete) => {
11
78
  const triable = entete.column.getCanSort();
12
79
  const sens = entete.column.getIsSorted();
13
80
  const registre = entete.column.columnDef.meta?.registre;
14
81
  const contenu = entete.isPlaceholder
15
82
  ? null
16
83
  : flexRender(entete.column.columnDef.header, entete.getContext());
17
- return (_jsx("div", { className: cx('zv-cell', registre === 'num' && 'zv-cell--num'), "aria-sort": sens === 'asc' ? 'ascending' : sens === 'desc' ? 'descending' : undefined, children: triable ? (_jsxs("button", { type: "button", className: "zv-sort", onClick: entete.column.getToggleSortingHandler(), children: [contenu, _jsx("span", { className: "zv-sort__mark", "aria-hidden": "true", children: sens === 'asc' ? '↑' : sens === 'desc' ? '↓' : '↕' })] })) : (contenu) }, entete.id));
18
- }) }, groupe.id))), lignes.length === 0
84
+ const pin = grille ? epinglage(entete.column, table) : { classes: false };
85
+ const ariaSort = sens === 'asc' ? 'ascending' : sens === 'desc' ? 'descending' : undefined;
86
+ const props = {
87
+ entete,
88
+ className: cx('zv-cell', registre === 'num' && 'zv-cell--num', pin.classes),
89
+ style: pin.style,
90
+ // La colonne triée est annoncée : sans aria-sort, le tri est
91
+ // une information purement visuelle.
92
+ 'aria-sort': ariaSort,
93
+ children: triable ? (_jsxs("button", { type: "button", className: "zv-sort", onClick: entete.column.getToggleSortingHandler(), children: [celluleEntete ? _jsx("span", { className: "zv-colhead__label", children: contenu }) : contenu, _jsx("span", { className: "zv-sort__mark", "aria-hidden": "true", children: sens === 'asc' ? '↑' : sens === 'desc' ? '↓' : '↕' })] })) : celluleEntete ? (_jsx("span", { className: "zv-colhead__label", children: contenu })) : (contenu),
94
+ };
95
+ if (celluleEntete)
96
+ return _jsx(Fragment, { children: celluleEntete(props) }, entete.id);
97
+ return (_jsx("div", { className: props.className, style: props.style, "aria-sort": props['aria-sort'], children: props.children }, entete.id));
98
+ }) }, groupe.id))), sousEntete, lignes.length === 0
19
99
  ? vide
20
- : lignes.map((ligne) => (_jsx("div", { className: "zv-row",
100
+ : lignes.map((ligne) => (_jsx("div", { className: cx('zv-row', ligne.getIsSelected() && 'zv-row--selected'),
21
101
  // Le clavier suit le clic : une ligne cliquable qui n'est pas
22
102
  // atteignable au clavier est une action inaccessible.
23
103
  role: onRowClick ? 'button' : undefined, tabIndex: onRowClick ? 0 : undefined, style: onRowClick ? undefined : { cursor: 'default' }, onClick: onRowClick ? () => onRowClick(ligne.original) : undefined, onKeyDown: onRowClick
@@ -29,7 +109,8 @@ export function DataTable({ table, vide, onRowClick, className }) {
29
109
  }
30
110
  : undefined, children: ligne.getVisibleCells().map((cellule) => {
31
111
  const meta = cellule.column.columnDef.meta;
32
- return (_jsxs("div", { className: cx('zv-cell', meta?.registre === 'nom' && 'zv-cell--name', meta?.registre === 'num' && 'zv-cell--num'), children: [meta?.label && _jsx("span", { className: "zv-cell__label", children: meta.label }), flexRender(cellule.column.columnDef.cell, cellule.getContext()), meta?.unite && _jsx("span", { className: "zv-cell__unit", children: meta.unite })] }, cellule.id));
112
+ const pin = grille ? epinglage(cellule.column, table) : { classes: false };
113
+ return (_jsxs("div", { className: cx('zv-cell', meta?.registre === 'nom' && 'zv-cell--name', meta?.registre === 'num' && 'zv-cell--num', meta?.classe, pin.classes), style: pin.style, children: [meta?.label && _jsx("span", { className: "zv-cell__label", children: meta.label }), flexRender(cellule.column.columnDef.cell, cellule.getContext()), meta?.unite && _jsx("span", { className: "zv-cell__unit", children: meta.unite })] }, cellule.id));
33
114
  }) }, ligne.id)))] }));
34
115
  }
35
116
  //# sourceMappingURL=data-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.js","sourceRoot":"","sources":["../react/data-table.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-table.js","sourceRoot":"","sources":["../react/data-table.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ import type { ReactNode } from 'react';
2
+ import { type Column, type ColumnDef, type ColumnOrderState, type ColumnPinningState, type ColumnSizingState, type FilterFn, type SortingState, type Table as TableTanstack, type VisibilityState } from '@tanstack/react-table';
3
+ import { usePersistedState } from './use-persisted-state.js';
4
+ export { usePersistedState };
5
+ /** Identifiant réservé de la colonne de cases. */
6
+ export declare const COLONNE_SELECTION = "__selection";
7
+ /** Ce que la grille enregistre, par tableau. Les filtres et la sélection
8
+ * n'en font PAS partie : retrouver un filtre oublié d'une visite à l'autre
9
+ * fait croire que des lignes ont disparu. */
10
+ export interface VueGrille {
11
+ columnOrder: ColumnOrderState;
12
+ columnVisibility: VisibilityState;
13
+ columnSizing: ColumnSizingState;
14
+ columnPinning: ColumnPinningState;
15
+ sorting: SortingState;
16
+ pageSize: number;
17
+ }
18
+ /** Les tailles de page proposées au pied. */
19
+ export declare const TAILLES_PAGE: readonly [25, 50, 100];
20
+ /** Toute la copie de la grille. Aucun libellé, visible ou annoncé, n'est
21
+ * écrit en dur : une app anglaise passe les siens par `textes`, sans quoi
22
+ * elle n'aurait AUCUN recours (le CSS ne traduit pas un aria-label). */
23
+ export interface TextesGrille {
24
+ rechercher: string;
25
+ colonnes: string;
26
+ colonnesAffichees: string;
27
+ exporter: string;
28
+ reinitialiser: string;
29
+ filtrer: string;
30
+ /** Première option d'un filtre à choix : aucune restriction. */
31
+ tous: string;
32
+ du: string;
33
+ au: string;
34
+ min: string;
35
+ max: string;
36
+ effacer: string;
37
+ /** Raccourcis de période du filtre de dates. */
38
+ periodes: string;
39
+ aujourdhui: string;
40
+ septJours: string;
41
+ trenteJours: string;
42
+ ceMois: string;
43
+ cetteAnnee: string;
44
+ /** Résumé d'une plage dans son déclencheur (« ≥ 10 », « 01/03 → 15/03 »).
45
+ * Les dates arrivent en ISO (AAAA-MM-JJ). */
46
+ resumeNombres: (min: string, max: string) => string;
47
+ resumeDates: (du: string, au: string) => string;
48
+ filtrerColonne: (nom: string) => string;
49
+ deplacer: (nom: string) => string;
50
+ largeur: (nom: string) => string;
51
+ largeurAide: string;
52
+ epinglerGauche: (nom: string) => string;
53
+ epinglerDroite: (nom: string) => string;
54
+ detacher: (nom: string) => string;
55
+ aGauche: string;
56
+ aDroite: string;
57
+ toutSelectionner: string;
58
+ selectionnerLigne: string;
59
+ choisies: (n: number) => string;
60
+ aucuneDonnee: string;
61
+ aucunResultat: string;
62
+ aucuneLigne: string;
63
+ compte: (debut: number, fin: number, total: number) => string;
64
+ parPage: (n: number) => string;
65
+ lignesParPage: string;
66
+ pagination: string;
67
+ pagePrecedente: string;
68
+ pageSuivante: string;
69
+ page: (page: number, pages: number) => string;
70
+ dndInstructions: string;
71
+ dndSaisie: (nom: string) => string;
72
+ dndSurvol: (nom: string, cible: string) => string;
73
+ dndHors: (nom: string) => string;
74
+ dndPose: (nom: string, cible: string) => string;
75
+ dndReposee: (nom: string) => string;
76
+ dndAnnule: (nom: string) => string;
77
+ }
78
+ export declare const TEXTES_GRILLE: TextesGrille;
79
+ export interface DataGridProps<T> {
80
+ /** Identifiant STABLE du tableau : il nomme la vue enregistrée
81
+ * (`table:<tableId>:v1`). Deux tableaux qui le partagent partagent leur
82
+ * vue ; le changer fait oublier celle de tous les utilisateurs. */
83
+ tableId: string;
84
+ data: T[];
85
+ /** Colonnes TanStack. Chacune doit avoir un `id` ou un `accessorKey`
86
+ * textuel : c'est lui que la vue enregistre. `size` est la largeur
87
+ * PLANCHER en pixels (150 par défaut) : la colonne s'étire au-delà tant
88
+ * qu'on ne l'a pas réglée. `meta.registre`, `meta.label`, `meta.unite`
89
+ * sont ceux de `DataTable`. */
90
+ columns: ColumnDef<T, any>[];
91
+ /** Clic (ou Entrée) sur une ligne. Sans lui, la ligne n'est pas
92
+ * cliquable, et elle n'en a pas l'air. */
93
+ onRowClick?: (ligne: T) => void;
94
+ /** Identifiant de ligne. Indispensable avec `selection` dès que les
95
+ * données se rechargent : par défaut c'est l'INDEX, et une ligne cochée
96
+ * deviendrait une autre ligne après un tri côté serveur. */
97
+ getRowId?: (ligne: T, index: number) => string;
98
+ /** Une colonne de cases, épinglée à gauche. */
99
+ selection?: boolean;
100
+ onSelectionChange?: (lignes: T[]) => void;
101
+ /** Lignes par page (25, 50 ou 100), ou `false` pour tout afficher. */
102
+ parPage?: (typeof TAILLES_PAGE)[number] | false;
103
+ /** Champ de recherche sur toutes les colonnes. Par défaut : oui. */
104
+ recherche?: boolean;
105
+ /** Rangée de filtres sous les intitulés. Par défaut : oui. */
106
+ filtres?: boolean;
107
+ /** Bouton d'export CSV des lignes filtrées et triées, colonnes visibles.
108
+ * Une chaîne nomme le fichier (sans extension). Par défaut : oui. */
109
+ exportCsv?: boolean | string;
110
+ /** Vue par défaut : colonnes masquées, épinglées, tri. C'est elle que
111
+ * « Réinitialiser la vue » rétablit. */
112
+ vueInitiale?: {
113
+ masquees?: string[];
114
+ epingleesGauche?: string[];
115
+ epingleesDroite?: string[];
116
+ tri?: SortingState;
117
+ };
118
+ /** Ligne d'absence quand aucune ligne ne correspond. */
119
+ vide?: ReactNode;
120
+ /** Actions propres à l'app, posées dans la barre avant les réglages de
121
+ * vue. ⚠️ Un seul bouton plein par page : la grille n'en pose aucun, le
122
+ * vôtre peut être celui-là. */
123
+ outils?: ReactNode;
124
+ /** Copie de la grille, à remplacer en tout ou partie (traduction). */
125
+ textes?: Partial<TextesGrille>;
126
+ className?: string;
127
+ }
128
+ /** L'identifiant d'une définition de colonne, tel que TanStack le dérive. */
129
+ export declare function idDeColonne<T>(c: ColumnDef<T, any>): string | undefined;
130
+ /**
131
+ * Adapte une vue LUE (d'une version précédente du code, ou abîmée) aux
132
+ * colonnes d'aujourd'hui : un identifiant qui n'existe plus est ignoré, une
133
+ * colonne nouvelle s'ajoute en FIN d'ordre. Sans cela, ajouter une colonne
134
+ * au code la ferait disparaître chez tous ceux qui avaient déplacé une
135
+ * colonne avant. Rend `undefined` si rien n'est exploitable.
136
+ */
137
+ export declare function reconcilierVue(lu: unknown, defaut: VueGrille, ids: string[]): VueGrille | undefined;
138
+ /** Les quatre familles de filtre. Elles se DÉDUISENT des données (voir
139
+ * `typeDeFiltre`) ; une colonne peut l'imposer par `meta.filtre`. */
140
+ export type TypeFiltre = 'texte' | 'nombre' | 'date' | 'choix';
141
+ /** La valeur d'un filtre de colonne, telle que TanStack la tient. */
142
+ export type ValeurFiltre = {
143
+ type: 'texte';
144
+ valeur: string;
145
+ } | {
146
+ type: 'choix';
147
+ valeur: string;
148
+ } | {
149
+ type: 'nombre';
150
+ min: string;
151
+ max: string;
152
+ } | {
153
+ type: 'date';
154
+ du: string;
155
+ au: string;
156
+ };
157
+ /** Une valeur ramenée au jour, `AAAA-MM-JJ`, dans le fuseau du NAVIGATEUR :
158
+ * une échéance au 3 mars à 23 h 30 à Paris est le 3 mars, pas le 4 qu'en
159
+ * dirait `toISOString()`. Rend `null` pour ce qui n'est pas une date. */
160
+ export declare function versJour(v: unknown): string | null;
161
+ /** Au-delà, une liste déroulante devient plus longue à parcourir qu'un mot
162
+ * à taper : la colonne reste en texte libre. */
163
+ export declare const CHOIX_MAX = 20;
164
+ /**
165
+ * La famille de filtre d'une colonne, d'après ses valeurs : `meta.filtre`
166
+ * d'abord, puis un nombre (registre `num`, ou valeurs numériques), une date
167
+ * (objets `Date` ou chaînes ISO), un CHOIX quand les valeurs distinctes sont
168
+ * peu nombreuses ET se répètent (sinon chaque ligne serait une option), du
169
+ * texte enfin.
170
+ */
171
+ export declare function typeDeFiltre(meta: {
172
+ filtre?: TypeFiltre | false;
173
+ registre?: 'nom' | 'num';
174
+ } | undefined, valeurs: unknown[]): TypeFiltre | false;
175
+ /** Le filtre de toutes les colonnes de la grille : il lit la FORME de la
176
+ * valeur, pas la colonne. Bornes comprises. */
177
+ export declare const filtreGrille: FilterFn<any>;
178
+ /** Ne garde d'une saisie que ce qui peut faire un nombre : chiffres, un
179
+ * signe moins en tête, un séparateur décimal. Les lettres ne s'écrivent
180
+ * pas, plutôt que de s'écrire puis d'être refusées. */
181
+ export declare function saisieNombre(texte: string): string;
182
+ /** Une date saisie est-elle COMPLÈTE ? Le champ date natif rend une valeur
183
+ * dès que les trois segments sont remplis, y compris pendant qu'on tape
184
+ * l'année : « 0002 », puis « 0020 », puis « 0202 ». Filtrer sur ces états
185
+ * intermédiaires faisait disparaître puis revenir toutes les lignes à
186
+ * chaque chiffre. On n'applique qu'une année plausible. */
187
+ export declare function dateComplete(v: string): boolean;
188
+ /** Les raccourcis de période, en jours ISO, calculés depuis `maintenant`. */
189
+ export declare function periodes(maintenant: Date): Record<'aujourdhui' | 'septJours' | 'trenteJours' | 'ceMois' | 'cetteAnnee', [
190
+ string,
191
+ string
192
+ ]>;
193
+ /** L'intitulé lisible d'une colonne : pour les menus, l'export, les annonces. */
194
+ export declare function libelleColonne<T>(c: Column<T, unknown>): string;
195
+ /** Les lignes filtrées et triées, colonnes visibles, en CSV : point-virgule
196
+ * (le séparateur qu'Excel attend en français), guillemets doublés, dates en
197
+ * ISO. Les VALEURS, pas le rendu : une pastille d'état s'exporte par son
198
+ * libellé de données, pas par son HTML. */
199
+ export declare function versCsv<T>(table: TableTanstack<T>): string;
200
+ export declare function DataGrid<T>({ tableId, data, columns, onRowClick, getRowId, selection, onSelectionChange, parPage, recherche, filtres, exportCsv, vueInitiale, vide, outils, textes, className, }: DataGridProps<T>): import("react").JSX.Element;
201
+ //# sourceMappingURL=grille.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grille.d.ts","sourceRoot":"","sources":["../react/grille.tsx"],"names":[],"mappings":"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"}