@oneteme/jquery-table 0.0.8 → 0.0.9

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.
@@ -0,0 +1,12 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { OrganizerConfig, OrganizerButtonEvent, OrganizerState, OrganizerSliceState } from '@oneteme/jquery-organizer';
3
+ import * as i0 from "@angular/core";
4
+ export declare class OrganizerButtonWrapperComponent {
5
+ config: OrganizerConfig;
6
+ state?: OrganizerState;
7
+ hideMenuValues: boolean;
8
+ viewChange: EventEmitter<OrganizerButtonEvent>;
9
+ sliceStateChange: EventEmitter<OrganizerSliceState>;
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<OrganizerButtonWrapperComponent, never>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<OrganizerButtonWrapperComponent, "table-organizer-button", never, { "config": { "alias": "config"; "required": false; }; "state": { "alias": "state"; "required": false; }; "hideMenuValues": { "alias": "hideMenuValues"; "required": false; }; }, { "viewChange": "viewChange"; "sliceStateChange": "sliceStateChange"; }, never, never, true, never>;
12
+ }
@@ -1,14 +1,11 @@
1
1
  import { AfterContentInit, AfterViewInit, ElementRef, EventEmitter, OnChanges, OnDestroy, QueryList, SimpleChanges, TemplateRef } from '@angular/core';
2
- import { MatMenuTrigger } from '@angular/material/menu';
3
2
  import { MatPaginator } from '@angular/material/paginator';
4
3
  import { MatSort } from '@angular/material/sort';
5
4
  import { MatTableDataSource } from '@angular/material/table';
6
5
  import { TableColumnProvider, TableProvider, TableViewConfig } from '../jquery-table.model';
7
6
  import { JqtI18n } from '../jqt-i18n.token';
8
7
  import { JqtCellDefDirective } from '../directive/jqt-cell-def.directive';
9
- import { SlicePanelComponent } from './slice-panel/slice-panel.component';
10
- import { ViewFacade } from './view/view.facade';
11
- import { GroupByManager } from './group-by.manager';
8
+ import { SlicePanelComponent, OrganizerFacade, GroupByManager, OrganizerConfig, OrganizerButtonEvent, OrganizerState } from '@oneteme/jquery-organizer';
12
9
  import * as i0 from "@angular/core";
