@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.
- package/README.md +441 -0
- package/esm2022/lib/group-by-manager/group-by-manager.mjs +73 -0
- package/esm2022/lib/lazy-field-manager/lazy-field-manager.mjs +91 -0
- package/esm2022/lib/models/index.mjs +3 -0
- package/esm2022/lib/models/organizer-chart-adapter.mjs +164 -0
- package/esm2022/lib/models/organizer-config.interface.mjs +2 -0
- package/esm2022/lib/models/organizer-menu.model.mjs +17 -0
- package/esm2022/lib/models/organizer-utils.mjs +26 -0
- package/esm2022/lib/organizer-button/organizer-button.component.mjs +266 -0
- package/esm2022/lib/organizer-button/organizer-button.module.mjs +17 -0
- package/esm2022/lib/organizer-facade/organizer-facade.mjs +269 -0
- package/esm2022/lib/organizer-facade/organizer-facade.types.mjs +2 -0
- package/esm2022/lib/slice-panel/slice-panel.component.mjs +452 -0
- package/esm2022/lib/slice-panel/slice-panel.model.mjs +2 -0
- package/esm2022/oneteme-jquery-organizer.mjs +5 -0
- package/esm2022/public-api.mjs +12 -0
- package/fesm2022/oneteme-jquery-organizer.mjs +1369 -0
- package/fesm2022/oneteme-jquery-organizer.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/group-by-manager/group-by-manager.d.ts +20 -0
- package/lib/lazy-field-manager/lazy-field-manager.d.ts +25 -0
- package/lib/models/index.d.ts +2 -0
- package/lib/models/organizer-chart-adapter.d.ts +44 -0
- package/lib/models/organizer-config.interface.d.ts +103 -0
- package/lib/models/organizer-menu.model.d.ts +7 -0
- package/lib/models/organizer-utils.d.ts +8 -0
- package/lib/organizer-button/organizer-button.component.d.ts +51 -0
- package/lib/organizer-button/organizer-button.module.d.ts +8 -0
- package/lib/organizer-facade/organizer-facade.d.ts +51 -0
- package/lib/organizer-facade/organizer-facade.types.d.ts +31 -0
- package/lib/slice-panel/slice-panel.component.d.ts +80 -0
- package/lib/slice-panel/slice-panel.model.d.ts +25 -0
- package/package.json +35 -0
- 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==
|