@oneteme/jquery-table 0.0.13 → 0.0.14

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.
@@ -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>;
@@ -28,33 +32,31 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
28
32
  copyFeedback: VisualCopyFeedbackConfig;
29
33
  /** Paramètre de contrôle pour réinitialiser barre de recherche. */
30
34
  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>;
35
+ readonly addRequested: EventEmitter<void>;
36
+ readonly columnAdded: EventEmitter<TableColumnProvider<T>>;
37
+ readonly columnRemoved: EventEmitter<TableColumnProvider<T>>;
38
+ readonly categorySelected: EventEmitter<string>;
39
+ readonly rowSelected: EventEmitter<T>;
36
40
  /** Émis à chaque changement de tri (y compris le tri initial). */
37
- sortChange: EventEmitter<{
38
- active: string;
39
- direction: 'asc' | 'desc' | '';
40
- }>;
41
+ readonly sortChange: EventEmitter<TableSortState>;
41
42
  /** Émis à chaque changement de page ou de taille de page. */
42
- pageChange: EventEmitter<{
43
+ readonly pageChange: EventEmitter<{
43
44
  pageIndex: number;
44
45
  pageSize: number;
45
46
  }>;
46
47
  /** Émis à chaque changement de la recherche texte. */
47
- searchChange: EventEmitter<string>;
48
+ readonly searchChange: EventEmitter<string>;
48
49
  /** Émis quand le Group by change (clé de colonne, ou `null` si désactivé). */
49
- groupByChange: EventEmitter<string>;
50
+ readonly groupByChange: EventEmitter<string>;
50
51
  /** Émis quand la liste des colonnes visibles change (clés dans l’ordre d’affichage). */
51
- columnsChange: EventEmitter<string[]>;
52
- visualCopied: EventEmitter<VisualSnapshot>;
52
+ readonly columnsChange: EventEmitter<string[]>;
53
+ readonly visualCopied: EventEmitter<VisualSnapshot>;
53
54
  set paginator(value: MatPaginator | undefined);
54
55
  get paginator(): MatPaginator | undefined;
55
56
  private _paginator?;
56
57
  sort?: MatSort;
57
58
  tableBodyScrollRef?: ElementRef<HTMLElement>;
59
+ tableShellRef?: ElementRef<HTMLElement>;
58
60
  slicePanelRef?: SlicePanelComponent<T>;
59
61
  _cellDefs: QueryList<JqtCellDefDirective>;
60
62
  /** Map clé→TemplateRef pré-calculée depuis _cellDefs. Mise à jour dans ngAfterContentInit et sur _cellDefs.changes. */
@@ -86,6 +88,7 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
86
88
  _showSlicePanel: boolean;
87
89
  /** Snapshot stable de l'état collapsed du panneau slice, mis à jour via (collapsedChange) */
88
90
  _slicePanelCollapsed: boolean;
91
+ private _initialSlicePanelCollapsedApplied;
89
92
  get _staticSlicesForMenu(): Array<{
90
93
  key: string;
91
94
  title: string;
@@ -126,7 +129,10 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
126
129
  private _cdr;
127
130
  private _el;
128
131
  private _ngZone;
132
+ private _paginatorIntl;
129
133
  private _i18nRaw;
134
+ private _tableShellResizeObserver?;
135
+ private readonly _fullItemsPerPageLabel;
130
136
  copyFeedbackMessage: string;
131
137
  private _copyFeedbackTimer?;
132
138
  /** Labels de l’interface. Fusionnés depuis JQT_I18N_DEFAULTS et le token JQT_I18N injecté. */
@@ -174,19 +180,27 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
174
180
  /** Cache groupBy — invalidé dès que rows/key/tri changent. */
175
181
  private _groupCache;
176
182
  private _pendingRender;
183
+ private readonly _deferredTimers;
184
+ private _headerMeasureFrame;
185
+ private _destroyed;
177
186
  private _staticSliceHiddenKeys;
178
187
  private _configHiddenKeys;
179
188
  /** Clés des colonnes visibles du dernier émission columnsChange (pour éviter les émissions dupliquement). */
180
189
  private _prevColumnKeys;
190
+ private emitColumnsChangeIfNeeded;
181
191
  ngOnChanges(changes: SimpleChanges): void;
182
192
  ngAfterContentInit(): void;
183
193
  ngAfterViewInit(): void;
194
+ private _observeTableShellWidth;
184
195
  private _applyPendingDynamicSliceKeys;
185
196
  ngOnDestroy(): void;
186
197
  private _measureHeaderHeight;
198
+ private _scheduleHeaderMeasure;
199
+ private _scheduleDeferred;
187
200
  private _organizerConfigCache;
188
201
  private _invalidateOrganizerConfig;
189
202
  get organizerConfig(): OrganizerConfig;
203
+ get organizerHideMenuValues(): boolean;
190
204
  get organizerState(): OrganizerState;
191
205
  onOrganizerViewChange(event: OrganizerButtonEvent): void;
192
206
  get title(): string;
@@ -222,6 +236,7 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
222
236
  header?: string;
223
237
  }): string;
224
238
  onSearchChange(): void;
239
+ private setGroupByAndEmit;
225
240
  onGroupByChange(key: string | null): void;
