@genesislcap/foundation-workspace 15.72.0 → 15.73.0-FUI-2628.4
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/dist/custom-elements.json +407 -57
- package/dist/dts/workspace/filter-registry.d.ts +12 -0
- package/dist/dts/workspace/filter-registry.d.ts.map +1 -1
- package/dist/dts/workspace/grid-register/grid-register.d.ts +3 -10
- package/dist/dts/workspace/grid-register/grid-register.d.ts.map +1 -1
- package/dist/dts/workspace/grid-registry.d.ts +76 -4
- package/dist/dts/workspace/grid-registry.d.ts.map +1 -1
- package/dist/dts/workspace/layout-registry.d.ts +38 -2
- package/dist/dts/workspace/layout-registry.d.ts.map +1 -1
- package/dist/dts/workspace/workspace.types.d.ts +6 -0
- package/dist/dts/workspace/workspace.types.d.ts.map +1 -1
- package/dist/dts/workspace-manager/workspace-manager.d.ts +6 -0
- package/dist/dts/workspace-manager/workspace-manager.d.ts.map +1 -1
- package/dist/esm/workspace/filter-registry.js +32 -21
- package/dist/esm/workspace/grid-register/grid-register.js +7 -54
- package/dist/esm/workspace/grid-registry.js +329 -32
- package/dist/esm/workspace/layout-registry.js +60 -8
- package/dist/esm/workspace-manager/workspace-manager.js +10 -9
- package/dist/foundation-workspace.api.json +473 -39
- package/dist/foundation-workspace.d.ts +142 -15
- package/package.json +14 -14
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import type { ColumnApi, GridApi } from '@ag-grid-community/core';
|
|
2
2
|
import type { SavedGridSettings } from './workspace.types';
|
|
3
|
+
/**
|
|
4
|
+
* The part of a grid element that persists its own filter model, e.g. grid-pro's
|
|
5
|
+
* `setFilterModel` (backed by `persist-filter-model-key`, or an in-memory cache without one).
|
|
6
|
+
* @alpha
|
|
7
|
+
*/
|
|
8
|
+
export interface GridFilterPersistence {
|
|
9
|
+
setFilterModel(filterModel: Record<string, unknown>): unknown;
|
|
10
|
+
}
|
|
3
11
|
/**
|
|
4
12
|
* @alpha
|
|
5
13
|
*/
|
|
@@ -7,12 +15,14 @@ export interface GridRegistration {
|
|
|
7
15
|
gridKey: string;
|
|
8
16
|
gridApi: GridApi;
|
|
9
17
|
columnApi: ColumnApi;
|
|
18
|
+
/** The grid element's own filter persistence, when the grid has one (grid-pro does). */
|
|
19
|
+
filterPersistence?: GridFilterPersistence;
|
|
10
20
|
}
|
|
11
21
|
/**
|
|
12
22
|
* @alpha
|
|
13
23
|
*/
|
|
14
24
|
export interface GridRegistry {
|
|
15
|
-
registerGrid(gridKey: string, gridApi: unknown, columnApi: unknown): void;
|
|
25
|
+
registerGrid(gridKey: string, gridApi: unknown, columnApi: unknown, filterPersistence?: GridFilterPersistence): void;
|
|
16
26
|
getGrid(gridKey: string): GridRegistration | null;
|
|
17
27
|
unregisterGrid(gridKey: string): void;
|
|
18
28
|
getAllGridsSettings(): SavedGridSettings[];
|
|
@@ -23,12 +33,50 @@ export interface GridRegistry {
|
|
|
23
33
|
applyAllGridsSettings(gridsSettings: SavedGridSettings[]): Promise<void>;
|
|
24
34
|
}
|
|
25
35
|
/**
|
|
36
|
+
* Default grid registry implementation.
|
|
37
|
+
*
|
|
38
|
+
* @remarks
|
|
39
|
+
* Keeps a store of every grid's last known column state and filter model by key, so a workspace
|
|
40
|
+
* covers grids that aren't currently mounted (e.g. on another route):
|
|
41
|
+
* - `unregisterGrid` stores the grid's last state; `registerGrid` applies any stored state.
|
|
42
|
+
* - `applyAllGridsSettings` (workspace load) replaces the store with the loaded settings and
|
|
43
|
+
* applies them to mounted grids; unmounted ones pick theirs up when they register.
|
|
44
|
+
* - `getAllGridsSettings` (workspace save) returns the store with mounted grids' live state on
|
|
45
|
+
* top, so a grid the user never visited keeps its loaded state rather than being dropped.
|
|
46
|
+
*
|
|
47
|
+
* Filters race with the grid's own start-up. grid-pro restores its persisted filter model
|
|
48
|
+
* (`persist-filter-model-key`) asynchronously, up to three times — at grid ready, once
|
|
49
|
+
* datasource-driven columns exist, and on the datasource's `filtersRestored` — and a restore with
|
|
50
|
+
* nothing stored applies `{}`, clearing every filter. A filter for a column that doesn't exist yet
|
|
51
|
+
* is dropped. So when the registry applies a filter model it:
|
|
52
|
+
* 1. writes it into the grid's own filter persistence first (`filterPersistence`), so grid-pro's
|
|
53
|
+
* later restores, including a datasource re-init long after start-up, return the workspace's
|
|
54
|
+
* model rather than an older one;
|
|
55
|
+
* 2. arms a guard that re-applies it if a programmatic filter change (e.g. a restore that read
|
|
56
|
+
* storage before step 1 landed, as KV storage can) replaces it, and when the grid's columns
|
|
57
|
+
* change (so filters on columns that arrive late apply). The guard ends as soon as the user
|
|
58
|
+
* changes a filter, once the grid has been quiet for `filterSettleMs` after its last start-up
|
|
59
|
+
* event, and in any case after `filterGuardMaxMs`, so it never fights app code for long. It
|
|
60
|
+
* re-applies at most `maxFilterReapplies` times per arming, so it cannot loop.
|
|
61
|
+
*
|
|
62
|
+
* A saved entry without `filterModel` (a workspace saved before filters were captured) leaves the
|
|
63
|
+
* grid's filters alone.
|
|
26
64
|
* @alpha
|
|
27
65
|
*/
|
|
28
66
|
export declare class DefaultGridRegistry implements GridRegistry {
|
|
67
|
+
/** Quiet period after the last start-up event before the filter guard ends. */
|
|
68
|
+
filterSettleMs: number;
|
|
69
|
+
/** Longest the filter guard runs after it is armed, however often it is re-armed. */
|
|
70
|
+
filterGuardMaxMs: number;
|
|
71
|
+
/** Most re-applies the filter guard makes per arming. */
|
|
72
|
+
maxFilterReapplies: number;
|
|
29
73
|
private grids;
|
|
30
|
-
private
|
|
31
|
-
|
|
74
|
+
private stored;
|
|
75
|
+
private listeners;
|
|
76
|
+
private guards;
|
|
77
|
+
registerGrid(gridKey: string, gridApi: unknown, columnApi: unknown, filterPersistence?: GridFilterPersistence): void;
|
|
78
|
+
/** Applies the stored settings for a grid, unless it already has exactly that state. */
|
|
79
|
+
private applyStoredSettings;
|
|
32
80
|
getGrid(gridKey: string): GridRegistration | null;
|
|
33
81
|
unregisterGrid(gridKey: string): void;
|
|
34
82
|
getAllGridsSettings(): SavedGridSettings[];
|
|
@@ -36,7 +84,31 @@ export declare class DefaultGridRegistry implements GridRegistry {
|
|
|
36
84
|
applyColumns?: boolean;
|
|
37
85
|
applyFilters?: boolean;
|
|
38
86
|
}): Promise<boolean>;
|
|
39
|
-
applyAllGridsSettings(gridsSettings: SavedGridSettings[]
|
|
87
|
+
applyAllGridsSettings(gridsSettings: SavedGridSettings[]): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Writes a filter model into the grid's own persistence, then onto the grid, and records what
|
|
90
|
+
* the grid reports back so the guard can tell a later replacement from AG Grid's normalisation.
|
|
91
|
+
*/
|
|
92
|
+
private applyFilterModel;
|
|
93
|
+
private reapplyStoredFilter;
|
|
94
|
+
/**
|
|
95
|
+
* Whether the grid's filter model moved away from what the registry last applied — a stale
|
|
96
|
+
* restore or other programmatic change, rather than AG Grid normalising the applied model (which
|
|
97
|
+
* reads back the same each time).
|
|
98
|
+
*/
|
|
99
|
+
private filterWasReplaced;
|
|
100
|
+
private armFilterGuard;
|
|
101
|
+
/** Restarts the settle timer: the grid just did something that can precede a stale restore. */
|
|
102
|
+
private touchFilterGuard;
|
|
103
|
+
private guardActive;
|
|
104
|
+
private endFilterGuard;
|
|
105
|
+
private addListener;
|
|
106
|
+
private removeListener;
|
|
107
|
+
/** Removes a registration's grid listeners and stops its filter guard. */
|
|
108
|
+
private detach;
|
|
109
|
+
/** Whether the grid already has exactly these settings, so re-applying them is a no-op. */
|
|
110
|
+
private hasSettings;
|
|
111
|
+
private readFilterModel;
|
|
40
112
|
private getGridSettings;
|
|
41
113
|
}
|
|
42
114
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid-registry.d.ts","sourceRoot":"","sources":["../../../src/workspace/grid-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"grid-registry.d.ts","sourceRoot":"","sources":["../../../src/workspace/grid-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,23 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { SerialisedLayout } from '@genesislcap/foundation-layout';
|
|
2
2
|
import type { SavedLayout } from './workspace.types';
|
|
3
|
+
/**
|
|
4
|
+
* What the layout registry needs from a registered layout. `rapid-layout` (`FoundationLayout`)
|
|
5
|
+
* satisfies it as-is; adapters make other layout libraries saveable, e.g.
|
|
6
|
+
* `useWorkspaceFlexLayout` in `@genesislcap/foundation-react-utils/workspace` for flexlayout-react.
|
|
7
|
+
* @alpha
|
|
8
|
+
*/
|
|
9
|
+
export interface WorkspaceLayout {
|
|
10
|
+
/** Whether the layout has finished its first load; its config is only read after that. */
|
|
11
|
+
hasFirstLoaded: boolean;
|
|
12
|
+
/** Returns the layout's current config (serialisable JSON) for a workspace to save. */
|
|
13
|
+
getLayout(): SerialisedLayout;
|
|
14
|
+
/** Replaces the layout with a saved config. */
|
|
15
|
+
loadLayout(layout: SerialisedLayout, handleMissingItem?: 'placeholder' | 'error', disableCache?: boolean): void;
|
|
16
|
+
/** Used to wait for `first-loaded` when `hasFirstLoaded` is still false. */
|
|
17
|
+
addEventListener(type: string, listener: () => void, options?: {
|
|
18
|
+
once?: boolean;
|
|
19
|
+
}): void;
|
|
20
|
+
}
|
|
3
21
|
/**
|
|
4
22
|
* @alpha
|
|
5
23
|
*/
|
|
@@ -11,14 +29,32 @@ export interface LayoutRegistry {
|
|
|
11
29
|
}
|
|
12
30
|
/**
|
|
13
31
|
* Default layout registry implementation.
|
|
32
|
+
*
|
|
33
|
+
* @remarks
|
|
34
|
+
* Keeps a store of every layout's last known config by key, so a workspace covers layouts that
|
|
35
|
+
* aren't currently mounted (e.g. on another route):
|
|
36
|
+
* - `unregisterLayout` stores the layout's last config; `registerLayout` loads any stored config
|
|
37
|
+
* once the layout has finished its first load (so its declared or autosaved layout doesn't
|
|
38
|
+
* overwrite it).
|
|
39
|
+
* - `applySavedLayouts` (workspace load) replaces the store with the loaded configs and loads them
|
|
40
|
+
* into mounted layouts; unmounted ones pick theirs up when they register.
|
|
41
|
+
* - `getLayoutsConfigs` (workspace save) returns the store with mounted layouts' live configs on
|
|
42
|
+
* top, so a layout the user never visited keeps its loaded config rather than being dropped.
|
|
14
43
|
* @alpha
|
|
15
44
|
*/
|
|
16
45
|
export declare class DefaultLayoutRegistry implements LayoutRegistry {
|
|
17
46
|
private layouts;
|
|
18
|
-
|
|
47
|
+
private stored;
|
|
48
|
+
registerLayout(layoutKey: string, layout: WorkspaceLayout): void;
|
|
19
49
|
unregisterLayout(layoutKey: string): void;
|
|
20
50
|
getLayoutsConfigs(): SavedLayout[];
|
|
21
51
|
applySavedLayouts(savedLayouts: SavedLayout[]): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* A layout's config is only meaningful once it has finished its first load; before that it has
|
|
54
|
+
* no panes yet, and storing that would wipe the saved config.
|
|
55
|
+
*/
|
|
56
|
+
private readLayout;
|
|
57
|
+
private whenFirstLoaded;
|
|
22
58
|
}
|
|
23
59
|
/**
|
|
24
60
|
* DI token for layout registry.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-registry.d.ts","sourceRoot":"","sources":["../../../src/workspace/layout-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"layout-registry.d.ts","sourceRoot":"","sources":["../../../src/workspace/layout-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,0FAA0F;IAC1F,cAAc,EAAE,OAAO,CAAC;IACxB,uFAAuF;IACvF,SAAS,IAAI,gBAAgB,CAAC;IAC9B,+CAA+C;IAC/C,UAAU,CACR,MAAM,EAAE,gBAAgB,EACxB,iBAAiB,CAAC,EAAE,aAAa,GAAG,OAAO,EAC3C,YAAY,CAAC,EAAE,OAAO,GACrB,IAAI,CAAC;IACR,4EAA4E;IAC5E,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC1F;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACzD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,iBAAiB,IAAI,WAAW,EAAE,CAAC;IACnC,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,MAAM,CAA4C;IAE1D,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAiBhE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASzC,iBAAiB,IAAI,WAAW,EAAE;IAU5B,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAanE;;;OAGG;IACH,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,eAAe;CAOxB;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,sEAE1B,CAAC"}
|
|
@@ -6,7 +6,13 @@ import type { SerialisedLayout } from '@genesislcap/foundation-layout';
|
|
|
6
6
|
*/
|
|
7
7
|
export interface SavedGridSettings {
|
|
8
8
|
gridKey: string;
|
|
9
|
+
/** AG Grid column state; includes sort (`sort`/`sortIndex`) as well as order, width, visibility. */
|
|
9
10
|
columnState: any[];
|
|
11
|
+
/**
|
|
12
|
+
* AG Grid filter model (`gridApi.getFilterModel()`); `{}` when no filters are set. Absent on
|
|
13
|
+
* workspaces saved before filters were captured, which then leave the grid's filters alone.
|
|
14
|
+
*/
|
|
15
|
+
filterModel?: Record<string, unknown>;
|
|
10
16
|
savedAt: string;
|
|
11
17
|
}
|
|
12
18
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.types.d.ts","sourceRoot":"","sources":["../../../src/workspace/workspace.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;CAC1B"}
|
|
1
|
+
{"version":3,"file":"workspace.types.d.ts","sourceRoot":"","sources":["../../../src/workspace/workspace.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;CAC1B"}
|
|
@@ -42,6 +42,12 @@ export declare class WorkspaceManager extends FoundationElement {
|
|
|
42
42
|
refreshSharedWorkspaces(): Promise<void>;
|
|
43
43
|
private notifyError;
|
|
44
44
|
saveWorkspace(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Seeds every registry's store with the workspace's entries (replacing whatever was stored,
|
|
47
|
+
* even when a list is empty) and applies them to what's mounted; unmounted grids, layouts and
|
|
48
|
+
* filters pick theirs up when they register. Grids and filters are seeded before layouts:
|
|
49
|
+
* loading a layout rebuilds its panes, and the grids/filters inside re-register straight away.
|
|
50
|
+
*/
|
|
45
51
|
private applyWorkspace;
|
|
46
52
|
loadWorkspace(workspaceName: string): Promise<void>;
|
|
47
53
|
private requestSharedWorkspace;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-manager.d.ts","sourceRoot":"","sources":["../../../src/workspace-manager/workspace-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAK9D,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAA6B,MAAM,uBAAuB,CAAC;AACrF,OAAO,EACL,cAAc,EACd,YAAY,EACZ,cAAc,EACd,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,EAErB,MAAM,cAAc,CAAC;AAOtB;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,QAAQ,CAAC;AAEvC;;;GAGG;AACH,qBAKa,gBAAiB,SAAQ,iBAAiB;IACzC,aAAa,EAAE,MAAM,CAAM;IAC3B,oBAAoB,EAAE,MAAM,CAAM;IAClC,eAAe,EAAE,cAAc,EAAE,CAAM;IACvC,gBAAgB,EAAE,eAAe,EAAE,CAAM;IACzC,SAAS,EAAE,OAAO,CAAS;IAC3B,iBAAiB,EAAE,OAAO,CAAS;IACnC,QAAQ,EAAE,QAAQ,CAAQ;IAC1B,SAAS,EAAE,KAAK,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;IACjB,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAY;IACvD,4BAA4B,EAAE,MAAM,CAAM;IAC1C,gBAAgB,EAAE,MAAM,CAAM;IAC9B,cAAc,EAAE,WAAW,CAAC;IAC5B,6BAA6B,EAAE,WAAW,CAAC;IAEvC,cAAc,EAAE,cAAc,CAAC;IACjC,YAAY,EAAE,YAAY,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IACtC,OAAO,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IAEL,iBAAiB,EAAE,OAAO,CAAC;IAIvC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IAEjD,OAAO,CAAC,mBAAmB;IAW3B,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7C,OAAO,CAAC,mCAAmC;IAYrC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYlC,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvC,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB9C,OAAO,CAAC,WAAW;IAOb,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-manager.d.ts","sourceRoot":"","sources":["../../../src/workspace-manager/workspace-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +1,54 @@
|
|
|
1
1
|
import { DI } from '@genesislcap/web-core';
|
|
2
2
|
/**
|
|
3
|
+
* Default filter registry implementation.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Keeps a store of every filter's last known value by key, so a workspace covers filters that
|
|
7
|
+
* aren't currently mounted (e.g. on another route):
|
|
8
|
+
* - `unregisterFilter` stores the filter's last value; `registerFilter` applies any stored value.
|
|
9
|
+
* - `applyFiltersValues` (workspace load) replaces the store with the loaded values and applies
|
|
10
|
+
* them to mounted filters; unmounted ones pick theirs up when they register.
|
|
11
|
+
* - `getAllFiltersValues` (workspace save) returns the store with mounted filters' live values on
|
|
12
|
+
* top, so a filter the user never visited keeps its loaded value rather than being dropped.
|
|
3
13
|
* @alpha
|
|
4
14
|
*/
|
|
5
15
|
export class DefaultFilterRegistry {
|
|
6
16
|
constructor() {
|
|
7
17
|
this.filters = new Map();
|
|
18
|
+
this.stored = new Map();
|
|
8
19
|
}
|
|
9
20
|
registerFilter(filterKey, getFilterValue, setFilterValue) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
21
|
+
const registration = { filterKey, getFilterValue, setFilterValue };
|
|
22
|
+
this.filters.set(filterKey, registration);
|
|
23
|
+
const stored = this.stored.get(filterKey);
|
|
24
|
+
if (stored && stored.value !== this.readValue(registration).value) {
|
|
25
|
+
setFilterValue(stored.value);
|
|
26
|
+
}
|
|
15
27
|
}
|
|
16
28
|
unregisterFilter(filterKey) {
|
|
29
|
+
const registration = this.filters.get(filterKey);
|
|
30
|
+
if (registration) {
|
|
31
|
+
this.stored.set(filterKey, this.readValue(registration));
|
|
32
|
+
}
|
|
17
33
|
this.filters.delete(filterKey);
|
|
18
34
|
}
|
|
19
35
|
getAllFiltersValues() {
|
|
20
|
-
|
|
21
|
-
.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return { filterKey: key, value: '' };
|
|
25
|
-
}
|
|
26
|
-
return result;
|
|
27
|
-
})
|
|
28
|
-
.filter((f) => f !== null);
|
|
36
|
+
this.filters.forEach((registration, key) => {
|
|
37
|
+
this.stored.set(key, this.readValue(registration));
|
|
38
|
+
});
|
|
39
|
+
return Array.from(this.stored.values());
|
|
29
40
|
}
|
|
30
41
|
applyFiltersValues(filtersValues) {
|
|
42
|
+
this.stored = new Map(filtersValues.map((f) => [f.filterKey, f]));
|
|
31
43
|
filtersValues.forEach((f) => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
filter.setFilterValue(f.value);
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
console.warn(`layout for ${f.filterKey} not found`);
|
|
38
|
-
}
|
|
44
|
+
var _a;
|
|
45
|
+
(_a = this.filters.get(f.filterKey)) === null || _a === void 0 ? void 0 : _a.setFilterValue(f.value);
|
|
39
46
|
});
|
|
40
47
|
}
|
|
48
|
+
readValue(registration) {
|
|
49
|
+
var _a;
|
|
50
|
+
return (_a = registration.getFilterValue()) !== null && _a !== void 0 ? _a : { filterKey: registration.filterKey, value: '' };
|
|
51
|
+
}
|
|
41
52
|
}
|
|
42
53
|
/**
|
|
43
54
|
* DI token for filter registry.
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
2
|
import { FoundationElement, attr, customElement } from '@genesislcap/web-core';
|
|
3
3
|
import { GridRegistry } from '../grid-registry';
|
|
4
|
-
import { WorkspaceState } from '../workspace-state';
|
|
5
4
|
import { GridRegisterTemplate as template } from './grid-register.template';
|
|
6
5
|
/**
|
|
7
|
-
* Registers an AG Grid instance so workspace state can apply/load it.
|
|
6
|
+
* Registers an AG Grid instance so workspace state can apply/load it. Registering applies the
|
|
7
|
+
* grid's stored column state (from the loaded workspace, or its last state this session) — see
|
|
8
|
+
* `DefaultGridRegistry`.
|
|
8
9
|
* @alpha
|
|
9
10
|
*/
|
|
10
11
|
let GridRegister = class GridRegister extends FoundationElement {
|
|
@@ -69,12 +70,11 @@ let GridRegister = class GridRegister extends FoundationElement {
|
|
|
69
70
|
console.warn('grid-register: missing persist-column-state-key; grid state will not be saved');
|
|
70
71
|
}
|
|
71
72
|
else {
|
|
72
|
-
this.gridRegistry.registerGrid(persistKey, gridApi, columnApi);
|
|
73
73
|
this.gridKey = persistKey;
|
|
74
|
+
// The element is grid-pro's own filter persistence (`setFilterModel`), so a workspace's
|
|
75
|
+
// filters survive grid-pro restoring its persisted filter model after registration.
|
|
76
|
+
this.gridRegistry.registerGrid(persistKey, gridApi, columnApi, anyGrid);
|
|
74
77
|
}
|
|
75
|
-
this.loadWorkspaceColumnState().catch((error) => {
|
|
76
|
-
console.warn(`Failed to apply column state for ${this.gridKey} on gridReady:`, error);
|
|
77
|
-
});
|
|
78
78
|
}
|
|
79
79
|
detachFromGridApis() {
|
|
80
80
|
if (this.gridElement && this.handleGridReady) {
|
|
@@ -84,50 +84,6 @@ let GridRegister = class GridRegister extends FoundationElement {
|
|
|
84
84
|
this.gridApi = null;
|
|
85
85
|
this.columnApi = null;
|
|
86
86
|
}
|
|
87
|
-
loadWorkspaceSettings(options) {
|
|
88
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
-
if (!this.gridKey || !this.gridApi) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
try {
|
|
93
|
-
const currentWorkspace = this.workspaceState.getCurrentWorkspace();
|
|
94
|
-
if (currentWorkspace && currentWorkspace.grids) {
|
|
95
|
-
const gridSetting = currentWorkspace.grids.find((g) => g.gridKey === this.gridKey);
|
|
96
|
-
if (gridSetting) {
|
|
97
|
-
const currentColumnState = this.readColumnState();
|
|
98
|
-
const targetColumnState = gridSetting.columnState || [];
|
|
99
|
-
const columnsEqual = JSON.stringify(currentColumnState) === JSON.stringify(targetColumnState);
|
|
100
|
-
const applyColumns = !options || options.applyColumns !== false;
|
|
101
|
-
const columnsOk = !applyColumns || columnsEqual;
|
|
102
|
-
if (columnsOk) {
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
const applied = yield this.gridRegistry.applyGridSettings(gridSetting, options);
|
|
106
|
-
if (!applied) {
|
|
107
|
-
console.warn(`Failed to apply grid settings for ${this.gridKey}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
catch (error) {
|
|
113
|
-
console.warn(`Failed to load workspace settings for grid ${this.gridKey}:`, error);
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Column state comes from `gridApi` on AG Grid v36 and from `columnApi` on v29; mirrors the
|
|
119
|
-
* fallback `GridRegistry` uses when saving.
|
|
120
|
-
*/
|
|
121
|
-
readColumnState() {
|
|
122
|
-
var _a, _b, _c, _d;
|
|
123
|
-
const gridApi = this.gridApi;
|
|
124
|
-
return (_d = (_b = (_a = gridApi === null || gridApi === void 0 ? void 0 : gridApi.getColumnState) === null || _a === void 0 ? void 0 : _a.call(gridApi)) !== null && _b !== void 0 ? _b : (_c = this.columnApi) === null || _c === void 0 ? void 0 : _c.getColumnState()) !== null && _d !== void 0 ? _d : [];
|
|
125
|
-
}
|
|
126
|
-
loadWorkspaceColumnState() {
|
|
127
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
128
|
-
return this.loadWorkspaceSettings({ applyColumns: true });
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
87
|
};
|
|
132
88
|
__decorate([
|
|
133
89
|
attr({ attribute: 'grid-key' })
|
|
@@ -138,9 +94,6 @@ __decorate([
|
|
|
138
94
|
__decorate([
|
|
139
95
|
GridRegistry
|
|
140
96
|
], GridRegister.prototype, "gridRegistry", void 0);
|
|
141
|
-
__decorate([
|
|
142
|
-
WorkspaceState
|
|
143
|
-
], GridRegister.prototype, "workspaceState", void 0);
|
|
144
97
|
GridRegister = __decorate([
|
|
145
98
|
customElement({
|
|
146
99
|
name: 'grid-register',
|