@oneteme/jquery-organizer 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +441 -0
  2. package/esm2022/lib/group-by-manager/group-by-manager.mjs +73 -0
  3. package/esm2022/lib/lazy-field-manager/lazy-field-manager.mjs +91 -0
  4. package/esm2022/lib/models/index.mjs +3 -0
  5. package/esm2022/lib/models/organizer-chart-adapter.mjs +164 -0
  6. package/esm2022/lib/models/organizer-config.interface.mjs +2 -0
  7. package/esm2022/lib/models/organizer-menu.model.mjs +17 -0
  8. package/esm2022/lib/models/organizer-utils.mjs +26 -0
  9. package/esm2022/lib/organizer-button/organizer-button.component.mjs +266 -0
  10. package/esm2022/lib/organizer-button/organizer-button.module.mjs +17 -0
  11. package/esm2022/lib/organizer-facade/organizer-facade.mjs +269 -0
  12. package/esm2022/lib/organizer-facade/organizer-facade.types.mjs +2 -0
  13. package/esm2022/lib/slice-panel/slice-panel.component.mjs +452 -0
  14. package/esm2022/lib/slice-panel/slice-panel.model.mjs +2 -0
  15. package/esm2022/oneteme-jquery-organizer.mjs +5 -0
  16. package/esm2022/public-api.mjs +12 -0
  17. package/fesm2022/oneteme-jquery-organizer.mjs +1369 -0
  18. package/fesm2022/oneteme-jquery-organizer.mjs.map +1 -0
  19. package/index.d.ts +5 -0
  20. package/lib/group-by-manager/group-by-manager.d.ts +20 -0
  21. package/lib/lazy-field-manager/lazy-field-manager.d.ts +25 -0
  22. package/lib/models/index.d.ts +2 -0
  23. package/lib/models/organizer-chart-adapter.d.ts +44 -0
  24. package/lib/models/organizer-config.interface.d.ts +103 -0
  25. package/lib/models/organizer-menu.model.d.ts +7 -0
  26. package/lib/models/organizer-utils.d.ts +8 -0
  27. package/lib/organizer-button/organizer-button.component.d.ts +51 -0
  28. package/lib/organizer-button/organizer-button.module.d.ts +8 -0
  29. package/lib/organizer-facade/organizer-facade.d.ts +51 -0
  30. package/lib/organizer-facade/organizer-facade.types.d.ts +31 -0
  31. package/lib/slice-panel/slice-panel.component.d.ts +80 -0
  32. package/lib/slice-panel/slice-panel.model.d.ts +25 -0
  33. package/package.json +35 -0
  34. package/public-api.d.ts +12 -0