226
241
  onGroupPageSizeChange(size: number | string): void;
227
242
  onGroupSortToggle(dir: 'asc' | 'desc'): void;
@@ -278,6 +293,7 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
278
293
  }> | null;
279
294
  get hasCustomCellDefs(): boolean;
280
295
  get hasRowClickHandler(): boolean;
296
+ rowActionLabel(row: any): string;
281
297
  /** Largeur minimale du tableau en px, calculée depuis les largeurs explicites des colonnes actives.
282
298
  * Retourne null si aucune colonne n'a de largeur définie (le tableau remplit alors 100% du conteneur).
283
299
  * Seules les valeurs explicitement en `px` sont sommables ; les pourcentages ou autres unités sont ignorés. */
@@ -286,6 +302,7 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
286
302
  getRowClass(row: any): string | string[] | Record<string, boolean>;
287
303
  onRowClick(row: any, event: MouseEvent | null): void;
288
304
  onHeaderDragStart(columnKey: string, event: DragEvent): void;
305
+ onHeaderKeyDown(columnKey: string, event: KeyboardEvent): void;
289
306
  onHeaderDragOver(columnKey: string, event: DragEvent): void;
290
307
  onHeaderDrop(targetColumnKey: string, event: DragEvent): void;
291
308
  onHeaderDragEnd(): void;
@@ -343,6 +360,10 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
343
360
  private getCategoryFilteredData;
344
361
  private projectRows;
345
362
  private _buildSortComparator;
363
+ private _buildCachedSortComparator;
364
+ private _compareSortValues;
365
+ private _normalizeSortValue;
366
+ private _applySortDirection;
346
367
  /**
347
368
  * Retourne la valeur telle qu'elle est affichée dans la cellule, en suivant exactement
348
369
  * le même chemin que resolveCellValue — utilisée pour la recherche plein-texte.
@@ -361,3 +382,4 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
361
382
  static ɵfac: i0.ɵɵFactoryDeclaration<TableComponent<any>, never>;
362
383
  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>;
363
384
  }
385
+ export {};
@@ -1,6 +1,6 @@
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
  export interface TableColumnProvider<T = any> {
6
6
  key: string;
@@ -17,11 +17,14 @@ export interface TableColumnProvider<T = any> {
17
17
  * Exemple : `searchValue: (row) => durationPipe.transform((today - row.start) / 1000)`
18
18
  */
19
19
  searchValue?: DataProvider<string>;
20
+ /** Active le tri ; `true` par défaut. */
20
21
  sortable?: boolean;
21
22
  removable?: boolean;
22
23
  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
29
  /** Chargement différé : la présence de cet objet active le mode lazy. */
27
30
  lazy?: {
@@ -62,6 +65,17 @@ export interface TableLabelsConfig {
62
65
  /** Affiché pendant le chargement. Par défaut : `'Chargement des données...'`. */
63
66
  loading?: string;
64
67
  }
68
+ /** Options publiques du bouton Organizer intégré à la toolbar. */
69
+ export interface TableOrganizerConfig {
70
+ /** Libellé optionnel affiché à côté de l'icône. */
71
+ buttonLabel?: OrganizerConfig['buttonLabel'];
72
+ /** Icône Material affichée dans le bouton. */
73
+ buttonIcon?: OrganizerConfig['buttonIcon'];
74
+ /** Masque l'icône lorsque le bouton utilise un libellé seul. */
75
+ showButtonIcon?: OrganizerConfig['showButtonIcon'];
76
+ /** Masque les valeurs récapitulatives dans les sous-menus. */
77
+ hideMenuValues?: boolean;
78
+ }
65
79
  /**
66
80
  * Raccourci pour déclarer une colonne de base.
67
81
  *
@@ -135,6 +149,8 @@ export interface TableProvider<T = any> {
135
149
  onCopyVisual?: () => void;
136
150
  onToggleFullscreen?: () => void;
137
151
  slices?: SliceConfig<T>[];
152
+ /** État initial du panneau de slices. Une préférence sauvegardée reste prioritaire. */
153
+ slicePanelCollapsed?: boolean;
138
154
  /** Affiche le bouton toggle pour replier/déplier le panneau de slices. Par défaut : `true`. */
139
155
  enableSliceToggle?: boolean;
140
156
  /**
@@ -145,6 +161,7 @@ export interface TableProvider<T = any> {
145
161
  search?: TableSearchConfig;
146
162
  pagination?: TablePaginationConfig;
147
163
  view?: TableViewConfig;
164
+ organizer?: TableOrganizerConfig;
148
165
  labels?: TableLabelsConfig;
149
166
  /** Tri initial appliqué au chargement. N'est pas écrasé par les changements de données. */
150
167
  defaultSort?: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneteme/jquery-table",
3
- "version": "0.0.13",
3
+ "version": "0.0.14",
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.36",
17
- "@oneteme/jquery-organizer": "^0.0.5"
16
+ "@oneteme/jquery-core": "^0.0.37",
17
+ "@oneteme/jquery-organizer": "^0.0.6"
18
18
  },
19
19
  "dependencies": {
20
20
  "tslib": "^2.3.0"