13
10
  export declare class TableComponent<T = any> implements OnChanges, AfterContentInit, AfterViewInit, OnDestroy {
14
11
  config?: TableProvider<T>;
@@ -55,7 +52,6 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
55
52
  sort?: MatSort;
56
53
  tableBodyScrollRef?: ElementRef<HTMLElement>;
57
54
  slicePanelRef?: SlicePanelComponent<T>;
58
- viewMenuTrigger?: MatMenuTrigger;
59
55
  _cellDefs: QueryList<JqtCellDefDirective>;
60
56
  /** Map clé→TemplateRef pré-calculée depuis _cellDefs. Mise à jour dans ngAfterContentInit et sur _cellDefs.changes. */
61
57
  private _cellDefMap;
@@ -71,12 +67,12 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
71
67
  readonly _ROW_GROUP_PAGE = "__groupPage";
72
68
  readonly _ROW_GROUP_PAGE_COUNT = "__groupPageCount";
73
69
  /** Facade View : état et actions centralisés (Champs / Group by / Slice by) */
74
- readonly _view: ViewFacade<T>;
70
+ readonly _organizer: OrganizerFacade<TableColumnProvider<T>>;
75
71
  /**
76
- * Snapshot stable synchronisé depuis _view.fields.activeColumns dans refreshViewModel().
72
+ * Snapshot stable synchronisé depuis _organizer.fields.activeFields dans refreshViewModel().
77
73
  * Propriété (non getter) pour qu'Angular puisse la suivre sans NG0100.
78
74
  */
79
- activeColumns: TableColumnProvider<T>[];
75
+ activeFields: TableColumnProvider<T>[];
80
76
  activeSliceFilter: (row: T) => boolean;
81
77
  _sliceConfigs: any[];
82
78
  _sliceColumns: TableColumnProvider<T>[];
@@ -180,11 +176,17 @@ export declare class TableComponent<T = any> implements OnChanges, AfterContentI
180
176
  private _applyPendingDynamicSliceKeys;
181
177
  ngOnDestroy(): void;
182
178
  private _measureHeaderHeight;
179
+ private _organizerConfigCache;
180
+ private _invalidateOrganizerConfig;
181
+ get organizerConfig(): OrganizerConfig;
182
+ get organizerState(): OrganizerState;
183
+ onOrganizerViewChange(event: OrganizerButtonEvent): void;
183
184
  get title(): string;
184
185
  get showTitle(): boolean;
185
186
  get visibleColumns(): TableColumnProvider<T>[];
186
187
  get showSearchBar(): boolean;
187
188
  get showViewButton(): boolean;
189
+ get showOrganizerButton(): boolean;
188
190
  get showSliceExpandBtn(): boolean;
189
191
  get showExportButton(): boolean;
190
192
  get showPreferencesMenu(): boolean;
@@ -1,7 +1,7 @@
1
1
  import { DataProvider } from '@oneteme/jquery-core';
2
2
  import { Observable } from 'rxjs';
3
- import { SliceConfig } from './component/slice-panel/slice-panel.model';
4
- export { SliceConfig } from './component/slice-panel/slice-panel.model';
3
+ import { SliceConfig } from '@oneteme/jquery-organizer';
4
+ export { SliceConfig } from '@oneteme/jquery-organizer';
5
5
  export interface TableColumnProvider<T = any> {
6
6
  key: string;
7
7
  /** Libellé affiché dans l'en-tête de colonne. Optionnel si la colonne utilise un template custom. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneteme/jquery-table",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
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,7 +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.32"
16
+ "@oneteme/jquery-core": "^0.0.33",
17
+ "@oneteme/jquery-organizer": "0.0.1"
17
18
  },
18
19
  "dependencies": {
19
20
  "tslib": "^2.3.0"
package/public-api.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './lib/jquery-table.model';
2
2
  export * from './lib/jqt-i18n.token';
3
3
  export * from './lib/component/table.component';
4
- export * from './lib/component/slice-panel/slice-panel.model';
5
- export * from './lib/component/slice-panel/slice-panel.component';
4
+ export * from './lib/component/organizer-button/organizer-button.component';
5
+ export { SliceConfig, SliceColumnDef, SliceCategory, SlicePanelComponent } from '@oneteme/jquery-organizer';
6
+ export { OrganizerButtonComponent, OrganizerConfig, OrganizerButtonEvent, OrganizerState } from '@oneteme/jquery-organizer';
6
7
  export * from './lib/directive/jqt-cell-def.directive';
@@ -1,99 +0,0 @@
1
- /**
2
- * GroupByManager
3
- *
4
- * Encapsule tout l'état et la logique liés au mode Group By :
5
- * - état collapsed / expanded des groupes
6
- * - pagination interne par groupe
7
- * - tri des groupes (asc / desc)
8
- * - scroll vers un groupe
9
- *
10
- * Le composant TableComponent l'instancie et lui passe deux callbacks :
11
- * - `onNeedProjection` : demande une reprojection légère de la page courante
12
- * - `onNeedRender` : demande un rebuild complet (tri changé etc.)
13
- */
14
- export class GroupByManager {
15
- constructor(onNeedProjection, onNeedRender) {
16
- this.onNeedProjection = onNeedProjection;
17
- this.onNeedRender = onNeedRender;
18
- /** Groupes actuellement ouverts (mode default-collapsed) ou fermés (mode default-expanded). */
19
- this._collapsedGroups = new Set();
20
- /** Page courante par clé de groupe. */
21
- this._groupPages = new Map();
22
- /** Taille de page pour la pagination interne des groupes. */
23
- this.groupPageSize = 5;
24
- /** Ordre de tri des groupes ('asc' | 'desc'). */
25
- this.groupSortOrder = 'asc';
26
- /**
27
- * Quand `true`, tous les groupes sont collapsés par défaut.
28
- * `_collapsedGroups` contient alors le seul groupe ouvert.
29
- */
30
- this._defaultGroupCollapsed = false;
31
- }
32
- // ── API publique
33
- /** Initialise le mode par défaut selon qu'un groupBy vient d'être activé. */
34
- setDefaultCollapsed(collapsed) {
35
- this._defaultGroupCollapsed = collapsed;
36
- }
37
- /** Réinitialise l'état (à appeler quand le groupBy change de colonne). */
38
- reset() {
39
- this._collapsedGroups.clear();
40
- this._groupPages.clear();
41
- }
42
- isGroupCollapsed(groupKey) {
43
- return this._defaultGroupCollapsed
44
- ? !this._collapsedGroups.has(groupKey)
45
- : this._collapsedGroups.has(groupKey);
46
- }
47
- toggleGroupCollapse(groupKey, scrollTo) {
48
- if (this._collapsedGroups.has(groupKey)) {
49
- this._collapsedGroups.delete(groupKey);
50
- }
51
- else {
52
- this._collapsedGroups.clear();
53
- this._collapsedGroups.add(groupKey);
54
- scrollTo(groupKey);
55
- }
56
- this.onNeedProjection();
57
- }
58
- /** Retourne le groupe actuellement ouvert (seulement en mode default-collapsed avec exactement 1 ouvert). */
59
- getSingleOpenGroup() {
60
- return this._defaultGroupCollapsed && this._collapsedGroups.size === 1
61
- ? [...this._collapsedGroups][0]
62
- : null;
63
- }
64
- // ── Pagination par groupe
65
- getPage(groupKey) {
66
- return this._groupPages.get(groupKey) ?? 0;
67
- }
68
- groupPageBack(groupKey) {
69
- const current = this._groupPages.get(groupKey) ?? 0;
70
- if (current > 0) {
71
- this._groupPages.set(groupKey, current - 1);
72
- this.onNeedProjection();
73
- }
74
- }
75
- groupPageForward(groupKey, totalCount) {
76
- const maxPage = Math.ceil(totalCount / this.groupPageSize) - 1;
77
- const current = this._groupPages.get(groupKey) ?? 0;
78
- if (current < maxPage) {
79
- this._groupPages.set(groupKey, current + 1);
80
- this.onNeedProjection();
81
- }
82
- }
83
- onGroupPageSizeChange(size) {
84
- this.groupPageSize = size;
85
- this._groupPages.clear();
86
- this.onNeedRender();
87
- }
88
- onGroupSortToggle(dir, scrollTo) {
89
- if (this.groupSortOrder === dir)
90
- return;
91
- this.groupSortOrder = dir;
92
- this._groupPages.clear();
93
- this.onNeedRender();
94
- const openGroup = this.getSingleOpenGroup();
95
- if (openGroup)
96
- scrollTo(openGroup);
97
- }
98
- }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtYnkubWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZXRlbWUvanF1ZXJ5LXRhYmxlL3NyYy9saWIvY29tcG9uZW50L2dyb3VwLWJ5Lm1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFtQnpCLFlBQ21CLGdCQUE0QixFQUM1QixZQUF3QjtRQUR4QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVk7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQVk7UUFwQjNDLCtGQUErRjtRQUM5RSxxQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRXRELHVDQUF1QztRQUN0QixnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBRXpELDZEQUE2RDtRQUM3RCxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUVsQixpREFBaUQ7UUFDakQsbUJBQWMsR0FBbUIsS0FBSyxDQUFDO1FBRXZDOzs7V0FHRztRQUNLLDJCQUFzQixHQUFHLEtBQUssQ0FBQztJQUtwQyxDQUFDO0lBRUosa0JBQWtCO0lBRWxCLDZFQUE2RTtJQUM3RSxtQkFBbUIsQ0FBQyxTQUFrQjtRQUNwQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO0lBQzFDLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsS0FBSztRQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUMvQixPQUFPLElBQUksQ0FBQyxzQkFBc0I7WUFDaEMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDdEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELG1CQUFtQixDQUFDLFFBQWdCLEVBQUUsUUFBK0I7UUFDbkUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNwQjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCw2R0FBNkc7SUFDN0csa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVELDJCQUEyQjtJQUUzQixPQUFPLENBQUMsUUFBZ0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGFBQWEsQ0FBQyxRQUFnQjtRQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO1FBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksT0FBTyxHQUFHLE9BQU8sRUFBRTtZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQVk7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBQW1CLEVBQUUsUUFBK0I7UUFDcEUsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLEdBQUc7WUFBRSxPQUFPO1FBQ3hDLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVDLElBQUksU0FBUztZQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdyb3VwQnlNYW5hZ2VyXG4gKlxuICogRW5jYXBzdWxlIHRvdXQgbCfDqXRhdCBldCBsYSBsb2dpcXVlIGxpw6lzIGF1IG1vZGUgR3JvdXAgQnkgOlxuICogLSDDqXRhdCBjb2xsYXBzZWQgLyBleHBhbmRlZCBkZXMgZ3JvdXBlc1xuICogLSBwYWdpbmF0aW9uIGludGVybmUgcGFyIGdyb3VwZVxuICogLSB0cmkgZGVzIGdyb3VwZXMgKGFzYyAvIGRlc2MpXG4gKiAtIHNjcm9sbCB2ZXJzIHVuIGdyb3VwZVxuICpcbiAqIExlIGNvbXBvc2FudCBUYWJsZUNvbXBvbmVudCBsJ2luc3RhbmNpZSBldCBsdWkgcGFzc2UgZGV1eCBjYWxsYmFja3MgOlxuICogICAtIGBvbk5lZWRQcm9qZWN0aW9uYCA6IGRlbWFuZGUgdW5lIHJlcHJvamVjdGlvbiBsw6lnw6hyZSBkZSBsYSBwYWdlIGNvdXJhbnRlXG4gKiAgIC0gYG9uTmVlZFJlbmRlcmAgICAgIDogZGVtYW5kZSB1biByZWJ1aWxkIGNvbXBsZXQgKHRyaSBjaGFuZ8OpIGV0Yy4pXG4gKi9cbmV4cG9ydCBjbGFzcyBHcm91cEJ5TWFuYWdlciB7XG4gIC8qKiBHcm91cGVzIGFjdHVlbGxlbWVudCBvdXZlcnRzIChtb2RlIGRlZmF1bHQtY29sbGFwc2VkKSBvdSBmZXJtw6lzIChtb2RlIGRlZmF1bHQtZXhwYW5kZWQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb2xsYXBzZWRHcm91cHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKiogUGFnZSBjb3VyYW50ZSBwYXIgY2zDqSBkZSBncm91cGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2dyb3VwUGFnZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIC8qKiBUYWlsbGUgZGUgcGFnZSBwb3VyIGxhIHBhZ2luYXRpb24gaW50ZXJuZSBkZXMgZ3JvdXBlcy4gKi9cbiAgZ3JvdXBQYWdlU2l6ZSA9IDU7XG5cbiAgLyoqIE9yZHJlIGRlIHRyaSBkZXMgZ3JvdXBlcyAoJ2FzYycgfCAnZGVzYycpLiAqL1xuICBncm91cFNvcnRPcmRlcjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcblxuICAvKipcbiAgICogUXVhbmQgYHRydWVgLCB0b3VzIGxlcyBncm91cGVzIHNvbnQgY29sbGFwc8OpcyBwYXIgZMOpZmF1dC5cbiAgICogYF9jb2xsYXBzZWRHcm91cHNgIGNvbnRpZW50IGFsb3JzIGxlIHNldWwgZ3JvdXBlIG91dmVydC5cbiAgICovXG4gIHByaXZhdGUgX2RlZmF1bHRHcm91cENvbGxhcHNlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb25OZWVkUHJvamVjdGlvbjogKCkgPT4gdm9pZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9uTmVlZFJlbmRlcjogKCkgPT4gdm9pZCxcbiAgKSB7fVxuXG4gIC8vIOKUgOKUgCBBUEkgcHVibGlxdWVcblxuICAvKiogSW5pdGlhbGlzZSBsZSBtb2RlIHBhciBkw6lmYXV0IHNlbG9uIHF1J3VuIGdyb3VwQnkgdmllbnQgZCfDqnRyZSBhY3RpdsOpLiAqL1xuICBzZXREZWZhdWx0Q29sbGFwc2VkKGNvbGxhcHNlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2RlZmF1bHRHcm91cENvbGxhcHNlZCA9IGNvbGxhcHNlZDtcbiAgfVxuXG4gIC8qKiBSw6lpbml0aWFsaXNlIGwnw6l0YXQgKMOgIGFwcGVsZXIgcXVhbmQgbGUgZ3JvdXBCeSBjaGFuZ2UgZGUgY29sb25uZSkuICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5jbGVhcigpO1xuICAgIHRoaXMuX2dyb3VwUGFnZXMuY2xlYXIoKTtcbiAgfVxuXG4gIGlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0R3JvdXBDb2xsYXBzZWRcbiAgICAgID8gIXRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5oYXMoZ3JvdXBLZXkpXG4gICAgICA6IHRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5oYXMoZ3JvdXBLZXkpO1xuICB9XG5cbiAgdG9nZ2xlR3JvdXBDb2xsYXBzZShncm91cEtleTogc3RyaW5nLCBzY3JvbGxUbzogKGtleTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5oYXMoZ3JvdXBLZXkpKSB7XG4gICAgICB0aGlzLl9jb2xsYXBzZWRHcm91cHMuZGVsZXRlKGdyb3VwS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29sbGFwc2VkR3JvdXBzLmNsZWFyKCk7XG4gICAgICB0aGlzLl9jb2xsYXBzZWRHcm91cHMuYWRkKGdyb3VwS2V5KTtcbiAgICAgIHNjcm9sbFRvKGdyb3VwS2V5KTtcbiAgICB9XG4gICAgdGhpcy5vbk5lZWRQcm9qZWN0aW9uKCk7XG4gIH1cblxuICAvKiogUmV0b3VybmUgbGUgZ3JvdXBlIGFjdHVlbGxlbWVudCBvdXZlcnQgKHNldWxlbWVudCBlbiBtb2RlIGRlZmF1bHQtY29sbGFwc2VkIGF2ZWMgZXhhY3RlbWVudCAxIG91dmVydCkuICovXG4gIGdldFNpbmdsZU9wZW5Hcm91cCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdEdyb3VwQ29sbGFwc2VkICYmIHRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5zaXplID09PSAxXG4gICAgICA/IFsuLi50aGlzLl9jb2xsYXBzZWRHcm91cHNdWzBdXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgUGFnaW5hdGlvbiBwYXIgZ3JvdXBlXG5cbiAgZ2V0UGFnZShncm91cEtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JvdXBQYWdlcy5nZXQoZ3JvdXBLZXkpID8/IDA7XG4gIH1cblxuICBncm91cFBhZ2VCYWNrKGdyb3VwS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fZ3JvdXBQYWdlcy5nZXQoZ3JvdXBLZXkpID8/IDA7XG4gICAgaWYgKGN1cnJlbnQgPiAwKSB7XG4gICAgICB0aGlzLl9ncm91cFBhZ2VzLnNldChncm91cEtleSwgY3VycmVudCAtIDEpO1xuICAgICAgdGhpcy5vbk5lZWRQcm9qZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgZ3JvdXBQYWdlRm9yd2FyZChncm91cEtleTogc3RyaW5nLCB0b3RhbENvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBtYXhQYWdlID0gTWF0aC5jZWlsKHRvdGFsQ291bnQgLyB0aGlzLmdyb3VwUGFnZVNpemUpIC0gMTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fZ3JvdXBQYWdlcy5nZXQoZ3JvdXBLZXkpID8/IDA7XG4gICAgaWYgKGN1cnJlbnQgPCBtYXhQYWdlKSB7XG4gICAgICB0aGlzLl9ncm91cFBhZ2VzLnNldChncm91cEtleSwgY3VycmVudCArIDEpO1xuICAgICAgdGhpcy5vbk5lZWRQcm9qZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgb25Hcm91cFBhZ2VTaXplQ2hhbmdlKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZ3JvdXBQYWdlU2l6ZSA9IHNpemU7XG4gICAgdGhpcy5fZ3JvdXBQYWdlcy5jbGVhcigpO1xuICAgIHRoaXMub25OZWVkUmVuZGVyKCk7XG4gIH1cblxuICBvbkdyb3VwU29ydFRvZ2dsZShkaXI6ICdhc2MnIHwgJ2Rlc2MnLCBzY3JvbGxUbzogKGtleTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ3JvdXBTb3J0T3JkZXIgPT09IGRpcikgcmV0dXJuO1xuICAgIHRoaXMuZ3JvdXBTb3J0T3JkZXIgPSBkaXI7XG4gICAgdGhpcy5fZ3JvdXBQYWdlcy5jbGVhcigpO1xuICAgIHRoaXMub25OZWVkUmVuZGVyKCk7XG4gICAgY29uc3Qgb3Blbkdyb3VwID0gdGhpcy5nZXRTaW5nbGVPcGVuR3JvdXAoKTtcbiAgICBpZiAob3Blbkdyb3VwKSBzY3JvbGxUbyhvcGVuR3JvdXApO1xuICB9XG59XG4iXX0=
@@ -1,99 +0,0 @@
1
- import { Subject, take, takeUntil } from 'rxjs';
2
- import { LAZY_LOADING_VALUE, LAZY_ERROR_VALUE } from './table.constants';
3
- /**
4
- * Gère le cycle de vie des colonnes à chargement différé (lazy) :
5
- * statuts, données, annulation des requêtes en cours.
6
- *
7
- * Pas de dépendance Angular/DOM — peut être instancié manuellement dans le composant.
8
- */
9
- export class LazyColumnManager {
10
- constructor() {
11
- this._status = new Map();
12
- this._data = new Map();
13
- this._cancels = new Map();
14
- }
15
- get status() {
16
- return this._status;
17
- }
18
- get data() {
19
- return this._data;
20
- }
21
- getStatus(key) {
22
- return this._status.get(key) ?? 'idle';
23
- }
24
- getRenderType(rowValue) {
25
- if (rowValue === LAZY_LOADING_VALUE)
26
- return 'loading';
27
- if (rowValue === LAZY_ERROR_VALUE)
28
- return 'error';
29
- return 'value';
30
- }
31
- /** Annule tous les fetches en cours et réinitialise l'état (appeler lors d'un changement de données). */
32
- cancelAll() {
33
- this._cancels.forEach(s => { s.next(); s.complete(); });
34
- this._cancels.clear();
35
- this._status = new Map();
36
- this._data = new Map();
37
- }
38
- /** Réinitialise une colonne et relance son fetch. */
39
- retry(column, resolvedData, callbacks) {
40
- const k = column.key;
41
- const prev = this._cancels.get(k);
42
- if (prev) {
43
- prev.next();
44
- prev.complete();
45
- }
46
- this._cancels.delete(k);
47
- const newStatus = new Map(this._status);
48
- newStatus.delete(k);
49
- this._status = newStatus;
50
- const newData = new Map(this._data);
51
- newData.delete(k);
52
- this._data = newData;
53
- this.fetch(column, resolvedData, callbacks);
54
- }
55
- /** Lance le chargement différé d'une colonne. No-op si déjà en cours. */
56
- fetch(column, resolvedData, callbacks) {
57
- if (!column.lazy)
58
- return;
59
- const k = column.key;
60
- if (this._status.get(k) === 'loading')
61
- return;
62
- const prev = this._cancels.get(k);
63
- if (prev) {
64
- prev.next();
65
- prev.complete();
66
- }
67
- const cancel$ = new Subject();
68
- this._cancels.set(k, cancel$);
69
- const newStatus = new Map(this._status);
70
- newStatus.set(k, 'loading');
71
- this._status = newStatus;
72
- callbacks.onRefresh();
73
- column.lazy.fetchFn().pipe(take(1), takeUntil(cancel$)).subscribe({
74
- next: (values) => {
75
- const rowMap = new Map();
76
- values.forEach((value, i) => {
77
- if (i < resolvedData.length)
78
- rowMap.set(resolvedData[i], value);
79
- });
80
- const newData = new Map(this._data);
81
- newData.set(k, rowMap);
82
- this._data = newData;
83
- const newStatus2 = new Map(this._status);
84
- newStatus2.set(k, 'loaded');
85
- this._status = newStatus2;
86
- callbacks.onRefresh();
87
- callbacks.onMarkForCheck();
88
- },
89
- error: () => {
90
- const newStatusErr = new Map(this._status);
91
- newStatusErr.set(k, 'error');
92
- this._status = newStatusErr;
93
- callbacks.onRefresh();
94
- callbacks.onMarkForCheck();
95
- },
96
- });
97
- }
98
- }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1jb2x1bW4tbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZXRlbWUvanF1ZXJ5LXRhYmxlL3NyYy9saWIvY29tcG9uZW50L2xhenktY29sdW1uLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBT3pFOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUE5QjtRQUVVLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBbUQsQ0FBQztRQUNyRSxVQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7UUFDekMsYUFBUSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBNEZ0RCxDQUFDO0lBMUZDLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBVztRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQztJQUN6QyxDQUFDO0lBRUQsYUFBYSxDQUFDLFFBQWE7UUFDekIsSUFBSSxRQUFRLEtBQUssa0JBQWtCO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDdEQsSUFBSSxRQUFRLEtBQUssZ0JBQWdCO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDbEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELHlHQUF5RztJQUN6RyxTQUFTO1FBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUs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QU07d0JBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2xFLENBQUMsQ0FBQyxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO2dCQUVyQixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztnQkFFMUIsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN0QixTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUM7Z0JBRTVCLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEIsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0LCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uUHJvdmlkZXIgfSBmcm9tICcuLi9qcXVlcnktdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgTEFaWV9MT0FESU5HX1ZBTFVFLCBMQVpZX0VSUk9SX1ZBTFVFIH0gZnJvbSAnLi90YWJsZS5jb25zdGFudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExhenlDYWxsYmFja3Mge1xuICBvblJlZnJlc2goKTogdm9pZDtcbiAgb25NYXJrRm9yQ2hlY2soKTogdm9pZDtcbn1cblxuLyoqXG4gKiBHw6hyZSBsZSBjeWNsZSBkZSB2aWUgZGVzIGNvbG9ubmVzIMOgIGNoYXJnZW1lbnQgZGlmZsOpcsOpIChsYXp5KSA6XG4gKiBzdGF0dXRzLCBkb25uw6llcywgYW5udWxhdGlvbiBkZXMgcmVxdcOqdGVzIGVuIGNvdXJzLlxuICpcbiAqIFBhcyBkZSBkw6lwZW5kYW5jZSBBbmd1bGFyL0RPTSDigJQgcGV1dCDDqnRyZSBpbnN0YW5jacOpIG1hbnVlbGxlbWVudCBkYW5zIGxlIGNvbXBvc2FudC5cbiAqL1xuZXhwb3J0IGNsYXNzIExhenlDb2x1bW5NYW5hZ2VyPFQgPSBhbnk+IHtcblxuICBwcml2YXRlIF9zdGF0dXMgPSBuZXcgTWFwPHN0cmluZywgJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCcgfCAnZXJyb3InPigpO1xuICBwcml2YXRlIF9kYXRhID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxhbnksIGFueT4+KCk7XG4gIHByaXZhdGUgX2NhbmNlbHMgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDx2b2lkPj4oKTtcblxuICBnZXQgc3RhdHVzKCk6IE1hcDxzdHJpbmcsICdpZGxlJyB8ICdsb2FkaW5nJyB8ICdsb2FkZWQnIHwgJ2Vycm9yJz4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gIH1cblxuICBnZXQgZGF0YSgpOiBNYXA8c3RyaW5nLCBNYXA8YW55LCBhbnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBnZXRTdGF0dXMoa2V5OiBzdHJpbmcpOiAnaWRsZScgfCAnbG9hZGluZycgfCAnbG9hZGVkJyB8ICdlcnJvcicge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXMuZ2V0KGtleSkgPz8gJ2lkbGUnO1xuICB9XG5cbiAgZ2V0UmVuZGVyVHlwZShyb3dWYWx1ZTogYW55KTogJ2xvYWRpbmcnIHwgJ2Vycm9yJyB8ICd2YWx1ZScge1xuICAgIGlmIChyb3dWYWx1ZSA9PT0gTEFaWV9MT0FESU5HX1ZBTFVFKSByZXR1cm4gJ2xvYWRpbmcnO1xuICAgIGlmIChyb3dWYWx1ZSA9PT0gTEFaWV9FUlJPUl9WQUxVRSkgcmV0dXJuICdlcnJvcic7XG4gICAgcmV0dXJuICd2YWx1ZSc7XG4gIH1cblxuICAvKiogQW5udWxlIHRvdXMgbGVzIGZldGNoZXMgZW4gY291cnMgZXQgcsOpaW5pdGlhbGlzZSBsJ8OpdGF0IChhcHBlbGVyIGxvcnMgZCd1biBjaGFuZ2VtZW50IGRlIGRvbm7DqWVzKS4gKi9cbiAgY2FuY2VsQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbmNlbHMuZm9yRWFjaChzID0+IHsgcy5uZXh0KCk7IHMuY29tcGxldGUoKTsgfSk7XG4gICAgdGhpcy5fY2FuY2Vscy5jbGVhcigpO1xuICAgIHRoaXMuX3N0YXR1cyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9kYXRhID0gbmV3IE1hcCgpO1xuICB9XG5cbiAgLyoqIFLDqWluaXRpYWxpc2UgdW5lIGNvbG9ubmUgZXQgcmVsYW5jZSBzb24gZmV0Y2guICovXG4gIHJldHJ5KGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgcmVzb2x2ZWREYXRhOiBUW10sIGNhbGxiYWNrczogTGF6eUNhbGxiYWNrcyk6IHZvaWQge1xuICAgIGNvbnN0IGsgPSBjb2x1bW4ua2V5O1xuICAgIGNvbnN0IHByZXYgPSB0aGlzLl9jYW5jZWxzLmdldChrKTtcbiAgICBpZiAocHJldikgeyBwcmV2Lm5leHQoKTsgcHJldi5jb21wbGV0ZSgpOyB9XG4gICAgdGhpcy5fY2FuY2Vscy5kZWxldGUoayk7XG5cbiAgICBjb25zdCBuZXdTdGF0dXMgPSBuZXcgTWFwKHRoaXMuX3N0YXR1cyk7XG4gICAgbmV3U3RhdHVzLmRlbGV0ZShrKTtcbiAgICB0aGlzLl9zdGF0dXMgPSBuZXdTdGF0dXM7XG5cbiAgICBjb25zdCBuZXdEYXRhID0gbmV3IE1hcCh0aGlzLl9kYXRhKTtcbiAgICBuZXdEYXRhLmRlbGV0ZShrKTtcbiAgICB0aGlzLl9kYXRhID0gbmV3RGF0YTtcblxuICAgIHRoaXMuZmV0Y2goY29sdW1uLCByZXNvbHZlZERhdGEsIGNhbGxiYWNrcyk7XG4gIH1cblxuICAvKiogTGFuY2UgbGUgY2hhcmdlbWVudCBkaWZmw6lyw6kgZCd1bmUgY29sb25uZS4gTm8tb3Agc2kgZMOpasOgIGVuIGNvdXJzLiAqL1xuICBmZXRjaChjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4sIHJlc29sdmVkRGF0YTogVFtdLCBjYWxsYmFja3M6IExhenlDYWxsYmFja3MpOiB2b2lkIHtcbiAgICBpZiAoIWNvbHVtbi5sYXp5KSByZXR1cm47XG4gICAgY29uc3QgayA9IGNvbHVtbi5rZXk7XG4gICAgaWYgKHRoaXMuX3N0YXR1cy5nZXQoaykgPT09ICdsb2FkaW5nJykgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJldiA9IHRoaXMuX2NhbmNlbHMuZ2V0KGspO1xuICAgIGlmIChwcmV2KSB7IHByZXYubmV4dCgpOyBwcmV2LmNvbXBsZXRlKCk7IH1cbiAgICBjb25zdCBjYW5jZWwkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICB0aGlzLl9jYW5jZWxzLnNldChrLCBjYW5jZWwkKTtcblxuICAgIGNvbnN0IG5ld1N0YXR1cyA9IG5ldyBNYXAodGhpcy5fc3RhdHVzKTtcbiAgICBuZXdTdGF0dXMuc2V0KGssICdsb2FkaW5nJyk7XG4gICAgdGhpcy5fc3RhdHVzID0gbmV3U3RhdHVzO1xuICAgIGNhbGxiYWNrcy5vblJlZnJlc2goKTtcblxuICAgIGNvbHVtbi5sYXp5LmZldGNoRm4oKS5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHRha2VVbnRpbChjYW5jZWwkKSxcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAodmFsdWVzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCByb3dNYXAgPSBuZXcgTWFwPGFueSwgYW55PigpO1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUsIGkpID0+IHtcbiAgICAgICAgICBpZiAoaSA8IHJlc29sdmVkRGF0YS5sZW5ndGgpIHJvd01hcC5zZXQocmVzb2x2ZWREYXRhW2ldLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXdEYXRhID0gbmV3IE1hcCh0aGlzLl9kYXRhKTtcbiAgICAgICAgbmV3RGF0YS5zZXQoaywgcm93TWFwKTtcbiAgICAgICAgdGhpcy5fZGF0YSA9IG5ld0RhdGE7XG5cbiAgICAgICAgY29uc3QgbmV3U3RhdHVzMiA9IG5ldyBNYXAodGhpcy5fc3RhdHVzKTtcbiAgICAgICAgbmV3U3RhdHVzMi5zZXQoaywgJ2xvYWRlZCcpO1xuICAgICAgICB0aGlzLl9zdGF0dXMgPSBuZXdTdGF0dXMyO1xuXG4gICAgICAgIGNhbGxiYWNrcy5vblJlZnJlc2goKTtcbiAgICAgICAgY2FsbGJhY2tzLm9uTWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3U3RhdHVzRXJyID0gbmV3IE1hcCh0aGlzLl9zdGF0dXMpO1xuICAgICAgICBuZXdTdGF0dXNFcnIuc2V0KGssICdlcnJvcicpO1xuICAgICAgICB0aGlzLl9zdGF0dXMgPSBuZXdTdGF0dXNFcnI7XG5cbiAgICAgICAgY2FsbGJhY2tzLm9uUmVmcmVzaCgpO1xuICAgICAgICBjYWxsYmFja3Mub25NYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==