@navette-js/tables 0.0.0-stage → 1.0.0-beta.1
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.
- package/LICENSE +21 -0
- package/README.md +8 -2
- package/lib/index.d.ts +786 -0
- package/lib/index.js +1307 -0
- package/lib/query-builder.d.ts +302 -0
- package/lib/query-builder.js +875 -0
- package/package.json +50 -4
- package/views/asset.ejs +1 -0
- package/views/column-manager.ejs +146 -0
- package/views/index.ejs +791 -0
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,786 @@
|
|
|
1
|
+
import type { DataAdapter, ListQuery, Page as RecordPage, SortDirection } from '@navette-js/database';
|
|
2
|
+
import { Attributes, type ColorManager } from '@navette-js/support';
|
|
3
|
+
export * from './query-builder.ts';
|
|
4
|
+
/** Emplacements de render hook d'une table — mêmes noms que `Filament\Tables\View\TablesRenderHook`. */
|
|
5
|
+
export declare const TablesRenderHook: {
|
|
6
|
+
readonly CONTENT_AFTER: "tables::content.after";
|
|
7
|
+
readonly CONTENT_BEFORE: "tables::content.before";
|
|
8
|
+
readonly SELECTION_INDICATOR_ACTIONS_AFTER: "tables::selection.indicator.actions.after";
|
|
9
|
+
readonly SELECTION_INDICATOR_ACTIONS_BEFORE: "tables::selection.indicator.actions.before";
|
|
10
|
+
readonly HEADER_AFTER: "tables::header.after";
|
|
11
|
+
readonly HEADER_BEFORE: "tables::header.before";
|
|
12
|
+
readonly TOOLBAR_AFTER: "tables::toolbar.after";
|
|
13
|
+
readonly TOOLBAR_BEFORE: "tables::toolbar.before";
|
|
14
|
+
readonly TOOLBAR_COLUMN_MANAGER_TRIGGER_AFTER: "tables::toolbar.toggle-column-trigger.after";
|
|
15
|
+
readonly TOOLBAR_COLUMN_MANAGER_TRIGGER_BEFORE: "tables::toolbar.toggle-column-trigger.before";
|
|
16
|
+
readonly TOOLBAR_END: "tables::toolbar.end";
|
|
17
|
+
readonly TOOLBAR_GROUPING_SELECTOR_AFTER: "tables::toolbar.grouping-selector.after";
|
|
18
|
+
readonly TOOLBAR_GROUPING_SELECTOR_BEFORE: "tables::toolbar.grouping-selector.before";
|
|
19
|
+
readonly TOOLBAR_REORDER_TRIGGER_AFTER: "tables::toolbar.reorder-trigger.after";
|
|
20
|
+
readonly TOOLBAR_REORDER_TRIGGER_BEFORE: "tables::toolbar.reorder-trigger.before";
|
|
21
|
+
readonly TOOLBAR_SEARCH_AFTER: "tables::toolbar.search.after";
|
|
22
|
+
readonly TOOLBAR_SEARCH_BEFORE: "tables::toolbar.search.before";
|
|
23
|
+
readonly TOOLBAR_START: "tables::toolbar.start";
|
|
24
|
+
readonly FILTER_INDICATORS: "tables::filter.indicators";
|
|
25
|
+
readonly HEADER_CELL: "tables::header.cell";
|
|
26
|
+
/** Anciens noms, conservés par Filament. */
|
|
27
|
+
readonly TOOLBAR_TOGGLE_COLUMN_TRIGGER_AFTER: "tables::toolbar.toggle-column-trigger.after";
|
|
28
|
+
readonly TOOLBAR_TOGGLE_COLUMN_TRIGGER_BEFORE: "tables::toolbar.toggle-column-trigger.before";
|
|
29
|
+
};
|
|
30
|
+
/** Cibles de chargement de la table (`wire:target`), dans l'ordre émis par Filament. */
|
|
31
|
+
export declare const LOADING_TARGETS = "activeTab,applyTableFilters,gotoPage,nextPage,previousPage,removeTableFilter,removeTableFilters,reorderTable,resetTableColumnSearch,resetTableFiltersForm,resetTableSearch,setPage,sortTable,tableColumnSearches,tableFilters,tableGrouping,tableRecordsPerPage,tableSearch,tableSort,toggleTableReordering";
|
|
32
|
+
type StateResolver<R> = (ctx: {
|
|
33
|
+
record: R;
|
|
34
|
+
}) => unknown | Promise<unknown>;
|
|
35
|
+
/** Base commune des colonnes (port partiel de Filament\Tables\Columns\Column). */
|
|
36
|
+
export declare abstract class Column<R = any> {
|
|
37
|
+
/** Réglage par défaut de toutes les instances créées ensuite par `make()` : `TextInput.configureUsing((input) => input.maxLength(255))`. */
|
|
38
|
+
static configureUsing<T>(this: abstract new (...args: any[]) => T, configure: (instance: T) => void): void;
|
|
39
|
+
readonly name: string;
|
|
40
|
+
protected _label: string | null;
|
|
41
|
+
protected _sortable: boolean;
|
|
42
|
+
protected _searchable: boolean;
|
|
43
|
+
protected _individuallySearchable: boolean;
|
|
44
|
+
protected _toggleable: boolean;
|
|
45
|
+
protected _toggledHiddenByDefault: boolean;
|
|
46
|
+
protected _alignment: string | null;
|
|
47
|
+
protected _state: StateResolver<R> | null;
|
|
48
|
+
protected _sortColumn: string | null;
|
|
49
|
+
protected _searchColumn: string | null;
|
|
50
|
+
protected _url: ((record: R) => string | null) | null;
|
|
51
|
+
/** Libellé du groupe de colonnes auquel la colonne appartient (posé par ColumnGroup). */
|
|
52
|
+
_group: string | null;
|
|
53
|
+
constructor(name: string);
|
|
54
|
+
label(label: string): this;
|
|
55
|
+
/** `column` : colonne (ou alias de la requête) utilisée pour trier quand elle diffère du nom, par exemple pour une relation. */
|
|
56
|
+
sortable(condition?: boolean | {
|
|
57
|
+
column: string;
|
|
58
|
+
inverted?: boolean;
|
|
59
|
+
}): this;
|
|
60
|
+
getSortColumn(): string;
|
|
61
|
+
private _sortInverted;
|
|
62
|
+
/** Vrai quand la colonne de tri évolue en sens inverse de la valeur affichée (`inverted` : un âge trié par sa date). */
|
|
63
|
+
isSortInverted(): boolean;
|
|
64
|
+
/** Lien posé sur la cellule ; il prend le pas sur l'action de ligne. */
|
|
65
|
+
url(resolver: (record: R) => string | null): this;
|
|
66
|
+
getUrl(record: R): string | null;
|
|
67
|
+
/** `isGlobal: false` exclut la colonne de la recherche globale ; `isIndividual` ajoute un champ de recherche propre à la colonne. */
|
|
68
|
+
getSearchColumn(): string;
|
|
69
|
+
searchable(options?: boolean | {
|
|
70
|
+
isIndividual?: boolean;
|
|
71
|
+
isGlobal?: boolean;
|
|
72
|
+
column?: string;
|
|
73
|
+
}): this;
|
|
74
|
+
/** Colonne que l'utilisateur peut masquer depuis le gestionnaire de colonnes. */
|
|
75
|
+
toggleable(condition?: boolean, options?: {
|
|
76
|
+
isToggledHiddenByDefault?: boolean;
|
|
77
|
+
}): this;
|
|
78
|
+
alignment(alignment: 'start' | 'center' | 'end' | null): this;
|
|
79
|
+
alignEnd(): this;
|
|
80
|
+
alignLeft(): this;
|
|
81
|
+
alignCenter(): this;
|
|
82
|
+
getStateUsing(resolver: StateResolver<R>): this;
|
|
83
|
+
getLabel(): string;
|
|
84
|
+
isSortable(): boolean;
|
|
85
|
+
isGloballySearchable(): boolean;
|
|
86
|
+
isIndividuallySearchable(): boolean;
|
|
87
|
+
isToggleable(): boolean;
|
|
88
|
+
isToggledHiddenByDefault(): boolean;
|
|
89
|
+
getAlignment(): string | null;
|
|
90
|
+
/** Suffixe des classes `fi-ta-header-cell-…` / `fi-ta-cell-…` : les tirets bas deviennent des tirets, les points sont conservés (comme Filament). */
|
|
91
|
+
getCssName(): string;
|
|
92
|
+
getState(record: R): Promise<unknown>;
|
|
93
|
+
/** Vrai pour une cellule modifiable : elle n'est enveloppée ni d'un lien ni d'un bouton vers l'enregistrement. */
|
|
94
|
+
isClickDisabled(): boolean;
|
|
95
|
+
abstract toHtml(record: R, recordKey?: string | number): Promise<string>;
|
|
96
|
+
}
|
|
97
|
+
export declare class TextColumn<R = any> extends Column<R> {
|
|
98
|
+
private _weight;
|
|
99
|
+
private _copyable;
|
|
100
|
+
private _money;
|
|
101
|
+
private _placeholder;
|
|
102
|
+
private _badge;
|
|
103
|
+
private _color;
|
|
104
|
+
private _icon;
|
|
105
|
+
private _format;
|
|
106
|
+
private _date;
|
|
107
|
+
private _numeric;
|
|
108
|
+
private _summarizers;
|
|
109
|
+
private _limit;
|
|
110
|
+
private _tooltip;
|
|
111
|
+
static make<R = any>(name: string): TextColumn<R>;
|
|
112
|
+
/** Affiche la valeur dans une pastille. */
|
|
113
|
+
badge(condition?: boolean): this;
|
|
114
|
+
color(color: string | ((record: R) => string)): this;
|
|
115
|
+
icon(resolver: (record: R) => string | null): this;
|
|
116
|
+
/** Texte affiché à la place de la valeur brute (libellé d'une énumération, par exemple). */
|
|
117
|
+
formatStateUsing(formatter: (ctx: {
|
|
118
|
+
state: unknown;
|
|
119
|
+
record: R;
|
|
120
|
+
}) => string): this;
|
|
121
|
+
/** Date courte, comme `->date()` de Filament (« Nov 9, 2026 »). */
|
|
122
|
+
date(condition?: boolean): this;
|
|
123
|
+
private _dateTime;
|
|
124
|
+
/** Date et heure, « M j, Y H:i:s » (format par défaut de Filament). */
|
|
125
|
+
dateTime(condition?: boolean): this;
|
|
126
|
+
/** Nombre formaté avec séparateurs de milliers (`->numeric()`). */
|
|
127
|
+
private _decimals;
|
|
128
|
+
/** `numeric(1)` : nombre de décimales fixe. */
|
|
129
|
+
numeric(condition?: boolean | number): this;
|
|
130
|
+
/** Ligne de totaux sous la table. */
|
|
131
|
+
summarize(summarizer: Summarizer | Summarizer[]): this;
|
|
132
|
+
getSummarizers(): Summarizer[];
|
|
133
|
+
weight(weight: string): this;
|
|
134
|
+
/** Tronque le texte affiché à `length` caractères, suivi de « ... » (port de `limit()`, Str::limit). */
|
|
135
|
+
limit(length: number | null): this;
|
|
136
|
+
/** Infobulle au survol du texte ; `null` pour ne pas en afficher. */
|
|
137
|
+
tooltip(tooltip: ((record: R) => string | null) | string | null): this;
|
|
138
|
+
copyable(condition?: boolean): this;
|
|
139
|
+
/** Montant formaté dans la devise donnée (`money('usd')`). */
|
|
140
|
+
money(currency?: string | ((record: R) => string)): this;
|
|
141
|
+
/** Texte affiché quand la valeur est vide. */
|
|
142
|
+
placeholder(text: string | null): this;
|
|
143
|
+
/** Contenu de cellule. Filament a deux balisages : un chemin court pour le texte simple, un chemin complet dès qu'une option est posée. */
|
|
144
|
+
toHtml(record: R): Promise<string>;
|
|
145
|
+
}
|
|
146
|
+
/** Valeurs dont un summarizer tire son résultat : agrégats de la requête (tous les enregistrements) ou de la page affichée. */
|
|
147
|
+
export type SummaryValues = {
|
|
148
|
+
count: number;
|
|
149
|
+
sum: Record<string, number>;
|
|
150
|
+
avg: Record<string, number>;
|
|
151
|
+
min: Record<string, unknown>;
|
|
152
|
+
max: Record<string, unknown>;
|
|
153
|
+
};
|
|
154
|
+
export type SummaryItem = {
|
|
155
|
+
type: 'text' | 'range';
|
|
156
|
+
label: string | null;
|
|
157
|
+
value: string;
|
|
158
|
+
};
|
|
159
|
+
/** Résumé d'une colonne sous la table (port de Summarizers\Summarizer) : somme, moyenne, nombre ou étendue. */
|
|
160
|
+
export declare abstract class Summarizer {
|
|
161
|
+
abstract readonly kind: 'sum' | 'avg' | 'count' | 'range';
|
|
162
|
+
protected _label: string | null;
|
|
163
|
+
protected _money: string | null;
|
|
164
|
+
label(label: string | null): this;
|
|
165
|
+
money(currency?: string): this;
|
|
166
|
+
getLabel(): string | null;
|
|
167
|
+
format(value: number): string;
|
|
168
|
+
abstract summarize(column: string, values: SummaryValues): SummaryItem | null;
|
|
169
|
+
}
|
|
170
|
+
/** Total d'une colonne (port du summarizer Sum). */
|
|
171
|
+
export declare class Sum extends Summarizer {
|
|
172
|
+
readonly kind = "sum";
|
|
173
|
+
static make(): Sum;
|
|
174
|
+
getLabel(): string;
|
|
175
|
+
summarize(column: string, values: SummaryValues): SummaryItem;
|
|
176
|
+
}
|
|
177
|
+
/** Moyenne d'une colonne (port du summarizer Average). */
|
|
178
|
+
export declare class Average extends Summarizer {
|
|
179
|
+
readonly kind = "avg";
|
|
180
|
+
static make(): Average;
|
|
181
|
+
getLabel(): string;
|
|
182
|
+
summarize(column: string, values: SummaryValues): SummaryItem;
|
|
183
|
+
}
|
|
184
|
+
/** Nombre d'enregistrements (port du summarizer Count). */
|
|
185
|
+
export declare class Count extends Summarizer {
|
|
186
|
+
readonly kind = "count";
|
|
187
|
+
static make(): Count;
|
|
188
|
+
getLabel(): string;
|
|
189
|
+
summarize(_column: string, values: SummaryValues): SummaryItem;
|
|
190
|
+
}
|
|
191
|
+
/** Plus petite et plus grande valeur d'une colonne (port du summarizer Range). */
|
|
192
|
+
export declare class Range extends Summarizer {
|
|
193
|
+
readonly kind = "range";
|
|
194
|
+
private _minimalDateTime;
|
|
195
|
+
static make(): Range;
|
|
196
|
+
/** Dates : le jour seul quand les deux bornes diffèrent de jour, le jour et l'heure sinon ; une seule valeur si elles sont identiques. */
|
|
197
|
+
minimalDateTimeDifference(condition?: boolean): this;
|
|
198
|
+
summarize(column: string, values: SummaryValues): SummaryItem | null;
|
|
199
|
+
}
|
|
200
|
+
/** Regroupement des lignes d'une table (port de Grouping\Group) : les lignes sont triées par la colonne, un en-tête précède chaque groupe. */
|
|
201
|
+
export declare class Group<R = any> {
|
|
202
|
+
private id;
|
|
203
|
+
private _label;
|
|
204
|
+
private _column;
|
|
205
|
+
private _title;
|
|
206
|
+
private _description;
|
|
207
|
+
private _collapsible;
|
|
208
|
+
private _date;
|
|
209
|
+
private _titlePrefixedWithLabel;
|
|
210
|
+
constructor(id: string);
|
|
211
|
+
static make<R = any>(id: string): Group<R>;
|
|
212
|
+
label(label: string | null): this;
|
|
213
|
+
/** Colonne de la requête qui porte la valeur du groupe, quand elle diffère de l'identifiant (relation). */
|
|
214
|
+
column(column: string | null): this;
|
|
215
|
+
/** Titre du groupe tiré de l'enregistrement (libellé d'une énumération, par exemple). */
|
|
216
|
+
getTitleUsing(resolver: ((record: R) => string | null) | null): this;
|
|
217
|
+
getDescriptionUsing(resolver: ((record: R) => string | null) | null): this;
|
|
218
|
+
/** Noms de Filament (`getTitleFromRecordUsing`, `getDescriptionFromRecordUsing`). */
|
|
219
|
+
getTitleFromRecordUsing(resolver: ((record: R) => string | null) | null): this;
|
|
220
|
+
getDescriptionFromRecordUsing(resolver: ((record: R) => string | null) | null): this;
|
|
221
|
+
/** Les groupes se replient d'un clic sur leur en-tête. */
|
|
222
|
+
collapsible(condition?: boolean): this;
|
|
223
|
+
/** La colonne est une date : les lignes d'un même jour forment un groupe. */
|
|
224
|
+
date(condition?: boolean): this;
|
|
225
|
+
titlePrefixedWithLabel(condition?: boolean): this;
|
|
226
|
+
getId(): string;
|
|
227
|
+
getLabel(): string;
|
|
228
|
+
getColumn(): string;
|
|
229
|
+
isCollapsible(): boolean;
|
|
230
|
+
isDate(): boolean;
|
|
231
|
+
isTitlePrefixedWithLabel(): boolean;
|
|
232
|
+
/** Valeur du groupe pour un enregistrement, en texte ; `null` quand elle est vide. */
|
|
233
|
+
getStringKey(record: R): string | null;
|
|
234
|
+
getTitle(record: R): string | null;
|
|
235
|
+
getDescription(record: R): string | null;
|
|
236
|
+
/** Restreint une requête aux enregistrements du groupe de clé donnée. */
|
|
237
|
+
scope(query: any, key: string | null): void;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Mise en page des colonnes (port de Tables\Columns\Layout) : dès qu'une table en contient une, ses enregistrements sont
|
|
241
|
+
* rendus en cartes (`fi-ta-content`) et non plus en lignes de tableau ; le tri passe par un sélecteur « Sort by ».
|
|
242
|
+
*/
|
|
243
|
+
export declare abstract class ColumnLayout<R = any> {
|
|
244
|
+
protected _children: (Column<R> | ColumnLayout<R>)[];
|
|
245
|
+
constructor(children: (Column<R> | ColumnLayout<R>)[]);
|
|
246
|
+
getChildren(): (Column<R> | ColumnLayout<R>)[];
|
|
247
|
+
/** Colonnes feuilles, dans l'ordre : ce sont elles que la table trie, cherche et masque. */
|
|
248
|
+
getColumns(): Column<R>[];
|
|
249
|
+
abstract getClasses(): string[];
|
|
250
|
+
}
|
|
251
|
+
/** Colonnes côte à côte, à partir d'un point de rupture (port de Layout\Split). */
|
|
252
|
+
export declare class Split<R = any> extends ColumnLayout<R> {
|
|
253
|
+
private _from;
|
|
254
|
+
static make<R = any>(children: (Column<R> | ColumnLayout<R>)[]): Split<R>;
|
|
255
|
+
from(breakpoint: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | null): this;
|
|
256
|
+
getClasses(): string[];
|
|
257
|
+
}
|
|
258
|
+
/** Colonnes l'une sous l'autre (port de Layout\Stack). */
|
|
259
|
+
export declare class Stack<R = any> extends ColumnLayout<R> {
|
|
260
|
+
private _space;
|
|
261
|
+
private _alignment;
|
|
262
|
+
static make<R = any>(children: (Column<R> | ColumnLayout<R>)[]): Stack<R>;
|
|
263
|
+
/** Espace entre les colonnes : 1 (petit), 2 (moyen) ou 3 (grand). */
|
|
264
|
+
space(space?: 1 | 2 | 3 | null): this;
|
|
265
|
+
alignment(alignment: 'start' | 'center' | 'end'): this;
|
|
266
|
+
getClasses(): string[];
|
|
267
|
+
}
|
|
268
|
+
/** Groupe de colonnes : un intitulé commun au-dessus des en-têtes (port de ColumnGroup). */
|
|
269
|
+
export declare class ColumnGroup<R = any> {
|
|
270
|
+
private label;
|
|
271
|
+
private _columns;
|
|
272
|
+
constructor(label: string);
|
|
273
|
+
static make<R = any>(label: string): ColumnGroup<R>;
|
|
274
|
+
columns(columns: Column<R>[]): this;
|
|
275
|
+
getColumns(): Column<R>[];
|
|
276
|
+
}
|
|
277
|
+
/** Pastille de couleur (port de ColorColumn). */
|
|
278
|
+
export declare class ColorColumn<R = any> extends Column<R> {
|
|
279
|
+
static make<R = any>(name: string): ColorColumn<R>;
|
|
280
|
+
toHtml(record: R): Promise<string>;
|
|
281
|
+
}
|
|
282
|
+
/** Image (port partiel de ImageColumn) : l'état est l'adresse de l'image. Seules les adresses locales ou http(s) sont rendues. */
|
|
283
|
+
export declare class ImageColumn<R = any> extends Column<R> {
|
|
284
|
+
private _alt;
|
|
285
|
+
private _height;
|
|
286
|
+
private _circular;
|
|
287
|
+
static make<R = any>(name: string): ImageColumn<R>;
|
|
288
|
+
alt(resolver: (record: R) => string | null): this;
|
|
289
|
+
/** Hauteur CSS de l'image (`2.5rem` par défaut, comme Filament). */
|
|
290
|
+
imageHeight(height: string): this;
|
|
291
|
+
circular(condition?: boolean): this;
|
|
292
|
+
toHtml(record: R): Promise<string>;
|
|
293
|
+
}
|
|
294
|
+
/** Icône selon la valeur ; `boolean()` affiche une coche verte ou une croix rouge (port partiel de IconColumn). */
|
|
295
|
+
export declare class IconColumn<R = any> extends Column<R> {
|
|
296
|
+
private _boolean;
|
|
297
|
+
static make<R = any>(name: string): IconColumn<R>;
|
|
298
|
+
boolean(condition?: boolean): this;
|
|
299
|
+
toHtml(record: R): Promise<string>;
|
|
300
|
+
}
|
|
301
|
+
/** Règle de validation d'une colonne modifiable écrite par l'application : test synchrone et message (`:attribute` déjà remplacé). */
|
|
302
|
+
export type ColumnValidationRule = {
|
|
303
|
+
name: string;
|
|
304
|
+
passes: (value: unknown) => boolean;
|
|
305
|
+
message: (attribute: string) => string;
|
|
306
|
+
};
|
|
307
|
+
type StateHook<R> = (ctx: {
|
|
308
|
+
state: unknown;
|
|
309
|
+
record: R;
|
|
310
|
+
}) => unknown | Promise<unknown>;
|
|
311
|
+
/**
|
|
312
|
+
* Base des colonnes modifiables dans la cellule (port des traits CanBeValidated et CanUpdateState de Filament). Le navigateur appelle
|
|
313
|
+
* `updateTableColumnState(colonne, clé, valeur)` sur le composant hôte : la colonne doit être déclarée, visible et active pour cet
|
|
314
|
+
* enregistrement, la valeur passer les règles ; ensuite seulement viennent `beforeStateUpdated`, l'écriture et `afterStateUpdated`.
|
|
315
|
+
* Comme dans Filament, l'écriture ne consulte pas les droits du modèle : `disabled()` reste le moyen de restreindre la modification.
|
|
316
|
+
*/
|
|
317
|
+
export declare abstract class EditableColumn<R = any> extends Column<R> {
|
|
318
|
+
protected _disabled: ((record: R) => boolean | Promise<boolean>) | boolean;
|
|
319
|
+
protected _rules: (string | ColumnValidationRule)[];
|
|
320
|
+
protected _validationAttribute: string | null;
|
|
321
|
+
protected _validationMessages: Record<string, string>;
|
|
322
|
+
protected _updateStateUsing: StateHook<R> | null;
|
|
323
|
+
protected _beforeStateUpdated: StateHook<R> | null;
|
|
324
|
+
protected _afterStateUpdated: StateHook<R> | null;
|
|
325
|
+
protected _tooltip: ((record: R) => string | null) | string | null;
|
|
326
|
+
disabled(condition?: ((record: R) => boolean | Promise<boolean>) | boolean): this;
|
|
327
|
+
isDisabledFor(record: R): Promise<boolean>;
|
|
328
|
+
/** Une cellule modifiable n'est ni un lien ni un bouton vers l'enregistrement. */
|
|
329
|
+
isClickDisabled(): boolean;
|
|
330
|
+
isEditable(): boolean;
|
|
331
|
+
/** Règles appliquées à la valeur reçue : chaînes Laravel (`required`, `max:255`, `in:a,b`…) ou règles `{ name, passes, message }`. */
|
|
332
|
+
rules(rules: (string | ColumnValidationRule)[]): this;
|
|
333
|
+
getRules(): (string | ColumnValidationRule)[];
|
|
334
|
+
/** Équivalent de l'ajout de `required` aux règles. */
|
|
335
|
+
required(condition?: boolean): this;
|
|
336
|
+
isRequired(): boolean;
|
|
337
|
+
/** Nom de la colonne dans les messages (par défaut, le libellé avec une minuscule initiale). */
|
|
338
|
+
validationAttribute(label: string | null): this;
|
|
339
|
+
/** Messages remplaçant ceux de Laravel, par nom de règle : `{ max: 'Trop long.' }`. */
|
|
340
|
+
validationMessages(messages: Record<string, string>): this;
|
|
341
|
+
getValidationAttribute(): string;
|
|
342
|
+
/** Règles propres au type de colonne (options d'une liste, par exemple), vérifiées après celles de l'application. */
|
|
343
|
+
protected getImplicitRules(): ColumnValidationRule[];
|
|
344
|
+
/**
|
|
345
|
+
* Message d'erreur, ou `null` si la valeur est acceptable. Comme le validateur de Laravel : une valeur vide ne passe que `required`,
|
|
346
|
+
* et plusieurs erreurs donnent le premier message suivi de « (and N more errors) ».
|
|
347
|
+
*/
|
|
348
|
+
validate(input: unknown): string | null;
|
|
349
|
+
/** Écriture personnalisée, à la place de la mise à jour de la colonne de l'enregistrement. Sa valeur de retour est renvoyée au navigateur. */
|
|
350
|
+
updateStateUsing(callback: StateHook<R> | null): this;
|
|
351
|
+
beforeStateUpdated(callback: StateHook<R> | null): this;
|
|
352
|
+
afterStateUpdated(callback: StateHook<R> | null): this;
|
|
353
|
+
/** Infobulle au survol du contrôle, tant qu'aucune erreur n'est affichée. */
|
|
354
|
+
tooltip(tooltip: ((record: R) => string | null) | string | null): this;
|
|
355
|
+
getUpdateStateMessages(): Record<'saving' | 'saved' | 'failure', string>;
|
|
356
|
+
/** Valeur écrite à partir d'une valeur validée : une valeur vide devient `null` (comme `blank()` dans Filament). */
|
|
357
|
+
castState(input: unknown): unknown;
|
|
358
|
+
/**
|
|
359
|
+
* Enregistre une valeur déjà validée (port de `updateState`). Seul le nom déclaré de la colonne est écrit : une colonne de relation
|
|
360
|
+
* (`auteur.nom`) n'est modifiable qu'avec `updateStateUsing()`.
|
|
361
|
+
*/
|
|
362
|
+
updateState(record: R, input: unknown, adapter: Pick<DataAdapter<R>, 'getKey' | 'update'>): Promise<unknown>;
|
|
363
|
+
/** Expression `x-tooltip` des contrôles modifiables : l'infobulle de la colonne, remplacée par l'erreur de validation quand il y en a une. */
|
|
364
|
+
protected tooltipExpression(record: R): string;
|
|
365
|
+
/** Ouverture commune des cellules modifiables : composant Alpine chargé à la demande, état serveur et clé de l'enregistrement. */
|
|
366
|
+
protected editableAttributes(component: string, asset: string, recordKey: string | number, state: unknown): Attributes;
|
|
367
|
+
protected static readonly STATUS_HTML = "<p x-cloak x-show=\"error\" x-bind:id=\"$id('table-column-error')\" x-ref=\"error\" x-text=\"error\" class=\"fi-sr-only\"></p><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" x-text=\"status\" class=\"fi-sr-only\"></p>";
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Liste déroulante modifiable dans la cellule (port de SelectColumn, liste native seulement). La valeur reçue doit être l'une des
|
|
371
|
+
* options déclarées.
|
|
372
|
+
*/
|
|
373
|
+
export declare class SelectColumn<R = any> extends EditableColumn<R> {
|
|
374
|
+
private _options;
|
|
375
|
+
private _selectablePlaceholder;
|
|
376
|
+
static make<R = any>(name: string): SelectColumn<R>;
|
|
377
|
+
options(options: [string, string][] | Record<string, string>): this;
|
|
378
|
+
getOptions(): [string, string][];
|
|
379
|
+
selectablePlaceholder(condition?: boolean): this;
|
|
380
|
+
protected getImplicitRules(): ColumnValidationRule[];
|
|
381
|
+
toHtml(record: R, recordKey?: string | number): Promise<string>;
|
|
382
|
+
}
|
|
383
|
+
/** Interrupteur modifiable dans la cellule (port de ToggleColumn). La valeur reçue doit être un booléen (règle `boolean` par défaut). */
|
|
384
|
+
export declare class ToggleColumn<R = any> extends EditableColumn<R> {
|
|
385
|
+
private _onColor;
|
|
386
|
+
private _offColor;
|
|
387
|
+
private _onIcon;
|
|
388
|
+
private _offIcon;
|
|
389
|
+
constructor(name: string);
|
|
390
|
+
static make<R = any>(name: string): ToggleColumn<R>;
|
|
391
|
+
/** Couleur de l'interrupteur allumé (`primary` par défaut) et éteint (`gray`). */
|
|
392
|
+
onColor(color: string | null): this;
|
|
393
|
+
offColor(color: string | null): this;
|
|
394
|
+
/** Icônes affichées dans le bouton de l'interrupteur. */
|
|
395
|
+
onIcon(icon: string | null): this;
|
|
396
|
+
offIcon(icon: string | null): this;
|
|
397
|
+
castState(input: unknown): unknown;
|
|
398
|
+
toHtml(record: R, recordKey?: string | number): Promise<string>;
|
|
399
|
+
}
|
|
400
|
+
/** Case à cocher modifiable dans la cellule (port de CheckboxColumn). La valeur reçue doit être un booléen (règle `boolean` par défaut). */
|
|
401
|
+
export declare class CheckboxColumn<R = any> extends EditableColumn<R> {
|
|
402
|
+
constructor(name: string);
|
|
403
|
+
static make<R = any>(name: string): CheckboxColumn<R>;
|
|
404
|
+
castState(input: unknown): unknown;
|
|
405
|
+
toHtml(record: R, recordKey?: string | number): Promise<string>;
|
|
406
|
+
}
|
|
407
|
+
/** Champ de saisie modifiable dans la cellule (port de TextInputColumn). Seuls un texte ou un nombre sont acceptés du navigateur. */
|
|
408
|
+
export declare class TextInputColumn<R = any> extends EditableColumn<R> {
|
|
409
|
+
private _type;
|
|
410
|
+
private _mask;
|
|
411
|
+
private _inputMode;
|
|
412
|
+
private _step;
|
|
413
|
+
private _placeholder;
|
|
414
|
+
private _prefix;
|
|
415
|
+
private _suffix;
|
|
416
|
+
private _prefixIcon;
|
|
417
|
+
private _suffixIcon;
|
|
418
|
+
private _prefixIconColor;
|
|
419
|
+
private _suffixIconColor;
|
|
420
|
+
private _prefixInline;
|
|
421
|
+
private _suffixInline;
|
|
422
|
+
static make<R = any>(name: string): TextInputColumn<R>;
|
|
423
|
+
/** Type HTML du champ (`text` par défaut ; `number`, `email`, `color`…). */
|
|
424
|
+
type(type: string | null): this;
|
|
425
|
+
/** Masque de saisie Alpine (`x-mask`) ; le champ devient alors un champ texte. */
|
|
426
|
+
mask(mask: string | null): this;
|
|
427
|
+
inputMode(mode: string | null): this;
|
|
428
|
+
step(step: number | string | null): this;
|
|
429
|
+
placeholder(text: string | null): this;
|
|
430
|
+
prefix(label: string | null, isInline?: boolean): this;
|
|
431
|
+
suffix(label: string | null, isInline?: boolean): this;
|
|
432
|
+
inlinePrefix(condition?: boolean): this;
|
|
433
|
+
inlineSuffix(condition?: boolean): this;
|
|
434
|
+
prefixIcon(name: string | null, isInline?: boolean): this;
|
|
435
|
+
suffixIcon(name: string | null, isInline?: boolean): this;
|
|
436
|
+
prefixIconColor(color: string | null): this;
|
|
437
|
+
suffixIconColor(color: string | null): this;
|
|
438
|
+
protected getImplicitRules(): ColumnValidationRule[];
|
|
439
|
+
toHtml(record: R, recordKey?: string | number): Promise<string>;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Colonne au rendu libre (port de ViewColumn) : `view()` reçoit une fonction qui renvoie le HTML de la cellule, ou le nom d'une vue EJS
|
|
443
|
+
* rendue avec `{ state, record, column }`. Ce HTML est celui de l'application : les données qu'il contient doivent y être échappées (`e()`).
|
|
444
|
+
*/
|
|
445
|
+
export declare class ViewColumn<R = any> extends Column<R> {
|
|
446
|
+
private _view;
|
|
447
|
+
private _viewData;
|
|
448
|
+
static make<R = any>(name: string): ViewColumn<R>;
|
|
449
|
+
view(view: ((ctx: {
|
|
450
|
+
state: unknown;
|
|
451
|
+
record: R;
|
|
452
|
+
column: ViewColumn<R>;
|
|
453
|
+
}) => string | Promise<string>) | string, data?: Record<string, unknown>): this;
|
|
454
|
+
toHtml(record: R): Promise<string>;
|
|
455
|
+
}
|
|
456
|
+
/** @deprecated Port de BadgeColumn : utiliser `TextColumn.make(nom).badge()`. */
|
|
457
|
+
export declare class BadgeColumn<R = any> extends TextColumn<R> {
|
|
458
|
+
constructor(name: string);
|
|
459
|
+
static make<R = any>(name: string): BadgeColumn<R>;
|
|
460
|
+
}
|
|
461
|
+
/** @deprecated Port de BooleanColumn : utiliser `IconColumn.make(nom).boolean()`. */
|
|
462
|
+
export declare class BooleanColumn<R = any> extends IconColumn<R> {
|
|
463
|
+
constructor(name: string);
|
|
464
|
+
static make<R = any>(name: string): BooleanColumn<R>;
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Écriture d'une cellule modifiable reçue du navigateur (port de `updateTableColumnState`). Tout est revérifié : la colonne doit
|
|
468
|
+
* être déclarée, modifiable et visible, l'enregistrement dans la portée de l'adaptateur et non désactivé pour cette colonne,
|
|
469
|
+
* `authorize` (droit de modification de l'hôte) l'accepter, et la valeur passer les règles de la colonne.
|
|
470
|
+
*/
|
|
471
|
+
export declare function updateTableColumnState<R>(table: Table<R>, host: TableHost, adapter: DataAdapter<R>, columnName: unknown, recordKey: unknown, input: unknown, options?: {
|
|
472
|
+
authorize?: (record: R) => boolean | Promise<boolean>;
|
|
473
|
+
}): Promise<unknown>;
|
|
474
|
+
/** État d'un filtre : les valeurs de son formulaire. */
|
|
475
|
+
export type FilterState = Record<string, unknown>;
|
|
476
|
+
/** Pastille « filtre actif » : son libellé, et le champ du filtre que son retrait efface. */
|
|
477
|
+
export type FilterIndicator = {
|
|
478
|
+
label: string;
|
|
479
|
+
field: string;
|
|
480
|
+
};
|
|
481
|
+
/** Disposition des filtres : menu déroulant de la barre d'outils (défaut), ou panneau repliable au-dessus du contenu. */
|
|
482
|
+
export type FiltersLayout = 'dropdown' | 'above-content-collapsible';
|
|
483
|
+
export interface TableFilter {
|
|
484
|
+
readonly name: string;
|
|
485
|
+
getLabel(): string;
|
|
486
|
+
/** État initial (formulaire vide). */
|
|
487
|
+
getDefaultState(): FilterState;
|
|
488
|
+
/** Options du champ `value` : [valeur, libellé], et libellé de l'option vide. */
|
|
489
|
+
getFormDefinition(): {
|
|
490
|
+
placeholder: string;
|
|
491
|
+
options: [string, string][];
|
|
492
|
+
};
|
|
493
|
+
isActive(state: FilterState): boolean;
|
|
494
|
+
/** Applique le filtre à la requête de liste. Ne lit que des valeurs connues. */
|
|
495
|
+
apply(query: Omit<ListQuery, 'page' | 'perPage'>, state: FilterState): void;
|
|
496
|
+
/** Composants de formulaire du filtre, à la place du sélecteur décrit par `getFormDefinition()`. */
|
|
497
|
+
getFormComponents?(): unknown[];
|
|
498
|
+
getColumnSpan?(): Record<string, number | string>;
|
|
499
|
+
/** État appliqué à partir de l'état du formulaire (reçu du navigateur) : ne garde que ce que le filtre connaît. */
|
|
500
|
+
sanitizeState?(state: unknown): FilterState;
|
|
501
|
+
getIndicators?(state: FilterState): FilterIndicator[];
|
|
502
|
+
/** Options du sélecteur chargées à la demande (relation), à la place de celles de `getFormDefinition()`. */
|
|
503
|
+
getFormOptions?(): Promise<[string, string][]>;
|
|
504
|
+
removeIndicator?(state: FilterState, field: string): FilterState;
|
|
505
|
+
/** Données lues en base avant le calcul des indicateurs (libellés d'enregistrements liés, par exemple). */
|
|
506
|
+
loadIndicatorData?(state: FilterState, host: TableHost): Promise<void>;
|
|
507
|
+
}
|
|
508
|
+
/** Filtre « corbeille » des modèles à suppression douce (port de TrashedFilter). */
|
|
509
|
+
export declare class TrashedFilter implements TableFilter {
|
|
510
|
+
readonly name = "trashed";
|
|
511
|
+
static make(): TrashedFilter;
|
|
512
|
+
getLabel(): string;
|
|
513
|
+
getDefaultState(): FilterState;
|
|
514
|
+
getFormDefinition(): {
|
|
515
|
+
placeholder: string;
|
|
516
|
+
options: [string, string][];
|
|
517
|
+
};
|
|
518
|
+
isActive(state: FilterState): boolean;
|
|
519
|
+
apply(query: Omit<ListQuery, 'page' | 'perPage'>, state: FilterState): void;
|
|
520
|
+
}
|
|
521
|
+
/** Filtre par valeur d'une colonne, choisie dans une liste (port de SelectFilter, sélection simple). */
|
|
522
|
+
export declare class SelectFilter implements TableFilter {
|
|
523
|
+
readonly name: string;
|
|
524
|
+
private _label;
|
|
525
|
+
private _column;
|
|
526
|
+
private _options;
|
|
527
|
+
constructor(name: string);
|
|
528
|
+
static make(name: string): SelectFilter;
|
|
529
|
+
label(label: string): this;
|
|
530
|
+
/** Colonne filtrée quand elle diffère du nom du filtre (clé étrangère d'une relation, par exemple). */
|
|
531
|
+
column(column: string): this;
|
|
532
|
+
/** Options fixes, ou fonction asynchrone (enregistrements d'une relation). */
|
|
533
|
+
options(options: [string, string][] | Record<string, string> | (() => Promise<[string, string][]>)): this;
|
|
534
|
+
getLabel(): string;
|
|
535
|
+
getDefaultState(): FilterState;
|
|
536
|
+
getFormDefinition(): {
|
|
537
|
+
placeholder: string;
|
|
538
|
+
options: [string, string][];
|
|
539
|
+
};
|
|
540
|
+
getFormOptions(): Promise<[string, string][]>;
|
|
541
|
+
/** Comme Filament : les options d'un SelectFilter sont évaluées à chaque rendu, le sélecteur porte donc une clé dérivée d'elles. */
|
|
542
|
+
readonly hasDynamicOptions = true;
|
|
543
|
+
isActive(state: FilterState): boolean;
|
|
544
|
+
apply(query: Omit<ListQuery, 'page' | 'perPage'>, state: FilterState): void;
|
|
545
|
+
}
|
|
546
|
+
/** Filtre à trois états sur une colonne booléenne : tous, oui, non (port de TernaryFilter). */
|
|
547
|
+
export declare class TernaryFilter implements TableFilter {
|
|
548
|
+
readonly name: string;
|
|
549
|
+
private _label;
|
|
550
|
+
constructor(name: string);
|
|
551
|
+
static make(name: string): TernaryFilter;
|
|
552
|
+
label(label: string): this;
|
|
553
|
+
getLabel(): string;
|
|
554
|
+
getDefaultState(): FilterState;
|
|
555
|
+
getFormDefinition(): {
|
|
556
|
+
placeholder: string;
|
|
557
|
+
options: [string, string][];
|
|
558
|
+
};
|
|
559
|
+
isActive(state: FilterState): boolean;
|
|
560
|
+
apply(query: Omit<ListQuery, 'page' | 'perPage'>, state: FilterState): void;
|
|
561
|
+
}
|
|
562
|
+
/** Filtre à formulaire libre (port de Filter avec `schema()`) : la requête et les indicateurs sont écrits par l'application. */
|
|
563
|
+
export declare class Filter implements TableFilter {
|
|
564
|
+
readonly name: string;
|
|
565
|
+
private _label;
|
|
566
|
+
private _components;
|
|
567
|
+
private _query;
|
|
568
|
+
private _indicate;
|
|
569
|
+
constructor(name: string);
|
|
570
|
+
static make(name: string): Filter;
|
|
571
|
+
label(label: string): this;
|
|
572
|
+
/** Champs du filtre ; leurs noms sont les seules clés d'état acceptées du navigateur. */
|
|
573
|
+
schema(components: unknown[]): this;
|
|
574
|
+
/** Condition posée sur la requête à partir de l'état nettoyé du formulaire. */
|
|
575
|
+
query(modifier: (query: any, data: FilterState) => void): this;
|
|
576
|
+
/** Pastilles des valeurs appliquées : `{ champ: libellé }` ; retirer une pastille efface son champ. */
|
|
577
|
+
indicateUsing(resolver: (data: FilterState) => Record<string, string>): this;
|
|
578
|
+
private fields;
|
|
579
|
+
getLabel(): string;
|
|
580
|
+
getDefaultState(): FilterState;
|
|
581
|
+
getFormDefinition(): {
|
|
582
|
+
placeholder: string;
|
|
583
|
+
options: [string, string][];
|
|
584
|
+
};
|
|
585
|
+
getFormComponents(): unknown[];
|
|
586
|
+
sanitizeState(state: unknown): FilterState;
|
|
587
|
+
isActive(state: FilterState): boolean;
|
|
588
|
+
apply(query: Omit<ListQuery, 'page' | 'perPage'>, state: FilterState): void;
|
|
589
|
+
getIndicators(state: FilterState): FilterIndicator[];
|
|
590
|
+
removeIndicator(state: FilterState, field: string): FilterState;
|
|
591
|
+
}
|
|
592
|
+
export type ColumnState = {
|
|
593
|
+
type: 'column';
|
|
594
|
+
name: string;
|
|
595
|
+
label: string;
|
|
596
|
+
isHidden: boolean;
|
|
597
|
+
isToggled: boolean;
|
|
598
|
+
isToggleable: boolean;
|
|
599
|
+
isToggledHiddenByDefault: boolean | null;
|
|
600
|
+
};
|
|
601
|
+
export declare class Table<R = any> {
|
|
602
|
+
private _columns;
|
|
603
|
+
private _recordAction;
|
|
604
|
+
private _recordActions;
|
|
605
|
+
private _heading;
|
|
606
|
+
private _headerActions;
|
|
607
|
+
private _bulkActions;
|
|
608
|
+
private _recordClasses;
|
|
609
|
+
private _filters;
|
|
610
|
+
private _filtersLayout;
|
|
611
|
+
private _defaultSort;
|
|
612
|
+
private _recordUrl;
|
|
613
|
+
private _pageOptions;
|
|
614
|
+
private _stackedOnMobile;
|
|
615
|
+
private _label;
|
|
616
|
+
private _groups;
|
|
617
|
+
private _defaultGroup;
|
|
618
|
+
private _defaultGroupDirection;
|
|
619
|
+
private _groupsOnly;
|
|
620
|
+
private _groupingSettingsHidden;
|
|
621
|
+
private _groupingDirectionSettingHidden;
|
|
622
|
+
private _groupingSettingsInDropdownOnDesktop;
|
|
623
|
+
private _collapsedGroupsByDefault;
|
|
624
|
+
/** Regroupements proposés dans la barre d'outils (un identifiant de colonne vaut `Group.make(identifiant)`). */
|
|
625
|
+
groups(groups: (Group<R> | string)[]): this;
|
|
626
|
+
getGroups(): Group<R>[];
|
|
627
|
+
getGroup(id: string | null | undefined): Group<R> | null;
|
|
628
|
+
/**
|
|
629
|
+
* Regroupement par défaut (port de `defaultGroup()`). S'il fait partie de `groups()`, il est seulement présélectionné à l'ouverture
|
|
630
|
+
* (`initializeTableGrouping`) et l'utilisateur peut le retirer ; sinon il s'applique toujours, sans sélecteur.
|
|
631
|
+
*/
|
|
632
|
+
defaultGroup(group: Group<R> | string | null, direction?: SortDirection): this;
|
|
633
|
+
getDefaultGroup(): Group<R> | null;
|
|
634
|
+
getDefaultGroupDirection(): SortDirection;
|
|
635
|
+
isDefaultGroupSelectable(): boolean;
|
|
636
|
+
/** Seuls les en-têtes et résumés des groupes sont affichés, sans les lignes ni la pagination (port de `groupsOnly()`). */
|
|
637
|
+
groupsOnly(condition?: boolean): this;
|
|
638
|
+
isGroupsOnly(): boolean;
|
|
639
|
+
/** Masque le sélecteur de regroupement de la barre d'outils. */
|
|
640
|
+
groupingSettingsHidden(condition?: boolean): this;
|
|
641
|
+
areGroupingSettingsHidden(): boolean;
|
|
642
|
+
/** Masque le choix du sens (croissant / décroissant) du regroupement. */
|
|
643
|
+
groupingDirectionSettingHidden(condition?: boolean): this;
|
|
644
|
+
isGroupingDirectionSettingHidden(): boolean;
|
|
645
|
+
/** Sur grand écran aussi, le sélecteur de regroupement est dans un menu déroulant. */
|
|
646
|
+
groupingSettingsInDropdownOnDesktop(condition?: boolean): this;
|
|
647
|
+
/** @deprecated Ancien nom de `groupingSettingsInDropdownOnDesktop()`. */
|
|
648
|
+
groupsInDropdownOnDesktop(condition?: boolean): this;
|
|
649
|
+
areGroupingSettingsInDropdownOnDesktop(): boolean;
|
|
650
|
+
/** Les groupes repliables s'affichent repliés. */
|
|
651
|
+
collapsedGroupsByDefault(condition?: boolean): this;
|
|
652
|
+
areGroupsCollapsedByDefault(): boolean;
|
|
653
|
+
private _columnsLayout;
|
|
654
|
+
columns(columns: (Column<R> | ColumnGroup<R> | ColumnLayout<R>)[]): this;
|
|
655
|
+
/** Mise en page des colonnes, ou `null` pour un tableau classique. */
|
|
656
|
+
getColumnsLayout(): (Column<R> | ColumnLayout<R>)[] | null;
|
|
657
|
+
/** Action montée au clic sur une ligne (ex. `'edit'`), à la place d'une URL. */
|
|
658
|
+
recordAction(name: string | null): this;
|
|
659
|
+
getRecordAction(): string | null;
|
|
660
|
+
/** Titre affiché dans l'en-tête de la table. */
|
|
661
|
+
heading(heading: string | null): this;
|
|
662
|
+
getHeading(): string | null;
|
|
663
|
+
/** Actions affichées dans l'en-tête de la table. */
|
|
664
|
+
headerActions(actions: any[]): this;
|
|
665
|
+
getHeaderActions(): any[];
|
|
666
|
+
/** Actions groupées (menu « Bulk actions ») ; sans appel, l'hôte fournit ses actions par défaut. */
|
|
667
|
+
groupedBulkActions(actions: any[]): this;
|
|
668
|
+
getBulkActions(): any[] | null;
|
|
669
|
+
/** Actions de ligne : des `Action` ou un `ActionGroup` (menu déroulant). */
|
|
670
|
+
recordActions(actions: any[]): this;
|
|
671
|
+
getRecordActions(): any[];
|
|
672
|
+
/** Classes CSS ajoutées à la ligne selon l'enregistrement. */
|
|
673
|
+
recordClasses(resolver: (record: R) => string | null): this;
|
|
674
|
+
getRecordClasses(record: R): string | null;
|
|
675
|
+
filters(filters: TableFilter[], options?: {
|
|
676
|
+
layout?: FiltersLayout;
|
|
677
|
+
}): this;
|
|
678
|
+
filtersLayout(layout: FiltersLayout): this;
|
|
679
|
+
getFiltersLayout(): FiltersLayout;
|
|
680
|
+
/** Les filtres ne s'appliquent qu'au bouton « Apply » : c'est déjà le comportement de toutes les tables (méthode gardée pour la compatibilité d'API). */
|
|
681
|
+
deferFilters(): this;
|
|
682
|
+
defaultSort(column: string, direction?: SortDirection): this;
|
|
683
|
+
recordUrl(resolver: (record: R) => string | null): this;
|
|
684
|
+
private _reorderColumn;
|
|
685
|
+
/** Lignes réordonnables à la main ; `column` reçoit le rang (port de `reorderable()`). */
|
|
686
|
+
reorderable(column: string | null): this;
|
|
687
|
+
getReorderColumn(): string | null;
|
|
688
|
+
paginationPageOptions(options: number[]): this;
|
|
689
|
+
private _defaultPageOption;
|
|
690
|
+
/** Nombre de lignes par page à l'ouverture (port de `defaultPaginationPageOption()`). */
|
|
691
|
+
defaultPaginationPageOption(option: number | null): this;
|
|
692
|
+
getDefaultPageOption(): number;
|
|
693
|
+
private _paginationMode;
|
|
694
|
+
/** `'simple'` : boutons précédent / suivant seulement, sans numéros de page ni total (port de `PaginationMode::Simple`). */
|
|
695
|
+
paginationMode(mode: 'default' | 'simple'): this;
|
|
696
|
+
getPaginationMode(): 'default' | 'simple';
|
|
697
|
+
stackedOnMobile(condition?: boolean): this;
|
|
698
|
+
pluralModelLabel(label: string): this;
|
|
699
|
+
getColumns(): Column<R>[];
|
|
700
|
+
getColumn(name: string): Column<R> | undefined;
|
|
701
|
+
getFilters(): TableFilter[];
|
|
702
|
+
getDefaultSort(): {
|
|
703
|
+
column: string;
|
|
704
|
+
direction: SortDirection;
|
|
705
|
+
} | null;
|
|
706
|
+
getRecordUrl(record: R): string | null;
|
|
707
|
+
getPageOptions(): number[];
|
|
708
|
+
isStackedOnMobile(): boolean;
|
|
709
|
+
getPluralModelLabel(): string;
|
|
710
|
+
hasToggleableColumns(): boolean;
|
|
711
|
+
/** État par défaut du gestionnaire de colonnes (port de getDefaultTableColumnState). */
|
|
712
|
+
getDefaultColumnState(): ColumnState[];
|
|
713
|
+
getDefaultFilterState(): Record<string, FilterState>;
|
|
714
|
+
}
|
|
715
|
+
/** État de table porté par le composant hôte (équivalent du trait InteractsWithTable). */
|
|
716
|
+
export interface TableHost {
|
|
717
|
+
readonly id: string;
|
|
718
|
+
tableSearch: string;
|
|
719
|
+
tableSort: string | null;
|
|
720
|
+
tableColumnSearches: Record<string, string>;
|
|
721
|
+
tableRecordsPerPage: number;
|
|
722
|
+
paginators: Record<string, number>;
|
|
723
|
+
tableFilters?: Record<string, FilterState>;
|
|
724
|
+
tableColumns?: ColumnState[];
|
|
725
|
+
/** Regroupement courant : `identifiant` ou `identifiant:direction`. */
|
|
726
|
+
tableGrouping?: string | null;
|
|
727
|
+
/** Mode « tri manuel » : toutes les lignes, dans l'ordre de la colonne de rang, avec des poignées. */
|
|
728
|
+
isTableReordering?: boolean;
|
|
729
|
+
}
|
|
730
|
+
/** Colonnes affichées : celles que l'état du gestionnaire laisse cochées. L'état du navigateur ne peut masquer qu'une colonne déclarée « toggleable ». */
|
|
731
|
+
export declare function getVisibleColumns<R>(table: Table<R>, host: TableHost): Column<R>[];
|
|
732
|
+
/** Nettoie un état de colonnes reçu du navigateur : seul `isToggled` des colonnes « toggleable » est repris. */
|
|
733
|
+
export declare function sanitizeColumnState<R>(table: Table<R>, state: unknown): ColumnState[];
|
|
734
|
+
/** Requête de liste (recherche, recherches par colonne, filtres, tri) correspondant à l'état de l'hôte, sans pagination.
|
|
735
|
+
* Seul ce que la table déclare est accepté, quel que soit l'état envoyé par le navigateur. */
|
|
736
|
+
export declare function getTableQuery<R>(table: Table<R>, host: TableHost): Omit<ListQuery, 'page' | 'perPage'>;
|
|
737
|
+
/** Regroupement courant : seul un groupe déclaré par la table est accepté, quel que soit l'état envoyé par le navigateur. */
|
|
738
|
+
export declare function getTableGrouping<R>(table: Table<R>, host: TableHost): {
|
|
739
|
+
group: Group<R>;
|
|
740
|
+
direction: SortDirection;
|
|
741
|
+
} | null;
|
|
742
|
+
/** À l'ouverture de la table (montage de l'hôte) : présélectionne le regroupement par défaut quand l'utilisateur peut le changer. */
|
|
743
|
+
export declare function initializeTableGrouping<R>(table: Table<R>, host: TableHost): void;
|
|
744
|
+
export declare function countActiveFilters<R>(table: Table<R>, host: TableHost): number;
|
|
745
|
+
/** Indicateurs des filtres appliqués (seuls les filtres qui en déclarent en ont). */
|
|
746
|
+
export declare function getFilterIndicators<R>(table: Table<R>, host: TableHost): {
|
|
747
|
+
filter: string;
|
|
748
|
+
field: string;
|
|
749
|
+
label: string;
|
|
750
|
+
}[];
|
|
751
|
+
/** Port de sortTable() : non trié → asc → desc → non trié. */
|
|
752
|
+
export declare function sortTable(host: TableHost, column?: string | null, direction?: string | null): void;
|
|
753
|
+
/** Charge la page d'enregistrements correspondant à l'état de l'hôte. */
|
|
754
|
+
export declare function getTableRecords<R>(table: Table<R>, host: TableHost, adapter: DataAdapter<R>): Promise<RecordPage<R>>;
|
|
755
|
+
/** Éléments de pagination : port de UrlWindow de Laravel avec onEachSide(0), comme Filament. */
|
|
756
|
+
export declare function paginationElements(current: number, last: number, onEachSide?: number): (number | '...')[];
|
|
757
|
+
export declare const useColorManager: (manager: ColorManager) => void;
|
|
758
|
+
export type RenderTableOptions<R> = {
|
|
759
|
+
rowActions?: (record: R) => {
|
|
760
|
+
label: string;
|
|
761
|
+
url: string;
|
|
762
|
+
icon: string;
|
|
763
|
+
key: string;
|
|
764
|
+
}[] | Promise<{
|
|
765
|
+
label: string;
|
|
766
|
+
url: string;
|
|
767
|
+
icon: string;
|
|
768
|
+
key: string;
|
|
769
|
+
}[]>;
|
|
770
|
+
/** `false` : le tri manuel n'est pas proposé (utilisateur non autorisé). */
|
|
771
|
+
canReorder?: boolean;
|
|
772
|
+
/** HTML placé dans `.fi-ta`, après le conteneur de la table (modales des actions). */
|
|
773
|
+
after?: string;
|
|
774
|
+
/** HTML déjà rendu des actions d'en-tête de la table. */
|
|
775
|
+
headerActions?: string[];
|
|
776
|
+
/** HTML déjà rendu des actions de ligne (ActionGroup…), à la place des liens de `rowActions`. */
|
|
777
|
+
rowActionsHtml?: (record: R) => Promise<string>;
|
|
778
|
+
bulkActions?: string[];
|
|
779
|
+
/** HTML du formulaire des filtres (schéma `tableFiltersForm`), s'il y a des filtres. */
|
|
780
|
+
filtersForm?: string | null;
|
|
781
|
+
};
|
|
782
|
+
/** Nombre maximal de lignes affichées (et réordonnées) en mode tri manuel. */
|
|
783
|
+
export declare const REORDER_LIMIT = 1000;
|
|
784
|
+
/** Plafond d'enregistrements lus pour une table `groupsOnly` (non paginée, comme dans Filament). */
|
|
785
|
+
export declare const GROUPS_ONLY_LIMIT = 1000;
|
|
786
|
+
export declare function renderTable<R>(table: Table<R>, host: TableHost, adapter: DataAdapter<R>, options?: RenderTableOptions<R>): Promise<string>;
|