@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.
- package/esm2022/lib/component/organizer-button/organizer-button.component.mjs +49 -0
- package/esm2022/lib/component/table.component.mjs +185 -114
- package/esm2022/lib/jqt-i18n.token.mjs +2 -2
- package/esm2022/lib/jquery-table.model.mjs +1 -1
- package/esm2022/public-api.mjs +4 -3
- package/fesm2022/oneteme-jquery-table.mjs +265 -1112
- package/fesm2022/oneteme-jquery-table.mjs.map +1 -1
- package/lib/component/organizer-button/organizer-button.component.d.ts +12 -0
- package/lib/component/table.component.d.ts +10 -8
- package/lib/jquery-table.model.d.ts +2 -2
- package/package.json +3 -2
- package/public-api.d.ts +3 -2
- package/esm2022/lib/component/group-by.manager.mjs +0 -99
- package/esm2022/lib/component/lazy-column-manager.mjs +0 -99
- package/esm2022/lib/component/slice-panel/slice-panel.component.mjs +0 -477
- package/esm2022/lib/component/slice-panel/slice-panel.model.mjs +0 -2
- package/esm2022/lib/component/view/view.facade.mjs +0 -304
- package/lib/component/group-by.manager.d.ts +0 -44
- package/lib/component/lazy-column-manager.d.ts +0 -26
- package/lib/component/slice-panel/slice-panel.component.d.ts +0 -81
- package/lib/component/slice-panel/slice-panel.model.d.ts +0 -69
- package/lib/component/view/view.facade.d.ts +0 -95
|
@@ -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 '
|
|
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
|
|
70
|
+
readonly _organizer: OrganizerFacade<TableColumnProvider<T>>;
|
|
75
71
|
/**
|
|
76
|
-
* Snapshot stable synchronisé depuis
|
|
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
|
-
|
|
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 '
|
|
4
|
-
export { SliceConfig } from '
|
|
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.
|
|
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.
|
|
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/
|
|
5
|
-
export
|
|
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==
|