package/README.md ADDED
@@ -0,0 +1,441 @@
1
+ # @oneteme/jquery-organizer
2
+
3
+ Bibliothèque Angular autonome pour la gestion décentralisée des configurations de graphiques et tableaux. Elle fournit :
4
+
5
+ - **OrganizerButtonComponent** — Bouton configurable pour sélectionner indicateurs, regroupements et filtres
6
+ - **SlicePanelComponent** — Panneau latéral collapsible pour le filtrage par catégories
7
+ - **Adapters** — Fonctions de conversion ChartConfig ↔ OrganizerConfig avec auto-détection d'unités
8
+ - **Facade** — Gestion centralisée d'état pour les champs visibles, regroupements, filtres
9
+
10
+ **v0.0.43+**: Support complet pour **UnitConfig avec auto-scaling intelligent** des unités Y (ms → µs → s, etc.)
11
+
12
+ ---
13
+
14
+ ## Quick Start
15
+
16
+ ### Import
17
+
18
+ ```typescript
19
+ import { OrganizerButtonModule } from '@oneteme/jquery-organizer';
20
+ import { OrganizerConfig, OrganizerState, OrganizerButtonEvent } from '@oneteme/jquery-organizer';
21
+
22
+ @NgModule({
23
+ imports: [OrganizerButtonModule]
24
+ })
25
+ export class MyModule {}
26
+ ```
27
+
28
+ ### Template
29
+
30
+ ```html
31
+ <organizer-button
32
+ [config]="organizerConfig"
33
+ [state]="organizerState"
34
+ (viewChange)="onOrganizerChange($event)"
35
+ (sliceStateChange)="onSliceStateChange($event)">
36
+ </organizer-button>
37
+
38
+ <slice-panel
39
+ *ngIf="sliceState"
40
+ [sliceConfigs]="sliceState.sliceConfigs"
41
+ [data]="sliceState.tasks"
42
+ (filterChange)="onFilterChange($event)">
43
+ </slice-panel>
44
+ ```
45
+
46
+ ---
47
+
48
+ ## Sommaire
49
+
50
+ - [Architecture](#architecture)
51
+ - [Dépendances](#dépendances)
52
+ - [OrganizerButtonComponent](#organizerbuttoncomponent)
53
+ - [Inputs / Outputs](#inputs--outputs)
54
+ - [OrganizerConfig](#organizerconfig)
55
+ - [OrganizerState et OrganizerEvent](#organizerstate-et-organizerevent)
56
+ - [SlicePanelComponent](#slicepanelcomponent)
57
+ - [Système d'Unités avec Auto-Scaling](#système-dunités-avec-auto-scaling)
58
+ - [Chart Adapter](#chart-adapter)
59
+ - [Intégration avec jquery-echarts](#intégration-avec-jquery-echarts)
60
+ - [Intégration avec jquery-table](#intégration-avec-jquery-table)
61
+
62
+ ---
63
+
64
+ ## Architecture
65
+
66
+ Structure des fichiers et dépendances :
67
+
68
+ ```
69
+ @oneteme/jquery-organizer
70
+ ├── organizer-button/
71
+ │ ├── organizer-button.component.ts (standalone)
72
+ │ └── organizer-button.module.ts
73
+ ├── slice-panel/
74
+ │ ├── slice-panel.component.ts (standalone)
75
+ │ └── slice-panel.model.ts
76
+ ├── models/
77
+ │ ├── organizer-config.interface.ts (OrganizerConfig, OrganizerState, OrganizerEvent)
78
+ │ ├── organizer-chart-adapter.ts (chartConfigToOrganizer, resolveYUnit, etc.)
79
+ │ ├── organizer-utils.ts (buildYFields, resolveYKey)
80
+ │ └── organizer-menu.model.ts
81
+ ├── organizer-facade/
82
+ │ └── organizer-facade.ts (Gestion centralisée d'état)
83
+ └── public-api.ts (Exports publics)
84
+ ```
85
+
86
+ ---
87
+
88
+ ## Dépendances
89
+
90
+ Version minimale requise :
91
+
92
+ | Dépendance | Version | Rôle |
93
+ |---|---|---|
94
+ | `@angular/core` | >= 16.1.0 | Framework Angular |
95
+ | `@angular/material` | ^16.1.0 | MatMenu, MatIcon (optionnel) |
96
+ | `@oneteme/jquery-core` | ^0.0.32+ | UnitConfig, ScaleConfig, DataProvider |
97
+
98
+ ---
99
+
100
+ ## OrganizerButtonComponent
101
+
102
+ Composant standalone qui affiche un bouton ouvrant un menu Material. Le menu expose les options de configuration et gère le lazy-loading des données.
103
+
104
+ ### Inputs / Outputs
105
+
106
+ | Prop | Type | Description |
107
+ |---|---|---|
108
+ | `[config]` | `OrganizerConfig` | Configuration du bouton et menu |
109
+ | `[state]` | `OrganizerState` | État courant des sélections |
110
+ | `(viewChange)` | `EventEmitter<OrganizerEvent>` | Émis à chaque interaction utilisateur |
111
+ | `(sliceStateChange)` | `EventEmitter<OrganizerSliceState \| null>` | Données de filtre après fetch |
112
+
113
+ ### OrganizerConfig
114
+
115
+ ```typescript
116
+ export interface OrganizerConfig {
117
+ // Champs/Indicateurs/Groupements disponibles
118
+ xFields?: OrganizerXField[]; // Dimensions (ex: date, host)
119
+ yFields?: OrganizerYField[]; // Indicateurs (ex: count, elapsed_avg)
120
+ groups?: OrganizerViewGroup[]; // Options de regroupement
121
+ slices?: OrganizerViewSlice[]; // Options de filtre
122
+
123
+ // Callbacks
124
+ onFetchFieldData?: (fieldId: string) => Promise<any[]>;
125
+ onFetchSliceData?: (filterKey: string) => Observable<any[]> | Promise<any[]>;
126
+ onSliceClick?: () => void;
127
+
128
+ // Export & Préférences
129
+ showExport?: boolean;
130
+ onExport?: () => void;
131
+ showPreferences?: boolean;
132
+ onPreferencesEdit?: () => void;
133
+ onPreferencesSave?: () => void;
134
+ onPreferencesClear?: () => void;
135
+
136
+ // UI
137
+ showReset?: boolean; // Défaut: true
138
+ buttonLabel?: string;
139
+ buttonIcon?: string; // Icône Material
140
+ showButtonIcon?: boolean;
141
+ menuPosition?: 'above' | 'below';
142
+ menuClass?: string;
143
+
144
+ switchView?: {
145
+ currentView: 'chart' | 'table';
146
+ onSwitch: (newView: 'chart' | 'table') => void;
147
+ };
148
+ }
149
+ ```
150
+
151
+ ### OrganizerState et OrganizerEvent
152
+
153
+ ```typescript
154
+ export interface OrganizerState {
155
+ viewMode?: 'chart' | 'table';
156
+ visibleFields?: string[]; // Champs visibles en table
157
+ selectedX?: string; // Dimension X (ex: 'date')
158
+ selectedY?: string; // Indicateur Y (ex: 'count')
159
+ selectedYAggregate?: string; // Agrégat si applicable
160
+ selectedGroupBy?: string; // Regroupement actif
161
+ selectedSlices?: string[]; // Filtres actifs
162
+ }
163
+
164
+ export interface OrganizerButtonEvent {
165
+ type: 'fieldToggled' | 'xSelected' | 'ySelected' | 'groupBySelected'
166
+ | 'sliceSelected' | 'reset' | 'viewSwitched';
167
+ state: OrganizerState; // État complet après action
168
+ source?: 'user' | 'api';
169
+ resolvedYUnit?: string | UnitConfig; // Unité auto-détectée (voir Auto-Scaling)
170
+ }
171
+ ```
172
+
173
+ ---
174
+
175
+ ## SlicePanelComponent
176
+
177
+ Panneau latéral collapsible pour filtrer les données par catégories.
178
+
179
+ ### Inputs / Outputs
180
+
181
+ | Prop | Type | Défaut | Description |
182
+ |---|---|---|---|
183
+ | `[sliceConfigs]` | `SliceConfig<T>[]` | `[]` | Définition des groupes de filtres |
184
+ | `[data]` | `T[]` | `[]` | Données brutes à filtrer |
185
+ | `[showCounts]` | `boolean` | `true` | Affiche comptage par catégorie |
186
+ | `[showToggle]` | `boolean` | `true` | Affiche bouton replier/déplier |
187
+ | `[alwaysShow]` | `boolean` | `false` | Affiche même sans données |
188
+ | `(filterChange)` | `EventEmitter<(row: T) => boolean>` | — | Prédicat de filtre |
189
+ | `(collapsedChange)` | `EventEmitter<boolean>` | — | État replié |
190
+
191
+ ---
192
+
193
+ ## Système d'Unités avec Auto-Scaling
194
+
195
+ Formatage intelligent et conversion dynamique des unités Y
196
+
197
+ ### UnitConfig — Configuration Intelligente
198
+
199
+ Au lieu d'une simple string `unit: 'ms'`, `UnitConfig` permet l'auto-détection du meilleur format selon l'ordre de grandeur des données :
200
+
201
+ ```typescript
202
+ interface UnitConfig {
203
+ baseUnit: string; // Unité source ('s', 'o', etc.)
204
+ scales: ScaleConfig[]; // Formats disponibles (µs, ms, s)
205
+ precision?: number;
206
+ formatter?: (v: number, selectedUnit: string) => string;
207
+ }
208
+
209
+ interface ScaleConfig {
210
+ unit: string; // Unité affichée ('µs', 'ms', 's')
211
+ scale: number; // Facteur de conversion (1000 pour s→ms)
212
+ threshold?: number; // Utiliser si max(données) > threshold
213
+ }
214
+ ```
215
+
216
+ ### Exemple: Latence avec Auto-Scaling
217
+
218
+ ```typescript
219
+ {
220
+ key: 'avg',
221
+ selected: true,
222
+ unit: {
223
+ baseUnit: 's',
224
+ scales: [
225
+ { unit: 'µs', scale: 1000000, threshold: 0.001 }, // < 1ms
226
+ { unit: 'ms', scale: 1000, threshold: 1 }, // < 1s (DEFAULT)
227
+ { unit: 's', scale: 1, threshold: Infinity } // >= 1s
228
+ ]
229
+ }
230
+ }
231
+ ```
232
+
233
+ **Résultat :**
234
+ - Données `[0.0001, 0.0005]` → Affiche en **µs** (`100 µs`, `500 µs`)
235
+ - Données `[0.05, 0.2, 0.8]` → Affiche en **ms** (`50 ms`, `200 ms`, `800 ms`)
236
+ - Données `[1.5, 3.2, 5.1]` → Affiche en **s** (`1,5 s`, `3,2 s`, `5,1 s`)
237
+
238
+ ### Affichage Adaptatif de la Précision
239
+
240
+ Les nombres sont formatés avec une précision qui s'ajuste à l'ordre de grandeur :
241
+
242
+ ```
243
+ Valeur Format Raison
244
+ 0.000123 → "0,000123" 6 décimales (très petit)
245
+ 0.05 → "0,05" 2 décimales
246
+ 1234 → "1 234" 0 décimale (entier avec séparateur)
247
+ 50000 → "50 000" 0 décimale
248
+ ```
249
+
250
+ ---
251
+
252
+ ## Chart Adapter
253
+
254
+ Les fonctions `organizer-chart-adapter.ts` convertissent entre `ChartConfig` (métier) et `OrganizerConfig` (UI) :
255
+
256
+ ```typescript
257
+ // ChartConfig → OrganizerConfig
258
+ export function chartConfigToOrganizer(
259
+ chartConfig: any,
260
+ options?: OrganizerChartBridgeOptions
261
+ ): OrganizerConfig
262
+
263
+ // ChartConfig → OrganizerState
264
+ export function chartConfigToState(chartConfig: any): OrganizerState
265
+
266
+ // ChartConfig → Événement + État unifié
267
+ export function chartConfigToUnifiedState(
268
+ chartConfig: any,
269
+ viewMode?: 'chart' | 'table'
270
+ ): OrganizerUnifiedState
271
+
272
+ // Applique un OrganizerEvent à ChartConfig
273
+ export function applyOrganizerEventToChart(
274
+ event: OrganizerButtonEvent,
275
+ chartConfig: any
276
+ ): void
277
+
278
+ // Résout l'unité Y pour l'événement
279
+ export function resolveYUnit(
280
+ chartConfig: any,
281
+ selectedY?: string,
282
+ selectedYAggregate?: string
283
+ ): string | UnitConfig | undefined
284
+ ```
285
+
286
+ ---
287
+
288
+ ## Intégration avec jquery-echarts
289
+
290
+ ### Pattern 3-étapes
291
+
292
+ 1. **Initialisation** : Construire OrganizerConfig depuis ChartConfig
293
+ 2. **Réaction aux événements** : Appliquer OrganizerEvent à ChartConfig
294
+ 3. **Refetch** : Recharger les données avec la nouvelle config
295
+
296
+ ### Exemple Complet
297
+
298
+ ```typescript
299
+ import { OrganizerButtonEvent, OrganizerSliceState } from '@oneteme/jquery-organizer';
300
+ import { chartConfigToOrganizer, chartConfigToState, applyOrganizerEventToChart } from '@oneteme/jquery-organizer';
301
+
302
+ @Component({
303
+ selector: 'app-kpi',
304
+ template: `
305
+ <organizer-button
306
+ [config]="$latency.config"
307
+ [state]="$latency.state"
308
+ (viewChange)="onLatencyViewChange($event)"
309
+ (sliceStateChange)="onLatencySliceChange($event)">
310
+ </organizer-button>
311
+ <chart [config]="$latency.chartProvider" [data]="$latency.data"></chart>
312
+ `
313
+ })
314
+ export class KpiComponent {
315
+ $latency = {
316
+ config: {},
317
+ state: {},
318
+ chartConfig: REST_LATENCY_CHART_CONFIG('day'),
319
+ chartProvider: {},
320
+ data: []
321
+ };
322
+
323
+ ngOnInit() {
324
+ // Initialisation
325
+ this.$latency.config = chartConfigToOrganizer(this.$latency.chartConfig);
326
+ this.$latency.state = chartConfigToState(this.$latency.chartConfig);
327
+ this._fetchLatency();
328
+ }
329
+
330
+ onLatencyViewChange(event: OrganizerButtonEvent): void {
331
+ // Appliquer l'événement → met à jour ChartConfig
332
+ applyOrganizerEventToChart(event, this.$latency.chartConfig);
333
+
334
+ // Mettre à jour la UI du button
335
+ this.$latency.state = event.state;
336
+
337
+ // Refetch
338
+ this._fetchLatency();
339
+ }
340
+
341
+ private _fetchLatency(): void {
342
+ const cfg = this.$latency.chartConfig;
343
+ const ind = cfg.indicators.items.find(i => i.selected);
344
+
345
+ this._httpService.getLatency({ indicator: ind, ... }).subscribe(data => {
346
+ const series = buildSeries(cfg.series.items, ind, cfg.groups.items[0], null, data);
347
+
348
+ // Injection de l'unité (simple string ou UnitConfig)
349
+ this.$latency.chartProvider = {
350
+ ...this.BASE_CHART_PROVIDER,
351
+ series,
352
+ yUnit: ind?.unit // ← string | UnitConfig
353
+ };
354
+
355
+ this.$latency.data = data;
356
+ });
357
+ }
358
+ }
359
+ ```
360
+
361
+ ---
362
+
363
+ ## Intégration avec jquery-table
364
+
365
+ ```typescript
366
+ import { TableComponent } from '@oneteme/jquery-table';
367
+ import { OrganizerButtonModule } from '@oneteme/jquery-organizer';
368
+
369
+ @Component({
370
+ imports: [TableComponent, OrganizerButtonModule]
371
+ })
372
+ export class TableWithOrganizerComponent {
373
+ @ViewChild(TableComponent) table: TableComponent;
374
+
375
+ onOrganizerViewChange(event: OrganizerButtonEvent): void {
376
+ // Le tableau gère automatiquement les colonnes visibles
377
+ if (event.type === 'fieldToggled') {
378
+ this.table.applyVisibleColumns(event.state.visibleFields);
379
+ }
380
+ if (event.type === 'groupBySelected') {
381
+ this.table.applyGroupBy(event.state.selectedGroupBy);
382
+ }
383
+ }
384
+ }
385
+ ```
386
+
387
+ ---
388
+
389
+ ## API Exports
390
+
391
+ Exports publics de la bibliothèque :
392
+
393
+ ```typescript
394
+ // Composants
395
+ export { OrganizerButtonComponent } from './organizer-button.component';
396
+ export { OrganizerButtonModule } from './organizer-button.module';
397
+ export { SlicePanelComponent } from './slice-panel.component';
398
+
399
+ // Interfaces
400
+ export { OrganizerConfig, OrganizerState, OrganizerButtonEvent, OrganizerSliceState } from './organizer-config.interface';
401
+ export { SliceConfig, SliceColumnDef, SliceCategory } from './slice-panel.model';
402
+
403
+ // Adapters
404
+ export {
405
+ chartConfigToOrganizer,
406
+ chartConfigToState,
407
+ chartConfigToUnifiedState,
408
+ applyOrganizerEventToChart,
409
+ resolveYUnit
410
+ } from './organizer-chart-adapter';
411
+
412
+ // Utilitaires
413
+ export { buildYFields, resolveYKey } from './organizer-utils';
414
+
415
+ // Facade
416
+ export { OrganizerFacade } from './organizer-facade/organizer-facade';
417
+ ```
418
+
419
+ ---
420
+
421
+ ## Changelog
422
+
423
+ ### v0.0.43+ (2026-07-03)
424
+ - Ajout du support **UnitConfig** avec auto-scaling intelligent
425
+ - Exports des adapters (chartConfigToOrganizer, resolveYUnit, etc.)
426
+ - Renommage des propriétés OrganizerFacade (Column → Field) dans jquery-table
427
+ - Support des `ScaleConfig` pour conversion dynamique d'unités
428
+ - Formatage adaptatif de la précision (smartFormatY) en chart-utils
429
+ - Intégration complète avec REST_LATENCY_CHART_CONFIG
430
+
431
+ ### v0.0.42
432
+ - Refactoring des exports publics
433
+ - Consolidation de SlicePanelComponent
434
+
435
+ ---
436
+
437
+ ## Support
438
+
439
+ Pour des questions ou des bugs, ouvrir une issue dans le repository jquery-charts.
440
+
441
+ License: Voir LICENSE in the root.
@@ -0,0 +1,73 @@
1
+ export class GroupByManager {
2
+ constructor(onNeedProjection, onNeedRender) {
3
+ this.onNeedProjection = onNeedProjection;
4
+ this.onNeedRender = onNeedRender;
5
+ this._collapsedGroups = new Set();
6
+ this._groupPages = new Map();
7
+ this.groupPageSize = 5;
8
+ this.groupSortOrder = 'asc';
9
+ this._defaultGroupCollapsed = false;
10
+ }
11
+ setDefaultCollapsed(collapsed) {
12
+ this._defaultGroupCollapsed = collapsed;
13
+ }
14
+ reset() {
15
+ this._collapsedGroups.clear();
16
+ this._groupPages.clear();
17
+ }
18
+ isGroupCollapsed(groupKey) {
19
+ return this._defaultGroupCollapsed
20
+ ? !this._collapsedGroups.has(groupKey)
21
+ : this._collapsedGroups.has(groupKey);
22
+ }
23
+ toggleGroupCollapse(groupKey, scrollTo) {
24
+ if (this._collapsedGroups.has(groupKey)) {
25
+ this._collapsedGroups.delete(groupKey);
26
+ }
27
+ else {
28
+ this._collapsedGroups.clear();
29
+ this._collapsedGroups.add(groupKey);
30
+ scrollTo(groupKey);
31
+ }
32
+ this.onNeedProjection();
33
+ }
34
+ getSingleOpenGroup() {
35
+ return this._defaultGroupCollapsed && this._collapsedGroups.size === 1
36
+ ? [...this._collapsedGroups][0]
37
+ : null;
38
+ }
39
+ getPage(groupKey) {
40
+ return this._groupPages.get(groupKey) ?? 0;
41
+ }
42
+ groupPageBack(groupKey) {
43
+ const current = this._groupPages.get(groupKey) ?? 0;
44
+ if (current > 0) {
45
+ this._groupPages.set(groupKey, current - 1);
46
+ this.onNeedProjection();
47
+ }
48
+ }
49
+ groupPageForward(groupKey, totalCount) {
50
+ const maxPage = Math.ceil(totalCount / this.groupPageSize) - 1;
51
+ const current = this._groupPages.get(groupKey) ?? 0;
52
+ if (current < maxPage) {
53
+ this._groupPages.set(groupKey, current + 1);
54
+ this.onNeedProjection();
55
+ }
56
+ }
57
+ onGroupPageSizeChange(size) {
58
+ this.groupPageSize = size;
59
+ this._groupPages.clear();
60
+ this.onNeedRender();
61
+ }
62
+ onGroupSortToggle(dir, scrollTo) {
63
+ if (this.groupSortOrder === dir)
64
+ return;
65
+ this.groupSortOrder = dir;
66
+ this._groupPages.clear();
67
+ this.onNeedRender();
68
+ const openGroup = this.getSingleOpenGroup();
69
+ if (openGroup)
70
+ scrollTo(openGroup);
71
+ }
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtYnktbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZXRlbWUvanF1ZXJ5LW9yZ2FuaXplci9zcmMvbGliL2dyb3VwLWJ5LW1hbmFnZXIvZ3JvdXAtYnktbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sY0FBYztJQVN6QixZQUNtQixnQkFBNEIsRUFDNUIsWUFBd0I7UUFEeEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFZO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFZO1FBVjFCLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDckMsZ0JBQVcsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUV6RCxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUNsQixtQkFBYyxHQUFtQixLQUFLLENBQUM7UUFFL0IsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO0lBS3BDLENBQUM7SUFFSixtQkFBbUIsQ0FBQyxTQUFrQjtRQUNwQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQWdCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLHNCQUFzQjtZQUNoQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUN0QyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsUUFBZ0IsRUFBRSxRQUErQjtRQUNuRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDdkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN4QzthQUFNO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFFRCxPQUFPLENBQUMsUUFBZ0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGFBQWEsQ0FBQyxRQUFnQjtRQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO1FBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksT0FBTyxHQUFHLE9BQU8sRUFBRTtZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQVk7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBQW1CLEVBQUUsUUFBK0I7UUFDcEUsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLEdBQUc7WUFBRSxPQUFPO1FBQ3hDLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVDLElBQUksU0FBUztZQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgR3JvdXBCeU1hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb2xsYXBzZWRHcm91cHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZ3JvdXBQYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgZ3JvdXBQYWdlU2l6ZSA9IDU7XG4gIGdyb3VwU29ydE9yZGVyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xuXG4gIHByaXZhdGUgX2RlZmF1bHRHcm91cENvbGxhcHNlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb25OZWVkUHJvamVjdGlvbjogKCkgPT4gdm9pZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9uTmVlZFJlbmRlcjogKCkgPT4gdm9pZCxcbiAgKSB7fVxuXG4gIHNldERlZmF1bHRDb2xsYXBzZWQoY29sbGFwc2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fZGVmYXVsdEdyb3VwQ29sbGFwc2VkID0gY29sbGFwc2VkO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fY29sbGFwc2VkR3JvdXBzLmNsZWFyKCk7XG4gICAgdGhpcy5fZ3JvdXBQYWdlcy5jbGVhcigpO1xuICB9XG5cbiAgaXNHcm91cENvbGxhcHNlZChncm91cEtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRHcm91cENvbGxhcHNlZFxuICAgICAgPyAhdGhpcy5fY29sbGFwc2VkR3JvdXBzLmhhcyhncm91cEtleSlcbiAgICAgIDogdGhpcy5fY29sbGFwc2VkR3JvdXBzLmhhcyhncm91cEtleSk7XG4gIH1cblxuICB0b2dnbGVHcm91cENvbGxhcHNlKGdyb3VwS2V5OiBzdHJpbmcsIHNjcm9sbFRvOiAoa2V5OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29sbGFwc2VkR3JvdXBzLmhhcyhncm91cEtleSkpIHtcbiAgICAgIHRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5kZWxldGUoZ3JvdXBLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb2xsYXBzZWRHcm91cHMuY2xlYXIoKTtcbiAgICAgIHRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5hZGQoZ3JvdXBLZXkpO1xuICAgICAgc2Nyb2xsVG8oZ3JvdXBLZXkpO1xuICAgIH1cbiAgICB0aGlzLm9uTmVlZFByb2plY3Rpb24oKTtcbiAgfVxuXG4gIGdldFNpbmdsZU9wZW5Hcm91cCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdEdyb3VwQ29sbGFwc2VkICYmIHRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5zaXplID09PSAxXG4gICAgICA/IFsuLi50aGlzLl9jb2xsYXBzZWRHcm91cHNdWzBdXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBnZXRQYWdlKGdyb3VwS2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9ncm91cFBhZ2VzLmdldChncm91cEtleSkgPz8gMDtcbiAgfVxuXG4gIGdyb3VwUGFnZUJhY2soZ3JvdXBLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9ncm91cFBhZ2VzLmdldChncm91cEtleSkgPz8gMDtcbiAgICBpZiAoY3VycmVudCA+IDApIHtcbiAgICAgIHRoaXMuX2dyb3VwUGFnZXMuc2V0KGdyb3VwS2V5LCBjdXJyZW50IC0gMSk7XG4gICAgICB0aGlzLm9uTmVlZFByb2plY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBncm91cFBhZ2VGb3J3YXJkKGdyb3VwS2V5OiBzdHJpbmcsIHRvdGFsQ291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG1heFBhZ2UgPSBNYXRoLmNlaWwodG90YWxDb3VudCAvIHRoaXMuZ3JvdXBQYWdlU2l6ZSkgLSAxO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9ncm91cFBhZ2VzLmdldChncm91cEtleSkgPz8gMDtcbiAgICBpZiAoY3VycmVudCA8IG1heFBhZ2UpIHtcbiAgICAgIHRoaXMuX2dyb3VwUGFnZXMuc2V0KGdyb3VwS2V5LCBjdXJyZW50ICsgMSk7XG4gICAgICB0aGlzLm9uTmVlZFByb2plY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBvbkdyb3VwUGFnZVNpemVDaGFuZ2Uoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5ncm91cFBhZ2VTaXplID0gc2l6ZTtcbiAgICB0aGlzLl9ncm91cFBhZ2VzLmNsZWFyKCk7XG4gICAgdGhpcy5vbk5lZWRSZW5kZXIoKTtcbiAgfVxuXG4gIG9uR3JvdXBTb3J0VG9nZ2xlKGRpcjogJ2FzYycgfCAnZGVzYycsIHNjcm9sbFRvOiAoa2V5OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncm91cFNvcnRPcmRlciA9PT0gZGlyKSByZXR1cm47XG4gICAgdGhpcy5ncm91cFNvcnRPcmRlciA9IGRpcjtcbiAgICB0aGlzLl9ncm91cFBhZ2VzLmNsZWFyKCk7XG4gICAgdGhpcy5vbk5lZWRSZW5kZXIoKTtcbiAgICBjb25zdCBvcGVuR3JvdXAgPSB0aGlzLmdldFNpbmdsZU9wZW5Hcm91cCgpO1xuICAgIGlmIChvcGVuR3JvdXApIHNjcm9sbFRvKG9wZW5Hcm91cCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,91 @@
1
+ import { Subject, take, takeUntil } from 'rxjs';
2
+ export const LAZY_FIELD_LOADING_VALUE = '__lazy_loading__';
3
+ export const LAZY_FIELD_ERROR_VALUE = '__lazy_error__';
4
+ export class LazyFieldManager {
5
+ constructor() {
6
+ this._status = new Map();
7
+ this._data = new Map();
8
+ this._cancels = new Map();
9
+ }
10
+ get status() {
11
+ return this._status;
12
+ }
13
+ get data() {
14
+ return this._data;
15
+ }
16
+ getStatus(key) {
17
+ return this._status.get(key) ?? 'idle';
18
+ }
19
+ getRenderType(rowValue) {
20
+ if (rowValue === LAZY_FIELD_LOADING_VALUE)
21
+ return 'loading';
22
+ if (rowValue === LAZY_FIELD_ERROR_VALUE)
23
+ return 'error';
24
+ return 'value';
25
+ }
26
+ cancelAll() {
27
+ this._cancels.forEach(s => { s.next(); s.complete(); });
28
+ this._cancels.clear();
29
+ this._status = new Map();
30
+ this._data = new Map();
31
+ }
32
+ retry(field, resolvedData, callbacks) {
33
+ const k = field.key;
34
+ const prev = this._cancels.get(k);
35
+ if (prev) {
36
+ prev.next();
37
+ prev.complete();
38
+ }
39
+ this._cancels.delete(k);
40
+ const newStatus = new Map(this._status);
41
+ newStatus.delete(k);
42
+ this._status = newStatus;
43
+ const newData = new Map(this._data);
44
+ newData.delete(k);
45
+ this._data = newData;
46
+ this.fetch(field, resolvedData, callbacks);
47
+ }
48
+ fetch(field, resolvedData, callbacks) {
49
+ if (!field.lazy)
50
+ return;
51
+ const k = field.key;
52
+ if (this._status.get(k) === 'loading')
53
+ return;
54
+ const prev = this._cancels.get(k);
55
+ if (prev) {
56
+ prev.next();
57
+ prev.complete();
58
+ }
59
+ const cancel$ = new Subject();
60
+ this._cancels.set(k, cancel$);
61
+ const newStatus = new Map(this._status);
62
+ newStatus.set(k, 'loading');
63
+ this._status = newStatus;
64
+ callbacks.onRefresh();
65
+ field.lazy.fetchFn().pipe(take(1), takeUntil(cancel$)).subscribe({
66
+ next: (values) => {
67
+ const rowMap = new Map();
68
+ values.forEach((value, i) => {
69
+ if (i < resolvedData.length)
70
+ rowMap.set(resolvedData[i], value);
71
+ });
72
+ const newData = new Map(this._data);
73
+ newData.set(k, rowMap);
74
+ this._data = newData;
75
+ const newStatus2 = new Map(this._status);
76
+ newStatus2.set(k, 'loaded');
77
+ this._status = newStatus2;
78
+ callbacks.onRefresh();
79
+ callbacks.onMarkForCheck();
80
+ },
81
+ error: () => {
82
+ const newStatusErr = new Map(this._status);
83
+ newStatusErr.set(k, 'error');
84
+ this._status = newStatusErr;
85
+ callbacks.onRefresh();
86
+ callbacks.onMarkForCheck();
87
+ },
88
+ });
89
+ }
90
+ }
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1maWVsZC1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktb3JnYW5pemVyL3NyYy9saWIvbGF6eS1maWVsZC1tYW5hZ2VyL2xhenktZmllbGQtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFhNUQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsa0JBQWtCLENBQUM7QUFDM0QsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUM7QUFFdkQsTUFBTSxPQUFPLGdCQUFnQjtJQUE3QjtRQUVVLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBbUQsQ0FBQztRQUNyRSxVQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7UUFDekMsYUFBUSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBeUZ0RCxDQUFDO0lBdkZDLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBVztRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQztJQUN6QyxDQUFDO0lBRUQsYUFBYSxDQUFDLFFBQWE7UUFDekIsSUFBSSxRQUFRLEtBQUssd0JBQXdCO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDNUQsSUFBSSxRQUFRLEtBQUssc0JBQXNCO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDeEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FB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QU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNsRSxDQUFDLENBQUMsQ0FBQztnQkFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztnQkFFckIsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7Z0JBRTFCLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEIsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdCLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0MsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO2dCQUU1QixTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3RCLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM3QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF6eUZpZWxkRGVmIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhenk/OiB7XG4gICAgZmV0Y2hGbjogKCkgPT4gT2JzZXJ2YWJsZTxhbnlbXT47XG4gIH07XG59XG5leHBvcnQgaW50ZXJmYWNlIExhenlGaWVsZENhbGxiYWNrcyB7XG4gIG9uUmVmcmVzaCgpOiB2b2lkO1xuICBvbk1hcmtGb3JDaGVjaygpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgTEFaWV9GSUVMRF9MT0FESU5HX1ZBTFVFID0gJ19fbGF6eV9sb2FkaW5nX18nO1xuZXhwb3J0IGNvbnN0IExBWllfRklFTERfRVJST1JfVkFMVUUgPSAnX19sYXp5X2Vycm9yX18nO1xuXG5leHBvcnQgY2xhc3MgTGF6eUZpZWxkTWFuYWdlcjxURmllbGQgZXh0ZW5kcyBMYXp5RmllbGREZWYgPSBMYXp5RmllbGREZWY+IHtcblxuICBwcml2YXRlIF9zdGF0dXMgPSBuZXcgTWFwPHN0cmluZywgJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCcgfCAnZXJyb3InPigpO1xuICBwcml2YXRlIF9kYXRhID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxhbnksIGFueT4+KCk7XG4gIHByaXZhdGUgX2NhbmNlbHMgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDx2b2lkPj4oKTtcblxuICBnZXQgc3RhdHVzKCk6IE1hcDxzdHJpbmcsICdpZGxlJyB8ICdsb2FkaW5nJyB8ICdsb2FkZWQnIHwgJ2Vycm9yJz4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gIH1cblxuICBnZXQgZGF0YSgpOiBNYXA8c3RyaW5nLCBNYXA8YW55LCBhbnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBnZXRTdGF0dXMoa2V5OiBzdHJpbmcpOiAnaWRsZScgfCAnbG9hZGluZycgfCAnbG9hZGVkJyB8ICdlcnJvcicge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXMuZ2V0KGtleSkgPz8gJ2lkbGUnO1xuICB9XG5cbiAgZ2V0UmVuZGVyVHlwZShyb3dWYWx1ZTogYW55KTogJ2xvYWRpbmcnIHwgJ2Vycm9yJyB8ICd2YWx1ZScge1xuICAgIGlmIChyb3dWYWx1ZSA9PT0gTEFaWV9GSUVMRF9MT0FESU5HX1ZBTFVFKSByZXR1cm4gJ2xvYWRpbmcnO1xuICAgIGlmIChyb3dWYWx1ZSA9PT0gTEFaWV9GSUVMRF9FUlJPUl9WQUxVRSkgcmV0dXJuICdlcnJvcic7XG4gICAgcmV0dXJuICd2YWx1ZSc7XG4gIH1cblxuICBjYW5jZWxBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FuY2Vscy5mb3JFYWNoKHMgPT4geyBzLm5leHQoKTsgcy5jb21wbGV0ZSgpOyB9KTtcbiAgICB0aGlzLl9jYW5jZWxzLmNsZWFyKCk7XG4gICAgdGhpcy5fc3RhdHVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgTWFwKCk7XG4gIH1cblxuICByZXRyeTxUUm93PihmaWVsZDogVEZpZWxkLCByZXNvbHZlZERhdGE6IFRSb3dbXSwgY2FsbGJhY2tzOiBMYXp5RmllbGRDYWxsYmFja3MpOiB2b2lkIHtcbiAgICBjb25zdCBrID0gZmllbGQua2V5O1xuICAgIGNvbnN0IHByZXYgPSB0aGlzLl9jYW5jZWxzLmdldChrKTtcbiAgICBpZiAocHJldikgeyBwcmV2Lm5leHQoKTsgcHJldi5jb21wbGV0ZSgpOyB9XG4gICAgdGhpcy5fY2FuY2Vscy5kZWxldGUoayk7XG5cbiAgICBjb25zdCBuZXdTdGF0dXMgPSBuZXcgTWFwKHRoaXMuX3N0YXR1cyk7XG4gICAgbmV3U3RhdHVzLmRlbGV0ZShrKTtcbiAgICB0aGlzLl9zdGF0dXMgPSBuZXdTdGF0dXM7XG5cbiAgICBjb25zdCBuZXdEYXRhID0gbmV3IE1hcCh0aGlzLl9kYXRhKTtcbiAgICBuZXdEYXRhLmRlbGV0ZShrKTtcbiAgICB0aGlzLl9kYXRhID0gbmV3RGF0YTtcblxuICAgIHRoaXMuZmV0Y2goZmllbGQsIHJlc29sdmVkRGF0YSwgY2FsbGJhY2tzKTtcbiAgfVxuXG4gIGZldGNoPFRSb3c+KGZpZWxkOiBURmllbGQsIHJlc29sdmVkRGF0YTogVFJvd1tdLCBjYWxsYmFja3M6IExhenlGaWVsZENhbGxiYWNrcyk6IHZvaWQge1xuICAgIGlmICghZmllbGQubGF6eSkgcmV0dXJuO1xuICAgIGNvbnN0IGsgPSBmaWVsZC5rZXk7XG4gICAgaWYgKHRoaXMuX3N0YXR1cy5nZXQoaykgPT09ICdsb2FkaW5nJykgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJldiA9IHRoaXMuX2NhbmNlbHMuZ2V0KGspO1xuICAgIGlmIChwcmV2KSB7IHByZXYubmV4dCgpOyBwcmV2LmNvbXBsZXRlKCk7IH1cbiAgICBjb25zdCBjYW5jZWwkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICB0aGlzLl9jYW5jZWxzLnNldChrLCBjYW5jZWwkKTtcblxuICAgIGNvbnN0IG5ld1N0YXR1cyA9IG5ldyBNYXAodGhpcy5fc3RhdHVzKTtcbiAgICBuZXdTdGF0dXMuc2V0KGssICdsb2FkaW5nJyk7XG4gICAgdGhpcy5fc3RhdHVzID0gbmV3U3RhdHVzO1xuICAgIGNhbGxiYWNrcy5vblJlZnJlc2goKTtcblxuICAgIGZpZWxkLmxhenkuZmV0Y2hGbigpLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgdGFrZVVudGlsKGNhbmNlbCQpLFxuICAgICkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICh2YWx1ZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd01hcCA9IG5ldyBNYXA8YW55LCBhbnk+KCk7XG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSwgaSkgPT4ge1xuICAgICAgICAgIGlmIChpIDwgcmVzb2x2ZWREYXRhLmxlbmd0aCkgcm93TWFwLnNldChyZXNvbHZlZERhdGFbaV0sIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgTWFwKHRoaXMuX2RhdGEpO1xuICAgICAgICBuZXdEYXRhLnNldChrLCByb3dNYXApO1xuICAgICAgICB0aGlzLl9kYXRhID0gbmV3RGF0YTtcblxuICAgICAgICBjb25zdCBuZXdTdGF0dXMyID0gbmV3IE1hcCh0aGlzLl9zdGF0dXMpO1xuICAgICAgICBuZXdTdGF0dXMyLnNldChrLCAnbG9hZGVkJyk7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IG5ld1N0YXR1czI7XG5cbiAgICAgICAgY2FsbGJhY2tzLm9uUmVmcmVzaCgpO1xuICAgICAgICBjYWxsYmFja3Mub25NYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdTdGF0dXNFcnIgPSBuZXcgTWFwKHRoaXMuX3N0YXR1cyk7XG4gICAgICAgIG5ld1N0YXR1c0Vyci5zZXQoaywgJ2Vycm9yJyk7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IG5ld1N0YXR1c0VycjtcblxuICAgICAgICBjYWxsYmFja3Mub25SZWZyZXNoKCk7XG4gICAgICAgIGNhbGxiYWNrcy5vbk1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ export * from './organizer-config.interface';
2
+ export * from './organizer-menu.model';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXIvc3JjL2xpYi9tb2RlbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9vcmdhbml6ZXItY29uZmlnLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL29yZ2FuaXplci1tZW51Lm1vZGVsJztcbiJdfQ==