@oneteme/jquery-organizer 0.0.5 → 0.0.7
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 +49 -2
- package/esm2022/lib/group-by-manager/group-by-manager.mjs +3 -1
- package/esm2022/lib/models/organizer-chart-adapter.mjs +1 -17
- package/esm2022/lib/models/organizer-chart-config.mjs +2 -1
- package/esm2022/lib/models/organizer-config.interface.mjs +1 -1
- package/esm2022/lib/models/organizer-utils.mjs +4 -1
- package/esm2022/lib/organizer-button/organizer-button.component.mjs +58 -28
- package/esm2022/lib/organizer-facade/organizer-facade.mjs +31 -21
- package/esm2022/lib/organizer-facade/organizer-facade.types.mjs +1 -1
- package/esm2022/lib/slice-panel/slice-panel.component.mjs +68 -52
- package/esm2022/lib/slice-panel/slice-panel.model.mjs +1 -1
- package/esm2022/public-api.mjs +2 -2
- package/fesm2022/oneteme-jquery-organizer.mjs +162 -206
- package/fesm2022/oneteme-jquery-organizer.mjs.map +1 -1
- package/lib/models/organizer-chart-config.d.ts +3 -1
- package/lib/models/organizer-config.interface.d.ts +10 -1
- package/lib/models/organizer-utils.d.ts +5 -3
- package/lib/organizer-button/organizer-button.component.d.ts +9 -3
- package/lib/organizer-facade/organizer-facade.d.ts +8 -3
- package/lib/organizer-facade/organizer-facade.types.d.ts +2 -2
- package/lib/slice-panel/slice-panel.component.d.ts +7 -2
- package/lib/slice-panel/slice-panel.model.d.ts +4 -4
- package/package.json +2 -2
- package/public-api.d.ts +1 -1
- package/esm2022/lib/lazy-field-manager/lazy-field-manager.mjs +0 -91
- package/lib/lazy-field-manager/lazy-field-manager.d.ts +0 -25
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { OrganizerTemplate } from './organizer-config.interface';
|
|
1
2
|
import { OrganizerChartItem, OrganizerChartSection } from './organizer-chart-adapter';
|
|
2
3
|
export interface OrganizerChartConfig {
|
|
3
4
|
groups?: OrganizerChartSection;
|
|
4
5
|
indicators?: OrganizerChartSection;
|
|
5
6
|
filters?: OrganizerChartSection;
|
|
6
|
-
templates?:
|
|
7
|
+
templates?: OrganizerTemplate[];
|
|
7
8
|
}
|
|
8
9
|
export declare enum SyntheticItemKeys {
|
|
9
10
|
EMPTY = "__empty__",
|
|
@@ -24,6 +25,7 @@ export declare enum OrganizerButtonEventType {
|
|
|
24
25
|
GROUP_BY_SELECTED = "groupBySelected",
|
|
25
26
|
TEMPLATE_SELECTED = "templateSelected",
|
|
26
27
|
SLICE_SELECTED = "sliceSelected",
|
|
28
|
+
CHART_TYPE_SELECTED = "chartTypeSelected",
|
|
27
29
|
VIEW_SWITCHED = "viewSwitched"
|
|
28
30
|
}
|
|
29
31
|
export declare function getGroupItems(config: OrganizerChartConfig | null | undefined): OrganizerChartItem[];
|
|
@@ -34,9 +34,16 @@ export interface OrganizerViewSlice {
|
|
|
34
34
|
label: string;
|
|
35
35
|
icon?: string;
|
|
36
36
|
}
|
|
37
|
+
export interface OrganizerChartType {
|
|
38
|
+
id: string;
|
|
39
|
+
label: string;
|
|
40
|
+
icon?: string;
|
|
41
|
+
disabled?: boolean;
|
|
42
|
+
}
|
|
37
43
|
export interface OrganizerTemplate {
|
|
38
44
|
id: string;
|
|
39
45
|
label: string;
|
|
46
|
+
description?: string;
|
|
40
47
|
icon?: string;
|
|
41
48
|
xField?: string;
|
|
42
49
|
yField?: string;
|
|
@@ -61,6 +68,7 @@ export interface OrganizerConfig {
|
|
|
61
68
|
groups?: OrganizerViewGroup[];
|
|
62
69
|
slices?: OrganizerViewSlice[];
|
|
63
70
|
templates?: OrganizerTemplate[];
|
|
71
|
+
chartTypes?: OrganizerChartType[];
|
|
64
72
|
onFetchFieldData?: (fieldId: string) => Promise<string[] | Record<string, any>[]>;
|
|
65
73
|
onFetchSliceData?: (filterKey: string) => Observable<any[]> | Promise<any[]>;
|
|
66
74
|
onSliceClick?: () => void;
|
|
@@ -98,6 +106,7 @@ export interface OrganizerSliceState {
|
|
|
98
106
|
export interface OrganizerState {
|
|
99
107
|
viewMode?: 'chart' | 'table';
|
|
100
108
|
visibleFields?: string[];
|
|
109
|
+
selectedChartType?: string;
|
|
101
110
|
selectedX?: string;
|
|
102
111
|
selectedY?: string;
|
|
103
112
|
selectedYAggregate?: string;
|
|
@@ -106,7 +115,7 @@ export interface OrganizerState {
|
|
|
106
115
|
selectedTemplate?: string;
|
|
107
116
|
}
|
|
108
117
|
export interface OrganizerButtonEvent {
|
|
109
|
-
type: 'fieldToggled' | 'xSelected' | 'ySelected' | 'groupBySelected' | 'templateSelected' | 'sliceSelected' | 'reset' | 'viewSwitched';
|
|
118
|
+
type: 'fieldToggled' | 'xSelected' | 'ySelected' | 'groupBySelected' | 'templateSelected' | 'sliceSelected' | 'chartTypeSelected' | 'reset' | 'viewSwitched';
|
|
110
119
|
state: OrganizerState;
|
|
111
120
|
source?: 'user' | 'api';
|
|
112
121
|
resolvedYUnit?: string | UnitConfig;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { OrganizerConfig, OrganizerState, OrganizerTemplate, OrganizerYField } from './organizer-config.interface';
|
|
2
|
+
type OrganizerStateConfig = Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates' | 'chartTypes'>;
|
|
2
3
|
export interface OrganizerYIndicator {
|
|
3
4
|
id: string;
|
|
4
5
|
label: string;
|
|
@@ -6,6 +7,7 @@ export interface OrganizerYIndicator {
|
|
|
6
7
|
}
|
|
7
8
|
export declare function buildYFields(indicators: OrganizerYIndicator[]): OrganizerYField[];
|
|
8
9
|
export declare function resolveYKey(selectedY: string | undefined, selectedYAggregate: string | undefined): string | undefined;
|
|
9
|
-
export declare function normalizeOrganizerState(state: OrganizerState | undefined, config:
|
|
10
|
-
export declare function normalizeTemplateToState(template: OrganizerTemplate, currentState: OrganizerState | undefined, config:
|
|
11
|
-
export declare function resolveMatchingTemplateId(templates: OrganizerTemplate[] | undefined, state: OrganizerState | undefined, config:
|
|
10
|
+
export declare function normalizeOrganizerState(state: OrganizerState | undefined, config: OrganizerStateConfig): OrganizerState;
|
|
11
|
+
export declare function normalizeTemplateToState(template: OrganizerTemplate, currentState: OrganizerState | undefined, config: OrganizerStateConfig): OrganizerState;
|
|
12
|
+
export declare function resolveMatchingTemplateId(templates: OrganizerTemplate[] | undefined, state: OrganizerState | undefined, config: OrganizerStateConfig): string | undefined;
|
|
13
|
+
export {};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { EventEmitter,
|
|
1
|
+
import { EventEmitter, ChangeDetectorRef, OnDestroy } from '@angular/core';
|
|
2
2
|
import { MatMenuTrigger } from '@angular/material/menu';
|
|
3
3
|
import { OrganizerConfig, OrganizerButtonEvent, OrganizerSliceState, OrganizerState } from '../models';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
|
-
export declare class OrganizerButtonComponent implements
|
|
5
|
+
export declare class OrganizerButtonComponent implements OnDestroy {
|
|
6
6
|
private cdr;
|
|
7
7
|
config: OrganizerConfig;
|
|
8
8
|
state?: OrganizerState;
|
|
@@ -12,9 +12,11 @@ export declare class OrganizerButtonComponent implements OnInit, OnDestroy {
|
|
|
12
12
|
loadingFieldId?: string;
|
|
13
13
|
private fieldDataCache;
|
|
14
14
|
private destroy$;
|
|
15
|
+
private destroyed;
|
|
16
|
+
private sliceRequestId;
|
|
17
|
+
private sliceSubscription?;
|
|
15
18
|
mainMenuTrigger?: MatMenuTrigger;
|
|
16
19
|
constructor(cdr: ChangeDetectorRef);
|
|
17
|
-
ngOnInit(): void;
|
|
18
20
|
ngOnDestroy(): void;
|
|
19
21
|
isFieldVisible(fieldId: string): boolean;
|
|
20
22
|
fieldsSummary(): string;
|
|
@@ -23,6 +25,7 @@ export declare class OrganizerButtonComponent implements OnInit, OnDestroy {
|
|
|
23
25
|
onYFieldSelect(fieldId: string): void;
|
|
24
26
|
onYAggregateSelect(yFieldId: string, aggregateId: string): void;
|
|
25
27
|
onGroupBySelect(groupId: string): void;
|
|
28
|
+
onChartTypeSelect(chartType: string): void;
|
|
26
29
|
onTemplateSelect(templateId: string): void;
|
|
27
30
|
onSliceClick(sliceId?: string): void;
|
|
28
31
|
private syncSliceState;
|
|
@@ -48,12 +51,15 @@ export declare class OrganizerButtonComponent implements OnInit, OnDestroy {
|
|
|
48
51
|
activeXLabel(): string;
|
|
49
52
|
activeYLabel(): string;
|
|
50
53
|
activeGroupByLabel(): string;
|
|
54
|
+
activeChartTypeLabel(): string;
|
|
51
55
|
activeSlicesLabel(): string;
|
|
52
56
|
activeTemplateLabel(): string;
|
|
53
57
|
hasChartFields(): boolean;
|
|
58
|
+
hasChartTypes(): boolean;
|
|
54
59
|
hasTableFields(): boolean;
|
|
55
60
|
isYActive(yFieldId: string): boolean;
|
|
56
61
|
isYAggregateActive(yFieldId: string, aggregateId: string): boolean;
|
|
62
|
+
isChartTypeActive(chartType: string): boolean;
|
|
57
63
|
private emitChange;
|
|
58
64
|
static ɵfac: i0.ɵɵFactoryDeclaration<OrganizerButtonComponent, never>;
|
|
59
65
|
static ɵcmp: i0.ɵɵComponentDeclaration<OrganizerButtonComponent, "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>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ChartOrganizerEvent, ChartOrganizerState } from '@oneteme/jquery-core';
|
|
2
2
|
import { OrganizerFieldDef, OrganizerFieldsState, OrganizerGroupByState, OrganizerPanelConfig, OrganizerSliceByState } from './organizer-facade.types';
|
|
3
3
|
export declare function humanizeKey(key: string): string;
|
|
4
4
|
export declare class OrganizerFacade<TField extends OrganizerFieldDef = OrganizerFieldDef> {
|
|
@@ -8,7 +8,7 @@ export declare class OrganizerFacade<TField extends OrganizerFieldDef = Organize
|
|
|
8
8
|
private _panelConfig;
|
|
9
9
|
private _hiddenStaticKeys;
|
|
10
10
|
private readonly _events$;
|
|
11
|
-
readonly events$: import("rxjs").Observable<
|
|
11
|
+
readonly events$: import("rxjs").Observable<ChartOrganizerEvent>;
|
|
12
12
|
get enabled(): boolean;
|
|
13
13
|
get showFields(): boolean;
|
|
14
14
|
get showGroupBySection(): boolean;
|
|
@@ -41,10 +41,15 @@ export declare class OrganizerFacade<TField extends OrganizerFieldDef = Organize
|
|
|
41
41
|
setGroupBy(key: string | null): void;
|
|
42
42
|
onDynamicSliceKeysChange(keys: string[]): void;
|
|
43
43
|
isDynamicSliceActive(key: string): boolean;
|
|
44
|
-
toOrganizerState():
|
|
44
|
+
toOrganizerState(): ChartOrganizerState;
|
|
45
45
|
destroy(): void;
|
|
46
46
|
updateHiddenStaticKeys(keys: Set<string>): void;
|
|
47
47
|
private _refreshDefaultFields;
|
|
48
|
+
/** Première définition de chaque clé dans la config courante. */
|
|
49
|
+
private _definitionsByKey;
|
|
50
|
+
private _staticSliceKeys;
|
|
51
|
+
/** Champs proposables en slice dynamique, hors slices statiques et slices déjà actifs. */
|
|
52
|
+
private _availableForDynamic;
|
|
48
53
|
private _refreshDynamicSliceMeta;
|
|
49
54
|
private _computeSliceLabel;
|
|
50
55
|
private _uniqueByKey;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SliceConfig } from '../slice-panel/slice-panel.model';
|
|
2
|
-
import {
|
|
2
|
+
import { ChartOrganizerConfig } from '@oneteme/jquery-core';
|
|
3
3
|
export interface OrganizerFieldDef {
|
|
4
4
|
key: string;
|
|
5
5
|
header?: string;
|
|
@@ -9,7 +9,7 @@ export interface OrganizerFieldDef {
|
|
|
9
9
|
sliceable?: boolean;
|
|
10
10
|
}
|
|
11
11
|
export interface OrganizerPanelConfig<TField extends OrganizerFieldDef = OrganizerFieldDef> {
|
|
12
|
-
config?:
|
|
12
|
+
config?: ChartOrganizerConfig;
|
|
13
13
|
fields: TField[];
|
|
14
14
|
sliceConfigs: SliceConfig<any>[];
|
|
15
15
|
noneLabel?: string;
|
|
@@ -6,7 +6,6 @@ export declare class SlicePanelComponent<T = any> implements OnChanges, OnInit {
|
|
|
6
6
|
sliceConfigs: SliceConfig<T>[];
|
|
7
7
|
columns: SliceColumnDef<T>[];
|
|
8
8
|
data: T[];
|
|
9
|
-
lazyData: Map<string, Map<any, any>>;
|
|
10
9
|
lazyStatus: Map<string, 'idle' | 'loading' | 'loaded' | 'error'>;
|
|
11
10
|
showToggle: boolean;
|
|
12
11
|
showCounts: boolean;
|
|
@@ -39,6 +38,7 @@ export declare class SlicePanelComponent<T = any> implements OnChanges, OnInit {
|
|
|
39
38
|
readonly trackByCategoryKey: (_: number, cat: any) => string;
|
|
40
39
|
ngOnInit(): void;
|
|
41
40
|
ngOnChanges(changes: SimpleChanges): void;
|
|
41
|
+
private _hasActiveFilters;
|
|
42
42
|
get showPanel(): boolean;
|
|
43
43
|
get slices(): SliceConfig<T>[];
|
|
44
44
|
get staticSliceCount(): number;
|
|
@@ -71,12 +71,17 @@ export declare class SlicePanelComponent<T = any> implements OnChanges, OnInit {
|
|
|
71
71
|
private _getPersistentSliceKey;
|
|
72
72
|
private _getSliceIdentity;
|
|
73
73
|
private _materializeSlice;
|
|
74
|
+
private _buildCategories;
|
|
74
75
|
private _buildCategoryFromValue;
|
|
76
|
+
/** Valeurs distinctes (triées, « vide » en dernier) et effectifs, calculés en un seul passage. */
|
|
75
77
|
private _computeDistinctValues;
|
|
78
|
+
private _columnsRef?;
|
|
79
|
+
private _columnIndex;
|
|
80
|
+
private _column;
|
|
76
81
|
private _getLazyAwareValue;
|
|
77
82
|
private _rebuildCache;
|
|
78
83
|
private _refreshDynamicSlices;
|
|
79
84
|
private _scrollSliceTitleIntoView;
|
|
80
85
|
static ɵfac: i0.ɵɵFactoryDeclaration<SlicePanelComponent<any>, never>;
|
|
81
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<SlicePanelComponent<any>, "slice-panel", never, { "sliceConfigs": { "alias": "sliceConfigs"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "data": { "alias": "data"; "required": false; }; "
|
|
86
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SlicePanelComponent<any>, "slice-panel", never, { "sliceConfigs": { "alias": "sliceConfigs"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "data": { "alias": "data"; "required": false; }; "lazyStatus": { "alias": "lazyStatus"; "required": false; }; "showToggle": { "alias": "showToggle"; "required": false; }; "showCounts": { "alias": "showCounts"; "required": false; }; "collapsedByDefault": { "alias": "collapsedByDefault"; "required": false; }; "alwaysShow": { "alias": "alwaysShow"; "required": false; }; }, { "filterChange": "filterChange"; "activeKeysChange": "activeKeysChange"; "dynamicSliceKeysChange": "dynamicSliceKeysChange"; "collapsedChange": "collapsedChange"; }, never, never, true, never>;
|
|
82
87
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { DataProvider } from '@oneteme/jquery-core';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
2
|
export interface SliceCategory<T = any> {
|
|
4
3
|
key: string;
|
|
5
4
|
label: string;
|
|
6
5
|
filter?: (row: T) => boolean;
|
|
6
|
+
/** Effectif précalculé (rempli par le panneau pour les catégories dérivées d'une colonne). */
|
|
7
|
+
count?: number;
|
|
7
8
|
}
|
|
8
9
|
export interface SliceConfig<T = any> {
|
|
9
10
|
title?: string;
|
|
@@ -19,7 +20,6 @@ export interface SliceColumnDef<T = any> {
|
|
|
19
20
|
header?: string;
|
|
20
21
|
icon?: string;
|
|
21
22
|
value?: DataProvider<any>;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
23
|
+
/** Colonne absente de la requête de base : ses valeurs sont dans les lignes une fois chargée (`lazyStatus`). */
|
|
24
|
+
lazy?: true;
|
|
25
25
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oneteme/jquery-organizer",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "Independent Organizer Button component library - decentralized organizer management for charts, tables",
|
|
5
5
|
"homepage": "https://github.com/oneteme/jquery-charts",
|
|
6
6
|
"bugs": "https://github.com/oneteme/jquery-charts/issues",
|
|
@@ -13,7 +13,7 @@
|
|
|
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.38"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"tslib": "^2.3.0"
|
package/public-api.d.ts
CHANGED
|
@@ -4,9 +4,9 @@ export * from './lib/slice-panel/slice-panel.component';
|
|
|
4
4
|
export * from './lib/slice-panel/slice-panel.model';
|
|
5
5
|
export * from './lib/models/organizer-config.interface';
|
|
6
6
|
export * from './lib/models/organizer-menu.model';
|
|
7
|
+
export { OrganizerButtonEventType } from './lib/models/organizer-chart-config';
|
|
7
8
|
export { buildYFields, resolveYKey, OrganizerYIndicator } from './lib/models/organizer-utils';
|
|
8
9
|
export { buildOrganizerChartBinding, chartConfigToOrganizer, chartConfigToState, chartConfigToUnifiedState, applyOrganizerEventToChart, handleOrganizerChartEvent, resolveYUnit, OrganizerChartItem, OrganizerChartSection, OrganizerChartConfig, OrganizerChartBridgeOptions, OrganizerChartBinding, OrganizerChartEventResult, } from './lib/models/organizer-chart-adapter';
|
|
9
10
|
export { OrganizerFacade, humanizeKey } from './lib/organizer-facade/organizer-facade';
|
|
10
11
|
export { OrganizerFieldDef, OrganizerPanelConfig, OrganizerFieldsState, OrganizerGroupByState, OrganizerSliceByState, } from './lib/organizer-facade/organizer-facade.types';
|
|
11
12
|
export { GroupByManager } from './lib/group-by-manager/group-by-manager';
|
|
12
|
-
export { LazyFieldManager, LazyFieldDef, LazyFieldCallbacks, LAZY_FIELD_LOADING_VALUE, LAZY_FIELD_ERROR_VALUE, } from './lib/lazy-field-manager/lazy-field-manager';
|
|
@@ -1,91 +0,0 @@
|
|
|
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
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
export interface LazyFieldDef {
|
|
3
|
-
key: string;
|
|
4
|
-
lazy?: {
|
|
5
|
-
fetchFn: () => Observable<any[]>;
|
|
6
|
-
};
|
|
7
|
-
}
|
|
8
|
-
export interface LazyFieldCallbacks {
|
|
9
|
-
onRefresh(): void;
|
|
10
|
-
onMarkForCheck(): void;
|
|
11
|
-
}
|
|
12
|
-
export declare const LAZY_FIELD_LOADING_VALUE = "__lazy_loading__";
|
|
13
|
-
export declare const LAZY_FIELD_ERROR_VALUE = "__lazy_error__";
|
|
14
|
-
export declare class LazyFieldManager<TField extends LazyFieldDef = LazyFieldDef> {
|
|
15
|
-
private _status;
|
|
16
|
-
private _data;
|
|
17
|
-
private _cancels;
|
|
18
|
-
get status(): Map<string, 'idle' | 'loading' | 'loaded' | 'error'>;
|
|
19
|
-
get data(): Map<string, Map<any, any>>;
|
|
20
|
-
getStatus(key: string): 'idle' | 'loading' | 'loaded' | 'error';
|
|
21
|
-
getRenderType(rowValue: any): 'loading' | 'error' | 'value';
|
|
22
|
-
cancelAll(): void;
|
|
23
|
-
retry<TRow>(field: TField, resolvedData: TRow[], callbacks: LazyFieldCallbacks): void;
|
|
24
|
-
fetch<TRow>(field: TField, resolvedData: TRow[], callbacks: LazyFieldCallbacks): void;
|
|
25
|
-
}
|