@oneteme/jquery-table 0.0.13 → 0.0.15
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/README.md +138 -23
- package/esm2022/lib/component/export.manager.mjs +6 -5
- package/esm2022/lib/component/table-preferences.manager.mjs +13 -3
- package/esm2022/lib/component/table.component.mjs +398 -143
- package/esm2022/lib/component/table.constants.mjs +3 -1
- package/esm2022/lib/directive/jqt-cell-def.directive.mjs +4 -2
- package/esm2022/lib/jquery-table.model.mjs +1 -1
- package/fesm2022/oneteme-jquery-table.mjs +418 -148
- package/fesm2022/oneteme-jquery-table.mjs.map +1 -1
- package/lib/component/table.component.d.ts +98 -24
- package/lib/component/table.constants.d.ts +2 -0
- package/lib/directive/jqt-cell-def.directive.d.ts +5 -1
- package/lib/jquery-table.model.d.ts +50 -9
- package/package.json +3 -3
|
@@ -8,6 +8,10 @@ import { JqtCellDefDirective } from '../directive/jqt-cell-def.directive';
|
|
|
8
8
|
import { SlicePanelComponent, OrganizerFacade, GroupByManager, OrganizerConfig, OrganizerButtonEvent, OrganizerState } from '@oneteme/jquery-organizer';
|
|
9
9
|
import { VisualCopyFeedbackConfig, VisualSnapshot, VisualSnapshotApplyResult, VisualSnapshotDraft } from '@oneteme/jquery-core';
|
|
10
10
|
import * as i0 from "@angular/core";
|
|
11
|
+
interface TableSortState {
|
|
12
|
+
active: string;
|
|
13
|
+
direction: 'asc' | 'desc' | '';
|
|
14
|
+
}
|
|
11
15
|
export declare class TableComponent<T = any> implements OnChanges, AfterContentInit, AfterViewInit, OnDestroy {
|
|
12
16
|
_isFullscreen: boolean;
|
|
13
17
|
config?: TableProvider<T>;
|
|
@@ -25,36 +29,44 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
25
29
|
view?: TableViewConfig;
|
|
26
30
|
columnLabels?: Record<string, string>;
|
|
27
31
|
isLoading: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* À passer à `true` quand la requête relancée après `lazyColumnsRequested` échoue : les colonnes en attente affichent un bouton
|
|
34
|
+
* « Réessayer ». Repasser à `false` au nouvel essai.
|
|
35
|
+
*/
|
|
36
|
+
lazyError: boolean;
|
|
28
37
|
copyFeedback: VisualCopyFeedbackConfig;
|
|
29
38
|
/** Paramètre de contrôle pour réinitialiser barre de recherche. */
|
|
30
39
|
set clearSearchInput(value: boolean | null | undefined);
|
|
31
|
-
addRequested: EventEmitter<void>;
|
|
32
|
-
columnAdded: EventEmitter<TableColumnProvider<T>>;
|
|
33
|
-
columnRemoved: EventEmitter<TableColumnProvider<T>>;
|
|
34
|
-
categorySelected: EventEmitter<string>;
|
|
35
|
-
rowSelected: EventEmitter<T>;
|
|
40
|
+
readonly addRequested: EventEmitter<void>;
|
|
41
|
+
readonly columnAdded: EventEmitter<TableColumnProvider<T>>;
|
|
42
|
+
readonly columnRemoved: EventEmitter<TableColumnProvider<T>>;
|
|
43
|
+
readonly categorySelected: EventEmitter<string>;
|
|
44
|
+
readonly rowSelected: EventEmitter<T>;
|
|
36
45
|
/** Émis à chaque changement de tri (y compris le tri initial). */
|
|
37
|
-
sortChange: EventEmitter<
|
|
38
|
-
active: string;
|
|
39
|
-
direction: 'asc' | 'desc' | '';
|
|
40
|
-
}>;
|
|
46
|
+
readonly sortChange: EventEmitter<TableSortState>;
|
|
41
47
|
/** Émis à chaque changement de page ou de taille de page. */
|
|
42
|
-
pageChange: EventEmitter<{
|
|
48
|
+
readonly pageChange: EventEmitter<{
|
|
43
49
|
pageIndex: number;
|
|
44
50
|
pageSize: number;
|
|
45
51
|
}>;
|
|
46
52
|
/** Émis à chaque changement de la recherche texte. */
|
|
47
|
-
searchChange: EventEmitter<string>;
|
|
53
|
+
readonly searchChange: EventEmitter<string>;
|
|
48
54
|
/** Émis quand le Group by change (clé de colonne, ou `null` si désactivé). */
|
|
49
|
-
groupByChange: EventEmitter<string>;
|
|
55
|
+
readonly groupByChange: EventEmitter<string>;
|
|
50
56
|
/** Émis quand la liste des colonnes visibles change (clés dans l’ordre d’affichage). */
|
|
51
|
-
columnsChange: EventEmitter<string[]>;
|
|
52
|
-
visualCopied: EventEmitter<VisualSnapshot>;
|
|
57
|
+
readonly columnsChange: EventEmitter<string[]>;
|
|
58
|
+
readonly visualCopied: EventEmitter<VisualSnapshot>;
|
|
59
|
+
/**
|
|
60
|
+
* Clés de toutes les colonnes `lazy` demandées jusqu'ici (cumul), émises quand l'une d'elles est activée pour la première fois.
|
|
61
|
+
* L'application relance sa requête complète en les incluant puis repasse les nouvelles `data`.
|
|
62
|
+
*/
|
|
63
|
+
readonly lazyColumnsRequested: EventEmitter<string[]>;
|
|
53
64
|
set paginator(value: MatPaginator | undefined);
|
|
54
65
|
get paginator(): MatPaginator | undefined;
|
|
55
66
|
private _paginator?;
|
|
56
67
|
sort?: MatSort;
|
|
57
68
|
tableBodyScrollRef?: ElementRef<HTMLElement>;
|
|
69
|
+
tableShellRef?: ElementRef<HTMLElement>;
|
|
58
70
|
slicePanelRef?: SlicePanelComponent<T>;
|
|
59
71
|
_cellDefs: QueryList<JqtCellDefDirective>;
|
|
60
72
|
/** Map clé→TemplateRef pré-calculée depuis _cellDefs. Mise à jour dans ngAfterContentInit et sur _cellDefs.changes. */
|
|
@@ -86,6 +98,7 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
86
98
|
_showSlicePanel: boolean;
|
|
87
99
|
/** Snapshot stable de l'état collapsed du panneau slice, mis à jour via (collapsedChange) */
|
|
88
100
|
_slicePanelCollapsed: boolean;
|
|
101
|
+
private _initialSlicePanelCollapsedApplied;
|
|
89
102
|
get _staticSlicesForMenu(): Array<{
|
|
90
103
|
key: string;
|
|
91
104
|
title: string;
|
|
@@ -117,16 +130,27 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
117
130
|
set groupPageSize(v: number);
|
|
118
131
|
get groupSortOrder(): 'asc' | 'desc';
|
|
119
132
|
set groupSortOrder(v: 'asc' | 'desc');
|
|
120
|
-
/**
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Statut des colonnes `lazy` déjà demandées (absente = pas encore demandée).
|
|
135
|
+
* `loading` dure jusqu'à la réception de nouvelles `data` ; la référence change à chaque mise à jour (panneau de slices).
|
|
136
|
+
*/
|
|
137
|
+
_lazyColumnStatus: Map<string, "error" | "loaded" | "idle" | "loading">;
|
|
138
|
+
private _lazyFlushQueued;
|
|
139
|
+
/** Lignes retournées par `config.lazyLoader` : elles remplacent `data` jusqu'au prochain `data`. */
|
|
140
|
+
private _loaderRows;
|
|
141
|
+
private _loaderSub?;
|
|
142
|
+
private _lazyWarned;
|
|
143
|
+
/** Colonnes de la dernière config résolue : évite de reconstruire le tableau (et d'agiter le panneau de slices) à chaque rafraîchissement. */
|
|
144
|
+
private _columnsSource?;
|
|
145
|
+
private _columnsNormalized?;
|
|
146
|
+
private readonly _optionalLazyColumns;
|
|
126
147
|
private _cdr;
|
|
127
148
|
private _el;
|
|
128
149
|
private _ngZone;
|
|
150
|
+
private _paginatorIntl;
|
|
129
151
|
private _i18nRaw;
|
|
152
|
+
private _tableShellResizeObserver?;
|
|
153
|
+
private readonly _fullItemsPerPageLabel;
|
|
130
154
|
copyFeedbackMessage: string;
|
|
131
155
|
private _copyFeedbackTimer?;
|
|
132
156
|
/** Labels de l’interface. Fusionnés depuis JQT_I18N_DEFAULTS et le token JQT_I18N injecté. */
|
|
@@ -135,7 +159,9 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
135
159
|
/** Retourne true si la ligne de groupe est une ligne normale (ni lazy, ni too-many). */
|
|
136
160
|
isNormalGroupRow(row: any): boolean;
|
|
137
161
|
isGroupRowLoading(row: any): boolean;
|
|
162
|
+
isGroupRowError(row: any): boolean;
|
|
138
163
|
isGroupRowTooMany(row: any): boolean;
|
|
164
|
+
retryGroupByColumn(event?: Event): void;
|
|
139
165
|
/** Gère le clic sur une ligne d'en-tête de groupe (no-op pour les états spéciaux). */
|
|
140
166
|
onGroupHeaderClick(row: any): void;
|
|
141
167
|
/** Gestionnaire export CSV. */
|
|
@@ -174,19 +200,27 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
174
200
|
/** Cache groupBy — invalidé dès que rows/key/tri changent. */
|
|
175
201
|
private _groupCache;
|
|
176
202
|
private _pendingRender;
|
|
203
|
+
private readonly _deferredTimers;
|
|
204
|
+
private _headerMeasureFrame;
|
|
205
|
+
private _destroyed;
|
|
177
206
|
private _staticSliceHiddenKeys;
|
|
178
207
|
private _configHiddenKeys;
|
|
179
208
|
/** Clés des colonnes visibles du dernier émission columnsChange (pour éviter les émissions dupliquement). */
|
|
180
209
|
private _prevColumnKeys;
|
|
210
|
+
private emitColumnsChangeIfNeeded;
|
|
181
211
|
ngOnChanges(changes: SimpleChanges): void;
|
|
182
212
|
ngAfterContentInit(): void;
|
|
183
213
|
ngAfterViewInit(): void;
|
|
214
|
+
private _observeTableShellWidth;
|
|
184
215
|
private _applyPendingDynamicSliceKeys;
|
|
185
216
|
ngOnDestroy(): void;
|
|
186
217
|
private _measureHeaderHeight;
|
|
218
|
+
private _scheduleHeaderMeasure;
|
|
219
|
+
private _scheduleDeferred;
|
|
187
220
|
private _organizerConfigCache;
|
|
188
221
|
private _invalidateOrganizerConfig;
|
|
189
222
|
get organizerConfig(): OrganizerConfig;
|
|
223
|
+
get organizerHideMenuValues(): boolean;
|
|
190
224
|
get organizerState(): OrganizerState;
|
|
191
225
|
onOrganizerViewChange(event: OrganizerButtonEvent): void;
|
|
192
226
|
get title(): string;
|
|
@@ -221,15 +255,38 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
221
255
|
key: string;
|
|
222
256
|
header?: string;
|
|
223
257
|
}): string;
|
|
258
|
+
/** Traduit les options de la vue table vers celles de l'Organizer. */
|
|
259
|
+
private _organizerViewConfig;
|
|
260
|
+
/** Ne change la référence que si le contenu change : le panneau recalcule tout à chaque nouvelle référence. */
|
|
261
|
+
private _setSliceConfigs;
|
|
224
262
|
onSearchChange(): void;
|
|
263
|
+
private _runSearch;
|
|
264
|
+
private setGroupByAndEmit;
|
|
225
265
|
onGroupByChange(key: string | null): void;
|
|
226
266
|
onGroupPageSizeChange(size: number | string): void;
|
|
227
267
|
onGroupSortToggle(dir: 'asc' | 'desc'): void;
|
|
228
268
|
getLazyColumnStatus(key: string): 'idle' | 'loading' | 'loaded' | 'error';
|
|
229
269
|
getLazyRenderType(rowValue: any): 'loading' | 'error' | 'value';
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
270
|
+
/** Relance la demande des colonnes en erreur : le chargeur est rappelé, ou l'application refait sa requête complète. */
|
|
271
|
+
retryLazyColumns(): void;
|
|
272
|
+
/** Colonnes lazy dont la valeur est nécessaire : affichées, utilisées en Group by ou en Slice by dynamique. */
|
|
273
|
+
private _usedLazyColumns;
|
|
274
|
+
/**
|
|
275
|
+
* Quel que soit le chemin d'activation (Organizer, Group by, Slice by, préférences...), les colonnes lazy utilisées et pas encore
|
|
276
|
+
* demandées sont réclamées en un seul événement. Hors cycle de détection, et seulement une fois des lignes affichées :
|
|
277
|
+
* la première réponse de l'application ne doit pas être prise pour celle qui contient les colonnes.
|
|
278
|
+
*/
|
|
279
|
+
private _requestLazyColumns;
|
|
280
|
+
/** Appelle `config.lazyLoader` avec toutes les colonnes lazy demandées ; sa réponse remplace `data`. */
|
|
281
|
+
private _runLazyLoader;
|
|
282
|
+
/** Nouveau `data` : il l'emporte sur les lignes du chargeur. Avec un chargeur, les colonnes déjà demandées sont rechargées. */
|
|
283
|
+
private _onNewData;
|
|
284
|
+
/** Sans chargeur ni écouteur, la colonne demandée resterait en skeleton sans que rien ne l'explique. */
|
|
285
|
+
private _warnIfNoLazySource;
|
|
286
|
+
/** De nouvelles `data` sont arrivées : toutes les colonnes demandées sont considérées comme prêtes. */
|
|
287
|
+
private _settleLazyColumns;
|
|
288
|
+
private _applyLazyError;
|
|
289
|
+
private _setLazyStatus;
|
|
233
290
|
toggleGroupCollapse(groupKey: string): void;
|
|
234
291
|
private scrollToGroupHeader;
|
|
235
292
|
isGroupCollapsed(groupKey: string): boolean;
|
|
@@ -275,9 +332,11 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
275
332
|
getCellTemplate(key: string): TemplateRef<{
|
|
276
333
|
$implicit: any;
|
|
277
334
|
index: number;
|
|
335
|
+
value: any;
|
|
278
336
|
}> | null;
|
|
279
337
|
get hasCustomCellDefs(): boolean;
|
|
280
338
|
get hasRowClickHandler(): boolean;
|
|
339
|
+
rowActionLabel(row: any): string;
|
|
281
340
|
/** Largeur minimale du tableau en px, calculée depuis les largeurs explicites des colonnes actives.
|
|
282
341
|
* Retourne null si aucune colonne n'a de largeur définie (le tableau remplit alors 100% du conteneur).
|
|
283
342
|
* Seules les valeurs explicitement en `px` sont sommables ; les pourcentages ou autres unités sont ignorés. */
|
|
@@ -286,6 +345,7 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
286
345
|
getRowClass(row: any): string | string[] | Record<string, boolean>;
|
|
287
346
|
onRowClick(row: any, event: MouseEvent | null): void;
|
|
288
347
|
onHeaderDragStart(columnKey: string, event: DragEvent): void;
|
|
348
|
+
onHeaderKeyDown(columnKey: string, event: KeyboardEvent): void;
|
|
289
349
|
onHeaderDragOver(columnKey: string, event: DragEvent): void;
|
|
290
350
|
onHeaderDrop(targetColumnKey: string, event: DragEvent): void;
|
|
291
351
|
onHeaderDragEnd(): void;
|
|
@@ -335,6 +395,9 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
335
395
|
private _executeRender;
|
|
336
396
|
private _projectCurrentPage;
|
|
337
397
|
private buildEffectiveConfig;
|
|
398
|
+
/** Une colonne lazy est forcément optionnelle : `optional` est implicite, et `optional: false` est refusé. */
|
|
399
|
+
private _normalizeColumns;
|
|
400
|
+
private _withImpliedOptional;
|
|
338
401
|
private applyConfigSearchReset;
|
|
339
402
|
private applyInitialSearchQuery;
|
|
340
403
|
private static _hashColumns;
|
|
@@ -342,7 +405,13 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
342
405
|
private resolveColumnsFromCompat;
|
|
343
406
|
private getCategoryFilteredData;
|
|
344
407
|
private projectRows;
|
|
408
|
+
/** Comparateur dont les valeurs de tri sont calculées une seule fois par ligne. */
|
|
345
409
|
private _buildSortComparator;
|
|
410
|
+
private _buildCachedSortComparator;
|
|
411
|
+
private static readonly _collator;
|
|
412
|
+
private _compareSortValues;
|
|
413
|
+
private _normalizeSortValue;
|
|
414
|
+
private _applySortDirection;
|
|
346
415
|
/**
|
|
347
416
|
* Retourne la valeur telle qu'elle est affichée dans la cellule, en suivant exactement
|
|
348
417
|
* le même chemin que resolveCellValue — utilisée pour la recherche plein-texte.
|
|
@@ -350,6 +419,10 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
350
419
|
*/
|
|
351
420
|
private getDisplayValueForSearch;
|
|
352
421
|
private getLazyAwareValue;
|
|
422
|
+
/** Les nombres et les dates gardent leur type pour un tri correct ; le reste est normalisé en texte. */
|
|
423
|
+
private _toSortInput;
|
|
424
|
+
/** Les statuts de chargement lazy ne doivent jamais apparaître dans un fichier exporté. */
|
|
425
|
+
private _resolveExportValue;
|
|
353
426
|
private resolveCellValue;
|
|
354
427
|
private resolvePageSize;
|
|
355
428
|
private resolvePageSizeOptions;
|
|
@@ -359,5 +432,6 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
|
|
|
359
432
|
private attachPaginator;
|
|
360
433
|
private attachSort;
|
|
361
434
|
static ɵfac: i0.ɵɵFactoryDeclaration<TableComponent<any>, never>;
|
|
362
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TableComponent<any>, "jquery-table", never, { "config": { "alias": "config"; "required": false; }; "dataSource": { "alias": "dataSource"; "required": false; }; "data": { "alias": "data"; "required": false; }; "displayedColumns": { "alias": "displayedColumns"; "required": false; }; "columnsConfig": { "alias": "columnsConfig"; "required": false; }; "view": { "alias": "view"; "required": false; }; "columnLabels": { "alias": "columnLabels"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; "copyFeedback": { "alias": "copyFeedback"; "required": false; }; "clearSearchInput": { "alias": "clearSearchInput"; "required": false; }; }, { "addRequested": "addRequested"; "columnAdded": "columnAdded"; "columnRemoved": "columnRemoved"; "categorySelected": "categorySelected"; "rowSelected": "rowSelected"; "sortChange": "sortChange"; "pageChange": "pageChange"; "searchChange": "searchChange"; "groupByChange": "groupByChange"; "columnsChange": "columnsChange"; "visualCopied": "visualCopied"; }, ["_cellDefs"], never, true, never>;
|
|
435
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TableComponent<any>, "jquery-table", never, { "config": { "alias": "config"; "required": false; }; "dataSource": { "alias": "dataSource"; "required": false; }; "data": { "alias": "data"; "required": false; }; "displayedColumns": { "alias": "displayedColumns"; "required": false; }; "columnsConfig": { "alias": "columnsConfig"; "required": false; }; "view": { "alias": "view"; "required": false; }; "columnLabels": { "alias": "columnLabels"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; "lazyError": { "alias": "lazyError"; "required": false; }; "copyFeedback": { "alias": "copyFeedback"; "required": false; }; "clearSearchInput": { "alias": "clearSearchInput"; "required": false; }; }, { "addRequested": "addRequested"; "columnAdded": "columnAdded"; "columnRemoved": "columnRemoved"; "categorySelected": "categorySelected"; "rowSelected": "rowSelected"; "sortChange": "sortChange"; "pageChange": "pageChange"; "searchChange": "searchChange"; "groupByChange": "groupByChange"; "columnsChange": "columnsChange"; "visualCopied": "visualCopied"; "lazyColumnsRequested": "lazyColumnsRequested"; }, ["_cellDefs"], never, true, never>;
|
|
363
436
|
}
|
|
437
|
+
export {};
|
|
@@ -10,6 +10,8 @@ export declare const GROUP_ROW_COLUMN = "__group_row";
|
|
|
10
10
|
export declare const GROUP_HEADER_MARKER = "__groupHeader";
|
|
11
11
|
/** Clé du groupe spéciale « chargement lazy en cours ». */
|
|
12
12
|
export declare const GROUP_KEY_LAZY_LOADING = "__lazy_loading__";
|
|
13
|
+
/** Clé du groupe spéciale « chargement lazy en erreur ». */
|
|
14
|
+
export declare const GROUP_KEY_LAZY_ERROR = "__lazy_error__";
|
|
13
15
|
/** Clé du groupe spéciale « trop de groupes ». */
|
|
14
16
|
export declare const GROUP_KEY_TOO_MANY = "__too_many_groups__";
|
|
15
17
|
/** Propriété injectée dans chaque ligne projetée : référence vers la ligne brute d'origine. */
|
|
@@ -11,18 +11,22 @@ import * as i0 from "@angular/core";
|
|
|
11
11
|
* </ng-template>
|
|
12
12
|
* </jquery-table>
|
|
13
13
|
* ```
|
|
14
|
-
* Le contexte expose `$implicit` (ligne brute `T`)
|
|
14
|
+
* Le contexte expose `$implicit` (ligne brute `T`), `index` (index global) et `value` (valeur affichée de la cellule,
|
|
15
|
+
* y compris pour une colonne `lazy` dont la valeur n'est pas présente dans la ligne brute).
|
|
16
|
+
* Pour une colonne `lazy`, le template n'est rendu qu'une fois la valeur chargée ; le chargement et l'erreur sont gérés par le tableau.
|
|
15
17
|
*/
|
|
16
18
|
export declare class JqtCellDefDirective {
|
|
17
19
|
readonly template: TemplateRef<{
|
|
18
20
|
$implicit: any;
|
|
19
21
|
index: number;
|
|
22
|
+
value: any;
|
|
20
23
|
}>;
|
|
21
24
|
/** Clé de la colonne à laquelle ce template s'applique. */
|
|
22
25
|
columnKey: string;
|
|
23
26
|
constructor(template: TemplateRef<{
|
|
24
27
|
$implicit: any;
|
|
25
28
|
index: number;
|
|
29
|
+
value: any;
|
|
26
30
|
}>);
|
|
27
31
|
static ɵfac: i0.ɵɵFactoryDeclaration<JqtCellDefDirective, never>;
|
|
28
32
|
static ɵdir: i0.ɵɵDirectiveDeclaration<JqtCellDefDirective, "[jqtCellDef]", never, { "columnKey": { "alias": "jqtCellDef"; "required": false; }; }, {}, never, never, true, never>;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { DataProvider } from '@oneteme/jquery-core';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
|
-
import { SliceConfig } from '@oneteme/jquery-organizer';
|
|
3
|
+
import { OrganizerConfig, SliceConfig } from '@oneteme/jquery-organizer';
|
|
4
4
|
export { SliceConfig } from '@oneteme/jquery-organizer';
|
|
5
|
-
|
|
5
|
+
/** Propriétés communes à toutes les colonnes ; voir `TableColumnProvider`. */
|
|
6
|
+
export interface TableColumnBase<T = any> {
|
|
6
7
|
key: string;
|
|
7
8
|
/** Libellé affiché dans l'en-tête de colonne. Optionnel si la colonne utilise un template custom. */
|
|
8
9
|
header?: string;
|
|
@@ -17,18 +18,39 @@ export interface TableColumnProvider<T = any> {
|
|
|
17
18
|
* Exemple : `searchValue: (row) => durationPipe.transform((today - row.start) / 1000)`
|
|
18
19
|
*/
|
|
19
20
|
searchValue?: DataProvider<string>;
|
|
21
|
+
/** Active le tri ; `true` par défaut. */
|
|
20
22
|
sortable?: boolean;
|
|
21
23
|
removable?: boolean;
|
|
22
|
-
optional?: boolean;
|
|
23
24
|
width?: string;
|
|
25
|
+
/** Rend la colonne disponible dans Group by ; `true` par défaut si `header` est défini. */
|
|
24
26
|
groupable?: boolean;
|
|
27
|
+
/** Rend la colonne disponible comme Slice by dynamique ; `true` par défaut si `header` est défini. */
|
|
25
28
|
sliceable?: boolean;
|
|
26
|
-
/** Chargement différé : la présence de cet objet active le mode lazy. */
|
|
27
|
-
lazy?: {
|
|
28
|
-
/** Fonction appelée pour charger les valeurs de la colonne. Retourne un tableau dans le même ordre que les lignes. */
|
|
29
|
-
fetchFn: () => Observable<any[]>;
|
|
30
|
-
};
|
|
31
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Colonne du tableau.
|
|
32
|
+
*
|
|
33
|
+
* - `optional: true` : masquée par défaut, ajoutable depuis le menu View.
|
|
34
|
+
* - `lazy: true` : absente de la requête de base, demandée à sa première activation (Organizer, Group by, Slice by).
|
|
35
|
+
* Une colonne lazy est forcément optionnelle : `optional: true` est implicite et `optional: false` est refusé
|
|
36
|
+
* (la colonne serait demandée dès le premier rendu, soit une requête de plus pour rien).
|
|
37
|
+
* Le chargement passe par `TableProvider.lazyLoader`, ou par l'événement `lazyColumnsRequested` si l'application
|
|
38
|
+
* préfère relancer elle-même sa requête. La cellule affiche un skeleton jusqu'à la réception des lignes complètes ;
|
|
39
|
+
* la colonne supporte ensuite tri, recherche, Group by et Slice by.
|
|
40
|
+
*/
|
|
41
|
+
export type TableColumnMode = {
|
|
42
|
+
lazy?: undefined;
|
|
43
|
+
optional?: boolean;
|
|
44
|
+
} | {
|
|
45
|
+
lazy: true;
|
|
46
|
+
optional?: true;
|
|
47
|
+
};
|
|
48
|
+
export type TableColumnProvider<T = any> = TableColumnBase<T> & TableColumnMode;
|
|
49
|
+
/**
|
|
50
|
+
* Charge les colonnes `lazy` : reçoit les clés des colonnes lazy demandées jusqu'ici (cumul) et retourne les lignes complètes,
|
|
51
|
+
* qui remplacent `data` ; la requête est celle de l'application, la table ne connaît pas la source.
|
|
52
|
+
*/
|
|
53
|
+
export type TableLazyLoader<T = any> = (lazyColumns: string[]) => Observable<T[]>;
|
|
32
54
|
/** Configuration de la barre de recherche. */
|
|
33
55
|
export interface TableSearchConfig {
|
|
34
56
|
enabled?: boolean;
|
|
@@ -62,6 +84,17 @@ export interface TableLabelsConfig {
|
|
|
62
84
|
/** Affiché pendant le chargement. Par défaut : `'Chargement des données...'`. */
|
|
63
85
|
loading?: string;
|
|
64
86
|
}
|
|
87
|
+
/** Options publiques du bouton Organizer intégré à la toolbar. */
|
|
88
|
+
export interface TableOrganizerConfig {
|
|
89
|
+
/** Libellé optionnel affiché à côté de l'icône. */
|
|
90
|
+
buttonLabel?: OrganizerConfig['buttonLabel'];
|
|
91
|
+
/** Icône Material affichée dans le bouton. */
|
|
92
|
+
buttonIcon?: OrganizerConfig['buttonIcon'];
|
|
93
|
+
/** Masque l'icône lorsque le bouton utilise un libellé seul. */
|
|
94
|
+
showButtonIcon?: OrganizerConfig['showButtonIcon'];
|
|
95
|
+
/** Masque les valeurs récapitulatives dans les sous-menus. */
|
|
96
|
+
hideMenuValues?: boolean;
|
|
97
|
+
}
|
|
65
98
|
/**
|
|
66
99
|
* Raccourci pour déclarer une colonne de base.
|
|
67
100
|
*
|
|
@@ -72,7 +105,7 @@ export interface TableLabelsConfig {
|
|
|
72
105
|
* ]
|
|
73
106
|
* ```
|
|
74
107
|
*/
|
|
75
|
-
export declare function col<T = any>(key: string, header: string, overrides?: Partial<
|
|
108
|
+
export declare function col<T = any>(key: string, header: string, overrides?: Partial<TableColumnBase<T>> & TableColumnMode): TableColumnProvider<T>;
|
|
76
109
|
/** Configuration de l’export CSV déclenché depuis la toolbar. */
|
|
77
110
|
export interface TableExportConfig<T = any> {
|
|
78
111
|
/** Affiche le bouton Export dans la toolbar. Par défaut : `true`. */
|
|
@@ -135,6 +168,8 @@ export interface TableProvider<T = any> {
|
|
|
135
168
|
onCopyVisual?: () => void;
|
|
136
169
|
onToggleFullscreen?: () => void;
|
|
137
170
|
slices?: SliceConfig<T>[];
|
|
171
|
+
/** État initial du panneau de slices. Une préférence sauvegardée reste prioritaire. */
|
|
172
|
+
slicePanelCollapsed?: boolean;
|
|
138
173
|
/** Affiche le bouton toggle pour replier/déplier le panneau de slices. Par défaut : `true`. */
|
|
139
174
|
enableSliceToggle?: boolean;
|
|
140
175
|
/**
|
|
@@ -145,6 +180,7 @@ export interface TableProvider<T = any> {
|
|
|
145
180
|
search?: TableSearchConfig;
|
|
146
181
|
pagination?: TablePaginationConfig;
|
|
147
182
|
view?: TableViewConfig;
|
|
183
|
+
organizer?: TableOrganizerConfig;
|
|
148
184
|
labels?: TableLabelsConfig;
|
|
149
185
|
/** Tri initial appliqué au chargement. N'est pas écrasé par les changements de données. */
|
|
150
186
|
defaultSort?: {
|
|
@@ -158,6 +194,11 @@ export interface TableProvider<T = any> {
|
|
|
158
194
|
onRowSelected?: (row: T, event: MouseEvent | null) => void;
|
|
159
195
|
/** Configuration de l'export CSV. */
|
|
160
196
|
export?: TableExportConfig<T>;
|
|
197
|
+
/**
|
|
198
|
+
* Chargeur des colonnes `lazy` : appelé à l'activation d'une colonne lazy (et après chaque nouveau `data` si des colonnes
|
|
199
|
+
* ont déjà été demandées). Sans chargeur, la table émet seulement `lazyColumnsRequested`.
|
|
200
|
+
*/
|
|
201
|
+
lazyLoader?: TableLazyLoader<T>;
|
|
161
202
|
/** Configuration de la fonctionnalité Préférences (édition + persistance localStorage). */
|
|
162
203
|
preferences?: TablePreferencesConfig;
|
|
163
204
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oneteme/jquery-table",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.15",
|
|
4
4
|
"description": "jquery table lib",
|
|
5
5
|
"homepage": "https://github.com/oneteme/jquery-charts",
|
|
6
6
|
"bugs": "https://github.com/oneteme/jquery-charts/issues",
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
"@angular/core": ">=16.1.0",
|
|
14
14
|
"@angular/material": "^16.1.0",
|
|
15
15
|
"@angular/cdk": "^16.1.0",
|
|
16
|
-
"@oneteme/jquery-core": "^0.0.
|
|
17
|
-
"@oneteme/jquery-organizer": "^0.0.
|
|
16
|
+
"@oneteme/jquery-core": "^0.0.38",
|
|
17
|
+
"@oneteme/jquery-organizer": "^0.0.7"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"tslib": "^2.3.0"
|